Lines Matching full:pd
86 static inline u32 smsc9420_reg_read(struct smsc9420_pdata *pd, u32 offset) in smsc9420_reg_read() argument
88 return ioread32(pd->ioaddr + offset); in smsc9420_reg_read()
92 smsc9420_reg_write(struct smsc9420_pdata *pd, u32 offset, u32 value) in smsc9420_reg_write() argument
94 iowrite32(value, pd->ioaddr + offset); in smsc9420_reg_write()
97 static inline void smsc9420_pci_flush_write(struct smsc9420_pdata *pd) in smsc9420_pci_flush_write() argument
100 smsc9420_reg_read(pd, ID_REV); in smsc9420_pci_flush_write()
105 struct smsc9420_pdata *pd = bus->priv; in smsc9420_mii_read() local
110 spin_lock_irqsave(&pd->phy_lock, flags); in smsc9420_mii_read()
113 if ((smsc9420_reg_read(pd, MII_ACCESS) & MII_ACCESS_MII_BUSY_)) { in smsc9420_mii_read()
114 netif_warn(pd, drv, pd->dev, "MII is busy???\n"); in smsc9420_mii_read()
121 smsc9420_reg_write(pd, MII_ACCESS, addr); in smsc9420_mii_read()
125 if (!(smsc9420_reg_read(pd, MII_ACCESS) & in smsc9420_mii_read()
127 reg = (u16)smsc9420_reg_read(pd, MII_DATA); in smsc9420_mii_read()
133 netif_warn(pd, drv, pd->dev, "MII busy timeout!\n"); in smsc9420_mii_read()
136 spin_unlock_irqrestore(&pd->phy_lock, flags); in smsc9420_mii_read()
143 struct smsc9420_pdata *pd = bus->priv; in smsc9420_mii_write() local
148 spin_lock_irqsave(&pd->phy_lock, flags); in smsc9420_mii_write()
151 if ((smsc9420_reg_read(pd, MII_ACCESS) & MII_ACCESS_MII_BUSY_)) { in smsc9420_mii_write()
152 netif_warn(pd, drv, pd->dev, "MII is busy???\n"); in smsc9420_mii_write()
157 smsc9420_reg_write(pd, MII_DATA, (u32)val); in smsc9420_mii_write()
162 smsc9420_reg_write(pd, MII_ACCESS, addr); in smsc9420_mii_write()
166 if (!(smsc9420_reg_read(pd, MII_ACCESS) & in smsc9420_mii_write()
174 netif_warn(pd, drv, pd->dev, "MII busy timeout!\n"); in smsc9420_mii_write()
177 spin_unlock_irqrestore(&pd->phy_lock, flags); in smsc9420_mii_write()
189 static int smsc9420_eeprom_reload(struct smsc9420_pdata *pd) in smsc9420_eeprom_reload() argument
193 BUG_ON(!pd); in smsc9420_eeprom_reload()
195 if (smsc9420_reg_read(pd, E2P_CMD) & E2P_CMD_EPC_BUSY_) { in smsc9420_eeprom_reload()
196 netif_dbg(pd, drv, pd->dev, "%s: Eeprom busy\n", __func__); in smsc9420_eeprom_reload()
200 smsc9420_reg_write(pd, E2P_CMD, in smsc9420_eeprom_reload()
205 if (!(smsc9420_reg_read(pd, E2P_CMD) & E2P_CMD_EPC_BUSY_)) in smsc9420_eeprom_reload()
209 netif_warn(pd, drv, pd->dev, "%s: Eeprom timed out\n", __func__); in smsc9420_eeprom_reload()
216 struct smsc9420_pdata *pd = netdev_priv(netdev); in smsc9420_ethtool_get_drvinfo() local
219 strscpy(drvinfo->bus_info, pci_name(pd->pdev), in smsc9420_ethtool_get_drvinfo()
226 struct smsc9420_pdata *pd = netdev_priv(netdev); in smsc9420_ethtool_get_msglevel() local
227 return pd->msg_enable; in smsc9420_ethtool_get_msglevel()
232 struct smsc9420_pdata *pd = netdev_priv(netdev); in smsc9420_ethtool_set_msglevel() local
233 pd->msg_enable = data; in smsc9420_ethtool_set_msglevel()
246 struct smsc9420_pdata *pd = netdev_priv(dev); in smsc9420_ethtool_getregs() local
251 regs->version = smsc9420_reg_read(pd, ID_REV); in smsc9420_ethtool_getregs()
253 data[j++] = smsc9420_reg_read(pd, i); in smsc9420_ethtool_getregs()
264 static void smsc9420_eeprom_enable_access(struct smsc9420_pdata *pd) in smsc9420_eeprom_enable_access() argument
266 unsigned int temp = smsc9420_reg_read(pd, GPIO_CFG); in smsc9420_eeprom_enable_access()
268 smsc9420_reg_write(pd, GPIO_CFG, temp); in smsc9420_eeprom_enable_access()
272 static int smsc9420_eeprom_send_cmd(struct smsc9420_pdata *pd, u32 op) in smsc9420_eeprom_send_cmd() argument
277 netif_dbg(pd, hw, pd->dev, "op 0x%08x\n", op); in smsc9420_eeprom_send_cmd()
278 if (smsc9420_reg_read(pd, E2P_CMD) & E2P_CMD_EPC_BUSY_) { in smsc9420_eeprom_send_cmd()
279 netif_warn(pd, hw, pd->dev, "Busy at start\n"); in smsc9420_eeprom_send_cmd()
284 smsc9420_reg_write(pd, E2P_CMD, e2cmd); in smsc9420_eeprom_send_cmd()
288 e2cmd = smsc9420_reg_read(pd, E2P_CMD); in smsc9420_eeprom_send_cmd()
292 netif_info(pd, hw, pd->dev, "TIMED OUT\n"); in smsc9420_eeprom_send_cmd()
297 netif_info(pd, hw, pd->dev, in smsc9420_eeprom_send_cmd()
305 static int smsc9420_eeprom_read_location(struct smsc9420_pdata *pd, in smsc9420_eeprom_read_location() argument
311 netif_dbg(pd, hw, pd->dev, "address 0x%x\n", address); in smsc9420_eeprom_read_location()
312 ret = smsc9420_eeprom_send_cmd(pd, op); in smsc9420_eeprom_read_location()
315 data[address] = smsc9420_reg_read(pd, E2P_DATA); in smsc9420_eeprom_read_location()
320 static int smsc9420_eeprom_write_location(struct smsc9420_pdata *pd, in smsc9420_eeprom_write_location() argument
326 netif_dbg(pd, hw, pd->dev, "address 0x%x, data 0x%x\n", address, data); in smsc9420_eeprom_write_location()
327 ret = smsc9420_eeprom_send_cmd(pd, op); in smsc9420_eeprom_write_location()
331 smsc9420_reg_write(pd, E2P_DATA, (u32)data); in smsc9420_eeprom_write_location()
332 ret = smsc9420_eeprom_send_cmd(pd, op); in smsc9420_eeprom_write_location()
346 struct smsc9420_pdata *pd = netdev_priv(dev); in smsc9420_ethtool_get_eeprom() local
350 smsc9420_eeprom_enable_access(pd); in smsc9420_ethtool_get_eeprom()
354 int ret = smsc9420_eeprom_read_location(pd, i, eeprom_data); in smsc9420_ethtool_get_eeprom()
370 struct smsc9420_pdata *pd = netdev_priv(dev); in smsc9420_ethtool_set_eeprom() local
376 smsc9420_eeprom_enable_access(pd); in smsc9420_ethtool_set_eeprom()
377 smsc9420_eeprom_send_cmd(pd, E2P_CMD_EPC_CMD_EWEN_); in smsc9420_ethtool_set_eeprom()
378 ret = smsc9420_eeprom_write_location(pd, eeprom->offset, *data); in smsc9420_ethtool_set_eeprom()
379 smsc9420_eeprom_send_cmd(pd, E2P_CMD_EPC_CMD_EWDS_); in smsc9420_ethtool_set_eeprom()
406 struct smsc9420_pdata *pd = netdev_priv(dev); in smsc9420_set_mac_address() local
412 smsc9420_reg_write(pd, ADDRH, mac_high16); in smsc9420_set_mac_address()
413 smsc9420_reg_write(pd, ADDRL, mac_low32); in smsc9420_set_mac_address()
418 struct smsc9420_pdata *pd = netdev_priv(dev); in smsc9420_check_mac_address() local
424 netif_dbg(pd, probe, pd->dev, in smsc9420_check_mac_address()
429 u32 mac_high16 = smsc9420_reg_read(pd, ADDRH); in smsc9420_check_mac_address()
430 u32 mac_low32 = smsc9420_reg_read(pd, ADDRL); in smsc9420_check_mac_address()
441 netif_dbg(pd, probe, pd->dev, in smsc9420_check_mac_address()
447 netif_dbg(pd, probe, pd->dev, in smsc9420_check_mac_address()
453 static void smsc9420_stop_tx(struct smsc9420_pdata *pd) in smsc9420_stop_tx() argument
459 dmac_control = smsc9420_reg_read(pd, DMAC_CONTROL); in smsc9420_stop_tx()
461 smsc9420_reg_write(pd, DMAC_CONTROL, dmac_control); in smsc9420_stop_tx()
465 if (smsc9420_reg_read(pd, DMAC_STATUS) & DMAC_STS_TS_) in smsc9420_stop_tx()
471 netif_warn(pd, ifdown, pd->dev, "TX DMAC failed to stop\n"); in smsc9420_stop_tx()
474 smsc9420_reg_write(pd, DMAC_STATUS, DMAC_STS_TXPS_); in smsc9420_stop_tx()
477 dma_intr_ena = smsc9420_reg_read(pd, DMAC_INTR_ENA); in smsc9420_stop_tx()
479 smsc9420_reg_write(pd, DMAC_INTR_ENA, dma_intr_ena); in smsc9420_stop_tx()
480 smsc9420_pci_flush_write(pd); in smsc9420_stop_tx()
483 mac_cr = smsc9420_reg_read(pd, MAC_CR) & (~MAC_CR_TXEN_); in smsc9420_stop_tx()
484 smsc9420_reg_write(pd, MAC_CR, mac_cr); in smsc9420_stop_tx()
485 smsc9420_pci_flush_write(pd); in smsc9420_stop_tx()
488 static void smsc9420_free_tx_ring(struct smsc9420_pdata *pd) in smsc9420_free_tx_ring() argument
492 BUG_ON(!pd->tx_ring); in smsc9420_free_tx_ring()
494 if (!pd->tx_buffers) in smsc9420_free_tx_ring()
498 struct sk_buff *skb = pd->tx_buffers[i].skb; in smsc9420_free_tx_ring()
501 BUG_ON(!pd->tx_buffers[i].mapping); in smsc9420_free_tx_ring()
502 dma_unmap_single(&pd->pdev->dev, in smsc9420_free_tx_ring()
503 pd->tx_buffers[i].mapping, skb->len, in smsc9420_free_tx_ring()
508 pd->tx_ring[i].status = 0; in smsc9420_free_tx_ring()
509 pd->tx_ring[i].length = 0; in smsc9420_free_tx_ring()
510 pd->tx_ring[i].buffer1 = 0; in smsc9420_free_tx_ring()
511 pd->tx_ring[i].buffer2 = 0; in smsc9420_free_tx_ring()
515 kfree(pd->tx_buffers); in smsc9420_free_tx_ring()
516 pd->tx_buffers = NULL; in smsc9420_free_tx_ring()
518 pd->tx_ring_head = 0; in smsc9420_free_tx_ring()
519 pd->tx_ring_tail = 0; in smsc9420_free_tx_ring()
522 static void smsc9420_free_rx_ring(struct smsc9420_pdata *pd) in smsc9420_free_rx_ring() argument
526 BUG_ON(!pd->rx_ring); in smsc9420_free_rx_ring()
528 if (!pd->rx_buffers) in smsc9420_free_rx_ring()
532 if (pd->rx_buffers[i].skb) in smsc9420_free_rx_ring()
533 dev_kfree_skb_any(pd->rx_buffers[i].skb); in smsc9420_free_rx_ring()
535 if (pd->rx_buffers[i].mapping) in smsc9420_free_rx_ring()
536 dma_unmap_single(&pd->pdev->dev, in smsc9420_free_rx_ring()
537 pd->rx_buffers[i].mapping, in smsc9420_free_rx_ring()
540 pd->rx_ring[i].status = 0; in smsc9420_free_rx_ring()
541 pd->rx_ring[i].length = 0; in smsc9420_free_rx_ring()
542 pd->rx_ring[i].buffer1 = 0; in smsc9420_free_rx_ring()
543 pd->rx_ring[i].buffer2 = 0; in smsc9420_free_rx_ring()
547 kfree(pd->rx_buffers); in smsc9420_free_rx_ring()
548 pd->rx_buffers = NULL; in smsc9420_free_rx_ring()
550 pd->rx_ring_head = 0; in smsc9420_free_rx_ring()
551 pd->rx_ring_tail = 0; in smsc9420_free_rx_ring()
554 static void smsc9420_stop_rx(struct smsc9420_pdata *pd) in smsc9420_stop_rx() argument
560 dma_intr_ena = smsc9420_reg_read(pd, DMAC_INTR_ENA); in smsc9420_stop_rx()
562 smsc9420_reg_write(pd, DMAC_INTR_ENA, dma_intr_ena); in smsc9420_stop_rx()
563 smsc9420_pci_flush_write(pd); in smsc9420_stop_rx()
566 mac_cr = smsc9420_reg_read(pd, MAC_CR) & (~MAC_CR_RXEN_); in smsc9420_stop_rx()
567 smsc9420_reg_write(pd, MAC_CR, mac_cr); in smsc9420_stop_rx()
568 smsc9420_pci_flush_write(pd); in smsc9420_stop_rx()
571 dmac_control = smsc9420_reg_read(pd, DMAC_CONTROL); in smsc9420_stop_rx()
573 smsc9420_reg_write(pd, DMAC_CONTROL, dmac_control); in smsc9420_stop_rx()
574 smsc9420_pci_flush_write(pd); in smsc9420_stop_rx()
578 if (smsc9420_reg_read(pd, DMAC_STATUS) & DMAC_STS_RS_) in smsc9420_stop_rx()
584 netif_warn(pd, ifdown, pd->dev, in smsc9420_stop_rx()
588 smsc9420_reg_write(pd, DMAC_STATUS, DMAC_STS_RXPS_); in smsc9420_stop_rx()
593 struct smsc9420_pdata *pd = dev_id; in smsc9420_isr() local
598 BUG_ON(!pd); in smsc9420_isr()
599 BUG_ON(!pd->ioaddr); in smsc9420_isr()
601 int_cfg = smsc9420_reg_read(pd, INT_CFG); in smsc9420_isr()
608 int_sts = smsc9420_reg_read(pd, INT_STAT); in smsc9420_isr()
611 u32 status = smsc9420_reg_read(pd, DMAC_STATUS); in smsc9420_isr()
616 netif_wake_queue(pd->dev); in smsc9420_isr()
621 u32 dma_intr_ena = smsc9420_reg_read(pd, DMAC_INTR_ENA); in smsc9420_isr()
623 smsc9420_reg_write(pd, DMAC_INTR_ENA, dma_intr_ena); in smsc9420_isr()
624 smsc9420_pci_flush_write(pd); in smsc9420_isr()
627 napi_schedule(&pd->napi); in smsc9420_isr()
631 smsc9420_reg_write(pd, DMAC_STATUS, ints_to_clear); in smsc9420_isr()
638 spin_lock_irqsave(&pd->int_lock, flags); in smsc9420_isr()
639 int_ctl = smsc9420_reg_read(pd, INT_CTL); in smsc9420_isr()
641 smsc9420_reg_write(pd, INT_CTL, int_ctl); in smsc9420_isr()
642 spin_unlock_irqrestore(&pd->int_lock, flags); in smsc9420_isr()
644 smsc9420_reg_write(pd, INT_STAT, INT_STAT_SW_INT_); in smsc9420_isr()
645 pd->software_irq_signal = true; in smsc9420_isr()
652 smsc9420_pci_flush_write(pd); in smsc9420_isr()
660 struct smsc9420_pdata *pd = netdev_priv(dev); in smsc9420_poll_controller() local
661 const int irq = pd->pdev->irq; in smsc9420_poll_controller()
669 static void smsc9420_dmac_soft_reset(struct smsc9420_pdata *pd) in smsc9420_dmac_soft_reset() argument
671 smsc9420_reg_write(pd, BUS_MODE, BUS_MODE_SWR_); in smsc9420_dmac_soft_reset()
672 smsc9420_reg_read(pd, BUS_MODE); in smsc9420_dmac_soft_reset()
674 if (smsc9420_reg_read(pd, BUS_MODE) & BUS_MODE_SWR_) in smsc9420_dmac_soft_reset()
675 netif_warn(pd, drv, pd->dev, "Software reset not cleared\n"); in smsc9420_dmac_soft_reset()
680 struct smsc9420_pdata *pd = netdev_priv(dev); in smsc9420_stop() local
684 BUG_ON(!pd); in smsc9420_stop()
688 spin_lock_irqsave(&pd->int_lock, flags); in smsc9420_stop()
689 int_cfg = smsc9420_reg_read(pd, INT_CFG) & (~INT_CFG_IRQ_EN_); in smsc9420_stop()
690 smsc9420_reg_write(pd, INT_CFG, int_cfg); in smsc9420_stop()
691 spin_unlock_irqrestore(&pd->int_lock, flags); in smsc9420_stop()
694 napi_disable(&pd->napi); in smsc9420_stop()
696 smsc9420_stop_tx(pd); in smsc9420_stop()
697 smsc9420_free_tx_ring(pd); in smsc9420_stop()
699 smsc9420_stop_rx(pd); in smsc9420_stop()
700 smsc9420_free_rx_ring(pd); in smsc9420_stop()
702 free_irq(pd->pdev->irq, pd); in smsc9420_stop()
704 smsc9420_dmac_soft_reset(pd); in smsc9420_stop()
709 mdiobus_unregister(pd->mii_bus); in smsc9420_stop()
710 mdiobus_free(pd->mii_bus); in smsc9420_stop()
739 static void smsc9420_rx_handoff(struct smsc9420_pdata *pd, const int index, in smsc9420_rx_handoff() argument
742 struct net_device *dev = pd->dev; in smsc9420_rx_handoff()
750 if (pd->rx_csum) in smsc9420_rx_handoff()
756 dma_unmap_single(&pd->pdev->dev, pd->rx_buffers[index].mapping, in smsc9420_rx_handoff()
758 pd->rx_buffers[index].mapping = 0; in smsc9420_rx_handoff()
760 skb = pd->rx_buffers[index].skb; in smsc9420_rx_handoff()
761 pd->rx_buffers[index].skb = NULL; in smsc9420_rx_handoff()
763 if (pd->rx_csum) { in smsc9420_rx_handoff()
778 static int smsc9420_alloc_rx_buffer(struct smsc9420_pdata *pd, int index) in smsc9420_alloc_rx_buffer() argument
780 struct sk_buff *skb = netdev_alloc_skb(pd->dev, PKT_BUF_SZ); in smsc9420_alloc_rx_buffer()
783 BUG_ON(pd->rx_buffers[index].skb); in smsc9420_alloc_rx_buffer()
784 BUG_ON(pd->rx_buffers[index].mapping); in smsc9420_alloc_rx_buffer()
789 mapping = dma_map_single(&pd->pdev->dev, skb_tail_pointer(skb), in smsc9420_alloc_rx_buffer()
791 if (dma_mapping_error(&pd->pdev->dev, mapping)) { in smsc9420_alloc_rx_buffer()
793 netif_warn(pd, rx_err, pd->dev, "dma_map_single failed!\n"); in smsc9420_alloc_rx_buffer()
797 pd->rx_buffers[index].skb = skb; in smsc9420_alloc_rx_buffer()
798 pd->rx_buffers[index].mapping = mapping; in smsc9420_alloc_rx_buffer()
799 pd->rx_ring[index].buffer1 = mapping + NET_IP_ALIGN; in smsc9420_alloc_rx_buffer()
800 pd->rx_ring[index].status = RDES0_OWN_; in smsc9420_alloc_rx_buffer()
806 static void smsc9420_alloc_new_rx_buffers(struct smsc9420_pdata *pd) in smsc9420_alloc_new_rx_buffers() argument
808 while (pd->rx_ring_tail != pd->rx_ring_head) { in smsc9420_alloc_new_rx_buffers()
809 if (smsc9420_alloc_rx_buffer(pd, pd->rx_ring_tail)) in smsc9420_alloc_new_rx_buffers()
812 pd->rx_ring_tail = (pd->rx_ring_tail + 1) % RX_RING_SIZE; in smsc9420_alloc_new_rx_buffers()
818 struct smsc9420_pdata *pd = in smsc9420_rx_poll() local
820 struct net_device *dev = pd->dev; in smsc9420_rx_poll()
826 status = pd->rx_ring[pd->rx_ring_head].status; in smsc9420_rx_poll()
833 smsc9420_rx_handoff(pd, pd->rx_ring_head, status); in smsc9420_rx_poll()
834 pd->rx_ring_head = (pd->rx_ring_head + 1) % RX_RING_SIZE; in smsc9420_rx_poll()
835 smsc9420_alloc_new_rx_buffers(pd); in smsc9420_rx_poll()
838 drop_frame_cnt = smsc9420_reg_read(pd, MISS_FRAME_CNTR); in smsc9420_rx_poll()
843 smsc9420_reg_write(pd, RX_POLL_DEMAND, 1); in smsc9420_rx_poll()
844 smsc9420_pci_flush_write(pd); in smsc9420_rx_poll()
847 napi_complete_done(&pd->napi, work_done); in smsc9420_rx_poll()
850 dma_intr_ena = smsc9420_reg_read(pd, DMAC_INTR_ENA); in smsc9420_rx_poll()
852 smsc9420_reg_write(pd, DMAC_INTR_ENA, dma_intr_ena); in smsc9420_rx_poll()
853 smsc9420_pci_flush_write(pd); in smsc9420_rx_poll()
889 struct smsc9420_pdata *pd = netdev_priv(dev); in smsc9420_complete_tx() local
891 while (pd->tx_ring_tail != pd->tx_ring_head) { in smsc9420_complete_tx()
892 int index = pd->tx_ring_tail; in smsc9420_complete_tx()
896 status = pd->tx_ring[index].status; in smsc9420_complete_tx()
897 length = pd->tx_ring[index].length; in smsc9420_complete_tx()
905 BUG_ON(!pd->tx_buffers[index].skb); in smsc9420_complete_tx()
906 BUG_ON(!pd->tx_buffers[index].mapping); in smsc9420_complete_tx()
908 dma_unmap_single(&pd->pdev->dev, in smsc9420_complete_tx()
909 pd->tx_buffers[index].mapping, in smsc9420_complete_tx()
910 pd->tx_buffers[index].skb->len, in smsc9420_complete_tx()
912 pd->tx_buffers[index].mapping = 0; in smsc9420_complete_tx()
914 dev_kfree_skb_any(pd->tx_buffers[index].skb); in smsc9420_complete_tx()
915 pd->tx_buffers[index].skb = NULL; in smsc9420_complete_tx()
917 pd->tx_ring[index].buffer1 = 0; in smsc9420_complete_tx()
920 pd->tx_ring_tail = (pd->tx_ring_tail + 1) % TX_RING_SIZE; in smsc9420_complete_tx()
927 struct smsc9420_pdata *pd = netdev_priv(dev); in smsc9420_hard_start_xmit() local
929 int index = pd->tx_ring_head; in smsc9420_hard_start_xmit()
932 (((pd->tx_ring_head + 2) % TX_RING_SIZE) == pd->tx_ring_tail); in smsc9420_hard_start_xmit()
937 BUG_ON(pd->tx_ring[index].status & TDES0_OWN_); in smsc9420_hard_start_xmit()
938 BUG_ON(pd->tx_buffers[index].skb); in smsc9420_hard_start_xmit()
939 BUG_ON(pd->tx_buffers[index].mapping); in smsc9420_hard_start_xmit()
941 mapping = dma_map_single(&pd->pdev->dev, skb->data, skb->len, in smsc9420_hard_start_xmit()
943 if (dma_mapping_error(&pd->pdev->dev, mapping)) { in smsc9420_hard_start_xmit()
944 netif_warn(pd, tx_err, pd->dev, in smsc9420_hard_start_xmit()
949 pd->tx_buffers[index].skb = skb; in smsc9420_hard_start_xmit()
950 pd->tx_buffers[index].mapping = mapping; in smsc9420_hard_start_xmit()
955 netif_stop_queue(pd->dev); in smsc9420_hard_start_xmit()
962 pd->tx_ring[index].buffer1 = mapping; in smsc9420_hard_start_xmit()
963 pd->tx_ring[index].length = tmp_desc1; in smsc9420_hard_start_xmit()
967 pd->tx_ring_head = (pd->tx_ring_head + 1) % TX_RING_SIZE; in smsc9420_hard_start_xmit()
970 pd->tx_ring[index].status = TDES0_OWN_; in smsc9420_hard_start_xmit()
976 smsc9420_reg_write(pd, TX_POLL_DEMAND, 1); in smsc9420_hard_start_xmit()
977 smsc9420_pci_flush_write(pd); in smsc9420_hard_start_xmit()
984 struct smsc9420_pdata *pd = netdev_priv(dev); in smsc9420_get_stats() local
985 u32 counter = smsc9420_reg_read(pd, MISS_FRAME_CNTR); in smsc9420_get_stats()
993 struct smsc9420_pdata *pd = netdev_priv(dev); in smsc9420_set_multicast_list() local
994 u32 mac_cr = smsc9420_reg_read(pd, MAC_CR); in smsc9420_set_multicast_list()
997 netif_dbg(pd, hw, pd->dev, "Promiscuous Mode Enabled\n"); in smsc9420_set_multicast_list()
1002 netif_dbg(pd, hw, pd->dev, "Receive all Multicast Enabled\n"); in smsc9420_set_multicast_list()
1010 netif_dbg(pd, hw, pd->dev, "Multicast filter enabled\n"); in smsc9420_set_multicast_list()
1021 smsc9420_reg_write(pd, HASHH, hash_hi); in smsc9420_set_multicast_list()
1022 smsc9420_reg_write(pd, HASHL, hash_lo); in smsc9420_set_multicast_list()
1028 netif_dbg(pd, hw, pd->dev, "Receive own packets only\n"); in smsc9420_set_multicast_list()
1029 smsc9420_reg_write(pd, HASHH, 0); in smsc9420_set_multicast_list()
1030 smsc9420_reg_write(pd, HASHL, 0); in smsc9420_set_multicast_list()
1037 smsc9420_reg_write(pd, MAC_CR, mac_cr); in smsc9420_set_multicast_list()
1038 smsc9420_pci_flush_write(pd); in smsc9420_set_multicast_list()
1041 static void smsc9420_phy_update_flowcontrol(struct smsc9420_pdata *pd) in smsc9420_phy_update_flowcontrol() argument
1043 struct net_device *dev = pd->dev; in smsc9420_phy_update_flowcontrol()
1057 netif_info(pd, link, pd->dev, "rx pause %s, tx pause %s\n", in smsc9420_phy_update_flowcontrol()
1061 netif_info(pd, link, pd->dev, "half duplex\n"); in smsc9420_phy_update_flowcontrol()
1065 smsc9420_reg_write(pd, FLOW, flow); in smsc9420_phy_update_flowcontrol()
1072 struct smsc9420_pdata *pd = netdev_priv(dev); in smsc9420_phy_adjust_link() local
1076 if (phy_dev->duplex != pd->last_duplex) { in smsc9420_phy_adjust_link()
1077 u32 mac_cr = smsc9420_reg_read(pd, MAC_CR); in smsc9420_phy_adjust_link()
1079 netif_dbg(pd, link, pd->dev, "full duplex mode\n"); in smsc9420_phy_adjust_link()
1082 netif_dbg(pd, link, pd->dev, "half duplex mode\n"); in smsc9420_phy_adjust_link()
1085 smsc9420_reg_write(pd, MAC_CR, mac_cr); in smsc9420_phy_adjust_link()
1087 smsc9420_phy_update_flowcontrol(pd); in smsc9420_phy_adjust_link()
1088 pd->last_duplex = phy_dev->duplex; in smsc9420_phy_adjust_link()
1092 if (carrier != pd->last_carrier) { in smsc9420_phy_adjust_link()
1094 netif_dbg(pd, link, pd->dev, "carrier OK\n"); in smsc9420_phy_adjust_link()
1096 netif_dbg(pd, link, pd->dev, "no carrier\n"); in smsc9420_phy_adjust_link()
1097 pd->last_carrier = carrier; in smsc9420_phy_adjust_link()
1103 struct smsc9420_pdata *pd = netdev_priv(dev); in smsc9420_mii_probe() local
1109 phydev = mdiobus_get_phy(pd->mii_bus, 1); in smsc9420_mii_probe()
1130 pd->last_duplex = -1; in smsc9420_mii_probe()
1131 pd->last_carrier = -1; in smsc9420_mii_probe()
1138 struct smsc9420_pdata *pd = netdev_priv(dev); in smsc9420_mii_init() local
1141 pd->mii_bus = mdiobus_alloc(); in smsc9420_mii_init()
1142 if (!pd->mii_bus) { in smsc9420_mii_init()
1146 pd->mii_bus->name = DRV_MDIONAME; in smsc9420_mii_init()
1147 snprintf(pd->mii_bus->id, MII_BUS_ID_SIZE, "%x", pci_dev_id(pd->pdev)); in smsc9420_mii_init()
1148 pd->mii_bus->priv = pd; in smsc9420_mii_init()
1149 pd->mii_bus->read = smsc9420_mii_read; in smsc9420_mii_init()
1150 pd->mii_bus->write = smsc9420_mii_write; in smsc9420_mii_init()
1153 pd->mii_bus->phy_mask = ~(1 << 1); in smsc9420_mii_init()
1155 if (mdiobus_register(pd->mii_bus)) { in smsc9420_mii_init()
1156 netif_warn(pd, probe, pd->dev, "Error registering mii bus\n"); in smsc9420_mii_init()
1161 netif_warn(pd, probe, pd->dev, "Error probing mii bus\n"); in smsc9420_mii_init()
1168 mdiobus_unregister(pd->mii_bus); in smsc9420_mii_init()
1170 mdiobus_free(pd->mii_bus); in smsc9420_mii_init()
1175 static int smsc9420_alloc_tx_ring(struct smsc9420_pdata *pd) in smsc9420_alloc_tx_ring() argument
1179 BUG_ON(!pd->tx_ring); in smsc9420_alloc_tx_ring()
1181 pd->tx_buffers = kmalloc_array(TX_RING_SIZE, in smsc9420_alloc_tx_ring()
1184 if (!pd->tx_buffers) in smsc9420_alloc_tx_ring()
1189 pd->tx_buffers[i].skb = NULL; in smsc9420_alloc_tx_ring()
1190 pd->tx_buffers[i].mapping = 0; in smsc9420_alloc_tx_ring()
1191 pd->tx_ring[i].status = 0; in smsc9420_alloc_tx_ring()
1192 pd->tx_ring[i].length = 0; in smsc9420_alloc_tx_ring()
1193 pd->tx_ring[i].buffer1 = 0; in smsc9420_alloc_tx_ring()
1194 pd->tx_ring[i].buffer2 = 0; in smsc9420_alloc_tx_ring()
1196 pd->tx_ring[TX_RING_SIZE - 1].length = TDES1_TER_; in smsc9420_alloc_tx_ring()
1199 pd->tx_ring_head = 0; in smsc9420_alloc_tx_ring()
1200 pd->tx_ring_tail = 0; in smsc9420_alloc_tx_ring()
1202 smsc9420_reg_write(pd, TX_BASE_ADDR, pd->tx_dma_addr); in smsc9420_alloc_tx_ring()
1203 smsc9420_pci_flush_write(pd); in smsc9420_alloc_tx_ring()
1208 static int smsc9420_alloc_rx_ring(struct smsc9420_pdata *pd) in smsc9420_alloc_rx_ring() argument
1212 BUG_ON(!pd->rx_ring); in smsc9420_alloc_rx_ring()
1214 pd->rx_buffers = kmalloc_array(RX_RING_SIZE, in smsc9420_alloc_rx_ring()
1217 if (pd->rx_buffers == NULL) in smsc9420_alloc_rx_ring()
1222 pd->rx_ring[i].status = 0; in smsc9420_alloc_rx_ring()
1223 pd->rx_ring[i].length = PKT_BUF_SZ; in smsc9420_alloc_rx_ring()
1224 pd->rx_ring[i].buffer2 = 0; in smsc9420_alloc_rx_ring()
1225 pd->rx_buffers[i].skb = NULL; in smsc9420_alloc_rx_ring()
1226 pd->rx_buffers[i].mapping = 0; in smsc9420_alloc_rx_ring()
1228 pd->rx_ring[RX_RING_SIZE - 1].length = (PKT_BUF_SZ | RDES1_RER_); in smsc9420_alloc_rx_ring()
1232 if (smsc9420_alloc_rx_buffer(pd, i)) { in smsc9420_alloc_rx_ring()
1233 netif_warn(pd, ifup, pd->dev, in smsc9420_alloc_rx_ring()
1239 pd->rx_ring_head = 0; in smsc9420_alloc_rx_ring()
1240 pd->rx_ring_tail = 0; in smsc9420_alloc_rx_ring()
1242 smsc9420_reg_write(pd, VLAN1, ETH_P_8021Q); in smsc9420_alloc_rx_ring()
1243 netif_dbg(pd, ifup, pd->dev, "VLAN1 = 0x%08x\n", in smsc9420_alloc_rx_ring()
1244 smsc9420_reg_read(pd, VLAN1)); in smsc9420_alloc_rx_ring()
1246 if (pd->rx_csum) { in smsc9420_alloc_rx_ring()
1248 u32 coe = smsc9420_reg_read(pd, COE_CR) | RX_COE_EN; in smsc9420_alloc_rx_ring()
1249 smsc9420_reg_write(pd, COE_CR, coe); in smsc9420_alloc_rx_ring()
1250 netif_dbg(pd, ifup, pd->dev, "COE_CR = 0x%08x\n", coe); in smsc9420_alloc_rx_ring()
1253 smsc9420_reg_write(pd, RX_BASE_ADDR, pd->rx_dma_addr); in smsc9420_alloc_rx_ring()
1254 smsc9420_pci_flush_write(pd); in smsc9420_alloc_rx_ring()
1259 smsc9420_free_rx_ring(pd); in smsc9420_alloc_rx_ring()
1266 struct smsc9420_pdata *pd = netdev_priv(dev); in smsc9420_open() local
1268 const int irq = pd->pdev->irq; in smsc9420_open()
1273 netif_warn(pd, ifup, pd->dev, in smsc9420_open()
1282 spin_lock_irqsave(&pd->int_lock, flags); in smsc9420_open()
1283 int_cfg = smsc9420_reg_read(pd, INT_CFG) & (~INT_CFG_IRQ_EN_); in smsc9420_open()
1284 smsc9420_reg_write(pd, INT_CFG, int_cfg); in smsc9420_open()
1285 smsc9420_reg_write(pd, INT_CTL, 0); in smsc9420_open()
1286 spin_unlock_irqrestore(&pd->int_lock, flags); in smsc9420_open()
1287 smsc9420_reg_write(pd, DMAC_INTR_ENA, 0); in smsc9420_open()
1288 smsc9420_reg_write(pd, INT_STAT, 0xFFFFFFFF); in smsc9420_open()
1289 smsc9420_pci_flush_write(pd); in smsc9420_open()
1291 result = request_irq(irq, smsc9420_isr, IRQF_SHARED, DRV_NAME, pd); in smsc9420_open()
1293 netif_warn(pd, ifup, pd->dev, "Unable to use IRQ = %d\n", irq); in smsc9420_open()
1298 smsc9420_dmac_soft_reset(pd); in smsc9420_open()
1301 smsc9420_reg_write(pd, MAC_CR, 0); in smsc9420_open()
1306 smsc9420_reg_write(pd, GPIO_CFG, in smsc9420_open()
1315 smsc9420_reg_write(pd, BUS_MODE, bus_mode); in smsc9420_open()
1317 smsc9420_pci_flush_write(pd); in smsc9420_open()
1320 smsc9420_reg_write(pd, BUS_CFG, BUS_CFG_RXTXWEIGHT_4_1); in smsc9420_open()
1322 smsc9420_reg_write(pd, DMAC_CONTROL, in smsc9420_open()
1325 smsc9420_pci_flush_write(pd); in smsc9420_open()
1328 netif_dbg(pd, ifup, pd->dev, "Testing ISR using IRQ %d\n", irq); in smsc9420_open()
1329 pd->software_irq_signal = false; in smsc9420_open()
1331 spin_lock_irqsave(&pd->int_lock, flags); in smsc9420_open()
1333 int_cfg = smsc9420_reg_read(pd, INT_CFG) | INT_CFG_IRQ_EN_; in smsc9420_open()
1336 smsc9420_reg_write(pd, INT_CFG, int_cfg); in smsc9420_open()
1339 int_ctl = smsc9420_reg_read(pd, INT_CTL) | INT_CTL_SW_INT_EN_; in smsc9420_open()
1340 smsc9420_reg_write(pd, INT_CTL, int_ctl); in smsc9420_open()
1341 spin_unlock_irqrestore(&pd->int_lock, flags); in smsc9420_open()
1342 smsc9420_pci_flush_write(pd); in smsc9420_open()
1346 if (pd->software_irq_signal) in smsc9420_open()
1352 spin_lock_irqsave(&pd->int_lock, flags); in smsc9420_open()
1353 int_cfg = smsc9420_reg_read(pd, INT_CFG) & (~INT_CFG_IRQ_EN_); in smsc9420_open()
1354 smsc9420_reg_write(pd, INT_CFG, int_cfg); in smsc9420_open()
1355 spin_unlock_irqrestore(&pd->int_lock, flags); in smsc9420_open()
1357 if (!pd->software_irq_signal) { in smsc9420_open()
1358 netif_warn(pd, ifup, pd->dev, "ISR failed signaling test\n"); in smsc9420_open()
1363 netif_dbg(pd, ifup, pd->dev, "ISR passed test using IRQ %d\n", irq); in smsc9420_open()
1365 result = smsc9420_alloc_tx_ring(pd); in smsc9420_open()
1367 netif_warn(pd, ifup, pd->dev, in smsc9420_open()
1373 result = smsc9420_alloc_rx_ring(pd); in smsc9420_open()
1375 netif_warn(pd, ifup, pd->dev, in smsc9420_open()
1383 netif_warn(pd, ifup, pd->dev, "Failed to initialize Phy\n"); in smsc9420_open()
1391 napi_enable(&pd->napi); in smsc9420_open()
1394 mac_cr = smsc9420_reg_read(pd, MAC_CR) | MAC_CR_TXEN_ | MAC_CR_RXEN_; in smsc9420_open()
1395 smsc9420_reg_write(pd, MAC_CR, mac_cr); in smsc9420_open()
1397 dmac_control = smsc9420_reg_read(pd, DMAC_CONTROL); in smsc9420_open()
1399 smsc9420_reg_write(pd, DMAC_CONTROL, dmac_control); in smsc9420_open()
1400 smsc9420_pci_flush_write(pd); in smsc9420_open()
1402 dma_intr_ena = smsc9420_reg_read(pd, DMAC_INTR_ENA); in smsc9420_open()
1405 smsc9420_reg_write(pd, DMAC_INTR_ENA, dma_intr_ena); in smsc9420_open()
1406 smsc9420_pci_flush_write(pd); in smsc9420_open()
1410 smsc9420_reg_write(pd, RX_POLL_DEMAND, 1); 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()
1421 smsc9420_free_rx_ring(pd); in smsc9420_open()
1423 smsc9420_free_tx_ring(pd); in smsc9420_open()
1425 free_irq(irq, pd); in smsc9420_open()
1433 struct smsc9420_pdata *pd = netdev_priv(dev); in smsc9420_suspend() local
1438 spin_lock_irqsave(&pd->int_lock, flags); in smsc9420_suspend()
1439 int_cfg = smsc9420_reg_read(pd, INT_CFG) & (~INT_CFG_IRQ_EN_); in smsc9420_suspend()
1440 smsc9420_reg_write(pd, INT_CFG, int_cfg); in smsc9420_suspend()
1441 spin_unlock_irqrestore(&pd->int_lock, flags); in smsc9420_suspend()
1445 smsc9420_stop_tx(pd); in smsc9420_suspend()
1446 smsc9420_free_tx_ring(pd); in smsc9420_suspend()
1448 napi_disable(&pd->napi); in smsc9420_suspend()
1449 smsc9420_stop_rx(pd); in smsc9420_suspend()
1450 smsc9420_free_rx_ring(pd); in smsc9420_suspend()
1452 free_irq(pd->pdev->irq, pd); in smsc9420_suspend()
1498 struct smsc9420_pdata *pd; in smsc9420_probe() local
1514 dev = alloc_etherdev(sizeof(*pd)); in smsc9420_probe()
1545 pd = netdev_priv(dev); in smsc9420_probe()
1548 pd->rx_ring = dma_alloc_coherent(&pdev->dev, in smsc9420_probe()
1550 &pd->rx_dma_addr, GFP_KERNEL); in smsc9420_probe()
1552 if (!pd->rx_ring) in smsc9420_probe()
1556 pd->tx_ring = (pd->rx_ring + RX_RING_SIZE); in smsc9420_probe()
1557 pd->tx_dma_addr = pd->rx_dma_addr + in smsc9420_probe()
1560 pd->pdev = pdev; in smsc9420_probe()
1561 pd->dev = dev; in smsc9420_probe()
1562 pd->ioaddr = virt_addr; in smsc9420_probe()
1563 pd->msg_enable = smsc_debug; in smsc9420_probe()
1564 pd->rx_csum = true; in smsc9420_probe()
1566 netif_dbg(pd, probe, pd->dev, "lan_base=0x%08lx\n", (ulong)virt_addr); in smsc9420_probe()
1568 id_rev = smsc9420_reg_read(pd, ID_REV); in smsc9420_probe()
1571 netif_info(pd, probe, pd->dev, in smsc9420_probe()
1575 netif_warn(pd, probe, pd->dev, "LAN9420 NOT identified\n"); in smsc9420_probe()
1576 netif_warn(pd, probe, pd->dev, "ID_REV=0x%08X\n", id_rev); in smsc9420_probe()
1580 smsc9420_dmac_soft_reset(pd); in smsc9420_probe()
1581 smsc9420_eeprom_reload(pd); in smsc9420_probe()
1587 netif_napi_add(dev, &pd->napi, smsc9420_rx_poll); in smsc9420_probe()
1591 netif_warn(pd, probe, pd->dev, "error %i registering device\n", in smsc9420_probe()
1598 spin_lock_init(&pd->int_lock); in smsc9420_probe()
1599 spin_lock_init(&pd->phy_lock); in smsc9420_probe()
1608 pd->rx_ring, pd->rx_dma_addr); in smsc9420_probe()
1624 struct smsc9420_pdata *pd; in smsc9420_remove() local
1630 pd = netdev_priv(dev); in smsc9420_remove()
1634 BUG_ON(pd->tx_buffers); in smsc9420_remove()
1635 BUG_ON(pd->rx_buffers); in smsc9420_remove()
1637 BUG_ON(!pd->tx_ring); in smsc9420_remove()
1638 BUG_ON(!pd->rx_ring); in smsc9420_remove()
1642 pd->rx_ring, pd->rx_dma_addr); in smsc9420_remove()
1644 iounmap(pd->ioaddr - LAN9420_CPSR_ENDIAN_OFFSET); in smsc9420_remove()