Lines Matching refs:bgmac
21 static bool bgmac_wait_value(struct bgmac *bgmac, u16 reg, u32 mask, in bgmac_wait_value() argument
28 val = bgmac_read(bgmac, reg); in bgmac_wait_value()
33 dev_err(bgmac->dev, "Timeout waiting for reg 0x%X\n", reg); in bgmac_wait_value()
41 static void bgmac_dma_tx_reset(struct bgmac *bgmac, struct bgmac_dma_ring *ring) in bgmac_dma_tx_reset() argument
53 bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_CTL, in bgmac_dma_tx_reset()
56 val = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_TX_STATUS); in bgmac_dma_tx_reset()
67 dev_err(bgmac->dev, "Timeout suspending DMA TX ring 0x%X (BGMAC_DMA_TX_STAT: 0x%08X)\n", in bgmac_dma_tx_reset()
71 bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_CTL, 0); in bgmac_dma_tx_reset()
72 if (!bgmac_wait_value(bgmac, in bgmac_dma_tx_reset()
76 dev_warn(bgmac->dev, "DMA TX ring 0x%X wasn't disabled on time, waiting additional 300us\n", in bgmac_dma_tx_reset()
79 val = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_TX_STATUS); in bgmac_dma_tx_reset()
81 dev_err(bgmac->dev, "Reset of DMA TX ring 0x%X failed\n", in bgmac_dma_tx_reset()
86 static void bgmac_dma_tx_enable(struct bgmac *bgmac, in bgmac_dma_tx_enable() argument
91 ctl = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_TX_CTL); in bgmac_dma_tx_enable()
92 if (bgmac->feature_flags & BGMAC_FEAT_TX_MASK_SETUP) { in bgmac_dma_tx_enable()
107 bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_CTL, ctl); in bgmac_dma_tx_enable()
111 bgmac_dma_tx_add_buf(struct bgmac *bgmac, struct bgmac_dma_ring *ring, in bgmac_dma_tx_add_buf() argument
131 static netdev_tx_t bgmac_dma_tx_add(struct bgmac *bgmac, in bgmac_dma_tx_add() argument
135 struct device *dma_dev = bgmac->dma_dev; in bgmac_dma_tx_add()
136 struct net_device *net_dev = bgmac->net_dev; in bgmac_dma_tx_add()
144 netdev_err(bgmac->net_dev, "Too long skb (%d)\n", skb->len); in bgmac_dma_tx_add()
157 netdev_err(bgmac->net_dev, "TX ring is full, queue should be stopped!\n"); in bgmac_dma_tx_add()
171 bgmac_dma_tx_add_buf(bgmac, ring, index, skb_headlen(skb), flags); in bgmac_dma_tx_add()
188 bgmac_dma_tx_add_buf(bgmac, ring, index, len, flags); in bgmac_dma_tx_add()
200 bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_INDEX, in bgmac_dma_tx_add()
224 netdev_err(bgmac->net_dev, "Mapping error of skb on ring 0x%X\n", in bgmac_dma_tx_add()
235 static void bgmac_dma_tx_free(struct bgmac *bgmac, struct bgmac_dma_ring *ring) in bgmac_dma_tx_free() argument
237 struct device *dma_dev = bgmac->dma_dev; in bgmac_dma_tx_free()
242 empty_slot = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_TX_STATUS); in bgmac_dma_tx_free()
269 bgmac->net_dev->stats.tx_bytes += slot->skb->len; in bgmac_dma_tx_free()
270 bgmac->net_dev->stats.tx_packets++; in bgmac_dma_tx_free()
286 netdev_completed_queue(bgmac->net_dev, pkts_compl, bytes_compl); in bgmac_dma_tx_free()
288 if (netif_queue_stopped(bgmac->net_dev)) in bgmac_dma_tx_free()
289 netif_wake_queue(bgmac->net_dev); in bgmac_dma_tx_free()
292 static void bgmac_dma_rx_reset(struct bgmac *bgmac, struct bgmac_dma_ring *ring) in bgmac_dma_rx_reset() argument
297 bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_CTL, 0); in bgmac_dma_rx_reset()
298 if (!bgmac_wait_value(bgmac, in bgmac_dma_rx_reset()
302 dev_err(bgmac->dev, "Reset of ring 0x%X RX failed\n", in bgmac_dma_rx_reset()
306 static void bgmac_dma_rx_enable(struct bgmac *bgmac, in bgmac_dma_rx_enable() argument
311 ctl = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_RX_CTL); in bgmac_dma_rx_enable()
316 if (bgmac->feature_flags & BGMAC_FEAT_RX_MASK_SETUP) { in bgmac_dma_rx_enable()
330 bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_CTL, ctl); in bgmac_dma_rx_enable()
333 static int bgmac_dma_rx_skb_for_slot(struct bgmac *bgmac, in bgmac_dma_rx_skb_for_slot() argument
336 struct device *dma_dev = bgmac->dma_dev; in bgmac_dma_rx_skb_for_slot()
355 netdev_err(bgmac->net_dev, "DMA mapping error\n"); in bgmac_dma_rx_skb_for_slot()
367 static void bgmac_dma_rx_update_index(struct bgmac *bgmac, in bgmac_dma_rx_update_index() argument
372 bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_INDEX, in bgmac_dma_rx_update_index()
377 static void bgmac_dma_rx_setup_desc(struct bgmac *bgmac, in bgmac_dma_rx_setup_desc() argument
412 static int bgmac_dma_rx_read(struct bgmac *bgmac, struct bgmac_dma_ring *ring, in bgmac_dma_rx_read() argument
418 end_slot = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_RX_STATUS); in bgmac_dma_rx_read()
425 struct device *dma_dev = bgmac->dma_dev; in bgmac_dma_rx_read()
435 if (bgmac_dma_rx_skb_for_slot(bgmac, slot)) { in bgmac_dma_rx_read()
450 netdev_err(bgmac->net_dev, "Found poisoned packet at slot %d, DMA issue!\n", in bgmac_dma_rx_read()
453 bgmac->net_dev->stats.rx_errors++; in bgmac_dma_rx_read()
458 netdev_err(bgmac->net_dev, "Found oversized packet at slot %d, DMA issue!\n", in bgmac_dma_rx_read()
461 bgmac->net_dev->stats.rx_length_errors++; in bgmac_dma_rx_read()
462 bgmac->net_dev->stats.rx_errors++; in bgmac_dma_rx_read()
471 netdev_err(bgmac->net_dev, "build_skb failed\n"); in bgmac_dma_rx_read()
473 bgmac->net_dev->stats.rx_errors++; in bgmac_dma_rx_read()
482 skb->protocol = eth_type_trans(skb, bgmac->net_dev); in bgmac_dma_rx_read()
483 bgmac->net_dev->stats.rx_bytes += len; in bgmac_dma_rx_read()
484 bgmac->net_dev->stats.rx_packets++; in bgmac_dma_rx_read()
485 napi_gro_receive(&bgmac->napi, skb); in bgmac_dma_rx_read()
489 bgmac_dma_rx_setup_desc(bgmac, ring, ring->start); in bgmac_dma_rx_read()
498 bgmac_dma_rx_update_index(bgmac, ring); in bgmac_dma_rx_read()
504 static bool bgmac_dma_unaligned(struct bgmac *bgmac, in bgmac_dma_unaligned() argument
510 bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_RINGLO, in bgmac_dma_unaligned()
512 if (bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_TX_RINGLO)) in bgmac_dma_unaligned()
516 bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_RINGLO, in bgmac_dma_unaligned()
518 if (bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_RX_RINGLO)) in bgmac_dma_unaligned()
525 static void bgmac_dma_tx_ring_free(struct bgmac *bgmac, in bgmac_dma_tx_ring_free() argument
528 struct device *dma_dev = bgmac->dma_dev; in bgmac_dma_tx_ring_free()
552 static void bgmac_dma_rx_ring_free(struct bgmac *bgmac, in bgmac_dma_rx_ring_free() argument
555 struct device *dma_dev = bgmac->dma_dev; in bgmac_dma_rx_ring_free()
572 static void bgmac_dma_ring_desc_free(struct bgmac *bgmac, in bgmac_dma_ring_desc_free() argument
576 struct device *dma_dev = bgmac->dma_dev; in bgmac_dma_ring_desc_free()
588 static void bgmac_dma_cleanup(struct bgmac *bgmac) in bgmac_dma_cleanup() argument
593 bgmac_dma_tx_ring_free(bgmac, &bgmac->tx_ring[i]); in bgmac_dma_cleanup()
596 bgmac_dma_rx_ring_free(bgmac, &bgmac->rx_ring[i]); in bgmac_dma_cleanup()
599 static void bgmac_dma_free(struct bgmac *bgmac) in bgmac_dma_free() argument
604 bgmac_dma_ring_desc_free(bgmac, &bgmac->tx_ring[i], in bgmac_dma_free()
608 bgmac_dma_ring_desc_free(bgmac, &bgmac->rx_ring[i], in bgmac_dma_free()
612 static int bgmac_dma_alloc(struct bgmac *bgmac) in bgmac_dma_alloc() argument
614 struct device *dma_dev = bgmac->dma_dev; in bgmac_dma_alloc()
624 if (!(bgmac->feature_flags & BGMAC_FEAT_IDM_MASK)) { in bgmac_dma_alloc()
625 if (!(bgmac_idm_read(bgmac, BCMA_IOST) & BCMA_IOST_DMA64)) { in bgmac_dma_alloc()
626 dev_err(bgmac->dev, "Core does not report 64-bit DMA\n"); in bgmac_dma_alloc()
632 ring = &bgmac->tx_ring[i]; in bgmac_dma_alloc()
641 dev_err(bgmac->dev, "Allocation of TX ring 0x%X failed\n", in bgmac_dma_alloc()
646 ring->unaligned = bgmac_dma_unaligned(bgmac, ring, in bgmac_dma_alloc()
657 ring = &bgmac->rx_ring[i]; in bgmac_dma_alloc()
666 dev_err(bgmac->dev, "Allocation of RX ring 0x%X failed\n", in bgmac_dma_alloc()
671 ring->unaligned = bgmac_dma_unaligned(bgmac, ring, in bgmac_dma_alloc()
682 bgmac_dma_free(bgmac); in bgmac_dma_alloc()
686 static int bgmac_dma_init(struct bgmac *bgmac) in bgmac_dma_init() argument
692 ring = &bgmac->tx_ring[i]; in bgmac_dma_init()
695 bgmac_dma_tx_enable(bgmac, ring); in bgmac_dma_init()
696 bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_RINGLO, in bgmac_dma_init()
698 bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_RINGHI, in bgmac_dma_init()
701 bgmac_dma_tx_enable(bgmac, ring); in bgmac_dma_init()
710 ring = &bgmac->rx_ring[i]; in bgmac_dma_init()
713 bgmac_dma_rx_enable(bgmac, ring); in bgmac_dma_init()
714 bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_RINGLO, in bgmac_dma_init()
716 bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_RINGHI, in bgmac_dma_init()
719 bgmac_dma_rx_enable(bgmac, ring); in bgmac_dma_init()
724 err = bgmac_dma_rx_skb_for_slot(bgmac, &ring->slots[j]); in bgmac_dma_init()
728 bgmac_dma_rx_setup_desc(bgmac, ring, j); in bgmac_dma_init()
731 bgmac_dma_rx_update_index(bgmac, ring); in bgmac_dma_init()
737 bgmac_dma_cleanup(bgmac); in bgmac_dma_init()
749 static void bgmac_cmdcfg_maskset(struct bgmac *bgmac, u32 mask, u32 set, in bgmac_cmdcfg_maskset() argument
752 u32 cmdcfg = bgmac_read(bgmac, BGMAC_CMDCFG); in bgmac_cmdcfg_maskset()
756 if (bgmac->feature_flags & BGMAC_FEAT_CMDCFG_SR_REV4) in bgmac_cmdcfg_maskset()
761 bgmac_set(bgmac, BGMAC_CMDCFG, cmdcfg_sr); in bgmac_cmdcfg_maskset()
765 bgmac_write(bgmac, BGMAC_CMDCFG, new_val); in bgmac_cmdcfg_maskset()
767 bgmac_mask(bgmac, BGMAC_CMDCFG, ~cmdcfg_sr); in bgmac_cmdcfg_maskset()
771 static void bgmac_write_mac_address(struct bgmac *bgmac, u8 *addr) in bgmac_write_mac_address() argument
776 bgmac_write(bgmac, BGMAC_MACADDR_HIGH, tmp); in bgmac_write_mac_address()
778 bgmac_write(bgmac, BGMAC_MACADDR_LOW, tmp); in bgmac_write_mac_address()
783 struct bgmac *bgmac = netdev_priv(net_dev); in bgmac_set_rx_mode() local
786 bgmac_cmdcfg_maskset(bgmac, ~0, BGMAC_CMDCFG_PROM, true); in bgmac_set_rx_mode()
788 bgmac_cmdcfg_maskset(bgmac, ~BGMAC_CMDCFG_PROM, 0, true); in bgmac_set_rx_mode()
792 static void bgmac_chip_stats_update(struct bgmac *bgmac)
796 if (!(bgmac->feature_flags & BGMAC_FEAT_NO_CLR_MIB)) {
798 bgmac->mib_tx_regs[i] =
799 bgmac_read(bgmac,
802 bgmac->mib_rx_regs[i] =
803 bgmac_read(bgmac,
811 static void bgmac_clear_mib(struct bgmac *bgmac) in bgmac_clear_mib() argument
815 if (bgmac->feature_flags & BGMAC_FEAT_NO_CLR_MIB) in bgmac_clear_mib()
818 bgmac_set(bgmac, BGMAC_DEV_CTL, BGMAC_DC_MROR); in bgmac_clear_mib()
820 bgmac_read(bgmac, BGMAC_TX_GOOD_OCTETS + (i * 4)); in bgmac_clear_mib()
822 bgmac_read(bgmac, BGMAC_RX_GOOD_OCTETS + (i * 4)); in bgmac_clear_mib()
826 static void bgmac_mac_speed(struct bgmac *bgmac) in bgmac_mac_speed() argument
831 switch (bgmac->mac_speed) { in bgmac_mac_speed()
845 dev_err(bgmac->dev, "Unsupported speed: %d\n", in bgmac_mac_speed()
846 bgmac->mac_speed); in bgmac_mac_speed()
849 if (bgmac->mac_duplex == DUPLEX_HALF) in bgmac_mac_speed()
852 bgmac_cmdcfg_maskset(bgmac, mask, set, true); in bgmac_mac_speed()
855 static void bgmac_miiconfig(struct bgmac *bgmac) in bgmac_miiconfig() argument
857 if (bgmac->feature_flags & BGMAC_FEAT_FORCE_SPEED_2500) { in bgmac_miiconfig()
858 if (!(bgmac->feature_flags & BGMAC_FEAT_IDM_MASK)) { in bgmac_miiconfig()
859 bgmac_idm_write(bgmac, BCMA_IOCTL, in bgmac_miiconfig()
860 bgmac_idm_read(bgmac, BCMA_IOCTL) | in bgmac_miiconfig()
863 bgmac->mac_speed = SPEED_2500; in bgmac_miiconfig()
864 bgmac->mac_duplex = DUPLEX_FULL; in bgmac_miiconfig()
865 bgmac_mac_speed(bgmac); in bgmac_miiconfig()
869 imode = (bgmac_read(bgmac, BGMAC_DEV_STATUS) & in bgmac_miiconfig()
872 bgmac->mac_speed = SPEED_100; in bgmac_miiconfig()
873 bgmac->mac_duplex = DUPLEX_FULL; in bgmac_miiconfig()
874 bgmac_mac_speed(bgmac); in bgmac_miiconfig()
879 static void bgmac_chip_reset_idm_config(struct bgmac *bgmac) in bgmac_chip_reset_idm_config() argument
883 iost = bgmac_idm_read(bgmac, BCMA_IOST); in bgmac_chip_reset_idm_config()
884 if (bgmac->feature_flags & BGMAC_FEAT_IOST_ATTACHED) in bgmac_chip_reset_idm_config()
888 if (!(bgmac->feature_flags & BGMAC_FEAT_NO_RESET)) { in bgmac_chip_reset_idm_config()
893 if (!bgmac->has_robosw) in bgmac_chip_reset_idm_config()
896 bgmac_clk_enable(bgmac, flags); in bgmac_chip_reset_idm_config()
899 if (iost & BGMAC_BCMA_IOST_ATTACHED && !bgmac->has_robosw) in bgmac_chip_reset_idm_config()
900 bgmac_idm_write(bgmac, BCMA_IOCTL, in bgmac_chip_reset_idm_config()
901 bgmac_idm_read(bgmac, BCMA_IOCTL) & in bgmac_chip_reset_idm_config()
906 static void bgmac_chip_reset(struct bgmac *bgmac) in bgmac_chip_reset() argument
911 if (bgmac_clk_enabled(bgmac)) { in bgmac_chip_reset()
912 if (!bgmac->stats_grabbed) { in bgmac_chip_reset()
914 bgmac->stats_grabbed = true; in bgmac_chip_reset()
918 bgmac_dma_tx_reset(bgmac, &bgmac->tx_ring[i]); in bgmac_chip_reset()
920 bgmac_cmdcfg_maskset(bgmac, ~0, BGMAC_CMDCFG_ML, false); in bgmac_chip_reset()
924 bgmac_dma_rx_reset(bgmac, &bgmac->rx_ring[i]); in bgmac_chip_reset()
929 if (!(bgmac->feature_flags & BGMAC_FEAT_IDM_MASK)) in bgmac_chip_reset()
930 bgmac_chip_reset_idm_config(bgmac); in bgmac_chip_reset()
933 if (bgmac->feature_flags & BGMAC_FEAT_MISC_PLL_REQ) { in bgmac_chip_reset()
934 bgmac_set(bgmac, BCMA_CLKCTLST, in bgmac_chip_reset()
936 bgmac_wait_value(bgmac, BCMA_CLKCTLST, in bgmac_chip_reset()
942 if (bgmac->feature_flags & BGMAC_FEAT_SW_TYPE_PHY) { in bgmac_chip_reset()
950 dev_err(bgmac->dev, "Failed to parse et_swtype (%s)\n", in bgmac_chip_reset()
955 } else if (bgmac->feature_flags & BGMAC_FEAT_SW_TYPE_EPHYRMII) { in bgmac_chip_reset()
958 } else if (bgmac->feature_flags & BGMAC_FEAT_SW_TYPE_RGMII) { in bgmac_chip_reset()
962 bgmac_cco_ctl_maskset(bgmac, 1, ~(BGMAC_CHIPCTL_1_IF_TYPE_MASK | in bgmac_chip_reset()
965 } else if (bgmac->feature_flags & BGMAC_FEAT_CC4_IF_SW_TYPE) { in bgmac_chip_reset()
973 dev_err(bgmac->dev, "Failed to parse et_swtype (%s)\n", in bgmac_chip_reset()
976 } else if (bgmac->feature_flags & BGMAC_FEAT_CC4_IF_SW_TYPE_RGMII) { in bgmac_chip_reset()
980 bgmac_cco_ctl_maskset(bgmac, 4, ~(BGMAC_CHIPCTL_4_IF_TYPE_MASK | in bgmac_chip_reset()
983 } else if (bgmac->feature_flags & BGMAC_FEAT_CC7_IF_TYPE_RGMII) { in bgmac_chip_reset()
984 bgmac_cco_ctl_maskset(bgmac, 7, ~BGMAC_CHIPCTL_7_IF_TYPE_MASK, in bgmac_chip_reset()
993 if (bgmac->feature_flags & BGMAC_FEAT_CMDCFG_SR_REV4) in bgmac_chip_reset()
998 bgmac_cmdcfg_maskset(bgmac, in bgmac_chip_reset()
1017 bgmac->mac_speed = SPEED_UNKNOWN; in bgmac_chip_reset()
1018 bgmac->mac_duplex = DUPLEX_UNKNOWN; in bgmac_chip_reset()
1020 bgmac_clear_mib(bgmac); in bgmac_chip_reset()
1021 if (bgmac->feature_flags & BGMAC_FEAT_CMN_PHY_CTL) in bgmac_chip_reset()
1022 bgmac_cmn_maskset32(bgmac, BCMA_GMAC_CMN_PHY_CTL, ~0, in bgmac_chip_reset()
1025 bgmac_set(bgmac, BGMAC_PHY_CNTL, BGMAC_PC_MTE); in bgmac_chip_reset()
1026 bgmac_miiconfig(bgmac); in bgmac_chip_reset()
1027 if (bgmac->mii_bus) in bgmac_chip_reset()
1028 bgmac->mii_bus->reset(bgmac->mii_bus); in bgmac_chip_reset()
1030 netdev_reset_queue(bgmac->net_dev); in bgmac_chip_reset()
1033 static void bgmac_chip_intrs_on(struct bgmac *bgmac) in bgmac_chip_intrs_on() argument
1035 bgmac_write(bgmac, BGMAC_INT_MASK, bgmac->int_mask); in bgmac_chip_intrs_on()
1038 static void bgmac_chip_intrs_off(struct bgmac *bgmac) in bgmac_chip_intrs_off() argument
1040 bgmac_write(bgmac, BGMAC_INT_MASK, 0); in bgmac_chip_intrs_off()
1041 bgmac_read(bgmac, BGMAC_INT_MASK); in bgmac_chip_intrs_off()
1045 static void bgmac_enable(struct bgmac *bgmac) in bgmac_enable() argument
1051 if (bgmac->feature_flags & BGMAC_FEAT_CMDCFG_SR_REV4) in bgmac_enable()
1056 cmdcfg = bgmac_read(bgmac, BGMAC_CMDCFG); in bgmac_enable()
1057 bgmac_cmdcfg_maskset(bgmac, ~(BGMAC_CMDCFG_TE | BGMAC_CMDCFG_RE), in bgmac_enable()
1061 bgmac_write(bgmac, BGMAC_CMDCFG, cmdcfg); in bgmac_enable()
1063 mode = (bgmac_read(bgmac, BGMAC_DEV_STATUS) & BGMAC_DS_MM_MASK) >> in bgmac_enable()
1065 if (bgmac->feature_flags & BGMAC_FEAT_CLKCTLST || mode != 0) in bgmac_enable()
1066 bgmac_set(bgmac, BCMA_CLKCTLST, BCMA_CLKCTLST_FORCEHT); in bgmac_enable()
1067 if (!(bgmac->feature_flags & BGMAC_FEAT_CLKCTLST) && mode == 2) in bgmac_enable()
1068 bgmac_cco_ctl_maskset(bgmac, 1, ~0, in bgmac_enable()
1071 if (bgmac->feature_flags & (BGMAC_FEAT_FLW_CTRL1 | in bgmac_enable()
1075 if (bgmac->feature_flags & BGMAC_FEAT_FLW_CTRL1) in bgmac_enable()
1080 bgmac_write(bgmac, BGMAC_FLOW_CTL_THRESH, fl_ctl); in bgmac_enable()
1081 bgmac_write(bgmac, BGMAC_PAUSE_CTL, 0x27fff); in bgmac_enable()
1084 if (bgmac->feature_flags & BGMAC_FEAT_SET_RXQ_CLK) { in bgmac_enable()
1089 rxq_ctl = bgmac_read(bgmac, BGMAC_RXQ_CTL); in bgmac_enable()
1091 bp_clk = bgmac_get_bus_clock(bgmac) / 1000000; in bgmac_enable()
1094 bgmac_write(bgmac, BGMAC_RXQ_CTL, rxq_ctl); in bgmac_enable()
1099 static void bgmac_chip_init(struct bgmac *bgmac) in bgmac_chip_init() argument
1102 bgmac_write(bgmac, BGMAC_INT_STATUS, ~0); in bgmac_chip_init()
1105 bgmac_write(bgmac, BGMAC_INT_RECV_LAZY, 1 << BGMAC_IRL_FC_SHIFT); in bgmac_chip_init()
1108 bgmac_cmdcfg_maskset(bgmac, ~BGMAC_CMDCFG_RPI, 0, true); in bgmac_chip_init()
1110 bgmac_set_rx_mode(bgmac->net_dev); in bgmac_chip_init()
1112 bgmac_write_mac_address(bgmac, bgmac->net_dev->dev_addr); in bgmac_chip_init()
1114 if (bgmac->loopback) in bgmac_chip_init()
1115 bgmac_cmdcfg_maskset(bgmac, ~0, BGMAC_CMDCFG_ML, false); in bgmac_chip_init()
1117 bgmac_cmdcfg_maskset(bgmac, ~BGMAC_CMDCFG_ML, 0, false); in bgmac_chip_init()
1119 bgmac_write(bgmac, BGMAC_RXMAX_LENGTH, 32 + ETHER_MAX_LEN); in bgmac_chip_init()
1121 bgmac_chip_intrs_on(bgmac); in bgmac_chip_init()
1123 bgmac_enable(bgmac); in bgmac_chip_init()
1128 struct bgmac *bgmac = netdev_priv(dev_id); in bgmac_interrupt() local
1130 u32 int_status = bgmac_read(bgmac, BGMAC_INT_STATUS); in bgmac_interrupt()
1131 int_status &= bgmac->int_mask; in bgmac_interrupt()
1138 dev_err(bgmac->dev, "Unknown IRQs: 0x%08X\n", int_status); in bgmac_interrupt()
1141 bgmac_chip_intrs_off(bgmac); in bgmac_interrupt()
1143 napi_schedule(&bgmac->napi); in bgmac_interrupt()
1150 struct bgmac *bgmac = container_of(napi, struct bgmac, napi); in bgmac_poll() local
1154 bgmac_write(bgmac, BGMAC_INT_STATUS, ~0); in bgmac_poll()
1156 bgmac_dma_tx_free(bgmac, &bgmac->tx_ring[0]); in bgmac_poll()
1157 handled += bgmac_dma_rx_read(bgmac, &bgmac->rx_ring[0], weight); in bgmac_poll()
1160 if (bgmac_read(bgmac, BGMAC_INT_STATUS) & (BGMAC_IS_TX0 | BGMAC_IS_RX)) in bgmac_poll()
1165 bgmac_chip_intrs_on(bgmac); in bgmac_poll()
1177 struct bgmac *bgmac = netdev_priv(net_dev); in bgmac_open() local
1180 bgmac_chip_reset(bgmac); in bgmac_open()
1182 err = bgmac_dma_init(bgmac); in bgmac_open()
1187 bgmac_chip_init(bgmac); in bgmac_open()
1189 err = request_irq(bgmac->irq, bgmac_interrupt, IRQF_SHARED, in bgmac_open()
1192 dev_err(bgmac->dev, "IRQ request error: %d!\n", err); in bgmac_open()
1193 bgmac_dma_cleanup(bgmac); in bgmac_open()
1196 napi_enable(&bgmac->napi); in bgmac_open()
1207 struct bgmac *bgmac = netdev_priv(net_dev); in bgmac_stop() local
1213 napi_disable(&bgmac->napi); in bgmac_stop()
1214 bgmac_chip_intrs_off(bgmac); in bgmac_stop()
1215 free_irq(bgmac->irq, net_dev); in bgmac_stop()
1217 bgmac_chip_reset(bgmac); in bgmac_stop()
1218 bgmac_dma_cleanup(bgmac); in bgmac_stop()
1226 struct bgmac *bgmac = netdev_priv(net_dev); in bgmac_start_xmit() local
1230 ring = &bgmac->tx_ring[0]; in bgmac_start_xmit()
1231 return bgmac_dma_tx_add(bgmac, ring, skb); in bgmac_start_xmit()
1236 struct bgmac *bgmac = netdev_priv(net_dev); in bgmac_set_mac_address() local
1245 bgmac_write_mac_address(bgmac, net_dev->dev_addr); in bgmac_set_mac_address()
1253 struct bgmac *bgmac = netdev_priv(net_dev); in bgmac_change_mtu() local
1255 bgmac_write(bgmac, BGMAC_RXMAX_LENGTH, 32 + mtu); in bgmac_change_mtu()
1377 struct bgmac *bgmac = netdev_priv(dev); in bgmac_get_ethtool_stats() local
1389 val = (u64)bgmac_read(bgmac, s->offset + 4) << 32; in bgmac_get_ethtool_stats()
1390 val |= bgmac_read(bgmac, s->offset); in bgmac_get_ethtool_stats()
1417 struct bgmac *bgmac = netdev_priv(net_dev); in bgmac_adjust_link() local
1422 if (phy_dev->speed != bgmac->mac_speed) { in bgmac_adjust_link()
1423 bgmac->mac_speed = phy_dev->speed; in bgmac_adjust_link()
1427 if (phy_dev->duplex != bgmac->mac_duplex) { in bgmac_adjust_link()
1428 bgmac->mac_duplex = phy_dev->duplex; in bgmac_adjust_link()
1434 bgmac_mac_speed(bgmac); in bgmac_adjust_link()
1440 int bgmac_phy_connect_direct(struct bgmac *bgmac) in bgmac_phy_connect_direct() argument
1452 dev_err(bgmac->dev, "Failed to register fixed PHY device\n"); in bgmac_phy_connect_direct()
1456 err = phy_connect_direct(bgmac->net_dev, phy_dev, bgmac_adjust_link, in bgmac_phy_connect_direct()
1459 dev_err(bgmac->dev, "Connecting PHY failed\n"); in bgmac_phy_connect_direct()
1467 struct bgmac *bgmac_alloc(struct device *dev) in bgmac_alloc()
1470 struct bgmac *bgmac; in bgmac_alloc() local
1473 net_dev = devm_alloc_etherdev(dev, sizeof(*bgmac)); in bgmac_alloc()
1480 bgmac = netdev_priv(net_dev); in bgmac_alloc()
1481 bgmac->dev = dev; in bgmac_alloc()
1482 bgmac->net_dev = net_dev; in bgmac_alloc()
1484 return bgmac; in bgmac_alloc()
1488 int bgmac_enet_probe(struct bgmac *bgmac) in bgmac_enet_probe() argument
1490 struct net_device *net_dev = bgmac->net_dev; in bgmac_enet_probe()
1493 bgmac_chip_intrs_off(bgmac); in bgmac_enet_probe()
1495 net_dev->irq = bgmac->irq; in bgmac_enet_probe()
1496 SET_NETDEV_DEV(net_dev, bgmac->dev); in bgmac_enet_probe()
1497 dev_set_drvdata(bgmac->dev, bgmac); in bgmac_enet_probe()
1500 dev_err(bgmac->dev, "Invalid MAC addr: %pM\n", in bgmac_enet_probe()
1503 dev_warn(bgmac->dev, "Using random MAC: %pM\n", in bgmac_enet_probe()
1510 bgmac_clk_enable(bgmac, 0); in bgmac_enet_probe()
1513 if (!(bgmac->feature_flags & BGMAC_FEAT_IDM_MASK)) { in bgmac_enet_probe()
1514 if (bgmac->feature_flags & BGMAC_FEAT_IRQ_ID_OOB_6) in bgmac_enet_probe()
1515 bgmac_idm_write(bgmac, BCMA_OOB_SEL_OUT_A30, 0x86); in bgmac_enet_probe()
1518 bgmac_chip_reset(bgmac); in bgmac_enet_probe()
1520 err = bgmac_dma_alloc(bgmac); in bgmac_enet_probe()
1522 dev_err(bgmac->dev, "Unable to alloc memory for DMA\n"); in bgmac_enet_probe()
1526 bgmac->int_mask = BGMAC_IS_ERRMASK | BGMAC_IS_RX | BGMAC_IS_TX_MASK; in bgmac_enet_probe()
1528 bgmac->int_mask &= ~BGMAC_IS_TX_MASK; in bgmac_enet_probe()
1530 netif_napi_add(net_dev, &bgmac->napi, bgmac_poll, BGMAC_WEIGHT); in bgmac_enet_probe()
1532 err = bgmac_phy_connect(bgmac); in bgmac_enet_probe()
1534 dev_err(bgmac->dev, "Cannot connect to phy\n"); in bgmac_enet_probe()
1545 err = register_netdev(bgmac->net_dev); in bgmac_enet_probe()
1547 dev_err(bgmac->dev, "Cannot register net device\n"); in bgmac_enet_probe()
1558 bgmac_dma_free(bgmac); in bgmac_enet_probe()
1565 void bgmac_enet_remove(struct bgmac *bgmac) in bgmac_enet_remove() argument
1567 unregister_netdev(bgmac->net_dev); in bgmac_enet_remove()
1568 phy_disconnect(bgmac->net_dev->phydev); in bgmac_enet_remove()
1569 netif_napi_del(&bgmac->napi); in bgmac_enet_remove()
1570 bgmac_dma_free(bgmac); in bgmac_enet_remove()
1574 int bgmac_enet_suspend(struct bgmac *bgmac) in bgmac_enet_suspend() argument
1576 if (!netif_running(bgmac->net_dev)) in bgmac_enet_suspend()
1579 phy_stop(bgmac->net_dev->phydev); in bgmac_enet_suspend()
1581 netif_stop_queue(bgmac->net_dev); in bgmac_enet_suspend()
1583 napi_disable(&bgmac->napi); in bgmac_enet_suspend()
1585 netif_tx_lock(bgmac->net_dev); in bgmac_enet_suspend()
1586 netif_device_detach(bgmac->net_dev); in bgmac_enet_suspend()
1587 netif_tx_unlock(bgmac->net_dev); in bgmac_enet_suspend()
1589 bgmac_chip_intrs_off(bgmac); in bgmac_enet_suspend()
1590 bgmac_chip_reset(bgmac); in bgmac_enet_suspend()
1591 bgmac_dma_cleanup(bgmac); in bgmac_enet_suspend()
1597 int bgmac_enet_resume(struct bgmac *bgmac) in bgmac_enet_resume() argument
1601 if (!netif_running(bgmac->net_dev)) in bgmac_enet_resume()
1604 rc = bgmac_dma_init(bgmac); in bgmac_enet_resume()
1608 bgmac_chip_init(bgmac); in bgmac_enet_resume()
1610 napi_enable(&bgmac->napi); in bgmac_enet_resume()
1612 netif_tx_lock(bgmac->net_dev); in bgmac_enet_resume()
1613 netif_device_attach(bgmac->net_dev); in bgmac_enet_resume()
1614 netif_tx_unlock(bgmac->net_dev); in bgmac_enet_resume()
1616 netif_start_queue(bgmac->net_dev); in bgmac_enet_resume()
1618 phy_start(bgmac->net_dev->phydev); in bgmac_enet_resume()