Lines Matching refs:lp

171 	struct korina_private *lp = netdev_priv(dev);  in korina_abort_tx()  local
173 korina_abort_dma(dev, lp->tx_dma_regs); in korina_abort_tx()
178 struct korina_private *lp = netdev_priv(dev); in korina_abort_rx() local
180 korina_abort_dma(dev, lp->rx_dma_regs); in korina_abort_rx()
183 static void korina_start_rx(struct korina_private *lp, in korina_start_rx() argument
186 korina_start_dma(lp->rx_dma_regs, CPHYSADDR(rd)); in korina_start_rx()
189 static void korina_chain_rx(struct korina_private *lp, in korina_chain_rx() argument
192 korina_chain_dma(lp->rx_dma_regs, CPHYSADDR(rd)); in korina_chain_rx()
198 struct korina_private *lp = netdev_priv(dev); in korina_send_packet() local
204 spin_lock_irqsave(&lp->lock, flags); in korina_send_packet()
206 td = &lp->td_ring[lp->tx_chain_tail]; in korina_send_packet()
209 if (lp->tx_count >= (KORINA_NUM_TDS - 2)) { in korina_send_packet()
210 lp->tx_full = 1; in korina_send_packet()
212 if (lp->tx_count == (KORINA_NUM_TDS - 2)) in korina_send_packet()
217 spin_unlock_irqrestore(&lp->lock, flags); in korina_send_packet()
223 lp->tx_count++; in korina_send_packet()
225 lp->tx_skb[lp->tx_chain_tail] = skb; in korina_send_packet()
233 chain_prev = (lp->tx_chain_tail - 1) & KORINA_TDS_MASK; in korina_send_packet()
234 chain_next = (lp->tx_chain_tail + 1) & KORINA_TDS_MASK; in korina_send_packet()
236 if (readl(&(lp->tx_dma_regs->dmandptr)) == 0) { in korina_send_packet()
237 if (lp->tx_chain_status == desc_empty) { in korina_send_packet()
242 lp->tx_chain_tail = chain_next; in korina_send_packet()
244 writel(CPHYSADDR(&lp->td_ring[lp->tx_chain_head]), in korina_send_packet()
245 &lp->tx_dma_regs->dmandptr); in korina_send_packet()
247 lp->tx_chain_head = lp->tx_chain_tail; in korina_send_packet()
253 lp->td_ring[chain_prev].control &= in korina_send_packet()
256 lp->td_ring[chain_prev].link = CPHYSADDR(td); in korina_send_packet()
258 lp->tx_chain_tail = chain_next; in korina_send_packet()
260 writel(CPHYSADDR(&lp->td_ring[lp->tx_chain_head]), in korina_send_packet()
261 &(lp->tx_dma_regs->dmandptr)); in korina_send_packet()
263 lp->tx_chain_head = lp->tx_chain_tail; in korina_send_packet()
264 lp->tx_chain_status = desc_empty; in korina_send_packet()
267 if (lp->tx_chain_status == desc_empty) { in korina_send_packet()
272 lp->tx_chain_tail = chain_next; in korina_send_packet()
273 lp->tx_chain_status = desc_filled; in korina_send_packet()
278 lp->td_ring[chain_prev].control &= in korina_send_packet()
280 lp->td_ring[chain_prev].link = CPHYSADDR(td); in korina_send_packet()
281 lp->tx_chain_tail = chain_next; in korina_send_packet()
287 spin_unlock_irqrestore(&lp->lock, flags); in korina_send_packet()
294 struct korina_private *lp = netdev_priv(dev); in mdio_read() local
297 mii_id = ((lp->rx_irq == 0x2c ? 1 : 0) << 8); in mdio_read()
299 writel(0, &lp->eth_regs->miimcfg); in mdio_read()
300 writel(0, &lp->eth_regs->miimcmd); in mdio_read()
301 writel(mii_id | reg, &lp->eth_regs->miimaddr); in mdio_read()
302 writel(ETH_MII_CMD_SCN, &lp->eth_regs->miimcmd); in mdio_read()
304 ret = (int)(readl(&lp->eth_regs->miimrdd)); in mdio_read()
310 struct korina_private *lp = netdev_priv(dev); in mdio_write() local
312 mii_id = ((lp->rx_irq == 0x2c ? 1 : 0) << 8); in mdio_write()
314 writel(0, &lp->eth_regs->miimcfg); in mdio_write()
315 writel(1, &lp->eth_regs->miimcmd); in mdio_write()
316 writel(mii_id | reg, &lp->eth_regs->miimaddr); in mdio_write()
317 writel(ETH_MII_CMD_SCN, &lp->eth_regs->miimcmd); in mdio_write()
318 writel(val, &lp->eth_regs->miimwtd); in mdio_write()
325 struct korina_private *lp = netdev_priv(dev); in korina_rx_dma_interrupt() local
329 dmas = readl(&lp->rx_dma_regs->dmas); in korina_rx_dma_interrupt()
331 dmasm = readl(&lp->rx_dma_regs->dmasm); in korina_rx_dma_interrupt()
334 &lp->rx_dma_regs->dmasm); in korina_rx_dma_interrupt()
336 napi_schedule(&lp->napi); in korina_rx_dma_interrupt()
350 struct korina_private *lp = netdev_priv(dev); in korina_rx() local
351 struct dma_desc *rd = &lp->rd_ring[lp->rx_next_done]; in korina_rx()
360 skb = lp->rx_skb[lp->rx_next_done]; in korina_rx()
395 pkt_buf = (u8 *)lp->rx_skb[lp->rx_next_done]->data; in korina_rx()
418 lp->rx_skb[lp->rx_next_done] = skb_new; in korina_rx()
431 lp->rd_ring[(lp->rx_next_done - 1) & in korina_rx()
435 lp->rx_next_done = (lp->rx_next_done + 1) & KORINA_RDS_MASK; in korina_rx()
437 rd = &lp->rd_ring[lp->rx_next_done]; in korina_rx()
438 writel(~DMA_STAT_DONE, &lp->rx_dma_regs->dmas); in korina_rx()
441 dmas = readl(&lp->rx_dma_regs->dmas); in korina_rx()
445 &lp->rx_dma_regs->dmas); in korina_rx()
447 lp->dma_halt_cnt++; in korina_rx()
449 skb = lp->rx_skb[lp->rx_next_done]; in korina_rx()
452 korina_chain_rx(lp, rd); in korina_rx()
460 struct korina_private *lp = in korina_poll() local
462 struct net_device *dev = lp->dev; in korina_poll()
469 writel(readl(&lp->rx_dma_regs->dmasm) & in korina_poll()
471 &lp->rx_dma_regs->dmasm); in korina_poll()
481 struct korina_private *lp = netdev_priv(dev); in korina_multicast_list() local
509 &lp->eth_regs->ethhash0); in korina_multicast_list()
511 &lp->eth_regs->ethhash1); in korina_multicast_list()
514 spin_lock_irqsave(&lp->lock, flags); in korina_multicast_list()
515 writel(recognise, &lp->eth_regs->etharc); in korina_multicast_list()
516 spin_unlock_irqrestore(&lp->lock, flags); in korina_multicast_list()
521 struct korina_private *lp = netdev_priv(dev); in korina_tx() local
522 struct dma_desc *td = &lp->td_ring[lp->tx_next_done]; in korina_tx()
526 spin_lock(&lp->lock); in korina_tx()
530 if (lp->tx_full == 1) { in korina_tx()
532 lp->tx_full = 0; in korina_tx()
535 devcs = lp->td_ring[lp->tx_next_done].devcs; in korina_tx()
547 lp->tx_skb[lp->tx_next_done]->len; in korina_tx()
574 if (lp->tx_skb[lp->tx_next_done]) { in korina_tx()
575 dev_kfree_skb_any(lp->tx_skb[lp->tx_next_done]); in korina_tx()
576 lp->tx_skb[lp->tx_next_done] = NULL; in korina_tx()
579 lp->td_ring[lp->tx_next_done].control = DMA_DESC_IOF; in korina_tx()
580 lp->td_ring[lp->tx_next_done].devcs = ETH_TX_FD | ETH_TX_LD; in korina_tx()
581 lp->td_ring[lp->tx_next_done].link = 0; in korina_tx()
582 lp->td_ring[lp->tx_next_done].ca = 0; in korina_tx()
583 lp->tx_count--; in korina_tx()
586 lp->tx_next_done = (lp->tx_next_done + 1) & KORINA_TDS_MASK; in korina_tx()
587 td = &lp->td_ring[lp->tx_next_done]; in korina_tx()
592 dmas = readl(&lp->tx_dma_regs->dmas); in korina_tx()
593 writel(~dmas, &lp->tx_dma_regs->dmas); in korina_tx()
595 writel(readl(&lp->tx_dma_regs->dmasm) & in korina_tx()
597 &lp->tx_dma_regs->dmasm); in korina_tx()
599 spin_unlock(&lp->lock); in korina_tx()
606 struct korina_private *lp = netdev_priv(dev); in korina_tx_dma_interrupt() local
610 dmas = readl(&lp->tx_dma_regs->dmas); in korina_tx_dma_interrupt()
613 dmasm = readl(&lp->tx_dma_regs->dmasm); in korina_tx_dma_interrupt()
615 &lp->tx_dma_regs->dmasm); in korina_tx_dma_interrupt()
619 if (lp->tx_chain_status == desc_filled && in korina_tx_dma_interrupt()
620 (readl(&(lp->tx_dma_regs->dmandptr)) == 0)) { in korina_tx_dma_interrupt()
621 writel(CPHYSADDR(&lp->td_ring[lp->tx_chain_head]), in korina_tx_dma_interrupt()
622 &(lp->tx_dma_regs->dmandptr)); in korina_tx_dma_interrupt()
623 lp->tx_chain_status = desc_empty; in korina_tx_dma_interrupt()
624 lp->tx_chain_head = lp->tx_chain_tail; in korina_tx_dma_interrupt()
640 struct korina_private *lp = netdev_priv(dev); in korina_check_media() local
642 mii_check_media(&lp->mii_if, 0, init_media); in korina_check_media()
644 if (lp->mii_if.full_duplex) in korina_check_media()
645 writel(readl(&lp->eth_regs->ethmac2) | ETH_MAC2_FD, in korina_check_media()
646 &lp->eth_regs->ethmac2); in korina_check_media()
648 writel(readl(&lp->eth_regs->ethmac2) & ~ETH_MAC2_FD, in korina_check_media()
649 &lp->eth_regs->ethmac2); in korina_check_media()
655 struct korina_private *lp = netdev_priv(dev); in korina_poll_media() local
658 mod_timer(&lp->media_check_timer, jiffies + HZ); in korina_poll_media()
673 struct korina_private *lp = netdev_priv(dev); in korina_ioctl() local
679 spin_lock_irq(&lp->lock); in korina_ioctl()
680 rc = generic_mii_ioctl(&lp->mii_if, data, cmd, NULL); in korina_ioctl()
681 spin_unlock_irq(&lp->lock); in korina_ioctl()
682 korina_set_carrier(&lp->mii_if); in korina_ioctl()
691 struct korina_private *lp = netdev_priv(dev); in netdev_get_drvinfo() local
695 strlcpy(info->bus_info, lp->dev->name, sizeof(info->bus_info)); in netdev_get_drvinfo()
700 struct korina_private *lp = netdev_priv(dev); in netdev_get_settings() local
703 spin_lock_irq(&lp->lock); in netdev_get_settings()
704 rc = mii_ethtool_gset(&lp->mii_if, cmd); in netdev_get_settings()
705 spin_unlock_irq(&lp->lock); in netdev_get_settings()
712 struct korina_private *lp = netdev_priv(dev); in netdev_set_settings() local
715 spin_lock_irq(&lp->lock); in netdev_set_settings()
716 rc = mii_ethtool_sset(&lp->mii_if, cmd); in netdev_set_settings()
717 spin_unlock_irq(&lp->lock); in netdev_set_settings()
718 korina_set_carrier(&lp->mii_if); in netdev_set_settings()
725 struct korina_private *lp = netdev_priv(dev); in netdev_get_link() local
727 return mii_link_ok(&lp->mii_if); in netdev_get_link()
739 struct korina_private *lp = netdev_priv(dev); in korina_alloc_ring() local
745 lp->td_ring[i].control = DMA_DESC_IOF; in korina_alloc_ring()
746 lp->td_ring[i].devcs = ETH_TX_FD | ETH_TX_LD; in korina_alloc_ring()
747 lp->td_ring[i].ca = 0; in korina_alloc_ring()
748 lp->td_ring[i].link = 0; in korina_alloc_ring()
750 lp->tx_next_done = lp->tx_chain_head = lp->tx_chain_tail = in korina_alloc_ring()
751 lp->tx_full = lp->tx_count = 0; in korina_alloc_ring()
752 lp->tx_chain_status = desc_empty; in korina_alloc_ring()
759 lp->rx_skb[i] = skb; in korina_alloc_ring()
760 lp->rd_ring[i].control = DMA_DESC_IOD | in korina_alloc_ring()
762 lp->rd_ring[i].devcs = 0; in korina_alloc_ring()
763 lp->rd_ring[i].ca = CPHYSADDR(skb->data); in korina_alloc_ring()
764 lp->rd_ring[i].link = CPHYSADDR(&lp->rd_ring[i+1]); in korina_alloc_ring()
769 lp->rd_ring[i - 1].link = CPHYSADDR(&lp->rd_ring[0]); in korina_alloc_ring()
770 lp->rd_ring[i - 1].control |= DMA_DESC_COD; in korina_alloc_ring()
772 lp->rx_next_done = 0; in korina_alloc_ring()
773 lp->rx_chain_head = 0; in korina_alloc_ring()
774 lp->rx_chain_tail = 0; in korina_alloc_ring()
775 lp->rx_chain_status = desc_empty; in korina_alloc_ring()
782 struct korina_private *lp = netdev_priv(dev); in korina_free_ring() local
786 lp->rd_ring[i].control = 0; in korina_free_ring()
787 if (lp->rx_skb[i]) in korina_free_ring()
788 dev_kfree_skb_any(lp->rx_skb[i]); in korina_free_ring()
789 lp->rx_skb[i] = NULL; in korina_free_ring()
793 lp->td_ring[i].control = 0; in korina_free_ring()
794 if (lp->tx_skb[i]) in korina_free_ring()
795 dev_kfree_skb_any(lp->tx_skb[i]); in korina_free_ring()
796 lp->tx_skb[i] = NULL; in korina_free_ring()
805 struct korina_private *lp = netdev_priv(dev); in korina_init() local
812 writel(0, &lp->eth_regs->ethintfc); in korina_init()
813 while ((readl(&lp->eth_regs->ethintfc) & ETH_INT_FC_RIP)) in korina_init()
817 writel(ETH_INT_FC_EN, &lp->eth_regs->ethintfc); in korina_init()
826 writel(0, &lp->rx_dma_regs->dmas); in korina_init()
828 korina_start_rx(lp, &lp->rd_ring[0]); in korina_init()
830 writel(readl(&lp->tx_dma_regs->dmasm) & in korina_init()
832 &lp->tx_dma_regs->dmasm); in korina_init()
833 writel(readl(&lp->rx_dma_regs->dmasm) & in korina_init()
835 &lp->rx_dma_regs->dmasm); in korina_init()
838 writel(ETH_ARC_AB, &lp->eth_regs->etharc); in korina_init()
841 writel(STATION_ADDRESS_LOW(dev), &lp->eth_regs->ethsal0); in korina_init()
842 writel(STATION_ADDRESS_HIGH(dev), &lp->eth_regs->ethsah0); in korina_init()
844 writel(STATION_ADDRESS_LOW(dev), &lp->eth_regs->ethsal1); in korina_init()
845 writel(STATION_ADDRESS_HIGH(dev), &lp->eth_regs->ethsah1); in korina_init()
847 writel(STATION_ADDRESS_LOW(dev), &lp->eth_regs->ethsal2); in korina_init()
848 writel(STATION_ADDRESS_HIGH(dev), &lp->eth_regs->ethsah2); in korina_init()
850 writel(STATION_ADDRESS_LOW(dev), &lp->eth_regs->ethsal3); in korina_init()
851 writel(STATION_ADDRESS_HIGH(dev), &lp->eth_regs->ethsah3); in korina_init()
856 &lp->eth_regs->ethmac2); in korina_init()
859 writel(0x15, &lp->eth_regs->ethipgt); in korina_init()
861 writel(0x12, &lp->eth_regs->ethipgr); in korina_init()
866 &lp->eth_regs->ethmcp); in korina_init()
869 writel(48, &lp->eth_regs->ethfifott); in korina_init()
871 writel(ETH_MAC1_RE, &lp->eth_regs->ethmac1); in korina_init()
873 napi_enable(&lp->napi); in korina_init()
884 struct korina_private *lp = container_of(work, in korina_restart_task() local
886 struct net_device *dev = lp->dev; in korina_restart_task()
891 disable_irq(lp->rx_irq); in korina_restart_task()
892 disable_irq(lp->tx_irq); in korina_restart_task()
893 disable_irq(lp->ovr_irq); in korina_restart_task()
894 disable_irq(lp->und_irq); in korina_restart_task()
896 writel(readl(&lp->tx_dma_regs->dmasm) | in korina_restart_task()
898 &lp->tx_dma_regs->dmasm); in korina_restart_task()
899 writel(readl(&lp->rx_dma_regs->dmasm) | in korina_restart_task()
901 &lp->rx_dma_regs->dmasm); in korina_restart_task()
905 napi_disable(&lp->napi); in korina_restart_task()
913 enable_irq(lp->und_irq); in korina_restart_task()
914 enable_irq(lp->ovr_irq); in korina_restart_task()
915 enable_irq(lp->tx_irq); in korina_restart_task()
916 enable_irq(lp->rx_irq); in korina_restart_task()
921 struct korina_private *lp = netdev_priv(dev); in korina_clear_and_restart() local
924 writel(value, &lp->eth_regs->ethintfc); in korina_clear_and_restart()
925 schedule_work(&lp->restart_task); in korina_clear_and_restart()
932 struct korina_private *lp = netdev_priv(dev); in korina_und_interrupt() local
935 spin_lock(&lp->lock); in korina_und_interrupt()
937 und = readl(&lp->eth_regs->ethintfc); in korina_und_interrupt()
942 spin_unlock(&lp->lock); in korina_und_interrupt()
949 struct korina_private *lp = netdev_priv(dev); in korina_tx_timeout() local
951 schedule_work(&lp->restart_task); in korina_tx_timeout()
959 struct korina_private *lp = netdev_priv(dev); in korina_ovr_interrupt() local
962 spin_lock(&lp->lock); in korina_ovr_interrupt()
963 ovr = readl(&lp->eth_regs->ethintfc); in korina_ovr_interrupt()
968 spin_unlock(&lp->lock); in korina_ovr_interrupt()
984 struct korina_private *lp = netdev_priv(dev); in korina_open() local
997 ret = request_irq(lp->rx_irq, korina_rx_dma_interrupt, in korina_open()
1001 dev->name, lp->rx_irq); in korina_open()
1004 ret = request_irq(lp->tx_irq, korina_tx_dma_interrupt, in korina_open()
1008 dev->name, lp->tx_irq); in korina_open()
1013 ret = request_irq(lp->ovr_irq, korina_ovr_interrupt, in korina_open()
1017 dev->name, lp->ovr_irq); in korina_open()
1022 ret = request_irq(lp->und_irq, korina_und_interrupt, in korina_open()
1026 dev->name, lp->und_irq); in korina_open()
1029 mod_timer(&lp->media_check_timer, jiffies + 1); in korina_open()
1034 free_irq(lp->ovr_irq, dev); in korina_open()
1036 free_irq(lp->tx_irq, dev); in korina_open()
1038 free_irq(lp->rx_irq, dev); in korina_open()
1046 struct korina_private *lp = netdev_priv(dev); in korina_close() local
1049 del_timer(&lp->media_check_timer); in korina_close()
1052 disable_irq(lp->rx_irq); in korina_close()
1053 disable_irq(lp->tx_irq); in korina_close()
1054 disable_irq(lp->ovr_irq); in korina_close()
1055 disable_irq(lp->und_irq); in korina_close()
1058 tmp = readl(&lp->tx_dma_regs->dmasm); in korina_close()
1060 writel(tmp, &lp->tx_dma_regs->dmasm); in korina_close()
1063 tmp = readl(&lp->rx_dma_regs->dmasm); in korina_close()
1065 writel(tmp, &lp->rx_dma_regs->dmasm); in korina_close()
1069 napi_disable(&lp->napi); in korina_close()
1071 cancel_work_sync(&lp->restart_task); in korina_close()
1073 free_irq(lp->rx_irq, dev); in korina_close()
1074 free_irq(lp->tx_irq, dev); in korina_close()
1075 free_irq(lp->ovr_irq, dev); in korina_close()
1076 free_irq(lp->und_irq, dev); in korina_close()
1099 struct korina_private *lp; in korina_probe() local
1109 lp = netdev_priv(dev); in korina_probe()
1114 lp->rx_irq = platform_get_irq_byname(pdev, "korina_rx"); in korina_probe()
1115 lp->tx_irq = platform_get_irq_byname(pdev, "korina_tx"); in korina_probe()
1116 lp->ovr_irq = platform_get_irq_byname(pdev, "korina_ovr"); in korina_probe()
1117 lp->und_irq = platform_get_irq_byname(pdev, "korina_und"); in korina_probe()
1121 lp->eth_regs = ioremap_nocache(r->start, resource_size(r)); in korina_probe()
1122 if (!lp->eth_regs) { in korina_probe()
1129 lp->rx_dma_regs = ioremap_nocache(r->start, resource_size(r)); in korina_probe()
1130 if (!lp->rx_dma_regs) { in korina_probe()
1137 lp->tx_dma_regs = ioremap_nocache(r->start, resource_size(r)); in korina_probe()
1138 if (!lp->tx_dma_regs) { in korina_probe()
1144 lp->td_ring = kmalloc(TD_RING_SIZE + RD_RING_SIZE, GFP_KERNEL); in korina_probe()
1145 if (!lp->td_ring) { in korina_probe()
1150 dma_cache_inv((unsigned long)(lp->td_ring), in korina_probe()
1154 lp->td_ring = (struct dma_desc *)KSEG1ADDR(lp->td_ring); in korina_probe()
1155 lp->rd_ring = &lp->td_ring[KORINA_NUM_TDS]; in korina_probe()
1157 spin_lock_init(&lp->lock); in korina_probe()
1159 dev->irq = lp->rx_irq; in korina_probe()
1160 lp->dev = dev; in korina_probe()
1165 netif_napi_add(dev, &lp->napi, korina_poll, 64); in korina_probe()
1167 lp->phy_addr = (((lp->rx_irq == 0x2c? 1:0) << 8) | 0x05); in korina_probe()
1168 lp->mii_if.dev = dev; in korina_probe()
1169 lp->mii_if.mdio_read = mdio_read; in korina_probe()
1170 lp->mii_if.mdio_write = mdio_write; in korina_probe()
1171 lp->mii_if.phy_id = lp->phy_addr; in korina_probe()
1172 lp->mii_if.phy_id_mask = 0x1f; in korina_probe()
1173 lp->mii_if.reg_num_mask = 0x1f; in korina_probe()
1181 setup_timer(&lp->media_check_timer, korina_poll_media, (unsigned long) dev); in korina_probe()
1183 INIT_WORK(&lp->restart_task, korina_restart_task); in korina_probe()
1191 kfree(lp->td_ring); in korina_probe()
1193 iounmap(lp->tx_dma_regs); in korina_probe()
1195 iounmap(lp->rx_dma_regs); in korina_probe()
1197 iounmap(lp->eth_regs); in korina_probe()
1206 struct korina_private *lp = netdev_priv(bif->dev); in korina_remove() local
1208 iounmap(lp->eth_regs); in korina_remove()
1209 iounmap(lp->rx_dma_regs); in korina_remove()
1210 iounmap(lp->tx_dma_regs); in korina_remove()