Lines Matching refs:priv
50 static inline u32 enet_readl(struct bcm_enet_priv *priv, u32 off) in enet_readl() argument
52 return bcm_readl(priv->base + off); in enet_readl()
55 static inline void enet_writel(struct bcm_enet_priv *priv, in enet_writel() argument
58 bcm_writel(val, priv->base + off); in enet_writel()
64 static inline u32 enetsw_readl(struct bcm_enet_priv *priv, u32 off) in enetsw_readl() argument
66 return bcm_readl(priv->base + off); in enetsw_readl()
69 static inline void enetsw_writel(struct bcm_enet_priv *priv, in enetsw_writel() argument
72 bcm_writel(val, priv->base + off); in enetsw_writel()
75 static inline u16 enetsw_readw(struct bcm_enet_priv *priv, u32 off) in enetsw_readw() argument
77 return bcm_readw(priv->base + off); in enetsw_readw()
80 static inline void enetsw_writew(struct bcm_enet_priv *priv, in enetsw_writew() argument
83 bcm_writew(val, priv->base + off); in enetsw_writew()
86 static inline u8 enetsw_readb(struct bcm_enet_priv *priv, u32 off) in enetsw_readb() argument
88 return bcm_readb(priv->base + off); in enetsw_readb()
91 static inline void enetsw_writeb(struct bcm_enet_priv *priv, in enetsw_writeb() argument
94 bcm_writeb(val, priv->base + off); in enetsw_writeb()
99 static inline u32 enet_dma_readl(struct bcm_enet_priv *priv, u32 off) in enet_dma_readl() argument
104 static inline void enet_dma_writel(struct bcm_enet_priv *priv, in enet_dma_writel() argument
110 static inline u32 enet_dmac_readl(struct bcm_enet_priv *priv, u32 off, int chan) in enet_dmac_readl() argument
113 bcm63xx_enetdmacreg(off) + chan * priv->dma_chan_width); in enet_dmac_readl()
116 static inline void enet_dmac_writel(struct bcm_enet_priv *priv, in enet_dmac_writel() argument
120 bcm63xx_enetdmacreg(off) + chan * priv->dma_chan_width); in enet_dmac_writel()
123 static inline u32 enet_dmas_readl(struct bcm_enet_priv *priv, u32 off, int chan) in enet_dmas_readl() argument
125 return bcm_readl(bcm_enet_shared_base[2] + off + chan * priv->dma_chan_width); in enet_dmas_readl()
128 static inline void enet_dmas_writel(struct bcm_enet_priv *priv, in enet_dmas_writel() argument
131 bcm_writel(val, bcm_enet_shared_base[2] + off + chan * priv->dma_chan_width); in enet_dmas_writel()
138 static int do_mdio_op(struct bcm_enet_priv *priv, unsigned int data) in do_mdio_op() argument
143 enet_writel(priv, ENET_IR_MII, ENET_IR_REG); in do_mdio_op()
145 enet_writel(priv, data, ENET_MIIDATA_REG); in do_mdio_op()
151 if (enet_readl(priv, ENET_IR_REG) & ENET_IR_MII) in do_mdio_op()
162 static int bcm_enet_mdio_read(struct bcm_enet_priv *priv, int mii_id, in bcm_enet_mdio_read() argument
172 if (do_mdio_op(priv, tmp)) in bcm_enet_mdio_read()
175 val = enet_readl(priv, ENET_MIIDATA_REG); in bcm_enet_mdio_read()
183 static int bcm_enet_mdio_write(struct bcm_enet_priv *priv, int mii_id, in bcm_enet_mdio_write() argument
194 (void)do_mdio_op(priv, tmp); in bcm_enet_mdio_write()
204 return bcm_enet_mdio_read(bus->priv, mii_id, regnum); in bcm_enet_mdio_read_phylib()
213 return bcm_enet_mdio_write(bus->priv, mii_id, regnum, value); in bcm_enet_mdio_write_phylib()
239 struct bcm_enet_priv *priv; in bcm_enet_refill_rx() local
241 priv = netdev_priv(dev); in bcm_enet_refill_rx()
243 while (priv->rx_desc_count < priv->rx_ring_size) { in bcm_enet_refill_rx()
250 desc_idx = priv->rx_dirty_desc; in bcm_enet_refill_rx()
251 desc = &priv->rx_desc_cpu[desc_idx]; in bcm_enet_refill_rx()
253 if (!priv->rx_skb[desc_idx]) { in bcm_enet_refill_rx()
254 skb = netdev_alloc_skb(dev, priv->rx_skb_size); in bcm_enet_refill_rx()
257 priv->rx_skb[desc_idx] = skb; in bcm_enet_refill_rx()
258 p = dma_map_single(&priv->pdev->dev, skb->data, in bcm_enet_refill_rx()
259 priv->rx_skb_size, in bcm_enet_refill_rx()
264 len_stat = priv->rx_skb_size << DMADESC_LENGTH_SHIFT; in bcm_enet_refill_rx()
266 if (priv->rx_dirty_desc == priv->rx_ring_size - 1) { in bcm_enet_refill_rx()
267 len_stat |= (DMADESC_WRAP_MASK >> priv->dma_desc_shift); in bcm_enet_refill_rx()
268 priv->rx_dirty_desc = 0; in bcm_enet_refill_rx()
270 priv->rx_dirty_desc++; in bcm_enet_refill_rx()
275 priv->rx_desc_count++; in bcm_enet_refill_rx()
278 if (priv->dma_has_sram) in bcm_enet_refill_rx()
279 enet_dma_writel(priv, 1, ENETDMA_BUFALLOC_REG(priv->rx_chan)); in bcm_enet_refill_rx()
281 enet_dmac_writel(priv, 1, ENETDMAC_BUFALLOC, priv->rx_chan); in bcm_enet_refill_rx()
286 if (priv->rx_desc_count == 0 && netif_running(dev)) { in bcm_enet_refill_rx()
287 dev_warn(&priv->pdev->dev, "unable to refill rx ring\n"); in bcm_enet_refill_rx()
288 priv->rx_timeout.expires = jiffies + HZ; in bcm_enet_refill_rx()
289 add_timer(&priv->rx_timeout); in bcm_enet_refill_rx()
301 struct bcm_enet_priv *priv; in bcm_enet_refill_rx_timer() local
304 priv = netdev_priv(dev); in bcm_enet_refill_rx_timer()
306 spin_lock(&priv->rx_lock); in bcm_enet_refill_rx_timer()
308 spin_unlock(&priv->rx_lock); in bcm_enet_refill_rx_timer()
316 struct bcm_enet_priv *priv; in bcm_enet_receive_queue() local
320 priv = netdev_priv(dev); in bcm_enet_receive_queue()
321 kdev = &priv->pdev->dev; in bcm_enet_receive_queue()
326 if (budget > priv->rx_desc_count) in bcm_enet_receive_queue()
327 budget = priv->rx_desc_count; in bcm_enet_receive_queue()
336 desc_idx = priv->rx_curr_desc; in bcm_enet_receive_queue()
337 desc = &priv->rx_desc_cpu[desc_idx]; in bcm_enet_receive_queue()
350 priv->rx_curr_desc++; in bcm_enet_receive_queue()
351 if (priv->rx_curr_desc == priv->rx_ring_size) in bcm_enet_receive_queue()
352 priv->rx_curr_desc = 0; in bcm_enet_receive_queue()
353 priv->rx_desc_count--; in bcm_enet_receive_queue()
357 if ((len_stat & (DMADESC_ESOP_MASK >> priv->dma_desc_shift)) != in bcm_enet_receive_queue()
358 (DMADESC_ESOP_MASK >> priv->dma_desc_shift)) { in bcm_enet_receive_queue()
364 if (!priv->enet_is_sw && in bcm_enet_receive_queue()
380 skb = priv->rx_skb[desc_idx]; in bcm_enet_receive_queue()
388 nskb = napi_alloc_skb(&priv->napi, len); in bcm_enet_receive_queue()
402 dma_unmap_single(&priv->pdev->dev, desc->address, in bcm_enet_receive_queue()
403 priv->rx_skb_size, DMA_FROM_DEVICE); in bcm_enet_receive_queue()
404 priv->rx_skb[desc_idx] = NULL; in bcm_enet_receive_queue()
415 if (processed || !priv->rx_desc_count) { in bcm_enet_receive_queue()
419 enet_dmac_writel(priv, priv->dma_chan_en_mask, in bcm_enet_receive_queue()
420 ENETDMAC_CHANCFG, priv->rx_chan); in bcm_enet_receive_queue()
432 struct bcm_enet_priv *priv; in bcm_enet_tx_reclaim() local
435 priv = netdev_priv(dev); in bcm_enet_tx_reclaim()
438 while (priv->tx_desc_count < priv->tx_ring_size) { in bcm_enet_tx_reclaim()
444 spin_lock(&priv->tx_lock); in bcm_enet_tx_reclaim()
446 desc = &priv->tx_desc_cpu[priv->tx_dirty_desc]; in bcm_enet_tx_reclaim()
449 spin_unlock(&priv->tx_lock); in bcm_enet_tx_reclaim()
457 skb = priv->tx_skb[priv->tx_dirty_desc]; in bcm_enet_tx_reclaim()
458 priv->tx_skb[priv->tx_dirty_desc] = NULL; in bcm_enet_tx_reclaim()
459 dma_unmap_single(&priv->pdev->dev, desc->address, skb->len, in bcm_enet_tx_reclaim()
462 priv->tx_dirty_desc++; in bcm_enet_tx_reclaim()
463 if (priv->tx_dirty_desc == priv->tx_ring_size) in bcm_enet_tx_reclaim()
464 priv->tx_dirty_desc = 0; in bcm_enet_tx_reclaim()
465 priv->tx_desc_count++; in bcm_enet_tx_reclaim()
467 spin_unlock(&priv->tx_lock); in bcm_enet_tx_reclaim()
487 struct bcm_enet_priv *priv; in bcm_enet_poll() local
491 priv = container_of(napi, struct bcm_enet_priv, napi); in bcm_enet_poll()
492 dev = priv->net_dev; in bcm_enet_poll()
495 enet_dmac_writel(priv, priv->dma_chan_int_mask, in bcm_enet_poll()
496 ENETDMAC_IR, priv->rx_chan); in bcm_enet_poll()
497 enet_dmac_writel(priv, priv->dma_chan_int_mask, in bcm_enet_poll()
498 ENETDMAC_IR, priv->tx_chan); in bcm_enet_poll()
503 spin_lock(&priv->rx_lock); in bcm_enet_poll()
505 spin_unlock(&priv->rx_lock); in bcm_enet_poll()
517 enet_dmac_writel(priv, priv->dma_chan_int_mask, in bcm_enet_poll()
518 ENETDMAC_IRMASK, priv->rx_chan); in bcm_enet_poll()
519 enet_dmac_writel(priv, priv->dma_chan_int_mask, in bcm_enet_poll()
520 ENETDMAC_IRMASK, priv->tx_chan); in bcm_enet_poll()
531 struct bcm_enet_priv *priv; in bcm_enet_isr_mac() local
535 priv = netdev_priv(dev); in bcm_enet_isr_mac()
537 stat = enet_readl(priv, ENET_IR_REG); in bcm_enet_isr_mac()
542 enet_writel(priv, ENET_IR_MIB, ENET_IR_REG); in bcm_enet_isr_mac()
543 enet_writel(priv, 0, ENET_IRMASK_REG); in bcm_enet_isr_mac()
546 schedule_work(&priv->mib_update_task); in bcm_enet_isr_mac()
557 struct bcm_enet_priv *priv; in bcm_enet_isr_dma() local
560 priv = netdev_priv(dev); in bcm_enet_isr_dma()
563 enet_dmac_writel(priv, 0, ENETDMAC_IRMASK, priv->rx_chan); in bcm_enet_isr_dma()
564 enet_dmac_writel(priv, 0, ENETDMAC_IRMASK, priv->tx_chan); in bcm_enet_isr_dma()
566 napi_schedule(&priv->napi); in bcm_enet_isr_dma()
576 struct bcm_enet_priv *priv; in bcm_enet_start_xmit() local
581 priv = netdev_priv(dev); in bcm_enet_start_xmit()
584 spin_lock(&priv->tx_lock); in bcm_enet_start_xmit()
588 if (unlikely(!priv->tx_desc_count)) { in bcm_enet_start_xmit()
590 dev_err(&priv->pdev->dev, "xmit called with no tx desc " in bcm_enet_start_xmit()
597 if (priv->enet_is_sw && skb->len < 64) { in bcm_enet_start_xmit()
617 desc = &priv->tx_desc_cpu[priv->tx_curr_desc]; in bcm_enet_start_xmit()
618 priv->tx_skb[priv->tx_curr_desc] = skb; in bcm_enet_start_xmit()
621 desc->address = dma_map_single(&priv->pdev->dev, skb->data, skb->len, in bcm_enet_start_xmit()
625 len_stat |= (DMADESC_ESOP_MASK >> priv->dma_desc_shift) | in bcm_enet_start_xmit()
629 priv->tx_curr_desc++; in bcm_enet_start_xmit()
630 if (priv->tx_curr_desc == priv->tx_ring_size) { in bcm_enet_start_xmit()
631 priv->tx_curr_desc = 0; in bcm_enet_start_xmit()
632 len_stat |= (DMADESC_WRAP_MASK >> priv->dma_desc_shift); in bcm_enet_start_xmit()
634 priv->tx_desc_count--; in bcm_enet_start_xmit()
643 enet_dmac_writel(priv, priv->dma_chan_en_mask, in bcm_enet_start_xmit()
644 ENETDMAC_CHANCFG, priv->tx_chan); in bcm_enet_start_xmit()
647 if (!priv->tx_desc_count) in bcm_enet_start_xmit()
655 spin_unlock(&priv->tx_lock); in bcm_enet_start_xmit()
664 struct bcm_enet_priv *priv; in bcm_enet_set_mac_address() local
668 priv = netdev_priv(dev); in bcm_enet_set_mac_address()
674 enet_writel(priv, val, ENET_PML_REG(0)); in bcm_enet_set_mac_address()
678 enet_writel(priv, val, ENET_PMH_REG(0)); in bcm_enet_set_mac_address()
688 struct bcm_enet_priv *priv; in bcm_enet_set_multicast_list() local
693 priv = netdev_priv(dev); in bcm_enet_set_multicast_list()
695 val = enet_readl(priv, ENET_RXCFG_REG); in bcm_enet_set_multicast_list()
712 enet_writel(priv, val, ENET_RXCFG_REG); in bcm_enet_set_multicast_list()
727 enet_writel(priv, tmp, ENET_PML_REG(i + 1)); in bcm_enet_set_multicast_list()
731 enet_writel(priv, tmp, ENET_PMH_REG(i++ + 1)); in bcm_enet_set_multicast_list()
735 enet_writel(priv, 0, ENET_PML_REG(i + 1)); in bcm_enet_set_multicast_list()
736 enet_writel(priv, 0, ENET_PMH_REG(i + 1)); in bcm_enet_set_multicast_list()
739 enet_writel(priv, val, ENET_RXCFG_REG); in bcm_enet_set_multicast_list()
745 static void bcm_enet_set_duplex(struct bcm_enet_priv *priv, int fullduplex) in bcm_enet_set_duplex() argument
749 val = enet_readl(priv, ENET_TXCTL_REG); in bcm_enet_set_duplex()
754 enet_writel(priv, val, ENET_TXCTL_REG); in bcm_enet_set_duplex()
760 static void bcm_enet_set_flow(struct bcm_enet_priv *priv, int rx_en, int tx_en) in bcm_enet_set_flow() argument
765 val = enet_readl(priv, ENET_RXCFG_REG); in bcm_enet_set_flow()
770 enet_writel(priv, val, ENET_RXCFG_REG); in bcm_enet_set_flow()
772 if (!priv->dma_has_sram) in bcm_enet_set_flow()
776 val = enet_dma_readl(priv, ENETDMA_CFG_REG); in bcm_enet_set_flow()
778 val |= ENETDMA_CFG_FLOWCH_MASK(priv->rx_chan); in bcm_enet_set_flow()
780 val &= ~ENETDMA_CFG_FLOWCH_MASK(priv->rx_chan); in bcm_enet_set_flow()
781 enet_dma_writel(priv, val, ENETDMA_CFG_REG); in bcm_enet_set_flow()
789 struct bcm_enet_priv *priv; in bcm_enet_adjust_phy_link() local
793 priv = netdev_priv(dev); in bcm_enet_adjust_phy_link()
794 phydev = priv->phydev; in bcm_enet_adjust_phy_link()
797 if (priv->old_link != phydev->link) { in bcm_enet_adjust_phy_link()
799 priv->old_link = phydev->link; in bcm_enet_adjust_phy_link()
803 if (phydev->link && phydev->duplex != priv->old_duplex) { in bcm_enet_adjust_phy_link()
804 bcm_enet_set_duplex(priv, in bcm_enet_adjust_phy_link()
807 priv->old_duplex = phydev->duplex; in bcm_enet_adjust_phy_link()
812 if (phydev->link && phydev->pause != priv->old_pause) { in bcm_enet_adjust_phy_link()
819 } else if (!priv->pause_auto) { in bcm_enet_adjust_phy_link()
821 rx_pause_en = priv->pause_rx; in bcm_enet_adjust_phy_link()
822 tx_pause_en = priv->pause_tx; in bcm_enet_adjust_phy_link()
828 bcm_enet_set_flow(priv, rx_pause_en, tx_pause_en); in bcm_enet_adjust_phy_link()
830 priv->old_pause = phydev->pause; in bcm_enet_adjust_phy_link()
850 struct bcm_enet_priv *priv; in bcm_enet_adjust_link() local
852 priv = netdev_priv(dev); in bcm_enet_adjust_link()
853 bcm_enet_set_duplex(priv, priv->force_duplex_full); in bcm_enet_adjust_link()
854 bcm_enet_set_flow(priv, priv->pause_rx, priv->pause_tx); in bcm_enet_adjust_link()
859 priv->force_speed_100 ? 100 : 10, in bcm_enet_adjust_link()
860 priv->force_duplex_full ? "full" : "half", in bcm_enet_adjust_link()
861 priv->pause_rx ? "rx" : "off", in bcm_enet_adjust_link()
862 priv->pause_tx ? "tx" : "off"); in bcm_enet_adjust_link()
870 struct bcm_enet_priv *priv; in bcm_enet_open() local
880 priv = netdev_priv(dev); in bcm_enet_open()
881 kdev = &priv->pdev->dev; in bcm_enet_open()
883 if (priv->has_phy) { in bcm_enet_open()
886 priv->mii_bus->id, priv->phy_id); in bcm_enet_open()
906 if (priv->pause_auto && priv->pause_rx && priv->pause_tx) in bcm_enet_open()
914 priv->old_link = 0; in bcm_enet_open()
915 priv->old_duplex = -1; in bcm_enet_open()
916 priv->old_pause = -1; in bcm_enet_open()
917 priv->phydev = phydev; in bcm_enet_open()
921 enet_writel(priv, 0, ENET_IRMASK_REG); in bcm_enet_open()
922 enet_dmac_writel(priv, 0, ENETDMAC_IRMASK, priv->rx_chan); in bcm_enet_open()
923 enet_dmac_writel(priv, 0, ENETDMAC_IRMASK, priv->tx_chan); in bcm_enet_open()
929 ret = request_irq(priv->irq_rx, bcm_enet_isr_dma, 0, in bcm_enet_open()
934 ret = request_irq(priv->irq_tx, bcm_enet_isr_dma, in bcm_enet_open()
941 enet_writel(priv, 0, ENET_PML_REG(i)); in bcm_enet_open()
942 enet_writel(priv, 0, ENET_PMH_REG(i)); in bcm_enet_open()
950 size = priv->rx_ring_size * sizeof(struct bcm_enet_desc); in bcm_enet_open()
951 p = dma_zalloc_coherent(kdev, size, &priv->rx_desc_dma, GFP_KERNEL); in bcm_enet_open()
957 priv->rx_desc_alloc_size = size; in bcm_enet_open()
958 priv->rx_desc_cpu = p; in bcm_enet_open()
961 size = priv->tx_ring_size * sizeof(struct bcm_enet_desc); in bcm_enet_open()
962 p = dma_zalloc_coherent(kdev, size, &priv->tx_desc_dma, GFP_KERNEL); in bcm_enet_open()
968 priv->tx_desc_alloc_size = size; in bcm_enet_open()
969 priv->tx_desc_cpu = p; in bcm_enet_open()
971 priv->tx_skb = kcalloc(priv->tx_ring_size, sizeof(struct sk_buff *), in bcm_enet_open()
973 if (!priv->tx_skb) { in bcm_enet_open()
978 priv->tx_desc_count = priv->tx_ring_size; in bcm_enet_open()
979 priv->tx_dirty_desc = 0; in bcm_enet_open()
980 priv->tx_curr_desc = 0; in bcm_enet_open()
981 spin_lock_init(&priv->tx_lock); in bcm_enet_open()
984 priv->rx_skb = kcalloc(priv->rx_ring_size, sizeof(struct sk_buff *), in bcm_enet_open()
986 if (!priv->rx_skb) { in bcm_enet_open()
991 priv->rx_desc_count = 0; in bcm_enet_open()
992 priv->rx_dirty_desc = 0; in bcm_enet_open()
993 priv->rx_curr_desc = 0; in bcm_enet_open()
996 if (priv->dma_has_sram) in bcm_enet_open()
997 enet_dma_writel(priv, ENETDMA_BUFALLOC_FORCE_MASK | 0, in bcm_enet_open()
998 ENETDMA_BUFALLOC_REG(priv->rx_chan)); in bcm_enet_open()
1000 enet_dmac_writel(priv, ENETDMA_BUFALLOC_FORCE_MASK | 0, in bcm_enet_open()
1001 ENETDMAC_BUFALLOC, priv->rx_chan); in bcm_enet_open()
1010 if (priv->dma_has_sram) { in bcm_enet_open()
1011 enet_dmas_writel(priv, priv->rx_desc_dma, in bcm_enet_open()
1012 ENETDMAS_RSTART_REG, priv->rx_chan); in bcm_enet_open()
1013 enet_dmas_writel(priv, priv->tx_desc_dma, in bcm_enet_open()
1014 ENETDMAS_RSTART_REG, priv->tx_chan); in bcm_enet_open()
1016 enet_dmac_writel(priv, priv->rx_desc_dma, in bcm_enet_open()
1017 ENETDMAC_RSTART, priv->rx_chan); in bcm_enet_open()
1018 enet_dmac_writel(priv, priv->tx_desc_dma, in bcm_enet_open()
1019 ENETDMAC_RSTART, priv->tx_chan); in bcm_enet_open()
1023 if (priv->dma_has_sram) { in bcm_enet_open()
1024 enet_dmas_writel(priv, 0, ENETDMAS_SRAM2_REG, priv->rx_chan); in bcm_enet_open()
1025 enet_dmas_writel(priv, 0, ENETDMAS_SRAM2_REG, priv->tx_chan); in bcm_enet_open()
1026 enet_dmas_writel(priv, 0, ENETDMAS_SRAM3_REG, priv->rx_chan); in bcm_enet_open()
1027 enet_dmas_writel(priv, 0, ENETDMAS_SRAM3_REG, priv->tx_chan); in bcm_enet_open()
1028 enet_dmas_writel(priv, 0, ENETDMAS_SRAM4_REG, priv->rx_chan); in bcm_enet_open()
1029 enet_dmas_writel(priv, 0, ENETDMAS_SRAM4_REG, priv->tx_chan); in bcm_enet_open()
1031 enet_dmac_writel(priv, 0, ENETDMAC_FC, priv->rx_chan); in bcm_enet_open()
1032 enet_dmac_writel(priv, 0, ENETDMAC_FC, priv->tx_chan); in bcm_enet_open()
1036 enet_writel(priv, priv->hw_mtu, ENET_RXMAXLEN_REG); in bcm_enet_open()
1037 enet_writel(priv, priv->hw_mtu, ENET_TXMAXLEN_REG); in bcm_enet_open()
1040 enet_dmac_writel(priv, priv->dma_maxburst, in bcm_enet_open()
1041 ENETDMAC_MAXBURST, priv->rx_chan); in bcm_enet_open()
1042 enet_dmac_writel(priv, priv->dma_maxburst, in bcm_enet_open()
1043 ENETDMAC_MAXBURST, priv->tx_chan); in bcm_enet_open()
1046 enet_writel(priv, BCMENET_TX_FIFO_TRESH, ENET_TXWMARK_REG); in bcm_enet_open()
1049 if (priv->dma_has_sram) { in bcm_enet_open()
1050 val = priv->rx_ring_size / 3; in bcm_enet_open()
1051 enet_dma_writel(priv, val, ENETDMA_FLOWCL_REG(priv->rx_chan)); in bcm_enet_open()
1052 val = (priv->rx_ring_size * 2) / 3; in bcm_enet_open()
1053 enet_dma_writel(priv, val, ENETDMA_FLOWCH_REG(priv->rx_chan)); in bcm_enet_open()
1055 enet_dmac_writel(priv, 5, ENETDMAC_FC, priv->rx_chan); in bcm_enet_open()
1056 enet_dmac_writel(priv, priv->rx_ring_size, ENETDMAC_LEN, priv->rx_chan); in bcm_enet_open()
1057 enet_dmac_writel(priv, priv->tx_ring_size, ENETDMAC_LEN, priv->tx_chan); in bcm_enet_open()
1063 val = enet_readl(priv, ENET_CTL_REG); in bcm_enet_open()
1065 enet_writel(priv, val, ENET_CTL_REG); in bcm_enet_open()
1066 enet_dma_writel(priv, ENETDMA_CFG_EN_MASK, ENETDMA_CFG_REG); in bcm_enet_open()
1067 enet_dmac_writel(priv, priv->dma_chan_en_mask, in bcm_enet_open()
1068 ENETDMAC_CHANCFG, priv->rx_chan); in bcm_enet_open()
1071 enet_writel(priv, ENET_IR_MIB, ENET_IR_REG); in bcm_enet_open()
1072 enet_writel(priv, ENET_IR_MIB, ENET_IRMASK_REG); in bcm_enet_open()
1075 enet_dmac_writel(priv, priv->dma_chan_int_mask, in bcm_enet_open()
1076 ENETDMAC_IR, priv->rx_chan); in bcm_enet_open()
1077 enet_dmac_writel(priv, priv->dma_chan_int_mask, in bcm_enet_open()
1078 ENETDMAC_IR, priv->tx_chan); in bcm_enet_open()
1081 napi_enable(&priv->napi); in bcm_enet_open()
1083 enet_dmac_writel(priv, priv->dma_chan_int_mask, in bcm_enet_open()
1084 ENETDMAC_IRMASK, priv->rx_chan); in bcm_enet_open()
1085 enet_dmac_writel(priv, priv->dma_chan_int_mask, in bcm_enet_open()
1086 ENETDMAC_IRMASK, priv->tx_chan); in bcm_enet_open()
1088 if (priv->has_phy) in bcm_enet_open()
1089 phy_start(priv->phydev); in bcm_enet_open()
1097 for (i = 0; i < priv->rx_ring_size; i++) { in bcm_enet_open()
1100 if (!priv->rx_skb[i]) in bcm_enet_open()
1103 desc = &priv->rx_desc_cpu[i]; in bcm_enet_open()
1104 dma_unmap_single(kdev, desc->address, priv->rx_skb_size, in bcm_enet_open()
1106 kfree_skb(priv->rx_skb[i]); in bcm_enet_open()
1108 kfree(priv->rx_skb); in bcm_enet_open()
1111 kfree(priv->tx_skb); in bcm_enet_open()
1114 dma_free_coherent(kdev, priv->tx_desc_alloc_size, in bcm_enet_open()
1115 priv->tx_desc_cpu, priv->tx_desc_dma); in bcm_enet_open()
1118 dma_free_coherent(kdev, priv->rx_desc_alloc_size, in bcm_enet_open()
1119 priv->rx_desc_cpu, priv->rx_desc_dma); in bcm_enet_open()
1122 free_irq(priv->irq_tx, dev); in bcm_enet_open()
1125 free_irq(priv->irq_rx, dev); in bcm_enet_open()
1131 phy_disconnect(priv->phydev); in bcm_enet_open()
1139 static void bcm_enet_disable_mac(struct bcm_enet_priv *priv) in bcm_enet_disable_mac() argument
1144 val = enet_readl(priv, ENET_CTL_REG); in bcm_enet_disable_mac()
1146 enet_writel(priv, val, ENET_CTL_REG); in bcm_enet_disable_mac()
1152 val = enet_readl(priv, ENET_CTL_REG); in bcm_enet_disable_mac()
1162 static void bcm_enet_disable_dma(struct bcm_enet_priv *priv, int chan) in bcm_enet_disable_dma() argument
1166 enet_dmac_writel(priv, 0, ENETDMAC_CHANCFG, chan); in bcm_enet_disable_dma()
1172 val = enet_dmac_readl(priv, ENETDMAC_CHANCFG, chan); in bcm_enet_disable_dma()
1184 struct bcm_enet_priv *priv; in bcm_enet_stop() local
1188 priv = netdev_priv(dev); in bcm_enet_stop()
1189 kdev = &priv->pdev->dev; in bcm_enet_stop()
1192 napi_disable(&priv->napi); in bcm_enet_stop()
1193 if (priv->has_phy) in bcm_enet_stop()
1194 phy_stop(priv->phydev); in bcm_enet_stop()
1195 del_timer_sync(&priv->rx_timeout); in bcm_enet_stop()
1198 enet_writel(priv, 0, ENET_IRMASK_REG); in bcm_enet_stop()
1199 enet_dmac_writel(priv, 0, ENETDMAC_IRMASK, priv->rx_chan); in bcm_enet_stop()
1200 enet_dmac_writel(priv, 0, ENETDMAC_IRMASK, priv->tx_chan); in bcm_enet_stop()
1203 cancel_work_sync(&priv->mib_update_task); in bcm_enet_stop()
1206 bcm_enet_disable_dma(priv, priv->tx_chan); in bcm_enet_stop()
1207 bcm_enet_disable_dma(priv, priv->rx_chan); in bcm_enet_stop()
1208 bcm_enet_disable_mac(priv); in bcm_enet_stop()
1214 for (i = 0; i < priv->rx_ring_size; i++) { in bcm_enet_stop()
1217 if (!priv->rx_skb[i]) in bcm_enet_stop()
1220 desc = &priv->rx_desc_cpu[i]; in bcm_enet_stop()
1221 dma_unmap_single(kdev, desc->address, priv->rx_skb_size, in bcm_enet_stop()
1223 kfree_skb(priv->rx_skb[i]); in bcm_enet_stop()
1227 kfree(priv->rx_skb); in bcm_enet_stop()
1228 kfree(priv->tx_skb); in bcm_enet_stop()
1229 dma_free_coherent(kdev, priv->rx_desc_alloc_size, in bcm_enet_stop()
1230 priv->rx_desc_cpu, priv->rx_desc_dma); in bcm_enet_stop()
1231 dma_free_coherent(kdev, priv->tx_desc_alloc_size, in bcm_enet_stop()
1232 priv->tx_desc_cpu, priv->tx_desc_dma); in bcm_enet_stop()
1233 free_irq(priv->irq_tx, dev); in bcm_enet_stop()
1234 free_irq(priv->irq_rx, dev); in bcm_enet_stop()
1238 if (priv->has_phy) { in bcm_enet_stop()
1239 phy_disconnect(priv->phydev); in bcm_enet_stop()
1240 priv->phydev = NULL; in bcm_enet_stop()
1365 static void update_mib_counters(struct bcm_enet_priv *priv) in update_mib_counters() argument
1378 val = enet_readl(priv, ENET_MIB_REG(s->mib_reg)); in update_mib_counters()
1379 p = (char *)priv + s->stat_offset; in update_mib_counters()
1390 (void)enet_readl(priv, ENET_MIB_REG(unused_mib_regs[i])); in update_mib_counters()
1395 struct bcm_enet_priv *priv; in bcm_enet_update_mib_counters_defer() local
1397 priv = container_of(t, struct bcm_enet_priv, mib_update_task); in bcm_enet_update_mib_counters_defer()
1398 mutex_lock(&priv->mib_update_lock); in bcm_enet_update_mib_counters_defer()
1399 update_mib_counters(priv); in bcm_enet_update_mib_counters_defer()
1400 mutex_unlock(&priv->mib_update_lock); in bcm_enet_update_mib_counters_defer()
1403 if (netif_running(priv->net_dev)) in bcm_enet_update_mib_counters_defer()
1404 enet_writel(priv, ENET_IR_MIB, ENET_IRMASK_REG); in bcm_enet_update_mib_counters_defer()
1411 struct bcm_enet_priv *priv; in bcm_enet_get_ethtool_stats() local
1414 priv = netdev_priv(netdev); in bcm_enet_get_ethtool_stats()
1416 mutex_lock(&priv->mib_update_lock); in bcm_enet_get_ethtool_stats()
1417 update_mib_counters(priv); in bcm_enet_get_ethtool_stats()
1427 p = (char *)priv; in bcm_enet_get_ethtool_stats()
1432 mutex_unlock(&priv->mib_update_lock); in bcm_enet_get_ethtool_stats()
1437 struct bcm_enet_priv *priv; in bcm_enet_nway_reset() local
1439 priv = netdev_priv(dev); in bcm_enet_nway_reset()
1440 if (priv->has_phy) { in bcm_enet_nway_reset()
1441 if (!priv->phydev) in bcm_enet_nway_reset()
1443 return genphy_restart_aneg(priv->phydev); in bcm_enet_nway_reset()
1452 struct bcm_enet_priv *priv; in bcm_enet_get_settings() local
1454 priv = netdev_priv(dev); in bcm_enet_get_settings()
1459 if (priv->has_phy) { in bcm_enet_get_settings()
1460 if (!priv->phydev) in bcm_enet_get_settings()
1462 return phy_ethtool_gset(priv->phydev, cmd); in bcm_enet_get_settings()
1465 ethtool_cmd_speed_set(cmd, ((priv->force_speed_100) in bcm_enet_get_settings()
1467 cmd->duplex = (priv->force_duplex_full) ? in bcm_enet_get_settings()
1483 struct bcm_enet_priv *priv; in bcm_enet_set_settings() local
1485 priv = netdev_priv(dev); in bcm_enet_set_settings()
1486 if (priv->has_phy) { in bcm_enet_set_settings()
1487 if (!priv->phydev) in bcm_enet_set_settings()
1489 return phy_ethtool_sset(priv->phydev, cmd); in bcm_enet_set_settings()
1497 priv->force_speed_100 = (cmd->speed == SPEED_100) ? 1 : 0; in bcm_enet_set_settings()
1498 priv->force_duplex_full = (cmd->duplex == DUPLEX_FULL) ? 1 : 0; in bcm_enet_set_settings()
1509 struct bcm_enet_priv *priv; in bcm_enet_get_ringparam() local
1511 priv = netdev_priv(dev); in bcm_enet_get_ringparam()
1516 ering->rx_pending = priv->rx_ring_size; in bcm_enet_get_ringparam()
1517 ering->tx_pending = priv->tx_ring_size; in bcm_enet_get_ringparam()
1523 struct bcm_enet_priv *priv; in bcm_enet_set_ringparam() local
1526 priv = netdev_priv(dev); in bcm_enet_set_ringparam()
1534 priv->rx_ring_size = ering->rx_pending; in bcm_enet_set_ringparam()
1535 priv->tx_ring_size = ering->tx_pending; in bcm_enet_set_ringparam()
1552 struct bcm_enet_priv *priv; in bcm_enet_get_pauseparam() local
1554 priv = netdev_priv(dev); in bcm_enet_get_pauseparam()
1555 ecmd->autoneg = priv->pause_auto; in bcm_enet_get_pauseparam()
1556 ecmd->rx_pause = priv->pause_rx; in bcm_enet_get_pauseparam()
1557 ecmd->tx_pause = priv->pause_tx; in bcm_enet_get_pauseparam()
1563 struct bcm_enet_priv *priv; in bcm_enet_set_pauseparam() local
1565 priv = netdev_priv(dev); in bcm_enet_set_pauseparam()
1567 if (priv->has_phy) { in bcm_enet_set_pauseparam()
1580 priv->pause_auto = ecmd->autoneg; in bcm_enet_set_pauseparam()
1581 priv->pause_rx = ecmd->rx_pause; in bcm_enet_set_pauseparam()
1582 priv->pause_tx = ecmd->tx_pause; in bcm_enet_set_pauseparam()
1604 struct bcm_enet_priv *priv; in bcm_enet_ioctl() local
1606 priv = netdev_priv(dev); in bcm_enet_ioctl()
1607 if (priv->has_phy) { in bcm_enet_ioctl()
1608 if (!priv->phydev) in bcm_enet_ioctl()
1610 return phy_mii_ioctl(priv->phydev, rq, cmd); in bcm_enet_ioctl()
1627 static int compute_hw_mtu(struct bcm_enet_priv *priv, int mtu) in compute_hw_mtu() argument
1645 priv->hw_mtu = actual_mtu; in compute_hw_mtu()
1651 priv->rx_skb_size = ALIGN(actual_mtu + ETH_FCS_LEN, in compute_hw_mtu()
1652 priv->dma_maxburst * 4); in compute_hw_mtu()
1676 static void bcm_enet_hw_preinit(struct bcm_enet_priv *priv) in bcm_enet_hw_preinit() argument
1682 bcm_enet_disable_mac(priv); in bcm_enet_hw_preinit()
1686 enet_writel(priv, val, ENET_CTL_REG); in bcm_enet_hw_preinit()
1691 val = enet_readl(priv, ENET_CTL_REG); in bcm_enet_hw_preinit()
1698 val = enet_readl(priv, ENET_CTL_REG); in bcm_enet_hw_preinit()
1699 if (priv->use_external_mii) in bcm_enet_hw_preinit()
1703 enet_writel(priv, val, ENET_CTL_REG); in bcm_enet_hw_preinit()
1706 enet_writel(priv, (0x1f << ENET_MIISC_MDCFREQDIV_SHIFT) | in bcm_enet_hw_preinit()
1710 val = enet_readl(priv, ENET_MIBCTL_REG); in bcm_enet_hw_preinit()
1712 enet_writel(priv, val, ENET_MIBCTL_REG); in bcm_enet_hw_preinit()
1730 struct bcm_enet_priv *priv; in bcm_enet_probe() local
1750 dev = alloc_etherdev(sizeof(*priv)); in bcm_enet_probe()
1753 priv = netdev_priv(dev); in bcm_enet_probe()
1755 priv->enet_is_sw = false; in bcm_enet_probe()
1756 priv->dma_maxburst = BCMENET_DMA_MAXBURST; in bcm_enet_probe()
1758 ret = compute_hw_mtu(priv, dev->mtu); in bcm_enet_probe()
1763 priv->base = devm_ioremap_resource(&pdev->dev, res_mem); in bcm_enet_probe()
1764 if (IS_ERR(priv->base)) { in bcm_enet_probe()
1765 ret = PTR_ERR(priv->base); in bcm_enet_probe()
1769 dev->irq = priv->irq = res_irq->start; in bcm_enet_probe()
1770 priv->irq_rx = res_irq_rx->start; in bcm_enet_probe()
1771 priv->irq_tx = res_irq_tx->start; in bcm_enet_probe()
1772 priv->mac_id = pdev->id; in bcm_enet_probe()
1775 if (priv->mac_id == 0) { in bcm_enet_probe()
1776 priv->rx_chan = 0; in bcm_enet_probe()
1777 priv->tx_chan = 1; in bcm_enet_probe()
1780 priv->rx_chan = 2; in bcm_enet_probe()
1781 priv->tx_chan = 3; in bcm_enet_probe()
1785 priv->mac_clk = clk_get(&pdev->dev, clk_name); in bcm_enet_probe()
1786 if (IS_ERR(priv->mac_clk)) { in bcm_enet_probe()
1787 ret = PTR_ERR(priv->mac_clk); in bcm_enet_probe()
1790 clk_prepare_enable(priv->mac_clk); in bcm_enet_probe()
1793 priv->rx_ring_size = BCMENET_DEF_RX_DESC; in bcm_enet_probe()
1794 priv->tx_ring_size = BCMENET_DEF_TX_DESC; in bcm_enet_probe()
1799 priv->has_phy = pd->has_phy; in bcm_enet_probe()
1800 priv->phy_id = pd->phy_id; in bcm_enet_probe()
1801 priv->has_phy_interrupt = pd->has_phy_interrupt; in bcm_enet_probe()
1802 priv->phy_interrupt = pd->phy_interrupt; in bcm_enet_probe()
1803 priv->use_external_mii = !pd->use_internal_phy; in bcm_enet_probe()
1804 priv->pause_auto = pd->pause_auto; in bcm_enet_probe()
1805 priv->pause_rx = pd->pause_rx; in bcm_enet_probe()
1806 priv->pause_tx = pd->pause_tx; in bcm_enet_probe()
1807 priv->force_duplex_full = pd->force_duplex_full; in bcm_enet_probe()
1808 priv->force_speed_100 = pd->force_speed_100; in bcm_enet_probe()
1809 priv->dma_chan_en_mask = pd->dma_chan_en_mask; in bcm_enet_probe()
1810 priv->dma_chan_int_mask = pd->dma_chan_int_mask; in bcm_enet_probe()
1811 priv->dma_chan_width = pd->dma_chan_width; in bcm_enet_probe()
1812 priv->dma_has_sram = pd->dma_has_sram; in bcm_enet_probe()
1813 priv->dma_desc_shift = pd->dma_desc_shift; in bcm_enet_probe()
1816 if (priv->mac_id == 0 && priv->has_phy && !priv->use_external_mii) { in bcm_enet_probe()
1818 priv->phy_clk = clk_get(&pdev->dev, "ephy"); in bcm_enet_probe()
1819 if (IS_ERR(priv->phy_clk)) { in bcm_enet_probe()
1820 ret = PTR_ERR(priv->phy_clk); in bcm_enet_probe()
1821 priv->phy_clk = NULL; in bcm_enet_probe()
1824 clk_prepare_enable(priv->phy_clk); in bcm_enet_probe()
1828 bcm_enet_hw_preinit(priv); in bcm_enet_probe()
1831 if (priv->has_phy) { in bcm_enet_probe()
1833 priv->mii_bus = mdiobus_alloc(); in bcm_enet_probe()
1834 if (!priv->mii_bus) { in bcm_enet_probe()
1839 bus = priv->mii_bus; in bcm_enet_probe()
1842 bus->priv = priv; in bcm_enet_probe()
1845 sprintf(bus->id, "%s-%d", pdev->name, priv->mac_id); in bcm_enet_probe()
1850 bus->phy_mask = ~(1 << priv->phy_id); in bcm_enet_probe()
1859 if (priv->has_phy_interrupt) in bcm_enet_probe()
1860 bus->irq[priv->phy_id] = priv->phy_interrupt; in bcm_enet_probe()
1862 bus->irq[priv->phy_id] = PHY_POLL; in bcm_enet_probe()
1880 spin_lock_init(&priv->rx_lock); in bcm_enet_probe()
1883 init_timer(&priv->rx_timeout); in bcm_enet_probe()
1884 priv->rx_timeout.function = bcm_enet_refill_rx_timer; in bcm_enet_probe()
1885 priv->rx_timeout.data = (unsigned long)dev; in bcm_enet_probe()
1888 mutex_init(&priv->mib_update_lock); in bcm_enet_probe()
1889 INIT_WORK(&priv->mib_update_task, bcm_enet_update_mib_counters_defer); in bcm_enet_probe()
1893 enet_writel(priv, 0, ENET_MIB_REG(i)); in bcm_enet_probe()
1897 netif_napi_add(dev, &priv->napi, bcm_enet_poll, 16); in bcm_enet_probe()
1908 priv->pdev = pdev; in bcm_enet_probe()
1909 priv->net_dev = dev; in bcm_enet_probe()
1914 if (priv->mii_bus) in bcm_enet_probe()
1915 mdiobus_unregister(priv->mii_bus); in bcm_enet_probe()
1918 if (priv->mii_bus) in bcm_enet_probe()
1919 mdiobus_free(priv->mii_bus); in bcm_enet_probe()
1923 enet_writel(priv, 0, ENET_MIISC_REG); in bcm_enet_probe()
1924 if (priv->phy_clk) { in bcm_enet_probe()
1925 clk_disable_unprepare(priv->phy_clk); in bcm_enet_probe()
1926 clk_put(priv->phy_clk); in bcm_enet_probe()
1930 clk_disable_unprepare(priv->mac_clk); in bcm_enet_probe()
1931 clk_put(priv->mac_clk); in bcm_enet_probe()
1943 struct bcm_enet_priv *priv; in bcm_enet_remove() local
1948 priv = netdev_priv(dev); in bcm_enet_remove()
1952 enet_writel(priv, 0, ENET_MIISC_REG); in bcm_enet_remove()
1954 if (priv->has_phy) { in bcm_enet_remove()
1955 mdiobus_unregister(priv->mii_bus); in bcm_enet_remove()
1956 mdiobus_free(priv->mii_bus); in bcm_enet_remove()
1967 if (priv->phy_clk) { in bcm_enet_remove()
1968 clk_disable_unprepare(priv->phy_clk); in bcm_enet_remove()
1969 clk_put(priv->phy_clk); in bcm_enet_remove()
1971 clk_disable_unprepare(priv->mac_clk); in bcm_enet_remove()
1972 clk_put(priv->mac_clk); in bcm_enet_remove()
1990 static int bcmenet_sw_mdio_read(struct bcm_enet_priv *priv, in bcmenet_sw_mdio_read() argument
1996 spin_lock_bh(&priv->enetsw_mdio_lock); in bcmenet_sw_mdio_read()
1997 enetsw_writel(priv, 0, ENETSW_MDIOC_REG); in bcmenet_sw_mdio_read()
2006 enetsw_writel(priv, reg, ENETSW_MDIOC_REG); in bcmenet_sw_mdio_read()
2008 ret = enetsw_readw(priv, ENETSW_MDIOD_REG); in bcmenet_sw_mdio_read()
2009 spin_unlock_bh(&priv->enetsw_mdio_lock); in bcmenet_sw_mdio_read()
2013 static void bcmenet_sw_mdio_write(struct bcm_enet_priv *priv, in bcmenet_sw_mdio_write() argument
2019 spin_lock_bh(&priv->enetsw_mdio_lock); in bcmenet_sw_mdio_write()
2020 enetsw_writel(priv, 0, ENETSW_MDIOC_REG); in bcmenet_sw_mdio_write()
2031 enetsw_writel(priv, reg, ENETSW_MDIOC_REG); in bcmenet_sw_mdio_write()
2033 spin_unlock_bh(&priv->enetsw_mdio_lock); in bcmenet_sw_mdio_write()
2046 struct bcm_enet_priv *priv = (struct bcm_enet_priv *)data; in swphy_poll_timer() local
2049 for (i = 0; i < priv->num_ports; i++) { in swphy_poll_timer()
2055 port = &priv->used_ports[i]; in swphy_poll_timer()
2064 val = bcmenet_sw_mdio_read(priv, external_phy, in swphy_poll_timer()
2071 if (!(up ^ priv->sw_port_link[i])) in swphy_poll_timer()
2074 priv->sw_port_link[i] = up; in swphy_poll_timer()
2078 dev_info(&priv->pdev->dev, "link DOWN on %s\n", in swphy_poll_timer()
2080 enetsw_writeb(priv, ENETSW_PORTOV_ENABLE_MASK, in swphy_poll_timer()
2082 enetsw_writeb(priv, ENETSW_PTCTRL_RXDIS_MASK | in swphy_poll_timer()
2088 advertise = bcmenet_sw_mdio_read(priv, external_phy, in swphy_poll_timer()
2091 lpa = bcmenet_sw_mdio_read(priv, external_phy, port->phy_id, in swphy_poll_timer()
2104 advertise = bcmenet_sw_mdio_read(priv, external_phy, in swphy_poll_timer()
2107 lpa = bcmenet_sw_mdio_read(priv, external_phy, in swphy_poll_timer()
2117 dev_info(&priv->pdev->dev, in swphy_poll_timer()
2131 enetsw_writeb(priv, override, ENETSW_PORTOV_REG(i)); in swphy_poll_timer()
2132 enetsw_writeb(priv, 0, ENETSW_PTCTRL_REG(i)); in swphy_poll_timer()
2135 priv->swphy_poll.expires = jiffies + HZ; in swphy_poll_timer()
2136 add_timer(&priv->swphy_poll); in swphy_poll_timer()
2144 struct bcm_enet_priv *priv; in bcm_enetsw_open() local
2151 priv = netdev_priv(dev); in bcm_enetsw_open()
2152 kdev = &priv->pdev->dev; in bcm_enetsw_open()
2155 enet_dmac_writel(priv, 0, ENETDMAC_IRMASK, priv->rx_chan); in bcm_enetsw_open()
2156 enet_dmac_writel(priv, 0, ENETDMAC_IRMASK, priv->tx_chan); in bcm_enetsw_open()
2158 ret = request_irq(priv->irq_rx, bcm_enet_isr_dma, in bcm_enetsw_open()
2163 if (priv->irq_tx != -1) { in bcm_enetsw_open()
2164 ret = request_irq(priv->irq_tx, bcm_enet_isr_dma, in bcm_enetsw_open()
2171 size = priv->rx_ring_size * sizeof(struct bcm_enet_desc); in bcm_enetsw_open()
2172 p = dma_alloc_coherent(kdev, size, &priv->rx_desc_dma, GFP_KERNEL); in bcm_enetsw_open()
2180 priv->rx_desc_alloc_size = size; in bcm_enetsw_open()
2181 priv->rx_desc_cpu = p; in bcm_enetsw_open()
2184 size = priv->tx_ring_size * sizeof(struct bcm_enet_desc); in bcm_enetsw_open()
2185 p = dma_alloc_coherent(kdev, size, &priv->tx_desc_dma, GFP_KERNEL); in bcm_enetsw_open()
2193 priv->tx_desc_alloc_size = size; in bcm_enetsw_open()
2194 priv->tx_desc_cpu = p; in bcm_enetsw_open()
2196 priv->tx_skb = kzalloc(sizeof(struct sk_buff *) * priv->tx_ring_size, in bcm_enetsw_open()
2198 if (!priv->tx_skb) { in bcm_enetsw_open()
2204 priv->tx_desc_count = priv->tx_ring_size; in bcm_enetsw_open()
2205 priv->tx_dirty_desc = 0; in bcm_enetsw_open()
2206 priv->tx_curr_desc = 0; in bcm_enetsw_open()
2207 spin_lock_init(&priv->tx_lock); in bcm_enetsw_open()
2210 priv->rx_skb = kzalloc(sizeof(struct sk_buff *) * priv->rx_ring_size, in bcm_enetsw_open()
2212 if (!priv->rx_skb) { in bcm_enetsw_open()
2218 priv->rx_desc_count = 0; in bcm_enetsw_open()
2219 priv->rx_dirty_desc = 0; in bcm_enetsw_open()
2220 priv->rx_curr_desc = 0; in bcm_enetsw_open()
2223 for (i = 0; i < priv->num_ports; i++) { in bcm_enetsw_open()
2224 enetsw_writeb(priv, ENETSW_PORTOV_ENABLE_MASK, in bcm_enetsw_open()
2226 enetsw_writeb(priv, ENETSW_PTCTRL_RXDIS_MASK | in bcm_enetsw_open()
2230 priv->sw_port_link[i] = 0; in bcm_enetsw_open()
2234 val = enetsw_readb(priv, ENETSW_GMCR_REG); in bcm_enetsw_open()
2236 enetsw_writeb(priv, val, ENETSW_GMCR_REG); in bcm_enetsw_open()
2239 enetsw_writeb(priv, val, ENETSW_GMCR_REG); in bcm_enetsw_open()
2243 val = enetsw_readb(priv, ENETSW_IMPOV_REG); in bcm_enetsw_open()
2245 enetsw_writeb(priv, val, ENETSW_IMPOV_REG); in bcm_enetsw_open()
2248 val = enetsw_readb(priv, ENETSW_SWMODE_REG); in bcm_enetsw_open()
2250 enetsw_writeb(priv, val, ENETSW_SWMODE_REG); in bcm_enetsw_open()
2253 enetsw_writel(priv, 0x1ff, ENETSW_JMBCTL_PORT_REG); in bcm_enetsw_open()
2254 enetsw_writew(priv, 9728, ENETSW_JMBCTL_MAXSIZE_REG); in bcm_enetsw_open()
2257 enet_dma_writel(priv, ENETDMA_BUFALLOC_FORCE_MASK | 0, in bcm_enetsw_open()
2258 ENETDMA_BUFALLOC_REG(priv->rx_chan)); in bcm_enetsw_open()
2267 enet_dmas_writel(priv, priv->rx_desc_dma, in bcm_enetsw_open()
2268 ENETDMAS_RSTART_REG, priv->rx_chan); in bcm_enetsw_open()
2269 enet_dmas_writel(priv, priv->tx_desc_dma, in bcm_enetsw_open()
2270 ENETDMAS_RSTART_REG, priv->tx_chan); in bcm_enetsw_open()
2273 enet_dmas_writel(priv, 0, ENETDMAS_SRAM2_REG, priv->rx_chan); in bcm_enetsw_open()
2274 enet_dmas_writel(priv, 0, ENETDMAS_SRAM2_REG, priv->tx_chan); in bcm_enetsw_open()
2275 enet_dmas_writel(priv, 0, ENETDMAS_SRAM3_REG, priv->rx_chan); in bcm_enetsw_open()
2276 enet_dmas_writel(priv, 0, ENETDMAS_SRAM3_REG, priv->tx_chan); in bcm_enetsw_open()
2277 enet_dmas_writel(priv, 0, ENETDMAS_SRAM4_REG, priv->rx_chan); in bcm_enetsw_open()
2278 enet_dmas_writel(priv, 0, ENETDMAS_SRAM4_REG, priv->tx_chan); in bcm_enetsw_open()
2281 enet_dmac_writel(priv, priv->dma_maxburst, in bcm_enetsw_open()
2282 ENETDMAC_MAXBURST, priv->rx_chan); in bcm_enetsw_open()
2283 enet_dmac_writel(priv, priv->dma_maxburst, in bcm_enetsw_open()
2284 ENETDMAC_MAXBURST, priv->tx_chan); in bcm_enetsw_open()
2287 val = priv->rx_ring_size / 3; in bcm_enetsw_open()
2288 enet_dma_writel(priv, val, ENETDMA_FLOWCL_REG(priv->rx_chan)); in bcm_enetsw_open()
2289 val = (priv->rx_ring_size * 2) / 3; in bcm_enetsw_open()
2290 enet_dma_writel(priv, val, ENETDMA_FLOWCH_REG(priv->rx_chan)); in bcm_enetsw_open()
2296 enet_dma_writel(priv, ENETDMA_CFG_EN_MASK, ENETDMA_CFG_REG); in bcm_enetsw_open()
2297 enet_dmac_writel(priv, ENETDMAC_CHANCFG_EN_MASK, in bcm_enetsw_open()
2298 ENETDMAC_CHANCFG, priv->rx_chan); in bcm_enetsw_open()
2301 enet_dmac_writel(priv, ENETDMAC_IR_PKTDONE_MASK, in bcm_enetsw_open()
2302 ENETDMAC_IR, priv->rx_chan); in bcm_enetsw_open()
2303 enet_dmac_writel(priv, ENETDMAC_IR_PKTDONE_MASK, in bcm_enetsw_open()
2304 ENETDMAC_IR, priv->tx_chan); in bcm_enetsw_open()
2307 napi_enable(&priv->napi); in bcm_enetsw_open()
2309 enet_dmac_writel(priv, ENETDMAC_IR_PKTDONE_MASK, in bcm_enetsw_open()
2310 ENETDMAC_IRMASK, priv->rx_chan); in bcm_enetsw_open()
2311 enet_dmac_writel(priv, ENETDMAC_IR_PKTDONE_MASK, in bcm_enetsw_open()
2312 ENETDMAC_IRMASK, priv->tx_chan); in bcm_enetsw_open()
2318 for (i = 0; i < priv->num_ports; i++) { in bcm_enetsw_open()
2321 port = &priv->used_ports[i]; in bcm_enetsw_open()
2350 enetsw_writeb(priv, override, ENETSW_PORTOV_REG(i)); in bcm_enetsw_open()
2351 enetsw_writeb(priv, 0, ENETSW_PTCTRL_REG(i)); in bcm_enetsw_open()
2355 init_timer(&priv->swphy_poll); in bcm_enetsw_open()
2356 priv->swphy_poll.function = swphy_poll_timer; in bcm_enetsw_open()
2357 priv->swphy_poll.data = (unsigned long)priv; in bcm_enetsw_open()
2358 priv->swphy_poll.expires = jiffies; in bcm_enetsw_open()
2359 add_timer(&priv->swphy_poll); in bcm_enetsw_open()
2363 for (i = 0; i < priv->rx_ring_size; i++) { in bcm_enetsw_open()
2366 if (!priv->rx_skb[i]) in bcm_enetsw_open()
2369 desc = &priv->rx_desc_cpu[i]; in bcm_enetsw_open()
2370 dma_unmap_single(kdev, desc->address, priv->rx_skb_size, in bcm_enetsw_open()
2372 kfree_skb(priv->rx_skb[i]); in bcm_enetsw_open()
2374 kfree(priv->rx_skb); in bcm_enetsw_open()
2377 kfree(priv->tx_skb); in bcm_enetsw_open()
2380 dma_free_coherent(kdev, priv->tx_desc_alloc_size, in bcm_enetsw_open()
2381 priv->tx_desc_cpu, priv->tx_desc_dma); in bcm_enetsw_open()
2384 dma_free_coherent(kdev, priv->rx_desc_alloc_size, in bcm_enetsw_open()
2385 priv->rx_desc_cpu, priv->rx_desc_dma); in bcm_enetsw_open()
2388 if (priv->irq_tx != -1) in bcm_enetsw_open()
2389 free_irq(priv->irq_tx, dev); in bcm_enetsw_open()
2392 free_irq(priv->irq_rx, dev); in bcm_enetsw_open()
2401 struct bcm_enet_priv *priv; in bcm_enetsw_stop() local
2405 priv = netdev_priv(dev); in bcm_enetsw_stop()
2406 kdev = &priv->pdev->dev; in bcm_enetsw_stop()
2408 del_timer_sync(&priv->swphy_poll); in bcm_enetsw_stop()
2410 napi_disable(&priv->napi); in bcm_enetsw_stop()
2411 del_timer_sync(&priv->rx_timeout); in bcm_enetsw_stop()
2414 enet_dmac_writel(priv, 0, ENETDMAC_IRMASK, priv->rx_chan); in bcm_enetsw_stop()
2415 enet_dmac_writel(priv, 0, ENETDMAC_IRMASK, priv->tx_chan); in bcm_enetsw_stop()
2418 bcm_enet_disable_dma(priv, priv->tx_chan); in bcm_enetsw_stop()
2419 bcm_enet_disable_dma(priv, priv->rx_chan); in bcm_enetsw_stop()
2425 for (i = 0; i < priv->rx_ring_size; i++) { in bcm_enetsw_stop()
2428 if (!priv->rx_skb[i]) in bcm_enetsw_stop()
2431 desc = &priv->rx_desc_cpu[i]; in bcm_enetsw_stop()
2432 dma_unmap_single(kdev, desc->address, priv->rx_skb_size, in bcm_enetsw_stop()
2434 kfree_skb(priv->rx_skb[i]); in bcm_enetsw_stop()
2438 kfree(priv->rx_skb); in bcm_enetsw_stop()
2439 kfree(priv->tx_skb); in bcm_enetsw_stop()
2440 dma_free_coherent(kdev, priv->rx_desc_alloc_size, in bcm_enetsw_stop()
2441 priv->rx_desc_cpu, priv->rx_desc_dma); in bcm_enetsw_stop()
2442 dma_free_coherent(kdev, priv->tx_desc_alloc_size, in bcm_enetsw_stop()
2443 priv->tx_desc_cpu, priv->tx_desc_dma); in bcm_enetsw_stop()
2444 if (priv->irq_tx != -1) in bcm_enetsw_stop()
2445 free_irq(priv->irq_tx, dev); in bcm_enetsw_stop()
2446 free_irq(priv->irq_rx, dev); in bcm_enetsw_stop()
2456 static int bcm_enetsw_phy_is_external(struct bcm_enet_priv *priv, int phy_id) in bcm_enetsw_phy_is_external() argument
2460 for (i = 0; i < priv->num_ports; ++i) { in bcm_enetsw_phy_is_external()
2461 if (!priv->used_ports[i].used) in bcm_enetsw_phy_is_external()
2463 if (priv->used_ports[i].phy_id == phy_id) in bcm_enetsw_phy_is_external()
2478 struct bcm_enet_priv *priv; in bcm_enetsw_mii_mdio_read() local
2480 priv = netdev_priv(dev); in bcm_enetsw_mii_mdio_read()
2481 return bcmenet_sw_mdio_read(priv, in bcm_enetsw_mii_mdio_read()
2482 bcm_enetsw_phy_is_external(priv, phy_id), in bcm_enetsw_mii_mdio_read()
2493 struct bcm_enet_priv *priv; in bcm_enetsw_mii_mdio_write() local
2495 priv = netdev_priv(dev); in bcm_enetsw_mii_mdio_write()
2496 bcmenet_sw_mdio_write(priv, bcm_enetsw_phy_is_external(priv, phy_id), in bcm_enetsw_mii_mdio_write()
2610 struct bcm_enet_priv *priv; in bcm_enetsw_get_ethtool_stats() local
2613 priv = netdev_priv(netdev); in bcm_enetsw_get_ethtool_stats()
2627 lo = enetsw_readl(priv, ENETSW_MIB_REG(reg)); in bcm_enetsw_get_ethtool_stats()
2628 p = (char *)priv + s->stat_offset; in bcm_enetsw_get_ethtool_stats()
2631 hi = enetsw_readl(priv, ENETSW_MIB_REG(reg + 1)); in bcm_enetsw_get_ethtool_stats()
2647 p = (char *)priv + s->stat_offset; in bcm_enetsw_get_ethtool_stats()
2657 struct bcm_enet_priv *priv; in bcm_enetsw_get_ringparam() local
2659 priv = netdev_priv(dev); in bcm_enetsw_get_ringparam()
2666 ering->rx_pending = priv->rx_ring_size; in bcm_enetsw_get_ringparam()
2667 ering->tx_pending = priv->tx_ring_size; in bcm_enetsw_get_ringparam()
2673 struct bcm_enet_priv *priv; in bcm_enetsw_set_ringparam() local
2676 priv = netdev_priv(dev); in bcm_enetsw_set_ringparam()
2684 priv->rx_ring_size = ering->rx_pending; in bcm_enetsw_set_ringparam()
2685 priv->tx_ring_size = ering->tx_pending; in bcm_enetsw_set_ringparam()
2709 struct bcm_enet_priv *priv; in bcm_enetsw_probe() local
2728 dev = alloc_etherdev(sizeof(*priv)); in bcm_enetsw_probe()
2731 priv = netdev_priv(dev); in bcm_enetsw_probe()
2732 memset(priv, 0, sizeof(*priv)); in bcm_enetsw_probe()
2735 priv->enet_is_sw = true; in bcm_enetsw_probe()
2736 priv->irq_rx = irq_rx; in bcm_enetsw_probe()
2737 priv->irq_tx = irq_tx; in bcm_enetsw_probe()
2738 priv->rx_ring_size = BCMENET_DEF_RX_DESC; in bcm_enetsw_probe()
2739 priv->tx_ring_size = BCMENET_DEF_TX_DESC; in bcm_enetsw_probe()
2740 priv->dma_maxburst = BCMENETSW_DMA_MAXBURST; in bcm_enetsw_probe()
2745 memcpy(priv->used_ports, pd->used_ports, in bcm_enetsw_probe()
2747 priv->num_ports = pd->num_ports; in bcm_enetsw_probe()
2748 priv->dma_has_sram = pd->dma_has_sram; in bcm_enetsw_probe()
2749 priv->dma_chan_en_mask = pd->dma_chan_en_mask; in bcm_enetsw_probe()
2750 priv->dma_chan_int_mask = pd->dma_chan_int_mask; in bcm_enetsw_probe()
2751 priv->dma_chan_width = pd->dma_chan_width; in bcm_enetsw_probe()
2754 ret = compute_hw_mtu(priv, dev->mtu); in bcm_enetsw_probe()
2764 priv->base = ioremap(res_mem->start, resource_size(res_mem)); in bcm_enetsw_probe()
2765 if (priv->base == NULL) { in bcm_enetsw_probe()
2770 priv->mac_clk = clk_get(&pdev->dev, "enetsw"); in bcm_enetsw_probe()
2771 if (IS_ERR(priv->mac_clk)) { in bcm_enetsw_probe()
2772 ret = PTR_ERR(priv->mac_clk); in bcm_enetsw_probe()
2775 clk_enable(priv->mac_clk); in bcm_enetsw_probe()
2777 priv->rx_chan = 0; in bcm_enetsw_probe()
2778 priv->tx_chan = 1; in bcm_enetsw_probe()
2779 spin_lock_init(&priv->rx_lock); in bcm_enetsw_probe()
2782 init_timer(&priv->rx_timeout); in bcm_enetsw_probe()
2783 priv->rx_timeout.function = bcm_enet_refill_rx_timer; in bcm_enetsw_probe()
2784 priv->rx_timeout.data = (unsigned long)dev; in bcm_enetsw_probe()
2788 netif_napi_add(dev, &priv->napi, bcm_enet_poll, 16); in bcm_enetsw_probe()
2792 spin_lock_init(&priv->enetsw_mdio_lock); in bcm_enetsw_probe()
2800 priv->pdev = pdev; in bcm_enetsw_probe()
2801 priv->net_dev = dev; in bcm_enetsw_probe()
2806 clk_put(priv->mac_clk); in bcm_enetsw_probe()
2809 iounmap(priv->base); in bcm_enetsw_probe()
2822 struct bcm_enet_priv *priv; in bcm_enetsw_remove() local
2828 priv = netdev_priv(dev); in bcm_enetsw_remove()
2832 iounmap(priv->base); in bcm_enetsw_remove()