Lines Matching refs:bgmac

49 static void bgmac_dma_tx_reset(struct bgmac *bgmac, struct bgmac_dma_ring *ring)  in bgmac_dma_tx_reset()  argument
61 bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_CTL, in bgmac_dma_tx_reset()
64 val = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_TX_STATUS); in bgmac_dma_tx_reset()
75 bgmac_err(bgmac, "Timeout suspending DMA TX ring 0x%X (BGMAC_DMA_TX_STAT: 0x%08X)\n", in bgmac_dma_tx_reset()
79 bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_CTL, 0); in bgmac_dma_tx_reset()
80 if (!bgmac_wait_value(bgmac->core, in bgmac_dma_tx_reset()
84 bgmac_warn(bgmac, "DMA TX ring 0x%X wasn't disabled on time, waiting additional 300us\n", in bgmac_dma_tx_reset()
87 val = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_TX_STATUS); in bgmac_dma_tx_reset()
89 bgmac_err(bgmac, "Reset of DMA TX ring 0x%X failed\n", in bgmac_dma_tx_reset()
94 static void bgmac_dma_tx_enable(struct bgmac *bgmac, in bgmac_dma_tx_enable() argument
99 ctl = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_TX_CTL); in bgmac_dma_tx_enable()
100 if (bgmac->core->id.rev >= 4) { in bgmac_dma_tx_enable()
115 bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_CTL, ctl); in bgmac_dma_tx_enable()
119 bgmac_dma_tx_add_buf(struct bgmac *bgmac, struct bgmac_dma_ring *ring, in bgmac_dma_tx_add_buf() argument
139 static netdev_tx_t bgmac_dma_tx_add(struct bgmac *bgmac, in bgmac_dma_tx_add() argument
143 struct device *dma_dev = bgmac->core->dma_dev; in bgmac_dma_tx_add()
144 struct net_device *net_dev = bgmac->net_dev; in bgmac_dma_tx_add()
152 bgmac_err(bgmac, "Too long skb (%d)\n", skb->len); in bgmac_dma_tx_add()
165 bgmac_err(bgmac, "TX ring is full, queue should be stopped!\n"); in bgmac_dma_tx_add()
179 bgmac_dma_tx_add_buf(bgmac, ring, index, skb_headlen(skb), flags); in bgmac_dma_tx_add()
196 bgmac_dma_tx_add_buf(bgmac, ring, index, len, flags); in bgmac_dma_tx_add()
208 bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_INDEX, in bgmac_dma_tx_add()
232 bgmac_err(bgmac, "Mapping error of skb on ring 0x%X\n", in bgmac_dma_tx_add()
241 static void bgmac_dma_tx_free(struct bgmac *bgmac, struct bgmac_dma_ring *ring) in bgmac_dma_tx_free() argument
243 struct device *dma_dev = bgmac->core->dma_dev; in bgmac_dma_tx_free()
249 empty_slot = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_TX_STATUS); in bgmac_dma_tx_free()
291 netdev_completed_queue(bgmac->net_dev, pkts_compl, bytes_compl); in bgmac_dma_tx_free()
293 if (netif_queue_stopped(bgmac->net_dev)) in bgmac_dma_tx_free()
294 netif_wake_queue(bgmac->net_dev); in bgmac_dma_tx_free()
297 static void bgmac_dma_rx_reset(struct bgmac *bgmac, struct bgmac_dma_ring *ring) in bgmac_dma_rx_reset() argument
302 bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_CTL, 0); in bgmac_dma_rx_reset()
303 if (!bgmac_wait_value(bgmac->core, in bgmac_dma_rx_reset()
307 bgmac_err(bgmac, "Reset of ring 0x%X RX failed\n", in bgmac_dma_rx_reset()
311 static void bgmac_dma_rx_enable(struct bgmac *bgmac, in bgmac_dma_rx_enable() argument
316 ctl = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_RX_CTL); in bgmac_dma_rx_enable()
317 if (bgmac->core->id.rev >= 4) { in bgmac_dma_rx_enable()
332 bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_CTL, ctl); in bgmac_dma_rx_enable()
335 static int bgmac_dma_rx_skb_for_slot(struct bgmac *bgmac, in bgmac_dma_rx_skb_for_slot() argument
338 struct device *dma_dev = bgmac->core->dma_dev; in bgmac_dma_rx_skb_for_slot()
357 bgmac_err(bgmac, "DMA mapping error\n"); in bgmac_dma_rx_skb_for_slot()
369 static void bgmac_dma_rx_update_index(struct bgmac *bgmac, in bgmac_dma_rx_update_index() argument
374 bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_INDEX, in bgmac_dma_rx_update_index()
379 static void bgmac_dma_rx_setup_desc(struct bgmac *bgmac, in bgmac_dma_rx_setup_desc() argument
414 static int bgmac_dma_rx_read(struct bgmac *bgmac, struct bgmac_dma_ring *ring, in bgmac_dma_rx_read() argument
420 end_slot = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_RX_STATUS); in bgmac_dma_rx_read()
427 struct device *dma_dev = bgmac->core->dma_dev; in bgmac_dma_rx_read()
437 if (bgmac_dma_rx_skb_for_slot(bgmac, slot)) { in bgmac_dma_rx_read()
452 bgmac_err(bgmac, "Found poisoned packet at slot %d, DMA issue!\n", in bgmac_dma_rx_read()
459 bgmac_err(bgmac, "Found oversized packet at slot %d, DMA issue!\n", in bgmac_dma_rx_read()
475 skb->protocol = eth_type_trans(skb, bgmac->net_dev); in bgmac_dma_rx_read()
476 napi_gro_receive(&bgmac->napi, skb); in bgmac_dma_rx_read()
480 bgmac_dma_rx_setup_desc(bgmac, ring, ring->start); in bgmac_dma_rx_read()
489 bgmac_dma_rx_update_index(bgmac, ring); in bgmac_dma_rx_read()
495 static bool bgmac_dma_unaligned(struct bgmac *bgmac, in bgmac_dma_unaligned() argument
501 bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_RINGLO, in bgmac_dma_unaligned()
503 if (bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_TX_RINGLO)) in bgmac_dma_unaligned()
507 bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_RINGLO, in bgmac_dma_unaligned()
509 if (bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_RX_RINGLO)) in bgmac_dma_unaligned()
516 static void bgmac_dma_tx_ring_free(struct bgmac *bgmac, in bgmac_dma_tx_ring_free() argument
519 struct device *dma_dev = bgmac->core->dma_dev; in bgmac_dma_tx_ring_free()
542 static void bgmac_dma_rx_ring_free(struct bgmac *bgmac, in bgmac_dma_rx_ring_free() argument
545 struct device *dma_dev = bgmac->core->dma_dev; in bgmac_dma_rx_ring_free()
562 static void bgmac_dma_ring_desc_free(struct bgmac *bgmac, in bgmac_dma_ring_desc_free() argument
566 struct device *dma_dev = bgmac->core->dma_dev; in bgmac_dma_ring_desc_free()
578 static void bgmac_dma_cleanup(struct bgmac *bgmac) in bgmac_dma_cleanup() argument
583 bgmac_dma_tx_ring_free(bgmac, &bgmac->tx_ring[i]); in bgmac_dma_cleanup()
586 bgmac_dma_rx_ring_free(bgmac, &bgmac->rx_ring[i]); in bgmac_dma_cleanup()
589 static void bgmac_dma_free(struct bgmac *bgmac) in bgmac_dma_free() argument
594 bgmac_dma_ring_desc_free(bgmac, &bgmac->tx_ring[i], in bgmac_dma_free()
598 bgmac_dma_ring_desc_free(bgmac, &bgmac->rx_ring[i], in bgmac_dma_free()
602 static int bgmac_dma_alloc(struct bgmac *bgmac) in bgmac_dma_alloc() argument
604 struct device *dma_dev = bgmac->core->dma_dev; in bgmac_dma_alloc()
615 if (!(bcma_aread32(bgmac->core, BCMA_IOST) & BCMA_IOST_DMA64)) { in bgmac_dma_alloc()
616 bgmac_err(bgmac, "Core does not report 64-bit DMA\n"); in bgmac_dma_alloc()
621 ring = &bgmac->tx_ring[i]; in bgmac_dma_alloc()
630 bgmac_err(bgmac, "Allocation of TX ring 0x%X failed\n", in bgmac_dma_alloc()
635 ring->unaligned = bgmac_dma_unaligned(bgmac, ring, in bgmac_dma_alloc()
646 ring = &bgmac->rx_ring[i]; in bgmac_dma_alloc()
655 bgmac_err(bgmac, "Allocation of RX ring 0x%X failed\n", in bgmac_dma_alloc()
661 ring->unaligned = bgmac_dma_unaligned(bgmac, ring, in bgmac_dma_alloc()
672 bgmac_dma_free(bgmac); in bgmac_dma_alloc()
676 static int bgmac_dma_init(struct bgmac *bgmac) in bgmac_dma_init() argument
682 ring = &bgmac->tx_ring[i]; in bgmac_dma_init()
685 bgmac_dma_tx_enable(bgmac, ring); in bgmac_dma_init()
686 bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_RINGLO, in bgmac_dma_init()
688 bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_RINGHI, in bgmac_dma_init()
691 bgmac_dma_tx_enable(bgmac, ring); in bgmac_dma_init()
700 ring = &bgmac->rx_ring[i]; in bgmac_dma_init()
703 bgmac_dma_rx_enable(bgmac, ring); in bgmac_dma_init()
704 bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_RINGLO, in bgmac_dma_init()
706 bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_RINGHI, in bgmac_dma_init()
709 bgmac_dma_rx_enable(bgmac, ring); in bgmac_dma_init()
714 err = bgmac_dma_rx_skb_for_slot(bgmac, &ring->slots[j]); in bgmac_dma_init()
718 bgmac_dma_rx_setup_desc(bgmac, ring, j); in bgmac_dma_init()
721 bgmac_dma_rx_update_index(bgmac, ring); in bgmac_dma_init()
727 bgmac_dma_cleanup(bgmac); in bgmac_dma_init()
735 static u16 bgmac_phy_read(struct bgmac *bgmac, u8 phyaddr, u8 reg) in bgmac_phy_read() argument
754 if (bgmac->core->id.id == BCMA_CORE_4706_MAC_GBIT) { in bgmac_phy_read()
755 core = bgmac->core->bus->drv_gmac_cmn.core; in bgmac_phy_read()
759 core = bgmac->core; in bgmac_phy_read()
775 bgmac_err(bgmac, "Reading PHY %d register 0x%X failed\n", in bgmac_phy_read()
784 static int bgmac_phy_write(struct bgmac *bgmac, u8 phyaddr, u8 reg, u16 value) in bgmac_phy_write() argument
791 if (bgmac->core->id.id == BCMA_CORE_4706_MAC_GBIT) { in bgmac_phy_write()
792 core = bgmac->core->bus->drv_gmac_cmn.core; in bgmac_phy_write()
796 core = bgmac->core; in bgmac_phy_write()
806 bgmac_write(bgmac, BGMAC_INT_STATUS, BGMAC_IS_MDIO); in bgmac_phy_write()
807 if (bgmac_read(bgmac, BGMAC_INT_STATUS) & BGMAC_IS_MDIO) in bgmac_phy_write()
808 bgmac_warn(bgmac, "Error setting MDIO int\n"); in bgmac_phy_write()
818 bgmac_err(bgmac, "Writing to PHY %d register 0x%X failed\n", in bgmac_phy_write()
827 static void bgmac_phy_init(struct bgmac *bgmac) in bgmac_phy_init() argument
829 struct bcma_chipinfo *ci = &bgmac->core->bus->chipinfo; in bgmac_phy_init()
830 struct bcma_drv_cc *cc = &bgmac->core->bus->drv_cc; in bgmac_phy_init()
835 bgmac_phy_write(bgmac, i, 0x1f, 0x008b); in bgmac_phy_init()
836 bgmac_phy_write(bgmac, i, 0x15, 0x0100); in bgmac_phy_init()
837 bgmac_phy_write(bgmac, i, 0x1f, 0x000f); in bgmac_phy_init()
838 bgmac_phy_write(bgmac, i, 0x12, 0x2aaa); in bgmac_phy_init()
839 bgmac_phy_write(bgmac, i, 0x1f, 0x000b); in bgmac_phy_init()
848 bgmac_phy_write(bgmac, i, 0x1f, 0x000f); in bgmac_phy_init()
849 bgmac_phy_write(bgmac, i, 0x16, 0x5284); in bgmac_phy_init()
850 bgmac_phy_write(bgmac, i, 0x1f, 0x000b); in bgmac_phy_init()
851 bgmac_phy_write(bgmac, i, 0x17, 0x0010); in bgmac_phy_init()
852 bgmac_phy_write(bgmac, i, 0x1f, 0x000f); in bgmac_phy_init()
853 bgmac_phy_write(bgmac, i, 0x16, 0x5296); in bgmac_phy_init()
854 bgmac_phy_write(bgmac, i, 0x17, 0x1073); in bgmac_phy_init()
855 bgmac_phy_write(bgmac, i, 0x17, 0x9073); in bgmac_phy_init()
856 bgmac_phy_write(bgmac, i, 0x16, 0x52b6); in bgmac_phy_init()
857 bgmac_phy_write(bgmac, i, 0x17, 0x9273); in bgmac_phy_init()
858 bgmac_phy_write(bgmac, i, 0x1f, 0x000b); in bgmac_phy_init()
864 static void bgmac_phy_reset(struct bgmac *bgmac) in bgmac_phy_reset() argument
866 if (bgmac->phyaddr == BGMAC_PHY_NOREGS) in bgmac_phy_reset()
869 bgmac_phy_write(bgmac, bgmac->phyaddr, MII_BMCR, BMCR_RESET); in bgmac_phy_reset()
871 if (bgmac_phy_read(bgmac, bgmac->phyaddr, MII_BMCR) & BMCR_RESET) in bgmac_phy_reset()
872 bgmac_err(bgmac, "PHY reset failed\n"); in bgmac_phy_reset()
873 bgmac_phy_init(bgmac); in bgmac_phy_reset()
883 static void bgmac_cmdcfg_maskset(struct bgmac *bgmac, u32 mask, u32 set, in bgmac_cmdcfg_maskset() argument
886 u32 cmdcfg = bgmac_read(bgmac, BGMAC_CMDCFG); in bgmac_cmdcfg_maskset()
889 bgmac_set(bgmac, BGMAC_CMDCFG, BGMAC_CMDCFG_SR(bgmac->core->id.rev)); in bgmac_cmdcfg_maskset()
893 bgmac_write(bgmac, BGMAC_CMDCFG, new_val); in bgmac_cmdcfg_maskset()
895 bgmac_mask(bgmac, BGMAC_CMDCFG, ~BGMAC_CMDCFG_SR(bgmac->core->id.rev)); in bgmac_cmdcfg_maskset()
899 static void bgmac_write_mac_address(struct bgmac *bgmac, u8 *addr) in bgmac_write_mac_address() argument
904 bgmac_write(bgmac, BGMAC_MACADDR_HIGH, tmp); in bgmac_write_mac_address()
906 bgmac_write(bgmac, BGMAC_MACADDR_LOW, tmp); in bgmac_write_mac_address()
911 struct bgmac *bgmac = netdev_priv(net_dev); in bgmac_set_rx_mode() local
914 bgmac_cmdcfg_maskset(bgmac, ~0, BGMAC_CMDCFG_PROM, true); in bgmac_set_rx_mode()
916 bgmac_cmdcfg_maskset(bgmac, ~BGMAC_CMDCFG_PROM, 0, true); in bgmac_set_rx_mode()
920 static void bgmac_chip_stats_update(struct bgmac *bgmac)
924 if (bgmac->core->id.id != BCMA_CORE_4706_MAC_GBIT) {
926 bgmac->mib_tx_regs[i] =
927 bgmac_read(bgmac,
930 bgmac->mib_rx_regs[i] =
931 bgmac_read(bgmac,
939 static void bgmac_clear_mib(struct bgmac *bgmac) in bgmac_clear_mib() argument
943 if (bgmac->core->id.id == BCMA_CORE_4706_MAC_GBIT) in bgmac_clear_mib()
946 bgmac_set(bgmac, BGMAC_DEV_CTL, BGMAC_DC_MROR); in bgmac_clear_mib()
948 bgmac_read(bgmac, BGMAC_TX_GOOD_OCTETS + (i * 4)); in bgmac_clear_mib()
950 bgmac_read(bgmac, BGMAC_RX_GOOD_OCTETS + (i * 4)); in bgmac_clear_mib()
954 static void bgmac_mac_speed(struct bgmac *bgmac) in bgmac_mac_speed() argument
959 switch (bgmac->mac_speed) { in bgmac_mac_speed()
973 bgmac_err(bgmac, "Unsupported speed: %d\n", bgmac->mac_speed); in bgmac_mac_speed()
976 if (bgmac->mac_duplex == DUPLEX_HALF) in bgmac_mac_speed()
979 bgmac_cmdcfg_maskset(bgmac, mask, set, true); in bgmac_mac_speed()
982 static void bgmac_miiconfig(struct bgmac *bgmac) in bgmac_miiconfig() argument
984 struct bcma_device *core = bgmac->core; in bgmac_miiconfig()
993 bgmac->mac_speed = SPEED_2500; in bgmac_miiconfig()
994 bgmac->mac_duplex = DUPLEX_FULL; in bgmac_miiconfig()
995 bgmac_mac_speed(bgmac); in bgmac_miiconfig()
997 imode = (bgmac_read(bgmac, BGMAC_DEV_STATUS) & in bgmac_miiconfig()
1000 bgmac->mac_speed = SPEED_100; in bgmac_miiconfig()
1001 bgmac->mac_duplex = DUPLEX_FULL; in bgmac_miiconfig()
1002 bgmac_mac_speed(bgmac); in bgmac_miiconfig()
1008 static void bgmac_chip_reset(struct bgmac *bgmac) in bgmac_chip_reset() argument
1010 struct bcma_device *core = bgmac->core; in bgmac_chip_reset()
1018 if (!bgmac->stats_grabbed) { in bgmac_chip_reset()
1020 bgmac->stats_grabbed = true; in bgmac_chip_reset()
1024 bgmac_dma_tx_reset(bgmac, &bgmac->tx_ring[i]); in bgmac_chip_reset()
1026 bgmac_cmdcfg_maskset(bgmac, ~0, BGMAC_CMDCFG_ML, false); in bgmac_chip_reset()
1030 bgmac_dma_rx_reset(bgmac, &bgmac->rx_ring[i]); in bgmac_chip_reset()
1046 if (!bgmac->has_robosw) in bgmac_chip_reset()
1056 bgmac_set(bgmac, BCMA_CLKCTLST, in bgmac_chip_reset()
1058 bgmac_wait_value(bgmac->core, BCMA_CLKCTLST, in bgmac_chip_reset()
1067 struct bcma_drv_cc *cc = &bgmac->core->bus->drv_cc; in bgmac_chip_reset()
1075 bgmac_err(bgmac, "Failed to parse et_swtype (%s)\n", in bgmac_chip_reset()
1094 if (iost & BGMAC_BCMA_IOST_ATTACHED && !bgmac->has_robosw) in bgmac_chip_reset()
1104 bgmac_cmdcfg_maskset(bgmac, in bgmac_chip_reset()
1123 bgmac->mac_speed = SPEED_UNKNOWN; in bgmac_chip_reset()
1124 bgmac->mac_duplex = DUPLEX_UNKNOWN; in bgmac_chip_reset()
1126 bgmac_clear_mib(bgmac); in bgmac_chip_reset()
1128 bcma_maskset32(bgmac->cmn, BCMA_GMAC_CMN_PHY_CTL, ~0, in bgmac_chip_reset()
1131 bgmac_set(bgmac, BGMAC_PHY_CNTL, BGMAC_PC_MTE); in bgmac_chip_reset()
1132 bgmac_miiconfig(bgmac); in bgmac_chip_reset()
1133 bgmac_phy_init(bgmac); in bgmac_chip_reset()
1135 netdev_reset_queue(bgmac->net_dev); in bgmac_chip_reset()
1138 static void bgmac_chip_intrs_on(struct bgmac *bgmac) in bgmac_chip_intrs_on() argument
1140 bgmac_write(bgmac, BGMAC_INT_MASK, bgmac->int_mask); in bgmac_chip_intrs_on()
1143 static void bgmac_chip_intrs_off(struct bgmac *bgmac) in bgmac_chip_intrs_off() argument
1145 bgmac_write(bgmac, BGMAC_INT_MASK, 0); in bgmac_chip_intrs_off()
1146 bgmac_read(bgmac, BGMAC_INT_MASK); in bgmac_chip_intrs_off()
1150 static void bgmac_enable(struct bgmac *bgmac) in bgmac_enable() argument
1152 struct bcma_chipinfo *ci = &bgmac->core->bus->chipinfo; in bgmac_enable()
1160 cmdcfg = bgmac_read(bgmac, BGMAC_CMDCFG); in bgmac_enable()
1161 bgmac_cmdcfg_maskset(bgmac, ~(BGMAC_CMDCFG_TE | BGMAC_CMDCFG_RE), in bgmac_enable()
1162 BGMAC_CMDCFG_SR(bgmac->core->id.rev), true); in bgmac_enable()
1165 bgmac_write(bgmac, BGMAC_CMDCFG, cmdcfg); in bgmac_enable()
1167 mode = (bgmac_read(bgmac, BGMAC_DEV_STATUS) & BGMAC_DS_MM_MASK) >> in bgmac_enable()
1170 bgmac_set(bgmac, BCMA_CLKCTLST, BCMA_CLKCTLST_FORCEHT); in bgmac_enable()
1172 bcma_chipco_chipctl_maskset(&bgmac->core->bus->drv_cc, 1, ~0, in bgmac_enable()
1186 bgmac_write(bgmac, BGMAC_FLOW_CTL_THRESH, fl_ctl); in bgmac_enable()
1187 bgmac_write(bgmac, BGMAC_PAUSE_CTL, 0x27fff); in bgmac_enable()
1193 rxq_ctl = bgmac_read(bgmac, BGMAC_RXQ_CTL); in bgmac_enable()
1195 bp_clk = bcma_pmu_get_bus_clock(&bgmac->core->bus->drv_cc) / in bgmac_enable()
1199 bgmac_write(bgmac, BGMAC_RXQ_CTL, rxq_ctl); in bgmac_enable()
1204 static void bgmac_chip_init(struct bgmac *bgmac) in bgmac_chip_init() argument
1207 bgmac_write(bgmac, BGMAC_INT_RECV_LAZY, 1 << BGMAC_IRL_FC_SHIFT); in bgmac_chip_init()
1210 bgmac_cmdcfg_maskset(bgmac, ~BGMAC_CMDCFG_RPI, 0, true); in bgmac_chip_init()
1212 bgmac_set_rx_mode(bgmac->net_dev); in bgmac_chip_init()
1214 bgmac_write_mac_address(bgmac, bgmac->net_dev->dev_addr); in bgmac_chip_init()
1216 if (bgmac->loopback) in bgmac_chip_init()
1217 bgmac_cmdcfg_maskset(bgmac, ~0, BGMAC_CMDCFG_ML, false); in bgmac_chip_init()
1219 bgmac_cmdcfg_maskset(bgmac, ~BGMAC_CMDCFG_ML, 0, false); in bgmac_chip_init()
1221 bgmac_write(bgmac, BGMAC_RXMAX_LENGTH, 32 + ETHER_MAX_LEN); in bgmac_chip_init()
1223 bgmac_chip_intrs_on(bgmac); in bgmac_chip_init()
1225 bgmac_enable(bgmac); in bgmac_chip_init()
1230 struct bgmac *bgmac = netdev_priv(dev_id); in bgmac_interrupt() local
1232 u32 int_status = bgmac_read(bgmac, BGMAC_INT_STATUS); in bgmac_interrupt()
1233 int_status &= bgmac->int_mask; in bgmac_interrupt()
1240 bgmac_err(bgmac, "Unknown IRQs: 0x%08X\n", int_status); in bgmac_interrupt()
1243 bgmac_chip_intrs_off(bgmac); in bgmac_interrupt()
1245 napi_schedule(&bgmac->napi); in bgmac_interrupt()
1252 struct bgmac *bgmac = container_of(napi, struct bgmac, napi); in bgmac_poll() local
1256 bgmac_write(bgmac, BGMAC_INT_STATUS, ~0); in bgmac_poll()
1258 bgmac_dma_tx_free(bgmac, &bgmac->tx_ring[0]); in bgmac_poll()
1259 handled += bgmac_dma_rx_read(bgmac, &bgmac->rx_ring[0], weight); in bgmac_poll()
1262 if (bgmac_read(bgmac, BGMAC_INT_STATUS) & (BGMAC_IS_TX0 | BGMAC_IS_RX)) in bgmac_poll()
1267 bgmac_chip_intrs_on(bgmac); in bgmac_poll()
1279 struct bgmac *bgmac = netdev_priv(net_dev); in bgmac_open() local
1282 bgmac_chip_reset(bgmac); in bgmac_open()
1284 err = bgmac_dma_init(bgmac); in bgmac_open()
1289 bgmac_chip_init(bgmac); in bgmac_open()
1291 err = request_irq(bgmac->core->irq, bgmac_interrupt, IRQF_SHARED, in bgmac_open()
1294 bgmac_err(bgmac, "IRQ request error: %d!\n", err); in bgmac_open()
1295 bgmac_dma_cleanup(bgmac); in bgmac_open()
1298 napi_enable(&bgmac->napi); in bgmac_open()
1300 phy_start(bgmac->phy_dev); in bgmac_open()
1308 struct bgmac *bgmac = netdev_priv(net_dev); in bgmac_stop() local
1312 phy_stop(bgmac->phy_dev); in bgmac_stop()
1314 napi_disable(&bgmac->napi); in bgmac_stop()
1315 bgmac_chip_intrs_off(bgmac); in bgmac_stop()
1316 free_irq(bgmac->core->irq, net_dev); in bgmac_stop()
1318 bgmac_chip_reset(bgmac); in bgmac_stop()
1319 bgmac_dma_cleanup(bgmac); in bgmac_stop()
1327 struct bgmac *bgmac = netdev_priv(net_dev); in bgmac_start_xmit() local
1331 ring = &bgmac->tx_ring[0]; in bgmac_start_xmit()
1332 return bgmac_dma_tx_add(bgmac, ring, skb); in bgmac_start_xmit()
1337 struct bgmac *bgmac = netdev_priv(net_dev); in bgmac_set_mac_address() local
1343 bgmac_write_mac_address(bgmac, (u8 *)addr); in bgmac_set_mac_address()
1350 struct bgmac *bgmac = netdev_priv(net_dev); in bgmac_ioctl() local
1355 return phy_mii_ioctl(bgmac->phy_dev, ifr, cmd); in bgmac_ioctl()
1375 struct bgmac *bgmac = netdev_priv(net_dev); in bgmac_get_settings() local
1377 return phy_ethtool_gset(bgmac->phy_dev, cmd); in bgmac_get_settings()
1383 struct bgmac *bgmac = netdev_priv(net_dev); in bgmac_set_settings() local
1385 return phy_ethtool_sset(bgmac->phy_dev, cmd); in bgmac_set_settings()
1418 struct bgmac *bgmac = netdev_priv(net_dev); in bgmac_adjust_link() local
1419 struct phy_device *phy_dev = bgmac->phy_dev; in bgmac_adjust_link()
1423 if (phy_dev->speed != bgmac->mac_speed) { in bgmac_adjust_link()
1424 bgmac->mac_speed = phy_dev->speed; in bgmac_adjust_link()
1428 if (phy_dev->duplex != bgmac->mac_duplex) { in bgmac_adjust_link()
1429 bgmac->mac_duplex = phy_dev->duplex; in bgmac_adjust_link()
1435 bgmac_mac_speed(bgmac); in bgmac_adjust_link()
1440 static int bgmac_fixed_phy_register(struct bgmac *bgmac) in bgmac_fixed_phy_register() argument
1452 bgmac_err(bgmac, "Failed to register fixed PHY device\n"); in bgmac_fixed_phy_register()
1456 err = phy_connect_direct(bgmac->net_dev, phy_dev, bgmac_adjust_link, in bgmac_fixed_phy_register()
1459 bgmac_err(bgmac, "Connecting PHY failed\n"); in bgmac_fixed_phy_register()
1463 bgmac->phy_dev = phy_dev; in bgmac_fixed_phy_register()
1468 static int bgmac_mii_register(struct bgmac *bgmac) in bgmac_mii_register() argument
1470 struct bcma_chipinfo *ci = &bgmac->core->bus->chipinfo; in bgmac_mii_register()
1478 return bgmac_fixed_phy_register(bgmac); in bgmac_mii_register()
1485 sprintf(mii_bus->id, "%s-%d-%d", "bgmac", bgmac->core->bus->num, in bgmac_mii_register()
1486 bgmac->core->core_unit); in bgmac_mii_register()
1487 mii_bus->priv = bgmac; in bgmac_mii_register()
1490 mii_bus->parent = &bgmac->core->dev; in bgmac_mii_register()
1491 mii_bus->phy_mask = ~(1 << bgmac->phyaddr); in bgmac_mii_register()
1503 bgmac_err(bgmac, "Registration of mii bus failed\n"); in bgmac_mii_register()
1507 bgmac->mii_bus = mii_bus; in bgmac_mii_register()
1511 bgmac->phyaddr); in bgmac_mii_register()
1512 phy_dev = phy_connect(bgmac->net_dev, bus_id, &bgmac_adjust_link, in bgmac_mii_register()
1515 bgmac_err(bgmac, "PHY connecton failed\n"); in bgmac_mii_register()
1519 bgmac->phy_dev = phy_dev; in bgmac_mii_register()
1532 static void bgmac_mii_unregister(struct bgmac *bgmac) in bgmac_mii_unregister() argument
1534 struct mii_bus *mii_bus = bgmac->mii_bus; in bgmac_mii_unregister()
1550 struct bgmac *bgmac; in bgmac_probe() local
1568 net_dev = alloc_etherdev(sizeof(*bgmac)); in bgmac_probe()
1574 bgmac = netdev_priv(net_dev); in bgmac_probe()
1575 bgmac->net_dev = net_dev; in bgmac_probe()
1576 bgmac->core = core; in bgmac_probe()
1577 bcma_set_drvdata(core, bgmac); in bgmac_probe()
1580 memcpy(bgmac->net_dev->dev_addr, mac, ETH_ALEN); in bgmac_probe()
1585 bgmac_err(bgmac, "GMAC CMN core not found (required for BCM4706)\n"); in bgmac_probe()
1589 bgmac->cmn = core->bus->drv_gmac_cmn.core; in bgmac_probe()
1591 bgmac->phyaddr = core->core_unit ? sprom->et1phyaddr : in bgmac_probe()
1593 bgmac->phyaddr &= BGMAC_PHY_MASK; in bgmac_probe()
1594 if (bgmac->phyaddr == BGMAC_PHY_MASK) { in bgmac_probe()
1595 bgmac_err(bgmac, "No PHY found\n"); in bgmac_probe()
1599 bgmac_info(bgmac, "Found PHY addr: %d%s\n", bgmac->phyaddr, in bgmac_probe()
1600 bgmac->phyaddr == BGMAC_PHY_NOREGS ? " (NOREGS)" : ""); in bgmac_probe()
1603 bgmac_err(bgmac, "PCI setup not implemented\n"); in bgmac_probe()
1608 bgmac_chip_reset(bgmac); in bgmac_probe()
1631 err = bgmac_dma_alloc(bgmac); in bgmac_probe()
1633 bgmac_err(bgmac, "Unable to alloc memory for DMA\n"); in bgmac_probe()
1637 bgmac->int_mask = BGMAC_IS_ERRMASK | BGMAC_IS_RX | BGMAC_IS_TX_MASK; in bgmac_probe()
1639 bgmac->int_mask &= ~BGMAC_IS_TX_MASK; in bgmac_probe()
1642 bgmac_phy_reset(bgmac); in bgmac_probe()
1644 bgmac->has_robosw = !!(core->bus->sprom.boardflags_lo & in bgmac_probe()
1646 if (bgmac->has_robosw) in bgmac_probe()
1647 bgmac_warn(bgmac, "Support for Roboswitch not implemented\n"); in bgmac_probe()
1650 bgmac_warn(bgmac, "Support for ADMtek ethernet switch not implemented\n"); in bgmac_probe()
1652 netif_napi_add(net_dev, &bgmac->napi, bgmac_poll, BGMAC_WEIGHT); in bgmac_probe()
1654 err = bgmac_mii_register(bgmac); in bgmac_probe()
1656 bgmac_err(bgmac, "Cannot register MDIO\n"); in bgmac_probe()
1664 err = register_netdev(bgmac->net_dev); in bgmac_probe()
1666 bgmac_err(bgmac, "Cannot register net device\n"); in bgmac_probe()
1675 bgmac_mii_unregister(bgmac); in bgmac_probe()
1677 bgmac_dma_free(bgmac); in bgmac_probe()
1688 struct bgmac *bgmac = bcma_get_drvdata(core); in bgmac_remove() local
1690 unregister_netdev(bgmac->net_dev); in bgmac_remove()
1691 bgmac_mii_unregister(bgmac); in bgmac_remove()
1692 netif_napi_del(&bgmac->napi); in bgmac_remove()
1693 bgmac_dma_free(bgmac); in bgmac_remove()
1695 free_netdev(bgmac->net_dev); in bgmac_remove()