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()
1366 static void update_mib_counters(struct bcm_enet_priv *priv) in update_mib_counters() argument
1379 val = enet_readl(priv, ENET_MIB_REG(s->mib_reg)); in update_mib_counters()
1380 p = (char *)priv + s->stat_offset; in update_mib_counters()
1391 (void)enet_readl(priv, ENET_MIB_REG(unused_mib_regs[i])); in update_mib_counters()
1396 struct bcm_enet_priv *priv; in bcm_enet_update_mib_counters_defer() local
1398 priv = container_of(t, struct bcm_enet_priv, mib_update_task); in bcm_enet_update_mib_counters_defer()
1399 mutex_lock(&priv->mib_update_lock); in bcm_enet_update_mib_counters_defer()
1400 update_mib_counters(priv); in bcm_enet_update_mib_counters_defer()
1401 mutex_unlock(&priv->mib_update_lock); in bcm_enet_update_mib_counters_defer()
1404 if (netif_running(priv->net_dev)) in bcm_enet_update_mib_counters_defer()
1405 enet_writel(priv, ENET_IR_MIB, ENET_IRMASK_REG); in bcm_enet_update_mib_counters_defer()
1412 struct bcm_enet_priv *priv; in bcm_enet_get_ethtool_stats() local
1415 priv = netdev_priv(netdev); in bcm_enet_get_ethtool_stats()
1417 mutex_lock(&priv->mib_update_lock); in bcm_enet_get_ethtool_stats()
1418 update_mib_counters(priv); in bcm_enet_get_ethtool_stats()
1428 p = (char *)priv; in bcm_enet_get_ethtool_stats()
1433 mutex_unlock(&priv->mib_update_lock); in bcm_enet_get_ethtool_stats()
1438 struct bcm_enet_priv *priv; in bcm_enet_nway_reset() local
1440 priv = netdev_priv(dev); in bcm_enet_nway_reset()
1441 if (priv->has_phy) { in bcm_enet_nway_reset()
1442 if (!priv->phydev) in bcm_enet_nway_reset()
1444 return genphy_restart_aneg(priv->phydev); in bcm_enet_nway_reset()
1453 struct bcm_enet_priv *priv; in bcm_enet_get_settings() local
1455 priv = netdev_priv(dev); in bcm_enet_get_settings()
1460 if (priv->has_phy) { in bcm_enet_get_settings()
1461 if (!priv->phydev) in bcm_enet_get_settings()
1463 return phy_ethtool_gset(priv->phydev, cmd); in bcm_enet_get_settings()
1466 ethtool_cmd_speed_set(cmd, ((priv->force_speed_100) in bcm_enet_get_settings()
1468 cmd->duplex = (priv->force_duplex_full) ? in bcm_enet_get_settings()
1484 struct bcm_enet_priv *priv; in bcm_enet_set_settings() local
1486 priv = netdev_priv(dev); in bcm_enet_set_settings()
1487 if (priv->has_phy) { in bcm_enet_set_settings()
1488 if (!priv->phydev) in bcm_enet_set_settings()
1490 return phy_ethtool_sset(priv->phydev, cmd); in bcm_enet_set_settings()
1498 priv->force_speed_100 = (cmd->speed == SPEED_100) ? 1 : 0; in bcm_enet_set_settings()
1499 priv->force_duplex_full = (cmd->duplex == DUPLEX_FULL) ? 1 : 0; in bcm_enet_set_settings()
1510 struct bcm_enet_priv *priv; in bcm_enet_get_ringparam() local
1512 priv = netdev_priv(dev); in bcm_enet_get_ringparam()
1517 ering->rx_pending = priv->rx_ring_size; in bcm_enet_get_ringparam()
1518 ering->tx_pending = priv->tx_ring_size; in bcm_enet_get_ringparam()
1524 struct bcm_enet_priv *priv; in bcm_enet_set_ringparam() local
1527 priv = netdev_priv(dev); in bcm_enet_set_ringparam()
1535 priv->rx_ring_size = ering->rx_pending; in bcm_enet_set_ringparam()
1536 priv->tx_ring_size = ering->tx_pending; in bcm_enet_set_ringparam()
1553 struct bcm_enet_priv *priv; in bcm_enet_get_pauseparam() local
1555 priv = netdev_priv(dev); in bcm_enet_get_pauseparam()
1556 ecmd->autoneg = priv->pause_auto; in bcm_enet_get_pauseparam()
1557 ecmd->rx_pause = priv->pause_rx; in bcm_enet_get_pauseparam()
1558 ecmd->tx_pause = priv->pause_tx; in bcm_enet_get_pauseparam()
1564 struct bcm_enet_priv *priv; in bcm_enet_set_pauseparam() local
1566 priv = netdev_priv(dev); in bcm_enet_set_pauseparam()
1568 if (priv->has_phy) { in bcm_enet_set_pauseparam()
1581 priv->pause_auto = ecmd->autoneg; in bcm_enet_set_pauseparam()
1582 priv->pause_rx = ecmd->rx_pause; in bcm_enet_set_pauseparam()
1583 priv->pause_tx = ecmd->tx_pause; in bcm_enet_set_pauseparam()
1605 struct bcm_enet_priv *priv; in bcm_enet_ioctl() local
1607 priv = netdev_priv(dev); in bcm_enet_ioctl()
1608 if (priv->has_phy) { in bcm_enet_ioctl()
1609 if (!priv->phydev) in bcm_enet_ioctl()
1611 return phy_mii_ioctl(priv->phydev, rq, cmd); in bcm_enet_ioctl()
1628 static int compute_hw_mtu(struct bcm_enet_priv *priv, int mtu) in compute_hw_mtu() argument
1646 priv->hw_mtu = actual_mtu; in compute_hw_mtu()
1652 priv->rx_skb_size = ALIGN(actual_mtu + ETH_FCS_LEN, in compute_hw_mtu()
1653 priv->dma_maxburst * 4); in compute_hw_mtu()
1677 static void bcm_enet_hw_preinit(struct bcm_enet_priv *priv) in bcm_enet_hw_preinit() argument
1683 bcm_enet_disable_mac(priv); in bcm_enet_hw_preinit()
1687 enet_writel(priv, val, ENET_CTL_REG); in bcm_enet_hw_preinit()
1692 val = enet_readl(priv, ENET_CTL_REG); in bcm_enet_hw_preinit()
1699 val = enet_readl(priv, ENET_CTL_REG); in bcm_enet_hw_preinit()
1700 if (priv->use_external_mii) in bcm_enet_hw_preinit()
1704 enet_writel(priv, val, ENET_CTL_REG); in bcm_enet_hw_preinit()
1707 enet_writel(priv, (0x1f << ENET_MIISC_MDCFREQDIV_SHIFT) | in bcm_enet_hw_preinit()
1711 val = enet_readl(priv, ENET_MIBCTL_REG); in bcm_enet_hw_preinit()
1713 enet_writel(priv, val, ENET_MIBCTL_REG); in bcm_enet_hw_preinit()
1731 struct bcm_enet_priv *priv; in bcm_enet_probe() local
1751 dev = alloc_etherdev(sizeof(*priv)); in bcm_enet_probe()
1754 priv = netdev_priv(dev); in bcm_enet_probe()
1756 priv->enet_is_sw = false; in bcm_enet_probe()
1757 priv->dma_maxburst = BCMENET_DMA_MAXBURST; in bcm_enet_probe()
1759 ret = compute_hw_mtu(priv, dev->mtu); in bcm_enet_probe()
1764 priv->base = devm_ioremap_resource(&pdev->dev, res_mem); in bcm_enet_probe()
1765 if (IS_ERR(priv->base)) { in bcm_enet_probe()
1766 ret = PTR_ERR(priv->base); in bcm_enet_probe()
1770 dev->irq = priv->irq = res_irq->start; in bcm_enet_probe()
1771 priv->irq_rx = res_irq_rx->start; in bcm_enet_probe()
1772 priv->irq_tx = res_irq_tx->start; in bcm_enet_probe()
1773 priv->mac_id = pdev->id; in bcm_enet_probe()
1776 if (priv->mac_id == 0) { in bcm_enet_probe()
1777 priv->rx_chan = 0; in bcm_enet_probe()
1778 priv->tx_chan = 1; in bcm_enet_probe()
1781 priv->rx_chan = 2; in bcm_enet_probe()
1782 priv->tx_chan = 3; in bcm_enet_probe()
1786 priv->mac_clk = clk_get(&pdev->dev, clk_name); in bcm_enet_probe()
1787 if (IS_ERR(priv->mac_clk)) { in bcm_enet_probe()
1788 ret = PTR_ERR(priv->mac_clk); in bcm_enet_probe()
1791 clk_prepare_enable(priv->mac_clk); in bcm_enet_probe()
1794 priv->rx_ring_size = BCMENET_DEF_RX_DESC; in bcm_enet_probe()
1795 priv->tx_ring_size = BCMENET_DEF_TX_DESC; in bcm_enet_probe()
1800 priv->has_phy = pd->has_phy; in bcm_enet_probe()
1801 priv->phy_id = pd->phy_id; in bcm_enet_probe()
1802 priv->has_phy_interrupt = pd->has_phy_interrupt; in bcm_enet_probe()
1803 priv->phy_interrupt = pd->phy_interrupt; in bcm_enet_probe()
1804 priv->use_external_mii = !pd->use_internal_phy; in bcm_enet_probe()
1805 priv->pause_auto = pd->pause_auto; in bcm_enet_probe()
1806 priv->pause_rx = pd->pause_rx; in bcm_enet_probe()
1807 priv->pause_tx = pd->pause_tx; in bcm_enet_probe()
1808 priv->force_duplex_full = pd->force_duplex_full; in bcm_enet_probe()
1809 priv->force_speed_100 = pd->force_speed_100; in bcm_enet_probe()
1810 priv->dma_chan_en_mask = pd->dma_chan_en_mask; in bcm_enet_probe()
1811 priv->dma_chan_int_mask = pd->dma_chan_int_mask; in bcm_enet_probe()
1812 priv->dma_chan_width = pd->dma_chan_width; in bcm_enet_probe()
1813 priv->dma_has_sram = pd->dma_has_sram; in bcm_enet_probe()
1814 priv->dma_desc_shift = pd->dma_desc_shift; in bcm_enet_probe()
1817 if (priv->mac_id == 0 && priv->has_phy && !priv->use_external_mii) { in bcm_enet_probe()
1819 priv->phy_clk = clk_get(&pdev->dev, "ephy"); in bcm_enet_probe()
1820 if (IS_ERR(priv->phy_clk)) { in bcm_enet_probe()
1821 ret = PTR_ERR(priv->phy_clk); in bcm_enet_probe()
1822 priv->phy_clk = NULL; in bcm_enet_probe()
1825 clk_prepare_enable(priv->phy_clk); in bcm_enet_probe()
1829 bcm_enet_hw_preinit(priv); in bcm_enet_probe()
1832 if (priv->has_phy) { in bcm_enet_probe()
1834 priv->mii_bus = mdiobus_alloc(); in bcm_enet_probe()
1835 if (!priv->mii_bus) { in bcm_enet_probe()
1840 bus = priv->mii_bus; in bcm_enet_probe()
1843 bus->priv = priv; in bcm_enet_probe()
1846 sprintf(bus->id, "%s-%d", pdev->name, priv->mac_id); in bcm_enet_probe()
1851 bus->phy_mask = ~(1 << priv->phy_id); in bcm_enet_probe()
1860 if (priv->has_phy_interrupt) in bcm_enet_probe()
1861 bus->irq[priv->phy_id] = priv->phy_interrupt; in bcm_enet_probe()
1863 bus->irq[priv->phy_id] = PHY_POLL; in bcm_enet_probe()
1881 spin_lock_init(&priv->rx_lock); in bcm_enet_probe()
1884 init_timer(&priv->rx_timeout); in bcm_enet_probe()
1885 priv->rx_timeout.function = bcm_enet_refill_rx_timer; in bcm_enet_probe()
1886 priv->rx_timeout.data = (unsigned long)dev; in bcm_enet_probe()
1889 mutex_init(&priv->mib_update_lock); in bcm_enet_probe()
1890 INIT_WORK(&priv->mib_update_task, bcm_enet_update_mib_counters_defer); in bcm_enet_probe()
1894 enet_writel(priv, 0, ENET_MIB_REG(i)); in bcm_enet_probe()
1898 netif_napi_add(dev, &priv->napi, bcm_enet_poll, 16); in bcm_enet_probe()
1909 priv->pdev = pdev; in bcm_enet_probe()
1910 priv->net_dev = dev; in bcm_enet_probe()
1915 if (priv->mii_bus) in bcm_enet_probe()
1916 mdiobus_unregister(priv->mii_bus); in bcm_enet_probe()
1919 if (priv->mii_bus) in bcm_enet_probe()
1920 mdiobus_free(priv->mii_bus); in bcm_enet_probe()
1924 enet_writel(priv, 0, ENET_MIISC_REG); in bcm_enet_probe()
1925 if (priv->phy_clk) { in bcm_enet_probe()
1926 clk_disable_unprepare(priv->phy_clk); in bcm_enet_probe()
1927 clk_put(priv->phy_clk); in bcm_enet_probe()
1931 clk_disable_unprepare(priv->mac_clk); in bcm_enet_probe()
1932 clk_put(priv->mac_clk); in bcm_enet_probe()
1944 struct bcm_enet_priv *priv; in bcm_enet_remove() local
1949 priv = netdev_priv(dev); in bcm_enet_remove()
1953 enet_writel(priv, 0, ENET_MIISC_REG); in bcm_enet_remove()
1955 if (priv->has_phy) { in bcm_enet_remove()
1956 mdiobus_unregister(priv->mii_bus); in bcm_enet_remove()
1957 mdiobus_free(priv->mii_bus); in bcm_enet_remove()
1968 if (priv->phy_clk) { in bcm_enet_remove()
1969 clk_disable_unprepare(priv->phy_clk); in bcm_enet_remove()
1970 clk_put(priv->phy_clk); in bcm_enet_remove()
1972 clk_disable_unprepare(priv->mac_clk); in bcm_enet_remove()
1973 clk_put(priv->mac_clk); in bcm_enet_remove()
1991 static int bcmenet_sw_mdio_read(struct bcm_enet_priv *priv, in bcmenet_sw_mdio_read() argument
1997 spin_lock_bh(&priv->enetsw_mdio_lock); in bcmenet_sw_mdio_read()
1998 enetsw_writel(priv, 0, ENETSW_MDIOC_REG); in bcmenet_sw_mdio_read()
2007 enetsw_writel(priv, reg, ENETSW_MDIOC_REG); in bcmenet_sw_mdio_read()
2009 ret = enetsw_readw(priv, ENETSW_MDIOD_REG); in bcmenet_sw_mdio_read()
2010 spin_unlock_bh(&priv->enetsw_mdio_lock); in bcmenet_sw_mdio_read()
2014 static void bcmenet_sw_mdio_write(struct bcm_enet_priv *priv, in bcmenet_sw_mdio_write() argument
2020 spin_lock_bh(&priv->enetsw_mdio_lock); in bcmenet_sw_mdio_write()
2021 enetsw_writel(priv, 0, ENETSW_MDIOC_REG); in bcmenet_sw_mdio_write()
2032 enetsw_writel(priv, reg, ENETSW_MDIOC_REG); in bcmenet_sw_mdio_write()
2034 spin_unlock_bh(&priv->enetsw_mdio_lock); in bcmenet_sw_mdio_write()
2047 struct bcm_enet_priv *priv = (struct bcm_enet_priv *)data; in swphy_poll_timer() local
2050 for (i = 0; i < priv->num_ports; i++) { in swphy_poll_timer()
2056 port = &priv->used_ports[i]; in swphy_poll_timer()
2065 val = bcmenet_sw_mdio_read(priv, external_phy, in swphy_poll_timer()
2072 if (!(up ^ priv->sw_port_link[i])) in swphy_poll_timer()
2075 priv->sw_port_link[i] = up; in swphy_poll_timer()
2079 dev_info(&priv->pdev->dev, "link DOWN on %s\n", in swphy_poll_timer()
2081 enetsw_writeb(priv, ENETSW_PORTOV_ENABLE_MASK, in swphy_poll_timer()
2083 enetsw_writeb(priv, ENETSW_PTCTRL_RXDIS_MASK | in swphy_poll_timer()
2089 advertise = bcmenet_sw_mdio_read(priv, external_phy, in swphy_poll_timer()
2092 lpa = bcmenet_sw_mdio_read(priv, external_phy, port->phy_id, in swphy_poll_timer()
2095 lpa2 = bcmenet_sw_mdio_read(priv, external_phy, port->phy_id, in swphy_poll_timer()
2113 dev_info(&priv->pdev->dev, in swphy_poll_timer()
2127 enetsw_writeb(priv, override, ENETSW_PORTOV_REG(i)); in swphy_poll_timer()
2128 enetsw_writeb(priv, 0, ENETSW_PTCTRL_REG(i)); in swphy_poll_timer()
2131 priv->swphy_poll.expires = jiffies + HZ; in swphy_poll_timer()
2132 add_timer(&priv->swphy_poll); in swphy_poll_timer()
2140 struct bcm_enet_priv *priv; in bcm_enetsw_open() local
2147 priv = netdev_priv(dev); in bcm_enetsw_open()
2148 kdev = &priv->pdev->dev; in bcm_enetsw_open()
2151 enet_dmac_writel(priv, 0, ENETDMAC_IRMASK, priv->rx_chan); in bcm_enetsw_open()
2152 enet_dmac_writel(priv, 0, ENETDMAC_IRMASK, priv->tx_chan); in bcm_enetsw_open()
2154 ret = request_irq(priv->irq_rx, bcm_enet_isr_dma, in bcm_enetsw_open()
2159 if (priv->irq_tx != -1) { in bcm_enetsw_open()
2160 ret = request_irq(priv->irq_tx, bcm_enet_isr_dma, in bcm_enetsw_open()
2167 size = priv->rx_ring_size * sizeof(struct bcm_enet_desc); in bcm_enetsw_open()
2168 p = dma_alloc_coherent(kdev, size, &priv->rx_desc_dma, GFP_KERNEL); in bcm_enetsw_open()
2176 priv->rx_desc_alloc_size = size; in bcm_enetsw_open()
2177 priv->rx_desc_cpu = p; in bcm_enetsw_open()
2180 size = priv->tx_ring_size * sizeof(struct bcm_enet_desc); in bcm_enetsw_open()
2181 p = dma_alloc_coherent(kdev, size, &priv->tx_desc_dma, GFP_KERNEL); in bcm_enetsw_open()
2189 priv->tx_desc_alloc_size = size; in bcm_enetsw_open()
2190 priv->tx_desc_cpu = p; in bcm_enetsw_open()
2192 priv->tx_skb = kzalloc(sizeof(struct sk_buff *) * priv->tx_ring_size, in bcm_enetsw_open()
2194 if (!priv->tx_skb) { in bcm_enetsw_open()
2200 priv->tx_desc_count = priv->tx_ring_size; in bcm_enetsw_open()
2201 priv->tx_dirty_desc = 0; in bcm_enetsw_open()
2202 priv->tx_curr_desc = 0; in bcm_enetsw_open()
2203 spin_lock_init(&priv->tx_lock); in bcm_enetsw_open()
2206 priv->rx_skb = kzalloc(sizeof(struct sk_buff *) * priv->rx_ring_size, in bcm_enetsw_open()
2208 if (!priv->rx_skb) { in bcm_enetsw_open()
2214 priv->rx_desc_count = 0; in bcm_enetsw_open()
2215 priv->rx_dirty_desc = 0; in bcm_enetsw_open()
2216 priv->rx_curr_desc = 0; in bcm_enetsw_open()
2219 for (i = 0; i < priv->num_ports; i++) { in bcm_enetsw_open()
2220 enetsw_writeb(priv, ENETSW_PORTOV_ENABLE_MASK, in bcm_enetsw_open()
2222 enetsw_writeb(priv, ENETSW_PTCTRL_RXDIS_MASK | in bcm_enetsw_open()
2226 priv->sw_port_link[i] = 0; in bcm_enetsw_open()
2230 val = enetsw_readb(priv, ENETSW_GMCR_REG); in bcm_enetsw_open()
2232 enetsw_writeb(priv, val, ENETSW_GMCR_REG); in bcm_enetsw_open()
2235 enetsw_writeb(priv, val, ENETSW_GMCR_REG); in bcm_enetsw_open()
2239 val = enetsw_readb(priv, ENETSW_IMPOV_REG); in bcm_enetsw_open()
2241 enetsw_writeb(priv, val, ENETSW_IMPOV_REG); in bcm_enetsw_open()
2244 val = enetsw_readb(priv, ENETSW_SWMODE_REG); in bcm_enetsw_open()
2246 enetsw_writeb(priv, val, ENETSW_SWMODE_REG); in bcm_enetsw_open()
2249 enetsw_writel(priv, 0x1ff, ENETSW_JMBCTL_PORT_REG); in bcm_enetsw_open()
2250 enetsw_writew(priv, 9728, ENETSW_JMBCTL_MAXSIZE_REG); in bcm_enetsw_open()
2253 enet_dma_writel(priv, ENETDMA_BUFALLOC_FORCE_MASK | 0, in bcm_enetsw_open()
2254 ENETDMA_BUFALLOC_REG(priv->rx_chan)); in bcm_enetsw_open()
2263 enet_dmas_writel(priv, priv->rx_desc_dma, in bcm_enetsw_open()
2264 ENETDMAS_RSTART_REG, priv->rx_chan); in bcm_enetsw_open()
2265 enet_dmas_writel(priv, priv->tx_desc_dma, in bcm_enetsw_open()
2266 ENETDMAS_RSTART_REG, priv->tx_chan); in bcm_enetsw_open()
2269 enet_dmas_writel(priv, 0, ENETDMAS_SRAM2_REG, priv->rx_chan); in bcm_enetsw_open()
2270 enet_dmas_writel(priv, 0, ENETDMAS_SRAM2_REG, priv->tx_chan); in bcm_enetsw_open()
2271 enet_dmas_writel(priv, 0, ENETDMAS_SRAM3_REG, priv->rx_chan); in bcm_enetsw_open()
2272 enet_dmas_writel(priv, 0, ENETDMAS_SRAM3_REG, priv->tx_chan); in bcm_enetsw_open()
2273 enet_dmas_writel(priv, 0, ENETDMAS_SRAM4_REG, priv->rx_chan); in bcm_enetsw_open()
2274 enet_dmas_writel(priv, 0, ENETDMAS_SRAM4_REG, priv->tx_chan); in bcm_enetsw_open()
2277 enet_dmac_writel(priv, priv->dma_maxburst, in bcm_enetsw_open()
2278 ENETDMAC_MAXBURST, priv->rx_chan); in bcm_enetsw_open()
2279 enet_dmac_writel(priv, priv->dma_maxburst, in bcm_enetsw_open()
2280 ENETDMAC_MAXBURST, priv->tx_chan); in bcm_enetsw_open()
2283 val = priv->rx_ring_size / 3; in bcm_enetsw_open()
2284 enet_dma_writel(priv, val, ENETDMA_FLOWCL_REG(priv->rx_chan)); in bcm_enetsw_open()
2285 val = (priv->rx_ring_size * 2) / 3; in bcm_enetsw_open()
2286 enet_dma_writel(priv, val, ENETDMA_FLOWCH_REG(priv->rx_chan)); in bcm_enetsw_open()
2292 enet_dma_writel(priv, ENETDMA_CFG_EN_MASK, ENETDMA_CFG_REG); in bcm_enetsw_open()
2293 enet_dmac_writel(priv, ENETDMAC_CHANCFG_EN_MASK, in bcm_enetsw_open()
2294 ENETDMAC_CHANCFG, priv->rx_chan); in bcm_enetsw_open()
2297 enet_dmac_writel(priv, ENETDMAC_IR_PKTDONE_MASK, in bcm_enetsw_open()
2298 ENETDMAC_IR, priv->rx_chan); in bcm_enetsw_open()
2299 enet_dmac_writel(priv, ENETDMAC_IR_PKTDONE_MASK, in bcm_enetsw_open()
2300 ENETDMAC_IR, priv->tx_chan); in bcm_enetsw_open()
2303 napi_enable(&priv->napi); in bcm_enetsw_open()
2305 enet_dmac_writel(priv, ENETDMAC_IR_PKTDONE_MASK, in bcm_enetsw_open()
2306 ENETDMAC_IRMASK, priv->rx_chan); in bcm_enetsw_open()
2307 enet_dmac_writel(priv, ENETDMAC_IR_PKTDONE_MASK, in bcm_enetsw_open()
2308 ENETDMAC_IRMASK, priv->tx_chan); in bcm_enetsw_open()
2314 for (i = 0; i < priv->num_ports; i++) { in bcm_enetsw_open()
2317 port = &priv->used_ports[i]; in bcm_enetsw_open()
2346 enetsw_writeb(priv, override, ENETSW_PORTOV_REG(i)); in bcm_enetsw_open()
2347 enetsw_writeb(priv, 0, ENETSW_PTCTRL_REG(i)); in bcm_enetsw_open()
2351 init_timer(&priv->swphy_poll); in bcm_enetsw_open()
2352 priv->swphy_poll.function = swphy_poll_timer; in bcm_enetsw_open()
2353 priv->swphy_poll.data = (unsigned long)priv; in bcm_enetsw_open()
2354 priv->swphy_poll.expires = jiffies; in bcm_enetsw_open()
2355 add_timer(&priv->swphy_poll); in bcm_enetsw_open()
2359 for (i = 0; i < priv->rx_ring_size; i++) { in bcm_enetsw_open()
2362 if (!priv->rx_skb[i]) in bcm_enetsw_open()
2365 desc = &priv->rx_desc_cpu[i]; in bcm_enetsw_open()
2366 dma_unmap_single(kdev, desc->address, priv->rx_skb_size, in bcm_enetsw_open()
2368 kfree_skb(priv->rx_skb[i]); in bcm_enetsw_open()
2370 kfree(priv->rx_skb); in bcm_enetsw_open()
2373 kfree(priv->tx_skb); in bcm_enetsw_open()
2376 dma_free_coherent(kdev, priv->tx_desc_alloc_size, in bcm_enetsw_open()
2377 priv->tx_desc_cpu, priv->tx_desc_dma); in bcm_enetsw_open()
2380 dma_free_coherent(kdev, priv->rx_desc_alloc_size, in bcm_enetsw_open()
2381 priv->rx_desc_cpu, priv->rx_desc_dma); in bcm_enetsw_open()
2384 if (priv->irq_tx != -1) in bcm_enetsw_open()
2385 free_irq(priv->irq_tx, dev); in bcm_enetsw_open()
2388 free_irq(priv->irq_rx, dev); in bcm_enetsw_open()
2397 struct bcm_enet_priv *priv; in bcm_enetsw_stop() local
2401 priv = netdev_priv(dev); in bcm_enetsw_stop()
2402 kdev = &priv->pdev->dev; in bcm_enetsw_stop()
2404 del_timer_sync(&priv->swphy_poll); in bcm_enetsw_stop()
2406 napi_disable(&priv->napi); in bcm_enetsw_stop()
2407 del_timer_sync(&priv->rx_timeout); in bcm_enetsw_stop()
2410 enet_dmac_writel(priv, 0, ENETDMAC_IRMASK, priv->rx_chan); in bcm_enetsw_stop()
2411 enet_dmac_writel(priv, 0, ENETDMAC_IRMASK, priv->tx_chan); in bcm_enetsw_stop()
2414 bcm_enet_disable_dma(priv, priv->tx_chan); in bcm_enetsw_stop()
2415 bcm_enet_disable_dma(priv, priv->rx_chan); in bcm_enetsw_stop()
2421 for (i = 0; i < priv->rx_ring_size; i++) { in bcm_enetsw_stop()
2424 if (!priv->rx_skb[i]) in bcm_enetsw_stop()
2427 desc = &priv->rx_desc_cpu[i]; in bcm_enetsw_stop()
2428 dma_unmap_single(kdev, desc->address, priv->rx_skb_size, in bcm_enetsw_stop()
2430 kfree_skb(priv->rx_skb[i]); in bcm_enetsw_stop()
2434 kfree(priv->rx_skb); in bcm_enetsw_stop()
2435 kfree(priv->tx_skb); in bcm_enetsw_stop()
2436 dma_free_coherent(kdev, priv->rx_desc_alloc_size, in bcm_enetsw_stop()
2437 priv->rx_desc_cpu, priv->rx_desc_dma); in bcm_enetsw_stop()
2438 dma_free_coherent(kdev, priv->tx_desc_alloc_size, in bcm_enetsw_stop()
2439 priv->tx_desc_cpu, priv->tx_desc_dma); in bcm_enetsw_stop()
2440 if (priv->irq_tx != -1) in bcm_enetsw_stop()
2441 free_irq(priv->irq_tx, dev); in bcm_enetsw_stop()
2442 free_irq(priv->irq_rx, dev); in bcm_enetsw_stop()
2452 static int bcm_enetsw_phy_is_external(struct bcm_enet_priv *priv, int phy_id) in bcm_enetsw_phy_is_external() argument
2456 for (i = 0; i < priv->num_ports; ++i) { in bcm_enetsw_phy_is_external()
2457 if (!priv->used_ports[i].used) in bcm_enetsw_phy_is_external()
2459 if (priv->used_ports[i].phy_id == phy_id) in bcm_enetsw_phy_is_external()
2474 struct bcm_enet_priv *priv; in bcm_enetsw_mii_mdio_read() local
2476 priv = netdev_priv(dev); in bcm_enetsw_mii_mdio_read()
2477 return bcmenet_sw_mdio_read(priv, in bcm_enetsw_mii_mdio_read()
2478 bcm_enetsw_phy_is_external(priv, phy_id), in bcm_enetsw_mii_mdio_read()
2489 struct bcm_enet_priv *priv; in bcm_enetsw_mii_mdio_write() local
2491 priv = netdev_priv(dev); in bcm_enetsw_mii_mdio_write()
2492 bcmenet_sw_mdio_write(priv, bcm_enetsw_phy_is_external(priv, phy_id), in bcm_enetsw_mii_mdio_write()
2607 struct bcm_enet_priv *priv; in bcm_enetsw_get_ethtool_stats() local
2610 priv = netdev_priv(netdev); in bcm_enetsw_get_ethtool_stats()
2624 lo = enetsw_readl(priv, ENETSW_MIB_REG(reg)); in bcm_enetsw_get_ethtool_stats()
2625 p = (char *)priv + s->stat_offset; in bcm_enetsw_get_ethtool_stats()
2628 hi = enetsw_readl(priv, ENETSW_MIB_REG(reg + 1)); in bcm_enetsw_get_ethtool_stats()
2644 p = (char *)priv + s->stat_offset; in bcm_enetsw_get_ethtool_stats()
2654 struct bcm_enet_priv *priv; in bcm_enetsw_get_ringparam() local
2656 priv = netdev_priv(dev); in bcm_enetsw_get_ringparam()
2663 ering->rx_pending = priv->rx_ring_size; in bcm_enetsw_get_ringparam()
2664 ering->tx_pending = priv->tx_ring_size; in bcm_enetsw_get_ringparam()
2670 struct bcm_enet_priv *priv; in bcm_enetsw_set_ringparam() local
2673 priv = netdev_priv(dev); in bcm_enetsw_set_ringparam()
2681 priv->rx_ring_size = ering->rx_pending; in bcm_enetsw_set_ringparam()
2682 priv->tx_ring_size = ering->tx_pending; in bcm_enetsw_set_ringparam()
2706 struct bcm_enet_priv *priv; in bcm_enetsw_probe() local
2725 dev = alloc_etherdev(sizeof(*priv)); in bcm_enetsw_probe()
2728 priv = netdev_priv(dev); in bcm_enetsw_probe()
2729 memset(priv, 0, sizeof(*priv)); in bcm_enetsw_probe()
2732 priv->enet_is_sw = true; in bcm_enetsw_probe()
2733 priv->irq_rx = irq_rx; in bcm_enetsw_probe()
2734 priv->irq_tx = irq_tx; in bcm_enetsw_probe()
2735 priv->rx_ring_size = BCMENET_DEF_RX_DESC; in bcm_enetsw_probe()
2736 priv->tx_ring_size = BCMENET_DEF_TX_DESC; in bcm_enetsw_probe()
2737 priv->dma_maxburst = BCMENETSW_DMA_MAXBURST; in bcm_enetsw_probe()
2742 memcpy(priv->used_ports, pd->used_ports, in bcm_enetsw_probe()
2744 priv->num_ports = pd->num_ports; in bcm_enetsw_probe()
2745 priv->dma_has_sram = pd->dma_has_sram; in bcm_enetsw_probe()
2746 priv->dma_chan_en_mask = pd->dma_chan_en_mask; in bcm_enetsw_probe()
2747 priv->dma_chan_int_mask = pd->dma_chan_int_mask; in bcm_enetsw_probe()
2748 priv->dma_chan_width = pd->dma_chan_width; in bcm_enetsw_probe()
2751 ret = compute_hw_mtu(priv, dev->mtu); in bcm_enetsw_probe()
2761 priv->base = ioremap(res_mem->start, resource_size(res_mem)); in bcm_enetsw_probe()
2762 if (priv->base == NULL) { in bcm_enetsw_probe()
2767 priv->mac_clk = clk_get(&pdev->dev, "enetsw"); in bcm_enetsw_probe()
2768 if (IS_ERR(priv->mac_clk)) { in bcm_enetsw_probe()
2769 ret = PTR_ERR(priv->mac_clk); in bcm_enetsw_probe()
2772 clk_enable(priv->mac_clk); in bcm_enetsw_probe()
2774 priv->rx_chan = 0; in bcm_enetsw_probe()
2775 priv->tx_chan = 1; in bcm_enetsw_probe()
2776 spin_lock_init(&priv->rx_lock); in bcm_enetsw_probe()
2779 init_timer(&priv->rx_timeout); in bcm_enetsw_probe()
2780 priv->rx_timeout.function = bcm_enet_refill_rx_timer; in bcm_enetsw_probe()
2781 priv->rx_timeout.data = (unsigned long)dev; in bcm_enetsw_probe()
2785 netif_napi_add(dev, &priv->napi, bcm_enet_poll, 16); in bcm_enetsw_probe()
2789 spin_lock_init(&priv->enetsw_mdio_lock); in bcm_enetsw_probe()
2797 priv->pdev = pdev; in bcm_enetsw_probe()
2798 priv->net_dev = dev; in bcm_enetsw_probe()
2803 clk_put(priv->mac_clk); in bcm_enetsw_probe()
2806 iounmap(priv->base); in bcm_enetsw_probe()
2819 struct bcm_enet_priv *priv; in bcm_enetsw_remove() local
2825 priv = netdev_priv(dev); in bcm_enetsw_remove()
2829 iounmap(priv->base); in bcm_enetsw_remove()