Lines Matching full:gp
117 static u16 __sungem_phy_read(struct gem *gp, int phy_addr, int reg) in __sungem_phy_read() argument
127 writel(cmd, gp->regs + MIF_FRAME); in __sungem_phy_read()
130 cmd = readl(gp->regs + MIF_FRAME); in __sungem_phy_read()
145 struct gem *gp = netdev_priv(dev); in _sungem_phy_read() local
146 return __sungem_phy_read(gp, mii_id, reg); in _sungem_phy_read()
149 static inline u16 sungem_phy_read(struct gem *gp, int reg) in sungem_phy_read() argument
151 return __sungem_phy_read(gp, gp->mii_phy_addr, reg); in sungem_phy_read()
154 static void __sungem_phy_write(struct gem *gp, int phy_addr, int reg, u16 val) in __sungem_phy_write() argument
165 writel(cmd, gp->regs + MIF_FRAME); in __sungem_phy_write()
168 cmd = readl(gp->regs + MIF_FRAME); in __sungem_phy_write()
178 struct gem *gp = netdev_priv(dev); in _sungem_phy_write() local
179 __sungem_phy_write(gp, mii_id, reg, val & 0xffff); in _sungem_phy_write()
182 static inline void sungem_phy_write(struct gem *gp, int reg, u16 val) in sungem_phy_write() argument
184 __sungem_phy_write(gp, gp->mii_phy_addr, reg, val); in sungem_phy_write()
187 static inline void gem_enable_ints(struct gem *gp) in gem_enable_ints() argument
190 writel(GREG_STAT_TXDONE, gp->regs + GREG_IMASK); in gem_enable_ints()
193 static inline void gem_disable_ints(struct gem *gp) in gem_disable_ints() argument
196 writel(GREG_STAT_NAPI | GREG_STAT_TXDONE, gp->regs + GREG_IMASK); in gem_disable_ints()
197 (void)readl(gp->regs + GREG_IMASK); /* write posting */ in gem_disable_ints()
200 static void gem_get_cell(struct gem *gp) in gem_get_cell() argument
202 BUG_ON(gp->cell_enabled < 0); in gem_get_cell()
203 gp->cell_enabled++; in gem_get_cell()
205 if (gp->cell_enabled == 1) { in gem_get_cell()
207 pmac_call_feature(PMAC_FTR_GMAC_ENABLE, gp->of_node, 0, 1); in gem_get_cell()
214 static void gem_put_cell(struct gem *gp) in gem_put_cell() argument
216 BUG_ON(gp->cell_enabled <= 0); in gem_put_cell()
217 gp->cell_enabled--; in gem_put_cell()
219 if (gp->cell_enabled == 0) { in gem_put_cell()
221 pmac_call_feature(PMAC_FTR_GMAC_ENABLE, gp->of_node, 0, 0); in gem_put_cell()
227 static inline void gem_netif_stop(struct gem *gp) in gem_netif_stop() argument
229 netif_trans_update(gp->dev); /* prevent tx timeout */ in gem_netif_stop()
230 napi_disable(&gp->napi); in gem_netif_stop()
231 netif_tx_disable(gp->dev); in gem_netif_stop()
234 static inline void gem_netif_start(struct gem *gp) in gem_netif_start() argument
240 netif_wake_queue(gp->dev); in gem_netif_start()
241 napi_enable(&gp->napi); in gem_netif_start()
244 static void gem_schedule_reset(struct gem *gp) in gem_schedule_reset() argument
246 gp->reset_task_pending = 1; in gem_schedule_reset()
247 schedule_work(&gp->reset_task); in gem_schedule_reset()
250 static void gem_handle_mif_event(struct gem *gp, u32 reg_val, u32 changed_bits) in gem_handle_mif_event() argument
252 if (netif_msg_intr(gp)) in gem_handle_mif_event()
253 printk(KERN_DEBUG "%s: mif interrupt\n", gp->dev->name); in gem_handle_mif_event()
256 static int gem_pcs_interrupt(struct net_device *dev, struct gem *gp, u32 gem_status) in gem_pcs_interrupt() argument
258 u32 pcs_istat = readl(gp->regs + PCS_ISTAT); in gem_pcs_interrupt()
261 if (netif_msg_intr(gp)) in gem_pcs_interrupt()
263 gp->dev->name, pcs_istat); in gem_pcs_interrupt()
274 pcs_miistat = readl(gp->regs + PCS_MIISTAT); in gem_pcs_interrupt()
277 (readl(gp->regs + PCS_MIISTAT) & in gem_pcs_interrupt()
292 netif_carrier_on(gp->dev); in gem_pcs_interrupt()
295 netif_carrier_off(gp->dev); in gem_pcs_interrupt()
299 if (!timer_pending(&gp->link_timer)) in gem_pcs_interrupt()
306 static int gem_txmac_interrupt(struct net_device *dev, struct gem *gp, u32 gem_status) in gem_txmac_interrupt() argument
308 u32 txmac_stat = readl(gp->regs + MAC_TXSTAT); in gem_txmac_interrupt()
310 if (netif_msg_intr(gp)) in gem_txmac_interrupt()
312 gp->dev->name, txmac_stat); in gem_txmac_interrupt()
359 static int gem_rxmac_reset(struct gem *gp) in gem_rxmac_reset() argument
361 struct net_device *dev = gp->dev; in gem_rxmac_reset()
367 writel(MAC_RXRST_CMD, gp->regs + MAC_RXRST); in gem_rxmac_reset()
369 if (!(readl(gp->regs + MAC_RXRST) & MAC_RXRST_CMD)) in gem_rxmac_reset()
378 writel(gp->mac_rx_cfg & ~MAC_RXCFG_ENAB, in gem_rxmac_reset()
379 gp->regs + MAC_RXCFG); in gem_rxmac_reset()
381 if (!(readl(gp->regs + MAC_RXCFG) & MAC_RXCFG_ENAB)) in gem_rxmac_reset()
391 writel(0, gp->regs + RXDMA_CFG); in gem_rxmac_reset()
393 if (!(readl(gp->regs + RXDMA_CFG) & RXDMA_CFG_ENABLE)) in gem_rxmac_reset()
405 writel(gp->swrst_base | GREG_SWRST_RXRST, in gem_rxmac_reset()
406 gp->regs + GREG_SWRST); in gem_rxmac_reset()
408 if (!(readl(gp->regs + GREG_SWRST) & GREG_SWRST_RXRST)) in gem_rxmac_reset()
419 struct gem_rxd *rxd = &gp->init_block->rxd[i]; in gem_rxmac_reset()
421 if (gp->rx_skbs[i] == NULL) { in gem_rxmac_reset()
426 rxd->status_word = cpu_to_le64(RXDCTRL_FRESH(gp)); in gem_rxmac_reset()
428 gp->rx_new = gp->rx_old = 0; in gem_rxmac_reset()
431 desc_dma = (u64) gp->gblock_dvma; in gem_rxmac_reset()
433 writel(desc_dma >> 32, gp->regs + RXDMA_DBHI); in gem_rxmac_reset()
434 writel(desc_dma & 0xffffffff, gp->regs + RXDMA_DBLOW); in gem_rxmac_reset()
435 writel(RX_RING_SIZE - 4, gp->regs + RXDMA_KICK); in gem_rxmac_reset()
438 writel(val, gp->regs + RXDMA_CFG); in gem_rxmac_reset()
439 if (readl(gp->regs + GREG_BIFCFG) & GREG_BIFCFG_M66EN) in gem_rxmac_reset()
442 gp->regs + RXDMA_BLANK); in gem_rxmac_reset()
446 gp->regs + RXDMA_BLANK); in gem_rxmac_reset()
447 val = (((gp->rx_pause_off / 64) << 0) & RXDMA_PTHRESH_OFF); in gem_rxmac_reset()
448 val |= (((gp->rx_pause_on / 64) << 12) & RXDMA_PTHRESH_ON); in gem_rxmac_reset()
449 writel(val, gp->regs + RXDMA_PTHRESH); in gem_rxmac_reset()
450 val = readl(gp->regs + RXDMA_CFG); in gem_rxmac_reset()
451 writel(val | RXDMA_CFG_ENABLE, gp->regs + RXDMA_CFG); in gem_rxmac_reset()
452 writel(MAC_RXSTAT_RCV, gp->regs + MAC_RXMASK); in gem_rxmac_reset()
453 val = readl(gp->regs + MAC_RXCFG); in gem_rxmac_reset()
454 writel(val | MAC_RXCFG_ENAB, gp->regs + MAC_RXCFG); in gem_rxmac_reset()
459 static int gem_rxmac_interrupt(struct net_device *dev, struct gem *gp, u32 gem_status) in gem_rxmac_interrupt() argument
461 u32 rxmac_stat = readl(gp->regs + MAC_RXSTAT); in gem_rxmac_interrupt()
464 if (netif_msg_intr(gp)) in gem_rxmac_interrupt()
466 gp->dev->name, rxmac_stat); in gem_rxmac_interrupt()
469 u32 smac = readl(gp->regs + MAC_SMACHINE); in gem_rxmac_interrupt()
475 ret = gem_rxmac_reset(gp); in gem_rxmac_interrupt()
493 static int gem_mac_interrupt(struct net_device *dev, struct gem *gp, u32 gem_status) in gem_mac_interrupt() argument
495 u32 mac_cstat = readl(gp->regs + MAC_CSTAT); in gem_mac_interrupt()
497 if (netif_msg_intr(gp)) in gem_mac_interrupt()
499 gp->dev->name, mac_cstat); in gem_mac_interrupt()
506 gp->pause_entered++; in gem_mac_interrupt()
509 gp->pause_last_time_recvd = (mac_cstat >> 16); in gem_mac_interrupt()
514 static int gem_mif_interrupt(struct net_device *dev, struct gem *gp, u32 gem_status) in gem_mif_interrupt() argument
516 u32 mif_status = readl(gp->regs + MIF_STATUS); in gem_mif_interrupt()
522 gem_handle_mif_event(gp, reg_val, changed_bits); in gem_mif_interrupt()
527 static int gem_pci_interrupt(struct net_device *dev, struct gem *gp, u32 gem_status) in gem_pci_interrupt() argument
529 u32 pci_estat = readl(gp->regs + GREG_PCIESTAT); in gem_pci_interrupt()
531 if (gp->pdev->vendor == PCI_VENDOR_ID_SUN && in gem_pci_interrupt()
532 gp->pdev->device == PCI_DEVICE_ID_SUN_GEM) { in gem_pci_interrupt()
553 pci_errs = pci_status_get_and_clear_errors(gp->pdev); in gem_pci_interrupt()
578 static int gem_abnormal_irq(struct net_device *dev, struct gem *gp, u32 gem_status) in gem_abnormal_irq() argument
582 if (netif_msg_rx_err(gp)) in gem_abnormal_irq()
584 gp->dev->name); in gem_abnormal_irq()
590 if (netif_msg_rx_err(gp)) in gem_abnormal_irq()
592 gp->dev->name); in gem_abnormal_irq()
599 if (gem_pcs_interrupt(dev, gp, gem_status)) in gem_abnormal_irq()
604 if (gem_txmac_interrupt(dev, gp, gem_status)) in gem_abnormal_irq()
609 if (gem_rxmac_interrupt(dev, gp, gem_status)) in gem_abnormal_irq()
614 if (gem_mac_interrupt(dev, gp, gem_status)) in gem_abnormal_irq()
619 if (gem_mif_interrupt(dev, gp, gem_status)) in gem_abnormal_irq()
624 if (gem_pci_interrupt(dev, gp, gem_status)) in gem_abnormal_irq()
631 static __inline__ void gem_tx(struct net_device *dev, struct gem *gp, u32 gem_status) in gem_tx() argument
635 entry = gp->tx_old; in gem_tx()
644 if (netif_msg_tx_done(gp)) in gem_tx()
646 gp->dev->name, entry); in gem_tx()
647 skb = gp->tx_skbs[entry]; in gem_tx()
664 gp->tx_skbs[entry] = NULL; in gem_tx()
668 txd = &gp->init_block->txd[entry]; in gem_tx()
673 dma_unmap_page(&gp->pdev->dev, dma_addr, dma_len, in gem_tx()
681 gp->tx_old = entry; in gem_tx()
691 TX_BUFFS_AVAIL(gp) > (MAX_SKB_FRAGS + 1))) { in gem_tx()
696 TX_BUFFS_AVAIL(gp) > (MAX_SKB_FRAGS + 1)) in gem_tx()
702 static __inline__ void gem_post_rxds(struct gem *gp, int limit) in gem_post_rxds() argument
706 cluster_start = curr = (gp->rx_new & ~(4 - 1)); in gem_post_rxds()
714 &gp->init_block->rxd[cluster_start]; in gem_post_rxds()
716 rxd->status_word = cpu_to_le64(RXDCTRL_FRESH(gp)); in gem_post_rxds()
728 writel(kick, gp->regs + RXDMA_KICK); in gem_post_rxds()
746 static int gem_rx(struct gem *gp, int work_to_do) in gem_rx() argument
748 struct net_device *dev = gp->dev; in gem_rx()
752 if (netif_msg_rx_status(gp)) in gem_rx()
754 gp->dev->name, readl(gp->regs + RXDMA_DONE), gp->rx_new); in gem_rx()
756 entry = gp->rx_new; in gem_rx()
758 done = readl(gp->regs + RXDMA_DONE); in gem_rx()
760 struct gem_rxd *rxd = &gp->init_block->rxd[entry]; in gem_rx()
780 done = readl(gp->regs + RXDMA_DONE); in gem_rx()
788 skb = gp->rx_skbs[entry]; in gem_rx()
808 new_skb = gem_alloc_skb(dev, RX_BUF_ALLOC_SIZE(gp), GFP_ATOMIC); in gem_rx()
813 dma_unmap_page(&gp->pdev->dev, dma_addr, in gem_rx()
814 RX_BUF_ALLOC_SIZE(gp), DMA_FROM_DEVICE); in gem_rx()
815 gp->rx_skbs[entry] = new_skb; in gem_rx()
816 skb_put(new_skb, (gp->rx_buf_sz + RX_OFFSET)); in gem_rx()
817 rxd->buffer = cpu_to_le64(dma_map_page(&gp->pdev->dev, in gem_rx()
820 RX_BUF_ALLOC_SIZE(gp), in gem_rx()
836 dma_sync_single_for_cpu(&gp->pdev->dev, dma_addr, len, in gem_rx()
839 dma_sync_single_for_device(&gp->pdev->dev, dma_addr, in gem_rx()
853 skb->protocol = eth_type_trans(skb, gp->dev); in gem_rx()
855 napi_gro_receive(&gp->napi, skb); in gem_rx()
864 gem_post_rxds(gp, entry); in gem_rx()
866 gp->rx_new = entry; in gem_rx()
869 netdev_info(gp->dev, "Memory squeeze, deferring packet\n"); in gem_rx()
876 struct gem *gp = container_of(napi, struct gem, napi); in gem_poll() local
877 struct net_device *dev = gp->dev; in gem_poll()
883 if (unlikely(gp->status & GREG_STAT_ABNORMAL)) { in gem_poll()
893 reset = gem_abnormal_irq(dev, gp, gp->status); in gem_poll()
896 gem_schedule_reset(gp); in gem_poll()
903 gem_tx(dev, gp, gp->status); in gem_poll()
910 work_done += gem_rx(gp, budget - work_done); in gem_poll()
915 gp->status = readl(gp->regs + GREG_STAT); in gem_poll()
916 } while (gp->status & GREG_STAT_NAPI); in gem_poll()
919 gem_enable_ints(gp); in gem_poll()
927 struct gem *gp = netdev_priv(dev); in gem_interrupt() local
929 if (napi_schedule_prep(&gp->napi)) { in gem_interrupt()
930 u32 gem_status = readl(gp->regs + GREG_STAT); in gem_interrupt()
933 napi_enable(&gp->napi); in gem_interrupt()
936 if (netif_msg_intr(gp)) in gem_interrupt()
938 gp->dev->name, gem_status); in gem_interrupt()
940 gp->status = gem_status; in gem_interrupt()
941 gem_disable_ints(gp); in gem_interrupt()
942 __napi_schedule(&gp->napi); in gem_interrupt()
955 struct gem *gp = netdev_priv(dev); in gem_poll_controller() local
957 disable_irq(gp->pdev->irq); in gem_poll_controller()
958 gem_interrupt(gp->pdev->irq, dev); in gem_poll_controller()
959 enable_irq(gp->pdev->irq); in gem_poll_controller()
965 struct gem *gp = netdev_priv(dev); in gem_tx_timeout() local
970 readl(gp->regs + TXDMA_CFG), in gem_tx_timeout()
971 readl(gp->regs + MAC_TXSTAT), in gem_tx_timeout()
972 readl(gp->regs + MAC_TXCFG)); in gem_tx_timeout()
974 readl(gp->regs + RXDMA_CFG), in gem_tx_timeout()
975 readl(gp->regs + MAC_RXSTAT), in gem_tx_timeout()
976 readl(gp->regs + MAC_RXCFG)); in gem_tx_timeout()
978 gem_schedule_reset(gp); in gem_tx_timeout()
993 struct gem *gp = netdev_priv(dev); in gem_start_xmit() local
1007 if (unlikely(TX_BUFFS_AVAIL(gp) <= (skb_shinfo(skb)->nr_frags + 1))) { in gem_start_xmit()
1016 entry = gp->tx_new; in gem_start_xmit()
1017 gp->tx_skbs[entry] = skb; in gem_start_xmit()
1020 struct gem_txd *txd = &gp->init_block->txd[entry]; in gem_start_xmit()
1025 mapping = dma_map_page(&gp->pdev->dev, in gem_start_xmit()
1051 first_mapping = dma_map_page(&gp->pdev->dev, in gem_start_xmit()
1064 mapping = skb_frag_dma_map(&gp->pdev->dev, this_frag, in gem_start_xmit()
1070 txd = &gp->init_block->txd[entry]; in gem_start_xmit()
1080 txd = &gp->init_block->txd[first_entry]; in gem_start_xmit()
1087 gp->tx_new = entry; in gem_start_xmit()
1088 if (unlikely(TX_BUFFS_AVAIL(gp) <= (MAX_SKB_FRAGS + 1))) { in gem_start_xmit()
1097 if (TX_BUFFS_AVAIL(gp) > (MAX_SKB_FRAGS + 1)) in gem_start_xmit()
1100 if (netif_msg_tx_queued(gp)) in gem_start_xmit()
1104 writel(gp->tx_new, gp->regs + TXDMA_KICK); in gem_start_xmit()
1109 static void gem_pcs_reset(struct gem *gp) in gem_pcs_reset() argument
1115 val = readl(gp->regs + PCS_MIICTRL); in gem_pcs_reset()
1117 writel(val, gp->regs + PCS_MIICTRL); in gem_pcs_reset()
1120 while (readl(gp->regs + PCS_MIICTRL) & PCS_MIICTRL_RST) { in gem_pcs_reset()
1126 netdev_warn(gp->dev, "PCS reset bit would not clear\n"); in gem_pcs_reset()
1129 static void gem_pcs_reinit_adv(struct gem *gp) in gem_pcs_reinit_adv() argument
1136 val = readl(gp->regs + PCS_CFG); in gem_pcs_reinit_adv()
1138 writel(val, gp->regs + PCS_CFG); in gem_pcs_reinit_adv()
1143 val = readl(gp->regs + PCS_MIIADV); in gem_pcs_reinit_adv()
1146 writel(val, gp->regs + PCS_MIIADV); in gem_pcs_reinit_adv()
1151 val = readl(gp->regs + PCS_MIICTRL); in gem_pcs_reinit_adv()
1154 writel(val, gp->regs + PCS_MIICTRL); in gem_pcs_reinit_adv()
1156 val = readl(gp->regs + PCS_CFG); in gem_pcs_reinit_adv()
1158 writel(val, gp->regs + PCS_CFG); in gem_pcs_reinit_adv()
1164 val = readl(gp->regs + PCS_SCTRL); in gem_pcs_reinit_adv()
1165 if (gp->phy_type == phy_serialink) in gem_pcs_reinit_adv()
1169 writel(val, gp->regs + PCS_SCTRL); in gem_pcs_reinit_adv()
1174 static void gem_reset(struct gem *gp) in gem_reset() argument
1180 writel(0xffffffff, gp->regs + GREG_IMASK); in gem_reset()
1183 writel(gp->swrst_base | GREG_SWRST_TXRST | GREG_SWRST_RXRST, in gem_reset()
1184 gp->regs + GREG_SWRST); in gem_reset()
1190 val = readl(gp->regs + GREG_SWRST); in gem_reset()
1196 netdev_err(gp->dev, "SW reset is ghetto\n"); in gem_reset()
1198 if (gp->phy_type == phy_serialink || gp->phy_type == phy_serdes) in gem_reset()
1199 gem_pcs_reinit_adv(gp); in gem_reset()
1202 static void gem_start_dma(struct gem *gp) in gem_start_dma() argument
1207 val = readl(gp->regs + TXDMA_CFG); in gem_start_dma()
1208 writel(val | TXDMA_CFG_ENABLE, gp->regs + TXDMA_CFG); in gem_start_dma()
1209 val = readl(gp->regs + RXDMA_CFG); in gem_start_dma()
1210 writel(val | RXDMA_CFG_ENABLE, gp->regs + RXDMA_CFG); in gem_start_dma()
1211 val = readl(gp->regs + MAC_TXCFG); in gem_start_dma()
1212 writel(val | MAC_TXCFG_ENAB, gp->regs + MAC_TXCFG); in gem_start_dma()
1213 val = readl(gp->regs + MAC_RXCFG); in gem_start_dma()
1214 writel(val | MAC_RXCFG_ENAB, gp->regs + MAC_RXCFG); in gem_start_dma()
1216 (void) readl(gp->regs + MAC_RXCFG); in gem_start_dma()
1219 gem_enable_ints(gp); in gem_start_dma()
1221 writel(RX_RING_SIZE - 4, gp->regs + RXDMA_KICK); in gem_start_dma()
1226 static void gem_stop_dma(struct gem *gp) in gem_stop_dma() argument
1231 val = readl(gp->regs + TXDMA_CFG); in gem_stop_dma()
1232 writel(val & ~TXDMA_CFG_ENABLE, gp->regs + TXDMA_CFG); in gem_stop_dma()
1233 val = readl(gp->regs + RXDMA_CFG); in gem_stop_dma()
1234 writel(val & ~RXDMA_CFG_ENABLE, gp->regs + RXDMA_CFG); in gem_stop_dma()
1235 val = readl(gp->regs + MAC_TXCFG); in gem_stop_dma()
1236 writel(val & ~MAC_TXCFG_ENAB, gp->regs + MAC_TXCFG); in gem_stop_dma()
1237 val = readl(gp->regs + MAC_RXCFG); in gem_stop_dma()
1238 writel(val & ~MAC_RXCFG_ENAB, gp->regs + MAC_RXCFG); in gem_stop_dma()
1240 (void) readl(gp->regs + MAC_RXCFG); in gem_stop_dma()
1247 static void gem_begin_auto_negotiation(struct gem *gp, in gem_begin_auto_negotiation() argument
1260 if (gp->phy_type != phy_mii_mdio0 && in gem_begin_auto_negotiation()
1261 gp->phy_type != phy_mii_mdio1) in gem_begin_auto_negotiation()
1265 if (found_mii_phy(gp)) in gem_begin_auto_negotiation()
1266 features = gp->phy_mii.def->features; in gem_begin_auto_negotiation()
1271 if (gp->phy_mii.advertising != 0) in gem_begin_auto_negotiation()
1272 advertise &= gp->phy_mii.advertising; in gem_begin_auto_negotiation()
1274 autoneg = gp->want_autoneg; in gem_begin_auto_negotiation()
1275 speed = gp->phy_mii.speed; in gem_begin_auto_negotiation()
1276 duplex = gp->phy_mii.duplex; in gem_begin_auto_negotiation()
1311 if (!netif_device_present(gp->dev)) { in gem_begin_auto_negotiation()
1312 gp->phy_mii.autoneg = gp->want_autoneg = autoneg; in gem_begin_auto_negotiation()
1313 gp->phy_mii.speed = speed; in gem_begin_auto_negotiation()
1314 gp->phy_mii.duplex = duplex; in gem_begin_auto_negotiation()
1319 gp->want_autoneg = autoneg; in gem_begin_auto_negotiation()
1321 if (found_mii_phy(gp)) in gem_begin_auto_negotiation()
1322 gp->phy_mii.def->ops->setup_aneg(&gp->phy_mii, advertise); in gem_begin_auto_negotiation()
1323 gp->lstate = link_aneg; in gem_begin_auto_negotiation()
1325 if (found_mii_phy(gp)) in gem_begin_auto_negotiation()
1326 gp->phy_mii.def->ops->setup_forced(&gp->phy_mii, speed, duplex); in gem_begin_auto_negotiation()
1327 gp->lstate = link_force_ok; in gem_begin_auto_negotiation()
1331 gp->timer_ticks = 0; in gem_begin_auto_negotiation()
1332 mod_timer(&gp->link_timer, jiffies + ((12 * HZ) / 10)); in gem_begin_auto_negotiation()
1338 static int gem_set_link_modes(struct gem *gp) in gem_set_link_modes() argument
1340 struct netdev_queue *txq = netdev_get_tx_queue(gp->dev, 0); in gem_set_link_modes()
1348 if (found_mii_phy(gp)) { in gem_set_link_modes()
1349 if (gp->phy_mii.def->ops->read_link(&gp->phy_mii)) in gem_set_link_modes()
1351 full_duplex = (gp->phy_mii.duplex == DUPLEX_FULL); in gem_set_link_modes()
1352 speed = gp->phy_mii.speed; in gem_set_link_modes()
1353 pause = gp->phy_mii.pause; in gem_set_link_modes()
1354 } else if (gp->phy_type == phy_serialink || in gem_set_link_modes()
1355 gp->phy_type == phy_serdes) { in gem_set_link_modes()
1356 u32 pcs_lpa = readl(gp->regs + PCS_MIILP); in gem_set_link_modes()
1358 if ((pcs_lpa & PCS_MIIADV_FD) || gp->phy_type == phy_serdes) in gem_set_link_modes()
1363 netif_info(gp, link, gp->dev, "Link is up at %d Mbps, %s-duplex\n", in gem_set_link_modes()
1378 writel(val, gp->regs + MAC_TXCFG); in gem_set_link_modes()
1382 (gp->phy_type == phy_mii_mdio0 || in gem_set_link_modes()
1383 gp->phy_type == phy_mii_mdio1)) { in gem_set_link_modes()
1392 writel(val, gp->regs + MAC_XIFCFG); in gem_set_link_modes()
1398 val = readl(gp->regs + MAC_TXCFG); in gem_set_link_modes()
1399 writel(val | MAC_TXCFG_TCE, gp->regs + MAC_TXCFG); in gem_set_link_modes()
1401 val = readl(gp->regs + MAC_RXCFG); in gem_set_link_modes()
1402 writel(val | MAC_RXCFG_RCE, gp->regs + MAC_RXCFG); in gem_set_link_modes()
1404 val = readl(gp->regs + MAC_TXCFG); in gem_set_link_modes()
1405 writel(val & ~MAC_TXCFG_TCE, gp->regs + MAC_TXCFG); in gem_set_link_modes()
1407 val = readl(gp->regs + MAC_RXCFG); in gem_set_link_modes()
1408 writel(val & ~MAC_RXCFG_RCE, gp->regs + MAC_RXCFG); in gem_set_link_modes()
1411 if (gp->phy_type == phy_serialink || in gem_set_link_modes()
1412 gp->phy_type == phy_serdes) { in gem_set_link_modes()
1413 u32 pcs_lpa = readl(gp->regs + PCS_MIILP); in gem_set_link_modes()
1420 writel(512, gp->regs + MAC_STIME); in gem_set_link_modes()
1422 writel(64, gp->regs + MAC_STIME); in gem_set_link_modes()
1423 val = readl(gp->regs + MAC_MCCFG); in gem_set_link_modes()
1428 writel(val, gp->regs + MAC_MCCFG); in gem_set_link_modes()
1430 gem_start_dma(gp); in gem_set_link_modes()
1434 if (netif_msg_link(gp)) { in gem_set_link_modes()
1436 netdev_info(gp->dev, in gem_set_link_modes()
1438 gp->rx_fifo_sz, in gem_set_link_modes()
1439 gp->rx_pause_off, in gem_set_link_modes()
1440 gp->rx_pause_on); in gem_set_link_modes()
1442 netdev_info(gp->dev, "Pause is disabled\n"); in gem_set_link_modes()
1449 static int gem_mdio_link_not_up(struct gem *gp) in gem_mdio_link_not_up() argument
1451 switch (gp->lstate) { in gem_mdio_link_not_up()
1453 netif_info(gp, link, gp->dev, in gem_mdio_link_not_up()
1455 gp->phy_mii.def->ops->setup_forced(&gp->phy_mii, in gem_mdio_link_not_up()
1456 gp->last_forced_speed, DUPLEX_HALF); in gem_mdio_link_not_up()
1457 gp->timer_ticks = 5; in gem_mdio_link_not_up()
1458 gp->lstate = link_force_ok; in gem_mdio_link_not_up()
1465 if (gp->phy_mii.def->magic_aneg) in gem_mdio_link_not_up()
1467 netif_info(gp, link, gp->dev, "switching to forced 100bt\n"); in gem_mdio_link_not_up()
1469 gp->phy_mii.def->ops->setup_forced(&gp->phy_mii, SPEED_100, in gem_mdio_link_not_up()
1471 gp->timer_ticks = 5; in gem_mdio_link_not_up()
1472 gp->lstate = link_force_try; in gem_mdio_link_not_up()
1479 if (gp->phy_mii.speed == SPEED_100) { in gem_mdio_link_not_up()
1480 gp->phy_mii.def->ops->setup_forced(&gp->phy_mii, SPEED_10, in gem_mdio_link_not_up()
1482 gp->timer_ticks = 5; in gem_mdio_link_not_up()
1483 netif_info(gp, link, gp->dev, in gem_mdio_link_not_up()
1495 struct gem *gp = from_timer(gp, t, link_timer); in gem_link_timer() local
1496 struct net_device *dev = gp->dev; in gem_link_timer()
1500 if (gp->reset_task_pending) in gem_link_timer()
1503 if (gp->phy_type == phy_serialink || in gem_link_timer()
1504 gp->phy_type == phy_serdes) { in gem_link_timer()
1505 u32 val = readl(gp->regs + PCS_MIISTAT); in gem_link_timer()
1508 val = readl(gp->regs + PCS_MIISTAT); in gem_link_timer()
1511 if (gp->lstate == link_up) in gem_link_timer()
1514 gp->lstate = link_up; in gem_link_timer()
1516 (void)gem_set_link_modes(gp); in gem_link_timer()
1520 if (found_mii_phy(gp) && gp->phy_mii.def->ops->poll_link(&gp->phy_mii)) { in gem_link_timer()
1526 if (gp->lstate == link_force_try && gp->want_autoneg) { in gem_link_timer()
1527 gp->lstate = link_force_ret; in gem_link_timer()
1528 gp->last_forced_speed = gp->phy_mii.speed; in gem_link_timer()
1529 gp->timer_ticks = 5; in gem_link_timer()
1530 if (netif_msg_link(gp)) in gem_link_timer()
1533 gp->phy_mii.def->ops->setup_aneg(&gp->phy_mii, gp->phy_mii.advertising); in gem_link_timer()
1534 } else if (gp->lstate != link_up) { in gem_link_timer()
1535 gp->lstate = link_up; in gem_link_timer()
1537 if (gem_set_link_modes(gp)) in gem_link_timer()
1544 if (gp->lstate == link_up) { in gem_link_timer()
1545 gp->lstate = link_down; in gem_link_timer()
1546 netif_info(gp, link, dev, "Link down\n"); in gem_link_timer()
1548 gem_schedule_reset(gp); in gem_link_timer()
1551 } else if (++gp->timer_ticks > 10) { in gem_link_timer()
1552 if (found_mii_phy(gp)) in gem_link_timer()
1553 restart_aneg = gem_mdio_link_not_up(gp); in gem_link_timer()
1559 gem_begin_auto_negotiation(gp, NULL); in gem_link_timer()
1563 mod_timer(&gp->link_timer, jiffies + ((12 * HZ) / 10)); in gem_link_timer()
1566 static void gem_clean_rings(struct gem *gp) in gem_clean_rings() argument
1568 struct gem_init_block *gb = gp->init_block; in gem_clean_rings()
1577 if (gp->rx_skbs[i] != NULL) { in gem_clean_rings()
1578 skb = gp->rx_skbs[i]; in gem_clean_rings()
1580 dma_unmap_page(&gp->pdev->dev, dma_addr, in gem_clean_rings()
1581 RX_BUF_ALLOC_SIZE(gp), in gem_clean_rings()
1584 gp->rx_skbs[i] = NULL; in gem_clean_rings()
1592 if (gp->tx_skbs[i] != NULL) { in gem_clean_rings()
1596 skb = gp->tx_skbs[i]; in gem_clean_rings()
1597 gp->tx_skbs[i] = NULL; in gem_clean_rings()
1604 dma_unmap_page(&gp->pdev->dev, dma_addr, in gem_clean_rings()
1616 static void gem_init_rings(struct gem *gp) in gem_init_rings() argument
1618 struct gem_init_block *gb = gp->init_block; in gem_init_rings()
1619 struct net_device *dev = gp->dev; in gem_init_rings()
1623 gp->rx_new = gp->rx_old = gp->tx_new = gp->tx_old = 0; in gem_init_rings()
1625 gem_clean_rings(gp); in gem_init_rings()
1627 gp->rx_buf_sz = max(dev->mtu + ETH_HLEN + VLAN_HLEN, in gem_init_rings()
1634 skb = gem_alloc_skb(dev, RX_BUF_ALLOC_SIZE(gp), GFP_KERNEL); in gem_init_rings()
1641 gp->rx_skbs[i] = skb; in gem_init_rings()
1642 skb_put(skb, (gp->rx_buf_sz + RX_OFFSET)); in gem_init_rings()
1643 dma_addr = dma_map_page(&gp->pdev->dev, in gem_init_rings()
1646 RX_BUF_ALLOC_SIZE(gp), in gem_init_rings()
1650 rxd->status_word = cpu_to_le64(RXDCTRL_FRESH(gp)); in gem_init_rings()
1665 static void gem_init_phy(struct gem *gp) in gem_init_phy() argument
1670 mifcfg = readl(gp->regs + MIF_CFG); in gem_init_phy()
1672 writel(mifcfg, gp->regs + MIF_CFG); in gem_init_phy()
1674 if (gp->pdev->vendor == PCI_VENDOR_ID_APPLE) { in gem_init_phy()
1683 pmac_call_feature(PMAC_FTR_GMAC_PHY_RESET, gp->of_node, 0, 0); in gem_init_phy()
1689 sungem_phy_write(gp, MII_BMCR, BMCR_RESET); in gem_init_phy()
1691 if (sungem_phy_read(gp, MII_BMCR) != 0xffff) in gem_init_phy()
1694 netdev_warn(gp->dev, "GMAC PHY not responding !\n"); in gem_init_phy()
1698 if (gp->pdev->vendor == PCI_VENDOR_ID_SUN && in gem_init_phy()
1699 gp->pdev->device == PCI_DEVICE_ID_SUN_GEM) { in gem_init_phy()
1703 if (gp->phy_type == phy_mii_mdio0 || in gem_init_phy()
1704 gp->phy_type == phy_mii_mdio1) { in gem_init_phy()
1706 } else if (gp->phy_type == phy_serialink) { in gem_init_phy()
1712 writel(val, gp->regs + PCS_DMODE); in gem_init_phy()
1715 if (gp->phy_type == phy_mii_mdio0 || in gem_init_phy()
1716 gp->phy_type == phy_mii_mdio1) { in gem_init_phy()
1718 sungem_phy_probe(&gp->phy_mii, gp->mii_phy_addr); in gem_init_phy()
1721 if (gp->phy_mii.def && gp->phy_mii.def->ops->init) in gem_init_phy()
1722 gp->phy_mii.def->ops->init(&gp->phy_mii); in gem_init_phy()
1724 gem_pcs_reset(gp); in gem_init_phy()
1725 gem_pcs_reinit_adv(gp); in gem_init_phy()
1729 gp->timer_ticks = 0; in gem_init_phy()
1730 gp->lstate = link_down; in gem_init_phy()
1731 netif_carrier_off(gp->dev); in gem_init_phy()
1734 if (gp->phy_type == phy_mii_mdio0 || in gem_init_phy()
1735 gp->phy_type == phy_mii_mdio1) in gem_init_phy()
1736 netdev_info(gp->dev, "Found %s PHY\n", in gem_init_phy()
1737 gp->phy_mii.def ? gp->phy_mii.def->name : "no"); in gem_init_phy()
1739 gem_begin_auto_negotiation(gp, NULL); in gem_init_phy()
1742 static void gem_init_dma(struct gem *gp) in gem_init_dma() argument
1744 u64 desc_dma = (u64) gp->gblock_dvma; in gem_init_dma()
1748 writel(val, gp->regs + TXDMA_CFG); in gem_init_dma()
1750 writel(desc_dma >> 32, gp->regs + TXDMA_DBHI); in gem_init_dma()
1751 writel(desc_dma & 0xffffffff, gp->regs + TXDMA_DBLOW); in gem_init_dma()
1754 writel(0, gp->regs + TXDMA_KICK); in gem_init_dma()
1758 writel(val, gp->regs + RXDMA_CFG); in gem_init_dma()
1760 writel(desc_dma >> 32, gp->regs + RXDMA_DBHI); in gem_init_dma()
1761 writel(desc_dma & 0xffffffff, gp->regs + RXDMA_DBLOW); in gem_init_dma()
1763 writel(RX_RING_SIZE - 4, gp->regs + RXDMA_KICK); in gem_init_dma()
1765 val = (((gp->rx_pause_off / 64) << 0) & RXDMA_PTHRESH_OFF); in gem_init_dma()
1766 val |= (((gp->rx_pause_on / 64) << 12) & RXDMA_PTHRESH_ON); in gem_init_dma()
1767 writel(val, gp->regs + RXDMA_PTHRESH); in gem_init_dma()
1769 if (readl(gp->regs + GREG_BIFCFG) & GREG_BIFCFG_M66EN) in gem_init_dma()
1772 gp->regs + RXDMA_BLANK); in gem_init_dma()
1776 gp->regs + RXDMA_BLANK); in gem_init_dma()
1779 static u32 gem_setup_multicast(struct gem *gp) in gem_setup_multicast() argument
1784 if ((gp->dev->flags & IFF_ALLMULTI) || in gem_setup_multicast()
1785 (netdev_mc_count(gp->dev) > 256)) { in gem_setup_multicast()
1787 writel(0xffff, gp->regs + MAC_HASH0 + (i << 2)); in gem_setup_multicast()
1789 } else if (gp->dev->flags & IFF_PROMISC) { in gem_setup_multicast()
1798 netdev_for_each_mc_addr(ha, gp->dev) { in gem_setup_multicast()
1804 writel(hash_table[i], gp->regs + MAC_HASH0 + (i << 2)); in gem_setup_multicast()
1811 static void gem_init_mac(struct gem *gp) in gem_init_mac() argument
1813 unsigned char *e = &gp->dev->dev_addr[0]; in gem_init_mac()
1815 writel(0x1bf0, gp->regs + MAC_SNDPAUSE); in gem_init_mac()
1817 writel(0x00, gp->regs + MAC_IPG0); in gem_init_mac()
1818 writel(0x08, gp->regs + MAC_IPG1); in gem_init_mac()
1819 writel(0x04, gp->regs + MAC_IPG2); in gem_init_mac()
1820 writel(0x40, gp->regs + MAC_STIME); in gem_init_mac()
1821 writel(0x40, gp->regs + MAC_MINFSZ); in gem_init_mac()
1824 writel(0x20000000 | (gp->rx_buf_sz + 4), gp->regs + MAC_MAXFSZ); in gem_init_mac()
1826 writel(0x07, gp->regs + MAC_PASIZE); in gem_init_mac()
1827 writel(0x04, gp->regs + MAC_JAMSIZE); in gem_init_mac()
1828 writel(0x10, gp->regs + MAC_ATTLIM); in gem_init_mac()
1829 writel(0x8808, gp->regs + MAC_MCTYPE); in gem_init_mac()
1831 writel((e[5] | (e[4] << 8)) & 0x3ff, gp->regs + MAC_RANDSEED); in gem_init_mac()
1833 writel((e[4] << 8) | e[5], gp->regs + MAC_ADDR0); in gem_init_mac()
1834 writel((e[2] << 8) | e[3], gp->regs + MAC_ADDR1); in gem_init_mac()
1835 writel((e[0] << 8) | e[1], gp->regs + MAC_ADDR2); in gem_init_mac()
1837 writel(0, gp->regs + MAC_ADDR3); in gem_init_mac()
1838 writel(0, gp->regs + MAC_ADDR4); in gem_init_mac()
1839 writel(0, gp->regs + MAC_ADDR5); in gem_init_mac()
1841 writel(0x0001, gp->regs + MAC_ADDR6); in gem_init_mac()
1842 writel(0xc200, gp->regs + MAC_ADDR7); in gem_init_mac()
1843 writel(0x0180, gp->regs + MAC_ADDR8); in gem_init_mac()
1845 writel(0, gp->regs + MAC_AFILT0); in gem_init_mac()
1846 writel(0, gp->regs + MAC_AFILT1); in gem_init_mac()
1847 writel(0, gp->regs + MAC_AFILT2); in gem_init_mac()
1848 writel(0, gp->regs + MAC_AF21MSK); in gem_init_mac()
1849 writel(0, gp->regs + MAC_AF0MSK); in gem_init_mac()
1851 gp->mac_rx_cfg = gem_setup_multicast(gp); in gem_init_mac()
1853 gp->mac_rx_cfg |= MAC_RXCFG_SFCS; in gem_init_mac()
1855 writel(0, gp->regs + MAC_NCOLL); in gem_init_mac()
1856 writel(0, gp->regs + MAC_FASUCC); in gem_init_mac()
1857 writel(0, gp->regs + MAC_ECOLL); in gem_init_mac()
1858 writel(0, gp->regs + MAC_LCOLL); in gem_init_mac()
1859 writel(0, gp->regs + MAC_DTIMER); in gem_init_mac()
1860 writel(0, gp->regs + MAC_PATMPS); in gem_init_mac()
1861 writel(0, gp->regs + MAC_RFCTR); in gem_init_mac()
1862 writel(0, gp->regs + MAC_LERR); in gem_init_mac()
1863 writel(0, gp->regs + MAC_AERR); in gem_init_mac()
1864 writel(0, gp->regs + MAC_FCSERR); in gem_init_mac()
1865 writel(0, gp->regs + MAC_RXCVERR); in gem_init_mac()
1870 writel(0, gp->regs + MAC_TXCFG); in gem_init_mac()
1871 writel(gp->mac_rx_cfg, gp->regs + MAC_RXCFG); in gem_init_mac()
1872 writel(0, gp->regs + MAC_MCCFG); in gem_init_mac()
1873 writel(0, gp->regs + MAC_XIFCFG); in gem_init_mac()
1879 writel(MAC_TXSTAT_XMIT, gp->regs + MAC_TXMASK); in gem_init_mac()
1880 writel(MAC_RXSTAT_RCV, gp->regs + MAC_RXMASK); in gem_init_mac()
1885 writel(0xffffffff, gp->regs + MAC_MCMASK); in gem_init_mac()
1889 if (gp->has_wol) in gem_init_mac()
1890 writel(0, gp->regs + WOL_WAKECSR); in gem_init_mac()
1893 static void gem_init_pause_thresholds(struct gem *gp) in gem_init_pause_thresholds() argument
1902 if (gp->rx_fifo_sz <= (2 * 1024)) { in gem_init_pause_thresholds()
1903 gp->rx_pause_off = gp->rx_pause_on = gp->rx_fifo_sz; in gem_init_pause_thresholds()
1905 int max_frame = (gp->rx_buf_sz + 4 + 64) & ~63; in gem_init_pause_thresholds()
1906 int off = (gp->rx_fifo_sz - (max_frame * 2)); in gem_init_pause_thresholds()
1909 gp->rx_pause_off = off; in gem_init_pause_thresholds()
1910 gp->rx_pause_on = on; in gem_init_pause_thresholds()
1918 if (gp->pdev->vendor == PCI_VENDOR_ID_APPLE) in gem_init_pause_thresholds()
1925 writel(cfg, gp->regs + GREG_CFG); in gem_init_pause_thresholds()
1930 if (!(readl(gp->regs + GREG_CFG) & GREG_CFG_IBURST)) { in gem_init_pause_thresholds()
1933 writel(cfg, gp->regs + GREG_CFG); in gem_init_pause_thresholds()
1937 static int gem_check_invariants(struct gem *gp) in gem_check_invariants() argument
1939 struct pci_dev *pdev = gp->pdev; in gem_check_invariants()
1947 gp->phy_type = phy_mii_mdio0; in gem_check_invariants()
1948 gp->tx_fifo_sz = readl(gp->regs + TXDMA_FSZ) * 64; in gem_check_invariants()
1949 gp->rx_fifo_sz = readl(gp->regs + RXDMA_FSZ) * 64; in gem_check_invariants()
1950 gp->swrst_base = 0; in gem_check_invariants()
1952 mif_cfg = readl(gp->regs + MIF_CFG); in gem_check_invariants()
1955 writel(mif_cfg, gp->regs + MIF_CFG); in gem_check_invariants()
1956 writel(PCS_DMODE_MGM, gp->regs + PCS_DMODE); in gem_check_invariants()
1957 writel(MAC_XIFCFG_OE, gp->regs + MAC_XIFCFG); in gem_check_invariants()
1963 if (gp->pdev->device == PCI_DEVICE_ID_APPLE_K2_GMAC) in gem_check_invariants()
1964 gp->mii_phy_addr = 1; in gem_check_invariants()
1966 gp->mii_phy_addr = 0; in gem_check_invariants()
1971 mif_cfg = readl(gp->regs + MIF_CFG); in gem_check_invariants()
1990 gp->phy_type = phy_mii_mdio1; in gem_check_invariants()
1992 writel(mif_cfg, gp->regs + MIF_CFG); in gem_check_invariants()
1994 gp->phy_type = phy_mii_mdio0; in gem_check_invariants()
1996 writel(mif_cfg, gp->regs + MIF_CFG); in gem_check_invariants()
2001 p = of_get_property(gp->of_node, "shared-pins", NULL); in gem_check_invariants()
2003 gp->phy_type = phy_serdes; in gem_check_invariants()
2006 gp->phy_type = phy_serialink; in gem_check_invariants()
2008 if (gp->phy_type == phy_mii_mdio1 || in gem_check_invariants()
2009 gp->phy_type == phy_mii_mdio0) { in gem_check_invariants()
2013 gp->mii_phy_addr = i; in gem_check_invariants()
2014 if (sungem_phy_read(gp, MII_BMCR) != 0xffff) in gem_check_invariants()
2022 gp->phy_type = phy_serdes; in gem_check_invariants()
2027 gp->tx_fifo_sz = readl(gp->regs + TXDMA_FSZ) * 64; in gem_check_invariants()
2028 gp->rx_fifo_sz = readl(gp->regs + RXDMA_FSZ) * 64; in gem_check_invariants()
2032 if (gp->tx_fifo_sz != (9 * 1024) || in gem_check_invariants()
2033 gp->rx_fifo_sz != (20 * 1024)) { in gem_check_invariants()
2035 gp->tx_fifo_sz, gp->rx_fifo_sz); in gem_check_invariants()
2038 gp->swrst_base = 0; in gem_check_invariants()
2040 if (gp->tx_fifo_sz != (2 * 1024) || in gem_check_invariants()
2041 gp->rx_fifo_sz != (2 * 1024)) { in gem_check_invariants()
2043 gp->tx_fifo_sz, gp->rx_fifo_sz); in gem_check_invariants()
2046 gp->swrst_base = (64 / 4) << GREG_SWRST_CACHE_SHIFT; in gem_check_invariants()
2053 static void gem_reinit_chip(struct gem *gp) in gem_reinit_chip() argument
2056 gem_reset(gp); in gem_reinit_chip()
2059 gem_disable_ints(gp); in gem_reinit_chip()
2062 gem_init_rings(gp); in gem_reinit_chip()
2065 gem_init_pause_thresholds(gp); in gem_reinit_chip()
2068 gem_init_dma(gp); in gem_reinit_chip()
2069 gem_init_mac(gp); in gem_reinit_chip()
2073 static void gem_stop_phy(struct gem *gp, int wol) in gem_stop_phy() argument
2085 mifcfg = readl(gp->regs + MIF_CFG); in gem_stop_phy()
2087 writel(mifcfg, gp->regs + MIF_CFG); in gem_stop_phy()
2089 if (wol && gp->has_wol) { in gem_stop_phy()
2090 unsigned char *e = &gp->dev->dev_addr[0]; in gem_stop_phy()
2095 gp->regs + MAC_RXCFG); in gem_stop_phy()
2096 writel((e[4] << 8) | e[5], gp->regs + WOL_MATCH0); in gem_stop_phy()
2097 writel((e[2] << 8) | e[3], gp->regs + WOL_MATCH1); in gem_stop_phy()
2098 writel((e[0] << 8) | e[1], gp->regs + WOL_MATCH2); in gem_stop_phy()
2100 writel(WOL_MCOUNT_N | WOL_MCOUNT_M, gp->regs + WOL_MCOUNT); in gem_stop_phy()
2102 if ((readl(gp->regs + MAC_XIFCFG) & MAC_XIFCFG_GMII) == 0) in gem_stop_phy()
2104 writel(csr, gp->regs + WOL_WAKECSR); in gem_stop_phy()
2106 writel(0, gp->regs + MAC_RXCFG); in gem_stop_phy()
2107 (void)readl(gp->regs + MAC_RXCFG); in gem_stop_phy()
2115 writel(0, gp->regs + MAC_TXCFG); in gem_stop_phy()
2116 writel(0, gp->regs + MAC_XIFCFG); in gem_stop_phy()
2117 writel(0, gp->regs + TXDMA_CFG); in gem_stop_phy()
2118 writel(0, gp->regs + RXDMA_CFG); in gem_stop_phy()
2121 gem_reset(gp); in gem_stop_phy()
2122 writel(MAC_TXRST_CMD, gp->regs + MAC_TXRST); in gem_stop_phy()
2123 writel(MAC_RXRST_CMD, gp->regs + MAC_RXRST); in gem_stop_phy()
2125 if (found_mii_phy(gp) && gp->phy_mii.def->ops->suspend) in gem_stop_phy()
2126 gp->phy_mii.def->ops->suspend(&gp->phy_mii); in gem_stop_phy()
2131 writel(mifcfg | MIF_CFG_BBMODE, gp->regs + MIF_CFG); in gem_stop_phy()
2132 writel(0, gp->regs + MIF_BBCLK); in gem_stop_phy()
2133 writel(0, gp->regs + MIF_BBDATA); in gem_stop_phy()
2134 writel(0, gp->regs + MIF_BBOENAB); in gem_stop_phy()
2135 writel(MAC_XIFCFG_GMII | MAC_XIFCFG_LBCK, gp->regs + MAC_XIFCFG); in gem_stop_phy()
2136 (void) readl(gp->regs + MAC_XIFCFG); in gem_stop_phy()
2142 struct gem *gp = netdev_priv(dev); in gem_do_start() local
2145 pci_set_master(gp->pdev); in gem_do_start()
2148 gem_reinit_chip(gp); in gem_do_start()
2151 rc = request_irq(gp->pdev->irq, gem_interrupt, in gem_do_start()
2156 gem_reset(gp); in gem_do_start()
2157 gem_clean_rings(gp); in gem_do_start()
2158 gem_put_cell(gp); in gem_do_start()
2168 gem_netif_start(gp); in gem_do_start()
2174 gem_init_phy(gp); in gem_do_start()
2181 struct gem *gp = netdev_priv(dev); in gem_do_stop() local
2184 gem_netif_stop(gp); in gem_do_stop()
2191 gem_disable_ints(gp); in gem_do_stop()
2194 del_timer_sync(&gp->link_timer); in gem_do_stop()
2205 gp->reset_task_pending = 0; in gem_do_stop()
2208 gem_stop_dma(gp); in gem_do_stop()
2211 gem_reset(gp); in gem_do_stop()
2215 gem_clean_rings(gp); in gem_do_stop()
2218 free_irq(gp->pdev->irq, (void *) dev); in gem_do_stop()
2221 gem_stop_phy(gp, wol); in gem_do_stop()
2226 struct gem *gp = container_of(work, struct gem, reset_task); in gem_reset_task() local
2236 if (!netif_device_present(gp->dev) || in gem_reset_task()
2237 !netif_running(gp->dev) || in gem_reset_task()
2238 !gp->reset_task_pending) { in gem_reset_task()
2244 del_timer_sync(&gp->link_timer); in gem_reset_task()
2247 gem_netif_stop(gp); in gem_reset_task()
2250 gem_reinit_chip(gp); in gem_reset_task()
2251 if (gp->lstate == link_up) in gem_reset_task()
2252 gem_set_link_modes(gp); in gem_reset_task()
2255 gem_netif_start(gp); in gem_reset_task()
2258 gp->reset_task_pending = 0; in gem_reset_task()
2263 if (gp->lstate != link_up) in gem_reset_task()
2264 gem_begin_auto_negotiation(gp, NULL); in gem_reset_task()
2266 mod_timer(&gp->link_timer, jiffies + ((12 * HZ) / 10)); in gem_reset_task()
2273 struct gem *gp = netdev_priv(dev); in gem_open() local
2281 gem_get_cell(gp); in gem_open()
2284 rc = pci_enable_device(gp->pdev); in gem_open()
2291 gem_put_cell(gp); in gem_open()
2302 struct gem *gp = netdev_priv(dev); in gem_close() local
2308 pci_disable_device(gp->pdev); in gem_close()
2311 if (!gp->asleep_wol) in gem_close()
2312 gem_put_cell(gp); in gem_close()
2320 struct gem *gp = netdev_priv(dev); in gem_suspend() local
2336 (gp->wake_on_lan && netif_running(dev)) ? in gem_suspend()
2345 gp->asleep_wol = !!gp->wake_on_lan; in gem_suspend()
2346 gem_do_stop(dev, gp->asleep_wol); in gem_suspend()
2349 if (!gp->asleep_wol) in gem_suspend()
2350 gem_put_cell(gp); in gem_suspend()
2361 struct gem *gp = netdev_priv(dev); in gem_resume() local
2376 gem_get_cell(gp); in gem_resume()
2386 if (gp->asleep_wol) in gem_resume()
2387 gem_put_cell(gp); in gem_resume()
2397 struct gem *gp = netdev_priv(dev); in gem_get_stats() local
2410 if (WARN_ON(!gp->cell_enabled)) in gem_get_stats()
2413 dev->stats.rx_crc_errors += readl(gp->regs + MAC_FCSERR); in gem_get_stats()
2414 writel(0, gp->regs + MAC_FCSERR); in gem_get_stats()
2416 dev->stats.rx_frame_errors += readl(gp->regs + MAC_AERR); in gem_get_stats()
2417 writel(0, gp->regs + MAC_AERR); in gem_get_stats()
2419 dev->stats.rx_length_errors += readl(gp->regs + MAC_LERR); in gem_get_stats()
2420 writel(0, gp->regs + MAC_LERR); in gem_get_stats()
2422 dev->stats.tx_aborted_errors += readl(gp->regs + MAC_ECOLL); in gem_get_stats()
2424 (readl(gp->regs + MAC_ECOLL) + readl(gp->regs + MAC_LCOLL)); in gem_get_stats()
2425 writel(0, gp->regs + MAC_ECOLL); in gem_get_stats()
2426 writel(0, gp->regs + MAC_LCOLL); in gem_get_stats()
2434 struct gem *gp = netdev_priv(dev); in gem_set_mac_address() local
2447 if (WARN_ON(!gp->cell_enabled)) in gem_set_mac_address()
2450 writel((e[4] << 8) | e[5], gp->regs + MAC_ADDR0); in gem_set_mac_address()
2451 writel((e[2] << 8) | e[3], gp->regs + MAC_ADDR1); in gem_set_mac_address()
2452 writel((e[0] << 8) | e[1], gp->regs + MAC_ADDR2); in gem_set_mac_address()
2459 struct gem *gp = netdev_priv(dev); in gem_set_multicast() local
2467 if (gp->reset_task_pending || WARN_ON(!gp->cell_enabled)) in gem_set_multicast()
2470 rxcfg = readl(gp->regs + MAC_RXCFG); in gem_set_multicast()
2471 rxcfg_new = gem_setup_multicast(gp); in gem_set_multicast()
2475 gp->mac_rx_cfg = rxcfg_new; in gem_set_multicast()
2477 writel(rxcfg & ~MAC_RXCFG_ENAB, gp->regs + MAC_RXCFG); in gem_set_multicast()
2478 while (readl(gp->regs + MAC_RXCFG) & MAC_RXCFG_ENAB) { in gem_set_multicast()
2487 writel(rxcfg, gp->regs + MAC_RXCFG); in gem_set_multicast()
2500 struct gem *gp = netdev_priv(dev); in gem_change_mtu() local
2509 if (WARN_ON(!gp->cell_enabled)) in gem_change_mtu()
2512 gem_netif_stop(gp); in gem_change_mtu()
2513 gem_reinit_chip(gp); in gem_change_mtu()
2514 if (gp->lstate == link_up) in gem_change_mtu()
2515 gem_set_link_modes(gp); in gem_change_mtu()
2516 gem_netif_start(gp); in gem_change_mtu()
2523 struct gem *gp = netdev_priv(dev); in gem_get_drvinfo() local
2527 strlcpy(info->bus_info, pci_name(gp->pdev), sizeof(info->bus_info)); in gem_get_drvinfo()
2533 struct gem *gp = netdev_priv(dev); in gem_get_link_ksettings() local
2536 if (gp->phy_type == phy_mii_mdio0 || in gem_get_link_ksettings()
2537 gp->phy_type == phy_mii_mdio1) { in gem_get_link_ksettings()
2538 if (gp->phy_mii.def) in gem_get_link_ksettings()
2539 supported = gp->phy_mii.def->features; in gem_get_link_ksettings()
2549 cmd->base.autoneg = gp->want_autoneg; in gem_get_link_ksettings()
2550 cmd->base.speed = gp->phy_mii.speed; in gem_get_link_ksettings()
2551 cmd->base.duplex = gp->phy_mii.duplex; in gem_get_link_ksettings()
2552 advertising = gp->phy_mii.advertising; in gem_get_link_ksettings()
2573 if (gp->phy_type == phy_serdes) { in gem_get_link_ksettings()
2580 if (gp->lstate == link_up) in gem_get_link_ksettings()
2598 struct gem *gp = netdev_priv(dev); in gem_set_link_ksettings() local
2623 if (netif_device_present(gp->dev)) { in gem_set_link_ksettings()
2624 del_timer_sync(&gp->link_timer); in gem_set_link_ksettings()
2625 gem_begin_auto_negotiation(gp, cmd); in gem_set_link_ksettings()
2633 struct gem *gp = netdev_priv(dev); in gem_nway_reset() local
2635 if (!gp->want_autoneg) in gem_nway_reset()
2639 if (netif_device_present(gp->dev)) { in gem_nway_reset()
2640 del_timer_sync(&gp->link_timer); in gem_nway_reset()
2641 gem_begin_auto_negotiation(gp, NULL); in gem_nway_reset()
2649 struct gem *gp = netdev_priv(dev); in gem_get_msglevel() local
2650 return gp->msg_enable; in gem_get_msglevel()
2655 struct gem *gp = netdev_priv(dev); in gem_set_msglevel() local
2656 gp->msg_enable = value; in gem_set_msglevel()
2667 struct gem *gp = netdev_priv(dev); in gem_get_wol() local
2670 if (gp->has_wol) { in gem_get_wol()
2672 wol->wolopts = gp->wake_on_lan; in gem_get_wol()
2681 struct gem *gp = netdev_priv(dev); in gem_set_wol() local
2683 if (!gp->has_wol) in gem_set_wol()
2685 gp->wake_on_lan = wol->wolopts & WOL_SUPPORTED_MASK; in gem_set_wol()
2703 struct gem *gp = netdev_priv(dev); in gem_ioctl() local
2714 data->phy_id = gp->mii_phy_addr; in gem_ioctl()
2718 data->val_out = __sungem_phy_read(gp, data->phy_id & 0x1f, in gem_ioctl()
2724 __sungem_phy_write(gp, data->phy_id & 0x1f, data->reg_num & 0x1f, in gem_ioctl()
2784 static int gem_get_device_address(struct gem *gp) in gem_get_device_address() argument
2787 struct net_device *dev = gp->dev; in gem_get_device_address()
2790 addr = of_get_property(gp->of_node, "local-mac-address", NULL); in gem_get_device_address()
2802 get_gem_mac_nonobp(gp->pdev, gp->dev->dev_addr); in gem_get_device_address()
2812 struct gem *gp = netdev_priv(dev); in gem_remove_one() local
2817 cancel_work_sync(&gp->reset_task); in gem_remove_one()
2821 gp->init_block, gp->gblock_dvma); in gem_remove_one()
2822 iounmap(gp->regs); in gem_remove_one()
2848 struct gem *gp; in gem_init_one() local
2897 dev = alloc_etherdev(sizeof(*gp)); in gem_init_one()
2904 gp = netdev_priv(dev); in gem_init_one()
2912 gp->pdev = pdev; in gem_init_one()
2913 gp->dev = dev; in gem_init_one()
2915 gp->msg_enable = DEFAULT_MSG; in gem_init_one()
2917 timer_setup(&gp->link_timer, gem_link_timer, 0); in gem_init_one()
2919 INIT_WORK(&gp->reset_task, gem_reset_task); in gem_init_one()
2921 gp->lstate = link_down; in gem_init_one()
2922 gp->timer_ticks = 0; in gem_init_one()
2925 gp->regs = ioremap(gemreg_base, gemreg_len); in gem_init_one()
2926 if (!gp->regs) { in gem_init_one()
2936 gp->of_node = pci_device_to_OF_node(pdev); in gem_init_one()
2941 gp->has_wol = 1; in gem_init_one()
2944 gem_get_cell(gp); in gem_init_one()
2947 gem_reset(gp); in gem_init_one()
2950 gp->phy_mii.dev = dev; in gem_init_one()
2951 gp->phy_mii.mdio_read = _sungem_phy_read; in gem_init_one()
2952 gp->phy_mii.mdio_write = _sungem_phy_write; in gem_init_one()
2954 gp->phy_mii.platform_data = gp->of_node; in gem_init_one()
2957 gp->want_autoneg = 1; in gem_init_one()
2960 if (gem_check_invariants(gp)) { in gem_init_one()
2968 gp->init_block = dma_alloc_coherent(&pdev->dev, sizeof(struct gem_init_block), in gem_init_one()
2969 &gp->gblock_dvma, GFP_KERNEL); in gem_init_one()
2970 if (!gp->init_block) { in gem_init_one()
2976 err = gem_get_device_address(gp); in gem_init_one()
2981 netif_napi_add(dev, &gp->napi, gem_poll, 64); in gem_init_one()
3010 gem_put_cell(gp); in gem_init_one()
3020 gem_put_cell(gp); in gem_init_one()
3021 iounmap(gp->regs); in gem_init_one()