| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * Dave DNET Ethernet Controller driver |
|---|
| 3 | 4 | * |
|---|
| 4 | 5 | * Copyright (C) 2008 Dave S.r.l. <www.dave.eu> |
|---|
| 5 | 6 | * Copyright (C) 2009 Ilya Yanok, Emcraft Systems Ltd, <yanok@emcraft.com> |
|---|
| 6 | | - * |
|---|
| 7 | | - * This program is free software; you can redistribute it and/or modify |
|---|
| 8 | | - * it under the terms of the GNU General Public License version 2 as |
|---|
| 9 | | - * published by the Free Software Foundation. |
|---|
| 10 | 7 | */ |
|---|
| 11 | 8 | #include <linux/io.h> |
|---|
| 12 | 9 | #include <linux/module.h> |
|---|
| .. | .. |
|---|
| 284 | 281 | |
|---|
| 285 | 282 | /* mask with MAC supported features */ |
|---|
| 286 | 283 | if (bp->capabilities & DNET_HAS_GIGABIT) |
|---|
| 287 | | - phydev->supported &= PHY_GBIT_FEATURES; |
|---|
| 284 | + phy_set_max_speed(phydev, SPEED_1000); |
|---|
| 288 | 285 | else |
|---|
| 289 | | - phydev->supported &= PHY_BASIC_FEATURES; |
|---|
| 286 | + phy_set_max_speed(phydev, SPEED_100); |
|---|
| 290 | 287 | |
|---|
| 291 | | - phydev->supported |= SUPPORTED_Asym_Pause | SUPPORTED_Pause; |
|---|
| 292 | | - |
|---|
| 293 | | - phydev->advertising = phydev->supported; |
|---|
| 288 | + phy_support_asym_pause(phydev); |
|---|
| 294 | 289 | |
|---|
| 295 | 290 | bp->link = 0; |
|---|
| 296 | 291 | bp->speed = 0; |
|---|
| .. | .. |
|---|
| 512 | 507 | { |
|---|
| 513 | 508 | |
|---|
| 514 | 509 | struct dnet *bp = netdev_priv(dev); |
|---|
| 515 | | - u32 tx_status, irq_enable; |
|---|
| 516 | | - unsigned int len, i, tx_cmd, wrsz; |
|---|
| 510 | + unsigned int i, tx_cmd, wrsz; |
|---|
| 517 | 511 | unsigned long flags; |
|---|
| 518 | 512 | unsigned int *bufp; |
|---|
| 513 | + u32 irq_enable; |
|---|
| 519 | 514 | |
|---|
| 520 | | - tx_status = dnet_readl(bp, TX_STATUS); |
|---|
| 515 | + dnet_readl(bp, TX_STATUS); |
|---|
| 521 | 516 | |
|---|
| 522 | 517 | pr_debug("start_xmit: len %u head %p data %p\n", |
|---|
| 523 | 518 | skb->len, skb->head, skb->data); |
|---|
| 524 | 519 | dnet_print_skb(skb); |
|---|
| 525 | 520 | |
|---|
| 526 | | - /* frame size (words) */ |
|---|
| 527 | | - len = (skb->len + 3) >> 2; |
|---|
| 528 | | - |
|---|
| 529 | 521 | spin_lock_irqsave(&bp->lock, flags); |
|---|
| 530 | 522 | |
|---|
| 531 | | - tx_status = dnet_readl(bp, TX_STATUS); |
|---|
| 523 | + dnet_readl(bp, TX_STATUS); |
|---|
| 532 | 524 | |
|---|
| 533 | 525 | bufp = (unsigned int *)(((unsigned long) skb->data) & ~0x3UL); |
|---|
| 534 | 526 | wrsz = (u32) skb->len + 3; |
|---|
| .. | .. |
|---|
| 550 | 542 | |
|---|
| 551 | 543 | if (dnet_readl(bp, TX_FIFO_WCNT) > DNET_FIFO_TX_DATA_AF_TH) { |
|---|
| 552 | 544 | netif_stop_queue(dev); |
|---|
| 553 | | - tx_status = dnet_readl(bp, INTR_SRC); |
|---|
| 545 | + dnet_readl(bp, INTR_SRC); |
|---|
| 554 | 546 | irq_enable = dnet_readl(bp, INTR_ENB); |
|---|
| 555 | 547 | irq_enable |= DNET_INTR_ENB_TX_FIFOAE; |
|---|
| 556 | 548 | dnet_writel(bp, irq_enable, INTR_ENB); |
|---|
| .. | .. |
|---|
| 558 | 550 | |
|---|
| 559 | 551 | skb_tx_timestamp(skb); |
|---|
| 560 | 552 | |
|---|
| 553 | + spin_unlock_irqrestore(&bp->lock, flags); |
|---|
| 554 | + |
|---|
| 561 | 555 | /* free the buffer */ |
|---|
| 562 | 556 | dev_kfree_skb(skb); |
|---|
| 563 | | - |
|---|
| 564 | | - spin_unlock_irqrestore(&bp->lock, flags); |
|---|
| 565 | 557 | |
|---|
| 566 | 558 | return NETDEV_TX_OK; |
|---|
| 567 | 559 | } |
|---|
| .. | .. |
|---|
| 730 | 722 | return nstat; |
|---|
| 731 | 723 | } |
|---|
| 732 | 724 | |
|---|
| 733 | | -static int dnet_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) |
|---|
| 734 | | -{ |
|---|
| 735 | | - struct phy_device *phydev = dev->phydev; |
|---|
| 736 | | - |
|---|
| 737 | | - if (!netif_running(dev)) |
|---|
| 738 | | - return -EINVAL; |
|---|
| 739 | | - |
|---|
| 740 | | - if (!phydev) |
|---|
| 741 | | - return -ENODEV; |
|---|
| 742 | | - |
|---|
| 743 | | - return phy_mii_ioctl(phydev, rq, cmd); |
|---|
| 744 | | -} |
|---|
| 745 | | - |
|---|
| 746 | 725 | static void dnet_get_drvinfo(struct net_device *dev, |
|---|
| 747 | 726 | struct ethtool_drvinfo *info) |
|---|
| 748 | 727 | { |
|---|
| 749 | 728 | strlcpy(info->driver, DRV_NAME, sizeof(info->driver)); |
|---|
| 750 | | - strlcpy(info->version, DRV_VERSION, sizeof(info->version)); |
|---|
| 751 | 729 | strlcpy(info->bus_info, "0", sizeof(info->bus_info)); |
|---|
| 752 | 730 | } |
|---|
| 753 | 731 | |
|---|
| .. | .. |
|---|
| 764 | 742 | .ndo_stop = dnet_close, |
|---|
| 765 | 743 | .ndo_get_stats = dnet_get_stats, |
|---|
| 766 | 744 | .ndo_start_xmit = dnet_start_xmit, |
|---|
| 767 | | - .ndo_do_ioctl = dnet_ioctl, |
|---|
| 745 | + .ndo_do_ioctl = phy_do_ioctl_running, |
|---|
| 768 | 746 | .ndo_set_mac_address = eth_mac_addr, |
|---|
| 769 | 747 | .ndo_validate_addr = eth_validate_addr, |
|---|
| 770 | 748 | }; |
|---|
| .. | .. |
|---|
| 795 | 773 | |
|---|
| 796 | 774 | spin_lock_init(&bp->lock); |
|---|
| 797 | 775 | |
|---|
| 798 | | - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
|---|
| 799 | | - bp->regs = devm_ioremap_resource(&pdev->dev, res); |
|---|
| 776 | + bp->regs = devm_platform_get_and_ioremap_resource(pdev, 0, &res); |
|---|
| 800 | 777 | if (IS_ERR(bp->regs)) { |
|---|
| 801 | 778 | err = PTR_ERR(bp->regs); |
|---|
| 802 | 779 | goto err_out_free_dev; |
|---|