Lines Matching refs:lp

63 u32 temac_ior(struct temac_local *lp, int offset)  in temac_ior()  argument
65 return in_be32((u32 *)(lp->regs + offset)); in temac_ior()
68 void temac_iow(struct temac_local *lp, int offset, u32 value) in temac_iow() argument
70 out_be32((u32 *) (lp->regs + offset), value); in temac_iow()
73 int temac_indirect_busywait(struct temac_local *lp) in temac_indirect_busywait() argument
77 while (!(temac_ior(lp, XTE_RDY0_OFFSET) & XTE_RDY0_HARD_ACS_RDY_MASK)) { in temac_indirect_busywait()
92 u32 temac_indirect_in32(struct temac_local *lp, int reg) in temac_indirect_in32() argument
96 if (temac_indirect_busywait(lp)) in temac_indirect_in32()
98 temac_iow(lp, XTE_CTL0_OFFSET, reg); in temac_indirect_in32()
99 if (temac_indirect_busywait(lp)) in temac_indirect_in32()
101 val = temac_ior(lp, XTE_LSW0_OFFSET); in temac_indirect_in32()
111 void temac_indirect_out32(struct temac_local *lp, int reg, u32 value) in temac_indirect_out32() argument
113 if (temac_indirect_busywait(lp)) in temac_indirect_out32()
115 temac_iow(lp, XTE_LSW0_OFFSET, value); in temac_indirect_out32()
116 temac_iow(lp, XTE_CTL0_OFFSET, CNTLREG_WRITE_ENABLE_MASK | reg); in temac_indirect_out32()
117 temac_indirect_busywait(lp); in temac_indirect_out32()
125 static u32 temac_dma_in32(struct temac_local *lp, int reg) in temac_dma_in32() argument
127 return in_be32((u32 *)(lp->sdma_regs + (reg << 2))); in temac_dma_in32()
135 static void temac_dma_out32(struct temac_local *lp, int reg, u32 value) in temac_dma_out32() argument
137 out_be32((u32 *)(lp->sdma_regs + (reg << 2)), value); in temac_dma_out32()
149 static u32 temac_dma_dcr_in(struct temac_local *lp, int reg) in temac_dma_dcr_in() argument
151 return dcr_read(lp->sdma_dcrs, reg); in temac_dma_dcr_in()
157 static void temac_dma_dcr_out(struct temac_local *lp, int reg, u32 value) in temac_dma_dcr_out() argument
159 dcr_write(lp->sdma_dcrs, reg, value); in temac_dma_dcr_out()
166 static int temac_dcr_setup(struct temac_local *lp, struct platform_device *op, in temac_dcr_setup() argument
175 lp->sdma_dcrs = dcr_map(np, dcrs, dcr_resource_len(np, 0)); in temac_dcr_setup()
176 lp->dma_in = temac_dma_dcr_in; in temac_dcr_setup()
177 lp->dma_out = temac_dma_dcr_out; in temac_dcr_setup()
191 static int temac_dcr_setup(struct temac_local *lp, struct platform_device *op, in temac_dcr_setup() argument
204 struct temac_local *lp = netdev_priv(ndev); in temac_dma_bd_release() local
208 lp->dma_out(lp, DMA_CONTROL_REG, DMA_CONTROL_RST); in temac_dma_bd_release()
211 if (!lp->rx_skb[i]) in temac_dma_bd_release()
214 dma_unmap_single(ndev->dev.parent, lp->rx_bd_v[i].phys, in temac_dma_bd_release()
216 dev_kfree_skb(lp->rx_skb[i]); in temac_dma_bd_release()
219 if (lp->rx_bd_v) in temac_dma_bd_release()
221 sizeof(*lp->rx_bd_v) * RX_BD_NUM, in temac_dma_bd_release()
222 lp->rx_bd_v, lp->rx_bd_p); in temac_dma_bd_release()
223 if (lp->tx_bd_v) in temac_dma_bd_release()
225 sizeof(*lp->tx_bd_v) * TX_BD_NUM, in temac_dma_bd_release()
226 lp->tx_bd_v, lp->tx_bd_p); in temac_dma_bd_release()
227 kfree(lp->rx_skb); in temac_dma_bd_release()
235 struct temac_local *lp = netdev_priv(ndev); in temac_dma_bd_init() local
239 lp->rx_skb = kcalloc(RX_BD_NUM, sizeof(*lp->rx_skb), GFP_KERNEL); in temac_dma_bd_init()
240 if (!lp->rx_skb) in temac_dma_bd_init()
245 lp->tx_bd_v = dma_zalloc_coherent(ndev->dev.parent, in temac_dma_bd_init()
246 sizeof(*lp->tx_bd_v) * TX_BD_NUM, in temac_dma_bd_init()
247 &lp->tx_bd_p, GFP_KERNEL); in temac_dma_bd_init()
248 if (!lp->tx_bd_v) in temac_dma_bd_init()
251 lp->rx_bd_v = dma_zalloc_coherent(ndev->dev.parent, in temac_dma_bd_init()
252 sizeof(*lp->rx_bd_v) * RX_BD_NUM, in temac_dma_bd_init()
253 &lp->rx_bd_p, GFP_KERNEL); in temac_dma_bd_init()
254 if (!lp->rx_bd_v) in temac_dma_bd_init()
258 lp->tx_bd_v[i].next = lp->tx_bd_p + in temac_dma_bd_init()
259 sizeof(*lp->tx_bd_v) * ((i + 1) % TX_BD_NUM); in temac_dma_bd_init()
263 lp->rx_bd_v[i].next = lp->rx_bd_p + in temac_dma_bd_init()
264 sizeof(*lp->rx_bd_v) * ((i + 1) % RX_BD_NUM); in temac_dma_bd_init()
271 lp->rx_skb[i] = skb; in temac_dma_bd_init()
273 lp->rx_bd_v[i].phys = dma_map_single(ndev->dev.parent, in temac_dma_bd_init()
277 lp->rx_bd_v[i].len = XTE_MAX_JUMBO_FRAME_SIZE; in temac_dma_bd_init()
278 lp->rx_bd_v[i].app0 = STS_CTRL_APP0_IRQONEND; in temac_dma_bd_init()
281 lp->dma_out(lp, TX_CHNL_CTRL, 0x10220400 | in temac_dma_bd_init()
287 lp->dma_out(lp, RX_CHNL_CTRL, 0xff070000 | in temac_dma_bd_init()
294 lp->dma_out(lp, RX_CURDESC_PTR, lp->rx_bd_p); in temac_dma_bd_init()
295 lp->dma_out(lp, RX_TAILDESC_PTR, in temac_dma_bd_init()
296 lp->rx_bd_p + (sizeof(*lp->rx_bd_v) * (RX_BD_NUM - 1))); in temac_dma_bd_init()
297 lp->dma_out(lp, TX_CURDESC_PTR, lp->tx_bd_p); in temac_dma_bd_init()
300 lp->tx_bd_ci = 0; in temac_dma_bd_init()
301 lp->tx_bd_next = 0; in temac_dma_bd_init()
302 lp->tx_bd_tail = 0; in temac_dma_bd_init()
303 lp->rx_bd_ci = 0; in temac_dma_bd_init()
318 struct temac_local *lp = netdev_priv(ndev); in temac_do_set_mac_address() local
321 mutex_lock(&lp->indirect_mutex); in temac_do_set_mac_address()
322 temac_indirect_out32(lp, XTE_UAW0_OFFSET, in temac_do_set_mac_address()
329 temac_indirect_out32(lp, XTE_UAW1_OFFSET, in temac_do_set_mac_address()
332 mutex_unlock(&lp->indirect_mutex); in temac_do_set_mac_address()
357 struct temac_local *lp = netdev_priv(ndev); in temac_set_multicast_list() local
361 mutex_lock(&lp->indirect_mutex); in temac_set_multicast_list()
371 temac_indirect_out32(lp, XTE_AFM_OFFSET, XTE_AFM_EPPRM_MASK); in temac_set_multicast_list()
384 temac_indirect_out32(lp, XTE_MAW0_OFFSET, in temac_set_multicast_list()
388 temac_indirect_out32(lp, XTE_MAW1_OFFSET, in temac_set_multicast_list()
393 val = temac_indirect_in32(lp, XTE_AFM_OFFSET); in temac_set_multicast_list()
394 temac_indirect_out32(lp, XTE_AFM_OFFSET, in temac_set_multicast_list()
396 temac_indirect_out32(lp, XTE_MAW0_OFFSET, 0); in temac_set_multicast_list()
397 temac_indirect_out32(lp, XTE_MAW1_OFFSET, 0); in temac_set_multicast_list()
400 mutex_unlock(&lp->indirect_mutex); in temac_set_multicast_list()
488 struct temac_local *lp = netdev_priv(ndev); in temac_setoptions() local
492 mutex_lock(&lp->indirect_mutex); in temac_setoptions()
494 reg = temac_indirect_in32(lp, tp->reg) & ~tp->m_or; in temac_setoptions()
497 temac_indirect_out32(lp, tp->reg, reg); in temac_setoptions()
500 lp->options |= options; in temac_setoptions()
501 mutex_unlock(&lp->indirect_mutex); in temac_setoptions()
509 struct temac_local *lp = netdev_priv(ndev); in temac_device_reset() local
520 mutex_lock(&lp->indirect_mutex); in temac_device_reset()
522 temac_indirect_out32(lp, XTE_RXC1_OFFSET, XTE_RXC1_RXRST_MASK); in temac_device_reset()
524 while (temac_indirect_in32(lp, XTE_RXC1_OFFSET) & XTE_RXC1_RXRST_MASK) { in temac_device_reset()
534 temac_indirect_out32(lp, XTE_TXC_OFFSET, XTE_TXC_TXRST_MASK); in temac_device_reset()
536 while (temac_indirect_in32(lp, XTE_TXC_OFFSET) & XTE_TXC_TXRST_MASK) { in temac_device_reset()
546 val = temac_indirect_in32(lp, XTE_RXC1_OFFSET); in temac_device_reset()
547 temac_indirect_out32(lp, XTE_RXC1_OFFSET, val & ~XTE_RXC1_RXEN_MASK); in temac_device_reset()
550 lp->dma_out(lp, DMA_CONTROL_REG, DMA_CONTROL_RST); in temac_device_reset()
552 while (lp->dma_in(lp, DMA_CONTROL_REG) & DMA_CONTROL_RST) { in temac_device_reset()
560 lp->dma_out(lp, DMA_CONTROL_REG, DMA_TAIL_ENABLE); in temac_device_reset()
567 temac_indirect_out32(lp, XTE_RXC0_OFFSET, 0); in temac_device_reset()
568 temac_indirect_out32(lp, XTE_RXC1_OFFSET, 0); in temac_device_reset()
569 temac_indirect_out32(lp, XTE_TXC_OFFSET, 0); in temac_device_reset()
570 temac_indirect_out32(lp, XTE_FCC_OFFSET, XTE_FCC_RXFLO_MASK); in temac_device_reset()
572 mutex_unlock(&lp->indirect_mutex); in temac_device_reset()
577 lp->options & ~(XTE_OPTION_TXEN | XTE_OPTION_RXEN)); in temac_device_reset()
583 if (temac_setoptions(ndev, lp->options)) in temac_device_reset()
592 struct temac_local *lp = netdev_priv(ndev); in temac_adjust_link() local
593 struct phy_device *phy = lp->phy_dev; in temac_adjust_link()
600 mutex_lock(&lp->indirect_mutex); in temac_adjust_link()
601 if (lp->last_link != link_state) { in temac_adjust_link()
602 mii_speed = temac_indirect_in32(lp, XTE_EMCFG_OFFSET); in temac_adjust_link()
612 temac_indirect_out32(lp, XTE_EMCFG_OFFSET, mii_speed); in temac_adjust_link()
613 lp->last_link = link_state; in temac_adjust_link()
616 mutex_unlock(&lp->indirect_mutex); in temac_adjust_link()
621 struct temac_local *lp = netdev_priv(ndev); in temac_start_xmit_done() local
625 cur_p = &lp->tx_bd_v[lp->tx_bd_ci]; in temac_start_xmit_done()
642 lp->tx_bd_ci++; in temac_start_xmit_done()
643 if (lp->tx_bd_ci >= TX_BD_NUM) in temac_start_xmit_done()
644 lp->tx_bd_ci = 0; in temac_start_xmit_done()
646 cur_p = &lp->tx_bd_v[lp->tx_bd_ci]; in temac_start_xmit_done()
653 static inline int temac_check_tx_bd_space(struct temac_local *lp, int num_frag) in temac_check_tx_bd_space() argument
658 tail = lp->tx_bd_tail; in temac_check_tx_bd_space()
659 cur_p = &lp->tx_bd_v[tail]; in temac_check_tx_bd_space()
669 cur_p = &lp->tx_bd_v[tail]; in temac_check_tx_bd_space()
678 struct temac_local *lp = netdev_priv(ndev); in temac_start_xmit() local
687 start_p = lp->tx_bd_p + sizeof(*lp->tx_bd_v) * lp->tx_bd_tail; in temac_start_xmit()
688 cur_p = &lp->tx_bd_v[lp->tx_bd_tail]; in temac_start_xmit()
690 if (temac_check_tx_bd_space(lp, num_frag)) { in temac_start_xmit()
715 lp->tx_bd_tail++; in temac_start_xmit()
716 if (lp->tx_bd_tail >= TX_BD_NUM) in temac_start_xmit()
717 lp->tx_bd_tail = 0; in temac_start_xmit()
719 cur_p = &lp->tx_bd_v[lp->tx_bd_tail]; in temac_start_xmit()
729 tail_p = lp->tx_bd_p + sizeof(*lp->tx_bd_v) * lp->tx_bd_tail; in temac_start_xmit()
730 lp->tx_bd_tail++; in temac_start_xmit()
731 if (lp->tx_bd_tail >= TX_BD_NUM) in temac_start_xmit()
732 lp->tx_bd_tail = 0; in temac_start_xmit()
737 lp->dma_out(lp, TX_TAILDESC_PTR, tail_p); /* DMA start */ in temac_start_xmit()
745 struct temac_local *lp = netdev_priv(ndev); in ll_temac_recv() local
753 spin_lock_irqsave(&lp->rx_lock, flags); in ll_temac_recv()
755 tail_p = lp->rx_bd_p + sizeof(*lp->rx_bd_v) * lp->rx_bd_ci; in ll_temac_recv()
756 cur_p = &lp->rx_bd_v[lp->rx_bd_ci]; in ll_temac_recv()
761 skb = lp->rx_skb[lp->rx_bd_ci]; in ll_temac_recv()
772 if (((lp->temac_features & TEMAC_FEATURE_RX_CSUM) != 0) && in ll_temac_recv()
789 spin_unlock_irqrestore(&lp->rx_lock, flags); in ll_temac_recv()
798 lp->rx_skb[lp->rx_bd_ci] = new_skb; in ll_temac_recv()
800 lp->rx_bd_ci++; in ll_temac_recv()
801 if (lp->rx_bd_ci >= RX_BD_NUM) in ll_temac_recv()
802 lp->rx_bd_ci = 0; in ll_temac_recv()
804 cur_p = &lp->rx_bd_v[lp->rx_bd_ci]; in ll_temac_recv()
807 lp->dma_out(lp, RX_TAILDESC_PTR, tail_p); in ll_temac_recv()
809 spin_unlock_irqrestore(&lp->rx_lock, flags); in ll_temac_recv()
815 struct temac_local *lp = netdev_priv(ndev); in ll_temac_tx_irq() local
818 status = lp->dma_in(lp, TX_IRQ_REG); in ll_temac_tx_irq()
819 lp->dma_out(lp, TX_IRQ_REG, status); in ll_temac_tx_irq()
822 temac_start_xmit_done(lp->ndev); in ll_temac_tx_irq()
832 struct temac_local *lp = netdev_priv(ndev); in ll_temac_rx_irq() local
836 status = lp->dma_in(lp, RX_IRQ_REG); in ll_temac_rx_irq()
837 lp->dma_out(lp, RX_IRQ_REG, status); in ll_temac_rx_irq()
840 ll_temac_recv(lp->ndev); in ll_temac_rx_irq()
847 struct temac_local *lp = netdev_priv(ndev); in temac_open() local
852 if (lp->phy_node) { in temac_open()
853 lp->phy_dev = of_phy_connect(lp->ndev, lp->phy_node, in temac_open()
855 if (!lp->phy_dev) { in temac_open()
856 dev_err(lp->dev, "of_phy_connect() failed\n"); in temac_open()
860 phy_start(lp->phy_dev); in temac_open()
865 rc = request_irq(lp->tx_irq, ll_temac_tx_irq, 0, ndev->name, ndev); in temac_open()
868 rc = request_irq(lp->rx_irq, ll_temac_rx_irq, 0, ndev->name, ndev); in temac_open()
875 free_irq(lp->tx_irq, ndev); in temac_open()
877 if (lp->phy_dev) in temac_open()
878 phy_disconnect(lp->phy_dev); in temac_open()
879 lp->phy_dev = NULL; in temac_open()
880 dev_err(lp->dev, "request_irq() failed\n"); in temac_open()
886 struct temac_local *lp = netdev_priv(ndev); in temac_stop() local
890 free_irq(lp->tx_irq, ndev); in temac_stop()
891 free_irq(lp->rx_irq, ndev); in temac_stop()
893 if (lp->phy_dev) in temac_stop()
894 phy_disconnect(lp->phy_dev); in temac_stop()
895 lp->phy_dev = NULL; in temac_stop()
906 struct temac_local *lp = netdev_priv(ndev); in temac_poll_controller() local
908 disable_irq(lp->tx_irq); in temac_poll_controller()
909 disable_irq(lp->rx_irq); in temac_poll_controller()
911 ll_temac_rx_irq(lp->tx_irq, ndev); in temac_poll_controller()
912 ll_temac_tx_irq(lp->rx_irq, ndev); in temac_poll_controller()
914 enable_irq(lp->tx_irq); in temac_poll_controller()
915 enable_irq(lp->rx_irq); in temac_poll_controller()
921 struct temac_local *lp = netdev_priv(ndev); in temac_ioctl() local
926 if (!lp->phy_dev) in temac_ioctl()
929 return phy_mii_ioctl(lp->phy_dev, rq, cmd); in temac_ioctl()
951 struct temac_local *lp = netdev_priv(ndev); in temac_show_llink_regs() local
955 len += sprintf(buf + len, "%.8x%s", lp->dma_in(lp, i), in temac_show_llink_regs()
976 struct temac_local *lp = netdev_priv(ndev); in temac_get_settings() local
977 return phy_ethtool_gset(lp->phy_dev, cmd); in temac_get_settings()
982 struct temac_local *lp = netdev_priv(ndev); in temac_set_settings() local
983 return phy_ethtool_sset(lp->phy_dev, cmd); in temac_set_settings()
988 struct temac_local *lp = netdev_priv(ndev); in temac_nway_reset() local
989 return phy_start_aneg(lp->phy_dev); in temac_nway_reset()
1003 struct temac_local *lp; in temac_of_probe() local
1010 ndev = alloc_etherdev(sizeof(*lp)); in temac_of_probe()
1035 lp = netdev_priv(ndev); in temac_of_probe()
1036 lp->ndev = ndev; in temac_of_probe()
1037 lp->dev = &op->dev; in temac_of_probe()
1038 lp->options = XTE_OPTION_DEFAULTS; in temac_of_probe()
1039 spin_lock_init(&lp->rx_lock); in temac_of_probe()
1040 mutex_init(&lp->indirect_mutex); in temac_of_probe()
1043 lp->regs = of_iomap(op->dev.of_node, 0); in temac_of_probe()
1044 if (!lp->regs) { in temac_of_probe()
1051 lp->temac_features = 0; in temac_of_probe()
1054 lp->temac_features |= TEMAC_FEATURE_TX_CSUM; in temac_of_probe()
1060 lp->temac_features |= TEMAC_FEATURE_RX_CSUM; in temac_of_probe()
1071 if (temac_dcr_setup(lp, op, np)) { in temac_of_probe()
1074 lp->sdma_regs = of_iomap(np, 0); in temac_of_probe()
1075 if (lp->sdma_regs) { in temac_of_probe()
1076 lp->dma_in = temac_dma_in32; in temac_of_probe()
1077 lp->dma_out = temac_dma_out32; in temac_of_probe()
1078 dev_dbg(&op->dev, "MEM base: %p\n", lp->sdma_regs); in temac_of_probe()
1086 lp->rx_irq = irq_of_parse_and_map(np, 0); in temac_of_probe()
1087 lp->tx_irq = irq_of_parse_and_map(np, 1); in temac_of_probe()
1091 if (!lp->rx_irq || !lp->tx_irq) { in temac_of_probe()
1107 rc = temac_mdio_setup(lp, op->dev.of_node); in temac_of_probe()
1111 lp->phy_node = of_parse_phandle(op->dev.of_node, "phy-handle", 0); in temac_of_probe()
1112 if (lp->phy_node) in temac_of_probe()
1113 dev_dbg(lp->dev, "using PHY node %s (%p)\n", np->full_name, np); in temac_of_probe()
1116 rc = sysfs_create_group(&lp->dev->kobj, &temac_attr_group); in temac_of_probe()
1118 dev_err(lp->dev, "Error creating sysfs files\n"); in temac_of_probe()
1122 rc = register_netdev(lp->ndev); in temac_of_probe()
1124 dev_err(lp->dev, "register_netdev() error (%i)\n", rc); in temac_of_probe()
1131 sysfs_remove_group(&lp->dev->kobj, &temac_attr_group); in temac_of_probe()
1133 if (lp->sdma_regs) in temac_of_probe()
1134 iounmap(lp->sdma_regs); in temac_of_probe()
1136 iounmap(lp->regs); in temac_of_probe()
1146 struct temac_local *lp = netdev_priv(ndev); in temac_of_remove() local
1148 temac_mdio_teardown(lp); in temac_of_remove()
1150 sysfs_remove_group(&lp->dev->kobj, &temac_attr_group); in temac_of_remove()
1151 of_node_put(lp->phy_node); in temac_of_remove()
1152 lp->phy_node = NULL; in temac_of_remove()
1153 iounmap(lp->regs); in temac_of_remove()
1154 if (lp->sdma_regs) in temac_of_remove()
1155 iounmap(lp->sdma_regs); in temac_of_remove()