22 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
26 #include <linux/ethtool.h>
30 #include <linux/module.h>
31 #include <linux/netdevice.h>
38 #define DRV_NAME "ftgmac100"
39 #define DRV_VERSION "0.7"
41 #define RX_QUEUE_ENTRIES 256
42 #define TX_QUEUE_ENTRIES 512
44 #define MAX_PKT_SIZE 1518
45 #define RX_BUF_SIZE PAGE_SIZE
86 #define INT_MASK_ALL_ENABLED (FTGMAC100_INT_RPKT_LOST | \
87 FTGMAC100_INT_XPKT_ETH | \
88 FTGMAC100_INT_XPKT_LOST | \
89 FTGMAC100_INT_AHB_ERR | \
90 FTGMAC100_INT_PHYSTS_CHG | \
91 FTGMAC100_INT_RPKT_BUF | \
92 FTGMAC100_INT_NO_RXBUF)
99 static void ftgmac100_set_rx_buffer_size(
struct ftgmac100 *
priv,
106 static void ftgmac100_set_normal_prio_tx_ring_base(
struct ftgmac100 *
priv,
112 static void ftgmac100_txdma_normal_prio_start_polling(
struct ftgmac100 *
priv)
124 for (i = 0; i < 5; i++) {
134 netdev_err(netdev,
"software reset failed\n");
138 static void ftgmac100_set_mac(
struct ftgmac100 *priv,
const unsigned char *
mac)
140 unsigned int maddr = mac[0] << 8 | mac[1];
141 unsigned int laddr = mac[2] << 24 | mac[3] << 16 | mac[4] << 8 | mac[5];
147 static void ftgmac100_init_hw(
struct ftgmac100 *priv)
150 ftgmac100_set_rx_ring_base(priv,
153 ftgmac100_set_normal_prio_tx_ring_base(priv,
161 ftgmac100_set_mac(priv, priv->
netdev->dev_addr);
164 #define MACCR_ENABLE_ALL (FTGMAC100_MACCR_TXDMA_EN | \
165 FTGMAC100_MACCR_RXDMA_EN | \
166 FTGMAC100_MACCR_TXMAC_EN | \
167 FTGMAC100_MACCR_RXMAC_EN | \
168 FTGMAC100_MACCR_FULLDUP | \
169 FTGMAC100_MACCR_CRC_APD | \
170 FTGMAC100_MACCR_RX_RUNT | \
171 FTGMAC100_MACCR_RX_BROADPKT)
173 static void ftgmac100_start_hw(
struct ftgmac100 *priv,
int speed)
194 static void ftgmac100_stop_hw(
struct ftgmac100 *priv)
202 static bool ftgmac100_rxdes_first_segment(
struct ftgmac100_rxdes *rxdes)
207 static bool ftgmac100_rxdes_last_segment(
struct ftgmac100_rxdes *rxdes)
212 static bool ftgmac100_rxdes_packet_ready(
struct ftgmac100_rxdes *rxdes)
233 static bool ftgmac100_rxdes_frame_too_long(
struct ftgmac100_rxdes *rxdes)
248 static unsigned int ftgmac100_rxdes_data_length(
struct ftgmac100_rxdes *rxdes)
258 static void ftgmac100_rxdes_set_end_of_ring(
struct ftgmac100_rxdes *rxdes)
263 static void ftgmac100_rxdes_set_dma_addr(
struct ftgmac100_rxdes *rxdes,
318 static int ftgmac100_next_rx_pointer(
int pointer)
323 static void ftgmac100_rx_pointer_advance(
struct ftgmac100 *priv)
334 ftgmac100_rx_locate_first_segment(
struct ftgmac100 *priv)
338 while (ftgmac100_rxdes_packet_ready(rxdes)) {
339 if (ftgmac100_rxdes_first_segment(rxdes))
342 ftgmac100_rxdes_set_dma_own(rxdes);
343 ftgmac100_rx_pointer_advance(priv);
344 rxdes = ftgmac100_current_rxdes(priv);
350 static bool ftgmac100_rx_packet_error(
struct ftgmac100 *priv,
356 if (
unlikely(ftgmac100_rxdes_rx_error(rxdes))) {
358 netdev_info(netdev,
"rx err\n");
360 netdev->
stats.rx_errors++;
364 if (
unlikely(ftgmac100_rxdes_crc_error(rxdes))) {
366 netdev_info(netdev,
"rx crc err\n");
368 netdev->
stats.rx_crc_errors++;
370 }
else if (
unlikely(ftgmac100_rxdes_ipcs_err(rxdes))) {
372 netdev_info(netdev,
"rx IP checksum err\n");
377 if (
unlikely(ftgmac100_rxdes_frame_too_long(rxdes))) {
379 netdev_info(netdev,
"rx frame too long\n");
381 netdev->
stats.rx_length_errors++;
383 }
else if (
unlikely(ftgmac100_rxdes_runt(rxdes))) {
385 netdev_info(netdev,
"rx runt\n");
387 netdev->
stats.rx_length_errors++;
389 }
else if (
unlikely(ftgmac100_rxdes_odd_nibble(rxdes))) {
391 netdev_info(netdev,
"rx odd nibble\n");
393 netdev->
stats.rx_length_errors++;
400 static void ftgmac100_rx_drop_packet(
struct ftgmac100 *priv)
407 netdev_dbg(netdev,
"drop packet %p\n", rxdes);
410 if (ftgmac100_rxdes_last_segment(rxdes))
413 ftgmac100_rxdes_set_dma_own(rxdes);
414 ftgmac100_rx_pointer_advance(priv);
415 rxdes = ftgmac100_current_rxdes(priv);
416 }
while (!done && ftgmac100_rxdes_packet_ready(rxdes));
418 netdev->
stats.rx_dropped++;
421 static bool ftgmac100_rx_packet(
struct ftgmac100 *priv,
int *processed)
428 rxdes = ftgmac100_rx_locate_first_segment(priv);
432 if (
unlikely(ftgmac100_rx_packet_error(priv, rxdes))) {
433 ftgmac100_rx_drop_packet(priv);
438 skb = netdev_alloc_skb_ip_align(netdev, 128);
441 netdev_err(netdev,
"rx skb alloc failed\n");
443 ftgmac100_rx_drop_packet(priv);
447 if (
unlikely(ftgmac100_rxdes_multicast(rxdes)))
448 netdev->
stats.multicast++;
455 if ((ftgmac100_rxdes_is_tcp(rxdes) && !ftgmac100_rxdes_tcpcs_err(rxdes)) ||
456 (ftgmac100_rxdes_is_udp(rxdes) && !ftgmac100_rxdes_udpcs_err(rxdes)))
461 struct page *
page = ftgmac100_rxdes_get_page(rxdes);
466 size = ftgmac100_rxdes_data_length(rxdes);
467 skb_fill_page_desc(skb, skb_shinfo(skb)->nr_frags, page, 0, size);
473 if (ftgmac100_rxdes_last_segment(rxdes))
476 ftgmac100_alloc_rx_page(priv, rxdes,
GFP_ATOMIC);
478 ftgmac100_rx_pointer_advance(priv);
479 rxdes = ftgmac100_current_rxdes(priv);
483 if (skb->
len <= 128) {
492 netdev->
stats.rx_packets++;
514 static bool ftgmac100_txdes_owned_by_dma(
struct ftgmac100_txdes *txdes)
529 static void ftgmac100_txdes_set_end_of_ring(
struct ftgmac100_txdes *txdes)
534 static void ftgmac100_txdes_set_first_segment(
struct ftgmac100_txdes *txdes)
539 static void ftgmac100_txdes_set_last_segment(
struct ftgmac100_txdes *txdes)
544 static void ftgmac100_txdes_set_buffer_size(
struct ftgmac100_txdes *txdes,
570 static void ftgmac100_txdes_set_dma_addr(
struct ftgmac100_txdes *txdes,
599 static int ftgmac100_next_tx_pointer(
int pointer)
604 static void ftgmac100_tx_pointer_advance(
struct ftgmac100 *priv)
609 static void ftgmac100_tx_clean_pointer_advance(
struct ftgmac100 *priv)
620 ftgmac100_current_clean_txdes(
struct ftgmac100 *priv)
625 static bool ftgmac100_tx_complete_packet(
struct ftgmac100 *priv)
635 txdes = ftgmac100_current_clean_txdes(priv);
637 if (ftgmac100_txdes_owned_by_dma(txdes))
640 skb = ftgmac100_txdes_get_skb(txdes);
641 map = ftgmac100_txdes_get_dma_addr(txdes);
643 netdev->
stats.tx_packets++;
650 ftgmac100_txdes_reset(txdes);
652 ftgmac100_tx_clean_pointer_advance(priv);
657 netif_wake_queue(netdev);
662 static void ftgmac100_tx_complete(
struct ftgmac100 *priv)
664 while (ftgmac100_tx_complete_packet(priv))
675 txdes = ftgmac100_current_txdes(priv);
676 ftgmac100_tx_pointer_advance(priv);
679 ftgmac100_txdes_set_skb(txdes, skb);
680 ftgmac100_txdes_set_dma_addr(txdes, map);
681 ftgmac100_txdes_set_buffer_size(txdes, len);
683 ftgmac100_txdes_set_first_segment(txdes);
684 ftgmac100_txdes_set_last_segment(txdes);
685 ftgmac100_txdes_set_txint(txdes);
690 u8 ip_proto = ip_hdr(skb)->protocol;
692 ftgmac100_txdes_set_ipcs(txdes);
694 ftgmac100_txdes_set_tcpcs(txdes);
696 ftgmac100_txdes_set_udpcs(txdes);
703 netif_stop_queue(netdev);
706 ftgmac100_txdes_set_dma_own(txdes);
709 ftgmac100_txdma_normal_prio_start_polling(priv);
717 static int ftgmac100_alloc_rx_page(
struct ftgmac100 *priv,
727 netdev_err(netdev,
"failed to allocate rx page\n");
734 netdev_err(netdev,
"failed to map rx page\n");
739 ftgmac100_rxdes_set_page(rxdes, page);
740 ftgmac100_rxdes_set_dma_addr(rxdes, map);
741 ftgmac100_rxdes_set_dma_own(rxdes);
745 static void ftgmac100_free_buffers(
struct ftgmac100 *priv)
751 struct page *page = ftgmac100_rxdes_get_page(rxdes);
752 dma_addr_t map = ftgmac100_rxdes_get_dma_addr(rxdes);
763 struct sk_buff *skb = ftgmac100_txdes_get_skb(txdes);
764 dma_addr_t map = ftgmac100_txdes_get_dma_addr(txdes);
777 static int ftgmac100_alloc_buffers(
struct ftgmac100 *priv)
790 ftgmac100_rxdes_set_end_of_ring(&priv->
descs->rxdes[RX_QUEUE_ENTRIES - 1]);
795 if (ftgmac100_alloc_rx_page(priv, rxdes,
GFP_KERNEL))
800 ftgmac100_txdes_set_end_of_ring(&priv->
descs->txdes[TX_QUEUE_ENTRIES - 1]);
804 ftgmac100_free_buffers(priv);
811 static void ftgmac100_adjust_link(
struct net_device *netdev)
813 struct ftgmac100 *priv = netdev_priv(netdev);
827 netif_stop_queue(netdev);
828 ftgmac100_stop_hw(priv);
830 netif_start_queue(netdev);
831 ftgmac100_init_hw(priv);
832 ftgmac100_start_hw(priv, phydev->
speed);
838 static int ftgmac100_mii_probe(
struct ftgmac100 *priv)
856 netdev_info(netdev,
"%s: no PHY found\n", netdev->
name);
861 &ftgmac100_adjust_link, 0,
864 if (IS_ERR(phydev)) {
865 netdev_err(netdev,
"%s: Could not attach to PHY\n", netdev->
name);
866 return PTR_ERR(phydev);
876 static int ftgmac100_mdiobus_read(
struct mii_bus *
bus,
int phy_addr,
int regnum)
879 struct ftgmac100 *priv = netdev_priv(netdev);
894 for (i = 0; i < 10; i++) {
907 netdev_err(netdev,
"mdio read timed out\n");
911 static int ftgmac100_mdiobus_write(
struct mii_bus *bus,
int phy_addr,
915 struct ftgmac100 *priv = netdev_priv(netdev);
934 for (i = 0; i < 10; i++) {
943 netdev_err(netdev,
"mdio write timed out\n");
947 static int ftgmac100_mdiobus_reset(
struct mii_bus *bus)
955 static void ftgmac100_get_drvinfo(
struct net_device *netdev,
963 static int ftgmac100_get_settings(
struct net_device *netdev,
966 struct ftgmac100 *priv = netdev_priv(netdev);
971 static int ftgmac100_set_settings(
struct net_device *netdev,
974 struct ftgmac100 *priv = netdev_priv(netdev);
979 static const struct ethtool_ops ftgmac100_ethtool_ops = {
980 .set_settings = ftgmac100_set_settings,
981 .get_settings = ftgmac100_get_settings,
982 .get_drvinfo = ftgmac100_get_drvinfo,
992 struct ftgmac100 *priv = netdev_priv(netdev);
994 if (
likely(netif_running(netdev))) {
997 napi_schedule(&priv->
napi);
1028 retry = ftgmac100_rx_packet(priv, &rx);
1029 }
while (retry && rx < budget);
1031 if (retry && rx == budget)
1044 ftgmac100_tx_complete(priv);
1050 netdev_info(netdev,
"[ISR] = 0x%x: %s%s%s%s\n", status,
1058 netdev->
stats.rx_over_errors++;
1063 netdev->
stats.rx_fifo_errors++;
1080 static int ftgmac100_open(
struct net_device *netdev)
1082 struct ftgmac100 *priv = netdev_priv(netdev);
1085 err = ftgmac100_alloc_buffers(priv);
1087 netdev_err(netdev,
"failed to allocate buffers\n");
1093 netdev_err(netdev,
"failed to request irq %d\n", priv->
irq);
1102 err = ftgmac100_reset_hw(priv);
1106 ftgmac100_init_hw(priv);
1107 ftgmac100_start_hw(priv, 10);
1111 napi_enable(&priv->
napi);
1112 netif_start_queue(netdev);
1121 ftgmac100_free_buffers(priv);
1126 static int ftgmac100_stop(
struct net_device *netdev)
1128 struct ftgmac100 *priv = netdev_priv(netdev);
1133 netif_stop_queue(netdev);
1134 napi_disable(&priv->
napi);
1137 ftgmac100_stop_hw(priv);
1139 ftgmac100_free_buffers(priv);
1144 static int ftgmac100_hard_start_xmit(
struct sk_buff *skb,
1147 struct ftgmac100 *priv = netdev_priv(netdev);
1154 netdev->
stats.tx_dropped++;
1163 netdev_err(netdev,
"map socket buffer failed\n");
1165 netdev->
stats.tx_dropped++;
1170 return ftgmac100_xmit(priv, skb, map);
1176 struct ftgmac100 *priv = netdev_priv(netdev);
1182 .ndo_open = ftgmac100_open,
1183 .ndo_stop = ftgmac100_stop,
1184 .ndo_start_xmit = ftgmac100_hard_start_xmit,
1187 .ndo_do_ioctl = ftgmac100_do_ioctl,
1214 netdev = alloc_etherdev(
sizeof(*priv));
1217 goto err_alloc_etherdev;
1226 platform_set_drvdata(pdev, netdev);
1229 priv = netdev_priv(netdev);
1240 dev_name(&pdev->
dev));
1242 dev_err(&pdev->
dev,
"Could not reserve memory region\n");
1249 dev_err(&pdev->
dev,
"Failed to ioremap ethernet registers\n");
1257 priv->
mii_bus = mdiobus_alloc();
1260 goto err_alloc_mdiobus;
1263 priv->
mii_bus->name =
"ftgmac100_mdio";
1267 priv->
mii_bus->read = ftgmac100_mdiobus_read;
1268 priv->
mii_bus->write = ftgmac100_mdiobus_write;
1269 priv->
mii_bus->reset = ftgmac100_mdiobus_reset;
1277 dev_err(&pdev->
dev,
"Cannot register MDIO bus!\n");
1278 goto err_register_mdiobus;
1281 err = ftgmac100_mii_probe(priv);
1290 dev_err(&pdev->
dev,
"Failed to register netdev\n");
1291 goto err_register_netdev;
1294 netdev_info(netdev,
"irq %d, mapped at %p\n", priv->
irq, priv->
base);
1296 if (!is_valid_ether_addr(netdev->
dev_addr)) {
1297 eth_hw_addr_random(netdev);
1298 netdev_info(netdev,
"generated random MAC address %pM\n",
1304 err_register_netdev:
1308 err_register_mdiobus:
1316 platform_set_drvdata(pdev,
NULL);
1327 netdev = platform_get_drvdata(pdev);
1328 priv = netdev_priv(netdev);
1340 platform_set_drvdata(pdev,
NULL);
1346 .probe = ftgmac100_probe,
1347 .remove =
__exit_p(ftgmac100_remove),
1357 static int __init ftgmac100_init(
void)
1363 static void __exit ftgmac100_exit(
void)