Lines Matching full:dev

123 static inline void emac_report_timeout_error(struct emac_instance *dev,  in emac_report_timeout_error()  argument
126 if (emac_has_feature(dev, EMAC_FTR_440GX_PHY_CLK_FIX | in emac_report_timeout_error()
129 DBG(dev, "%s" NL, error); in emac_report_timeout_error()
131 printk(KERN_ERR "%pOF: %s\n", dev->ofdev->dev.of_node, error); in emac_report_timeout_error()
138 static inline void emac_rx_clk_tx(struct emac_instance *dev) in emac_rx_clk_tx() argument
141 if (emac_has_feature(dev, EMAC_FTR_440EP_PHY_CLK_FIX)) in emac_rx_clk_tx()
143 0, SDR0_MFR_ECS >> dev->cell_index); in emac_rx_clk_tx()
147 static inline void emac_rx_clk_default(struct emac_instance *dev) in emac_rx_clk_default() argument
150 if (emac_has_feature(dev, EMAC_FTR_440EP_PHY_CLK_FIX)) in emac_rx_clk_default()
152 SDR0_MFR_ECS >> dev->cell_index, 0); in emac_rx_clk_default()
192 static void emac_clean_tx_ring(struct emac_instance *dev);
193 static void __emac_set_multicast_list(struct emac_instance *dev);
211 static inline void emac_tx_enable(struct emac_instance *dev) in emac_tx_enable() argument
213 struct emac_regs __iomem *p = dev->emacp; in emac_tx_enable()
216 DBG(dev, "tx_enable" NL); in emac_tx_enable()
223 static void emac_tx_disable(struct emac_instance *dev) in emac_tx_disable() argument
225 struct emac_regs __iomem *p = dev->emacp; in emac_tx_disable()
228 DBG(dev, "tx_disable" NL); in emac_tx_disable()
232 int n = dev->stop_timeout; in emac_tx_disable()
239 emac_report_timeout_error(dev, "TX disable timeout"); in emac_tx_disable()
243 static void emac_rx_enable(struct emac_instance *dev) in emac_rx_enable() argument
245 struct emac_regs __iomem *p = dev->emacp; in emac_rx_enable()
248 if (unlikely(test_bit(MAL_COMMAC_RX_STOPPED, &dev->commac.flags))) in emac_rx_enable()
251 DBG(dev, "rx_enable" NL); in emac_rx_enable()
257 int n = dev->stop_timeout; in emac_rx_enable()
263 emac_report_timeout_error(dev, in emac_rx_enable()
272 static void emac_rx_disable(struct emac_instance *dev) in emac_rx_disable() argument
274 struct emac_regs __iomem *p = dev->emacp; in emac_rx_disable()
277 DBG(dev, "rx_disable" NL); in emac_rx_disable()
281 int n = dev->stop_timeout; in emac_rx_disable()
288 emac_report_timeout_error(dev, "RX disable timeout"); in emac_rx_disable()
292 static inline void emac_netif_stop(struct emac_instance *dev) in emac_netif_stop() argument
294 netif_tx_lock_bh(dev->ndev); in emac_netif_stop()
295 netif_addr_lock(dev->ndev); in emac_netif_stop()
296 dev->no_mcast = 1; in emac_netif_stop()
297 netif_addr_unlock(dev->ndev); in emac_netif_stop()
298 netif_tx_unlock_bh(dev->ndev); in emac_netif_stop()
299 netif_trans_update(dev->ndev); /* prevent tx timeout */ in emac_netif_stop()
300 mal_poll_disable(dev->mal, &dev->commac); in emac_netif_stop()
301 netif_tx_disable(dev->ndev); in emac_netif_stop()
304 static inline void emac_netif_start(struct emac_instance *dev) in emac_netif_start() argument
306 netif_tx_lock_bh(dev->ndev); in emac_netif_start()
307 netif_addr_lock(dev->ndev); in emac_netif_start()
308 dev->no_mcast = 0; in emac_netif_start()
309 if (dev->mcast_pending && netif_running(dev->ndev)) in emac_netif_start()
310 __emac_set_multicast_list(dev); in emac_netif_start()
311 netif_addr_unlock(dev->ndev); in emac_netif_start()
312 netif_tx_unlock_bh(dev->ndev); in emac_netif_start()
314 netif_wake_queue(dev->ndev); in emac_netif_start()
321 mal_poll_enable(dev->mal, &dev->commac); in emac_netif_start()
324 static inline void emac_rx_disable_async(struct emac_instance *dev) in emac_rx_disable_async() argument
326 struct emac_regs __iomem *p = dev->emacp; in emac_rx_disable_async()
329 DBG(dev, "rx_disable_async" NL); in emac_rx_disable_async()
336 static int emac_reset(struct emac_instance *dev) in emac_reset() argument
338 struct emac_regs __iomem *p = dev->emacp; in emac_reset()
342 DBG(dev, "reset" NL); in emac_reset()
344 if (!dev->reset_failed) { in emac_reset()
348 emac_rx_disable(dev); in emac_reset()
349 emac_tx_disable(dev); in emac_reset()
371 if (emac_has_feature(dev, EMAC_FTR_460EX_PHY_CLK_FIX)) { in emac_reset()
372 if (try_internal_clock || (dev->phy_address == 0xffffffff && in emac_reset()
373 dev->phy_map == 0xffffffff)) { in emac_reset()
376 0, SDR0_ETH_CFG_ECS << dev->cell_index); in emac_reset()
380 SDR0_ETH_CFG_ECS << dev->cell_index, 0); in emac_reset()
390 if (emac_has_feature(dev, EMAC_FTR_460EX_PHY_CLK_FIX)) { in emac_reset()
398 if (try_internal_clock || (dev->phy_address == 0xffffffff && in emac_reset()
399 dev->phy_map == 0xffffffff)) { in emac_reset()
402 SDR0_ETH_CFG_ECS << dev->cell_index, 0); in emac_reset()
408 dev->reset_failed = 0; in emac_reset()
411 emac_report_timeout_error(dev, "reset timeout"); in emac_reset()
412 dev->reset_failed = 1; in emac_reset()
417 static void emac_hash_mc(struct emac_instance *dev) in emac_hash_mc() argument
419 const int regs = EMAC_XAHT_REGS(dev); in emac_hash_mc()
420 u32 *gaht_base = emac_gaht_base(dev); in emac_hash_mc()
425 DBG(dev, "hash_mc %d" NL, netdev_mc_count(dev->ndev)); in emac_hash_mc()
429 netdev_for_each_mc_addr(ha, dev->ndev) { in emac_hash_mc()
431 DBG2(dev, "mc %pM" NL, ha->addr); in emac_hash_mc()
433 slot = EMAC_XAHT_CRC_TO_SLOT(dev, in emac_hash_mc()
435 reg = EMAC_XAHT_SLOT_TO_REG(dev, slot); in emac_hash_mc()
436 mask = EMAC_XAHT_SLOT_TO_MASK(dev, slot); in emac_hash_mc()
447 struct emac_instance *dev = netdev_priv(ndev); in emac_iff2rmr() local
452 if (emac_has_feature(dev, EMAC_FTR_EMAC4)) in emac_iff2rmr()
460 (netdev_mc_count(ndev) > EMAC_XAHT_SLOTS(dev))) in emac_iff2rmr()
465 if (emac_has_feature(dev, EMAC_APM821XX_REQ_JUMBO_FRAME_SIZE)) { in emac_iff2rmr()
473 static u32 __emac_calc_base_mr1(struct emac_instance *dev, int tx_size, int rx_size) in __emac_calc_base_mr1() argument
477 DBG2(dev, "__emac_calc_base_mr1" NL); in __emac_calc_base_mr1()
485 dev->ndev->name, tx_size); in __emac_calc_base_mr1()
497 dev->ndev->name, rx_size); in __emac_calc_base_mr1()
503 static u32 __emac4_calc_base_mr1(struct emac_instance *dev, int tx_size, int rx_size) in __emac4_calc_base_mr1() argument
506 EMAC4_MR1_OBCI(dev->opb_bus_freq / 1000000); in __emac4_calc_base_mr1()
508 DBG2(dev, "__emac4_calc_base_mr1" NL); in __emac4_calc_base_mr1()
525 dev->ndev->name, tx_size); in __emac4_calc_base_mr1()
543 dev->ndev->name, rx_size); in __emac4_calc_base_mr1()
549 static u32 emac_calc_base_mr1(struct emac_instance *dev, int tx_size, int rx_size) in emac_calc_base_mr1() argument
551 return emac_has_feature(dev, EMAC_FTR_EMAC4) ? in emac_calc_base_mr1()
552 __emac4_calc_base_mr1(dev, tx_size, rx_size) : in emac_calc_base_mr1()
553 __emac_calc_base_mr1(dev, tx_size, rx_size); in emac_calc_base_mr1()
556 static inline u32 emac_calc_trtr(struct emac_instance *dev, unsigned int size) in emac_calc_trtr() argument
558 if (emac_has_feature(dev, EMAC_FTR_EMAC4)) in emac_calc_trtr()
564 static inline u32 emac_calc_rwmr(struct emac_instance *dev, in emac_calc_rwmr() argument
567 if (emac_has_feature(dev, EMAC_FTR_EMAC4)) in emac_calc_rwmr()
573 static int emac_configure(struct emac_instance *dev) in emac_configure() argument
575 struct emac_regs __iomem *p = dev->emacp; in emac_configure()
576 struct net_device *ndev = dev->ndev; in emac_configure()
577 int tx_size, rx_size, link = netif_carrier_ok(dev->ndev); in emac_configure()
580 DBG(dev, "configure" NL); in emac_configure()
586 } else if (emac_reset(dev) < 0) in emac_configure()
589 if (emac_has_feature(dev, EMAC_FTR_HAS_TAH)) in emac_configure()
590 tah_reset(dev->tah_dev); in emac_configure()
592 DBG(dev, " link = %d duplex = %d, pause = %d, asym_pause = %d\n", in emac_configure()
593 link, dev->phy.duplex, dev->phy.pause, dev->phy.asym_pause); in emac_configure()
596 tx_size = dev->tx_fifo_size; in emac_configure()
597 rx_size = dev->rx_fifo_size; in emac_configure()
604 else if (dev->phy.duplex == DUPLEX_FULL) in emac_configure()
608 dev->stop_timeout = STOP_TIMEOUT_10; in emac_configure()
609 switch (dev->phy.speed) { in emac_configure()
611 if (emac_phy_gpcs(dev->phy.mode)) { in emac_configure()
613 (dev->phy.gpcs_address != 0xffffffff) ? in emac_configure()
614 dev->phy.gpcs_address : dev->phy.address); in emac_configure()
624 tx_size = dev->tx_fifo_size_gige; in emac_configure()
625 rx_size = dev->rx_fifo_size_gige; in emac_configure()
627 if (dev->ndev->mtu > ETH_DATA_LEN) { in emac_configure()
628 if (emac_has_feature(dev, EMAC_FTR_EMAC4)) in emac_configure()
632 dev->stop_timeout = STOP_TIMEOUT_1000_JUMBO; in emac_configure()
634 dev->stop_timeout = STOP_TIMEOUT_1000; in emac_configure()
638 dev->stop_timeout = STOP_TIMEOUT_100; in emac_configure()
644 if (emac_has_feature(dev, EMAC_FTR_HAS_RGMII)) in emac_configure()
645 rgmii_set_speed(dev->rgmii_dev, dev->rgmii_port, in emac_configure()
646 dev->phy.speed); in emac_configure()
647 if (emac_has_feature(dev, EMAC_FTR_HAS_ZMII)) in emac_configure()
648 zmii_set_speed(dev->zmii_dev, dev->zmii_port, dev->phy.speed); in emac_configure()
653 if (!emac_has_feature(dev, EMAC_FTR_NO_FLOW_CONTROL_40x) && in emac_configure()
654 dev->phy.duplex == DUPLEX_FULL) { in emac_configure()
655 if (dev->phy.pause) in emac_configure()
657 else if (dev->phy.asym_pause) in emac_configure()
662 mr1 |= emac_calc_base_mr1(dev, tx_size, rx_size); in emac_configure()
677 emac_hash_mc(dev); in emac_configure()
681 if (emac_has_feature(dev, EMAC_FTR_EMAC4)) in emac_configure()
682 r = EMAC4_TMR1((dev->mal_burst_size / dev->fifo_entry_size) + 1, in emac_configure()
683 tx_size / 2 / dev->fifo_entry_size); in emac_configure()
685 r = EMAC_TMR1((dev->mal_burst_size / dev->fifo_entry_size) + 1, in emac_configure()
686 tx_size / 2 / dev->fifo_entry_size); in emac_configure()
688 out_be32(&p->trtr, emac_calc_trtr(dev, tx_size / 2)); in emac_configure()
709 r = emac_calc_rwmr(dev, rx_size / 8 / dev->fifo_entry_size, in emac_configure()
710 rx_size / 4 / dev->fifo_entry_size); in emac_configure()
720 if (emac_has_feature(dev, EMAC_FTR_EMAC4)) in emac_configure()
726 if (emac_phy_gpcs(dev->phy.mode)) { in emac_configure()
727 if (dev->phy.gpcs_address != 0xffffffff) in emac_configure()
728 emac_mii_reset_gpcs(&dev->phy); in emac_configure()
730 emac_mii_reset_phy(&dev->phy); in emac_configure()
736 static void emac_reinitialize(struct emac_instance *dev) in emac_reinitialize() argument
738 DBG(dev, "reinitialize" NL); in emac_reinitialize()
740 emac_netif_stop(dev); in emac_reinitialize()
741 if (!emac_configure(dev)) { in emac_reinitialize()
742 emac_tx_enable(dev); in emac_reinitialize()
743 emac_rx_enable(dev); in emac_reinitialize()
745 emac_netif_start(dev); in emac_reinitialize()
748 static void emac_full_tx_reset(struct emac_instance *dev) in emac_full_tx_reset() argument
750 DBG(dev, "full_tx_reset" NL); in emac_full_tx_reset()
752 emac_tx_disable(dev); in emac_full_tx_reset()
753 mal_disable_tx_channel(dev->mal, dev->mal_tx_chan); in emac_full_tx_reset()
754 emac_clean_tx_ring(dev); in emac_full_tx_reset()
755 dev->tx_cnt = dev->tx_slot = dev->ack_slot = 0; in emac_full_tx_reset()
757 emac_configure(dev); in emac_full_tx_reset()
759 mal_enable_tx_channel(dev->mal, dev->mal_tx_chan); in emac_full_tx_reset()
760 emac_tx_enable(dev); in emac_full_tx_reset()
761 emac_rx_enable(dev); in emac_full_tx_reset()
766 struct emac_instance *dev = container_of(work, struct emac_instance, reset_work); in emac_reset_work() local
768 DBG(dev, "reset_work" NL); in emac_reset_work()
770 mutex_lock(&dev->link_lock); in emac_reset_work()
771 if (dev->opened) { in emac_reset_work()
772 emac_netif_stop(dev); in emac_reset_work()
773 emac_full_tx_reset(dev); in emac_reset_work()
774 emac_netif_start(dev); in emac_reset_work()
776 mutex_unlock(&dev->link_lock); in emac_reset_work()
781 struct emac_instance *dev = netdev_priv(ndev); in emac_tx_timeout() local
783 DBG(dev, "tx_timeout" NL); in emac_tx_timeout()
785 schedule_work(&dev->reset_work); in emac_tx_timeout()
789 static inline int emac_phy_done(struct emac_instance *dev, u32 stacr) in emac_phy_done() argument
793 if (emac_has_feature(dev, EMAC_FTR_STACR_OC_INVERT)) in emac_phy_done()
799 static int __emac_mdio_read(struct emac_instance *dev, u8 id, u8 reg) in __emac_mdio_read() argument
801 struct emac_regs __iomem *p = dev->emacp; in __emac_mdio_read()
805 mutex_lock(&dev->mdio_lock); in __emac_mdio_read()
807 DBG2(dev, "mdio_read(%02x,%02x)" NL, id, reg); in __emac_mdio_read()
810 if (emac_has_feature(dev, EMAC_FTR_HAS_ZMII)) in __emac_mdio_read()
811 zmii_get_mdio(dev->zmii_dev, dev->zmii_port); in __emac_mdio_read()
812 if (emac_has_feature(dev, EMAC_FTR_HAS_RGMII)) in __emac_mdio_read()
813 rgmii_get_mdio(dev->rgmii_dev, dev->rgmii_port); in __emac_mdio_read()
817 while (!emac_phy_done(dev, in_be32(&p->stacr))) { in __emac_mdio_read()
820 DBG2(dev, " -> timeout wait idle\n"); in __emac_mdio_read()
826 if (emac_has_feature(dev, EMAC_FTR_EMAC4)) in __emac_mdio_read()
827 r = EMAC4_STACR_BASE(dev->opb_bus_freq); in __emac_mdio_read()
829 r = EMAC_STACR_BASE(dev->opb_bus_freq); in __emac_mdio_read()
830 if (emac_has_feature(dev, EMAC_FTR_STACR_OC_INVERT)) in __emac_mdio_read()
832 if (emac_has_feature(dev, EMAC_FTR_HAS_NEW_STACR)) in __emac_mdio_read()
842 while (!emac_phy_done(dev, (r = in_be32(&p->stacr)))) { in __emac_mdio_read()
845 DBG2(dev, " -> timeout wait complete\n"); in __emac_mdio_read()
851 DBG(dev, "mdio_read(%02x, %02x) failed" NL, id, reg); in __emac_mdio_read()
858 DBG2(dev, "mdio_read -> %04x" NL, r); in __emac_mdio_read()
861 if (emac_has_feature(dev, EMAC_FTR_HAS_RGMII)) in __emac_mdio_read()
862 rgmii_put_mdio(dev->rgmii_dev, dev->rgmii_port); in __emac_mdio_read()
863 if (emac_has_feature(dev, EMAC_FTR_HAS_ZMII)) in __emac_mdio_read()
864 zmii_put_mdio(dev->zmii_dev, dev->zmii_port); in __emac_mdio_read()
865 mutex_unlock(&dev->mdio_lock); in __emac_mdio_read()
870 static void __emac_mdio_write(struct emac_instance *dev, u8 id, u8 reg, in __emac_mdio_write() argument
873 struct emac_regs __iomem *p = dev->emacp; in __emac_mdio_write()
877 mutex_lock(&dev->mdio_lock); in __emac_mdio_write()
879 DBG2(dev, "mdio_write(%02x,%02x,%04x)" NL, id, reg, val); in __emac_mdio_write()
882 if (emac_has_feature(dev, EMAC_FTR_HAS_ZMII)) in __emac_mdio_write()
883 zmii_get_mdio(dev->zmii_dev, dev->zmii_port); in __emac_mdio_write()
884 if (emac_has_feature(dev, EMAC_FTR_HAS_RGMII)) in __emac_mdio_write()
885 rgmii_get_mdio(dev->rgmii_dev, dev->rgmii_port); in __emac_mdio_write()
889 while (!emac_phy_done(dev, in_be32(&p->stacr))) { in __emac_mdio_write()
892 DBG2(dev, " -> timeout wait idle\n"); in __emac_mdio_write()
898 if (emac_has_feature(dev, EMAC_FTR_EMAC4)) in __emac_mdio_write()
899 r = EMAC4_STACR_BASE(dev->opb_bus_freq); in __emac_mdio_write()
901 r = EMAC_STACR_BASE(dev->opb_bus_freq); in __emac_mdio_write()
902 if (emac_has_feature(dev, EMAC_FTR_STACR_OC_INVERT)) in __emac_mdio_write()
904 if (emac_has_feature(dev, EMAC_FTR_HAS_NEW_STACR)) in __emac_mdio_write()
915 while (!emac_phy_done(dev, in_be32(&p->stacr))) { in __emac_mdio_write()
918 DBG2(dev, " -> timeout wait complete\n"); in __emac_mdio_write()
923 if (emac_has_feature(dev, EMAC_FTR_HAS_RGMII)) in __emac_mdio_write()
924 rgmii_put_mdio(dev->rgmii_dev, dev->rgmii_port); in __emac_mdio_write()
925 if (emac_has_feature(dev, EMAC_FTR_HAS_ZMII)) in __emac_mdio_write()
926 zmii_put_mdio(dev->zmii_dev, dev->zmii_port); in __emac_mdio_write()
927 mutex_unlock(&dev->mdio_lock); in __emac_mdio_write()
932 struct emac_instance *dev = netdev_priv(ndev); in emac_mdio_read() local
935 res = __emac_mdio_read((dev->mdio_instance && in emac_mdio_read()
936 dev->phy.gpcs_address != id) ? in emac_mdio_read()
937 dev->mdio_instance : dev, in emac_mdio_read()
944 struct emac_instance *dev = netdev_priv(ndev); in emac_mdio_write() local
946 __emac_mdio_write((dev->mdio_instance && in emac_mdio_write()
947 dev->phy.gpcs_address != id) ? in emac_mdio_write()
948 dev->mdio_instance : dev, in emac_mdio_write()
953 static void __emac_set_multicast_list(struct emac_instance *dev) in __emac_set_multicast_list() argument
955 struct emac_regs __iomem *p = dev->emacp; in __emac_set_multicast_list()
956 u32 rmr = emac_iff2rmr(dev->ndev); in __emac_set_multicast_list()
958 DBG(dev, "__multicast %08x" NL, rmr); in __emac_set_multicast_list()
977 dev->mcast_pending = 0; in __emac_set_multicast_list()
978 emac_rx_disable(dev); in __emac_set_multicast_list()
980 emac_hash_mc(dev); in __emac_set_multicast_list()
982 emac_rx_enable(dev); in __emac_set_multicast_list()
988 struct emac_instance *dev = netdev_priv(ndev); in emac_set_multicast_list() local
990 DBG(dev, "multicast" NL); in emac_set_multicast_list()
992 BUG_ON(!netif_running(dev->ndev)); in emac_set_multicast_list()
994 if (dev->no_mcast) { in emac_set_multicast_list()
995 dev->mcast_pending = 1; in emac_set_multicast_list()
999 mutex_lock(&dev->link_lock); in emac_set_multicast_list()
1000 __emac_set_multicast_list(dev); in emac_set_multicast_list()
1001 mutex_unlock(&dev->link_lock); in emac_set_multicast_list()
1006 struct emac_instance *dev = netdev_priv(ndev); in emac_set_mac_address() local
1008 struct emac_regs __iomem *p = dev->emacp; in emac_set_mac_address()
1013 mutex_lock(&dev->link_lock); in emac_set_mac_address()
1017 emac_rx_disable(dev); in emac_set_mac_address()
1018 emac_tx_disable(dev); in emac_set_mac_address()
1023 emac_tx_enable(dev); in emac_set_mac_address()
1024 emac_rx_enable(dev); in emac_set_mac_address()
1026 mutex_unlock(&dev->link_lock); in emac_set_mac_address()
1031 static int emac_resize_rx_ring(struct emac_instance *dev, int new_mtu) in emac_resize_rx_ring() argument
1038 mutex_lock(&dev->link_lock); in emac_resize_rx_ring()
1039 emac_netif_stop(dev); in emac_resize_rx_ring()
1040 emac_rx_disable(dev); in emac_resize_rx_ring()
1041 mal_disable_rx_channel(dev->mal, dev->mal_rx_chan); in emac_resize_rx_ring()
1043 if (dev->rx_sg_skb) { in emac_resize_rx_ring()
1044 ++dev->estats.rx_dropped_resize; in emac_resize_rx_ring()
1045 dev_kfree_skb(dev->rx_sg_skb); in emac_resize_rx_ring()
1046 dev->rx_sg_skb = NULL; in emac_resize_rx_ring()
1054 if (dev->rx_desc[i].ctrl & MAL_RX_CTRL_FIRST) in emac_resize_rx_ring()
1055 ++dev->estats.rx_dropped_resize; in emac_resize_rx_ring()
1057 dev->rx_desc[i].data_len = 0; in emac_resize_rx_ring()
1058 dev->rx_desc[i].ctrl = MAL_RX_CTRL_EMPTY | in emac_resize_rx_ring()
1063 if (rx_skb_size <= dev->rx_skb_size) in emac_resize_rx_ring()
1070 skb = netdev_alloc_skb_ip_align(dev->ndev, rx_skb_size); in emac_resize_rx_ring()
1076 BUG_ON(!dev->rx_skb[i]); in emac_resize_rx_ring()
1077 dev_kfree_skb(dev->rx_skb[i]); in emac_resize_rx_ring()
1079 dev->rx_desc[i].data_ptr = in emac_resize_rx_ring()
1080 dma_map_single(&dev->ofdev->dev, skb->data - NET_IP_ALIGN, in emac_resize_rx_ring()
1083 dev->rx_skb[i] = skb; in emac_resize_rx_ring()
1087 if (emac_has_feature(dev, EMAC_APM821XX_REQ_JUMBO_FRAME_SIZE)) { in emac_resize_rx_ring()
1089 (dev->ndev->mtu > ETH_DATA_LEN); in emac_resize_rx_ring()
1092 (dev->ndev->mtu > ETH_DATA_LEN); in emac_resize_rx_ring()
1097 set_bit(MAL_COMMAC_RX_STOPPED, &dev->commac.flags); in emac_resize_rx_ring()
1099 dev->ndev->mtu = new_mtu; in emac_resize_rx_ring()
1100 emac_full_tx_reset(dev); in emac_resize_rx_ring()
1103 mal_set_rcbs(dev->mal, dev->mal_rx_chan, emac_rx_size(new_mtu)); in emac_resize_rx_ring()
1106 clear_bit(MAL_COMMAC_RX_STOPPED, &dev->commac.flags); in emac_resize_rx_ring()
1107 dev->rx_slot = 0; in emac_resize_rx_ring()
1108 mal_enable_rx_channel(dev->mal, dev->mal_rx_chan); in emac_resize_rx_ring()
1109 emac_rx_enable(dev); in emac_resize_rx_ring()
1110 emac_netif_start(dev); in emac_resize_rx_ring()
1111 mutex_unlock(&dev->link_lock); in emac_resize_rx_ring()
1119 struct emac_instance *dev = netdev_priv(ndev); in emac_change_mtu() local
1122 DBG(dev, "change_mtu(%d)" NL, new_mtu); in emac_change_mtu()
1127 ret = emac_resize_rx_ring(dev, new_mtu); in emac_change_mtu()
1132 dev->rx_skb_size = emac_rx_skb_size(new_mtu); in emac_change_mtu()
1133 dev->rx_sync_size = emac_rx_sync_size(new_mtu); in emac_change_mtu()
1139 static void emac_clean_tx_ring(struct emac_instance *dev) in emac_clean_tx_ring() argument
1144 if (dev->tx_skb[i]) { in emac_clean_tx_ring()
1145 dev_kfree_skb(dev->tx_skb[i]); in emac_clean_tx_ring()
1146 dev->tx_skb[i] = NULL; in emac_clean_tx_ring()
1147 if (dev->tx_desc[i].ctrl & MAL_TX_CTRL_READY) in emac_clean_tx_ring()
1148 ++dev->estats.tx_dropped; in emac_clean_tx_ring()
1150 dev->tx_desc[i].ctrl = 0; in emac_clean_tx_ring()
1151 dev->tx_desc[i].data_ptr = 0; in emac_clean_tx_ring()
1155 static void emac_clean_rx_ring(struct emac_instance *dev) in emac_clean_rx_ring() argument
1160 if (dev->rx_skb[i]) { in emac_clean_rx_ring()
1161 dev->rx_desc[i].ctrl = 0; in emac_clean_rx_ring()
1162 dev_kfree_skb(dev->rx_skb[i]); in emac_clean_rx_ring()
1163 dev->rx_skb[i] = NULL; in emac_clean_rx_ring()
1164 dev->rx_desc[i].data_ptr = 0; in emac_clean_rx_ring()
1167 if (dev->rx_sg_skb) { in emac_clean_rx_ring()
1168 dev_kfree_skb(dev->rx_sg_skb); in emac_clean_rx_ring()
1169 dev->rx_sg_skb = NULL; in emac_clean_rx_ring()
1174 __emac_prepare_rx_skb(struct sk_buff *skb, struct emac_instance *dev, int slot) in __emac_prepare_rx_skb() argument
1179 dev->rx_skb[slot] = skb; in __emac_prepare_rx_skb()
1180 dev->rx_desc[slot].data_len = 0; in __emac_prepare_rx_skb()
1182 dev->rx_desc[slot].data_ptr = in __emac_prepare_rx_skb()
1183 dma_map_single(&dev->ofdev->dev, skb->data - NET_IP_ALIGN, in __emac_prepare_rx_skb()
1184 dev->rx_sync_size, DMA_FROM_DEVICE) + NET_IP_ALIGN; in __emac_prepare_rx_skb()
1186 dev->rx_desc[slot].ctrl = MAL_RX_CTRL_EMPTY | in __emac_prepare_rx_skb()
1193 emac_alloc_rx_skb(struct emac_instance *dev, int slot) in emac_alloc_rx_skb() argument
1197 skb = __netdev_alloc_skb_ip_align(dev->ndev, dev->rx_skb_size, in emac_alloc_rx_skb()
1200 return __emac_prepare_rx_skb(skb, dev, slot); in emac_alloc_rx_skb()
1204 emac_alloc_rx_skb_napi(struct emac_instance *dev, int slot) in emac_alloc_rx_skb_napi() argument
1208 skb = napi_alloc_skb(&dev->mal->napi, dev->rx_skb_size); in emac_alloc_rx_skb_napi()
1210 return __emac_prepare_rx_skb(skb, dev, slot); in emac_alloc_rx_skb_napi()
1213 static void emac_print_link_status(struct emac_instance *dev) in emac_print_link_status() argument
1215 if (netif_carrier_ok(dev->ndev)) in emac_print_link_status()
1217 dev->ndev->name, dev->phy.speed, in emac_print_link_status()
1218 dev->phy.duplex == DUPLEX_FULL ? "FDX" : "HDX", in emac_print_link_status()
1219 dev->phy.pause ? ", pause enabled" : in emac_print_link_status()
1220 dev->phy.asym_pause ? ", asymmetric pause enabled" : ""); in emac_print_link_status()
1222 printk(KERN_INFO "%s: link is down\n", dev->ndev->name); in emac_print_link_status()
1228 struct emac_instance *dev = netdev_priv(ndev); in emac_open() local
1231 DBG(dev, "open" NL); in emac_open()
1234 err = request_irq(dev->emac_irq, emac_irq, 0, "EMAC", dev); in emac_open()
1237 ndev->name, dev->emac_irq); in emac_open()
1243 if (emac_alloc_rx_skb(dev, i)) { in emac_open()
1249 dev->tx_cnt = dev->tx_slot = dev->ack_slot = dev->rx_slot = 0; in emac_open()
1250 clear_bit(MAL_COMMAC_RX_STOPPED, &dev->commac.flags); in emac_open()
1251 dev->rx_sg_skb = NULL; in emac_open()
1253 mutex_lock(&dev->link_lock); in emac_open()
1254 dev->opened = 1; in emac_open()
1258 if (dev->phy.address >= 0) { in emac_open()
1260 if (dev->phy.def->ops->poll_link(&dev->phy)) { in emac_open()
1261 dev->phy.def->ops->read_link(&dev->phy); in emac_open()
1262 emac_rx_clk_default(dev); in emac_open()
1263 netif_carrier_on(dev->ndev); in emac_open()
1266 emac_rx_clk_tx(dev); in emac_open()
1267 netif_carrier_off(dev->ndev); in emac_open()
1270 dev->link_polling = 1; in emac_open()
1272 schedule_delayed_work(&dev->link_work, link_poll_interval); in emac_open()
1273 emac_print_link_status(dev); in emac_open()
1275 netif_carrier_on(dev->ndev); in emac_open()
1280 emac_configure(dev); in emac_open()
1281 mal_poll_add(dev->mal, &dev->commac); in emac_open()
1282 mal_enable_tx_channel(dev->mal, dev->mal_tx_chan); in emac_open()
1283 mal_set_rcbs(dev->mal, dev->mal_rx_chan, emac_rx_size(ndev->mtu)); in emac_open()
1284 mal_enable_rx_channel(dev->mal, dev->mal_rx_chan); in emac_open()
1285 emac_tx_enable(dev); in emac_open()
1286 emac_rx_enable(dev); in emac_open()
1287 emac_netif_start(dev); in emac_open()
1289 mutex_unlock(&dev->link_lock); in emac_open()
1293 emac_clean_rx_ring(dev); in emac_open()
1294 free_irq(dev->emac_irq, dev); in emac_open()
1301 static int emac_link_differs(struct emac_instance *dev)
1303 u32 r = in_be32(&dev->emacp->mr1);
1327 return speed != dev->phy.speed || duplex != dev->phy.duplex ||
1328 pause != dev->phy.pause || asym_pause != dev->phy.asym_pause;
1334 struct emac_instance *dev = in emac_link_timer() local
1339 mutex_lock(&dev->link_lock); in emac_link_timer()
1340 DBG2(dev, "link timer" NL); in emac_link_timer()
1342 if (!dev->opened) in emac_link_timer()
1345 if (dev->phy.def->ops->poll_link(&dev->phy)) { in emac_link_timer()
1346 if (!netif_carrier_ok(dev->ndev)) { in emac_link_timer()
1347 emac_rx_clk_default(dev); in emac_link_timer()
1349 dev->phy.def->ops->read_link(&dev->phy); in emac_link_timer()
1351 netif_carrier_on(dev->ndev); in emac_link_timer()
1352 emac_netif_stop(dev); in emac_link_timer()
1353 emac_full_tx_reset(dev); in emac_link_timer()
1354 emac_netif_start(dev); in emac_link_timer()
1355 emac_print_link_status(dev); in emac_link_timer()
1359 if (netif_carrier_ok(dev->ndev)) { in emac_link_timer()
1360 emac_rx_clk_tx(dev); in emac_link_timer()
1361 netif_carrier_off(dev->ndev); in emac_link_timer()
1362 netif_tx_disable(dev->ndev); in emac_link_timer()
1363 emac_reinitialize(dev); in emac_link_timer()
1364 emac_print_link_status(dev); in emac_link_timer()
1368 schedule_delayed_work(&dev->link_work, link_poll_interval); in emac_link_timer()
1370 mutex_unlock(&dev->link_lock); in emac_link_timer()
1373 static void emac_force_link_update(struct emac_instance *dev) in emac_force_link_update() argument
1375 netif_carrier_off(dev->ndev); in emac_force_link_update()
1377 if (dev->link_polling) { in emac_force_link_update()
1378 cancel_delayed_work_sync(&dev->link_work); in emac_force_link_update()
1379 if (dev->link_polling) in emac_force_link_update()
1380 schedule_delayed_work(&dev->link_work, PHY_POLL_LINK_OFF); in emac_force_link_update()
1387 struct emac_instance *dev = netdev_priv(ndev); in emac_close() local
1389 DBG(dev, "close" NL); in emac_close()
1391 if (dev->phy.address >= 0) { in emac_close()
1392 dev->link_polling = 0; in emac_close()
1393 cancel_delayed_work_sync(&dev->link_work); in emac_close()
1395 mutex_lock(&dev->link_lock); in emac_close()
1396 emac_netif_stop(dev); in emac_close()
1397 dev->opened = 0; in emac_close()
1398 mutex_unlock(&dev->link_lock); in emac_close()
1400 emac_rx_disable(dev); in emac_close()
1401 emac_tx_disable(dev); in emac_close()
1402 mal_disable_rx_channel(dev->mal, dev->mal_rx_chan); in emac_close()
1403 mal_disable_tx_channel(dev->mal, dev->mal_tx_chan); in emac_close()
1404 mal_poll_del(dev->mal, &dev->commac); in emac_close()
1406 emac_clean_tx_ring(dev); in emac_close()
1407 emac_clean_rx_ring(dev); in emac_close()
1409 free_irq(dev->emac_irq, dev); in emac_close()
1416 static inline u16 emac_tx_csum(struct emac_instance *dev, in emac_tx_csum() argument
1419 if (emac_has_feature(dev, EMAC_FTR_HAS_TAH) && in emac_tx_csum()
1421 ++dev->stats.tx_packets_csum; in emac_tx_csum()
1427 static inline netdev_tx_t emac_xmit_finish(struct emac_instance *dev, int len) in emac_xmit_finish() argument
1429 struct emac_regs __iomem *p = dev->emacp; in emac_xmit_finish()
1430 struct net_device *ndev = dev->ndev; in emac_xmit_finish()
1433 * difference, then we can store the TMR0 value in "dev" in emac_xmit_finish()
1436 if (emac_has_feature(dev, EMAC_FTR_EMAC4)) in emac_xmit_finish()
1441 if (unlikely(++dev->tx_cnt == NUM_TX_BUFF)) { in emac_xmit_finish()
1443 DBG2(dev, "stopped TX queue" NL); in emac_xmit_finish()
1447 ++dev->stats.tx_packets; in emac_xmit_finish()
1448 dev->stats.tx_bytes += len; in emac_xmit_finish()
1456 struct emac_instance *dev = netdev_priv(ndev); in emac_start_xmit() local
1461 MAL_TX_CTRL_LAST | emac_tx_csum(dev, skb); in emac_start_xmit()
1463 slot = dev->tx_slot++; in emac_start_xmit()
1464 if (dev->tx_slot == NUM_TX_BUFF) { in emac_start_xmit()
1465 dev->tx_slot = 0; in emac_start_xmit()
1469 DBG2(dev, "xmit(%u) %d" NL, len, slot); in emac_start_xmit()
1471 dev->tx_skb[slot] = skb; in emac_start_xmit()
1472 dev->tx_desc[slot].data_ptr = dma_map_single(&dev->ofdev->dev, in emac_start_xmit()
1475 dev->tx_desc[slot].data_len = (u16) len; in emac_start_xmit()
1477 dev->tx_desc[slot].ctrl = ctrl; in emac_start_xmit()
1479 return emac_xmit_finish(dev, len); in emac_start_xmit()
1482 static inline int emac_xmit_split(struct emac_instance *dev, int slot, in emac_xmit_split() argument
1497 dev->tx_skb[slot] = NULL; in emac_xmit_split()
1498 dev->tx_desc[slot].data_ptr = pd; in emac_xmit_split()
1499 dev->tx_desc[slot].data_len = (u16) chunk; in emac_xmit_split()
1500 dev->tx_desc[slot].ctrl = ctrl; in emac_xmit_split()
1501 ++dev->tx_cnt; in emac_xmit_split()
1515 struct emac_instance *dev = netdev_priv(ndev); in emac_start_xmit_sg() local
1532 if (unlikely(dev->tx_cnt + nr_frags + mal_tx_chunks(len) > NUM_TX_BUFF)) in emac_start_xmit_sg()
1536 emac_tx_csum(dev, skb); in emac_start_xmit_sg()
1537 slot = dev->tx_slot; in emac_start_xmit_sg()
1540 dev->tx_skb[slot] = NULL; in emac_start_xmit_sg()
1542 dev->tx_desc[slot].data_ptr = pd = in emac_start_xmit_sg()
1543 dma_map_single(&dev->ofdev->dev, skb->data, len, DMA_TO_DEVICE); in emac_start_xmit_sg()
1544 dev->tx_desc[slot].data_len = (u16) chunk; in emac_start_xmit_sg()
1547 slot = emac_xmit_split(dev, slot, pd + chunk, len, !nr_frags, in emac_start_xmit_sg()
1554 if (unlikely(dev->tx_cnt + mal_tx_chunks(len) >= NUM_TX_BUFF)) in emac_start_xmit_sg()
1557 pd = skb_frag_dma_map(&dev->ofdev->dev, frag, 0, len, in emac_start_xmit_sg()
1560 slot = emac_xmit_split(dev, slot, pd, len, i == nr_frags - 1, in emac_start_xmit_sg()
1564 DBG2(dev, "xmit_sg(%u) %d - %d" NL, skb->len, dev->tx_slot, slot); in emac_start_xmit_sg()
1567 dev->tx_skb[slot] = skb; in emac_start_xmit_sg()
1570 if (dev->tx_slot == NUM_TX_BUFF - 1) in emac_start_xmit_sg()
1573 dev->tx_desc[dev->tx_slot].ctrl = ctrl; in emac_start_xmit_sg()
1574 dev->tx_slot = (slot + 1) % NUM_TX_BUFF; in emac_start_xmit_sg()
1576 return emac_xmit_finish(dev, skb->len); in emac_start_xmit_sg()
1582 while (slot != dev->tx_slot) { in emac_start_xmit_sg()
1583 dev->tx_desc[slot].ctrl = 0; in emac_start_xmit_sg()
1584 --dev->tx_cnt; in emac_start_xmit_sg()
1588 ++dev->estats.tx_undo; in emac_start_xmit_sg()
1592 DBG2(dev, "stopped TX queue" NL); in emac_start_xmit_sg()
1597 static void emac_parse_tx_error(struct emac_instance *dev, u16 ctrl) in emac_parse_tx_error() argument
1599 struct emac_error_stats *st = &dev->estats; in emac_parse_tx_error()
1601 DBG(dev, "BD TX error %04x" NL, ctrl); in emac_parse_tx_error()
1626 struct emac_instance *dev = param; in emac_poll_tx() local
1629 DBG2(dev, "poll_tx, %d %d" NL, dev->tx_cnt, dev->ack_slot); in emac_poll_tx()
1631 if (emac_has_feature(dev, EMAC_FTR_HAS_TAH)) in emac_poll_tx()
1636 netif_tx_lock_bh(dev->ndev); in emac_poll_tx()
1637 if (dev->tx_cnt) { in emac_poll_tx()
1639 int slot = dev->ack_slot, n = 0; in emac_poll_tx()
1641 ctrl = dev->tx_desc[slot].ctrl; in emac_poll_tx()
1643 struct sk_buff *skb = dev->tx_skb[slot]; in emac_poll_tx()
1648 dev->tx_skb[slot] = NULL; in emac_poll_tx()
1653 emac_parse_tx_error(dev, ctrl); in emac_poll_tx()
1655 if (--dev->tx_cnt) in emac_poll_tx()
1659 dev->ack_slot = slot; in emac_poll_tx()
1660 if (netif_queue_stopped(dev->ndev) && in emac_poll_tx()
1661 dev->tx_cnt < EMAC_TX_WAKEUP_THRESH) in emac_poll_tx()
1662 netif_wake_queue(dev->ndev); in emac_poll_tx()
1664 DBG2(dev, "tx %d pkts" NL, n); in emac_poll_tx()
1667 netif_tx_unlock_bh(dev->ndev); in emac_poll_tx()
1670 static inline void emac_recycle_rx_skb(struct emac_instance *dev, int slot, in emac_recycle_rx_skb() argument
1673 struct sk_buff *skb = dev->rx_skb[slot]; in emac_recycle_rx_skb()
1675 DBG2(dev, "recycle %d %d" NL, slot, len); in emac_recycle_rx_skb()
1678 dma_map_single(&dev->ofdev->dev, skb->data - NET_IP_ALIGN, in emac_recycle_rx_skb()
1682 dev->rx_desc[slot].data_len = 0; in emac_recycle_rx_skb()
1684 dev->rx_desc[slot].ctrl = MAL_RX_CTRL_EMPTY | in emac_recycle_rx_skb()
1688 static void emac_parse_rx_error(struct emac_instance *dev, u16 ctrl) in emac_parse_rx_error() argument
1690 struct emac_error_stats *st = &dev->estats; in emac_parse_rx_error()
1692 DBG(dev, "BD RX error %04x" NL, ctrl); in emac_parse_rx_error()
1715 static inline void emac_rx_csum(struct emac_instance *dev, in emac_rx_csum() argument
1719 if (!ctrl && dev->tah_dev) { in emac_rx_csum()
1721 ++dev->stats.rx_packets_csum; in emac_rx_csum()
1726 static inline int emac_rx_sg_append(struct emac_instance *dev, int slot) in emac_rx_sg_append() argument
1728 if (likely(dev->rx_sg_skb != NULL)) { in emac_rx_sg_append()
1729 int len = dev->rx_desc[slot].data_len; in emac_rx_sg_append()
1730 int tot_len = dev->rx_sg_skb->len + len; in emac_rx_sg_append()
1732 if (unlikely(tot_len + NET_IP_ALIGN > dev->rx_skb_size)) { in emac_rx_sg_append()
1733 ++dev->estats.rx_dropped_mtu; in emac_rx_sg_append()
1734 dev_kfree_skb(dev->rx_sg_skb); in emac_rx_sg_append()
1735 dev->rx_sg_skb = NULL; in emac_rx_sg_append()
1737 memcpy(skb_tail_pointer(dev->rx_sg_skb), in emac_rx_sg_append()
1738 dev->rx_skb[slot]->data, len); in emac_rx_sg_append()
1739 skb_put(dev->rx_sg_skb, len); in emac_rx_sg_append()
1740 emac_recycle_rx_skb(dev, slot, len); in emac_rx_sg_append()
1744 emac_recycle_rx_skb(dev, slot, 0); in emac_rx_sg_append()
1751 struct emac_instance *dev = param; in emac_poll_rx() local
1752 int slot = dev->rx_slot, received = 0; in emac_poll_rx()
1754 DBG2(dev, "poll_rx(%d)" NL, budget); in emac_poll_rx()
1760 u16 ctrl = dev->rx_desc[slot].ctrl; in emac_poll_rx()
1765 skb = dev->rx_skb[slot]; in emac_poll_rx()
1767 len = dev->rx_desc[slot].data_len; in emac_poll_rx()
1774 emac_parse_rx_error(dev, ctrl); in emac_poll_rx()
1775 ++dev->estats.rx_dropped_error; in emac_poll_rx()
1776 emac_recycle_rx_skb(dev, slot, 0); in emac_poll_rx()
1782 ++dev->estats.rx_dropped_stack; in emac_poll_rx()
1783 emac_recycle_rx_skb(dev, slot, len); in emac_poll_rx()
1790 copy_skb = napi_alloc_skb(&dev->mal->napi, len); in emac_poll_rx()
1797 emac_recycle_rx_skb(dev, slot, len); in emac_poll_rx()
1799 } else if (unlikely(emac_alloc_rx_skb_napi(dev, slot))) in emac_poll_rx()
1804 skb->protocol = eth_type_trans(skb, dev->ndev); in emac_poll_rx()
1805 emac_rx_csum(dev, skb, ctrl); in emac_poll_rx()
1808 ++dev->estats.rx_dropped_stack; in emac_poll_rx()
1810 ++dev->stats.rx_packets; in emac_poll_rx()
1812 dev->stats.rx_bytes += len; in emac_poll_rx()
1819 BUG_ON(dev->rx_sg_skb); in emac_poll_rx()
1820 if (unlikely(emac_alloc_rx_skb_napi(dev, slot))) { in emac_poll_rx()
1821 DBG(dev, "rx OOM %d" NL, slot); in emac_poll_rx()
1822 ++dev->estats.rx_dropped_oom; in emac_poll_rx()
1823 emac_recycle_rx_skb(dev, slot, 0); in emac_poll_rx()
1825 dev->rx_sg_skb = skb; in emac_poll_rx()
1828 } else if (!emac_rx_sg_append(dev, slot) && in emac_poll_rx()
1831 skb = dev->rx_sg_skb; in emac_poll_rx()
1832 dev->rx_sg_skb = NULL; in emac_poll_rx()
1836 emac_parse_rx_error(dev, ctrl); in emac_poll_rx()
1837 ++dev->estats.rx_dropped_error; in emac_poll_rx()
1845 DBG(dev, "rx OOM %d" NL, slot); in emac_poll_rx()
1847 ++dev->estats.rx_dropped_oom; in emac_poll_rx()
1848 emac_recycle_rx_skb(dev, slot, 0); in emac_poll_rx()
1853 DBG2(dev, "rx %d BDs" NL, received); in emac_poll_rx()
1854 dev->rx_slot = slot; in emac_poll_rx()
1857 if (unlikely(budget && test_bit(MAL_COMMAC_RX_STOPPED, &dev->commac.flags))) { in emac_poll_rx()
1859 if (!(dev->rx_desc[slot].ctrl & MAL_RX_CTRL_EMPTY)) { in emac_poll_rx()
1860 DBG2(dev, "rx restart" NL); in emac_poll_rx()
1865 if (dev->rx_sg_skb) { in emac_poll_rx()
1866 DBG2(dev, "dropping partial rx packet" NL); in emac_poll_rx()
1867 ++dev->estats.rx_dropped_error; in emac_poll_rx()
1868 dev_kfree_skb(dev->rx_sg_skb); in emac_poll_rx()
1869 dev->rx_sg_skb = NULL; in emac_poll_rx()
1872 clear_bit(MAL_COMMAC_RX_STOPPED, &dev->commac.flags); in emac_poll_rx()
1873 mal_enable_rx_channel(dev->mal, dev->mal_rx_chan); in emac_poll_rx()
1874 emac_rx_enable(dev); in emac_poll_rx()
1875 dev->rx_slot = 0; in emac_poll_rx()
1883 struct emac_instance *dev = param; in emac_peek_rx() local
1885 return !(dev->rx_desc[dev->rx_slot].ctrl & MAL_RX_CTRL_EMPTY); in emac_peek_rx()
1891 struct emac_instance *dev = param; in emac_peek_rx_sg() local
1893 int slot = dev->rx_slot; in emac_peek_rx_sg()
1895 u16 ctrl = dev->rx_desc[slot].ctrl; in emac_peek_rx_sg()
1904 if (unlikely(slot == dev->rx_slot)) in emac_peek_rx_sg()
1912 struct emac_instance *dev = param; in emac_rxde() local
1914 ++dev->estats.rx_stopped; in emac_rxde()
1915 emac_rx_disable_async(dev); in emac_rxde()
1921 struct emac_instance *dev = dev_instance; in emac_irq() local
1922 struct emac_regs __iomem *p = dev->emacp; in emac_irq()
1923 struct emac_error_stats *st = &dev->estats; in emac_irq()
1926 spin_lock(&dev->lock); in emac_irq()
1931 DBG(dev, "isr = %08x" NL, isr); in emac_irq()
1964 spin_unlock(&dev->lock); in emac_irq()
1971 struct emac_instance *dev = netdev_priv(ndev); in emac_stats() local
1972 struct emac_stats *st = &dev->stats; in emac_stats()
1973 struct emac_error_stats *est = &dev->estats; in emac_stats()
1977 DBG2(dev, "stats" NL); in emac_stats()
1980 spin_lock_irqsave(&dev->lock, flags); in emac_stats()
2018 spin_unlock_irqrestore(&dev->lock, flags); in emac_stats()
2040 struct emac_instance *dev = netdev_priv(ndev); in emac_ethtool_get_link_ksettings() local
2043 supported = dev->phy.features; in emac_ethtool_get_link_ksettings()
2045 cmd->base.phy_address = dev->phy.address; in emac_ethtool_get_link_ksettings()
2047 mutex_lock(&dev->link_lock); in emac_ethtool_get_link_ksettings()
2048 advertising = dev->phy.advertising; in emac_ethtool_get_link_ksettings()
2049 cmd->base.autoneg = dev->phy.autoneg; in emac_ethtool_get_link_ksettings()
2050 cmd->base.speed = dev->phy.speed; in emac_ethtool_get_link_ksettings()
2051 cmd->base.duplex = dev->phy.duplex; in emac_ethtool_get_link_ksettings()
2052 mutex_unlock(&dev->link_lock); in emac_ethtool_get_link_ksettings()
2066 struct emac_instance *dev = netdev_priv(ndev); in emac_ethtool_set_link_ksettings() local
2067 u32 f = dev->phy.features; in emac_ethtool_set_link_ksettings()
2073 DBG(dev, "set_settings(%d, %d, %d, 0x%08x)" NL, in emac_ethtool_set_link_ksettings()
2077 if (dev->phy.address < 0) in emac_ethtool_set_link_ksettings()
2117 mutex_lock(&dev->link_lock); in emac_ethtool_set_link_ksettings()
2118 dev->phy.def->ops->setup_forced(&dev->phy, cmd->base.speed, in emac_ethtool_set_link_ksettings()
2120 mutex_unlock(&dev->link_lock); in emac_ethtool_set_link_ksettings()
2126 mutex_lock(&dev->link_lock); in emac_ethtool_set_link_ksettings()
2127 dev->phy.def->ops->setup_aneg(&dev->phy, in emac_ethtool_set_link_ksettings()
2129 (dev->phy.advertising & in emac_ethtool_set_link_ksettings()
2132 mutex_unlock(&dev->link_lock); in emac_ethtool_set_link_ksettings()
2134 emac_force_link_update(dev); in emac_ethtool_set_link_ksettings()
2149 struct emac_instance *dev = netdev_priv(ndev); in emac_ethtool_get_pauseparam() local
2151 mutex_lock(&dev->link_lock); in emac_ethtool_get_pauseparam()
2152 if ((dev->phy.features & SUPPORTED_Autoneg) && in emac_ethtool_get_pauseparam()
2153 (dev->phy.advertising & (ADVERTISED_Pause | ADVERTISED_Asym_Pause))) in emac_ethtool_get_pauseparam()
2156 if (dev->phy.duplex == DUPLEX_FULL) { in emac_ethtool_get_pauseparam()
2157 if (dev->phy.pause) in emac_ethtool_get_pauseparam()
2159 else if (dev->phy.asym_pause) in emac_ethtool_get_pauseparam()
2162 mutex_unlock(&dev->link_lock); in emac_ethtool_get_pauseparam()
2165 static int emac_get_regs_len(struct emac_instance *dev) in emac_get_regs_len() argument
2173 struct emac_instance *dev = netdev_priv(ndev); in emac_ethtool_get_regs_len() local
2177 emac_get_regs_len(dev) + mal_get_regs_len(dev->mal); in emac_ethtool_get_regs_len()
2178 if (emac_has_feature(dev, EMAC_FTR_HAS_ZMII)) in emac_ethtool_get_regs_len()
2179 size += zmii_get_regs_len(dev->zmii_dev); in emac_ethtool_get_regs_len()
2180 if (emac_has_feature(dev, EMAC_FTR_HAS_RGMII)) in emac_ethtool_get_regs_len()
2181 size += rgmii_get_regs_len(dev->rgmii_dev); in emac_ethtool_get_regs_len()
2182 if (emac_has_feature(dev, EMAC_FTR_HAS_TAH)) in emac_ethtool_get_regs_len()
2183 size += tah_get_regs_len(dev->tah_dev); in emac_ethtool_get_regs_len()
2188 static void *emac_dump_regs(struct emac_instance *dev, void *buf) in emac_dump_regs() argument
2192 hdr->index = dev->cell_index; in emac_dump_regs()
2193 if (emac_has_feature(dev, EMAC_FTR_EMAC4SYNC)) { in emac_dump_regs()
2195 } else if (emac_has_feature(dev, EMAC_FTR_EMAC4)) { in emac_dump_regs()
2200 memcpy_fromio(hdr + 1, dev->emacp, sizeof(struct emac_regs)); in emac_dump_regs()
2207 struct emac_instance *dev = netdev_priv(ndev); in emac_ethtool_get_regs() local
2213 buf = mal_dump_regs(dev->mal, buf); in emac_ethtool_get_regs()
2214 buf = emac_dump_regs(dev, buf); in emac_ethtool_get_regs()
2215 if (emac_has_feature(dev, EMAC_FTR_HAS_ZMII)) { in emac_ethtool_get_regs()
2217 buf = zmii_dump_regs(dev->zmii_dev, buf); in emac_ethtool_get_regs()
2219 if (emac_has_feature(dev, EMAC_FTR_HAS_RGMII)) { in emac_ethtool_get_regs()
2221 buf = rgmii_dump_regs(dev->rgmii_dev, buf); in emac_ethtool_get_regs()
2223 if (emac_has_feature(dev, EMAC_FTR_HAS_TAH)) { in emac_ethtool_get_regs()
2225 buf = tah_dump_regs(dev->tah_dev, buf); in emac_ethtool_get_regs()
2231 struct emac_instance *dev = netdev_priv(ndev); in emac_ethtool_nway_reset() local
2234 DBG(dev, "nway_reset" NL); in emac_ethtool_nway_reset()
2236 if (dev->phy.address < 0) in emac_ethtool_nway_reset()
2239 mutex_lock(&dev->link_lock); in emac_ethtool_nway_reset()
2240 if (!dev->phy.autoneg) { in emac_ethtool_nway_reset()
2245 dev->phy.def->ops->setup_aneg(&dev->phy, dev->phy.advertising); in emac_ethtool_nway_reset()
2247 mutex_unlock(&dev->link_lock); in emac_ethtool_nway_reset()
2248 emac_force_link_update(dev); in emac_ethtool_nway_reset()
2271 struct emac_instance *dev = netdev_priv(ndev); in emac_ethtool_get_ethtool_stats() local
2273 memcpy(tmp_stats, &dev->stats, sizeof(dev->stats)); in emac_ethtool_get_ethtool_stats()
2274 tmp_stats += sizeof(dev->stats) / sizeof(u64); in emac_ethtool_get_ethtool_stats()
2275 memcpy(tmp_stats, &dev->estats, sizeof(dev->estats)); in emac_ethtool_get_ethtool_stats()
2281 struct emac_instance *dev = netdev_priv(ndev); in emac_ethtool_get_drvinfo() local
2286 dev->cell_index, dev->ofdev->dev.of_node); in emac_ethtool_get_drvinfo()
2311 struct emac_instance *dev = netdev_priv(ndev); in emac_ioctl() local
2314 DBG(dev, "ioctl %08x" NL, cmd); in emac_ioctl()
2316 if (dev->phy.address < 0) in emac_ioctl()
2321 data->phy_id = dev->phy.address; in emac_ioctl()
2324 data->val_out = emac_mdio_read(ndev, dev->phy.address, in emac_ioctl()
2329 emac_mdio_write(ndev, dev->phy.address, data->reg_num, in emac_ioctl()
2352 static int emac_check_deps(struct emac_instance *dev, in emac_check_deps() argument
2366 np = *(dev->blist - 1); in emac_check_deps()
2391 static void emac_put_deps(struct emac_instance *dev) in emac_put_deps() argument
2393 of_dev_put(dev->mal_dev); in emac_put_deps()
2394 of_dev_put(dev->zmii_dev); in emac_put_deps()
2395 of_dev_put(dev->rgmii_dev); in emac_put_deps()
2396 of_dev_put(dev->mdio_dev); in emac_put_deps()
2397 of_dev_put(dev->tah_dev); in emac_put_deps()
2413 static int emac_wait_deps(struct emac_instance *dev) in emac_wait_deps() argument
2420 deps[EMAC_DEP_MAL_IDX].phandle = dev->mal_ph; in emac_wait_deps()
2421 deps[EMAC_DEP_ZMII_IDX].phandle = dev->zmii_ph; in emac_wait_deps()
2422 deps[EMAC_DEP_RGMII_IDX].phandle = dev->rgmii_ph; in emac_wait_deps()
2423 if (dev->tah_ph) in emac_wait_deps()
2424 deps[EMAC_DEP_TAH_IDX].phandle = dev->tah_ph; in emac_wait_deps()
2425 if (dev->mdio_ph) in emac_wait_deps()
2426 deps[EMAC_DEP_MDIO_IDX].phandle = dev->mdio_ph; in emac_wait_deps()
2427 if (dev->blist && dev->blist > emac_boot_list) in emac_wait_deps()
2431 emac_check_deps(dev, deps), in emac_wait_deps()
2434 err = emac_check_deps(dev, deps) ? 0 : -ENODEV; in emac_wait_deps()
2441 dev->mal_dev = deps[EMAC_DEP_MAL_IDX].ofdev; in emac_wait_deps()
2442 dev->zmii_dev = deps[EMAC_DEP_ZMII_IDX].ofdev; in emac_wait_deps()
2443 dev->rgmii_dev = deps[EMAC_DEP_RGMII_IDX].ofdev; in emac_wait_deps()
2444 dev->tah_dev = deps[EMAC_DEP_TAH_IDX].ofdev; in emac_wait_deps()
2445 dev->mdio_dev = deps[EMAC_DEP_MDIO_IDX].ofdev; in emac_wait_deps()
2468 struct emac_instance *dev = netdev_priv(ndev); in emac_adjust_link() local
2469 struct phy_device *phy = dev->phy_dev; in emac_adjust_link()
2471 dev->phy.autoneg = phy->autoneg; in emac_adjust_link()
2472 dev->phy.speed = phy->speed; in emac_adjust_link()
2473 dev->phy.duplex = phy->duplex; in emac_adjust_link()
2474 dev->phy.pause = phy->pause; in emac_adjust_link()
2475 dev->phy.asym_pause = phy->asym_pause; in emac_adjust_link()
2476 ethtool_convert_link_mode_to_legacy_u32(&dev->phy.advertising, in emac_adjust_link()
2501 struct emac_instance *dev = netdev_priv(bus->priv); in emac_mii_bus_reset() local
2503 return emac_reset(dev); in emac_mii_bus_reset()
2519 struct net_device *ndev = phy->dev; in emac_mdio_setup_aneg()
2520 struct emac_instance *dev = netdev_priv(ndev); in emac_mdio_setup_aneg() local
2524 return emac_mdio_phy_start_aneg(phy, dev->phy_dev); in emac_mdio_setup_aneg()
2529 struct net_device *ndev = phy->dev; in emac_mdio_setup_forced()
2530 struct emac_instance *dev = netdev_priv(ndev); in emac_mdio_setup_forced() local
2535 return emac_mdio_phy_start_aneg(phy, dev->phy_dev); in emac_mdio_setup_forced()
2540 struct net_device *ndev = phy->dev; in emac_mdio_poll_link()
2541 struct emac_instance *dev = netdev_priv(ndev); in emac_mdio_poll_link() local
2544 res = phy_read_status(dev->phy_dev); in emac_mdio_poll_link()
2546 dev_err(&dev->ofdev->dev, "link update failed (%d).", res); in emac_mdio_poll_link()
2550 return dev->phy_dev->link; in emac_mdio_poll_link()
2555 struct net_device *ndev = phy->dev; in emac_mdio_read_link()
2556 struct emac_instance *dev = netdev_priv(ndev); in emac_mdio_read_link() local
2557 struct phy_device *phy_dev = dev->phy_dev; in emac_mdio_read_link()
2573 struct net_device *ndev = phy->dev; in emac_mdio_init_phy()
2574 struct emac_instance *dev = netdev_priv(ndev); in emac_mdio_init_phy() local
2576 phy_start(dev->phy_dev); in emac_mdio_init_phy()
2577 return phy_init_hw(dev->phy_dev); in emac_mdio_init_phy()
2588 static int emac_dt_mdio_probe(struct emac_instance *dev) in emac_dt_mdio_probe() argument
2593 mii_np = of_get_child_by_name(dev->ofdev->dev.of_node, "mdio"); in emac_dt_mdio_probe()
2595 dev_err(&dev->ofdev->dev, "no mdio definition found."); in emac_dt_mdio_probe()
2604 dev->mii_bus = devm_mdiobus_alloc(&dev->ofdev->dev); in emac_dt_mdio_probe()
2605 if (!dev->mii_bus) { in emac_dt_mdio_probe()
2610 dev->mii_bus->priv = dev->ndev; in emac_dt_mdio_probe()
2611 dev->mii_bus->parent = dev->ndev->dev.parent; in emac_dt_mdio_probe()
2612 dev->mii_bus->name = "emac_mdio"; in emac_dt_mdio_probe()
2613 dev->mii_bus->read = &emac_mii_bus_read; in emac_dt_mdio_probe()
2614 dev->mii_bus->write = &emac_mii_bus_write; in emac_dt_mdio_probe()
2615 dev->mii_bus->reset = &emac_mii_bus_reset; in emac_dt_mdio_probe()
2616 snprintf(dev->mii_bus->id, MII_BUS_ID_SIZE, "%s", dev->ofdev->name); in emac_dt_mdio_probe()
2617 res = of_mdiobus_register(dev->mii_bus, mii_np); in emac_dt_mdio_probe()
2619 dev_err(&dev->ofdev->dev, "cannot register MDIO bus %s (%d)", in emac_dt_mdio_probe()
2620 dev->mii_bus->name, res); in emac_dt_mdio_probe()
2628 static int emac_dt_phy_connect(struct emac_instance *dev, in emac_dt_phy_connect() argument
2631 dev->phy.def = devm_kzalloc(&dev->ofdev->dev, sizeof(*dev->phy.def), in emac_dt_phy_connect()
2633 if (!dev->phy.def) in emac_dt_phy_connect()
2636 dev->phy_dev = of_phy_connect(dev->ndev, phy_handle, &emac_adjust_link, in emac_dt_phy_connect()
2637 0, dev->phy_mode); in emac_dt_phy_connect()
2638 if (!dev->phy_dev) { in emac_dt_phy_connect()
2639 dev_err(&dev->ofdev->dev, "failed to connect to PHY.\n"); in emac_dt_phy_connect()
2643 dev->phy.def->phy_id = dev->phy_dev->drv->phy_id; in emac_dt_phy_connect()
2644 dev->phy.def->phy_id_mask = dev->phy_dev->drv->phy_id_mask; in emac_dt_phy_connect()
2645 dev->phy.def->name = dev->phy_dev->drv->name; in emac_dt_phy_connect()
2646 dev->phy.def->ops = &emac_dt_mdio_phy_ops; in emac_dt_phy_connect()
2647 ethtool_convert_link_mode_to_legacy_u32(&dev->phy.features, in emac_dt_phy_connect()
2648 dev->phy_dev->supported); in emac_dt_phy_connect()
2649 dev->phy.address = dev->phy_dev->mdio.addr; in emac_dt_phy_connect()
2650 dev->phy.mode = dev->phy_dev->interface; in emac_dt_phy_connect()
2654 static int emac_dt_phy_probe(struct emac_instance *dev) in emac_dt_phy_probe() argument
2656 struct device_node *np = dev->ofdev->dev.of_node; in emac_dt_phy_probe()
2663 res = emac_dt_mdio_probe(dev); in emac_dt_phy_probe()
2665 res = emac_dt_phy_connect(dev, phy_handle); in emac_dt_phy_probe()
2667 mdiobus_unregister(dev->mii_bus); in emac_dt_phy_probe()
2675 static int emac_init_phy(struct emac_instance *dev) in emac_init_phy() argument
2677 struct device_node *np = dev->ofdev->dev.of_node; in emac_init_phy()
2678 struct net_device *ndev = dev->ndev; in emac_init_phy()
2682 dev->phy.dev = ndev; in emac_init_phy()
2683 dev->phy.mode = dev->phy_mode; in emac_init_phy()
2686 if ((dev->phy_address == 0xffffffff && dev->phy_map == 0xffffffff) || in emac_init_phy()
2688 emac_reset(dev); in emac_init_phy()
2691 dev->phy.address = -1; in emac_init_phy()
2692 dev->phy.features = SUPPORTED_MII; in emac_init_phy()
2693 if (emac_phy_supports_gige(dev->phy_mode)) in emac_init_phy()
2694 dev->phy.features |= SUPPORTED_1000baseT_Full; in emac_init_phy()
2696 dev->phy.features |= SUPPORTED_100baseT_Full; in emac_init_phy()
2697 dev->phy.pause = 1; in emac_init_phy()
2700 int res = emac_dt_mdio_probe(dev); in emac_init_phy()
2706 dev->phy_dev = of_phy_find_device(np); in emac_init_phy()
2707 if (res || !dev->phy_dev) { in emac_init_phy()
2708 mdiobus_unregister(dev->mii_bus); in emac_init_phy()
2711 emac_adjust_link(dev->ndev); in emac_init_phy()
2712 put_device(&dev->phy_dev->mdio.dev); in emac_init_phy()
2718 phy_map = dev->phy_map | busy_phy_map; in emac_init_phy()
2720 DBG(dev, "PHY maps %08x %08x" NL, dev->phy_map, busy_phy_map); in emac_init_phy()
2722 dev->phy.mdio_read = emac_mdio_read; in emac_init_phy()
2723 dev->phy.mdio_write = emac_mdio_write; in emac_init_phy()
2727 if (emac_has_feature(dev, EMAC_FTR_440GX_PHY_CLK_FIX)) in emac_init_phy()
2731 emac_rx_clk_tx(dev); in emac_init_phy()
2735 if (emac_has_feature(dev, EMAC_FTR_440GX_PHY_CLK_FIX)) in emac_init_phy()
2741 if (emac_phy_gpcs(dev->phy.mode)) { in emac_init_phy()
2750 dev->phy.gpcs_address = dev->gpcs_address; in emac_init_phy()
2751 if (dev->phy.gpcs_address == 0xffffffff) in emac_init_phy()
2752 dev->phy.address = dev->cell_index; in emac_init_phy()
2755 emac_configure(dev); in emac_init_phy()
2757 if (emac_has_feature(dev, EMAC_FTR_HAS_RGMII)) { in emac_init_phy()
2758 int res = emac_dt_phy_probe(dev); in emac_init_phy()
2774 dev_err(&dev->ofdev->dev, "failed to attach dt phy (%d).\n", in emac_init_phy()
2780 if (dev->phy_address != 0xffffffff) in emac_init_phy()
2781 phy_map = ~(1 << dev->phy_address); in emac_init_phy()
2789 r = emac_mdio_read(dev->ndev, i, MII_BMCR); in emac_init_phy()
2792 if (!emac_mii_phy_probe(&dev->phy, i)) in emac_init_phy()
2798 if (emac_has_feature(dev, EMAC_FTR_440GX_PHY_CLK_FIX)) in emac_init_phy()
2809 if (dev->phy.def->ops->init) in emac_init_phy()
2810 dev->phy.def->ops->init(&dev->phy); in emac_init_phy()
2813 dev->phy.def->features &= ~dev->phy_feat_exc; in emac_init_phy()
2814 dev->phy.features &= ~dev->phy_feat_exc; in emac_init_phy()
2817 if (dev->phy.features & SUPPORTED_Autoneg) { in emac_init_phy()
2818 adv = dev->phy.features; in emac_init_phy()
2819 if (!emac_has_feature(dev, EMAC_FTR_NO_FLOW_CONTROL_40x)) in emac_init_phy()
2822 dev->phy.def->ops->setup_aneg(&dev->phy, adv); in emac_init_phy()
2824 u32 f = dev->phy.def->features; in emac_init_phy()
2842 dev->phy.def->ops->setup_forced(&dev->phy, speed, fd); in emac_init_phy()
2847 static int emac_init_config(struct emac_instance *dev) in emac_init_config() argument
2849 struct device_node *np = dev->ofdev->dev.of_node; in emac_init_config()
2854 if (emac_read_uint_prop(np, "mal-device", &dev->mal_ph, 1)) in emac_init_config()
2856 if (emac_read_uint_prop(np, "mal-tx-channel", &dev->mal_tx_chan, 1)) in emac_init_config()
2858 if (emac_read_uint_prop(np, "mal-rx-channel", &dev->mal_rx_chan, 1)) in emac_init_config()
2860 if (emac_read_uint_prop(np, "cell-index", &dev->cell_index, 1)) in emac_init_config()
2862 if (emac_read_uint_prop(np, "max-frame-size", &dev->max_mtu, 0)) in emac_init_config()
2863 dev->max_mtu = ETH_DATA_LEN; in emac_init_config()
2864 if (emac_read_uint_prop(np, "rx-fifo-size", &dev->rx_fifo_size, 0)) in emac_init_config()
2865 dev->rx_fifo_size = 2048; in emac_init_config()
2866 if (emac_read_uint_prop(np, "tx-fifo-size", &dev->tx_fifo_size, 0)) in emac_init_config()
2867 dev->tx_fifo_size = 2048; in emac_init_config()
2868 if (emac_read_uint_prop(np, "rx-fifo-size-gige", &dev->rx_fifo_size_gige, 0)) in emac_init_config()
2869 dev->rx_fifo_size_gige = dev->rx_fifo_size; in emac_init_config()
2870 if (emac_read_uint_prop(np, "tx-fifo-size-gige", &dev->tx_fifo_size_gige, 0)) in emac_init_config()
2871 dev->tx_fifo_size_gige = dev->tx_fifo_size; in emac_init_config()
2872 if (emac_read_uint_prop(np, "phy-address", &dev->phy_address, 0)) in emac_init_config()
2873 dev->phy_address = 0xffffffff; in emac_init_config()
2874 if (emac_read_uint_prop(np, "phy-map", &dev->phy_map, 0)) in emac_init_config()
2875 dev->phy_map = 0xffffffff; in emac_init_config()
2876 if (emac_read_uint_prop(np, "gpcs-address", &dev->gpcs_address, 0)) in emac_init_config()
2877 dev->gpcs_address = 0xffffffff; in emac_init_config()
2878 if (emac_read_uint_prop(np->parent, "clock-frequency", &dev->opb_bus_freq, 1)) in emac_init_config()
2880 if (emac_read_uint_prop(np, "tah-device", &dev->tah_ph, 0)) in emac_init_config()
2881 dev->tah_ph = 0; in emac_init_config()
2882 if (emac_read_uint_prop(np, "tah-channel", &dev->tah_port, 0)) in emac_init_config()
2883 dev->tah_port = 0; in emac_init_config()
2884 if (emac_read_uint_prop(np, "mdio-device", &dev->mdio_ph, 0)) in emac_init_config()
2885 dev->mdio_ph = 0; in emac_init_config()
2886 if (emac_read_uint_prop(np, "zmii-device", &dev->zmii_ph, 0)) in emac_init_config()
2887 dev->zmii_ph = 0; in emac_init_config()
2888 if (emac_read_uint_prop(np, "zmii-channel", &dev->zmii_port, 0)) in emac_init_config()
2889 dev->zmii_port = 0xffffffff; in emac_init_config()
2890 if (emac_read_uint_prop(np, "rgmii-device", &dev->rgmii_ph, 0)) in emac_init_config()
2891 dev->rgmii_ph = 0; in emac_init_config()
2892 if (emac_read_uint_prop(np, "rgmii-channel", &dev->rgmii_port, 0)) in emac_init_config()
2893 dev->rgmii_port = 0xffffffff; in emac_init_config()
2894 if (emac_read_uint_prop(np, "fifo-entry-size", &dev->fifo_entry_size, 0)) in emac_init_config()
2895 dev->fifo_entry_size = 16; in emac_init_config()
2896 if (emac_read_uint_prop(np, "mal-burst-size", &dev->mal_burst_size, 0)) in emac_init_config()
2897 dev->mal_burst_size = 256; in emac_init_config()
2900 err = of_get_phy_mode(np, &dev->phy_mode); in emac_init_config()
2902 dev->phy_mode = PHY_INTERFACE_MODE_NA; in emac_init_config()
2906 dev->features |= (EMAC_FTR_EMAC4 | EMAC_FTR_EMAC4SYNC); in emac_init_config()
2909 dev->features |= EMAC_FTR_460EX_PHY_CLK_FIX; in emac_init_config()
2912 dev->features |= EMAC_FTR_440EP_PHY_CLK_FIX; in emac_init_config()
2914 dev->features |= (EMAC_APM821XX_REQ_JUMBO_FRAME_SIZE | in emac_init_config()
2919 dev->features |= EMAC_FTR_EMAC4; in emac_init_config()
2921 dev->features |= EMAC_FTR_440GX_PHY_CLK_FIX; in emac_init_config()
2925 dev->features |= EMAC_FTR_440EP_PHY_CLK_FIX; in emac_init_config()
2928 dev->features |= EMAC_FTR_NO_FLOW_CONTROL_40x; in emac_init_config()
2940 dev->features |= EMAC_FTR_STACR_OC_INVERT; in emac_init_config()
2942 dev->features |= EMAC_FTR_HAS_NEW_STACR; in emac_init_config()
2946 dev->features |= EMAC_FTR_HAS_NEW_STACR | in emac_init_config()
2950 if (dev->tah_ph != 0) { in emac_init_config()
2952 dev->features |= EMAC_FTR_HAS_TAH; in emac_init_config()
2959 if (dev->zmii_ph != 0) { in emac_init_config()
2961 dev->features |= EMAC_FTR_HAS_ZMII; in emac_init_config()
2968 if (dev->rgmii_ph != 0) { in emac_init_config()
2970 dev->features |= EMAC_FTR_HAS_RGMII; in emac_init_config()
2984 memcpy(dev->ndev->dev_addr, p, ETH_ALEN); in emac_init_config()
2987 if (emac_has_feature(dev, EMAC_FTR_EMAC4SYNC)) { in emac_init_config()
2988 dev->xaht_slots_shift = EMAC4SYNC_XAHT_SLOTS_SHIFT; in emac_init_config()
2989 dev->xaht_width_shift = EMAC4SYNC_XAHT_WIDTH_SHIFT; in emac_init_config()
2991 dev->xaht_slots_shift = EMAC4_XAHT_SLOTS_SHIFT; in emac_init_config()
2992 dev->xaht_width_shift = EMAC4_XAHT_WIDTH_SHIFT; in emac_init_config()
2996 if (WARN_ON(EMAC_XAHT_REGS(dev) > EMAC_XAHT_MAX_REGS)) in emac_init_config()
2999 DBG(dev, "features : 0x%08x / 0x%08x\n", dev->features, EMAC_FTRS_POSSIBLE); in emac_init_config()
3000 DBG(dev, "tx_fifo_size : %d (%d gige)\n", dev->tx_fifo_size, dev->tx_fifo_size_gige); in emac_init_config()
3001 DBG(dev, "rx_fifo_size : %d (%d gige)\n", dev->rx_fifo_size, dev->rx_fifo_size_gige); in emac_init_config()
3002 DBG(dev, "max_mtu : %d\n", dev->max_mtu); in emac_init_config()
3003 DBG(dev, "OPB freq : %d\n", dev->opb_bus_freq); in emac_init_config()
3036 struct emac_instance *dev; in emac_probe() local
3037 struct device_node *np = ofdev->dev.of_node; in emac_probe()
3059 dev = netdev_priv(ndev); in emac_probe()
3060 dev->ndev = ndev; in emac_probe()
3061 dev->ofdev = ofdev; in emac_probe()
3062 dev->blist = blist; in emac_probe()
3063 SET_NETDEV_DEV(ndev, &ofdev->dev); in emac_probe()
3066 mutex_init(&dev->mdio_lock); in emac_probe()
3067 mutex_init(&dev->link_lock); in emac_probe()
3068 spin_lock_init(&dev->lock); in emac_probe()
3069 INIT_WORK(&dev->reset_work, emac_reset_work); in emac_probe()
3072 err = emac_init_config(dev); in emac_probe()
3077 dev->emac_irq = irq_of_parse_and_map(np, 0); in emac_probe()
3078 dev->wol_irq = irq_of_parse_and_map(np, 1); in emac_probe()
3079 if (!dev->emac_irq) { in emac_probe()
3084 ndev->irq = dev->emac_irq; in emac_probe()
3088 dev->emacp = of_iomap(np, 0); in emac_probe()
3089 if (dev->emacp == NULL) { in emac_probe()
3096 err = emac_wait_deps(dev); in emac_probe()
3103 dev->mal = platform_get_drvdata(dev->mal_dev); in emac_probe()
3104 if (dev->mdio_dev != NULL) in emac_probe()
3105 dev->mdio_instance = platform_get_drvdata(dev->mdio_dev); in emac_probe()
3108 dev->commac.ops = &emac_commac_ops; in emac_probe()
3109 dev->commac.dev = dev; in emac_probe()
3110 dev->commac.tx_chan_mask = MAL_CHAN_MASK(dev->mal_tx_chan); in emac_probe()
3111 dev->commac.rx_chan_mask = MAL_CHAN_MASK(dev->mal_rx_chan); in emac_probe()
3112 err = mal_register_commac(dev->mal, &dev->commac); in emac_probe()
3115 np, dev->mal_dev->dev.of_node); in emac_probe()
3118 dev->rx_skb_size = emac_rx_skb_size(ndev->mtu); in emac_probe()
3119 dev->rx_sync_size = emac_rx_sync_size(ndev->mtu); in emac_probe()
3122 dev->tx_desc = in emac_probe()
3123 dev->mal->bd_virt + mal_tx_bd_offset(dev->mal, dev->mal_tx_chan); in emac_probe()
3124 dev->rx_desc = in emac_probe()
3125 dev->mal->bd_virt + mal_rx_bd_offset(dev->mal, dev->mal_rx_chan); in emac_probe()
3127 DBG(dev, "tx_desc %p" NL, dev->tx_desc); in emac_probe()
3128 DBG(dev, "rx_desc %p" NL, dev->rx_desc); in emac_probe()
3131 memset(dev->tx_desc, 0, NUM_TX_BUFF * sizeof(struct mal_descriptor)); in emac_probe()
3132 memset(dev->rx_desc, 0, NUM_RX_BUFF * sizeof(struct mal_descriptor)); in emac_probe()
3133 memset(dev->tx_skb, 0, NUM_TX_BUFF * sizeof(struct sk_buff *)); in emac_probe()
3134 memset(dev->rx_skb, 0, NUM_RX_BUFF * sizeof(struct sk_buff *)); in emac_probe()
3137 if (emac_has_feature(dev, EMAC_FTR_HAS_ZMII) && in emac_probe()
3138 (err = zmii_attach(dev->zmii_dev, dev->zmii_port, &dev->phy_mode)) != 0) in emac_probe()
3142 if (emac_has_feature(dev, EMAC_FTR_HAS_RGMII) && in emac_probe()
3143 (err = rgmii_attach(dev->rgmii_dev, dev->rgmii_port, dev->phy_mode)) != 0) in emac_probe()
3147 if (emac_has_feature(dev, EMAC_FTR_HAS_TAH) && in emac_probe()
3148 (err = tah_attach(dev->tah_dev, dev->tah_port)) != 0) in emac_probe()
3152 dev->phy.speed = SPEED_100; in emac_probe()
3153 dev->phy.duplex = DUPLEX_FULL; in emac_probe()
3154 dev->phy.autoneg = AUTONEG_DISABLE; in emac_probe()
3155 dev->phy.pause = dev->phy.asym_pause = 0; in emac_probe()
3156 dev->stop_timeout = STOP_TIMEOUT_100; in emac_probe()
3157 INIT_DELAYED_WORK(&dev->link_work, emac_link_timer); in emac_probe()
3160 if (emac_has_feature(dev, EMAC_FTR_APM821XX_NO_HALF_DUPLEX)) { in emac_probe()
3161 dev->phy_feat_exc = (SUPPORTED_1000baseT_Half | in emac_probe()
3167 err = emac_init_phy(dev); in emac_probe()
3171 if (dev->tah_dev) { in emac_probe()
3176 if (emac_phy_supports_gige(dev->phy_mode)) { in emac_probe()
3178 dev->commac.ops = &emac_commac_sg_ops; in emac_probe()
3185 ndev->max_mtu = dev->max_mtu; in emac_probe()
3200 platform_set_drvdata(ofdev, dev); in emac_probe()
3207 ndev->name, dev->cell_index, np, ndev->dev_addr); in emac_probe()
3209 if (dev->phy_mode == PHY_INTERFACE_MODE_SGMII) in emac_probe()
3212 if (dev->phy.address >= 0) in emac_probe()
3214 dev->phy.def->name, dev->phy.address); in emac_probe()
3222 if (emac_has_feature(dev, EMAC_FTR_HAS_TAH)) in emac_probe()
3223 tah_detach(dev->tah_dev, dev->tah_port); in emac_probe()
3225 if (emac_has_feature(dev, EMAC_FTR_HAS_RGMII)) in emac_probe()
3226 rgmii_detach(dev->rgmii_dev, dev->rgmii_port); in emac_probe()
3228 if (emac_has_feature(dev, EMAC_FTR_HAS_ZMII)) in emac_probe()
3229 zmii_detach(dev->zmii_dev, dev->zmii_port); in emac_probe()
3231 mal_unregister_commac(dev->mal, &dev->commac); in emac_probe()
3233 emac_put_deps(dev); in emac_probe()
3235 iounmap(dev->emacp); in emac_probe()
3237 if (dev->wol_irq) in emac_probe()
3238 irq_dispose_mapping(dev->wol_irq); in emac_probe()
3239 if (dev->emac_irq) in emac_probe()
3240 irq_dispose_mapping(dev->emac_irq); in emac_probe()
3257 struct emac_instance *dev = platform_get_drvdata(ofdev); in emac_remove() local
3259 DBG(dev, "remove" NL); in emac_remove()
3261 unregister_netdev(dev->ndev); in emac_remove()
3263 cancel_work_sync(&dev->reset_work); in emac_remove()
3265 if (emac_has_feature(dev, EMAC_FTR_HAS_TAH)) in emac_remove()
3266 tah_detach(dev->tah_dev, dev->tah_port); in emac_remove()
3267 if (emac_has_feature(dev, EMAC_FTR_HAS_RGMII)) in emac_remove()
3268 rgmii_detach(dev->rgmii_dev, dev->rgmii_port); in emac_remove()
3269 if (emac_has_feature(dev, EMAC_FTR_HAS_ZMII)) in emac_remove()
3270 zmii_detach(dev->zmii_dev, dev->zmii_port); in emac_remove()
3272 if (dev->phy_dev) in emac_remove()
3273 phy_disconnect(dev->phy_dev); in emac_remove()
3275 if (dev->mii_bus) in emac_remove()
3276 mdiobus_unregister(dev->mii_bus); in emac_remove()
3278 busy_phy_map &= ~(1 << dev->phy.address); in emac_remove()
3279 DBG(dev, "busy_phy_map now %#x" NL, busy_phy_map); in emac_remove()
3281 mal_unregister_commac(dev->mal, &dev->commac); in emac_remove()
3282 emac_put_deps(dev); in emac_remove()
3284 iounmap(dev->emacp); in emac_remove()
3286 if (dev->wol_irq) in emac_remove()
3287 irq_dispose_mapping(dev->wol_irq); in emac_remove()
3288 if (dev->emac_irq) in emac_remove()
3289 irq_dispose_mapping(dev->emac_irq); in emac_remove()
3291 free_netdev(dev->ndev); in emac_remove()