Lines Matching refs:priv
79 static int ftgmac100_alloc_rx_page(struct ftgmac100 *priv,
93 static void ftgmac100_set_rx_ring_base(struct ftgmac100 *priv, dma_addr_t addr) in ftgmac100_set_rx_ring_base() argument
95 iowrite32(addr, priv->base + FTGMAC100_OFFSET_RXR_BADR); in ftgmac100_set_rx_ring_base()
98 static void ftgmac100_set_rx_buffer_size(struct ftgmac100 *priv, in ftgmac100_set_rx_buffer_size() argument
102 iowrite32(size, priv->base + FTGMAC100_OFFSET_RBSR); in ftgmac100_set_rx_buffer_size()
105 static void ftgmac100_set_normal_prio_tx_ring_base(struct ftgmac100 *priv, in ftgmac100_set_normal_prio_tx_ring_base() argument
108 iowrite32(addr, priv->base + FTGMAC100_OFFSET_NPTXR_BADR); in ftgmac100_set_normal_prio_tx_ring_base()
111 static void ftgmac100_txdma_normal_prio_start_polling(struct ftgmac100 *priv) in ftgmac100_txdma_normal_prio_start_polling() argument
113 iowrite32(1, priv->base + FTGMAC100_OFFSET_NPTXPD); in ftgmac100_txdma_normal_prio_start_polling()
116 static int ftgmac100_reset_hw(struct ftgmac100 *priv) in ftgmac100_reset_hw() argument
118 struct net_device *netdev = priv->netdev; in ftgmac100_reset_hw()
122 iowrite32(FTGMAC100_MACCR_SW_RST, priv->base + FTGMAC100_OFFSET_MACCR); in ftgmac100_reset_hw()
126 maccr = ioread32(priv->base + FTGMAC100_OFFSET_MACCR); in ftgmac100_reset_hw()
137 static void ftgmac100_set_mac(struct ftgmac100 *priv, const unsigned char *mac) in ftgmac100_set_mac() argument
142 iowrite32(maddr, priv->base + FTGMAC100_OFFSET_MAC_MADR); in ftgmac100_set_mac()
143 iowrite32(laddr, priv->base + FTGMAC100_OFFSET_MAC_LADR); in ftgmac100_set_mac()
146 static void ftgmac100_init_hw(struct ftgmac100 *priv) in ftgmac100_init_hw() argument
149 ftgmac100_set_rx_ring_base(priv, in ftgmac100_init_hw()
150 priv->descs_dma_addr + in ftgmac100_init_hw()
152 ftgmac100_set_normal_prio_tx_ring_base(priv, in ftgmac100_init_hw()
153 priv->descs_dma_addr + in ftgmac100_init_hw()
156 ftgmac100_set_rx_buffer_size(priv, RX_BUF_SIZE); in ftgmac100_init_hw()
158 iowrite32(FTGMAC100_APTC_RXPOLL_CNT(1), priv->base + FTGMAC100_OFFSET_APTC); in ftgmac100_init_hw()
160 ftgmac100_set_mac(priv, priv->netdev->dev_addr); in ftgmac100_init_hw()
172 static void ftgmac100_start_hw(struct ftgmac100 *priv, int speed) in ftgmac100_start_hw() argument
190 iowrite32(maccr, priv->base + FTGMAC100_OFFSET_MACCR); in ftgmac100_start_hw()
193 static void ftgmac100_stop_hw(struct ftgmac100 *priv) in ftgmac100_stop_hw() argument
195 iowrite32(0, priv->base + FTGMAC100_OFFSET_MACCR); in ftgmac100_stop_hw()
322 static void ftgmac100_rx_pointer_advance(struct ftgmac100 *priv) in ftgmac100_rx_pointer_advance() argument
324 priv->rx_pointer = ftgmac100_next_rx_pointer(priv->rx_pointer); in ftgmac100_rx_pointer_advance()
327 static struct ftgmac100_rxdes *ftgmac100_current_rxdes(struct ftgmac100 *priv) in ftgmac100_current_rxdes() argument
329 return &priv->descs->rxdes[priv->rx_pointer]; in ftgmac100_current_rxdes()
333 ftgmac100_rx_locate_first_segment(struct ftgmac100 *priv) in ftgmac100_rx_locate_first_segment() argument
335 struct ftgmac100_rxdes *rxdes = ftgmac100_current_rxdes(priv); in ftgmac100_rx_locate_first_segment()
342 ftgmac100_rx_pointer_advance(priv); in ftgmac100_rx_locate_first_segment()
343 rxdes = ftgmac100_current_rxdes(priv); in ftgmac100_rx_locate_first_segment()
349 static bool ftgmac100_rx_packet_error(struct ftgmac100 *priv, in ftgmac100_rx_packet_error() argument
352 struct net_device *netdev = priv->netdev; in ftgmac100_rx_packet_error()
399 static void ftgmac100_rx_drop_packet(struct ftgmac100 *priv) in ftgmac100_rx_drop_packet() argument
401 struct net_device *netdev = priv->netdev; in ftgmac100_rx_drop_packet()
402 struct ftgmac100_rxdes *rxdes = ftgmac100_current_rxdes(priv); in ftgmac100_rx_drop_packet()
413 ftgmac100_rx_pointer_advance(priv); in ftgmac100_rx_drop_packet()
414 rxdes = ftgmac100_current_rxdes(priv); in ftgmac100_rx_drop_packet()
420 static bool ftgmac100_rx_packet(struct ftgmac100 *priv, int *processed) in ftgmac100_rx_packet() argument
422 struct net_device *netdev = priv->netdev; in ftgmac100_rx_packet()
427 rxdes = ftgmac100_rx_locate_first_segment(priv); in ftgmac100_rx_packet()
431 if (unlikely(ftgmac100_rx_packet_error(priv, rxdes))) { in ftgmac100_rx_packet()
432 ftgmac100_rx_drop_packet(priv); in ftgmac100_rx_packet()
442 ftgmac100_rx_drop_packet(priv); in ftgmac100_rx_packet()
463 dma_unmap_page(priv->dev, map, RX_BUF_SIZE, DMA_FROM_DEVICE); in ftgmac100_rx_packet()
475 ftgmac100_alloc_rx_page(priv, rxdes, GFP_ATOMIC); in ftgmac100_rx_packet()
477 ftgmac100_rx_pointer_advance(priv); in ftgmac100_rx_packet()
478 rxdes = ftgmac100_current_rxdes(priv); in ftgmac100_rx_packet()
495 napi_gro_receive(&priv->napi, skb); in ftgmac100_rx_packet()
603 static void ftgmac100_tx_pointer_advance(struct ftgmac100 *priv) in ftgmac100_tx_pointer_advance() argument
605 priv->tx_pointer = ftgmac100_next_tx_pointer(priv->tx_pointer); in ftgmac100_tx_pointer_advance()
608 static void ftgmac100_tx_clean_pointer_advance(struct ftgmac100 *priv) in ftgmac100_tx_clean_pointer_advance() argument
610 priv->tx_clean_pointer = ftgmac100_next_tx_pointer(priv->tx_clean_pointer); in ftgmac100_tx_clean_pointer_advance()
613 static struct ftgmac100_txdes *ftgmac100_current_txdes(struct ftgmac100 *priv) in ftgmac100_current_txdes() argument
615 return &priv->descs->txdes[priv->tx_pointer]; in ftgmac100_current_txdes()
619 ftgmac100_current_clean_txdes(struct ftgmac100 *priv) in ftgmac100_current_clean_txdes() argument
621 return &priv->descs->txdes[priv->tx_clean_pointer]; in ftgmac100_current_clean_txdes()
624 static bool ftgmac100_tx_complete_packet(struct ftgmac100 *priv) in ftgmac100_tx_complete_packet() argument
626 struct net_device *netdev = priv->netdev; in ftgmac100_tx_complete_packet()
631 if (priv->tx_pending == 0) in ftgmac100_tx_complete_packet()
634 txdes = ftgmac100_current_clean_txdes(priv); in ftgmac100_tx_complete_packet()
645 dma_unmap_single(priv->dev, map, skb_headlen(skb), DMA_TO_DEVICE); in ftgmac100_tx_complete_packet()
651 ftgmac100_tx_clean_pointer_advance(priv); in ftgmac100_tx_complete_packet()
653 spin_lock(&priv->tx_lock); in ftgmac100_tx_complete_packet()
654 priv->tx_pending--; in ftgmac100_tx_complete_packet()
655 spin_unlock(&priv->tx_lock); in ftgmac100_tx_complete_packet()
661 static void ftgmac100_tx_complete(struct ftgmac100 *priv) in ftgmac100_tx_complete() argument
663 while (ftgmac100_tx_complete_packet(priv)) in ftgmac100_tx_complete()
667 static int ftgmac100_xmit(struct ftgmac100 *priv, struct sk_buff *skb, in ftgmac100_xmit() argument
670 struct net_device *netdev = priv->netdev; in ftgmac100_xmit()
674 txdes = ftgmac100_current_txdes(priv); in ftgmac100_xmit()
675 ftgmac100_tx_pointer_advance(priv); in ftgmac100_xmit()
699 spin_lock(&priv->tx_lock); in ftgmac100_xmit()
700 priv->tx_pending++; in ftgmac100_xmit()
701 if (priv->tx_pending == TX_QUEUE_ENTRIES) in ftgmac100_xmit()
706 spin_unlock(&priv->tx_lock); in ftgmac100_xmit()
708 ftgmac100_txdma_normal_prio_start_polling(priv); in ftgmac100_xmit()
716 static int ftgmac100_alloc_rx_page(struct ftgmac100 *priv, in ftgmac100_alloc_rx_page() argument
719 struct net_device *netdev = priv->netdev; in ftgmac100_alloc_rx_page()
730 map = dma_map_page(priv->dev, page, 0, RX_BUF_SIZE, DMA_FROM_DEVICE); in ftgmac100_alloc_rx_page()
731 if (unlikely(dma_mapping_error(priv->dev, map))) { in ftgmac100_alloc_rx_page()
744 static void ftgmac100_free_buffers(struct ftgmac100 *priv) in ftgmac100_free_buffers() argument
749 struct ftgmac100_rxdes *rxdes = &priv->descs->rxdes[i]; in ftgmac100_free_buffers()
756 dma_unmap_page(priv->dev, map, RX_BUF_SIZE, DMA_FROM_DEVICE); in ftgmac100_free_buffers()
761 struct ftgmac100_txdes *txdes = &priv->descs->txdes[i]; in ftgmac100_free_buffers()
768 dma_unmap_single(priv->dev, map, skb_headlen(skb), DMA_TO_DEVICE); in ftgmac100_free_buffers()
772 dma_free_coherent(priv->dev, sizeof(struct ftgmac100_descs), in ftgmac100_free_buffers()
773 priv->descs, priv->descs_dma_addr); in ftgmac100_free_buffers()
776 static int ftgmac100_alloc_buffers(struct ftgmac100 *priv) in ftgmac100_alloc_buffers() argument
780 priv->descs = dma_zalloc_coherent(priv->dev, in ftgmac100_alloc_buffers()
782 &priv->descs_dma_addr, GFP_KERNEL); in ftgmac100_alloc_buffers()
783 if (!priv->descs) in ftgmac100_alloc_buffers()
787 ftgmac100_rxdes_set_end_of_ring(&priv->descs->rxdes[RX_QUEUE_ENTRIES - 1]); in ftgmac100_alloc_buffers()
790 struct ftgmac100_rxdes *rxdes = &priv->descs->rxdes[i]; in ftgmac100_alloc_buffers()
792 if (ftgmac100_alloc_rx_page(priv, rxdes, GFP_KERNEL)) in ftgmac100_alloc_buffers()
797 ftgmac100_txdes_set_end_of_ring(&priv->descs->txdes[TX_QUEUE_ENTRIES - 1]); in ftgmac100_alloc_buffers()
801 ftgmac100_free_buffers(priv); in ftgmac100_alloc_buffers()
810 struct ftgmac100 *priv = netdev_priv(netdev); in ftgmac100_adjust_link() local
811 struct phy_device *phydev = priv->phydev; in ftgmac100_adjust_link()
814 if (phydev->speed == priv->old_speed) in ftgmac100_adjust_link()
817 priv->old_speed = phydev->speed; in ftgmac100_adjust_link()
819 ier = ioread32(priv->base + FTGMAC100_OFFSET_IER); in ftgmac100_adjust_link()
822 iowrite32(0, priv->base + FTGMAC100_OFFSET_IER); in ftgmac100_adjust_link()
825 ftgmac100_stop_hw(priv); in ftgmac100_adjust_link()
828 ftgmac100_init_hw(priv); in ftgmac100_adjust_link()
829 ftgmac100_start_hw(priv, phydev->speed); in ftgmac100_adjust_link()
832 iowrite32(ier, priv->base + FTGMAC100_OFFSET_IER); in ftgmac100_adjust_link()
835 static int ftgmac100_mii_probe(struct ftgmac100 *priv) in ftgmac100_mii_probe() argument
837 struct net_device *netdev = priv->netdev; in ftgmac100_mii_probe()
843 struct phy_device *tmp = priv->mii_bus->phy_map[i]; in ftgmac100_mii_probe()
865 priv->phydev = phydev; in ftgmac100_mii_probe()
874 struct net_device *netdev = bus->priv; in ftgmac100_mdiobus_read()
875 struct ftgmac100 *priv = netdev_priv(netdev); in ftgmac100_mdiobus_read() local
879 phycr = ioread32(priv->base + FTGMAC100_OFFSET_PHYCR); in ftgmac100_mdiobus_read()
888 iowrite32(phycr, priv->base + FTGMAC100_OFFSET_PHYCR); in ftgmac100_mdiobus_read()
891 phycr = ioread32(priv->base + FTGMAC100_OFFSET_PHYCR); in ftgmac100_mdiobus_read()
896 data = ioread32(priv->base + FTGMAC100_OFFSET_PHYDATA); in ftgmac100_mdiobus_read()
910 struct net_device *netdev = bus->priv; in ftgmac100_mdiobus_write()
911 struct ftgmac100 *priv = netdev_priv(netdev); in ftgmac100_mdiobus_write() local
916 phycr = ioread32(priv->base + FTGMAC100_OFFSET_PHYCR); in ftgmac100_mdiobus_write()
927 iowrite32(data, priv->base + FTGMAC100_OFFSET_PHYDATA); in ftgmac100_mdiobus_write()
928 iowrite32(phycr, priv->base + FTGMAC100_OFFSET_PHYCR); in ftgmac100_mdiobus_write()
931 phycr = ioread32(priv->base + FTGMAC100_OFFSET_PHYCR); in ftgmac100_mdiobus_write()
957 struct ftgmac100 *priv = netdev_priv(netdev); in ftgmac100_get_settings() local
959 return phy_ethtool_gset(priv->phydev, cmd); in ftgmac100_get_settings()
965 struct ftgmac100 *priv = netdev_priv(netdev); in ftgmac100_set_settings() local
967 return phy_ethtool_sset(priv->phydev, cmd); in ftgmac100_set_settings()
983 struct ftgmac100 *priv = netdev_priv(netdev); in ftgmac100_interrupt() local
987 iowrite32(0, priv->base + FTGMAC100_OFFSET_IER); in ftgmac100_interrupt()
988 napi_schedule(&priv->napi); in ftgmac100_interrupt()
999 struct ftgmac100 *priv = container_of(napi, struct ftgmac100, napi); in ftgmac100_poll() local
1000 struct net_device *netdev = priv->netdev; in ftgmac100_poll()
1005 status = ioread32(priv->base + FTGMAC100_OFFSET_ISR); in ftgmac100_poll()
1006 iowrite32(status, priv->base + FTGMAC100_OFFSET_ISR); in ftgmac100_poll()
1019 retry = ftgmac100_rx_packet(priv, &rx); in ftgmac100_poll()
1035 ftgmac100_tx_complete(priv); in ftgmac100_poll()
1062 iowrite32(INT_MASK_ALL_ENABLED, priv->base + FTGMAC100_OFFSET_IER); in ftgmac100_poll()
1073 struct ftgmac100 *priv = netdev_priv(netdev); in ftgmac100_open() local
1076 err = ftgmac100_alloc_buffers(priv); in ftgmac100_open()
1082 err = request_irq(priv->irq, ftgmac100_interrupt, 0, netdev->name, netdev); in ftgmac100_open()
1084 netdev_err(netdev, "failed to request irq %d\n", priv->irq); in ftgmac100_open()
1088 priv->rx_pointer = 0; in ftgmac100_open()
1089 priv->tx_clean_pointer = 0; in ftgmac100_open()
1090 priv->tx_pointer = 0; in ftgmac100_open()
1091 priv->tx_pending = 0; in ftgmac100_open()
1093 err = ftgmac100_reset_hw(priv); in ftgmac100_open()
1097 ftgmac100_init_hw(priv); in ftgmac100_open()
1098 ftgmac100_start_hw(priv, 10); in ftgmac100_open()
1100 phy_start(priv->phydev); in ftgmac100_open()
1102 napi_enable(&priv->napi); in ftgmac100_open()
1106 iowrite32(INT_MASK_ALL_ENABLED, priv->base + FTGMAC100_OFFSET_IER); in ftgmac100_open()
1110 free_irq(priv->irq, netdev); in ftgmac100_open()
1112 ftgmac100_free_buffers(priv); in ftgmac100_open()
1119 struct ftgmac100 *priv = netdev_priv(netdev); in ftgmac100_stop() local
1122 iowrite32(0, priv->base + FTGMAC100_OFFSET_IER); in ftgmac100_stop()
1125 napi_disable(&priv->napi); in ftgmac100_stop()
1126 phy_stop(priv->phydev); in ftgmac100_stop()
1128 ftgmac100_stop_hw(priv); in ftgmac100_stop()
1129 free_irq(priv->irq, netdev); in ftgmac100_stop()
1130 ftgmac100_free_buffers(priv); in ftgmac100_stop()
1138 struct ftgmac100 *priv = netdev_priv(netdev); in ftgmac100_hard_start_xmit() local
1150 map = dma_map_single(priv->dev, skb->data, skb_headlen(skb), DMA_TO_DEVICE); in ftgmac100_hard_start_xmit()
1151 if (unlikely(dma_mapping_error(priv->dev, map))) { in ftgmac100_hard_start_xmit()
1161 return ftgmac100_xmit(priv, skb, map); in ftgmac100_hard_start_xmit()
1167 struct ftgmac100 *priv = netdev_priv(netdev); in ftgmac100_do_ioctl() local
1169 return phy_mii_ioctl(priv->phydev, ifr, cmd); in ftgmac100_do_ioctl()
1189 struct ftgmac100 *priv; in ftgmac100_probe() local
1205 netdev = alloc_etherdev(sizeof(*priv)); in ftgmac100_probe()
1220 priv = netdev_priv(netdev); in ftgmac100_probe()
1221 priv->netdev = netdev; in ftgmac100_probe()
1222 priv->dev = &pdev->dev; in ftgmac100_probe()
1224 spin_lock_init(&priv->tx_lock); in ftgmac100_probe()
1227 netif_napi_add(netdev, &priv->napi, ftgmac100_poll, 64); in ftgmac100_probe()
1230 priv->res = request_mem_region(res->start, resource_size(res), in ftgmac100_probe()
1232 if (!priv->res) { in ftgmac100_probe()
1238 priv->base = ioremap(res->start, resource_size(res)); in ftgmac100_probe()
1239 if (!priv->base) { in ftgmac100_probe()
1245 priv->irq = irq; in ftgmac100_probe()
1248 priv->mii_bus = mdiobus_alloc(); in ftgmac100_probe()
1249 if (!priv->mii_bus) { in ftgmac100_probe()
1254 priv->mii_bus->name = "ftgmac100_mdio"; in ftgmac100_probe()
1255 snprintf(priv->mii_bus->id, MII_BUS_ID_SIZE, "ftgmac100_mii"); in ftgmac100_probe()
1257 priv->mii_bus->priv = netdev; in ftgmac100_probe()
1258 priv->mii_bus->read = ftgmac100_mdiobus_read; in ftgmac100_probe()
1259 priv->mii_bus->write = ftgmac100_mdiobus_write; in ftgmac100_probe()
1260 priv->mii_bus->irq = priv->phy_irq; in ftgmac100_probe()
1263 priv->mii_bus->irq[i] = PHY_POLL; in ftgmac100_probe()
1265 err = mdiobus_register(priv->mii_bus); in ftgmac100_probe()
1271 err = ftgmac100_mii_probe(priv); in ftgmac100_probe()
1284 netdev_info(netdev, "irq %d, mapped at %p\n", priv->irq, priv->base); in ftgmac100_probe()
1295 phy_disconnect(priv->phydev); in ftgmac100_probe()
1297 mdiobus_unregister(priv->mii_bus); in ftgmac100_probe()
1299 mdiobus_free(priv->mii_bus); in ftgmac100_probe()
1301 iounmap(priv->base); in ftgmac100_probe()
1303 release_resource(priv->res); in ftgmac100_probe()
1305 netif_napi_del(&priv->napi); in ftgmac100_probe()
1314 struct ftgmac100 *priv; in ftgmac100_remove() local
1317 priv = netdev_priv(netdev); in ftgmac100_remove()
1321 phy_disconnect(priv->phydev); in ftgmac100_remove()
1322 mdiobus_unregister(priv->mii_bus); in ftgmac100_remove()
1323 mdiobus_free(priv->mii_bus); in ftgmac100_remove()
1325 iounmap(priv->base); in ftgmac100_remove()
1326 release_resource(priv->res); in ftgmac100_remove()
1328 netif_napi_del(&priv->napi); in ftgmac100_remove()