Lines Matching refs:pd
100 static inline u32 smsc9420_reg_read(struct smsc9420_pdata *pd, u32 offset) in smsc9420_reg_read() argument
102 return ioread32(pd->ioaddr + offset); in smsc9420_reg_read()
106 smsc9420_reg_write(struct smsc9420_pdata *pd, u32 offset, u32 value) in smsc9420_reg_write() argument
108 iowrite32(value, pd->ioaddr + offset); in smsc9420_reg_write()
111 static inline void smsc9420_pci_flush_write(struct smsc9420_pdata *pd) in smsc9420_pci_flush_write() argument
114 smsc9420_reg_read(pd, ID_REV); in smsc9420_pci_flush_write()
119 struct smsc9420_pdata *pd = (struct smsc9420_pdata *)bus->priv; in smsc9420_mii_read() local
124 spin_lock_irqsave(&pd->phy_lock, flags); in smsc9420_mii_read()
127 if ((smsc9420_reg_read(pd, MII_ACCESS) & MII_ACCESS_MII_BUSY_)) { in smsc9420_mii_read()
128 netif_warn(pd, drv, pd->dev, "MII is busy???\n"); in smsc9420_mii_read()
135 smsc9420_reg_write(pd, MII_ACCESS, addr); in smsc9420_mii_read()
139 if (!(smsc9420_reg_read(pd, MII_ACCESS) & in smsc9420_mii_read()
141 reg = (u16)smsc9420_reg_read(pd, MII_DATA); in smsc9420_mii_read()
147 netif_warn(pd, drv, pd->dev, "MII busy timeout!\n"); in smsc9420_mii_read()
150 spin_unlock_irqrestore(&pd->phy_lock, flags); in smsc9420_mii_read()
157 struct smsc9420_pdata *pd = (struct smsc9420_pdata *)bus->priv; in smsc9420_mii_write() local
162 spin_lock_irqsave(&pd->phy_lock, flags); in smsc9420_mii_write()
165 if ((smsc9420_reg_read(pd, MII_ACCESS) & MII_ACCESS_MII_BUSY_)) { in smsc9420_mii_write()
166 netif_warn(pd, drv, pd->dev, "MII is busy???\n"); in smsc9420_mii_write()
171 smsc9420_reg_write(pd, MII_DATA, (u32)val); in smsc9420_mii_write()
176 smsc9420_reg_write(pd, MII_ACCESS, addr); in smsc9420_mii_write()
180 if (!(smsc9420_reg_read(pd, MII_ACCESS) & in smsc9420_mii_write()
188 netif_warn(pd, drv, pd->dev, "MII busy timeout!\n"); in smsc9420_mii_write()
191 spin_unlock_irqrestore(&pd->phy_lock, flags); in smsc9420_mii_write()
203 static int smsc9420_eeprom_reload(struct smsc9420_pdata *pd) in smsc9420_eeprom_reload() argument
207 BUG_ON(!pd); in smsc9420_eeprom_reload()
209 if (smsc9420_reg_read(pd, E2P_CMD) & E2P_CMD_EPC_BUSY_) { in smsc9420_eeprom_reload()
210 netif_dbg(pd, drv, pd->dev, "%s: Eeprom busy\n", __func__); in smsc9420_eeprom_reload()
214 smsc9420_reg_write(pd, E2P_CMD, in smsc9420_eeprom_reload()
219 if (!(smsc9420_reg_read(pd, E2P_CMD) & E2P_CMD_EPC_BUSY_)) in smsc9420_eeprom_reload()
223 netif_warn(pd, drv, pd->dev, "%s: Eeprom timed out\n", __func__); in smsc9420_eeprom_reload()
230 struct smsc9420_pdata *pd = netdev_priv(dev); in smsc9420_do_ioctl() local
232 if (!netif_running(dev) || !pd->phy_dev) in smsc9420_do_ioctl()
235 return phy_mii_ioctl(pd->phy_dev, ifr, cmd); in smsc9420_do_ioctl()
241 struct smsc9420_pdata *pd = netdev_priv(dev); in smsc9420_ethtool_get_settings() local
243 if (!pd->phy_dev) in smsc9420_ethtool_get_settings()
248 return phy_ethtool_gset(pd->phy_dev, cmd); in smsc9420_ethtool_get_settings()
254 struct smsc9420_pdata *pd = netdev_priv(dev); in smsc9420_ethtool_set_settings() local
256 if (!pd->phy_dev) in smsc9420_ethtool_set_settings()
259 return phy_ethtool_sset(pd->phy_dev, cmd); in smsc9420_ethtool_set_settings()
265 struct smsc9420_pdata *pd = netdev_priv(netdev); in smsc9420_ethtool_get_drvinfo() local
268 strlcpy(drvinfo->bus_info, pci_name(pd->pdev), in smsc9420_ethtool_get_drvinfo()
275 struct smsc9420_pdata *pd = netdev_priv(netdev); in smsc9420_ethtool_get_msglevel() local
276 return pd->msg_enable; in smsc9420_ethtool_get_msglevel()
281 struct smsc9420_pdata *pd = netdev_priv(netdev); in smsc9420_ethtool_set_msglevel() local
282 pd->msg_enable = data; in smsc9420_ethtool_set_msglevel()
287 struct smsc9420_pdata *pd = netdev_priv(netdev); in smsc9420_ethtool_nway_reset() local
289 if (!pd->phy_dev) in smsc9420_ethtool_nway_reset()
292 return phy_start_aneg(pd->phy_dev); in smsc9420_ethtool_nway_reset()
305 struct smsc9420_pdata *pd = netdev_priv(dev); in smsc9420_ethtool_getregs() local
306 struct phy_device *phy_dev = pd->phy_dev; in smsc9420_ethtool_getregs()
310 regs->version = smsc9420_reg_read(pd, ID_REV); in smsc9420_ethtool_getregs()
312 data[j++] = smsc9420_reg_read(pd, i); in smsc9420_ethtool_getregs()
322 static void smsc9420_eeprom_enable_access(struct smsc9420_pdata *pd) in smsc9420_eeprom_enable_access() argument
324 unsigned int temp = smsc9420_reg_read(pd, GPIO_CFG); in smsc9420_eeprom_enable_access()
326 smsc9420_reg_write(pd, GPIO_CFG, temp); in smsc9420_eeprom_enable_access()
330 static int smsc9420_eeprom_send_cmd(struct smsc9420_pdata *pd, u32 op) in smsc9420_eeprom_send_cmd() argument
335 netif_dbg(pd, hw, pd->dev, "op 0x%08x\n", op); in smsc9420_eeprom_send_cmd()
336 if (smsc9420_reg_read(pd, E2P_CMD) & E2P_CMD_EPC_BUSY_) { in smsc9420_eeprom_send_cmd()
337 netif_warn(pd, hw, pd->dev, "Busy at start\n"); in smsc9420_eeprom_send_cmd()
342 smsc9420_reg_write(pd, E2P_CMD, e2cmd); in smsc9420_eeprom_send_cmd()
346 e2cmd = smsc9420_reg_read(pd, E2P_CMD); in smsc9420_eeprom_send_cmd()
350 netif_info(pd, hw, pd->dev, "TIMED OUT\n"); in smsc9420_eeprom_send_cmd()
355 netif_info(pd, hw, pd->dev, in smsc9420_eeprom_send_cmd()
363 static int smsc9420_eeprom_read_location(struct smsc9420_pdata *pd, in smsc9420_eeprom_read_location() argument
369 netif_dbg(pd, hw, pd->dev, "address 0x%x\n", address); in smsc9420_eeprom_read_location()
370 ret = smsc9420_eeprom_send_cmd(pd, op); in smsc9420_eeprom_read_location()
373 data[address] = smsc9420_reg_read(pd, E2P_DATA); in smsc9420_eeprom_read_location()
378 static int smsc9420_eeprom_write_location(struct smsc9420_pdata *pd, in smsc9420_eeprom_write_location() argument
384 netif_dbg(pd, hw, pd->dev, "address 0x%x, data 0x%x\n", address, data); in smsc9420_eeprom_write_location()
385 ret = smsc9420_eeprom_send_cmd(pd, op); in smsc9420_eeprom_write_location()
389 smsc9420_reg_write(pd, E2P_DATA, (u32)data); in smsc9420_eeprom_write_location()
390 ret = smsc9420_eeprom_send_cmd(pd, op); in smsc9420_eeprom_write_location()
404 struct smsc9420_pdata *pd = netdev_priv(dev); in smsc9420_ethtool_get_eeprom() local
408 smsc9420_eeprom_enable_access(pd); in smsc9420_ethtool_get_eeprom()
412 int ret = smsc9420_eeprom_read_location(pd, i, eeprom_data); in smsc9420_ethtool_get_eeprom()
428 struct smsc9420_pdata *pd = netdev_priv(dev); in smsc9420_ethtool_set_eeprom() local
434 smsc9420_eeprom_enable_access(pd); in smsc9420_ethtool_set_eeprom()
435 smsc9420_eeprom_send_cmd(pd, E2P_CMD_EPC_CMD_EWEN_); in smsc9420_ethtool_set_eeprom()
436 ret = smsc9420_eeprom_write_location(pd, eeprom->offset, *data); in smsc9420_ethtool_set_eeprom()
437 smsc9420_eeprom_send_cmd(pd, E2P_CMD_EPC_CMD_EWDS_); in smsc9420_ethtool_set_eeprom()
464 struct smsc9420_pdata *pd = netdev_priv(dev); in smsc9420_set_mac_address() local
470 smsc9420_reg_write(pd, ADDRH, mac_high16); in smsc9420_set_mac_address()
471 smsc9420_reg_write(pd, ADDRL, mac_low32); in smsc9420_set_mac_address()
476 struct smsc9420_pdata *pd = netdev_priv(dev); in smsc9420_check_mac_address() local
481 netif_dbg(pd, probe, pd->dev, in smsc9420_check_mac_address()
486 u32 mac_high16 = smsc9420_reg_read(pd, ADDRH); in smsc9420_check_mac_address()
487 u32 mac_low32 = smsc9420_reg_read(pd, ADDRL); in smsc9420_check_mac_address()
497 netif_dbg(pd, probe, pd->dev, in smsc9420_check_mac_address()
503 netif_dbg(pd, probe, pd->dev, in smsc9420_check_mac_address()
509 static void smsc9420_stop_tx(struct smsc9420_pdata *pd) in smsc9420_stop_tx() argument
515 dmac_control = smsc9420_reg_read(pd, DMAC_CONTROL); in smsc9420_stop_tx()
517 smsc9420_reg_write(pd, DMAC_CONTROL, dmac_control); in smsc9420_stop_tx()
521 if (smsc9420_reg_read(pd, DMAC_STATUS) & DMAC_STS_TS_) in smsc9420_stop_tx()
527 netif_warn(pd, ifdown, pd->dev, "TX DMAC failed to stop\n"); in smsc9420_stop_tx()
530 smsc9420_reg_write(pd, DMAC_STATUS, DMAC_STS_TXPS_); in smsc9420_stop_tx()
533 dma_intr_ena = smsc9420_reg_read(pd, DMAC_INTR_ENA); in smsc9420_stop_tx()
535 smsc9420_reg_write(pd, DMAC_INTR_ENA, dma_intr_ena); in smsc9420_stop_tx()
536 smsc9420_pci_flush_write(pd); in smsc9420_stop_tx()
539 mac_cr = smsc9420_reg_read(pd, MAC_CR) & (~MAC_CR_TXEN_); in smsc9420_stop_tx()
540 smsc9420_reg_write(pd, MAC_CR, mac_cr); in smsc9420_stop_tx()
541 smsc9420_pci_flush_write(pd); in smsc9420_stop_tx()
544 static void smsc9420_free_tx_ring(struct smsc9420_pdata *pd) in smsc9420_free_tx_ring() argument
548 BUG_ON(!pd->tx_ring); in smsc9420_free_tx_ring()
550 if (!pd->tx_buffers) in smsc9420_free_tx_ring()
554 struct sk_buff *skb = pd->tx_buffers[i].skb; in smsc9420_free_tx_ring()
557 BUG_ON(!pd->tx_buffers[i].mapping); in smsc9420_free_tx_ring()
558 pci_unmap_single(pd->pdev, pd->tx_buffers[i].mapping, in smsc9420_free_tx_ring()
563 pd->tx_ring[i].status = 0; in smsc9420_free_tx_ring()
564 pd->tx_ring[i].length = 0; in smsc9420_free_tx_ring()
565 pd->tx_ring[i].buffer1 = 0; in smsc9420_free_tx_ring()
566 pd->tx_ring[i].buffer2 = 0; in smsc9420_free_tx_ring()
570 kfree(pd->tx_buffers); in smsc9420_free_tx_ring()
571 pd->tx_buffers = NULL; in smsc9420_free_tx_ring()
573 pd->tx_ring_head = 0; in smsc9420_free_tx_ring()
574 pd->tx_ring_tail = 0; in smsc9420_free_tx_ring()
577 static void smsc9420_free_rx_ring(struct smsc9420_pdata *pd) in smsc9420_free_rx_ring() argument
581 BUG_ON(!pd->rx_ring); in smsc9420_free_rx_ring()
583 if (!pd->rx_buffers) in smsc9420_free_rx_ring()
587 if (pd->rx_buffers[i].skb) in smsc9420_free_rx_ring()
588 dev_kfree_skb_any(pd->rx_buffers[i].skb); in smsc9420_free_rx_ring()
590 if (pd->rx_buffers[i].mapping) in smsc9420_free_rx_ring()
591 pci_unmap_single(pd->pdev, pd->rx_buffers[i].mapping, in smsc9420_free_rx_ring()
594 pd->rx_ring[i].status = 0; in smsc9420_free_rx_ring()
595 pd->rx_ring[i].length = 0; in smsc9420_free_rx_ring()
596 pd->rx_ring[i].buffer1 = 0; in smsc9420_free_rx_ring()
597 pd->rx_ring[i].buffer2 = 0; in smsc9420_free_rx_ring()
601 kfree(pd->rx_buffers); in smsc9420_free_rx_ring()
602 pd->rx_buffers = NULL; in smsc9420_free_rx_ring()
604 pd->rx_ring_head = 0; in smsc9420_free_rx_ring()
605 pd->rx_ring_tail = 0; in smsc9420_free_rx_ring()
608 static void smsc9420_stop_rx(struct smsc9420_pdata *pd) in smsc9420_stop_rx() argument
614 dma_intr_ena = smsc9420_reg_read(pd, DMAC_INTR_ENA); in smsc9420_stop_rx()
616 smsc9420_reg_write(pd, DMAC_INTR_ENA, dma_intr_ena); in smsc9420_stop_rx()
617 smsc9420_pci_flush_write(pd); in smsc9420_stop_rx()
620 mac_cr = smsc9420_reg_read(pd, MAC_CR) & (~MAC_CR_RXEN_); in smsc9420_stop_rx()
621 smsc9420_reg_write(pd, MAC_CR, mac_cr); in smsc9420_stop_rx()
622 smsc9420_pci_flush_write(pd); in smsc9420_stop_rx()
625 dmac_control = smsc9420_reg_read(pd, DMAC_CONTROL); in smsc9420_stop_rx()
627 smsc9420_reg_write(pd, DMAC_CONTROL, dmac_control); in smsc9420_stop_rx()
628 smsc9420_pci_flush_write(pd); in smsc9420_stop_rx()
632 if (smsc9420_reg_read(pd, DMAC_STATUS) & DMAC_STS_RS_) in smsc9420_stop_rx()
638 netif_warn(pd, ifdown, pd->dev, in smsc9420_stop_rx()
642 smsc9420_reg_write(pd, DMAC_STATUS, DMAC_STS_RXPS_); in smsc9420_stop_rx()
647 struct smsc9420_pdata *pd = dev_id; in smsc9420_isr() local
652 BUG_ON(!pd); in smsc9420_isr()
653 BUG_ON(!pd->ioaddr); in smsc9420_isr()
655 int_cfg = smsc9420_reg_read(pd, INT_CFG); in smsc9420_isr()
662 int_sts = smsc9420_reg_read(pd, INT_STAT); in smsc9420_isr()
665 u32 status = smsc9420_reg_read(pd, DMAC_STATUS); in smsc9420_isr()
670 netif_wake_queue(pd->dev); in smsc9420_isr()
675 u32 dma_intr_ena = smsc9420_reg_read(pd, DMAC_INTR_ENA); in smsc9420_isr()
677 smsc9420_reg_write(pd, DMAC_INTR_ENA, dma_intr_ena); in smsc9420_isr()
678 smsc9420_pci_flush_write(pd); in smsc9420_isr()
681 napi_schedule(&pd->napi); in smsc9420_isr()
685 smsc9420_reg_write(pd, DMAC_STATUS, ints_to_clear); in smsc9420_isr()
692 spin_lock_irqsave(&pd->int_lock, flags); in smsc9420_isr()
693 int_ctl = smsc9420_reg_read(pd, INT_CTL); in smsc9420_isr()
695 smsc9420_reg_write(pd, INT_CTL, int_ctl); in smsc9420_isr()
696 spin_unlock_irqrestore(&pd->int_lock, flags); in smsc9420_isr()
698 smsc9420_reg_write(pd, INT_STAT, INT_STAT_SW_INT_); in smsc9420_isr()
699 pd->software_irq_signal = true; in smsc9420_isr()
706 smsc9420_pci_flush_write(pd); in smsc9420_isr()
714 struct smsc9420_pdata *pd = netdev_priv(dev); in smsc9420_poll_controller() local
715 const int irq = pd->pdev->irq; in smsc9420_poll_controller()
723 static void smsc9420_dmac_soft_reset(struct smsc9420_pdata *pd) in smsc9420_dmac_soft_reset() argument
725 smsc9420_reg_write(pd, BUS_MODE, BUS_MODE_SWR_); in smsc9420_dmac_soft_reset()
726 smsc9420_reg_read(pd, BUS_MODE); in smsc9420_dmac_soft_reset()
728 if (smsc9420_reg_read(pd, BUS_MODE) & BUS_MODE_SWR_) in smsc9420_dmac_soft_reset()
729 netif_warn(pd, drv, pd->dev, "Software reset not cleared\n"); in smsc9420_dmac_soft_reset()
734 struct smsc9420_pdata *pd = netdev_priv(dev); in smsc9420_stop() local
738 BUG_ON(!pd); in smsc9420_stop()
739 BUG_ON(!pd->phy_dev); in smsc9420_stop()
742 spin_lock_irqsave(&pd->int_lock, flags); in smsc9420_stop()
743 int_cfg = smsc9420_reg_read(pd, INT_CFG) & (~INT_CFG_IRQ_EN_); in smsc9420_stop()
744 smsc9420_reg_write(pd, INT_CFG, int_cfg); in smsc9420_stop()
745 spin_unlock_irqrestore(&pd->int_lock, flags); in smsc9420_stop()
748 napi_disable(&pd->napi); in smsc9420_stop()
750 smsc9420_stop_tx(pd); in smsc9420_stop()
751 smsc9420_free_tx_ring(pd); in smsc9420_stop()
753 smsc9420_stop_rx(pd); in smsc9420_stop()
754 smsc9420_free_rx_ring(pd); in smsc9420_stop()
756 free_irq(pd->pdev->irq, pd); in smsc9420_stop()
758 smsc9420_dmac_soft_reset(pd); in smsc9420_stop()
760 phy_stop(pd->phy_dev); in smsc9420_stop()
762 phy_disconnect(pd->phy_dev); in smsc9420_stop()
763 pd->phy_dev = NULL; in smsc9420_stop()
764 mdiobus_unregister(pd->mii_bus); in smsc9420_stop()
765 mdiobus_free(pd->mii_bus); in smsc9420_stop()
794 static void smsc9420_rx_handoff(struct smsc9420_pdata *pd, const int index, in smsc9420_rx_handoff() argument
797 struct net_device *dev = pd->dev; in smsc9420_rx_handoff()
805 if (pd->rx_csum) in smsc9420_rx_handoff()
811 pci_unmap_single(pd->pdev, pd->rx_buffers[index].mapping, in smsc9420_rx_handoff()
813 pd->rx_buffers[index].mapping = 0; in smsc9420_rx_handoff()
815 skb = pd->rx_buffers[index].skb; in smsc9420_rx_handoff()
816 pd->rx_buffers[index].skb = NULL; in smsc9420_rx_handoff()
818 if (pd->rx_csum) { in smsc9420_rx_handoff()
833 static int smsc9420_alloc_rx_buffer(struct smsc9420_pdata *pd, int index) in smsc9420_alloc_rx_buffer() argument
835 struct sk_buff *skb = netdev_alloc_skb(pd->dev, PKT_BUF_SZ); in smsc9420_alloc_rx_buffer()
838 BUG_ON(pd->rx_buffers[index].skb); in smsc9420_alloc_rx_buffer()
839 BUG_ON(pd->rx_buffers[index].mapping); in smsc9420_alloc_rx_buffer()
844 mapping = pci_map_single(pd->pdev, skb_tail_pointer(skb), in smsc9420_alloc_rx_buffer()
846 if (pci_dma_mapping_error(pd->pdev, mapping)) { in smsc9420_alloc_rx_buffer()
848 netif_warn(pd, rx_err, pd->dev, "pci_map_single failed!\n"); in smsc9420_alloc_rx_buffer()
852 pd->rx_buffers[index].skb = skb; in smsc9420_alloc_rx_buffer()
853 pd->rx_buffers[index].mapping = mapping; in smsc9420_alloc_rx_buffer()
854 pd->rx_ring[index].buffer1 = mapping + NET_IP_ALIGN; in smsc9420_alloc_rx_buffer()
855 pd->rx_ring[index].status = RDES0_OWN_; in smsc9420_alloc_rx_buffer()
861 static void smsc9420_alloc_new_rx_buffers(struct smsc9420_pdata *pd) in smsc9420_alloc_new_rx_buffers() argument
863 while (pd->rx_ring_tail != pd->rx_ring_head) { in smsc9420_alloc_new_rx_buffers()
864 if (smsc9420_alloc_rx_buffer(pd, pd->rx_ring_tail)) in smsc9420_alloc_new_rx_buffers()
867 pd->rx_ring_tail = (pd->rx_ring_tail + 1) % RX_RING_SIZE; in smsc9420_alloc_new_rx_buffers()
873 struct smsc9420_pdata *pd = in smsc9420_rx_poll() local
875 struct net_device *dev = pd->dev; in smsc9420_rx_poll()
881 status = pd->rx_ring[pd->rx_ring_head].status; in smsc9420_rx_poll()
888 smsc9420_rx_handoff(pd, pd->rx_ring_head, status); in smsc9420_rx_poll()
889 pd->rx_ring_head = (pd->rx_ring_head + 1) % RX_RING_SIZE; in smsc9420_rx_poll()
890 smsc9420_alloc_new_rx_buffers(pd); in smsc9420_rx_poll()
893 drop_frame_cnt = smsc9420_reg_read(pd, MISS_FRAME_CNTR); in smsc9420_rx_poll()
898 smsc9420_reg_write(pd, RX_POLL_DEMAND, 1); in smsc9420_rx_poll()
899 smsc9420_pci_flush_write(pd); in smsc9420_rx_poll()
902 napi_complete(&pd->napi); in smsc9420_rx_poll()
905 dma_intr_ena = smsc9420_reg_read(pd, DMAC_INTR_ENA); in smsc9420_rx_poll()
907 smsc9420_reg_write(pd, DMAC_INTR_ENA, dma_intr_ena); in smsc9420_rx_poll()
908 smsc9420_pci_flush_write(pd); in smsc9420_rx_poll()
944 struct smsc9420_pdata *pd = netdev_priv(dev); in smsc9420_complete_tx() local
946 while (pd->tx_ring_tail != pd->tx_ring_head) { in smsc9420_complete_tx()
947 int index = pd->tx_ring_tail; in smsc9420_complete_tx()
951 status = pd->tx_ring[index].status; in smsc9420_complete_tx()
952 length = pd->tx_ring[index].length; in smsc9420_complete_tx()
960 BUG_ON(!pd->tx_buffers[index].skb); in smsc9420_complete_tx()
961 BUG_ON(!pd->tx_buffers[index].mapping); in smsc9420_complete_tx()
963 pci_unmap_single(pd->pdev, pd->tx_buffers[index].mapping, in smsc9420_complete_tx()
964 pd->tx_buffers[index].skb->len, PCI_DMA_TODEVICE); in smsc9420_complete_tx()
965 pd->tx_buffers[index].mapping = 0; in smsc9420_complete_tx()
967 dev_kfree_skb_any(pd->tx_buffers[index].skb); in smsc9420_complete_tx()
968 pd->tx_buffers[index].skb = NULL; in smsc9420_complete_tx()
970 pd->tx_ring[index].buffer1 = 0; in smsc9420_complete_tx()
973 pd->tx_ring_tail = (pd->tx_ring_tail + 1) % TX_RING_SIZE; in smsc9420_complete_tx()
980 struct smsc9420_pdata *pd = netdev_priv(dev); in smsc9420_hard_start_xmit() local
982 int index = pd->tx_ring_head; in smsc9420_hard_start_xmit()
985 (((pd->tx_ring_head + 2) % TX_RING_SIZE) == pd->tx_ring_tail); in smsc9420_hard_start_xmit()
990 BUG_ON(pd->tx_ring[index].status & TDES0_OWN_); in smsc9420_hard_start_xmit()
991 BUG_ON(pd->tx_buffers[index].skb); in smsc9420_hard_start_xmit()
992 BUG_ON(pd->tx_buffers[index].mapping); in smsc9420_hard_start_xmit()
994 mapping = pci_map_single(pd->pdev, skb->data, in smsc9420_hard_start_xmit()
996 if (pci_dma_mapping_error(pd->pdev, mapping)) { in smsc9420_hard_start_xmit()
997 netif_warn(pd, tx_err, pd->dev, in smsc9420_hard_start_xmit()
1002 pd->tx_buffers[index].skb = skb; in smsc9420_hard_start_xmit()
1003 pd->tx_buffers[index].mapping = mapping; in smsc9420_hard_start_xmit()
1008 netif_stop_queue(pd->dev); in smsc9420_hard_start_xmit()
1015 pd->tx_ring[index].buffer1 = mapping; in smsc9420_hard_start_xmit()
1016 pd->tx_ring[index].length = tmp_desc1; in smsc9420_hard_start_xmit()
1020 pd->tx_ring_head = (pd->tx_ring_head + 1) % TX_RING_SIZE; in smsc9420_hard_start_xmit()
1023 pd->tx_ring[index].status = TDES0_OWN_; in smsc9420_hard_start_xmit()
1029 smsc9420_reg_write(pd, TX_POLL_DEMAND, 1); in smsc9420_hard_start_xmit()
1030 smsc9420_pci_flush_write(pd); in smsc9420_hard_start_xmit()
1037 struct smsc9420_pdata *pd = netdev_priv(dev); in smsc9420_get_stats() local
1038 u32 counter = smsc9420_reg_read(pd, MISS_FRAME_CNTR); in smsc9420_get_stats()
1046 struct smsc9420_pdata *pd = netdev_priv(dev); in smsc9420_set_multicast_list() local
1047 u32 mac_cr = smsc9420_reg_read(pd, MAC_CR); in smsc9420_set_multicast_list()
1050 netif_dbg(pd, hw, pd->dev, "Promiscuous Mode Enabled\n"); in smsc9420_set_multicast_list()
1055 netif_dbg(pd, hw, pd->dev, "Receive all Multicast Enabled\n"); in smsc9420_set_multicast_list()
1063 netif_dbg(pd, hw, pd->dev, "Multicast filter enabled\n"); in smsc9420_set_multicast_list()
1074 smsc9420_reg_write(pd, HASHH, hash_hi); in smsc9420_set_multicast_list()
1075 smsc9420_reg_write(pd, HASHL, hash_lo); in smsc9420_set_multicast_list()
1081 netif_dbg(pd, hw, pd->dev, "Receive own packets only\n"); in smsc9420_set_multicast_list()
1082 smsc9420_reg_write(pd, HASHH, 0); in smsc9420_set_multicast_list()
1083 smsc9420_reg_write(pd, HASHL, 0); in smsc9420_set_multicast_list()
1090 smsc9420_reg_write(pd, MAC_CR, mac_cr); in smsc9420_set_multicast_list()
1091 smsc9420_pci_flush_write(pd); in smsc9420_set_multicast_list()
1094 static void smsc9420_phy_update_flowcontrol(struct smsc9420_pdata *pd) in smsc9420_phy_update_flowcontrol() argument
1096 struct phy_device *phy_dev = pd->phy_dev; in smsc9420_phy_update_flowcontrol()
1109 netif_info(pd, link, pd->dev, "rx pause %s, tx pause %s\n", in smsc9420_phy_update_flowcontrol()
1113 netif_info(pd, link, pd->dev, "half duplex\n"); in smsc9420_phy_update_flowcontrol()
1117 smsc9420_reg_write(pd, FLOW, flow); in smsc9420_phy_update_flowcontrol()
1124 struct smsc9420_pdata *pd = netdev_priv(dev); in smsc9420_phy_adjust_link() local
1125 struct phy_device *phy_dev = pd->phy_dev; in smsc9420_phy_adjust_link()
1128 if (phy_dev->duplex != pd->last_duplex) { in smsc9420_phy_adjust_link()
1129 u32 mac_cr = smsc9420_reg_read(pd, MAC_CR); in smsc9420_phy_adjust_link()
1131 netif_dbg(pd, link, pd->dev, "full duplex mode\n"); in smsc9420_phy_adjust_link()
1134 netif_dbg(pd, link, pd->dev, "half duplex mode\n"); in smsc9420_phy_adjust_link()
1137 smsc9420_reg_write(pd, MAC_CR, mac_cr); in smsc9420_phy_adjust_link()
1139 smsc9420_phy_update_flowcontrol(pd); in smsc9420_phy_adjust_link()
1140 pd->last_duplex = phy_dev->duplex; in smsc9420_phy_adjust_link()
1144 if (carrier != pd->last_carrier) { in smsc9420_phy_adjust_link()
1146 netif_dbg(pd, link, pd->dev, "carrier OK\n"); in smsc9420_phy_adjust_link()
1148 netif_dbg(pd, link, pd->dev, "no carrier\n"); in smsc9420_phy_adjust_link()
1149 pd->last_carrier = carrier; in smsc9420_phy_adjust_link()
1155 struct smsc9420_pdata *pd = netdev_priv(dev); in smsc9420_mii_probe() local
1158 BUG_ON(pd->phy_dev); in smsc9420_mii_probe()
1161 if (!pd->mii_bus->phy_map[1]) { in smsc9420_mii_probe()
1166 phydev = pd->mii_bus->phy_map[1]; in smsc9420_mii_probe()
1167 netif_info(pd, probe, pd->dev, "PHY addr %d, phy_id 0x%08X\n", in smsc9420_mii_probe()
1186 pd->phy_dev = phydev; in smsc9420_mii_probe()
1187 pd->last_duplex = -1; in smsc9420_mii_probe()
1188 pd->last_carrier = -1; in smsc9420_mii_probe()
1195 struct smsc9420_pdata *pd = netdev_priv(dev); in smsc9420_mii_init() local
1198 pd->mii_bus = mdiobus_alloc(); in smsc9420_mii_init()
1199 if (!pd->mii_bus) { in smsc9420_mii_init()
1203 pd->mii_bus->name = DRV_MDIONAME; in smsc9420_mii_init()
1204 snprintf(pd->mii_bus->id, MII_BUS_ID_SIZE, "%x", in smsc9420_mii_init()
1205 (pd->pdev->bus->number << 8) | pd->pdev->devfn); in smsc9420_mii_init()
1206 pd->mii_bus->priv = pd; in smsc9420_mii_init()
1207 pd->mii_bus->read = smsc9420_mii_read; in smsc9420_mii_init()
1208 pd->mii_bus->write = smsc9420_mii_write; in smsc9420_mii_init()
1209 pd->mii_bus->irq = pd->phy_irq; in smsc9420_mii_init()
1211 pd->mii_bus->irq[i] = PHY_POLL; in smsc9420_mii_init()
1214 pd->mii_bus->phy_mask = ~(1 << 1); in smsc9420_mii_init()
1216 if (mdiobus_register(pd->mii_bus)) { in smsc9420_mii_init()
1217 netif_warn(pd, probe, pd->dev, "Error registering mii bus\n"); in smsc9420_mii_init()
1222 netif_warn(pd, probe, pd->dev, "Error probing mii bus\n"); in smsc9420_mii_init()
1229 mdiobus_unregister(pd->mii_bus); in smsc9420_mii_init()
1231 mdiobus_free(pd->mii_bus); in smsc9420_mii_init()
1236 static int smsc9420_alloc_tx_ring(struct smsc9420_pdata *pd) in smsc9420_alloc_tx_ring() argument
1240 BUG_ON(!pd->tx_ring); in smsc9420_alloc_tx_ring()
1242 pd->tx_buffers = kmalloc_array(TX_RING_SIZE, in smsc9420_alloc_tx_ring()
1245 if (!pd->tx_buffers) in smsc9420_alloc_tx_ring()
1250 pd->tx_buffers[i].skb = NULL; in smsc9420_alloc_tx_ring()
1251 pd->tx_buffers[i].mapping = 0; in smsc9420_alloc_tx_ring()
1252 pd->tx_ring[i].status = 0; in smsc9420_alloc_tx_ring()
1253 pd->tx_ring[i].length = 0; in smsc9420_alloc_tx_ring()
1254 pd->tx_ring[i].buffer1 = 0; in smsc9420_alloc_tx_ring()
1255 pd->tx_ring[i].buffer2 = 0; in smsc9420_alloc_tx_ring()
1257 pd->tx_ring[TX_RING_SIZE - 1].length = TDES1_TER_; in smsc9420_alloc_tx_ring()
1260 pd->tx_ring_head = 0; in smsc9420_alloc_tx_ring()
1261 pd->tx_ring_tail = 0; in smsc9420_alloc_tx_ring()
1263 smsc9420_reg_write(pd, TX_BASE_ADDR, pd->tx_dma_addr); in smsc9420_alloc_tx_ring()
1264 smsc9420_pci_flush_write(pd); in smsc9420_alloc_tx_ring()
1269 static int smsc9420_alloc_rx_ring(struct smsc9420_pdata *pd) in smsc9420_alloc_rx_ring() argument
1273 BUG_ON(!pd->rx_ring); in smsc9420_alloc_rx_ring()
1275 pd->rx_buffers = kmalloc_array(RX_RING_SIZE, in smsc9420_alloc_rx_ring()
1278 if (pd->rx_buffers == NULL) in smsc9420_alloc_rx_ring()
1283 pd->rx_ring[i].status = 0; in smsc9420_alloc_rx_ring()
1284 pd->rx_ring[i].length = PKT_BUF_SZ; in smsc9420_alloc_rx_ring()
1285 pd->rx_ring[i].buffer2 = 0; in smsc9420_alloc_rx_ring()
1286 pd->rx_buffers[i].skb = NULL; in smsc9420_alloc_rx_ring()
1287 pd->rx_buffers[i].mapping = 0; in smsc9420_alloc_rx_ring()
1289 pd->rx_ring[RX_RING_SIZE - 1].length = (PKT_BUF_SZ | RDES1_RER_); in smsc9420_alloc_rx_ring()
1293 if (smsc9420_alloc_rx_buffer(pd, i)) { in smsc9420_alloc_rx_ring()
1294 netif_warn(pd, ifup, pd->dev, in smsc9420_alloc_rx_ring()
1300 pd->rx_ring_head = 0; in smsc9420_alloc_rx_ring()
1301 pd->rx_ring_tail = 0; in smsc9420_alloc_rx_ring()
1303 smsc9420_reg_write(pd, VLAN1, ETH_P_8021Q); in smsc9420_alloc_rx_ring()
1304 netif_dbg(pd, ifup, pd->dev, "VLAN1 = 0x%08x\n", in smsc9420_alloc_rx_ring()
1305 smsc9420_reg_read(pd, VLAN1)); in smsc9420_alloc_rx_ring()
1307 if (pd->rx_csum) { in smsc9420_alloc_rx_ring()
1309 u32 coe = smsc9420_reg_read(pd, COE_CR) | RX_COE_EN; in smsc9420_alloc_rx_ring()
1310 smsc9420_reg_write(pd, COE_CR, coe); in smsc9420_alloc_rx_ring()
1311 netif_dbg(pd, ifup, pd->dev, "COE_CR = 0x%08x\n", coe); in smsc9420_alloc_rx_ring()
1314 smsc9420_reg_write(pd, RX_BASE_ADDR, pd->rx_dma_addr); in smsc9420_alloc_rx_ring()
1315 smsc9420_pci_flush_write(pd); in smsc9420_alloc_rx_ring()
1320 smsc9420_free_rx_ring(pd); in smsc9420_alloc_rx_ring()
1327 struct smsc9420_pdata *pd = netdev_priv(dev); in smsc9420_open() local
1329 const int irq = pd->pdev->irq; in smsc9420_open()
1334 netif_warn(pd, ifup, pd->dev, in smsc9420_open()
1343 spin_lock_irqsave(&pd->int_lock, flags); in smsc9420_open()
1344 int_cfg = smsc9420_reg_read(pd, INT_CFG) & (~INT_CFG_IRQ_EN_); in smsc9420_open()
1345 smsc9420_reg_write(pd, INT_CFG, int_cfg); in smsc9420_open()
1346 smsc9420_reg_write(pd, INT_CTL, 0); in smsc9420_open()
1347 spin_unlock_irqrestore(&pd->int_lock, flags); in smsc9420_open()
1348 smsc9420_reg_write(pd, DMAC_INTR_ENA, 0); in smsc9420_open()
1349 smsc9420_reg_write(pd, INT_STAT, 0xFFFFFFFF); in smsc9420_open()
1350 smsc9420_pci_flush_write(pd); in smsc9420_open()
1352 result = request_irq(irq, smsc9420_isr, IRQF_SHARED, DRV_NAME, pd); in smsc9420_open()
1354 netif_warn(pd, ifup, pd->dev, "Unable to use IRQ = %d\n", irq); in smsc9420_open()
1359 smsc9420_dmac_soft_reset(pd); in smsc9420_open()
1362 smsc9420_reg_write(pd, MAC_CR, 0); in smsc9420_open()
1367 smsc9420_reg_write(pd, GPIO_CFG, in smsc9420_open()
1376 smsc9420_reg_write(pd, BUS_MODE, bus_mode); in smsc9420_open()
1378 smsc9420_pci_flush_write(pd); in smsc9420_open()
1381 smsc9420_reg_write(pd, BUS_CFG, BUS_CFG_RXTXWEIGHT_4_1); in smsc9420_open()
1383 smsc9420_reg_write(pd, DMAC_CONTROL, in smsc9420_open()
1386 smsc9420_pci_flush_write(pd); in smsc9420_open()
1389 netif_dbg(pd, ifup, pd->dev, "Testing ISR using IRQ %d\n", irq); in smsc9420_open()
1390 pd->software_irq_signal = false; in smsc9420_open()
1392 spin_lock_irqsave(&pd->int_lock, flags); in smsc9420_open()
1394 int_cfg = smsc9420_reg_read(pd, INT_CFG) | INT_CFG_IRQ_EN_; in smsc9420_open()
1397 smsc9420_reg_write(pd, INT_CFG, int_cfg); in smsc9420_open()
1400 int_ctl = smsc9420_reg_read(pd, INT_CTL) | INT_CTL_SW_INT_EN_; in smsc9420_open()
1401 smsc9420_reg_write(pd, INT_CTL, int_ctl); in smsc9420_open()
1402 spin_unlock_irqrestore(&pd->int_lock, flags); in smsc9420_open()
1403 smsc9420_pci_flush_write(pd); in smsc9420_open()
1407 if (pd->software_irq_signal) in smsc9420_open()
1413 spin_lock_irqsave(&pd->int_lock, flags); in smsc9420_open()
1414 int_cfg = smsc9420_reg_read(pd, INT_CFG) & (~INT_CFG_IRQ_EN_); in smsc9420_open()
1415 smsc9420_reg_write(pd, INT_CFG, int_cfg); in smsc9420_open()
1416 spin_unlock_irqrestore(&pd->int_lock, flags); in smsc9420_open()
1418 if (!pd->software_irq_signal) { in smsc9420_open()
1419 netif_warn(pd, ifup, pd->dev, "ISR failed signaling test\n"); in smsc9420_open()
1424 netif_dbg(pd, ifup, pd->dev, "ISR passed test using IRQ %d\n", irq); in smsc9420_open()
1426 result = smsc9420_alloc_tx_ring(pd); in smsc9420_open()
1428 netif_warn(pd, ifup, pd->dev, in smsc9420_open()
1434 result = smsc9420_alloc_rx_ring(pd); in smsc9420_open()
1436 netif_warn(pd, ifup, pd->dev, in smsc9420_open()
1444 netif_warn(pd, ifup, pd->dev, "Failed to initialize Phy\n"); in smsc9420_open()
1450 phy_start(pd->phy_dev); in smsc9420_open()
1452 napi_enable(&pd->napi); in smsc9420_open()
1455 mac_cr = smsc9420_reg_read(pd, MAC_CR) | MAC_CR_TXEN_ | MAC_CR_RXEN_; in smsc9420_open()
1456 smsc9420_reg_write(pd, MAC_CR, mac_cr); in smsc9420_open()
1458 dmac_control = smsc9420_reg_read(pd, DMAC_CONTROL); in smsc9420_open()
1460 smsc9420_reg_write(pd, DMAC_CONTROL, dmac_control); in smsc9420_open()
1461 smsc9420_pci_flush_write(pd); in smsc9420_open()
1463 dma_intr_ena = smsc9420_reg_read(pd, DMAC_INTR_ENA); in smsc9420_open()
1466 smsc9420_reg_write(pd, DMAC_INTR_ENA, dma_intr_ena); in smsc9420_open()
1467 smsc9420_pci_flush_write(pd); in smsc9420_open()
1471 smsc9420_reg_write(pd, RX_POLL_DEMAND, 1); in smsc9420_open()
1474 spin_lock_irqsave(&pd->int_lock, flags); in smsc9420_open()
1475 int_cfg = smsc9420_reg_read(pd, INT_CFG) | INT_CFG_IRQ_EN_; in smsc9420_open()
1476 smsc9420_reg_write(pd, INT_CFG, int_cfg); in smsc9420_open()
1477 spin_unlock_irqrestore(&pd->int_lock, flags); in smsc9420_open()
1482 smsc9420_free_rx_ring(pd); in smsc9420_open()
1484 smsc9420_free_tx_ring(pd); in smsc9420_open()
1486 free_irq(irq, pd); in smsc9420_open()
1496 struct smsc9420_pdata *pd = netdev_priv(dev); in smsc9420_suspend() local
1501 spin_lock_irqsave(&pd->int_lock, flags); in smsc9420_suspend()
1502 int_cfg = smsc9420_reg_read(pd, INT_CFG) & (~INT_CFG_IRQ_EN_); in smsc9420_suspend()
1503 smsc9420_reg_write(pd, INT_CFG, int_cfg); in smsc9420_suspend()
1504 spin_unlock_irqrestore(&pd->int_lock, flags); in smsc9420_suspend()
1508 smsc9420_stop_tx(pd); in smsc9420_suspend()
1509 smsc9420_free_tx_ring(pd); in smsc9420_suspend()
1511 napi_disable(&pd->napi); in smsc9420_suspend()
1512 smsc9420_stop_rx(pd); in smsc9420_suspend()
1513 smsc9420_free_rx_ring(pd); in smsc9420_suspend()
1515 free_irq(pd->pdev->irq, pd); in smsc9420_suspend()
1531 struct smsc9420_pdata *pd = netdev_priv(dev); in smsc9420_resume() local
1545 netif_warn(pd, ifup, pd->dev, "pci_enable_wake failed: %d\n", in smsc9420_resume()
1576 struct smsc9420_pdata *pd; in smsc9420_probe() local
1592 dev = alloc_etherdev(sizeof(*pd)); in smsc9420_probe()
1623 pd = netdev_priv(dev); in smsc9420_probe()
1626 pd->rx_ring = pci_alloc_consistent(pdev, in smsc9420_probe()
1629 &pd->rx_dma_addr); in smsc9420_probe()
1631 if (!pd->rx_ring) in smsc9420_probe()
1635 pd->tx_ring = (pd->rx_ring + RX_RING_SIZE); in smsc9420_probe()
1636 pd->tx_dma_addr = pd->rx_dma_addr + in smsc9420_probe()
1639 pd->pdev = pdev; in smsc9420_probe()
1640 pd->dev = dev; in smsc9420_probe()
1641 pd->ioaddr = virt_addr; in smsc9420_probe()
1642 pd->msg_enable = smsc_debug; in smsc9420_probe()
1643 pd->rx_csum = true; in smsc9420_probe()
1645 netif_dbg(pd, probe, pd->dev, "lan_base=0x%08lx\n", (ulong)virt_addr); in smsc9420_probe()
1647 id_rev = smsc9420_reg_read(pd, ID_REV); in smsc9420_probe()
1650 netif_info(pd, probe, pd->dev, in smsc9420_probe()
1654 netif_warn(pd, probe, pd->dev, "LAN9420 NOT identified\n"); in smsc9420_probe()
1655 netif_warn(pd, probe, pd->dev, "ID_REV=0x%08X\n", id_rev); in smsc9420_probe()
1659 smsc9420_dmac_soft_reset(pd); in smsc9420_probe()
1660 smsc9420_eeprom_reload(pd); in smsc9420_probe()
1666 netif_napi_add(dev, &pd->napi, smsc9420_rx_poll, NAPI_WEIGHT); in smsc9420_probe()
1670 netif_warn(pd, probe, pd->dev, "error %i registering device\n", in smsc9420_probe()
1677 spin_lock_init(&pd->int_lock); in smsc9420_probe()
1678 spin_lock_init(&pd->phy_lock); in smsc9420_probe()
1686 (RX_RING_SIZE + TX_RING_SIZE), pd->rx_ring, pd->rx_dma_addr); in smsc9420_probe()
1702 struct smsc9420_pdata *pd; in smsc9420_remove() local
1708 pd = netdev_priv(dev); in smsc9420_remove()
1712 BUG_ON(pd->tx_buffers); in smsc9420_remove()
1713 BUG_ON(pd->rx_buffers); in smsc9420_remove()
1715 BUG_ON(!pd->tx_ring); in smsc9420_remove()
1716 BUG_ON(!pd->rx_ring); in smsc9420_remove()
1719 (RX_RING_SIZE + TX_RING_SIZE), pd->rx_ring, pd->rx_dma_addr); in smsc9420_remove()
1721 iounmap(pd->ioaddr - LAN9420_CPSR_ENDIAN_OFFSET); in smsc9420_remove()