Lines Matching refs:pdata
86 u32 (*reg_read)(struct smsc911x_data *pdata, u32 reg);
87 void (*reg_write)(struct smsc911x_data *pdata, u32 reg, u32 val);
88 void (*rx_readfifo)(struct smsc911x_data *pdata,
90 void (*tx_writefifo)(struct smsc911x_data *pdata,
155 #define __smsc_shift(pdata, reg) ((reg) << ((pdata)->config.shift)) argument
157 static inline u32 __smsc911x_reg_read(struct smsc911x_data *pdata, u32 reg) in __smsc911x_reg_read() argument
159 if (pdata->config.flags & SMSC911X_USE_32BIT) in __smsc911x_reg_read()
160 return readl(pdata->ioaddr + reg); in __smsc911x_reg_read()
162 if (pdata->config.flags & SMSC911X_USE_16BIT) in __smsc911x_reg_read()
163 return ((readw(pdata->ioaddr + reg) & 0xFFFF) | in __smsc911x_reg_read()
164 ((readw(pdata->ioaddr + reg + 2) & 0xFFFF) << 16)); in __smsc911x_reg_read()
171 __smsc911x_reg_read_shift(struct smsc911x_data *pdata, u32 reg) in __smsc911x_reg_read_shift() argument
173 if (pdata->config.flags & SMSC911X_USE_32BIT) in __smsc911x_reg_read_shift()
174 return readl(pdata->ioaddr + __smsc_shift(pdata, reg)); in __smsc911x_reg_read_shift()
176 if (pdata->config.flags & SMSC911X_USE_16BIT) in __smsc911x_reg_read_shift()
177 return (readw(pdata->ioaddr + in __smsc911x_reg_read_shift()
178 __smsc_shift(pdata, reg)) & 0xFFFF) | in __smsc911x_reg_read_shift()
179 ((readw(pdata->ioaddr + in __smsc911x_reg_read_shift()
180 __smsc_shift(pdata, reg + 2)) & 0xFFFF) << 16); in __smsc911x_reg_read_shift()
186 static inline u32 smsc911x_reg_read(struct smsc911x_data *pdata, u32 reg) in smsc911x_reg_read() argument
191 spin_lock_irqsave(&pdata->dev_lock, flags); in smsc911x_reg_read()
192 data = pdata->ops->reg_read(pdata, reg); in smsc911x_reg_read()
193 spin_unlock_irqrestore(&pdata->dev_lock, flags); in smsc911x_reg_read()
198 static inline void __smsc911x_reg_write(struct smsc911x_data *pdata, u32 reg, in __smsc911x_reg_write() argument
201 if (pdata->config.flags & SMSC911X_USE_32BIT) { in __smsc911x_reg_write()
202 writel(val, pdata->ioaddr + reg); in __smsc911x_reg_write()
206 if (pdata->config.flags & SMSC911X_USE_16BIT) { in __smsc911x_reg_write()
207 writew(val & 0xFFFF, pdata->ioaddr + reg); in __smsc911x_reg_write()
208 writew((val >> 16) & 0xFFFF, pdata->ioaddr + reg + 2); in __smsc911x_reg_write()
216 __smsc911x_reg_write_shift(struct smsc911x_data *pdata, u32 reg, u32 val) in __smsc911x_reg_write_shift() argument
218 if (pdata->config.flags & SMSC911X_USE_32BIT) { in __smsc911x_reg_write_shift()
219 writel(val, pdata->ioaddr + __smsc_shift(pdata, reg)); in __smsc911x_reg_write_shift()
223 if (pdata->config.flags & SMSC911X_USE_16BIT) { in __smsc911x_reg_write_shift()
225 pdata->ioaddr + __smsc_shift(pdata, reg)); in __smsc911x_reg_write_shift()
227 pdata->ioaddr + __smsc_shift(pdata, reg + 2)); in __smsc911x_reg_write_shift()
234 static inline void smsc911x_reg_write(struct smsc911x_data *pdata, u32 reg, in smsc911x_reg_write() argument
239 spin_lock_irqsave(&pdata->dev_lock, flags); in smsc911x_reg_write()
240 pdata->ops->reg_write(pdata, reg, val); in smsc911x_reg_write()
241 spin_unlock_irqrestore(&pdata->dev_lock, flags); in smsc911x_reg_write()
246 smsc911x_tx_writefifo(struct smsc911x_data *pdata, unsigned int *buf, in smsc911x_tx_writefifo() argument
251 spin_lock_irqsave(&pdata->dev_lock, flags); in smsc911x_tx_writefifo()
253 if (pdata->config.flags & SMSC911X_SWAP_FIFO) { in smsc911x_tx_writefifo()
255 __smsc911x_reg_write(pdata, TX_DATA_FIFO, in smsc911x_tx_writefifo()
260 if (pdata->config.flags & SMSC911X_USE_32BIT) { in smsc911x_tx_writefifo()
261 iowrite32_rep(pdata->ioaddr + TX_DATA_FIFO, buf, wordcount); in smsc911x_tx_writefifo()
265 if (pdata->config.flags & SMSC911X_USE_16BIT) { in smsc911x_tx_writefifo()
267 __smsc911x_reg_write(pdata, TX_DATA_FIFO, *buf++); in smsc911x_tx_writefifo()
273 spin_unlock_irqrestore(&pdata->dev_lock, flags); in smsc911x_tx_writefifo()
278 smsc911x_tx_writefifo_shift(struct smsc911x_data *pdata, unsigned int *buf, in smsc911x_tx_writefifo_shift() argument
283 spin_lock_irqsave(&pdata->dev_lock, flags); in smsc911x_tx_writefifo_shift()
285 if (pdata->config.flags & SMSC911X_SWAP_FIFO) { in smsc911x_tx_writefifo_shift()
287 __smsc911x_reg_write_shift(pdata, TX_DATA_FIFO, in smsc911x_tx_writefifo_shift()
292 if (pdata->config.flags & SMSC911X_USE_32BIT) { in smsc911x_tx_writefifo_shift()
293 iowrite32_rep(pdata->ioaddr + __smsc_shift(pdata, in smsc911x_tx_writefifo_shift()
298 if (pdata->config.flags & SMSC911X_USE_16BIT) { in smsc911x_tx_writefifo_shift()
300 __smsc911x_reg_write_shift(pdata, in smsc911x_tx_writefifo_shift()
307 spin_unlock_irqrestore(&pdata->dev_lock, flags); in smsc911x_tx_writefifo_shift()
312 smsc911x_rx_readfifo(struct smsc911x_data *pdata, unsigned int *buf, in smsc911x_rx_readfifo() argument
317 spin_lock_irqsave(&pdata->dev_lock, flags); in smsc911x_rx_readfifo()
319 if (pdata->config.flags & SMSC911X_SWAP_FIFO) { in smsc911x_rx_readfifo()
321 *buf++ = swab32(__smsc911x_reg_read(pdata, in smsc911x_rx_readfifo()
326 if (pdata->config.flags & SMSC911X_USE_32BIT) { in smsc911x_rx_readfifo()
327 ioread32_rep(pdata->ioaddr + RX_DATA_FIFO, buf, wordcount); in smsc911x_rx_readfifo()
331 if (pdata->config.flags & SMSC911X_USE_16BIT) { in smsc911x_rx_readfifo()
333 *buf++ = __smsc911x_reg_read(pdata, RX_DATA_FIFO); in smsc911x_rx_readfifo()
339 spin_unlock_irqrestore(&pdata->dev_lock, flags); in smsc911x_rx_readfifo()
344 smsc911x_rx_readfifo_shift(struct smsc911x_data *pdata, unsigned int *buf, in smsc911x_rx_readfifo_shift() argument
349 spin_lock_irqsave(&pdata->dev_lock, flags); in smsc911x_rx_readfifo_shift()
351 if (pdata->config.flags & SMSC911X_SWAP_FIFO) { in smsc911x_rx_readfifo_shift()
353 *buf++ = swab32(__smsc911x_reg_read_shift(pdata, in smsc911x_rx_readfifo_shift()
358 if (pdata->config.flags & SMSC911X_USE_32BIT) { in smsc911x_rx_readfifo_shift()
359 ioread32_rep(pdata->ioaddr + __smsc_shift(pdata, in smsc911x_rx_readfifo_shift()
364 if (pdata->config.flags & SMSC911X_USE_16BIT) { in smsc911x_rx_readfifo_shift()
366 *buf++ = __smsc911x_reg_read_shift(pdata, in smsc911x_rx_readfifo_shift()
373 spin_unlock_irqrestore(&pdata->dev_lock, flags); in smsc911x_rx_readfifo_shift()
382 struct smsc911x_data *pdata = netdev_priv(ndev); in smsc911x_enable_resources() local
385 ret = regulator_bulk_enable(ARRAY_SIZE(pdata->supplies), in smsc911x_enable_resources()
386 pdata->supplies); in smsc911x_enable_resources()
391 if (!IS_ERR(pdata->clk)) { in smsc911x_enable_resources()
392 ret = clk_prepare_enable(pdata->clk); in smsc911x_enable_resources()
406 struct smsc911x_data *pdata = netdev_priv(ndev); in smsc911x_disable_resources() local
409 ret = regulator_bulk_disable(ARRAY_SIZE(pdata->supplies), in smsc911x_disable_resources()
410 pdata->supplies); in smsc911x_disable_resources()
412 if (!IS_ERR(pdata->clk)) in smsc911x_disable_resources()
413 clk_disable_unprepare(pdata->clk); in smsc911x_disable_resources()
428 struct smsc911x_data *pdata = netdev_priv(ndev); in smsc911x_request_resources() local
432 pdata->supplies[0].supply = "vdd33a"; in smsc911x_request_resources()
433 pdata->supplies[1].supply = "vddvario"; in smsc911x_request_resources()
435 ARRAY_SIZE(pdata->supplies), in smsc911x_request_resources()
436 pdata->supplies); in smsc911x_request_resources()
442 pdata->clk = clk_get(&pdev->dev, NULL); in smsc911x_request_resources()
443 if (IS_ERR(pdata->clk)) in smsc911x_request_resources()
445 PTR_ERR(pdata->clk)); in smsc911x_request_resources()
457 struct smsc911x_data *pdata = netdev_priv(ndev); in smsc911x_free_resources() local
460 regulator_bulk_free(ARRAY_SIZE(pdata->supplies), in smsc911x_free_resources()
461 pdata->supplies); in smsc911x_free_resources()
464 if (!IS_ERR(pdata->clk)) { in smsc911x_free_resources()
465 clk_put(pdata->clk); in smsc911x_free_resources()
466 pdata->clk = NULL; in smsc911x_free_resources()
472 static int smsc911x_mac_complete(struct smsc911x_data *pdata) in smsc911x_mac_complete() argument
477 SMSC_ASSERT_MAC_LOCK(pdata); in smsc911x_mac_complete()
480 val = smsc911x_reg_read(pdata, MAC_CSR_CMD); in smsc911x_mac_complete()
484 SMSC_WARN(pdata, hw, "Timed out waiting for MAC not BUSY. " in smsc911x_mac_complete()
490 static u32 smsc911x_mac_read(struct smsc911x_data *pdata, unsigned int offset) in smsc911x_mac_read() argument
494 SMSC_ASSERT_MAC_LOCK(pdata); in smsc911x_mac_read()
496 temp = smsc911x_reg_read(pdata, MAC_CSR_CMD); in smsc911x_mac_read()
498 SMSC_WARN(pdata, hw, "MAC busy at entry"); in smsc911x_mac_read()
503 smsc911x_reg_write(pdata, MAC_CSR_CMD, ((offset & 0xFF) | in smsc911x_mac_read()
507 temp = smsc911x_reg_read(pdata, BYTE_TEST); in smsc911x_mac_read()
510 if (likely(smsc911x_mac_complete(pdata) == 0)) in smsc911x_mac_read()
511 return smsc911x_reg_read(pdata, MAC_CSR_DATA); in smsc911x_mac_read()
513 SMSC_WARN(pdata, hw, "MAC busy after read"); in smsc911x_mac_read()
518 static void smsc911x_mac_write(struct smsc911x_data *pdata, in smsc911x_mac_write() argument
523 SMSC_ASSERT_MAC_LOCK(pdata); in smsc911x_mac_write()
525 temp = smsc911x_reg_read(pdata, MAC_CSR_CMD); in smsc911x_mac_write()
527 SMSC_WARN(pdata, hw, in smsc911x_mac_write()
533 smsc911x_reg_write(pdata, MAC_CSR_DATA, val); in smsc911x_mac_write()
536 smsc911x_reg_write(pdata, MAC_CSR_CMD, ((offset & 0xFF) | in smsc911x_mac_write()
540 temp = smsc911x_reg_read(pdata, BYTE_TEST); in smsc911x_mac_write()
543 if (likely(smsc911x_mac_complete(pdata) == 0)) in smsc911x_mac_write()
546 SMSC_WARN(pdata, hw, "smsc911x_mac_write failed, MAC busy after write"); in smsc911x_mac_write()
552 struct smsc911x_data *pdata = (struct smsc911x_data *)bus->priv; in smsc911x_mii_read() local
557 spin_lock_irqsave(&pdata->mac_lock, flags); in smsc911x_mii_read()
560 if (unlikely(smsc911x_mac_read(pdata, MII_ACC) & MII_ACC_MII_BUSY_)) { in smsc911x_mii_read()
561 SMSC_WARN(pdata, hw, "MII is busy in smsc911x_mii_read???"); in smsc911x_mii_read()
568 smsc911x_mac_write(pdata, MII_ACC, addr); in smsc911x_mii_read()
572 if (!(smsc911x_mac_read(pdata, MII_ACC) & MII_ACC_MII_BUSY_)) { in smsc911x_mii_read()
573 reg = smsc911x_mac_read(pdata, MII_DATA); in smsc911x_mii_read()
577 SMSC_WARN(pdata, hw, "Timed out waiting for MII read to finish"); in smsc911x_mii_read()
581 spin_unlock_irqrestore(&pdata->mac_lock, flags); in smsc911x_mii_read()
589 struct smsc911x_data *pdata = (struct smsc911x_data *)bus->priv; in smsc911x_mii_write() local
594 spin_lock_irqsave(&pdata->mac_lock, flags); in smsc911x_mii_write()
597 if (unlikely(smsc911x_mac_read(pdata, MII_ACC) & MII_ACC_MII_BUSY_)) { in smsc911x_mii_write()
598 SMSC_WARN(pdata, hw, "MII is busy in smsc911x_mii_write???"); in smsc911x_mii_write()
604 smsc911x_mac_write(pdata, MII_DATA, val); in smsc911x_mii_write()
609 smsc911x_mac_write(pdata, MII_ACC, addr); in smsc911x_mii_write()
613 if (!(smsc911x_mac_read(pdata, MII_ACC) & MII_ACC_MII_BUSY_)) { in smsc911x_mii_write()
618 SMSC_WARN(pdata, hw, "Timed out waiting for MII write to finish"); in smsc911x_mii_write()
622 spin_unlock_irqrestore(&pdata->mac_lock, flags); in smsc911x_mii_write()
627 static void smsc911x_phy_enable_external(struct smsc911x_data *pdata) in smsc911x_phy_enable_external() argument
629 unsigned int hwcfg = smsc911x_reg_read(pdata, HW_CFG); in smsc911x_phy_enable_external()
634 smsc911x_reg_write(pdata, HW_CFG, hwcfg); in smsc911x_phy_enable_external()
639 smsc911x_reg_write(pdata, HW_CFG, hwcfg); in smsc911x_phy_enable_external()
644 smsc911x_reg_write(pdata, HW_CFG, hwcfg); in smsc911x_phy_enable_external()
648 smsc911x_reg_write(pdata, HW_CFG, hwcfg); in smsc911x_phy_enable_external()
654 static void smsc911x_phy_initialise_external(struct smsc911x_data *pdata) in smsc911x_phy_initialise_external() argument
656 unsigned int hwcfg = smsc911x_reg_read(pdata, HW_CFG); in smsc911x_phy_initialise_external()
658 if (pdata->config.flags & SMSC911X_FORCE_INTERNAL_PHY) { in smsc911x_phy_initialise_external()
659 SMSC_TRACE(pdata, hw, "Forcing internal PHY"); in smsc911x_phy_initialise_external()
660 pdata->using_extphy = 0; in smsc911x_phy_initialise_external()
661 } else if (pdata->config.flags & SMSC911X_FORCE_EXTERNAL_PHY) { in smsc911x_phy_initialise_external()
662 SMSC_TRACE(pdata, hw, "Forcing external PHY"); in smsc911x_phy_initialise_external()
663 smsc911x_phy_enable_external(pdata); in smsc911x_phy_initialise_external()
664 pdata->using_extphy = 1; in smsc911x_phy_initialise_external()
666 SMSC_TRACE(pdata, hw, in smsc911x_phy_initialise_external()
668 smsc911x_phy_enable_external(pdata); in smsc911x_phy_initialise_external()
669 pdata->using_extphy = 1; in smsc911x_phy_initialise_external()
671 SMSC_TRACE(pdata, hw, in smsc911x_phy_initialise_external()
673 pdata->using_extphy = 0; in smsc911x_phy_initialise_external()
678 static unsigned int smsc911x_tx_get_txstatus(struct smsc911x_data *pdata) in smsc911x_tx_get_txstatus() argument
681 smsc911x_reg_read(pdata, TX_FIFO_INF) & TX_FIFO_INF_TSUSED_; in smsc911x_tx_get_txstatus()
684 result = smsc911x_reg_read(pdata, TX_STATUS_FIFO); in smsc911x_tx_get_txstatus()
690 static unsigned int smsc911x_rx_get_rxstatus(struct smsc911x_data *pdata) in smsc911x_rx_get_rxstatus() argument
693 smsc911x_reg_read(pdata, RX_FIFO_INF) & RX_FIFO_INF_RXSUSED_; in smsc911x_rx_get_rxstatus()
696 result = smsc911x_reg_read(pdata, RX_STATUS_FIFO); in smsc911x_rx_get_rxstatus()
702 static int smsc911x_phy_check_loopbackpkt(struct smsc911x_data *pdata) in smsc911x_phy_check_loopbackpkt() argument
717 memset(pdata->loopback_rx_pkt, 0, MIN_PACKET_SIZE); in smsc911x_phy_check_loopbackpkt()
720 txcmd_a = (u32)((ulong)pdata->loopback_tx_pkt & 0x03) << 16; in smsc911x_phy_check_loopbackpkt()
726 smsc911x_reg_write(pdata, TX_DATA_FIFO, txcmd_a); in smsc911x_phy_check_loopbackpkt()
727 smsc911x_reg_write(pdata, TX_DATA_FIFO, txcmd_b); in smsc911x_phy_check_loopbackpkt()
729 bufp = (ulong)pdata->loopback_tx_pkt & (~0x3); in smsc911x_phy_check_loopbackpkt()
731 wrsz += (u32)((ulong)pdata->loopback_tx_pkt & 0x3); in smsc911x_phy_check_loopbackpkt()
734 pdata->ops->tx_writefifo(pdata, (unsigned int *)bufp, wrsz); in smsc911x_phy_check_loopbackpkt()
740 status = smsc911x_tx_get_txstatus(pdata); in smsc911x_phy_check_loopbackpkt()
744 SMSC_WARN(pdata, hw, in smsc911x_phy_check_loopbackpkt()
749 SMSC_WARN(pdata, hw, in smsc911x_phy_check_loopbackpkt()
758 status = smsc911x_rx_get_rxstatus(pdata); in smsc911x_phy_check_loopbackpkt()
762 SMSC_WARN(pdata, hw, in smsc911x_phy_check_loopbackpkt()
767 SMSC_WARN(pdata, hw, in smsc911x_phy_check_loopbackpkt()
773 bufp = (ulong)pdata->loopback_rx_pkt; in smsc911x_phy_check_loopbackpkt()
775 rdsz += (u32)((ulong)pdata->loopback_rx_pkt & 0x3); in smsc911x_phy_check_loopbackpkt()
778 pdata->ops->rx_readfifo(pdata, (unsigned int *)bufp, rdsz); in smsc911x_phy_check_loopbackpkt()
781 SMSC_WARN(pdata, hw, "Unexpected packet size " in smsc911x_phy_check_loopbackpkt()
788 if (pdata->loopback_tx_pkt[j] in smsc911x_phy_check_loopbackpkt()
789 != pdata->loopback_rx_pkt[j]) { in smsc911x_phy_check_loopbackpkt()
795 SMSC_TRACE(pdata, hw, "Successfully verified " in smsc911x_phy_check_loopbackpkt()
799 SMSC_WARN(pdata, hw, "Data mismatch " in smsc911x_phy_check_loopbackpkt()
808 static int smsc911x_phy_reset(struct smsc911x_data *pdata) in smsc911x_phy_reset() argument
810 struct phy_device *phy_dev = pdata->phy_dev; in smsc911x_phy_reset()
817 SMSC_TRACE(pdata, hw, "Performing PHY BCR Reset"); in smsc911x_phy_reset()
826 SMSC_WARN(pdata, hw, "PHY reset failed to complete"); in smsc911x_phy_reset()
839 struct smsc911x_data *pdata = netdev_priv(dev); in smsc911x_phy_loopbacktest() local
840 struct phy_device *phy_dev = pdata->phy_dev; in smsc911x_phy_loopbacktest()
846 eth_broadcast_addr(pdata->loopback_tx_pkt); in smsc911x_phy_loopbacktest()
850 pdata->loopback_tx_pkt[i] = (char)i; in smsc911x_phy_loopbacktest()
853 pdata->loopback_tx_pkt[12] = 0x00; in smsc911x_phy_loopbacktest()
854 pdata->loopback_tx_pkt[13] = 0x00; in smsc911x_phy_loopbacktest()
857 pdata->loopback_tx_pkt[i] = (char)i; in smsc911x_phy_loopbacktest()
859 val = smsc911x_reg_read(pdata, HW_CFG); in smsc911x_phy_loopbacktest()
862 smsc911x_reg_write(pdata, HW_CFG, val); in smsc911x_phy_loopbacktest()
864 smsc911x_reg_write(pdata, TX_CFG, TX_CFG_TX_ON_); in smsc911x_phy_loopbacktest()
865 smsc911x_reg_write(pdata, RX_CFG, in smsc911x_phy_loopbacktest()
866 (u32)((ulong)pdata->loopback_rx_pkt & 0x03) << 8); in smsc911x_phy_loopbacktest()
874 spin_lock_irqsave(&pdata->mac_lock, flags); in smsc911x_phy_loopbacktest()
875 smsc911x_mac_write(pdata, MAC_CR, MAC_CR_FDPX_ in smsc911x_phy_loopbacktest()
877 spin_unlock_irqrestore(&pdata->mac_lock, flags); in smsc911x_phy_loopbacktest()
879 if (smsc911x_phy_check_loopbackpkt(pdata) == 0) { in smsc911x_phy_loopbacktest()
883 pdata->resetcount++; in smsc911x_phy_loopbacktest()
886 spin_lock_irqsave(&pdata->mac_lock, flags); in smsc911x_phy_loopbacktest()
887 smsc911x_mac_write(pdata, MAC_CR, 0); in smsc911x_phy_loopbacktest()
888 spin_unlock_irqrestore(&pdata->mac_lock, flags); in smsc911x_phy_loopbacktest()
890 smsc911x_phy_reset(pdata); in smsc911x_phy_loopbacktest()
894 spin_lock_irqsave(&pdata->mac_lock, flags); in smsc911x_phy_loopbacktest()
895 smsc911x_mac_write(pdata, MAC_CR, 0); in smsc911x_phy_loopbacktest()
896 spin_unlock_irqrestore(&pdata->mac_lock, flags); in smsc911x_phy_loopbacktest()
901 smsc911x_reg_write(pdata, TX_CFG, 0); in smsc911x_phy_loopbacktest()
902 smsc911x_reg_write(pdata, RX_CFG, 0); in smsc911x_phy_loopbacktest()
908 static void smsc911x_phy_update_flowcontrol(struct smsc911x_data *pdata) in smsc911x_phy_update_flowcontrol() argument
910 struct phy_device *phy_dev = pdata->phy_dev; in smsc911x_phy_update_flowcontrol()
911 u32 afc = smsc911x_reg_read(pdata, AFC_CFG); in smsc911x_phy_update_flowcontrol()
930 SMSC_TRACE(pdata, hw, "rx pause %s, tx pause %s", in smsc911x_phy_update_flowcontrol()
934 SMSC_TRACE(pdata, hw, "half duplex"); in smsc911x_phy_update_flowcontrol()
939 spin_lock_irqsave(&pdata->mac_lock, flags); in smsc911x_phy_update_flowcontrol()
940 smsc911x_mac_write(pdata, FLOW, flow); in smsc911x_phy_update_flowcontrol()
941 spin_unlock_irqrestore(&pdata->mac_lock, flags); in smsc911x_phy_update_flowcontrol()
943 smsc911x_reg_write(pdata, AFC_CFG, afc); in smsc911x_phy_update_flowcontrol()
950 struct smsc911x_data *pdata = netdev_priv(dev); in smsc911x_phy_adjust_link() local
951 struct phy_device *phy_dev = pdata->phy_dev; in smsc911x_phy_adjust_link()
955 if (phy_dev->duplex != pdata->last_duplex) { in smsc911x_phy_adjust_link()
957 SMSC_TRACE(pdata, hw, "duplex state has changed"); in smsc911x_phy_adjust_link()
959 spin_lock_irqsave(&pdata->mac_lock, flags); in smsc911x_phy_adjust_link()
960 mac_cr = smsc911x_mac_read(pdata, MAC_CR); in smsc911x_phy_adjust_link()
962 SMSC_TRACE(pdata, hw, in smsc911x_phy_adjust_link()
966 SMSC_TRACE(pdata, hw, in smsc911x_phy_adjust_link()
970 smsc911x_mac_write(pdata, MAC_CR, mac_cr); in smsc911x_phy_adjust_link()
971 spin_unlock_irqrestore(&pdata->mac_lock, flags); in smsc911x_phy_adjust_link()
973 smsc911x_phy_update_flowcontrol(pdata); in smsc911x_phy_adjust_link()
974 pdata->last_duplex = phy_dev->duplex; in smsc911x_phy_adjust_link()
978 if (carrier != pdata->last_carrier) { in smsc911x_phy_adjust_link()
979 SMSC_TRACE(pdata, hw, "carrier state has changed"); in smsc911x_phy_adjust_link()
981 SMSC_TRACE(pdata, hw, "configuring for carrier OK"); in smsc911x_phy_adjust_link()
982 if ((pdata->gpio_orig_setting & GPIO_CFG_LED1_EN_) && in smsc911x_phy_adjust_link()
983 (!pdata->using_extphy)) { in smsc911x_phy_adjust_link()
985 pdata->gpio_setting = pdata->gpio_orig_setting; in smsc911x_phy_adjust_link()
986 smsc911x_reg_write(pdata, GPIO_CFG, in smsc911x_phy_adjust_link()
987 pdata->gpio_setting); in smsc911x_phy_adjust_link()
990 SMSC_TRACE(pdata, hw, "configuring for no carrier"); in smsc911x_phy_adjust_link()
993 pdata->gpio_setting = smsc911x_reg_read(pdata, in smsc911x_phy_adjust_link()
995 if ((pdata->gpio_setting & GPIO_CFG_LED1_EN_) && in smsc911x_phy_adjust_link()
996 (!pdata->using_extphy)) { in smsc911x_phy_adjust_link()
999 pdata->gpio_orig_setting = pdata->gpio_setting; in smsc911x_phy_adjust_link()
1001 pdata->gpio_setting &= ~GPIO_CFG_LED1_EN_; in smsc911x_phy_adjust_link()
1002 pdata->gpio_setting |= (GPIO_CFG_GPIOBUF0_ in smsc911x_phy_adjust_link()
1005 smsc911x_reg_write(pdata, GPIO_CFG, in smsc911x_phy_adjust_link()
1006 pdata->gpio_setting); in smsc911x_phy_adjust_link()
1009 pdata->last_carrier = carrier; in smsc911x_phy_adjust_link()
1015 struct smsc911x_data *pdata = netdev_priv(dev); in smsc911x_mii_probe() local
1020 phydev = phy_find_first(pdata->mii_bus); in smsc911x_mii_probe()
1026 SMSC_TRACE(pdata, probe, "PHY: addr %d, phy_id 0x%08X", in smsc911x_mii_probe()
1030 pdata->config.phy_interface); in smsc911x_mii_probe()
1046 pdata->phy_dev = phydev; in smsc911x_mii_probe()
1047 pdata->last_duplex = -1; in smsc911x_mii_probe()
1048 pdata->last_carrier = -1; in smsc911x_mii_probe()
1052 SMSC_WARN(pdata, hw, "Failed Loop Back Test"); in smsc911x_mii_probe()
1055 SMSC_TRACE(pdata, hw, "Passed Loop Back Test"); in smsc911x_mii_probe()
1058 SMSC_TRACE(pdata, hw, "phy initialised successfully"); in smsc911x_mii_probe()
1065 struct smsc911x_data *pdata = netdev_priv(dev); in smsc911x_mii_init() local
1068 pdata->mii_bus = mdiobus_alloc(); in smsc911x_mii_init()
1069 if (!pdata->mii_bus) { in smsc911x_mii_init()
1074 pdata->mii_bus->name = SMSC_MDIONAME; in smsc911x_mii_init()
1075 snprintf(pdata->mii_bus->id, MII_BUS_ID_SIZE, "%s-%x", in smsc911x_mii_init()
1077 pdata->mii_bus->priv = pdata; in smsc911x_mii_init()
1078 pdata->mii_bus->read = smsc911x_mii_read; in smsc911x_mii_init()
1079 pdata->mii_bus->write = smsc911x_mii_write; in smsc911x_mii_init()
1080 pdata->mii_bus->irq = pdata->phy_irq; in smsc911x_mii_init()
1082 pdata->mii_bus->irq[i] = PHY_POLL; in smsc911x_mii_init()
1084 pdata->mii_bus->parent = &pdev->dev; in smsc911x_mii_init()
1086 switch (pdata->idrev & 0xFFFF0000) { in smsc911x_mii_init()
1092 smsc911x_phy_initialise_external(pdata); in smsc911x_mii_init()
1095 SMSC_TRACE(pdata, hw, "External PHY is not supported, " in smsc911x_mii_init()
1097 pdata->using_extphy = 0; in smsc911x_mii_init()
1101 if (!pdata->using_extphy) { in smsc911x_mii_init()
1103 pdata->mii_bus->phy_mask = ~(1 << 1); in smsc911x_mii_init()
1106 if (mdiobus_register(pdata->mii_bus)) { in smsc911x_mii_init()
1107 SMSC_WARN(pdata, probe, "Error registering mii bus"); in smsc911x_mii_init()
1112 SMSC_WARN(pdata, probe, "Error registering mii bus"); in smsc911x_mii_init()
1119 mdiobus_unregister(pdata->mii_bus); in smsc911x_mii_init()
1121 mdiobus_free(pdata->mii_bus); in smsc911x_mii_init()
1127 static unsigned int smsc911x_tx_get_txstatcount(struct smsc911x_data *pdata) in smsc911x_tx_get_txstatcount() argument
1129 return (smsc911x_reg_read(pdata, TX_FIFO_INF) in smsc911x_tx_get_txstatcount()
1136 struct smsc911x_data *pdata = netdev_priv(dev); in smsc911x_tx_update_txcounters() local
1139 while ((tx_stat = smsc911x_tx_get_txstatus(pdata)) != 0) { in smsc911x_tx_update_txcounters()
1148 SMSC_WARN(pdata, hw, "Packet tag reserved bit is high"); in smsc911x_tx_update_txcounters()
1197 smsc911x_rx_fastforward(struct smsc911x_data *pdata, unsigned int pktwords) in smsc911x_rx_fastforward() argument
1202 smsc911x_reg_write(pdata, RX_DP_CTRL, RX_DP_CTRL_RX_FFWD_); in smsc911x_rx_fastforward()
1205 val = smsc911x_reg_read(pdata, RX_DP_CTRL); in smsc911x_rx_fastforward()
1209 SMSC_WARN(pdata, hw, "Timed out waiting for " in smsc911x_rx_fastforward()
1214 temp = smsc911x_reg_read(pdata, RX_DATA_FIFO); in smsc911x_rx_fastforward()
1221 struct smsc911x_data *pdata = in smsc911x_poll() local
1223 struct net_device *dev = pdata->dev; in smsc911x_poll()
1230 unsigned int rxstat = smsc911x_rx_get_rxstatus(pdata); in smsc911x_poll()
1236 smsc911x_reg_write(pdata, INT_STS, INT_STS_RSFL_); in smsc911x_poll()
1238 temp = smsc911x_reg_read(pdata, INT_EN); in smsc911x_poll()
1240 smsc911x_reg_write(pdata, INT_EN, temp); in smsc911x_poll()
1253 SMSC_WARN(pdata, rx_err, in smsc911x_poll()
1257 smsc911x_rx_fastforward(pdata, pktwords); in smsc911x_poll()
1264 SMSC_WARN(pdata, rx_err, in smsc911x_poll()
1267 smsc911x_rx_fastforward(pdata, pktwords); in smsc911x_poll()
1272 pdata->ops->rx_readfifo(pdata, in smsc911x_poll()
1299 static void smsc911x_rx_multicast_update(struct smsc911x_data *pdata) in smsc911x_rx_multicast_update() argument
1305 SMSC_ASSERT_MAC_LOCK(pdata); in smsc911x_rx_multicast_update()
1307 mac_cr = smsc911x_mac_read(pdata, MAC_CR); in smsc911x_rx_multicast_update()
1308 mac_cr |= pdata->set_bits_mask; in smsc911x_rx_multicast_update()
1309 mac_cr &= ~(pdata->clear_bits_mask); in smsc911x_rx_multicast_update()
1310 smsc911x_mac_write(pdata, MAC_CR, mac_cr); in smsc911x_rx_multicast_update()
1311 smsc911x_mac_write(pdata, HASHH, pdata->hashhi); in smsc911x_rx_multicast_update()
1312 smsc911x_mac_write(pdata, HASHL, pdata->hashlo); in smsc911x_rx_multicast_update()
1313 SMSC_TRACE(pdata, hw, "maccr 0x%08X, HASHH 0x%08X, HASHL 0x%08X", in smsc911x_rx_multicast_update()
1314 mac_cr, pdata->hashhi, pdata->hashlo); in smsc911x_rx_multicast_update()
1317 static void smsc911x_rx_multicast_update_workaround(struct smsc911x_data *pdata) in smsc911x_rx_multicast_update_workaround() argument
1328 spin_lock(&pdata->mac_lock); in smsc911x_rx_multicast_update_workaround()
1331 if (smsc911x_mac_read(pdata, MAC_CR) & MAC_CR_RXEN_) in smsc911x_rx_multicast_update_workaround()
1332 SMSC_WARN(pdata, drv, "Rx not stopped"); in smsc911x_rx_multicast_update_workaround()
1335 smsc911x_rx_multicast_update(pdata); in smsc911x_rx_multicast_update_workaround()
1338 mac_cr = smsc911x_mac_read(pdata, MAC_CR); in smsc911x_rx_multicast_update_workaround()
1340 smsc911x_mac_write(pdata, MAC_CR, mac_cr); in smsc911x_rx_multicast_update_workaround()
1342 pdata->multicast_update_pending = 0; in smsc911x_rx_multicast_update_workaround()
1344 spin_unlock(&pdata->mac_lock); in smsc911x_rx_multicast_update_workaround()
1347 static int smsc911x_phy_general_power_up(struct smsc911x_data *pdata) in smsc911x_phy_general_power_up() argument
1351 if (!pdata->phy_dev) in smsc911x_phy_general_power_up()
1361 rc = phy_read(pdata->phy_dev, MII_BMCR); in smsc911x_phy_general_power_up()
1363 SMSC_WARN(pdata, drv, "Failed reading PHY control reg"); in smsc911x_phy_general_power_up()
1371 rc = phy_write(pdata->phy_dev, MII_BMCR, rc & ~BMCR_PDOWN); in smsc911x_phy_general_power_up()
1373 SMSC_WARN(pdata, drv, "Failed writing PHY control reg"); in smsc911x_phy_general_power_up()
1383 static int smsc911x_phy_disable_energy_detect(struct smsc911x_data *pdata) in smsc911x_phy_disable_energy_detect() argument
1387 if (!pdata->phy_dev) in smsc911x_phy_disable_energy_detect()
1390 rc = phy_read(pdata->phy_dev, MII_LAN83C185_CTRL_STATUS); in smsc911x_phy_disable_energy_detect()
1393 SMSC_WARN(pdata, drv, "Failed reading PHY control reg"); in smsc911x_phy_disable_energy_detect()
1400 rc = phy_write(pdata->phy_dev, MII_LAN83C185_CTRL_STATUS, in smsc911x_phy_disable_energy_detect()
1404 SMSC_WARN(pdata, drv, "Failed writing PHY control reg"); in smsc911x_phy_disable_energy_detect()
1414 static int smsc911x_phy_enable_energy_detect(struct smsc911x_data *pdata) in smsc911x_phy_enable_energy_detect() argument
1418 if (!pdata->phy_dev) in smsc911x_phy_enable_energy_detect()
1421 rc = phy_read(pdata->phy_dev, MII_LAN83C185_CTRL_STATUS); in smsc911x_phy_enable_energy_detect()
1424 SMSC_WARN(pdata, drv, "Failed reading PHY control reg"); in smsc911x_phy_enable_energy_detect()
1431 rc = phy_write(pdata->phy_dev, MII_LAN83C185_CTRL_STATUS, in smsc911x_phy_enable_energy_detect()
1435 SMSC_WARN(pdata, drv, "Failed writing PHY control reg"); in smsc911x_phy_enable_energy_detect()
1442 static int smsc911x_soft_reset(struct smsc911x_data *pdata) in smsc911x_soft_reset() argument
1452 ret = smsc911x_phy_general_power_up(pdata); in smsc911x_soft_reset()
1454 SMSC_WARN(pdata, drv, "Failed to power-up the PHY chip"); in smsc911x_soft_reset()
1464 if (pdata->generation == 4) { in smsc911x_soft_reset()
1465 ret = smsc911x_phy_disable_energy_detect(pdata); in smsc911x_soft_reset()
1468 SMSC_WARN(pdata, drv, "Failed to wakeup the PHY chip"); in smsc911x_soft_reset()
1474 smsc911x_reg_write(pdata, HW_CFG, HW_CFG_SRST_); in smsc911x_soft_reset()
1478 temp = smsc911x_reg_read(pdata, HW_CFG); in smsc911x_soft_reset()
1482 SMSC_WARN(pdata, drv, "Failed to complete reset"); in smsc911x_soft_reset()
1486 if (pdata->generation == 4) { in smsc911x_soft_reset()
1487 ret = smsc911x_phy_enable_energy_detect(pdata); in smsc911x_soft_reset()
1490 SMSC_WARN(pdata, drv, "Failed to wakeup the PHY chip"); in smsc911x_soft_reset()
1500 smsc911x_set_hw_mac_address(struct smsc911x_data *pdata, u8 dev_addr[6]) in smsc911x_set_hw_mac_address() argument
1506 SMSC_ASSERT_MAC_LOCK(pdata); in smsc911x_set_hw_mac_address()
1508 smsc911x_mac_write(pdata, ADDRH, mac_high16); in smsc911x_set_hw_mac_address()
1509 smsc911x_mac_write(pdata, ADDRL, mac_low32); in smsc911x_set_hw_mac_address()
1514 struct smsc911x_data *pdata = netdev_priv(dev); in smsc911x_disable_irq_chip() local
1516 smsc911x_reg_write(pdata, INT_EN, 0); in smsc911x_disable_irq_chip()
1517 smsc911x_reg_write(pdata, INT_STS, 0xFFFFFFFF); in smsc911x_disable_irq_chip()
1522 struct smsc911x_data *pdata = netdev_priv(dev); in smsc911x_open() local
1528 if (!pdata->phy_dev) { in smsc911x_open()
1529 SMSC_WARN(pdata, hw, "phy_dev is NULL"); in smsc911x_open()
1534 if (smsc911x_soft_reset(pdata)) { in smsc911x_open()
1535 SMSC_WARN(pdata, hw, "soft reset failed"); in smsc911x_open()
1539 smsc911x_reg_write(pdata, HW_CFG, 0x00050000); in smsc911x_open()
1540 smsc911x_reg_write(pdata, AFC_CFG, 0x006E3740); in smsc911x_open()
1543 spin_lock_irq(&pdata->mac_lock); in smsc911x_open()
1544 smsc911x_mac_write(pdata, VLAN1, ETH_P_8021Q); in smsc911x_open()
1545 spin_unlock_irq(&pdata->mac_lock); in smsc911x_open()
1549 while ((smsc911x_reg_read(pdata, E2P_CMD) & E2P_CMD_EPC_BUSY_) && in smsc911x_open()
1555 SMSC_WARN(pdata, ifup, in smsc911x_open()
1558 smsc911x_reg_write(pdata, GPIO_CFG, 0x70070000); in smsc911x_open()
1562 spin_lock_irq(&pdata->mac_lock); in smsc911x_open()
1563 smsc911x_set_hw_mac_address(pdata, dev->dev_addr); in smsc911x_open()
1564 spin_unlock_irq(&pdata->mac_lock); in smsc911x_open()
1572 if (pdata->config.irq_polarity) { in smsc911x_open()
1573 SMSC_TRACE(pdata, ifup, "irq polarity: active high"); in smsc911x_open()
1576 SMSC_TRACE(pdata, ifup, "irq polarity: active low"); in smsc911x_open()
1579 if (pdata->config.irq_type) { in smsc911x_open()
1580 SMSC_TRACE(pdata, ifup, "irq type: push-pull"); in smsc911x_open()
1583 SMSC_TRACE(pdata, ifup, "irq type: open drain"); in smsc911x_open()
1586 smsc911x_reg_write(pdata, INT_CFG, intcfg); in smsc911x_open()
1588 SMSC_TRACE(pdata, ifup, "Testing irq handler using IRQ %d", dev->irq); in smsc911x_open()
1589 pdata->software_irq_signal = 0; in smsc911x_open()
1592 temp = smsc911x_reg_read(pdata, INT_EN); in smsc911x_open()
1594 smsc911x_reg_write(pdata, INT_EN, temp); in smsc911x_open()
1598 if (pdata->software_irq_signal) in smsc911x_open()
1603 if (!pdata->software_irq_signal) { in smsc911x_open()
1608 SMSC_TRACE(pdata, ifup, "IRQ handler passed test using IRQ %d", in smsc911x_open()
1612 (unsigned long)pdata->ioaddr, dev->irq); in smsc911x_open()
1615 pdata->last_duplex = -1; in smsc911x_open()
1616 pdata->last_carrier = -1; in smsc911x_open()
1619 phy_start(pdata->phy_dev); in smsc911x_open()
1621 temp = smsc911x_reg_read(pdata, HW_CFG); in smsc911x_open()
1625 smsc911x_reg_write(pdata, HW_CFG, temp); in smsc911x_open()
1627 temp = smsc911x_reg_read(pdata, FIFO_INT); in smsc911x_open()
1630 smsc911x_reg_write(pdata, FIFO_INT, temp); in smsc911x_open()
1633 smsc911x_reg_write(pdata, RX_CFG, (NET_IP_ALIGN << 8)); in smsc911x_open()
1636 napi_enable(&pdata->napi); in smsc911x_open()
1638 temp = smsc911x_reg_read(pdata, INT_EN); in smsc911x_open()
1640 smsc911x_reg_write(pdata, INT_EN, temp); in smsc911x_open()
1642 spin_lock_irq(&pdata->mac_lock); in smsc911x_open()
1643 temp = smsc911x_mac_read(pdata, MAC_CR); in smsc911x_open()
1645 smsc911x_mac_write(pdata, MAC_CR, temp); in smsc911x_open()
1646 spin_unlock_irq(&pdata->mac_lock); in smsc911x_open()
1648 smsc911x_reg_write(pdata, TX_CFG, TX_CFG_TX_ON_); in smsc911x_open()
1657 struct smsc911x_data *pdata = netdev_priv(dev); in smsc911x_stop() local
1661 temp = smsc911x_reg_read(pdata, INT_CFG); in smsc911x_stop()
1663 smsc911x_reg_write(pdata, INT_CFG, temp); in smsc911x_stop()
1667 napi_disable(&pdata->napi); in smsc911x_stop()
1670 dev->stats.rx_dropped += smsc911x_reg_read(pdata, RX_DROP); in smsc911x_stop()
1674 if (pdata->phy_dev) in smsc911x_stop()
1675 phy_stop(pdata->phy_dev); in smsc911x_stop()
1677 SMSC_TRACE(pdata, ifdown, "Interface stopped"); in smsc911x_stop()
1684 struct smsc911x_data *pdata = netdev_priv(dev); in smsc911x_hard_start_xmit() local
1692 freespace = smsc911x_reg_read(pdata, TX_FIFO_INF) & TX_FIFO_INF_TDFREE_; in smsc911x_hard_start_xmit()
1695 SMSC_WARN(pdata, tx_err, in smsc911x_hard_start_xmit()
1706 smsc911x_reg_write(pdata, TX_DATA_FIFO, tx_cmd_a); in smsc911x_hard_start_xmit()
1707 smsc911x_reg_write(pdata, TX_DATA_FIFO, tx_cmd_b); in smsc911x_hard_start_xmit()
1714 pdata->ops->tx_writefifo(pdata, (unsigned int *)bufp, wrsz); in smsc911x_hard_start_xmit()
1719 if (unlikely(smsc911x_tx_get_txstatcount(pdata) >= 30)) in smsc911x_hard_start_xmit()
1724 temp = smsc911x_reg_read(pdata, FIFO_INT); in smsc911x_hard_start_xmit()
1727 smsc911x_reg_write(pdata, FIFO_INT, temp); in smsc911x_hard_start_xmit()
1736 struct smsc911x_data *pdata = netdev_priv(dev); in smsc911x_get_stats() local
1738 dev->stats.rx_dropped += smsc911x_reg_read(pdata, RX_DROP); in smsc911x_get_stats()
1745 struct smsc911x_data *pdata = netdev_priv(dev); in smsc911x_set_multicast_list() local
1750 pdata->set_bits_mask = MAC_CR_PRMS_; in smsc911x_set_multicast_list()
1751 pdata->clear_bits_mask = (MAC_CR_MCPAS_ | MAC_CR_HPFILT_); in smsc911x_set_multicast_list()
1752 pdata->hashhi = 0; in smsc911x_set_multicast_list()
1753 pdata->hashlo = 0; in smsc911x_set_multicast_list()
1756 pdata->set_bits_mask = MAC_CR_MCPAS_; in smsc911x_set_multicast_list()
1757 pdata->clear_bits_mask = (MAC_CR_PRMS_ | MAC_CR_HPFILT_); in smsc911x_set_multicast_list()
1758 pdata->hashhi = 0; in smsc911x_set_multicast_list()
1759 pdata->hashlo = 0; in smsc911x_set_multicast_list()
1766 pdata->set_bits_mask = MAC_CR_HPFILT_; in smsc911x_set_multicast_list()
1767 pdata->clear_bits_mask = (MAC_CR_PRMS_ | MAC_CR_MCPAS_); in smsc911x_set_multicast_list()
1779 pdata->hashhi = hash_high; in smsc911x_set_multicast_list()
1780 pdata->hashlo = hash_low; in smsc911x_set_multicast_list()
1783 pdata->set_bits_mask = 0; in smsc911x_set_multicast_list()
1784 pdata->clear_bits_mask = in smsc911x_set_multicast_list()
1786 pdata->hashhi = 0; in smsc911x_set_multicast_list()
1787 pdata->hashlo = 0; in smsc911x_set_multicast_list()
1790 spin_lock_irqsave(&pdata->mac_lock, flags); in smsc911x_set_multicast_list()
1792 if (pdata->generation <= 1) { in smsc911x_set_multicast_list()
1795 if (!pdata->multicast_update_pending) { in smsc911x_set_multicast_list()
1797 SMSC_TRACE(pdata, hw, "scheduling mcast update"); in smsc911x_set_multicast_list()
1798 pdata->multicast_update_pending = 1; in smsc911x_set_multicast_list()
1802 temp = smsc911x_mac_read(pdata, MAC_CR); in smsc911x_set_multicast_list()
1804 smsc911x_mac_write(pdata, MAC_CR, temp); in smsc911x_set_multicast_list()
1811 smsc911x_rx_multicast_update(pdata); in smsc911x_set_multicast_list()
1814 spin_unlock_irqrestore(&pdata->mac_lock, flags); in smsc911x_set_multicast_list()
1820 struct smsc911x_data *pdata = netdev_priv(dev); in smsc911x_irqhandler() local
1821 u32 intsts = smsc911x_reg_read(pdata, INT_STS); in smsc911x_irqhandler()
1822 u32 inten = smsc911x_reg_read(pdata, INT_EN); in smsc911x_irqhandler()
1827 temp = smsc911x_reg_read(pdata, INT_EN); in smsc911x_irqhandler()
1829 smsc911x_reg_write(pdata, INT_EN, temp); in smsc911x_irqhandler()
1830 smsc911x_reg_write(pdata, INT_STS, INT_STS_SW_INT_); in smsc911x_irqhandler()
1831 pdata->software_irq_signal = 1; in smsc911x_irqhandler()
1839 SMSC_TRACE(pdata, intr, "RX Stop interrupt"); in smsc911x_irqhandler()
1840 smsc911x_reg_write(pdata, INT_STS, INT_STS_RXSTOP_INT_); in smsc911x_irqhandler()
1841 if (pdata->multicast_update_pending) in smsc911x_irqhandler()
1842 smsc911x_rx_multicast_update_workaround(pdata); in smsc911x_irqhandler()
1847 temp = smsc911x_reg_read(pdata, FIFO_INT); in smsc911x_irqhandler()
1849 smsc911x_reg_write(pdata, FIFO_INT, temp); in smsc911x_irqhandler()
1850 smsc911x_reg_write(pdata, INT_STS, INT_STS_TDFA_); in smsc911x_irqhandler()
1856 SMSC_TRACE(pdata, intr, "RX Error interrupt"); in smsc911x_irqhandler()
1857 smsc911x_reg_write(pdata, INT_STS, INT_STS_RXE_); in smsc911x_irqhandler()
1862 if (likely(napi_schedule_prep(&pdata->napi))) { in smsc911x_irqhandler()
1864 temp = smsc911x_reg_read(pdata, INT_EN); in smsc911x_irqhandler()
1866 smsc911x_reg_write(pdata, INT_EN, temp); in smsc911x_irqhandler()
1868 __napi_schedule(&pdata->napi); in smsc911x_irqhandler()
1870 SMSC_WARN(pdata, rx_err, "napi_schedule_prep failed"); in smsc911x_irqhandler()
1889 struct smsc911x_data *pdata = netdev_priv(dev); in smsc911x_set_mac_address() local
1895 if (pdata->generation <= 1 && netif_running(dev)) in smsc911x_set_mac_address()
1903 spin_lock_irq(&pdata->mac_lock); in smsc911x_set_mac_address()
1904 smsc911x_set_hw_mac_address(pdata, dev->dev_addr); in smsc911x_set_mac_address()
1905 spin_unlock_irq(&pdata->mac_lock); in smsc911x_set_mac_address()
1915 struct smsc911x_data *pdata = netdev_priv(dev); in smsc911x_do_ioctl() local
1917 if (!netif_running(dev) || !pdata->phy_dev) in smsc911x_do_ioctl()
1920 return phy_mii_ioctl(pdata->phy_dev, ifr, cmd); in smsc911x_do_ioctl()
1926 struct smsc911x_data *pdata = netdev_priv(dev); in smsc911x_ethtool_getsettings() local
1930 return phy_ethtool_gset(pdata->phy_dev, cmd); in smsc911x_ethtool_getsettings()
1936 struct smsc911x_data *pdata = netdev_priv(dev); in smsc911x_ethtool_setsettings() local
1938 return phy_ethtool_sset(pdata->phy_dev, cmd); in smsc911x_ethtool_setsettings()
1952 struct smsc911x_data *pdata = netdev_priv(dev); in smsc911x_ethtool_nwayreset() local
1954 return phy_start_aneg(pdata->phy_dev); in smsc911x_ethtool_nwayreset()
1959 struct smsc911x_data *pdata = netdev_priv(dev); in smsc911x_ethtool_getmsglevel() local
1960 return pdata->msg_enable; in smsc911x_ethtool_getmsglevel()
1965 struct smsc911x_data *pdata = netdev_priv(dev); in smsc911x_ethtool_setmsglevel() local
1966 pdata->msg_enable = level; in smsc911x_ethtool_setmsglevel()
1979 struct smsc911x_data *pdata = netdev_priv(dev); in smsc911x_ethtool_getregs() local
1980 struct phy_device *phy_dev = pdata->phy_dev; in smsc911x_ethtool_getregs()
1986 regs->version = pdata->idrev; in smsc911x_ethtool_getregs()
1988 data[j++] = smsc911x_reg_read(pdata, i); in smsc911x_ethtool_getregs()
1991 spin_lock_irqsave(&pdata->mac_lock, flags); in smsc911x_ethtool_getregs()
1992 data[j++] = smsc911x_mac_read(pdata, i); in smsc911x_ethtool_getregs()
1993 spin_unlock_irqrestore(&pdata->mac_lock, flags); in smsc911x_ethtool_getregs()
2000 static void smsc911x_eeprom_enable_access(struct smsc911x_data *pdata) in smsc911x_eeprom_enable_access() argument
2002 unsigned int temp = smsc911x_reg_read(pdata, GPIO_CFG); in smsc911x_eeprom_enable_access()
2004 smsc911x_reg_write(pdata, GPIO_CFG, temp); in smsc911x_eeprom_enable_access()
2008 static int smsc911x_eeprom_send_cmd(struct smsc911x_data *pdata, u32 op) in smsc911x_eeprom_send_cmd() argument
2013 SMSC_TRACE(pdata, drv, "op 0x%08x", op); in smsc911x_eeprom_send_cmd()
2014 if (smsc911x_reg_read(pdata, E2P_CMD) & E2P_CMD_EPC_BUSY_) { in smsc911x_eeprom_send_cmd()
2015 SMSC_WARN(pdata, drv, "Busy at start"); in smsc911x_eeprom_send_cmd()
2020 smsc911x_reg_write(pdata, E2P_CMD, e2cmd); in smsc911x_eeprom_send_cmd()
2024 e2cmd = smsc911x_reg_read(pdata, E2P_CMD); in smsc911x_eeprom_send_cmd()
2028 SMSC_TRACE(pdata, drv, "TIMED OUT"); in smsc911x_eeprom_send_cmd()
2033 SMSC_TRACE(pdata, drv, "Error occurred during eeprom operation"); in smsc911x_eeprom_send_cmd()
2040 static int smsc911x_eeprom_read_location(struct smsc911x_data *pdata, in smsc911x_eeprom_read_location() argument
2046 SMSC_TRACE(pdata, drv, "address 0x%x", address); in smsc911x_eeprom_read_location()
2047 ret = smsc911x_eeprom_send_cmd(pdata, op); in smsc911x_eeprom_read_location()
2050 data[address] = smsc911x_reg_read(pdata, E2P_DATA); in smsc911x_eeprom_read_location()
2055 static int smsc911x_eeprom_write_location(struct smsc911x_data *pdata, in smsc911x_eeprom_write_location() argument
2062 SMSC_TRACE(pdata, drv, "address 0x%x, data 0x%x", address, data); in smsc911x_eeprom_write_location()
2063 ret = smsc911x_eeprom_send_cmd(pdata, op); in smsc911x_eeprom_write_location()
2067 smsc911x_reg_write(pdata, E2P_DATA, (u32)data); in smsc911x_eeprom_write_location()
2070 temp = smsc911x_reg_read(pdata, BYTE_TEST); in smsc911x_eeprom_write_location()
2072 ret = smsc911x_eeprom_send_cmd(pdata, op); in smsc911x_eeprom_write_location()
2086 struct smsc911x_data *pdata = netdev_priv(dev); in smsc911x_ethtool_get_eeprom() local
2091 smsc911x_eeprom_enable_access(pdata); in smsc911x_ethtool_get_eeprom()
2095 int ret = smsc911x_eeprom_read_location(pdata, i, eeprom_data); in smsc911x_ethtool_get_eeprom()
2111 struct smsc911x_data *pdata = netdev_priv(dev); in smsc911x_ethtool_set_eeprom() local
2113 smsc911x_eeprom_enable_access(pdata); in smsc911x_ethtool_set_eeprom()
2114 smsc911x_eeprom_send_cmd(pdata, E2P_CMD_EPC_CMD_EWEN_); in smsc911x_ethtool_set_eeprom()
2115 ret = smsc911x_eeprom_write_location(pdata, eeprom->offset, *data); in smsc911x_ethtool_set_eeprom()
2116 smsc911x_eeprom_send_cmd(pdata, E2P_CMD_EPC_CMD_EWDS_); in smsc911x_ethtool_set_eeprom()
2158 struct smsc911x_data *pdata = netdev_priv(dev); in smsc911x_read_mac_address() local
2159 u32 mac_high16 = smsc911x_mac_read(pdata, ADDRH); in smsc911x_read_mac_address()
2160 u32 mac_low32 = smsc911x_mac_read(pdata, ADDRL); in smsc911x_read_mac_address()
2173 struct smsc911x_data *pdata = netdev_priv(dev); in smsc911x_init() local
2177 SMSC_TRACE(pdata, probe, "Driver Parameters:"); in smsc911x_init()
2178 SMSC_TRACE(pdata, probe, "LAN base: 0x%08lX", in smsc911x_init()
2179 (unsigned long)pdata->ioaddr); in smsc911x_init()
2180 SMSC_TRACE(pdata, probe, "IRQ: %d", dev->irq); in smsc911x_init()
2181 SMSC_TRACE(pdata, probe, "PHY will be autodetected."); in smsc911x_init()
2183 spin_lock_init(&pdata->dev_lock); in smsc911x_init()
2184 spin_lock_init(&pdata->mac_lock); in smsc911x_init()
2186 if (pdata->ioaddr == NULL) { in smsc911x_init()
2187 SMSC_WARN(pdata, probe, "pdata->ioaddr: 0x00000000"); in smsc911x_init()
2207 while (!(smsc911x_reg_read(pdata, PMT_CTRL) & mask) && --to) in smsc911x_init()
2216 byte_test = smsc911x_reg_read(pdata, BYTE_TEST); in smsc911x_init()
2217 SMSC_TRACE(pdata, probe, "BYTE_TEST: 0x%08X", byte_test); in smsc911x_init()
2219 SMSC_TRACE(pdata, probe, "BYTE_TEST looks swapped, " in smsc911x_init()
2221 smsc911x_reg_write(pdata, WORD_SWAP, 0xffffffff); in smsc911x_init()
2225 byte_test = smsc911x_reg_read(pdata, BYTE_TEST); in smsc911x_init()
2227 byte_test = smsc911x_reg_read(pdata, BYTE_TEST); in smsc911x_init()
2231 SMSC_WARN(pdata, drv, "BYTE_TEST: 0x%08X", byte_test); in smsc911x_init()
2233 SMSC_WARN(pdata, probe, in smsc911x_init()
2235 SMSC_TRACE(pdata, probe, in smsc911x_init()
2243 pdata->generation = 0; in smsc911x_init()
2245 pdata->idrev = smsc911x_reg_read(pdata, ID_REV); in smsc911x_init()
2246 switch (pdata->idrev & 0xFFFF0000) { in smsc911x_init()
2253 pdata->generation = pdata->idrev & 0x0000FFFF; in smsc911x_init()
2261 pdata->generation = 3; in smsc911x_init()
2269 pdata->generation = 4; in smsc911x_init()
2273 SMSC_WARN(pdata, probe, "LAN911x not identified, idrev: 0x%08X", in smsc911x_init()
2274 pdata->idrev); in smsc911x_init()
2278 SMSC_TRACE(pdata, probe, in smsc911x_init()
2280 pdata->idrev, pdata->generation); in smsc911x_init()
2282 if (pdata->generation == 0) in smsc911x_init()
2283 SMSC_WARN(pdata, probe, in smsc911x_init()
2289 if (pdata->config.flags & SMSC911X_SAVE_MAC_ADDRESS) { in smsc911x_init()
2290 spin_lock_irq(&pdata->mac_lock); in smsc911x_init()
2292 spin_unlock_irq(&pdata->mac_lock); in smsc911x_init()
2296 if (smsc911x_soft_reset(pdata)) in smsc911x_init()
2300 netif_napi_add(dev, &pdata->napi, smsc911x_poll, SMSC_NAPI_WEIGHT); in smsc911x_init()
2310 struct smsc911x_data *pdata; in smsc911x_drv_remove() local
2315 pdata = netdev_priv(dev); in smsc911x_drv_remove()
2316 BUG_ON(!pdata); in smsc911x_drv_remove()
2317 BUG_ON(!pdata->ioaddr); in smsc911x_drv_remove()
2318 BUG_ON(!pdata->phy_dev); in smsc911x_drv_remove()
2320 SMSC_TRACE(pdata, ifdown, "Stopping driver"); in smsc911x_drv_remove()
2322 phy_disconnect(pdata->phy_dev); in smsc911x_drv_remove()
2323 pdata->phy_dev = NULL; in smsc911x_drv_remove()
2324 mdiobus_unregister(pdata->mii_bus); in smsc911x_drv_remove()
2325 mdiobus_free(pdata->mii_bus); in smsc911x_drv_remove()
2336 iounmap(pdata->ioaddr); in smsc911x_drv_remove()
2419 struct smsc911x_data *pdata; in smsc911x_drv_probe() local
2457 pdata = netdev_priv(dev); in smsc911x_drv_probe()
2460 pdata->ioaddr = ioremap_nocache(res->start, res_size); in smsc911x_drv_probe()
2462 pdata->dev = dev; in smsc911x_drv_probe()
2463 pdata->msg_enable = ((1 << debug) - 1); in smsc911x_drv_probe()
2475 if (pdata->ioaddr == NULL) { in smsc911x_drv_probe()
2476 SMSC_WARN(pdata, probe, "Error smsc911x base address invalid"); in smsc911x_drv_probe()
2481 retval = smsc911x_probe_config_dt(&pdata->config, np); in smsc911x_drv_probe()
2484 memcpy(&pdata->config, config, sizeof(pdata->config)); in smsc911x_drv_probe()
2489 SMSC_WARN(pdata, probe, "Error smsc911x config not found"); in smsc911x_drv_probe()
2494 pdata->ops = &standard_smsc911x_ops; in smsc911x_drv_probe()
2496 if (pdata->config.shift) in smsc911x_drv_probe()
2497 pdata->ops = &shifted_smsc911x_ops; in smsc911x_drv_probe()
2507 if (pdata->config.irq_polarity == SMSC911X_IRQ_POLARITY_ACTIVE_HIGH) in smsc911x_drv_probe()
2510 if (pdata->config.irq_type == SMSC911X_IRQ_TYPE_PUSH_PULL) in smsc911x_drv_probe()
2513 smsc911x_reg_write(pdata, INT_CFG, intcfg); in smsc911x_drv_probe()
2521 SMSC_WARN(pdata, probe, in smsc911x_drv_probe()
2530 SMSC_WARN(pdata, probe, "Error %i registering device", retval); in smsc911x_drv_probe()
2533 SMSC_TRACE(pdata, probe, in smsc911x_drv_probe()
2539 SMSC_WARN(pdata, probe, "Error %i initialising mii", retval); in smsc911x_drv_probe()
2543 spin_lock_irq(&pdata->mac_lock); in smsc911x_drv_probe()
2547 smsc911x_set_hw_mac_address(pdata, dev->dev_addr); in smsc911x_drv_probe()
2548 SMSC_TRACE(pdata, probe, in smsc911x_drv_probe()
2550 } else if (is_valid_ether_addr(pdata->config.mac)) { in smsc911x_drv_probe()
2551 memcpy(dev->dev_addr, pdata->config.mac, ETH_ALEN); in smsc911x_drv_probe()
2552 SMSC_TRACE(pdata, probe, in smsc911x_drv_probe()
2561 SMSC_TRACE(pdata, probe, in smsc911x_drv_probe()
2566 smsc911x_set_hw_mac_address(pdata, dev->dev_addr); in smsc911x_drv_probe()
2567 SMSC_TRACE(pdata, probe, in smsc911x_drv_probe()
2572 spin_unlock_irq(&pdata->mac_lock); in smsc911x_drv_probe()
2589 iounmap(pdata->ioaddr); in smsc911x_drv_probe()
2606 struct smsc911x_data *pdata = netdev_priv(ndev); in smsc911x_suspend() local
2610 smsc911x_reg_write(pdata, PMT_CTRL, in smsc911x_suspend()
2620 struct smsc911x_data *pdata = netdev_priv(ndev); in smsc911x_resume() local
2627 smsc911x_reg_write(pdata, BYTE_TEST, 0); in smsc911x_resume()
2632 while (!(smsc911x_reg_read(pdata, PMT_CTRL) & PMT_CTRL_READY_) && --to) in smsc911x_resume()