Lines Matching refs:pdata
76 u32 (*reg_read)(struct smsc911x_data *pdata, u32 reg);
77 void (*reg_write)(struct smsc911x_data *pdata, u32 reg, u32 val);
78 void (*rx_readfifo)(struct smsc911x_data *pdata,
80 void (*tx_writefifo)(struct smsc911x_data *pdata,
146 #define __smsc_shift(pdata, reg) ((reg) << ((pdata)->config.shift)) argument
148 static inline u32 __smsc911x_reg_read(struct smsc911x_data *pdata, u32 reg) in __smsc911x_reg_read() argument
150 if (pdata->config.flags & SMSC911X_USE_32BIT) in __smsc911x_reg_read()
151 return readl(pdata->ioaddr + reg); in __smsc911x_reg_read()
153 if (pdata->config.flags & SMSC911X_USE_16BIT) in __smsc911x_reg_read()
154 return ((readw(pdata->ioaddr + reg) & 0xFFFF) | in __smsc911x_reg_read()
155 ((readw(pdata->ioaddr + reg + 2) & 0xFFFF) << 16)); in __smsc911x_reg_read()
162 __smsc911x_reg_read_shift(struct smsc911x_data *pdata, u32 reg) in __smsc911x_reg_read_shift() argument
164 if (pdata->config.flags & SMSC911X_USE_32BIT) in __smsc911x_reg_read_shift()
165 return readl(pdata->ioaddr + __smsc_shift(pdata, reg)); in __smsc911x_reg_read_shift()
167 if (pdata->config.flags & SMSC911X_USE_16BIT) in __smsc911x_reg_read_shift()
168 return (readw(pdata->ioaddr + in __smsc911x_reg_read_shift()
169 __smsc_shift(pdata, reg)) & 0xFFFF) | in __smsc911x_reg_read_shift()
170 ((readw(pdata->ioaddr + in __smsc911x_reg_read_shift()
171 __smsc_shift(pdata, reg + 2)) & 0xFFFF) << 16); in __smsc911x_reg_read_shift()
177 static inline u32 smsc911x_reg_read(struct smsc911x_data *pdata, u32 reg) in smsc911x_reg_read() argument
182 spin_lock_irqsave(&pdata->dev_lock, flags); in smsc911x_reg_read()
183 data = pdata->ops->reg_read(pdata, reg); in smsc911x_reg_read()
184 spin_unlock_irqrestore(&pdata->dev_lock, flags); in smsc911x_reg_read()
189 static inline void __smsc911x_reg_write(struct smsc911x_data *pdata, u32 reg, in __smsc911x_reg_write() argument
192 if (pdata->config.flags & SMSC911X_USE_32BIT) { in __smsc911x_reg_write()
193 writel(val, pdata->ioaddr + reg); in __smsc911x_reg_write()
197 if (pdata->config.flags & SMSC911X_USE_16BIT) { in __smsc911x_reg_write()
198 writew(val & 0xFFFF, pdata->ioaddr + reg); in __smsc911x_reg_write()
199 writew((val >> 16) & 0xFFFF, pdata->ioaddr + reg + 2); in __smsc911x_reg_write()
207 __smsc911x_reg_write_shift(struct smsc911x_data *pdata, u32 reg, u32 val) in __smsc911x_reg_write_shift() argument
209 if (pdata->config.flags & SMSC911X_USE_32BIT) { in __smsc911x_reg_write_shift()
210 writel(val, pdata->ioaddr + __smsc_shift(pdata, reg)); in __smsc911x_reg_write_shift()
214 if (pdata->config.flags & SMSC911X_USE_16BIT) { in __smsc911x_reg_write_shift()
216 pdata->ioaddr + __smsc_shift(pdata, reg)); in __smsc911x_reg_write_shift()
218 pdata->ioaddr + __smsc_shift(pdata, reg + 2)); in __smsc911x_reg_write_shift()
225 static inline void smsc911x_reg_write(struct smsc911x_data *pdata, u32 reg, in smsc911x_reg_write() argument
230 spin_lock_irqsave(&pdata->dev_lock, flags); in smsc911x_reg_write()
231 pdata->ops->reg_write(pdata, reg, val); in smsc911x_reg_write()
232 spin_unlock_irqrestore(&pdata->dev_lock, flags); in smsc911x_reg_write()
237 smsc911x_tx_writefifo(struct smsc911x_data *pdata, unsigned int *buf, in smsc911x_tx_writefifo() argument
242 spin_lock_irqsave(&pdata->dev_lock, flags); in smsc911x_tx_writefifo()
244 if (pdata->config.flags & SMSC911X_SWAP_FIFO) { in smsc911x_tx_writefifo()
246 __smsc911x_reg_write(pdata, TX_DATA_FIFO, in smsc911x_tx_writefifo()
251 if (pdata->config.flags & SMSC911X_USE_32BIT) { in smsc911x_tx_writefifo()
252 iowrite32_rep(pdata->ioaddr + TX_DATA_FIFO, buf, wordcount); in smsc911x_tx_writefifo()
256 if (pdata->config.flags & SMSC911X_USE_16BIT) { in smsc911x_tx_writefifo()
258 __smsc911x_reg_write(pdata, TX_DATA_FIFO, *buf++); in smsc911x_tx_writefifo()
264 spin_unlock_irqrestore(&pdata->dev_lock, flags); in smsc911x_tx_writefifo()
269 smsc911x_tx_writefifo_shift(struct smsc911x_data *pdata, unsigned int *buf, in smsc911x_tx_writefifo_shift() argument
274 spin_lock_irqsave(&pdata->dev_lock, flags); in smsc911x_tx_writefifo_shift()
276 if (pdata->config.flags & SMSC911X_SWAP_FIFO) { in smsc911x_tx_writefifo_shift()
278 __smsc911x_reg_write_shift(pdata, TX_DATA_FIFO, in smsc911x_tx_writefifo_shift()
283 if (pdata->config.flags & SMSC911X_USE_32BIT) { in smsc911x_tx_writefifo_shift()
284 iowrite32_rep(pdata->ioaddr + __smsc_shift(pdata, in smsc911x_tx_writefifo_shift()
289 if (pdata->config.flags & SMSC911X_USE_16BIT) { in smsc911x_tx_writefifo_shift()
291 __smsc911x_reg_write_shift(pdata, in smsc911x_tx_writefifo_shift()
298 spin_unlock_irqrestore(&pdata->dev_lock, flags); in smsc911x_tx_writefifo_shift()
303 smsc911x_rx_readfifo(struct smsc911x_data *pdata, unsigned int *buf, in smsc911x_rx_readfifo() argument
308 spin_lock_irqsave(&pdata->dev_lock, flags); in smsc911x_rx_readfifo()
310 if (pdata->config.flags & SMSC911X_SWAP_FIFO) { in smsc911x_rx_readfifo()
312 *buf++ = swab32(__smsc911x_reg_read(pdata, in smsc911x_rx_readfifo()
317 if (pdata->config.flags & SMSC911X_USE_32BIT) { in smsc911x_rx_readfifo()
318 ioread32_rep(pdata->ioaddr + RX_DATA_FIFO, buf, wordcount); in smsc911x_rx_readfifo()
322 if (pdata->config.flags & SMSC911X_USE_16BIT) { in smsc911x_rx_readfifo()
324 *buf++ = __smsc911x_reg_read(pdata, RX_DATA_FIFO); in smsc911x_rx_readfifo()
330 spin_unlock_irqrestore(&pdata->dev_lock, flags); in smsc911x_rx_readfifo()
335 smsc911x_rx_readfifo_shift(struct smsc911x_data *pdata, unsigned int *buf, in smsc911x_rx_readfifo_shift() argument
340 spin_lock_irqsave(&pdata->dev_lock, flags); in smsc911x_rx_readfifo_shift()
342 if (pdata->config.flags & SMSC911X_SWAP_FIFO) { in smsc911x_rx_readfifo_shift()
344 *buf++ = swab32(__smsc911x_reg_read_shift(pdata, in smsc911x_rx_readfifo_shift()
349 if (pdata->config.flags & SMSC911X_USE_32BIT) { in smsc911x_rx_readfifo_shift()
350 ioread32_rep(pdata->ioaddr + __smsc_shift(pdata, in smsc911x_rx_readfifo_shift()
355 if (pdata->config.flags & SMSC911X_USE_16BIT) { in smsc911x_rx_readfifo_shift()
357 *buf++ = __smsc911x_reg_read_shift(pdata, in smsc911x_rx_readfifo_shift()
364 spin_unlock_irqrestore(&pdata->dev_lock, flags); in smsc911x_rx_readfifo_shift()
373 struct smsc911x_data *pdata = netdev_priv(ndev); in smsc911x_enable_resources() local
376 ret = regulator_bulk_enable(ARRAY_SIZE(pdata->supplies), in smsc911x_enable_resources()
377 pdata->supplies); in smsc911x_enable_resources()
382 if (!IS_ERR(pdata->clk)) { in smsc911x_enable_resources()
383 ret = clk_prepare_enable(pdata->clk); in smsc911x_enable_resources()
397 struct smsc911x_data *pdata = netdev_priv(ndev); in smsc911x_disable_resources() local
400 ret = regulator_bulk_disable(ARRAY_SIZE(pdata->supplies), in smsc911x_disable_resources()
401 pdata->supplies); in smsc911x_disable_resources()
403 if (!IS_ERR(pdata->clk)) in smsc911x_disable_resources()
404 clk_disable_unprepare(pdata->clk); in smsc911x_disable_resources()
419 struct smsc911x_data *pdata = netdev_priv(ndev); in smsc911x_request_resources() local
423 pdata->supplies[0].supply = "vdd33a"; in smsc911x_request_resources()
424 pdata->supplies[1].supply = "vddvario"; in smsc911x_request_resources()
426 ARRAY_SIZE(pdata->supplies), in smsc911x_request_resources()
427 pdata->supplies); in smsc911x_request_resources()
440 pdata->reset_gpiod = devm_gpiod_get_optional(&pdev->dev, in smsc911x_request_resources()
445 pdata->clk = clk_get(&pdev->dev, NULL); in smsc911x_request_resources()
446 if (IS_ERR(pdata->clk)) in smsc911x_request_resources()
448 PTR_ERR(pdata->clk)); in smsc911x_request_resources()
460 struct smsc911x_data *pdata = netdev_priv(ndev); in smsc911x_free_resources() local
463 regulator_bulk_free(ARRAY_SIZE(pdata->supplies), in smsc911x_free_resources()
464 pdata->supplies); in smsc911x_free_resources()
467 if (!IS_ERR(pdata->clk)) { in smsc911x_free_resources()
468 clk_put(pdata->clk); in smsc911x_free_resources()
469 pdata->clk = NULL; in smsc911x_free_resources()
475 static int smsc911x_mac_complete(struct smsc911x_data *pdata) in smsc911x_mac_complete() argument
480 SMSC_ASSERT_MAC_LOCK(pdata); in smsc911x_mac_complete()
483 val = smsc911x_reg_read(pdata, MAC_CSR_CMD); in smsc911x_mac_complete()
487 SMSC_WARN(pdata, hw, "Timed out waiting for MAC not BUSY. " in smsc911x_mac_complete()
493 static u32 smsc911x_mac_read(struct smsc911x_data *pdata, unsigned int offset) in smsc911x_mac_read() argument
497 SMSC_ASSERT_MAC_LOCK(pdata); in smsc911x_mac_read()
499 temp = smsc911x_reg_read(pdata, MAC_CSR_CMD); in smsc911x_mac_read()
501 SMSC_WARN(pdata, hw, "MAC busy at entry"); in smsc911x_mac_read()
506 smsc911x_reg_write(pdata, MAC_CSR_CMD, ((offset & 0xFF) | in smsc911x_mac_read()
510 temp = smsc911x_reg_read(pdata, BYTE_TEST); in smsc911x_mac_read()
513 if (likely(smsc911x_mac_complete(pdata) == 0)) in smsc911x_mac_read()
514 return smsc911x_reg_read(pdata, MAC_CSR_DATA); in smsc911x_mac_read()
516 SMSC_WARN(pdata, hw, "MAC busy after read"); in smsc911x_mac_read()
521 static void smsc911x_mac_write(struct smsc911x_data *pdata, in smsc911x_mac_write() argument
526 SMSC_ASSERT_MAC_LOCK(pdata); in smsc911x_mac_write()
528 temp = smsc911x_reg_read(pdata, MAC_CSR_CMD); in smsc911x_mac_write()
530 SMSC_WARN(pdata, hw, in smsc911x_mac_write()
536 smsc911x_reg_write(pdata, MAC_CSR_DATA, val); in smsc911x_mac_write()
539 smsc911x_reg_write(pdata, MAC_CSR_CMD, ((offset & 0xFF) | in smsc911x_mac_write()
543 temp = smsc911x_reg_read(pdata, BYTE_TEST); in smsc911x_mac_write()
546 if (likely(smsc911x_mac_complete(pdata) == 0)) in smsc911x_mac_write()
549 SMSC_WARN(pdata, hw, "smsc911x_mac_write failed, MAC busy after write"); in smsc911x_mac_write()
555 struct smsc911x_data *pdata = (struct smsc911x_data *)bus->priv; in smsc911x_mii_read() local
561 spin_lock_irqsave(&pdata->mac_lock, flags); in smsc911x_mii_read()
564 if (unlikely(smsc911x_mac_read(pdata, MII_ACC) & MII_ACC_MII_BUSY_)) { in smsc911x_mii_read()
565 SMSC_WARN(pdata, hw, "MII is busy in smsc911x_mii_read???"); in smsc911x_mii_read()
572 smsc911x_mac_write(pdata, MII_ACC, addr); in smsc911x_mii_read()
576 if (!(smsc911x_mac_read(pdata, MII_ACC) & MII_ACC_MII_BUSY_)) { in smsc911x_mii_read()
577 reg = smsc911x_mac_read(pdata, MII_DATA); in smsc911x_mii_read()
581 SMSC_WARN(pdata, hw, "Timed out waiting for MII read to finish"); in smsc911x_mii_read()
585 spin_unlock_irqrestore(&pdata->mac_lock, flags); in smsc911x_mii_read()
594 struct smsc911x_data *pdata = (struct smsc911x_data *)bus->priv; in smsc911x_mii_write() local
600 spin_lock_irqsave(&pdata->mac_lock, flags); in smsc911x_mii_write()
603 if (unlikely(smsc911x_mac_read(pdata, MII_ACC) & MII_ACC_MII_BUSY_)) { in smsc911x_mii_write()
604 SMSC_WARN(pdata, hw, "MII is busy in smsc911x_mii_write???"); in smsc911x_mii_write()
610 smsc911x_mac_write(pdata, MII_DATA, val); in smsc911x_mii_write()
615 smsc911x_mac_write(pdata, MII_ACC, addr); in smsc911x_mii_write()
619 if (!(smsc911x_mac_read(pdata, MII_ACC) & MII_ACC_MII_BUSY_)) { in smsc911x_mii_write()
624 SMSC_WARN(pdata, hw, "Timed out waiting for MII write to finish"); in smsc911x_mii_write()
628 spin_unlock_irqrestore(&pdata->mac_lock, flags); in smsc911x_mii_write()
634 static void smsc911x_phy_enable_external(struct smsc911x_data *pdata) in smsc911x_phy_enable_external() argument
636 unsigned int hwcfg = smsc911x_reg_read(pdata, HW_CFG); in smsc911x_phy_enable_external()
641 smsc911x_reg_write(pdata, HW_CFG, hwcfg); in smsc911x_phy_enable_external()
646 smsc911x_reg_write(pdata, HW_CFG, hwcfg); in smsc911x_phy_enable_external()
651 smsc911x_reg_write(pdata, HW_CFG, hwcfg); in smsc911x_phy_enable_external()
655 smsc911x_reg_write(pdata, HW_CFG, hwcfg); in smsc911x_phy_enable_external()
661 static void smsc911x_phy_initialise_external(struct smsc911x_data *pdata) in smsc911x_phy_initialise_external() argument
663 unsigned int hwcfg = smsc911x_reg_read(pdata, HW_CFG); in smsc911x_phy_initialise_external()
665 if (pdata->config.flags & SMSC911X_FORCE_INTERNAL_PHY) { in smsc911x_phy_initialise_external()
666 SMSC_TRACE(pdata, hw, "Forcing internal PHY"); in smsc911x_phy_initialise_external()
667 pdata->using_extphy = 0; in smsc911x_phy_initialise_external()
668 } else if (pdata->config.flags & SMSC911X_FORCE_EXTERNAL_PHY) { in smsc911x_phy_initialise_external()
669 SMSC_TRACE(pdata, hw, "Forcing external PHY"); in smsc911x_phy_initialise_external()
670 smsc911x_phy_enable_external(pdata); in smsc911x_phy_initialise_external()
671 pdata->using_extphy = 1; in smsc911x_phy_initialise_external()
673 SMSC_TRACE(pdata, hw, in smsc911x_phy_initialise_external()
675 smsc911x_phy_enable_external(pdata); in smsc911x_phy_initialise_external()
676 pdata->using_extphy = 1; in smsc911x_phy_initialise_external()
678 SMSC_TRACE(pdata, hw, in smsc911x_phy_initialise_external()
680 pdata->using_extphy = 0; in smsc911x_phy_initialise_external()
685 static unsigned int smsc911x_tx_get_txstatus(struct smsc911x_data *pdata) in smsc911x_tx_get_txstatus() argument
688 smsc911x_reg_read(pdata, TX_FIFO_INF) & TX_FIFO_INF_TSUSED_; in smsc911x_tx_get_txstatus()
691 result = smsc911x_reg_read(pdata, TX_STATUS_FIFO); in smsc911x_tx_get_txstatus()
697 static unsigned int smsc911x_rx_get_rxstatus(struct smsc911x_data *pdata) in smsc911x_rx_get_rxstatus() argument
700 smsc911x_reg_read(pdata, RX_FIFO_INF) & RX_FIFO_INF_RXSUSED_; in smsc911x_rx_get_rxstatus()
703 result = smsc911x_reg_read(pdata, RX_STATUS_FIFO); in smsc911x_rx_get_rxstatus()
709 static int smsc911x_phy_check_loopbackpkt(struct smsc911x_data *pdata) in smsc911x_phy_check_loopbackpkt() argument
724 memset(pdata->loopback_rx_pkt, 0, MIN_PACKET_SIZE); in smsc911x_phy_check_loopbackpkt()
727 txcmd_a = (u32)((ulong)pdata->loopback_tx_pkt & 0x03) << 16; in smsc911x_phy_check_loopbackpkt()
733 smsc911x_reg_write(pdata, TX_DATA_FIFO, txcmd_a); in smsc911x_phy_check_loopbackpkt()
734 smsc911x_reg_write(pdata, TX_DATA_FIFO, txcmd_b); in smsc911x_phy_check_loopbackpkt()
736 bufp = (ulong)pdata->loopback_tx_pkt & (~0x3); in smsc911x_phy_check_loopbackpkt()
738 wrsz += (u32)((ulong)pdata->loopback_tx_pkt & 0x3); in smsc911x_phy_check_loopbackpkt()
741 pdata->ops->tx_writefifo(pdata, (unsigned int *)bufp, wrsz); in smsc911x_phy_check_loopbackpkt()
747 status = smsc911x_tx_get_txstatus(pdata); in smsc911x_phy_check_loopbackpkt()
751 SMSC_WARN(pdata, hw, in smsc911x_phy_check_loopbackpkt()
756 SMSC_WARN(pdata, hw, in smsc911x_phy_check_loopbackpkt()
765 status = smsc911x_rx_get_rxstatus(pdata); in smsc911x_phy_check_loopbackpkt()
769 SMSC_WARN(pdata, hw, in smsc911x_phy_check_loopbackpkt()
774 SMSC_WARN(pdata, hw, in smsc911x_phy_check_loopbackpkt()
780 bufp = (ulong)pdata->loopback_rx_pkt; in smsc911x_phy_check_loopbackpkt()
782 rdsz += (u32)((ulong)pdata->loopback_rx_pkt & 0x3); in smsc911x_phy_check_loopbackpkt()
785 pdata->ops->rx_readfifo(pdata, (unsigned int *)bufp, rdsz); in smsc911x_phy_check_loopbackpkt()
788 SMSC_WARN(pdata, hw, "Unexpected packet size " in smsc911x_phy_check_loopbackpkt()
795 if (pdata->loopback_tx_pkt[j] in smsc911x_phy_check_loopbackpkt()
796 != pdata->loopback_rx_pkt[j]) { in smsc911x_phy_check_loopbackpkt()
802 SMSC_TRACE(pdata, hw, "Successfully verified " in smsc911x_phy_check_loopbackpkt()
806 SMSC_WARN(pdata, hw, "Data mismatch " in smsc911x_phy_check_loopbackpkt()
815 static int smsc911x_phy_reset(struct smsc911x_data *pdata) in smsc911x_phy_reset() argument
820 temp = smsc911x_reg_read(pdata, PMT_CTRL); in smsc911x_phy_reset()
821 smsc911x_reg_write(pdata, PMT_CTRL, temp | PMT_CTRL_PHY_RST_); in smsc911x_phy_reset()
824 temp = smsc911x_reg_read(pdata, PMT_CTRL); in smsc911x_phy_reset()
828 SMSC_WARN(pdata, hw, "PHY reset failed to complete"); in smsc911x_phy_reset()
841 struct smsc911x_data *pdata = netdev_priv(dev); in smsc911x_phy_loopbacktest() local
848 eth_broadcast_addr(pdata->loopback_tx_pkt); in smsc911x_phy_loopbacktest()
852 pdata->loopback_tx_pkt[i] = (char)i; in smsc911x_phy_loopbacktest()
855 pdata->loopback_tx_pkt[12] = 0x00; in smsc911x_phy_loopbacktest()
856 pdata->loopback_tx_pkt[13] = 0x00; in smsc911x_phy_loopbacktest()
859 pdata->loopback_tx_pkt[i] = (char)i; in smsc911x_phy_loopbacktest()
861 val = smsc911x_reg_read(pdata, HW_CFG); in smsc911x_phy_loopbacktest()
864 smsc911x_reg_write(pdata, HW_CFG, val); in smsc911x_phy_loopbacktest()
866 smsc911x_reg_write(pdata, TX_CFG, TX_CFG_TX_ON_); in smsc911x_phy_loopbacktest()
867 smsc911x_reg_write(pdata, RX_CFG, in smsc911x_phy_loopbacktest()
868 (u32)((ulong)pdata->loopback_rx_pkt & 0x03) << 8); in smsc911x_phy_loopbacktest()
876 spin_lock_irqsave(&pdata->mac_lock, flags); in smsc911x_phy_loopbacktest()
877 smsc911x_mac_write(pdata, MAC_CR, MAC_CR_FDPX_ in smsc911x_phy_loopbacktest()
879 spin_unlock_irqrestore(&pdata->mac_lock, flags); in smsc911x_phy_loopbacktest()
881 if (smsc911x_phy_check_loopbackpkt(pdata) == 0) { in smsc911x_phy_loopbacktest()
885 pdata->resetcount++; in smsc911x_phy_loopbacktest()
888 spin_lock_irqsave(&pdata->mac_lock, flags); in smsc911x_phy_loopbacktest()
889 smsc911x_mac_write(pdata, MAC_CR, 0); in smsc911x_phy_loopbacktest()
890 spin_unlock_irqrestore(&pdata->mac_lock, flags); in smsc911x_phy_loopbacktest()
892 smsc911x_phy_reset(pdata); in smsc911x_phy_loopbacktest()
896 spin_lock_irqsave(&pdata->mac_lock, flags); in smsc911x_phy_loopbacktest()
897 smsc911x_mac_write(pdata, MAC_CR, 0); in smsc911x_phy_loopbacktest()
898 spin_unlock_irqrestore(&pdata->mac_lock, flags); in smsc911x_phy_loopbacktest()
903 smsc911x_reg_write(pdata, TX_CFG, 0); in smsc911x_phy_loopbacktest()
904 smsc911x_reg_write(pdata, RX_CFG, 0); in smsc911x_phy_loopbacktest()
910 static void smsc911x_phy_update_flowcontrol(struct smsc911x_data *pdata) in smsc911x_phy_update_flowcontrol() argument
912 struct net_device *ndev = pdata->dev; in smsc911x_phy_update_flowcontrol()
914 u32 afc = smsc911x_reg_read(pdata, AFC_CFG); in smsc911x_phy_update_flowcontrol()
933 SMSC_TRACE(pdata, hw, "rx pause %s, tx pause %s", in smsc911x_phy_update_flowcontrol()
937 SMSC_TRACE(pdata, hw, "half duplex"); in smsc911x_phy_update_flowcontrol()
942 spin_lock_irqsave(&pdata->mac_lock, flags); in smsc911x_phy_update_flowcontrol()
943 smsc911x_mac_write(pdata, FLOW, flow); in smsc911x_phy_update_flowcontrol()
944 spin_unlock_irqrestore(&pdata->mac_lock, flags); in smsc911x_phy_update_flowcontrol()
946 smsc911x_reg_write(pdata, AFC_CFG, afc); in smsc911x_phy_update_flowcontrol()
953 struct smsc911x_data *pdata = netdev_priv(dev); in smsc911x_phy_adjust_link() local
958 if (phy_dev->duplex != pdata->last_duplex) { in smsc911x_phy_adjust_link()
960 SMSC_TRACE(pdata, hw, "duplex state has changed"); in smsc911x_phy_adjust_link()
962 spin_lock_irqsave(&pdata->mac_lock, flags); in smsc911x_phy_adjust_link()
963 mac_cr = smsc911x_mac_read(pdata, MAC_CR); in smsc911x_phy_adjust_link()
965 SMSC_TRACE(pdata, hw, in smsc911x_phy_adjust_link()
969 SMSC_TRACE(pdata, hw, in smsc911x_phy_adjust_link()
973 smsc911x_mac_write(pdata, MAC_CR, mac_cr); in smsc911x_phy_adjust_link()
974 spin_unlock_irqrestore(&pdata->mac_lock, flags); in smsc911x_phy_adjust_link()
976 smsc911x_phy_update_flowcontrol(pdata); in smsc911x_phy_adjust_link()
977 pdata->last_duplex = phy_dev->duplex; in smsc911x_phy_adjust_link()
981 if (carrier != pdata->last_carrier) { in smsc911x_phy_adjust_link()
982 SMSC_TRACE(pdata, hw, "carrier state has changed"); in smsc911x_phy_adjust_link()
984 SMSC_TRACE(pdata, hw, "configuring for carrier OK"); in smsc911x_phy_adjust_link()
985 if ((pdata->gpio_orig_setting & GPIO_CFG_LED1_EN_) && in smsc911x_phy_adjust_link()
986 (!pdata->using_extphy)) { in smsc911x_phy_adjust_link()
988 pdata->gpio_setting = pdata->gpio_orig_setting; in smsc911x_phy_adjust_link()
989 smsc911x_reg_write(pdata, GPIO_CFG, in smsc911x_phy_adjust_link()
990 pdata->gpio_setting); in smsc911x_phy_adjust_link()
993 SMSC_TRACE(pdata, hw, "configuring for no carrier"); in smsc911x_phy_adjust_link()
996 pdata->gpio_setting = smsc911x_reg_read(pdata, in smsc911x_phy_adjust_link()
998 if ((pdata->gpio_setting & GPIO_CFG_LED1_EN_) && in smsc911x_phy_adjust_link()
999 (!pdata->using_extphy)) { in smsc911x_phy_adjust_link()
1002 pdata->gpio_orig_setting = pdata->gpio_setting; in smsc911x_phy_adjust_link()
1004 pdata->gpio_setting &= ~GPIO_CFG_LED1_EN_; in smsc911x_phy_adjust_link()
1005 pdata->gpio_setting |= (GPIO_CFG_GPIOBUF0_ in smsc911x_phy_adjust_link()
1008 smsc911x_reg_write(pdata, GPIO_CFG, in smsc911x_phy_adjust_link()
1009 pdata->gpio_setting); in smsc911x_phy_adjust_link()
1012 pdata->last_carrier = carrier; in smsc911x_phy_adjust_link()
1018 struct smsc911x_data *pdata = netdev_priv(dev); in smsc911x_mii_probe() local
1023 phydev = phy_find_first(pdata->mii_bus); in smsc911x_mii_probe()
1029 SMSC_TRACE(pdata, probe, "PHY: addr %d, phy_id 0x%08X", in smsc911x_mii_probe()
1033 pdata->config.phy_interface); 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()
1056 SMSC_TRACE(pdata, hw, "Passed Loop Back Test"); in smsc911x_mii_probe()
1059 SMSC_TRACE(pdata, hw, "phy initialised successfully"); in smsc911x_mii_probe()
1066 struct smsc911x_data *pdata = netdev_priv(dev); in smsc911x_mii_init() local
1070 pdata->mii_bus = mdiobus_alloc(); in smsc911x_mii_init()
1071 if (!pdata->mii_bus) { in smsc911x_mii_init()
1076 pdata->mii_bus->name = SMSC_MDIONAME; in smsc911x_mii_init()
1077 snprintf(pdata->mii_bus->id, MII_BUS_ID_SIZE, "%s-%x", in smsc911x_mii_init()
1079 pdata->mii_bus->priv = pdata; in smsc911x_mii_init()
1080 pdata->mii_bus->read = smsc911x_mii_read; in smsc911x_mii_init()
1081 pdata->mii_bus->write = smsc911x_mii_write; in smsc911x_mii_init()
1083 pdata->mii_bus->parent = &pdev->dev; in smsc911x_mii_init()
1085 switch (pdata->idrev & 0xFFFF0000) { in smsc911x_mii_init()
1091 smsc911x_phy_initialise_external(pdata); in smsc911x_mii_init()
1094 SMSC_TRACE(pdata, hw, "External PHY is not supported, " in smsc911x_mii_init()
1096 pdata->using_extphy = 0; in smsc911x_mii_init()
1100 if (!pdata->using_extphy) { in smsc911x_mii_init()
1102 pdata->mii_bus->phy_mask = ~(1 << 1); in smsc911x_mii_init()
1105 if (mdiobus_register(pdata->mii_bus)) { in smsc911x_mii_init()
1106 SMSC_WARN(pdata, probe, "Error registering mii bus"); in smsc911x_mii_init()
1110 phydev = phy_find_first(pdata->mii_bus); in smsc911x_mii_init()
1117 mdiobus_free(pdata->mii_bus); in smsc911x_mii_init()
1123 static unsigned int smsc911x_tx_get_txstatcount(struct smsc911x_data *pdata) in smsc911x_tx_get_txstatcount() argument
1125 return (smsc911x_reg_read(pdata, TX_FIFO_INF) in smsc911x_tx_get_txstatcount()
1132 struct smsc911x_data *pdata = netdev_priv(dev); in smsc911x_tx_update_txcounters() local
1135 while ((tx_stat = smsc911x_tx_get_txstatus(pdata)) != 0) { in smsc911x_tx_update_txcounters()
1144 SMSC_WARN(pdata, hw, "Packet tag reserved bit is high"); in smsc911x_tx_update_txcounters()
1193 smsc911x_rx_fastforward(struct smsc911x_data *pdata, unsigned int pktwords) in smsc911x_rx_fastforward() argument
1198 smsc911x_reg_write(pdata, RX_DP_CTRL, RX_DP_CTRL_RX_FFWD_); in smsc911x_rx_fastforward()
1201 val = smsc911x_reg_read(pdata, RX_DP_CTRL); in smsc911x_rx_fastforward()
1205 SMSC_WARN(pdata, hw, "Timed out waiting for " in smsc911x_rx_fastforward()
1209 smsc911x_reg_read(pdata, RX_DATA_FIFO); in smsc911x_rx_fastforward()
1216 struct smsc911x_data *pdata = in smsc911x_poll() local
1218 struct net_device *dev = pdata->dev; in smsc911x_poll()
1225 unsigned int rxstat = smsc911x_rx_get_rxstatus(pdata); in smsc911x_poll()
1231 smsc911x_reg_write(pdata, INT_STS, INT_STS_RSFL_); in smsc911x_poll()
1233 temp = smsc911x_reg_read(pdata, INT_EN); in smsc911x_poll()
1235 smsc911x_reg_write(pdata, INT_EN, temp); in smsc911x_poll()
1248 SMSC_WARN(pdata, rx_err, in smsc911x_poll()
1252 smsc911x_rx_fastforward(pdata, pktwords); in smsc911x_poll()
1259 SMSC_WARN(pdata, rx_err, in smsc911x_poll()
1262 smsc911x_rx_fastforward(pdata, pktwords); in smsc911x_poll()
1267 pdata->ops->rx_readfifo(pdata, in smsc911x_poll()
1294 static void smsc911x_rx_multicast_update(struct smsc911x_data *pdata) in smsc911x_rx_multicast_update() argument
1300 SMSC_ASSERT_MAC_LOCK(pdata); in smsc911x_rx_multicast_update()
1302 mac_cr = smsc911x_mac_read(pdata, MAC_CR); in smsc911x_rx_multicast_update()
1303 mac_cr |= pdata->set_bits_mask; in smsc911x_rx_multicast_update()
1304 mac_cr &= ~(pdata->clear_bits_mask); in smsc911x_rx_multicast_update()
1305 smsc911x_mac_write(pdata, MAC_CR, mac_cr); in smsc911x_rx_multicast_update()
1306 smsc911x_mac_write(pdata, HASHH, pdata->hashhi); in smsc911x_rx_multicast_update()
1307 smsc911x_mac_write(pdata, HASHL, pdata->hashlo); in smsc911x_rx_multicast_update()
1308 SMSC_TRACE(pdata, hw, "maccr 0x%08X, HASHH 0x%08X, HASHL 0x%08X", in smsc911x_rx_multicast_update()
1309 mac_cr, pdata->hashhi, pdata->hashlo); in smsc911x_rx_multicast_update()
1312 static void smsc911x_rx_multicast_update_workaround(struct smsc911x_data *pdata) in smsc911x_rx_multicast_update_workaround() argument
1323 spin_lock(&pdata->mac_lock); in smsc911x_rx_multicast_update_workaround()
1326 if (smsc911x_mac_read(pdata, MAC_CR) & MAC_CR_RXEN_) in smsc911x_rx_multicast_update_workaround()
1327 SMSC_WARN(pdata, drv, "Rx not stopped"); in smsc911x_rx_multicast_update_workaround()
1330 smsc911x_rx_multicast_update(pdata); in smsc911x_rx_multicast_update_workaround()
1333 mac_cr = smsc911x_mac_read(pdata, MAC_CR); in smsc911x_rx_multicast_update_workaround()
1335 smsc911x_mac_write(pdata, MAC_CR, mac_cr); in smsc911x_rx_multicast_update_workaround()
1337 pdata->multicast_update_pending = 0; in smsc911x_rx_multicast_update_workaround()
1339 spin_unlock(&pdata->mac_lock); in smsc911x_rx_multicast_update_workaround()
1342 static int smsc911x_phy_general_power_up(struct smsc911x_data *pdata) in smsc911x_phy_general_power_up() argument
1344 struct net_device *ndev = pdata->dev; in smsc911x_phy_general_power_up()
1360 SMSC_WARN(pdata, drv, "Failed reading PHY control reg"); in smsc911x_phy_general_power_up()
1370 SMSC_WARN(pdata, drv, "Failed writing PHY control reg"); in smsc911x_phy_general_power_up()
1380 static int smsc911x_phy_disable_energy_detect(struct smsc911x_data *pdata) in smsc911x_phy_disable_energy_detect() argument
1382 struct net_device *ndev = pdata->dev; in smsc911x_phy_disable_energy_detect()
1392 SMSC_WARN(pdata, drv, "Failed reading PHY control reg"); in smsc911x_phy_disable_energy_detect()
1403 SMSC_WARN(pdata, drv, "Failed writing PHY control reg"); in smsc911x_phy_disable_energy_detect()
1413 static int smsc911x_phy_enable_energy_detect(struct smsc911x_data *pdata) in smsc911x_phy_enable_energy_detect() argument
1415 struct net_device *ndev = pdata->dev; in smsc911x_phy_enable_energy_detect()
1425 SMSC_WARN(pdata, drv, "Failed reading PHY control reg"); in smsc911x_phy_enable_energy_detect()
1436 SMSC_WARN(pdata, drv, "Failed writing PHY control reg"); in smsc911x_phy_enable_energy_detect()
1443 static int smsc911x_soft_reset(struct smsc911x_data *pdata) in smsc911x_soft_reset() argument
1455 ret = smsc911x_phy_general_power_up(pdata); in smsc911x_soft_reset()
1457 SMSC_WARN(pdata, drv, "Failed to power-up the PHY chip"); in smsc911x_soft_reset()
1467 if (pdata->generation == 4) { in smsc911x_soft_reset()
1468 ret = smsc911x_phy_disable_energy_detect(pdata); in smsc911x_soft_reset()
1471 SMSC_WARN(pdata, drv, "Failed to wakeup the PHY chip"); in smsc911x_soft_reset()
1476 if ((pdata->idrev & 0xFFFF0000) == LAN9250) { in smsc911x_soft_reset()
1483 smsc911x_reg_write(pdata, reset_offset, reset_mask); in smsc911x_soft_reset()
1489 temp = smsc911x_reg_read(pdata, reset_offset); in smsc911x_soft_reset()
1493 SMSC_WARN(pdata, drv, "Failed to complete reset"); in smsc911x_soft_reset()
1497 if (pdata->generation == 4) { in smsc911x_soft_reset()
1498 ret = smsc911x_phy_enable_energy_detect(pdata); in smsc911x_soft_reset()
1501 SMSC_WARN(pdata, drv, "Failed to wakeup the PHY chip"); in smsc911x_soft_reset()
1511 smsc911x_set_hw_mac_address(struct smsc911x_data *pdata, const u8 dev_addr[6]) in smsc911x_set_hw_mac_address() argument
1517 SMSC_ASSERT_MAC_LOCK(pdata); in smsc911x_set_hw_mac_address()
1519 smsc911x_mac_write(pdata, ADDRH, mac_high16); in smsc911x_set_hw_mac_address()
1520 smsc911x_mac_write(pdata, ADDRL, mac_low32); in smsc911x_set_hw_mac_address()
1525 struct smsc911x_data *pdata = netdev_priv(dev); in smsc911x_disable_irq_chip() local
1527 smsc911x_reg_write(pdata, INT_EN, 0); in smsc911x_disable_irq_chip()
1528 smsc911x_reg_write(pdata, INT_STS, 0xFFFFFFFF); in smsc911x_disable_irq_chip()
1534 struct smsc911x_data *pdata = netdev_priv(dev); in smsc911x_irqhandler() local
1535 u32 intsts = smsc911x_reg_read(pdata, INT_STS); in smsc911x_irqhandler()
1536 u32 inten = smsc911x_reg_read(pdata, INT_EN); in smsc911x_irqhandler()
1541 temp = smsc911x_reg_read(pdata, INT_EN); in smsc911x_irqhandler()
1543 smsc911x_reg_write(pdata, INT_EN, temp); in smsc911x_irqhandler()
1544 smsc911x_reg_write(pdata, INT_STS, INT_STS_SW_INT_); in smsc911x_irqhandler()
1545 pdata->software_irq_signal = 1; in smsc911x_irqhandler()
1553 SMSC_TRACE(pdata, intr, "RX Stop interrupt"); in smsc911x_irqhandler()
1554 smsc911x_reg_write(pdata, INT_STS, INT_STS_RXSTOP_INT_); in smsc911x_irqhandler()
1555 if (pdata->multicast_update_pending) in smsc911x_irqhandler()
1556 smsc911x_rx_multicast_update_workaround(pdata); in smsc911x_irqhandler()
1561 temp = smsc911x_reg_read(pdata, FIFO_INT); in smsc911x_irqhandler()
1563 smsc911x_reg_write(pdata, FIFO_INT, temp); in smsc911x_irqhandler()
1564 smsc911x_reg_write(pdata, INT_STS, INT_STS_TDFA_); in smsc911x_irqhandler()
1570 SMSC_TRACE(pdata, intr, "RX Error interrupt"); in smsc911x_irqhandler()
1571 smsc911x_reg_write(pdata, INT_STS, INT_STS_RXE_); in smsc911x_irqhandler()
1576 if (likely(napi_schedule_prep(&pdata->napi))) { in smsc911x_irqhandler()
1578 temp = smsc911x_reg_read(pdata, INT_EN); in smsc911x_irqhandler()
1580 smsc911x_reg_write(pdata, INT_EN, temp); in smsc911x_irqhandler()
1582 __napi_schedule(&pdata->napi); in smsc911x_irqhandler()
1584 SMSC_WARN(pdata, rx_err, "napi_schedule_prep failed"); in smsc911x_irqhandler()
1594 struct smsc911x_data *pdata = netdev_priv(dev); in smsc911x_open() local
1607 SMSC_WARN(pdata, probe, "Error starting phy"); in smsc911x_open()
1613 retval = smsc911x_soft_reset(pdata); in smsc911x_open()
1615 SMSC_WARN(pdata, hw, "soft reset failed"); in smsc911x_open()
1619 smsc911x_reg_write(pdata, HW_CFG, 0x00050000); in smsc911x_open()
1620 smsc911x_reg_write(pdata, AFC_CFG, 0x006E3740); in smsc911x_open()
1623 spin_lock_irq(&pdata->mac_lock); in smsc911x_open()
1624 smsc911x_mac_write(pdata, VLAN1, ETH_P_8021Q); in smsc911x_open()
1625 spin_unlock_irq(&pdata->mac_lock); in smsc911x_open()
1629 while ((smsc911x_reg_read(pdata, E2P_CMD) & E2P_CMD_EPC_BUSY_) && in smsc911x_open()
1635 SMSC_WARN(pdata, ifup, in smsc911x_open()
1638 smsc911x_reg_write(pdata, GPIO_CFG, 0x70070000); in smsc911x_open()
1642 spin_lock_irq(&pdata->mac_lock); in smsc911x_open()
1643 smsc911x_set_hw_mac_address(pdata, dev->dev_addr); in smsc911x_open()
1644 spin_unlock_irq(&pdata->mac_lock); in smsc911x_open()
1652 if (pdata->config.irq_polarity) { in smsc911x_open()
1653 SMSC_TRACE(pdata, ifup, "irq polarity: active high"); in smsc911x_open()
1656 SMSC_TRACE(pdata, ifup, "irq polarity: active low"); in smsc911x_open()
1659 if (pdata->config.irq_type) { in smsc911x_open()
1660 SMSC_TRACE(pdata, ifup, "irq type: push-pull"); in smsc911x_open()
1663 SMSC_TRACE(pdata, ifup, "irq type: open drain"); in smsc911x_open()
1666 smsc911x_reg_write(pdata, INT_CFG, intcfg); in smsc911x_open()
1668 SMSC_TRACE(pdata, ifup, "Testing irq handler using IRQ %d", dev->irq); in smsc911x_open()
1669 pdata->software_irq_signal = 0; in smsc911x_open()
1676 SMSC_WARN(pdata, probe, in smsc911x_open()
1681 temp = smsc911x_reg_read(pdata, INT_EN); in smsc911x_open()
1683 smsc911x_reg_write(pdata, INT_EN, temp); in smsc911x_open()
1687 if (pdata->software_irq_signal) in smsc911x_open()
1692 if (!pdata->software_irq_signal) { in smsc911x_open()
1698 SMSC_TRACE(pdata, ifup, "IRQ handler passed test using IRQ %d", in smsc911x_open()
1702 (unsigned long)pdata->ioaddr, dev->irq); in smsc911x_open()
1705 pdata->last_duplex = -1; in smsc911x_open()
1706 pdata->last_carrier = -1; in smsc911x_open()
1711 temp = smsc911x_reg_read(pdata, HW_CFG); in smsc911x_open()
1715 smsc911x_reg_write(pdata, HW_CFG, temp); in smsc911x_open()
1717 temp = smsc911x_reg_read(pdata, FIFO_INT); in smsc911x_open()
1720 smsc911x_reg_write(pdata, FIFO_INT, temp); in smsc911x_open()
1723 smsc911x_reg_write(pdata, RX_CFG, (NET_IP_ALIGN << 8)); in smsc911x_open()
1726 napi_enable(&pdata->napi); in smsc911x_open()
1728 temp = smsc911x_reg_read(pdata, INT_EN); in smsc911x_open()
1730 smsc911x_reg_write(pdata, INT_EN, temp); in smsc911x_open()
1732 spin_lock_irq(&pdata->mac_lock); in smsc911x_open()
1733 temp = smsc911x_mac_read(pdata, MAC_CR); in smsc911x_open()
1735 smsc911x_mac_write(pdata, MAC_CR, temp); in smsc911x_open()
1736 spin_unlock_irq(&pdata->mac_lock); in smsc911x_open()
1738 smsc911x_reg_write(pdata, TX_CFG, TX_CFG_TX_ON_); in smsc911x_open()
1756 struct smsc911x_data *pdata = netdev_priv(dev); in smsc911x_stop() local
1760 temp = smsc911x_reg_read(pdata, INT_CFG); in smsc911x_stop()
1762 smsc911x_reg_write(pdata, INT_CFG, temp); in smsc911x_stop()
1766 napi_disable(&pdata->napi); in smsc911x_stop()
1769 dev->stats.rx_dropped += smsc911x_reg_read(pdata, RX_DROP); in smsc911x_stop()
1783 SMSC_TRACE(pdata, ifdown, "Interface stopped"); in smsc911x_stop()
1791 struct smsc911x_data *pdata = netdev_priv(dev); in smsc911x_hard_start_xmit() local
1799 freespace = smsc911x_reg_read(pdata, TX_FIFO_INF) & TX_FIFO_INF_TDFREE_; in smsc911x_hard_start_xmit()
1802 SMSC_WARN(pdata, tx_err, in smsc911x_hard_start_xmit()
1813 smsc911x_reg_write(pdata, TX_DATA_FIFO, tx_cmd_a); in smsc911x_hard_start_xmit()
1814 smsc911x_reg_write(pdata, TX_DATA_FIFO, tx_cmd_b); in smsc911x_hard_start_xmit()
1821 pdata->ops->tx_writefifo(pdata, (unsigned int *)bufp, wrsz); in smsc911x_hard_start_xmit()
1826 if (unlikely(smsc911x_tx_get_txstatcount(pdata) >= 30)) in smsc911x_hard_start_xmit()
1831 temp = smsc911x_reg_read(pdata, FIFO_INT); in smsc911x_hard_start_xmit()
1834 smsc911x_reg_write(pdata, FIFO_INT, temp); in smsc911x_hard_start_xmit()
1843 struct smsc911x_data *pdata = netdev_priv(dev); in smsc911x_get_stats() local
1845 dev->stats.rx_dropped += smsc911x_reg_read(pdata, RX_DROP); in smsc911x_get_stats()
1852 struct smsc911x_data *pdata = netdev_priv(dev); in smsc911x_set_multicast_list() local
1857 pdata->set_bits_mask = MAC_CR_PRMS_; in smsc911x_set_multicast_list()
1858 pdata->clear_bits_mask = (MAC_CR_MCPAS_ | MAC_CR_HPFILT_); in smsc911x_set_multicast_list()
1859 pdata->hashhi = 0; in smsc911x_set_multicast_list()
1860 pdata->hashlo = 0; in smsc911x_set_multicast_list()
1863 pdata->set_bits_mask = MAC_CR_MCPAS_; in smsc911x_set_multicast_list()
1864 pdata->clear_bits_mask = (MAC_CR_PRMS_ | MAC_CR_HPFILT_); in smsc911x_set_multicast_list()
1865 pdata->hashhi = 0; in smsc911x_set_multicast_list()
1866 pdata->hashlo = 0; in smsc911x_set_multicast_list()
1873 pdata->set_bits_mask = MAC_CR_HPFILT_; in smsc911x_set_multicast_list()
1874 pdata->clear_bits_mask = (MAC_CR_PRMS_ | MAC_CR_MCPAS_); in smsc911x_set_multicast_list()
1886 pdata->hashhi = hash_high; in smsc911x_set_multicast_list()
1887 pdata->hashlo = hash_low; in smsc911x_set_multicast_list()
1890 pdata->set_bits_mask = 0; in smsc911x_set_multicast_list()
1891 pdata->clear_bits_mask = in smsc911x_set_multicast_list()
1893 pdata->hashhi = 0; in smsc911x_set_multicast_list()
1894 pdata->hashlo = 0; in smsc911x_set_multicast_list()
1897 spin_lock_irqsave(&pdata->mac_lock, flags); in smsc911x_set_multicast_list()
1899 if (pdata->generation <= 1) { in smsc911x_set_multicast_list()
1902 if (!pdata->multicast_update_pending) { in smsc911x_set_multicast_list()
1904 SMSC_TRACE(pdata, hw, "scheduling mcast update"); in smsc911x_set_multicast_list()
1905 pdata->multicast_update_pending = 1; in smsc911x_set_multicast_list()
1909 temp = smsc911x_mac_read(pdata, MAC_CR); in smsc911x_set_multicast_list()
1911 smsc911x_mac_write(pdata, MAC_CR, temp); in smsc911x_set_multicast_list()
1918 smsc911x_rx_multicast_update(pdata); in smsc911x_set_multicast_list()
1921 spin_unlock_irqrestore(&pdata->mac_lock, flags); in smsc911x_set_multicast_list()
1935 struct smsc911x_data *pdata = netdev_priv(dev); in smsc911x_set_mac_address() local
1941 if (pdata->generation <= 1 && netif_running(dev)) in smsc911x_set_mac_address()
1949 spin_lock_irq(&pdata->mac_lock); in smsc911x_set_mac_address()
1950 smsc911x_set_hw_mac_address(pdata, dev->dev_addr); in smsc911x_set_mac_address()
1951 spin_unlock_irq(&pdata->mac_lock); in smsc911x_set_mac_address()
1969 struct smsc911x_data *pdata = netdev_priv(dev); in smsc911x_ethtool_getmsglevel() local
1970 return pdata->msg_enable; in smsc911x_ethtool_getmsglevel()
1975 struct smsc911x_data *pdata = netdev_priv(dev); in smsc911x_ethtool_setmsglevel() local
1976 pdata->msg_enable = level; in smsc911x_ethtool_setmsglevel()
1989 struct smsc911x_data *pdata = netdev_priv(dev); in smsc911x_ethtool_getregs() local
1996 regs->version = pdata->idrev; in smsc911x_ethtool_getregs()
1998 data[j++] = smsc911x_reg_read(pdata, i); in smsc911x_ethtool_getregs()
2001 spin_lock_irqsave(&pdata->mac_lock, flags); in smsc911x_ethtool_getregs()
2002 data[j++] = smsc911x_mac_read(pdata, i); in smsc911x_ethtool_getregs()
2003 spin_unlock_irqrestore(&pdata->mac_lock, flags); in smsc911x_ethtool_getregs()
2011 static void smsc911x_eeprom_enable_access(struct smsc911x_data *pdata) in smsc911x_eeprom_enable_access() argument
2013 unsigned int temp = smsc911x_reg_read(pdata, GPIO_CFG); in smsc911x_eeprom_enable_access()
2015 smsc911x_reg_write(pdata, GPIO_CFG, temp); in smsc911x_eeprom_enable_access()
2019 static int smsc911x_eeprom_send_cmd(struct smsc911x_data *pdata, u32 op) in smsc911x_eeprom_send_cmd() argument
2024 SMSC_TRACE(pdata, drv, "op 0x%08x", op); in smsc911x_eeprom_send_cmd()
2025 if (smsc911x_reg_read(pdata, E2P_CMD) & E2P_CMD_EPC_BUSY_) { in smsc911x_eeprom_send_cmd()
2026 SMSC_WARN(pdata, drv, "Busy at start"); in smsc911x_eeprom_send_cmd()
2031 smsc911x_reg_write(pdata, E2P_CMD, e2cmd); in smsc911x_eeprom_send_cmd()
2035 e2cmd = smsc911x_reg_read(pdata, E2P_CMD); in smsc911x_eeprom_send_cmd()
2039 SMSC_TRACE(pdata, drv, "TIMED OUT"); in smsc911x_eeprom_send_cmd()
2044 SMSC_TRACE(pdata, drv, "Error occurred during eeprom operation"); in smsc911x_eeprom_send_cmd()
2051 static int smsc911x_eeprom_read_location(struct smsc911x_data *pdata, in smsc911x_eeprom_read_location() argument
2057 SMSC_TRACE(pdata, drv, "address 0x%x", address); in smsc911x_eeprom_read_location()
2058 ret = smsc911x_eeprom_send_cmd(pdata, op); in smsc911x_eeprom_read_location()
2061 data[address] = smsc911x_reg_read(pdata, E2P_DATA); in smsc911x_eeprom_read_location()
2066 static int smsc911x_eeprom_write_location(struct smsc911x_data *pdata, in smsc911x_eeprom_write_location() argument
2072 SMSC_TRACE(pdata, drv, "address 0x%x, data 0x%x", address, data); in smsc911x_eeprom_write_location()
2073 ret = smsc911x_eeprom_send_cmd(pdata, op); in smsc911x_eeprom_write_location()
2077 smsc911x_reg_write(pdata, E2P_DATA, (u32)data); in smsc911x_eeprom_write_location()
2080 smsc911x_reg_read(pdata, BYTE_TEST); in smsc911x_eeprom_write_location()
2082 ret = smsc911x_eeprom_send_cmd(pdata, op); in smsc911x_eeprom_write_location()
2096 struct smsc911x_data *pdata = netdev_priv(dev); in smsc911x_ethtool_get_eeprom() local
2101 smsc911x_eeprom_enable_access(pdata); in smsc911x_ethtool_get_eeprom()
2105 int ret = smsc911x_eeprom_read_location(pdata, i, eeprom_data); in smsc911x_ethtool_get_eeprom()
2121 struct smsc911x_data *pdata = netdev_priv(dev); in smsc911x_ethtool_set_eeprom() local
2123 smsc911x_eeprom_enable_access(pdata); in smsc911x_ethtool_set_eeprom()
2124 smsc911x_eeprom_send_cmd(pdata, E2P_CMD_EPC_CMD_EWEN_); in smsc911x_ethtool_set_eeprom()
2125 ret = smsc911x_eeprom_write_location(pdata, eeprom->offset, *data); in smsc911x_ethtool_set_eeprom()
2126 smsc911x_eeprom_send_cmd(pdata, E2P_CMD_EPC_CMD_EWDS_); in smsc911x_ethtool_set_eeprom()
2167 struct smsc911x_data *pdata = netdev_priv(dev); in smsc911x_read_mac_address() local
2168 u32 mac_high16 = smsc911x_mac_read(pdata, ADDRH); in smsc911x_read_mac_address()
2169 u32 mac_low32 = smsc911x_mac_read(pdata, ADDRL); in smsc911x_read_mac_address()
2184 struct smsc911x_data *pdata = netdev_priv(dev); in smsc911x_init() local
2188 SMSC_TRACE(pdata, probe, "Driver Parameters:"); in smsc911x_init()
2189 SMSC_TRACE(pdata, probe, "LAN base: 0x%08lX", in smsc911x_init()
2190 (unsigned long)pdata->ioaddr); in smsc911x_init()
2191 SMSC_TRACE(pdata, probe, "IRQ: %d", dev->irq); in smsc911x_init()
2192 SMSC_TRACE(pdata, probe, "PHY will be autodetected."); in smsc911x_init()
2194 spin_lock_init(&pdata->dev_lock); in smsc911x_init()
2195 spin_lock_init(&pdata->mac_lock); in smsc911x_init()
2197 if (pdata->ioaddr == NULL) { in smsc911x_init()
2198 SMSC_WARN(pdata, probe, "pdata->ioaddr: 0x00000000"); in smsc911x_init()
2218 while (!(smsc911x_reg_read(pdata, PMT_CTRL) & mask) && --to) in smsc911x_init()
2227 byte_test = smsc911x_reg_read(pdata, BYTE_TEST); in smsc911x_init()
2228 SMSC_TRACE(pdata, probe, "BYTE_TEST: 0x%08X", byte_test); in smsc911x_init()
2230 SMSC_TRACE(pdata, probe, "BYTE_TEST looks swapped, " in smsc911x_init()
2232 smsc911x_reg_write(pdata, WORD_SWAP, 0xffffffff); in smsc911x_init()
2236 byte_test = smsc911x_reg_read(pdata, BYTE_TEST); in smsc911x_init()
2238 byte_test = smsc911x_reg_read(pdata, BYTE_TEST); in smsc911x_init()
2242 SMSC_WARN(pdata, drv, "BYTE_TEST: 0x%08X", byte_test); in smsc911x_init()
2244 SMSC_WARN(pdata, probe, in smsc911x_init()
2246 SMSC_TRACE(pdata, probe, in smsc911x_init()
2254 pdata->generation = 0; in smsc911x_init()
2256 pdata->idrev = smsc911x_reg_read(pdata, ID_REV); in smsc911x_init()
2257 switch (pdata->idrev & 0xFFFF0000) { in smsc911x_init()
2264 pdata->generation = pdata->idrev & 0x0000FFFF; in smsc911x_init()
2272 pdata->generation = 3; in smsc911x_init()
2281 pdata->generation = 4; in smsc911x_init()
2285 SMSC_WARN(pdata, probe, "LAN911x not identified, idrev: 0x%08X", in smsc911x_init()
2286 pdata->idrev); in smsc911x_init()
2290 SMSC_TRACE(pdata, probe, in smsc911x_init()
2292 pdata->idrev, pdata->generation); in smsc911x_init()
2294 if (pdata->generation == 0) in smsc911x_init()
2295 SMSC_WARN(pdata, probe, in smsc911x_init()
2301 if (pdata->config.flags & SMSC911X_SAVE_MAC_ADDRESS) { in smsc911x_init()
2302 spin_lock_irq(&pdata->mac_lock); in smsc911x_init()
2304 spin_unlock_irq(&pdata->mac_lock); in smsc911x_init()
2308 if (smsc911x_phy_reset(pdata) || smsc911x_soft_reset(pdata)) in smsc911x_init()
2312 netif_napi_add_weight(dev, &pdata->napi, smsc911x_poll, in smsc911x_init()
2323 struct smsc911x_data *pdata; in smsc911x_drv_remove() local
2328 pdata = netdev_priv(dev); in smsc911x_drv_remove()
2329 BUG_ON(!pdata); in smsc911x_drv_remove()
2330 BUG_ON(!pdata->ioaddr); in smsc911x_drv_remove()
2332 SMSC_TRACE(pdata, ifdown, "Stopping driver"); in smsc911x_drv_remove()
2336 mdiobus_unregister(pdata->mii_bus); in smsc911x_drv_remove()
2337 mdiobus_free(pdata->mii_bus); in smsc911x_drv_remove()
2346 iounmap(pdata->ioaddr); in smsc911x_drv_remove()
2419 struct smsc911x_data *pdata; in smsc911x_drv_probe() local
2459 pdata = netdev_priv(dev); in smsc911x_drv_probe()
2461 pdata->ioaddr = ioremap(res->start, res_size); in smsc911x_drv_probe()
2462 if (!pdata->ioaddr) { in smsc911x_drv_probe()
2467 pdata->dev = dev; in smsc911x_drv_probe()
2468 pdata->msg_enable = ((1 << debug) - 1); in smsc911x_drv_probe()
2480 if (pdata->ioaddr == NULL) { in smsc911x_drv_probe()
2481 SMSC_WARN(pdata, probe, "Error smsc911x base address invalid"); in smsc911x_drv_probe()
2486 retval = smsc911x_probe_config(&pdata->config, &pdev->dev); in smsc911x_drv_probe()
2489 memcpy(&pdata->config, config, sizeof(pdata->config)); in smsc911x_drv_probe()
2494 SMSC_WARN(pdata, probe, "Error smsc911x config not found"); in smsc911x_drv_probe()
2499 pdata->ops = &standard_smsc911x_ops; in smsc911x_drv_probe()
2501 if (pdata->config.shift) in smsc911x_drv_probe()
2502 pdata->ops = &shifted_smsc911x_ops; in smsc911x_drv_probe()
2515 SMSC_WARN(pdata, probe, "Error %i initialising mii", retval); in smsc911x_drv_probe()
2521 SMSC_WARN(pdata, probe, "Error %i registering device", retval); in smsc911x_drv_probe()
2524 SMSC_TRACE(pdata, probe, in smsc911x_drv_probe()
2528 spin_lock_irq(&pdata->mac_lock); in smsc911x_drv_probe()
2532 smsc911x_set_hw_mac_address(pdata, dev->dev_addr); in smsc911x_drv_probe()
2533 SMSC_TRACE(pdata, probe, in smsc911x_drv_probe()
2535 } else if (is_valid_ether_addr(pdata->config.mac)) { in smsc911x_drv_probe()
2536 eth_hw_addr_set(dev, pdata->config.mac); in smsc911x_drv_probe()
2537 SMSC_TRACE(pdata, probe, in smsc911x_drv_probe()
2546 SMSC_TRACE(pdata, probe, in smsc911x_drv_probe()
2551 smsc911x_set_hw_mac_address(pdata, dev->dev_addr); in smsc911x_drv_probe()
2552 SMSC_TRACE(pdata, probe, in smsc911x_drv_probe()
2557 spin_unlock_irq(&pdata->mac_lock); in smsc911x_drv_probe()
2572 iounmap(pdata->ioaddr); in smsc911x_drv_probe()
2590 struct smsc911x_data *pdata = netdev_priv(ndev); in smsc911x_suspend() local
2601 smsc911x_reg_write(pdata, PMT_CTRL, in smsc911x_suspend()
2614 struct smsc911x_data *pdata = netdev_priv(ndev); in smsc911x_resume() local
2624 smsc911x_reg_write(pdata, BYTE_TEST, 0); in smsc911x_resume()
2629 while (!(smsc911x_reg_read(pdata, PMT_CTRL) & PMT_CTRL_READY_) && --to) in smsc911x_resume()