From patchwork Thu Jul 23 11:55:02 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andre Edich X-Patchwork-Id: 1334817 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=23.128.96.18; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=quarantine dis=none) header.from=microchip.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=microchip.com header.i=@microchip.com header.a=rsa-sha256 header.s=mchp header.b=cNxkofp/; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by ozlabs.org (Postfix) with ESMTP id 4BC9kv4TWbz9sRK for ; Thu, 23 Jul 2020 21:55:35 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728412AbgGWLze (ORCPT ); Thu, 23 Jul 2020 07:55:34 -0400 Received: from esa3.microchip.iphmx.com ([68.232.153.233]:18544 "EHLO esa3.microchip.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726109AbgGWLzd (ORCPT ); Thu, 23 Jul 2020 07:55:33 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1595505332; x=1627041332; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=J3apM0TMNZPjzmKoMGW/09O+HqgQgUeIiaTSSKA7Xsw=; b=cNxkofp/pvlCNYJMWEBAFDsdgNgK4hQYmawIGcmVohJmcZxOvd4BoK0z hwwA+yycUtfUNiQg2siWUWsYjm6ZaMcMaX1QYW0oJI7KkqMyEHd1DBu9B AzIXxjRD/puF5ciejBzBxmndy8DYnAX0Occb7hKW7L07EwICMEqnBX4lk Issih6RiVGmFyfYBm5N8z2NgNR/r+sfnWMOsdn+GDLDn3p4nK4h45JFhD w4ZbAPtIhkXoG0rsCXW8Y2HGj0+Puq+WMN4K8TBgbguD+107T8RNOtHzp ZMSz+UfLsQ2eDyN50zotL4ZnS385qBC++cOC71jxeZcWws6amkQGzKr77 w==; IronPort-SDR: StEJ5FJAZ7xFYigqujBYO1rn1L2zxPt2NqPgm2mliNo/g5HWN6kt7CtHvi7Zsy8syB5cWX0i5b Wmxp/An4yI8IezGVUbGAdtq165q1DhexASnRQ9YiyggBRo7B5k4b2RmEGMnd6IHfwzSc8qF0Cn mAA8figQDEyjEKakigtuSIlN/Q72IuCo4BqNt4rIfQSzKXpyzwVOJBqzco3/EFlPp9nOOifRpC jGLJmQuTzLECNjEAoIuqL+Hfdd0F7FFNF227IjxGKbYbAA9ocPWoq9ufun7GN1BdssL0+BbU3+ 9aY= X-IronPort-AV: E=Sophos;i="5.75,386,1589266800"; d="scan'208";a="85096759" Received: from smtpout.microchip.com (HELO email.microchip.com) ([198.175.253.82]) by esa3.microchip.iphmx.com with ESMTP/TLS/AES256-SHA256; 23 Jul 2020 04:55:31 -0700 Received: from chn-vm-ex02.mchp-main.com (10.10.85.144) by chn-vm-ex01.mchp-main.com (10.10.85.143) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1979.3; Thu, 23 Jul 2020 04:54:52 -0700 Received: from xasv.mchp-main.com (10.10.115.15) by chn-vm-ex02.mchp-main.com (10.10.85.144) with Microsoft SMTP Server id 15.1.1979.3 via Frontend Transport; Thu, 23 Jul 2020 04:54:48 -0700 From: Andre Edich To: , , CC: , Andre Edich Subject: [PATCH net-next v2 1/6] smsc95xx: remove redundant function arguments Date: Thu, 23 Jul 2020 13:55:02 +0200 Message-ID: <20200723115507.26194-2-andre.edich@microchip.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200723115507.26194-1-andre.edich@microchip.com> References: <20200723115507.26194-1-andre.edich@microchip.com> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This patch removes arguments netdev and phy_id from the functions smsc95xx_mdio_read_nopm and smsc95xx_mdio_write_nopm. Both removed arguments are recovered from a new argument `struct usbnet *dev`. Signed-off-by: Andre Edich --- drivers/net/usb/smsc95xx.c | 35 +++++++++++++++++------------------ 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/drivers/net/usb/smsc95xx.c b/drivers/net/usb/smsc95xx.c index bb4ccbda031a..3fdf7c2b2d25 100644 --- a/drivers/net/usb/smsc95xx.c +++ b/drivers/net/usb/smsc95xx.c @@ -261,16 +261,18 @@ static void __smsc95xx_mdio_write(struct net_device *netdev, int phy_id, mutex_unlock(&dev->phy_mutex); } -static int smsc95xx_mdio_read_nopm(struct net_device *netdev, int phy_id, - int idx) +static int smsc95xx_mdio_read_nopm(struct usbnet *dev, int idx) { - return __smsc95xx_mdio_read(netdev, phy_id, idx, 1); + struct mii_if_info *mii = &dev->mii; + + return __smsc95xx_mdio_read(dev->net, mii->phy_id, idx, 1); } -static void smsc95xx_mdio_write_nopm(struct net_device *netdev, int phy_id, - int idx, int regval) +static void smsc95xx_mdio_write_nopm(struct usbnet *dev, int idx, int regval) { - __smsc95xx_mdio_write(netdev, phy_id, idx, regval, 1); + struct mii_if_info *mii = &dev->mii; + + __smsc95xx_mdio_write(dev->net, mii->phy_id, idx, regval, 1); } static int smsc95xx_mdio_read(struct net_device *netdev, int phy_id, int idx) @@ -1347,39 +1349,37 @@ static u32 smsc_crc(const u8 *buffer, size_t len, int filter) static int smsc95xx_enable_phy_wakeup_interrupts(struct usbnet *dev, u16 mask) { - struct mii_if_info *mii = &dev->mii; int ret; netdev_dbg(dev->net, "enabling PHY wakeup interrupts\n"); /* read to clear */ - ret = smsc95xx_mdio_read_nopm(dev->net, mii->phy_id, PHY_INT_SRC); + ret = smsc95xx_mdio_read_nopm(dev, PHY_INT_SRC); if (ret < 0) return ret; /* enable interrupt source */ - ret = smsc95xx_mdio_read_nopm(dev->net, mii->phy_id, PHY_INT_MASK); + ret = smsc95xx_mdio_read_nopm(dev, PHY_INT_MASK); if (ret < 0) return ret; ret |= mask; - smsc95xx_mdio_write_nopm(dev->net, mii->phy_id, PHY_INT_MASK, ret); + smsc95xx_mdio_write_nopm(dev, PHY_INT_MASK, ret); return 0; } static int smsc95xx_link_ok_nopm(struct usbnet *dev) { - struct mii_if_info *mii = &dev->mii; int ret; /* first, a dummy read, needed to latch some MII phys */ - ret = smsc95xx_mdio_read_nopm(dev->net, mii->phy_id, MII_BMSR); + ret = smsc95xx_mdio_read_nopm(dev, MII_BMSR); if (ret < 0) return ret; - ret = smsc95xx_mdio_read_nopm(dev->net, mii->phy_id, MII_BMSR); + ret = smsc95xx_mdio_read_nopm(dev, MII_BMSR); if (ret < 0) return ret; @@ -1428,7 +1428,6 @@ static int smsc95xx_enter_suspend0(struct usbnet *dev) static int smsc95xx_enter_suspend1(struct usbnet *dev) { struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]); - struct mii_if_info *mii = &dev->mii; u32 val; int ret; @@ -1436,17 +1435,17 @@ static int smsc95xx_enter_suspend1(struct usbnet *dev) * compatibility with non-standard link partners */ if (pdata->features & FEATURE_PHY_NLP_CROSSOVER) - smsc95xx_mdio_write_nopm(dev->net, mii->phy_id, PHY_EDPD_CONFIG, - PHY_EDPD_CONFIG_DEFAULT); + smsc95xx_mdio_write_nopm(dev, PHY_EDPD_CONFIG, + PHY_EDPD_CONFIG_DEFAULT); /* enable energy detect power-down mode */ - ret = smsc95xx_mdio_read_nopm(dev->net, mii->phy_id, PHY_MODE_CTRL_STS); + ret = smsc95xx_mdio_read_nopm(dev, PHY_MODE_CTRL_STS); if (ret < 0) return ret; ret |= MODE_CTRL_STS_EDPWRDOWN_; - smsc95xx_mdio_write_nopm(dev->net, mii->phy_id, PHY_MODE_CTRL_STS, ret); + smsc95xx_mdio_write_nopm(dev, PHY_MODE_CTRL_STS, ret); /* enter SUSPEND1 mode */ ret = smsc95xx_read_reg_nopm(dev, PM_CTRL, &val); From patchwork Thu Jul 23 11:55:03 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andre Edich X-Patchwork-Id: 1334818 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=23.128.96.18; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=quarantine dis=none) header.from=microchip.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=microchip.com header.i=@microchip.com header.a=rsa-sha256 header.s=mchp header.b=UPlbX2yh; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by ozlabs.org (Postfix) with ESMTP id 4BC9l10CGXz9sR4 for ; Thu, 23 Jul 2020 21:55:41 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728472AbgGWLzk (ORCPT ); Thu, 23 Jul 2020 07:55:40 -0400 Received: from esa4.microchip.iphmx.com ([68.232.154.123]:50662 "EHLO esa4.microchip.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726109AbgGWLzj (ORCPT ); Thu, 23 Jul 2020 07:55:39 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1595505338; x=1627041338; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=JR21sQJ9MraQ99zguhNdWQ8muJkHdp6Hay4dhxEscew=; b=UPlbX2yh4my0BpMtnzOWVC8bWoIcrsmQAeqHFG4iL+xKZcj/PFYhG4Hf YDvMe0RdEgs6XZhhRxbI0MAi+OdfQEhwEXcse+U7BGn/RM+JjzaZg3LlF 4118me6K9fsdeuPYS3MyR6d1ub0qkGVxhN+rmGEocGsINQo0I/8HspYmG WMQh6eNcn1Y/xUUrEHHLJBAiYlPGbl++QB7isG1xmVMKdbsuXNIUhJdfe qFPkQnVJ93DyJpBXztw8RGvRS+23G5Dm11aNOSc3brVxIf2DGJ9AIyJw1 5EdDlnpy6/4cX9ZvaCFG2ESHrL73FWzd939m2TWtN8Vd3qq609swYECjl A==; IronPort-SDR: 0CMtqs4cYfDN3rfuDMStFglPEzmnwwA/PGNfqiqT8llsaITNS8onXhrR1bAwOXGkvruq+wbOCG 19BkkZhXfQwaLCR5C2qYhnU6AIpElCWOZtf624tNoWSXOIzZgIEFDswyPqw2wspdZR5aPSFfHo 302nPrPsrf/tiFFt8Fs22nJMe9pvGeS5LAmmVxoPi1ns4y7bVXKPRMBthJ75PHWnv1ZMka2+bZ 8PGiq5ExU0zcJDN27SSXxaWQNwM3CzrH4JJAIqyJ/YNlCkbAelSwKDi7dVpxZBriWmDQxM6PU0 aJI= X-IronPort-AV: E=Sophos;i="5.75,386,1589266800"; d="scan'208";a="81033789" Received: from smtpout.microchip.com (HELO email.microchip.com) ([198.175.253.82]) by esa4.microchip.iphmx.com with ESMTP/TLS/AES256-SHA256; 23 Jul 2020 04:55:38 -0700 Received: from chn-vm-ex02.mchp-main.com (10.10.85.144) by chn-vm-ex03.mchp-main.com (10.10.85.151) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1979.3; Thu, 23 Jul 2020 04:55:38 -0700 Received: from xasv.mchp-main.com (10.10.115.15) by chn-vm-ex02.mchp-main.com (10.10.85.144) with Microsoft SMTP Server id 15.1.1979.3 via Frontend Transport; Thu, 23 Jul 2020 04:54:55 -0700 From: Andre Edich To: , , CC: , Andre Edich Subject: [PATCH net-next v2 2/6] smsc95xx: use usbnet->driver_priv Date: Thu, 23 Jul 2020 13:55:03 +0200 Message-ID: <20200723115507.26194-3-andre.edich@microchip.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200723115507.26194-1-andre.edich@microchip.com> References: <20200723115507.26194-1-andre.edich@microchip.com> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Using `void *driver_priv` instead of `unsigned long data[]` is more straightforward way to recover the `struct smsc95xx_priv *` from the `struct net_device *`. Signed-off-by: Andre Edich Reviewed-by: Andrew Lunn --- drivers/net/usb/smsc95xx.c | 61 +++++++++++++++++--------------------- 1 file changed, 28 insertions(+), 33 deletions(-) diff --git a/drivers/net/usb/smsc95xx.c b/drivers/net/usb/smsc95xx.c index 3fdf7c2b2d25..f200684875fb 100644 --- a/drivers/net/usb/smsc95xx.c +++ b/drivers/net/usb/smsc95xx.c @@ -457,7 +457,7 @@ static unsigned int smsc95xx_hash(char addr[ETH_ALEN]) static void smsc95xx_set_multicast(struct net_device *netdev) { struct usbnet *dev = netdev_priv(netdev); - struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]); + struct smsc95xx_priv *pdata = dev->driver_priv; unsigned long flags; int ret; @@ -552,7 +552,7 @@ static int smsc95xx_phy_update_flowcontrol(struct usbnet *dev, u8 duplex, static int smsc95xx_link_reset(struct usbnet *dev) { - struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]); + struct smsc95xx_priv *pdata = dev->driver_priv; struct mii_if_info *mii = &dev->mii; struct ethtool_cmd ecmd = { .cmd = ETHTOOL_GSET }; unsigned long flags; @@ -620,7 +620,7 @@ static void smsc95xx_status(struct usbnet *dev, struct urb *urb) static void set_carrier(struct usbnet *dev, bool link) { - struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]); + struct smsc95xx_priv *pdata = dev->driver_priv; if (pdata->link_ok == link) return; @@ -749,7 +749,7 @@ static void smsc95xx_ethtool_get_wol(struct net_device *net, struct ethtool_wolinfo *wolinfo) { struct usbnet *dev = netdev_priv(net); - struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]); + struct smsc95xx_priv *pdata = dev->driver_priv; wolinfo->supported = SUPPORTED_WAKE; wolinfo->wolopts = pdata->wolopts; @@ -759,7 +759,7 @@ static int smsc95xx_ethtool_set_wol(struct net_device *net, struct ethtool_wolinfo *wolinfo) { struct usbnet *dev = netdev_priv(net); - struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]); + struct smsc95xx_priv *pdata = dev->driver_priv; int ret; if (wolinfo->wolopts & ~SUPPORTED_WAKE) @@ -798,7 +798,7 @@ static int get_mdix_status(struct net_device *net) static void set_mdix_status(struct net_device *net, __u8 mdix_ctrl) { struct usbnet *dev = netdev_priv(net); - struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]); + struct smsc95xx_priv *pdata = dev->driver_priv; int buf; if ((pdata->chip_id == ID_REV_CHIP_ID_9500A_) || @@ -847,7 +847,7 @@ static int smsc95xx_get_link_ksettings(struct net_device *net, struct ethtool_link_ksettings *cmd) { struct usbnet *dev = netdev_priv(net); - struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]); + struct smsc95xx_priv *pdata = dev->driver_priv; int retval; retval = usbnet_get_link_ksettings(net, cmd); @@ -862,7 +862,7 @@ static int smsc95xx_set_link_ksettings(struct net_device *net, const struct ethtool_link_ksettings *cmd) { struct usbnet *dev = netdev_priv(net); - struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]); + struct smsc95xx_priv *pdata = dev->driver_priv; int retval; if (pdata->mdix_ctrl != cmd->base.eth_tp_mdix_ctrl) @@ -944,7 +944,7 @@ static int smsc95xx_set_mac_address(struct usbnet *dev) /* starts the TX path */ static int smsc95xx_start_tx_path(struct usbnet *dev) { - struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]); + struct smsc95xx_priv *pdata = dev->driver_priv; unsigned long flags; int ret; @@ -964,7 +964,7 @@ static int smsc95xx_start_tx_path(struct usbnet *dev) /* Starts the Receive path */ static int smsc95xx_start_rx_path(struct usbnet *dev, int in_pm) { - struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]); + struct smsc95xx_priv *pdata = dev->driver_priv; unsigned long flags; spin_lock_irqsave(&pdata->mac_cr_lock, flags); @@ -1021,7 +1021,7 @@ static int smsc95xx_phy_initialize(struct usbnet *dev) static int smsc95xx_reset(struct usbnet *dev) { - struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]); + struct smsc95xx_priv *pdata = dev->driver_priv; u32 read_buf, write_buf, burst_cap; int ret = 0, timeout; @@ -1249,7 +1249,7 @@ static const struct net_device_ops smsc95xx_netdev_ops = { static int smsc95xx_bind(struct usbnet *dev, struct usb_interface *intf) { - struct smsc95xx_priv *pdata = NULL; + struct smsc95xx_priv *pdata; u32 val; int ret; @@ -1261,13 +1261,12 @@ static int smsc95xx_bind(struct usbnet *dev, struct usb_interface *intf) return ret; } - dev->data[0] = (unsigned long)kzalloc(sizeof(struct smsc95xx_priv), - GFP_KERNEL); - - pdata = (struct smsc95xx_priv *)(dev->data[0]); + pdata = kzalloc(sizeof(*pdata), GFP_KERNEL); if (!pdata) return -ENOMEM; + dev->driver_priv = pdata; + spin_lock_init(&pdata->mac_cr_lock); /* LAN95xx devices do not alter the computed checksum of 0 to 0xffff. @@ -1330,15 +1329,11 @@ static int smsc95xx_bind(struct usbnet *dev, struct usb_interface *intf) static void smsc95xx_unbind(struct usbnet *dev, struct usb_interface *intf) { - struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]); - - if (pdata) { - cancel_delayed_work_sync(&pdata->carrier_check); - netif_dbg(dev, ifdown, dev->net, "free pdata\n"); - kfree(pdata); - pdata = NULL; - dev->data[0] = 0; - } + struct smsc95xx_priv *pdata = dev->driver_priv; + + cancel_delayed_work_sync(&pdata->carrier_check); + netif_dbg(dev, ifdown, dev->net, "free pdata\n"); + kfree(pdata); } static u32 smsc_crc(const u8 *buffer, size_t len, int filter) @@ -1388,7 +1383,7 @@ static int smsc95xx_link_ok_nopm(struct usbnet *dev) static int smsc95xx_enter_suspend0(struct usbnet *dev) { - struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]); + struct smsc95xx_priv *pdata = dev->driver_priv; u32 val; int ret; @@ -1427,7 +1422,7 @@ static int smsc95xx_enter_suspend0(struct usbnet *dev) static int smsc95xx_enter_suspend1(struct usbnet *dev) { - struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]); + struct smsc95xx_priv *pdata = dev->driver_priv; u32 val; int ret; @@ -1474,7 +1469,7 @@ static int smsc95xx_enter_suspend1(struct usbnet *dev) static int smsc95xx_enter_suspend2(struct usbnet *dev) { - struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]); + struct smsc95xx_priv *pdata = dev->driver_priv; u32 val; int ret; @@ -1496,7 +1491,7 @@ static int smsc95xx_enter_suspend2(struct usbnet *dev) static int smsc95xx_enter_suspend3(struct usbnet *dev) { - struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]); + struct smsc95xx_priv *pdata = dev->driver_priv; u32 val; int ret; @@ -1535,7 +1530,7 @@ static int smsc95xx_enter_suspend3(struct usbnet *dev) static int smsc95xx_autosuspend(struct usbnet *dev, u32 link_up) { - struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]); + struct smsc95xx_priv *pdata = dev->driver_priv; int ret; if (!netif_running(dev->net)) { @@ -1583,7 +1578,7 @@ static int smsc95xx_autosuspend(struct usbnet *dev, u32 link_up) static int smsc95xx_suspend(struct usb_interface *intf, pm_message_t message) { struct usbnet *dev = usb_get_intfdata(intf); - struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]); + struct smsc95xx_priv *pdata = dev->driver_priv; u32 val, link_up; int ret; @@ -1854,7 +1849,7 @@ static int smsc95xx_resume(struct usb_interface *intf) u32 val; BUG_ON(!dev); - pdata = (struct smsc95xx_priv *)(dev->data[0]); + pdata = dev->driver_priv; suspend_flags = pdata->suspend_flags; netdev_dbg(dev->net, "resume suspend_flags=0x%02x\n", suspend_flags); @@ -2074,7 +2069,7 @@ static struct sk_buff *smsc95xx_tx_fixup(struct usbnet *dev, static int smsc95xx_manage_power(struct usbnet *dev, int on) { - struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]); + struct smsc95xx_priv *pdata = dev->driver_priv; dev->intf->needs_remote_wakeup = on; From patchwork Thu Jul 23 11:55:04 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andre Edich X-Patchwork-Id: 1334819 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=23.128.96.18; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=quarantine dis=none) header.from=microchip.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=microchip.com header.i=@microchip.com header.a=rsa-sha256 header.s=mchp header.b=Bz4iiIM4; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by ozlabs.org (Postfix) with ESMTP id 4BC9lF6Gzpz9sR4 for ; Thu, 23 Jul 2020 21:55:53 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728511AbgGWLzx (ORCPT ); Thu, 23 Jul 2020 07:55:53 -0400 Received: from esa4.microchip.iphmx.com ([68.232.154.123]:50689 "EHLO esa4.microchip.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726109AbgGWLzw (ORCPT ); Thu, 23 Jul 2020 07:55:52 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1595505351; x=1627041351; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=rWTHd3bxZhPPKurRgmQvPYXRTQCJhhcfWPzM/pjeFMA=; b=Bz4iiIM4aV2ZuXX4Q5exv4EYcGRrhXzFNCBQNj/zB8vjhzEPC/xi7uqj 4hDS1U5+YinBpNAZkJfTtUzkcALqBcyZ10KFnKy9rh6j3j0FCsrM3lp1W Oe+eVJgIRCuAEHGB2Afaq1pr9T2ImoHbgRzJBZJbf16MT9gCZMQh6PHkr hwg9ILoupdppgzw9Lt1jF1zDFf5v2gEnlZFhaJm2sQP4n4QEmR2g2O4CV JYXKzX04I/lIZP/diHi7Z4gloZ9v8WkX350v/9cATZe/0YkgEXexXRJ82 Max1EfLjbOMYpOiT+Z4xsnn1caeBcxmqLisOAPpcZ3CL3BQpdCtRJMf1y Q==; IronPort-SDR: U2Eumpyj5WPWmpDmTUoS0sZiTzuW4OC07CyzQ3qafjn/ksf7tRHSFu/CyGrbcY+JdJDq+FAyeb R1OQ3FdDWJCzdVlxEa9EZ9Ko7PibSLfxNccVAeWFGhFf69v5SNucX807Ng21MQ75w1qYcZsWqu sOKhzVZhb4bsN+2m3Tw6Tc391zLUXSMV67cfcZXpv5opcRS8tj9EWO1AlNJZpkWCHfnh7KzksN 0S29I9RRq670lXmT+gQP2fL6yBvnBPE88hoWF8rThmqkRI37eVUFEJrG0zAoGKPKFaMy9gwZGH RVQ= X-IronPort-AV: E=Sophos;i="5.75,386,1589266800"; d="scan'208";a="81033807" Received: from smtpout.microchip.com (HELO email.microchip.com) ([198.175.253.82]) by esa4.microchip.iphmx.com with ESMTP/TLS/AES256-SHA256; 23 Jul 2020 04:55:51 -0700 Received: from chn-vm-ex02.mchp-main.com (10.10.85.144) by chn-vm-ex03.mchp-main.com (10.10.85.151) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1979.3; Thu, 23 Jul 2020 04:55:51 -0700 Received: from xasv.mchp-main.com (10.10.115.15) by chn-vm-ex02.mchp-main.com (10.10.85.144) with Microsoft SMTP Server id 15.1.1979.3 via Frontend Transport; Thu, 23 Jul 2020 04:55:08 -0700 From: Andre Edich To: , , CC: , Andre Edich Subject: [PATCH net-next v2 3/6] smsc95xx: add PAL support to use external PHY drivers Date: Thu, 23 Jul 2020 13:55:04 +0200 Message-ID: <20200723115507.26194-4-andre.edich@microchip.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200723115507.26194-1-andre.edich@microchip.com> References: <20200723115507.26194-1-andre.edich@microchip.com> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Generally, each PHY has their own configuration and it can be done through an external PHY driver. The smsc95xx driver uses only the hard-coded internal PHY configuration. This patch adds PAL (PHY Abstraction Layer) support to probe external PHY drivers for configuring external PHYs. Signed-off-by: Andre Edich Reported-by: kernel test robot --- drivers/net/usb/smsc95xx.c | 201 ++++++++++++++++++++++++------------- 1 file changed, 132 insertions(+), 69 deletions(-) diff --git a/drivers/net/usb/smsc95xx.c b/drivers/net/usb/smsc95xx.c index f200684875fb..9d2710f6d396 100644 --- a/drivers/net/usb/smsc95xx.c +++ b/drivers/net/usb/smsc95xx.c @@ -18,6 +18,8 @@ #include #include #include +#include +#include #include "smsc95xx.h" #define SMSC_CHIPNAME "smsc95xx" @@ -64,6 +66,9 @@ struct smsc95xx_priv { bool link_ok; struct delayed_work carrier_check; struct usbnet *dev; + struct mii_bus *mdiobus; + struct phy_device *phydev; + bool internal_phy; }; static bool turbo_mode = true; @@ -286,6 +291,22 @@ static void smsc95xx_mdio_write(struct net_device *netdev, int phy_id, int idx, __smsc95xx_mdio_write(netdev, phy_id, idx, regval, 0); } +static int smsc95xx_mdiobus_read(struct mii_bus *bus, int phy_id, int idx) +{ + struct usbnet *dev = bus->priv; + + return __smsc95xx_mdio_read(dev->net, phy_id, idx, 0); +} + +static int smsc95xx_mdiobus_write(struct mii_bus *bus, int phy_id, int idx, + u16 regval) +{ + struct usbnet *dev = bus->priv; + + __smsc95xx_mdio_write(dev->net, phy_id, idx, regval, 0); + return 0; +} + static int __must_check smsc95xx_wait_eeprom(struct usbnet *dev) { unsigned long start_time = jiffies; @@ -559,15 +580,20 @@ static int smsc95xx_link_reset(struct usbnet *dev) u16 lcladv, rmtadv; int ret; - /* clear interrupt status */ - ret = smsc95xx_mdio_read(dev->net, mii->phy_id, PHY_INT_SRC); - if (ret < 0) - return ret; - ret = smsc95xx_write_reg(dev, INT_STS, INT_STS_CLEAR_ALL_); if (ret < 0) return ret; + if (pdata->internal_phy) { + /* clear interrupt status */ + ret = smsc95xx_mdio_read(dev->net, mii->phy_id, PHY_INT_SRC); + if (ret < 0) + return ret; + + smsc95xx_mdio_write(dev->net, mii->phy_id, PHY_INT_MASK, + PHY_INT_MASK_DEFAULT_); + } + mii_check_media(mii, 1, 1); mii_ethtool_gset(&dev->mii, &ecmd); lcladv = smsc95xx_mdio_read(dev->net, mii->phy_id, MII_ADVERTISE); @@ -851,10 +877,10 @@ static int smsc95xx_get_link_ksettings(struct net_device *net, int retval; retval = usbnet_get_link_ksettings(net, cmd); - - cmd->base.eth_tp_mdix = pdata->mdix_ctrl; - cmd->base.eth_tp_mdix_ctrl = pdata->mdix_ctrl; - + if (pdata->internal_phy) { + cmd->base.eth_tp_mdix = pdata->mdix_ctrl; + cmd->base.eth_tp_mdix_ctrl = pdata->mdix_ctrl; + } return retval; } @@ -863,14 +889,12 @@ static int smsc95xx_set_link_ksettings(struct net_device *net, { struct usbnet *dev = netdev_priv(net); struct smsc95xx_priv *pdata = dev->driver_priv; - int retval; - - if (pdata->mdix_ctrl != cmd->base.eth_tp_mdix_ctrl) - set_mdix_status(net, cmd->base.eth_tp_mdix_ctrl); + u8 mdix_ctrl = cmd->base.eth_tp_mdix_ctrl; - retval = usbnet_set_link_ksettings(net, cmd); + if (pdata->mdix_ctrl != mdix_ctrl && pdata->internal_phy) + set_mdix_status(net, mdix_ctrl); - return retval; + return usbnet_set_link_ksettings(net, cmd); } static const struct ethtool_ops smsc95xx_ethtool_ops = { @@ -974,51 +998,6 @@ static int smsc95xx_start_rx_path(struct usbnet *dev, int in_pm) return __smsc95xx_write_reg(dev, MAC_CR, pdata->mac_cr, in_pm); } -static int smsc95xx_phy_initialize(struct usbnet *dev) -{ - int bmcr, ret, timeout = 0; - - /* Initialize MII structure */ - dev->mii.dev = dev->net; - dev->mii.mdio_read = smsc95xx_mdio_read; - dev->mii.mdio_write = smsc95xx_mdio_write; - dev->mii.phy_id_mask = 0x1f; - dev->mii.reg_num_mask = 0x1f; - dev->mii.phy_id = SMSC95XX_INTERNAL_PHY_ID; - - /* reset phy and wait for reset to complete */ - smsc95xx_mdio_write(dev->net, dev->mii.phy_id, MII_BMCR, BMCR_RESET); - - do { - msleep(10); - bmcr = smsc95xx_mdio_read(dev->net, dev->mii.phy_id, MII_BMCR); - timeout++; - } while ((bmcr & BMCR_RESET) && (timeout < 100)); - - if (timeout >= 100) { - netdev_warn(dev->net, "timeout on PHY Reset"); - return -EIO; - } - - smsc95xx_mdio_write(dev->net, dev->mii.phy_id, MII_ADVERTISE, - ADVERTISE_ALL | ADVERTISE_CSMA | ADVERTISE_PAUSE_CAP | - ADVERTISE_PAUSE_ASYM); - - /* read to clear */ - ret = smsc95xx_mdio_read(dev->net, dev->mii.phy_id, PHY_INT_SRC); - if (ret < 0) { - netdev_warn(dev->net, "Failed to read PHY_INT_SRC during init\n"); - return ret; - } - - smsc95xx_mdio_write(dev->net, dev->mii.phy_id, PHY_INT_MASK, - PHY_INT_MASK_DEFAULT_); - mii_nway_restart(&dev->mii); - - netif_dbg(dev, ifup, dev->net, "phy initialised successfully\n"); - return 0; -} - static int smsc95xx_reset(struct usbnet *dev) { struct smsc95xx_priv *pdata = dev->driver_priv; @@ -1200,12 +1179,6 @@ static int smsc95xx_reset(struct usbnet *dev) smsc95xx_set_multicast(dev->net); - ret = smsc95xx_phy_initialize(dev); - if (ret < 0) { - netdev_warn(dev->net, "Failed to init PHY\n"); - return ret; - } - ret = smsc95xx_read_reg(dev, INT_EP_CTL, &read_buf); if (ret < 0) return ret; @@ -1291,14 +1264,59 @@ static int smsc95xx_bind(struct usbnet *dev, struct usb_interface *intf) if (ret) goto free_pdata; + pdata->mdiobus = mdiobus_alloc(); + if (!pdata->mdiobus) { + ret = -ENOMEM; + goto free_pdata; + } + + ret = smsc95xx_read_reg(dev, HW_CFG, &val); + if (ret < 0) + goto free_mdio; + + pdata->internal_phy = !(val & HW_CFG_PSEL_); + if (pdata->internal_phy) + pdata->mdiobus->phy_mask = ~(1u << SMSC95XX_INTERNAL_PHY_ID); + + pdata->mdiobus->priv = dev; + pdata->mdiobus->read = smsc95xx_mdiobus_read; + pdata->mdiobus->write = smsc95xx_mdiobus_write; + pdata->mdiobus->name = "smsc95xx-mdiobus"; + pdata->mdiobus->parent = &dev->udev->dev; + + dev->mii.phy_id_mask = 0x1f; + dev->mii.reg_num_mask = 0x1f; + + snprintf(pdata->mdiobus->id, ARRAY_SIZE(pdata->mdiobus->id), + "usb-%03d:%03d", dev->udev->bus->busnum, dev->udev->devnum); + + ret = mdiobus_register(pdata->mdiobus); + if (ret) { + netdev_err(dev->net, "Could not register MDIO bus\n"); + goto free_mdio; + } + + pdata->phydev = phy_find_first(pdata->mdiobus); + if (!pdata->phydev) { + netdev_err(dev->net, "no PHY found\n"); + ret = -ENODEV; + goto unregister_mdio; + } + + dev->mii.dev = dev->net; + dev->mii.mdio_read = smsc95xx_mdio_read; + dev->mii.mdio_write = smsc95xx_mdio_write; + dev->mii.phy_id = pdata->phydev->mdio.addr; + /* detect device revision as different features may be available */ ret = smsc95xx_read_reg(dev, ID_REV, &val); if (ret < 0) - goto free_pdata; + goto unregister_mdio; val >>= 16; pdata->chip_id = val; - pdata->mdix_ctrl = get_mdix_status(dev->net); + if (pdata->internal_phy) + pdata->mdix_ctrl = get_mdix_status(dev->net); if ((val == ID_REV_CHIP_ID_9500A_) || (val == ID_REV_CHIP_ID_9530_) || (val == ID_REV_CHIP_ID_89530_) || (val == ID_REV_CHIP_ID_9730_)) @@ -1322,6 +1340,12 @@ static int smsc95xx_bind(struct usbnet *dev, struct usb_interface *intf) return 0; +unregister_mdio: + mdiobus_unregister(pdata->mdiobus); + +free_mdio: + mdiobus_free(pdata->mdiobus); + free_pdata: kfree(pdata); return ret; @@ -1332,10 +1356,47 @@ static void smsc95xx_unbind(struct usbnet *dev, struct usb_interface *intf) struct smsc95xx_priv *pdata = dev->driver_priv; cancel_delayed_work_sync(&pdata->carrier_check); + mdiobus_unregister(pdata->mdiobus); + mdiobus_free(pdata->mdiobus); netif_dbg(dev, ifdown, dev->net, "free pdata\n"); kfree(pdata); } +static void smsc95xx_handle_link_change(struct net_device *net) +{ + phy_print_status(net->phydev); +} + +static int smsc95xx_start_phy(struct usbnet *dev) +{ + struct smsc95xx_priv *pdata = dev->driver_priv; + struct net_device *net = dev->net; + int ret; + + ret = smsc95xx_reset(dev); + if (ret < 0) + return ret; + + ret = phy_connect_direct(net, pdata->phydev, + &smsc95xx_handle_link_change, + PHY_INTERFACE_MODE_MII); + if (ret) { + netdev_err(net, "can't attach PHY to %s\n", pdata->mdiobus->id); + return ret; + } + + phy_attached_info(net->phydev); + phy_start(net->phydev); + return 0; +} + +static int smsc95xx_disconnect_phy(struct usbnet *dev) +{ + phy_stop(dev->net->phydev); + phy_disconnect(dev->net->phydev); + return 0; +} + static u32 smsc_crc(const u8 *buffer, size_t len, int filter) { u32 crc = bitrev16(crc16(0xFFFF, buffer, len)); @@ -1887,6 +1948,7 @@ static int smsc95xx_resume(struct usb_interface *intf) if (ret < 0) netdev_warn(dev->net, "usbnet_resume error\n"); + phy_init_hw(pdata->phydev); return ret; } @@ -2092,7 +2154,8 @@ static const struct driver_info smsc95xx_info = { .bind = smsc95xx_bind, .unbind = smsc95xx_unbind, .link_reset = smsc95xx_link_reset, - .reset = smsc95xx_reset, + .reset = smsc95xx_start_phy, + .stop = smsc95xx_disconnect_phy, .rx_fixup = smsc95xx_rx_fixup, .tx_fixup = smsc95xx_tx_fixup, .status = smsc95xx_status, From patchwork Thu Jul 23 11:55:05 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andre Edich X-Patchwork-Id: 1334820 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=23.128.96.18; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=quarantine dis=none) header.from=microchip.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=microchip.com header.i=@microchip.com header.a=rsa-sha256 header.s=mchp header.b=Rwp4gz9v; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by ozlabs.org (Postfix) with ESMTP id 4BC9lq35Sdz9sR4 for ; Thu, 23 Jul 2020 21:56:23 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728539AbgGWL4W (ORCPT ); Thu, 23 Jul 2020 07:56:22 -0400 Received: from esa6.microchip.iphmx.com ([216.71.154.253]:33873 "EHLO esa6.microchip.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726109AbgGWL4W (ORCPT ); Thu, 23 Jul 2020 07:56:22 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1595505381; x=1627041381; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=s1uSIGqlOXYzswhFV7D2Fhg5Ku0q68435WJVN+7LHQ8=; b=Rwp4gz9vNdFAkY9+IqrZRdP5rHCE7La6GaSrJoHkmE2QkD/O5PoGLL+N rZaZoqVWbYkS4r5lnVgWzhKa5rxNjsdXiKRSHNdUPxqZU8wIBkv+W6gbN 7NM0v2RbbKxE7smWg/fU00LB4/p0PYroFyZQ6yD35IQFrA37rhR453TMN 6ps+W3fUw0y3mbBmfj/Z4sncxxF76PBC2PRwRw9WAbrm5xkZhXKmPi61y cyV8P5Er7pOzN3gI/GZVmVrvIK3z4XnDNFlIznmtloKxrH2di/4muSbMX QsRTnCCKOigdNyyeCf6otVxkf3EHoh6c5N9WwkpVmylLnOyqKbYQvoU4u g==; IronPort-SDR: YcP89EbNyYyDa5t5I+x1+o47VbMX3wvnmpBHKPkD54oZ0GxEP/JjnGWPWPXsw/TGxATnEKJC1Q 4ZTLhV80gwIn9sb9lLNGDFrAR8I6PAJWvc3j0UglIe+mWnfonM8xQy8YpZNUWjyoV3WfD/6eg7 zRy19IO2ttDMFk8FuQwOhhN6hCVu0yLfEgrD2jn4efR0XMWsu+KiHDDKICBmVx7TVBIoZ0/M3l 6cloQfqMh/g7ay4lro4YwDOfj4pumErhgdrILSkp5m39oSLETp4mC9rqSBho+D3F+bc6KFSbM4 6/g= X-IronPort-AV: E=Sophos;i="5.75,386,1589266800"; d="scan'208";a="20277467" Received: from smtpout.microchip.com (HELO email.microchip.com) ([198.175.253.82]) by esa6.microchip.iphmx.com with ESMTP/TLS/AES256-SHA256; 23 Jul 2020 04:56:21 -0700 Received: from chn-vm-ex02.mchp-main.com (10.10.87.72) by chn-vm-ex02.mchp-main.com (10.10.87.72) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1979.3; Thu, 23 Jul 2020 04:55:39 -0700 Received: from xasv.mchp-main.com (10.10.115.15) by chn-vm-ex02.mchp-main.com (10.10.85.144) with Microsoft SMTP Server id 15.1.1979.3 via Frontend Transport; Thu, 23 Jul 2020 04:55:38 -0700 From: Andre Edich To: , , CC: , Andre Edich Subject: [PATCH net-next v2 4/6] smsc95xx: remove redundant link status checking Date: Thu, 23 Jul 2020 13:55:05 +0200 Message-ID: <20200723115507.26194-5-andre.edich@microchip.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200723115507.26194-1-andre.edich@microchip.com> References: <20200723115507.26194-1-andre.edich@microchip.com> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Current driver supports PAL that does link status checking anyway. Signed-off-by: Andre Edich Reviewed-by: Andrew Lunn --- drivers/net/usb/smsc95xx.c | 55 -------------------------------------- 1 file changed, 55 deletions(-) diff --git a/drivers/net/usb/smsc95xx.c b/drivers/net/usb/smsc95xx.c index 9d2710f6d396..8731724bf2c5 100644 --- a/drivers/net/usb/smsc95xx.c +++ b/drivers/net/usb/smsc95xx.c @@ -51,8 +51,6 @@ #define SUSPEND_ALLMODES (SUSPEND_SUSPEND0 | SUSPEND_SUSPEND1 | \ SUSPEND_SUSPEND2 | SUSPEND_SUSPEND3) -#define CARRIER_CHECK_DELAY (2 * HZ) - struct smsc95xx_priv { u32 chip_id; u32 mac_cr; @@ -64,8 +62,6 @@ struct smsc95xx_priv { u8 suspend_flags; u8 mdix_ctrl; bool link_ok; - struct delayed_work carrier_check; - struct usbnet *dev; struct mii_bus *mdiobus; struct phy_device *phydev; bool internal_phy; @@ -644,44 +640,6 @@ static void smsc95xx_status(struct usbnet *dev, struct urb *urb) intdata); } -static void set_carrier(struct usbnet *dev, bool link) -{ - struct smsc95xx_priv *pdata = dev->driver_priv; - - if (pdata->link_ok == link) - return; - - pdata->link_ok = link; - - if (link) - usbnet_link_change(dev, 1, 0); - else - usbnet_link_change(dev, 0, 0); -} - -static void check_carrier(struct work_struct *work) -{ - struct smsc95xx_priv *pdata = container_of(work, struct smsc95xx_priv, - carrier_check.work); - struct usbnet *dev = pdata->dev; - int ret; - - if (pdata->suspend_flags != 0) - return; - - ret = smsc95xx_mdio_read(dev->net, dev->mii.phy_id, MII_BMSR); - if (ret < 0) { - netdev_warn(dev->net, "Failed to read MII_BMSR\n"); - return; - } - if (ret & BMSR_LSTATUS) - set_carrier(dev, 1); - else - set_carrier(dev, 0); - - schedule_delayed_work(&pdata->carrier_check, CARRIER_CHECK_DELAY); -} - /* Enable or disable Tx & Rx checksum offload engines */ static int smsc95xx_set_features(struct net_device *netdev, netdev_features_t features) @@ -1333,11 +1291,6 @@ static int smsc95xx_bind(struct usbnet *dev, struct usb_interface *intf) dev->net->min_mtu = ETH_MIN_MTU; dev->net->max_mtu = ETH_DATA_LEN; dev->hard_mtu = dev->net->mtu + dev->net->hard_header_len; - - pdata->dev = dev; - INIT_DELAYED_WORK(&pdata->carrier_check, check_carrier); - schedule_delayed_work(&pdata->carrier_check, CARRIER_CHECK_DELAY); - return 0; unregister_mdio: @@ -1355,7 +1308,6 @@ static void smsc95xx_unbind(struct usbnet *dev, struct usb_interface *intf) { struct smsc95xx_priv *pdata = dev->driver_priv; - cancel_delayed_work_sync(&pdata->carrier_check); mdiobus_unregister(pdata->mdiobus); mdiobus_free(pdata->mdiobus); netif_dbg(dev, ifdown, dev->net, "free pdata\n"); @@ -1649,8 +1601,6 @@ static int smsc95xx_suspend(struct usb_interface *intf, pm_message_t message) return ret; } - cancel_delayed_work_sync(&pdata->carrier_check); - if (pdata->suspend_flags) { netdev_warn(dev->net, "error during last resume\n"); pdata->suspend_flags = 0; @@ -1894,10 +1844,6 @@ static int smsc95xx_suspend(struct usb_interface *intf, pm_message_t message) if (ret && PMSG_IS_AUTO(message)) usbnet_resume(intf); - if (ret) - schedule_delayed_work(&pdata->carrier_check, - CARRIER_CHECK_DELAY); - return ret; } @@ -1917,7 +1863,6 @@ static int smsc95xx_resume(struct usb_interface *intf) /* do this first to ensure it's cleared even in error case */ pdata->suspend_flags = 0; - schedule_delayed_work(&pdata->carrier_check, CARRIER_CHECK_DELAY); if (suspend_flags & SUSPEND_ALLMODES) { /* clear wake-up sources */ From patchwork Thu Jul 23 11:55:06 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andre Edich X-Patchwork-Id: 1334821 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=23.128.96.18; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=quarantine dis=none) header.from=microchip.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=microchip.com header.i=@microchip.com header.a=rsa-sha256 header.s=mchp header.b=dcbRRUS4; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by ozlabs.org (Postfix) with ESMTP id 4BC9lz2KvWz9sR4 for ; Thu, 23 Jul 2020 21:56:31 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728567AbgGWL4a (ORCPT ); Thu, 23 Jul 2020 07:56:30 -0400 Received: from esa6.microchip.iphmx.com ([216.71.154.253]:33886 "EHLO esa6.microchip.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726109AbgGWL42 (ORCPT ); Thu, 23 Jul 2020 07:56:28 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1595505387; x=1627041387; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=c9cf+yqkxJFtCdCghMbFfcDHmBUoTBqFsVimgFHWM+8=; b=dcbRRUS4/5hkk2Et3ISgyfb6ixJTO4YV2ncx85kIwCx36sAKhBmepTQm hXBO9uNmyz4zPeW36NtU+krZ1Dj7d5ekUGm6m89JVhjwm917A0zQ2f93G sVS2pSqyKQdEIHJYdwzc812JwIh74RGJqKvAyRosdpgmSKuzsVwTuHU3/ sIX8Dxwca6f0V3IDoy0wq7yM+Cxgz/8JdwC5Qmw+lZajU/8k006m7JECR Wmptq4KpZM8wIcbBIkGMbzsRWWluaWDO8D5USYWmsv+lvIP5XQALI1yDB oUX8U/erTrLWwbdhUgOPw43C1003WQ0tr6BXQmBXj2Pz+Xbt8ge00IGum Q==; IronPort-SDR: DnzKIYHj5hPdUeLnEaEN8KnaTNe0v6PIzhNBEQ0Za5eqTdoRKQ07htlYdFt/QxISPihZlf9ibo 0zRq2k/pknAKBeiTC/auZ2UGjDLnSgQA87HWnwg0jPFS+Jl6OhI+2t76Og89n5G+hAxv2jIgs/ ztXsP0MPlDWv1cJYZbxP9NMzd51NPJNd73GLepx3DlT+Wul3yqBkunSdZMKWi9AzQjNQj8264E xNgFVgbX06Ux5CQykBL8rPIv80gxvIKtK1EBdrozmmlBNea6iV2BmpYNnFEULhlzicm2UrcCyP 93Y= X-IronPort-AV: E=Sophos;i="5.75,386,1589266800"; d="scan'208";a="20277508" Received: from smtpout.microchip.com (HELO email.microchip.com) ([198.175.253.82]) by esa6.microchip.iphmx.com with ESMTP/TLS/AES256-SHA256; 23 Jul 2020 04:56:27 -0700 Received: from chn-vm-ex02.mchp-main.com (10.10.87.72) by chn-vm-ex02.mchp-main.com (10.10.87.72) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1979.3; Thu, 23 Jul 2020 04:55:45 -0700 Received: from xasv.mchp-main.com (10.10.115.15) by chn-vm-ex02.mchp-main.com (10.10.85.144) with Microsoft SMTP Server id 15.1.1979.3 via Frontend Transport; Thu, 23 Jul 2020 04:55:44 -0700 From: Andre Edich To: , , CC: , Andre Edich Subject: [PATCH net-next v2 5/6] smsc95xx: use PAL framework read/write functions Date: Thu, 23 Jul 2020 13:55:06 +0200 Message-ID: <20200723115507.26194-6-andre.edich@microchip.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200723115507.26194-1-andre.edich@microchip.com> References: <20200723115507.26194-1-andre.edich@microchip.com> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Use functions phy_read and phy_write instead of smsc95xx_mdio_read and smsc95xx_mdio_write respectively. Signed-off-by: Andre Edich Reported-by: kernel test robot --- drivers/net/usb/smsc95xx.c | 43 +++++++++++++++----------------------- 1 file changed, 17 insertions(+), 26 deletions(-) diff --git a/drivers/net/usb/smsc95xx.c b/drivers/net/usb/smsc95xx.c index 8731724bf2c5..8add7109e661 100644 --- a/drivers/net/usb/smsc95xx.c +++ b/drivers/net/usb/smsc95xx.c @@ -582,22 +582,20 @@ static int smsc95xx_link_reset(struct usbnet *dev) if (pdata->internal_phy) { /* clear interrupt status */ - ret = smsc95xx_mdio_read(dev->net, mii->phy_id, PHY_INT_SRC); + ret = phy_read(pdata->phydev, PHY_INT_SRC); if (ret < 0) return ret; - smsc95xx_mdio_write(dev->net, mii->phy_id, PHY_INT_MASK, - PHY_INT_MASK_DEFAULT_); + ret = phy_write(pdata->phydev, PHY_INT_MASK, + PHY_INT_MASK_DEFAULT_); + if (ret < 0) + return ret; } mii_check_media(mii, 1, 1); mii_ethtool_gset(&dev->mii, &ecmd); - lcladv = smsc95xx_mdio_read(dev->net, mii->phy_id, MII_ADVERTISE); - rmtadv = smsc95xx_mdio_read(dev->net, mii->phy_id, MII_LPA); - - netif_dbg(dev, link, dev->net, - "speed: %u duplex: %d lcladv: %04x rmtadv: %04x\n", - ethtool_cmd_speed(&ecmd), ecmd.duplex, lcladv, rmtadv); + lcladv = phy_read(pdata->phydev, MII_ADVERTISE); + rmtadv = phy_read(pdata->phydev, MII_LPA); spin_lock_irqsave(&pdata->mac_cr_lock, flags); if (ecmd.duplex != DUPLEX_FULL) { @@ -761,10 +759,11 @@ static int smsc95xx_ethtool_set_wol(struct net_device *net, static int get_mdix_status(struct net_device *net) { struct usbnet *dev = netdev_priv(net); + struct smsc95xx_priv *pdata = dev->driver_priv; u32 val; int buf; - buf = smsc95xx_mdio_read(dev->net, dev->mii.phy_id, SPECIAL_CTRL_STS); + buf = phy_read(pdata->phydev, SPECIAL_CTRL_STS); if (buf & SPECIAL_CTRL_STS_OVRRD_AMDIX_) { if (buf & SPECIAL_CTRL_STS_AMDIX_ENABLE_) return ETH_TP_MDI_AUTO; @@ -790,39 +789,31 @@ static void set_mdix_status(struct net_device *net, __u8 mdix_ctrl) (pdata->chip_id == ID_REV_CHIP_ID_89530_) || (pdata->chip_id == ID_REV_CHIP_ID_9730_)) { /* Extend Manual AutoMDIX timer for 9500A/9500Ai */ - buf = smsc95xx_mdio_read(dev->net, dev->mii.phy_id, - PHY_EDPD_CONFIG); + buf = phy_read(pdata->phydev, PHY_EDPD_CONFIG); buf |= PHY_EDPD_CONFIG_EXT_CROSSOVER_; - smsc95xx_mdio_write(dev->net, dev->mii.phy_id, - PHY_EDPD_CONFIG, buf); + phy_write(pdata->phydev, PHY_EDPD_CONFIG, buf); } if (mdix_ctrl == ETH_TP_MDI) { - buf = smsc95xx_mdio_read(dev->net, dev->mii.phy_id, - SPECIAL_CTRL_STS); + buf = phy_read(pdata->phydev, SPECIAL_CTRL_STS); buf |= SPECIAL_CTRL_STS_OVRRD_AMDIX_; buf &= ~(SPECIAL_CTRL_STS_AMDIX_ENABLE_ | SPECIAL_CTRL_STS_AMDIX_STATE_); - smsc95xx_mdio_write(dev->net, dev->mii.phy_id, - SPECIAL_CTRL_STS, buf); + phy_write(pdata->phydev, SPECIAL_CTRL_STS, buf); } else if (mdix_ctrl == ETH_TP_MDI_X) { - buf = smsc95xx_mdio_read(dev->net, dev->mii.phy_id, - SPECIAL_CTRL_STS); + buf = phy_read(pdata->phydev, SPECIAL_CTRL_STS); buf |= SPECIAL_CTRL_STS_OVRRD_AMDIX_; buf &= ~(SPECIAL_CTRL_STS_AMDIX_ENABLE_ | SPECIAL_CTRL_STS_AMDIX_STATE_); buf |= SPECIAL_CTRL_STS_AMDIX_STATE_; - smsc95xx_mdio_write(dev->net, dev->mii.phy_id, - SPECIAL_CTRL_STS, buf); + phy_write(pdata->phydev, SPECIAL_CTRL_STS, buf); } else if (mdix_ctrl == ETH_TP_MDI_AUTO) { - buf = smsc95xx_mdio_read(dev->net, dev->mii.phy_id, - SPECIAL_CTRL_STS); + buf = phy_read(pdata->phydev, SPECIAL_CTRL_STS); buf &= ~SPECIAL_CTRL_STS_OVRRD_AMDIX_; buf &= ~(SPECIAL_CTRL_STS_AMDIX_ENABLE_ | SPECIAL_CTRL_STS_AMDIX_STATE_); buf |= SPECIAL_CTRL_STS_AMDIX_ENABLE_; - smsc95xx_mdio_write(dev->net, dev->mii.phy_id, - SPECIAL_CTRL_STS, buf); + phy_write(pdata->phydev, SPECIAL_CTRL_STS, buf); } pdata->mdix_ctrl = mdix_ctrl; } From patchwork Thu Jul 23 11:55:07 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andre Edich X-Patchwork-Id: 1334822 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=23.128.96.18; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=quarantine dis=none) header.from=microchip.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=microchip.com header.i=@microchip.com header.a=rsa-sha256 header.s=mchp header.b=NchX+S25; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by ozlabs.org (Postfix) with ESMTP id 4BC9m56j0Zz9sR4 for ; Thu, 23 Jul 2020 21:56:37 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728589AbgGWL4h (ORCPT ); Thu, 23 Jul 2020 07:56:37 -0400 Received: from esa4.microchip.iphmx.com ([68.232.154.123]:50760 "EHLO esa4.microchip.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726109AbgGWL4g (ORCPT ); Thu, 23 Jul 2020 07:56:36 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1595505395; x=1627041395; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=aO0aYQwUSovmbXLoGxRCLOv6fo8TyIugmImIYPwwfWU=; b=NchX+S25L96Xt5ISMbZ4/HmYbn8hR5MJp3fUs3gJDp0RBJHCLy0kWfFb PmpVHvyYfE1N22gSoEdaF7yrTUs2RToZ8y6D0pbFm2ul/XUJkjlK4VTUe kXabcAfaTPpw1gIq0F2ASvGS24VEw10cZnLEIhg7QafpW4041icudcG83 QuoA/0aWBWOMpyFCstv0J8d1xTA+Zev5XgfWDkN/E6wlwHhNIyucfhbOu y1kp0N5VG0rNcuUNqrXaT8yGapMUQpAV6DylIFrxJBjtGxU7EWkoOEhYw J5XSDFd8hL8UphaPNnA2uAh5tDEwEaebEzQnJL1LEcNm/tCORl//ayowJ g==; IronPort-SDR: KlqN0TrhcKzasNUIXCUzEh9KkY9OzUqF66SEO3MaGa9HDX+yuKGvo3Ixtbfu6O5UJTWnSnWHiY hMtZRTbr8J/3E6afAlgAsv2doQZit63hizdn4jc98BpzHyldZ7jfoA0BBCE1DgtRjaaew1EfGM OtkKVX9lo/EoEkPkpX+mOSK2KRtSe9gBLU86zxc9hhTwx76TkVsZeVRDoHYgH+LBJPUTIdu7b8 DkMidwazRXIOyglxriwi+SbI3GXjBgeviejBEQVRGFHTJ2TdOIa5aVXXH0yJuIgsjvIitHCt8Y V9U= X-IronPort-AV: E=Sophos;i="5.75,386,1589266800"; d="scan'208";a="81033874" Received: from smtpout.microchip.com (HELO email.microchip.com) ([198.175.253.82]) by esa4.microchip.iphmx.com with ESMTP/TLS/AES256-SHA256; 23 Jul 2020 04:56:35 -0700 Received: from chn-vm-ex02.mchp-main.com (10.10.85.144) by chn-vm-ex03.mchp-main.com (10.10.85.151) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1979.3; Thu, 23 Jul 2020 04:56:35 -0700 Received: from xasv.mchp-main.com (10.10.115.15) by chn-vm-ex02.mchp-main.com (10.10.85.144) with Microsoft SMTP Server id 15.1.1979.3 via Frontend Transport; Thu, 23 Jul 2020 04:55:52 -0700 From: Andre Edich To: , , CC: , Andre Edich Subject: [PATCH net-next v2 6/6] smsc95xx: use PHY framework instead of MII library Date: Thu, 23 Jul 2020 13:55:07 +0200 Message-ID: <20200723115507.26194-7-andre.edich@microchip.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200723115507.26194-1-andre.edich@microchip.com> References: <20200723115507.26194-1-andre.edich@microchip.com> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Since the PHY framework is used anyway, replace the rest of the calls to the MII library, including those from the USB Network driver infrastructure, by the calls to the PHY framework. Signed-off-by: Andre Edich Reported-by: kernel test robot --- drivers/net/usb/smsc95xx.c | 78 +++++++++++++++----------------------- 1 file changed, 30 insertions(+), 48 deletions(-) diff --git a/drivers/net/usb/smsc95xx.c b/drivers/net/usb/smsc95xx.c index 8add7109e661..7de20c0aad36 100644 --- a/drivers/net/usb/smsc95xx.c +++ b/drivers/net/usb/smsc95xx.c @@ -174,10 +174,14 @@ static int __must_check __smsc95xx_phy_wait_not_busy(struct usbnet *dev, return -EIO; } -static int __smsc95xx_mdio_read(struct net_device *netdev, int phy_id, int idx, +static u32 mii_address(u16 op, int phy_id, int idx) +{ + return (phy_id & 0x1f) << 11 | (idx & 0x1f) << 6 | op | MII_BUSY_; +} + +static int __smsc95xx_mdio_read(struct usbnet *dev, int phy_id, int idx, int in_pm) { - struct usbnet *dev = netdev_priv(netdev); u32 val, addr; int ret; @@ -191,9 +195,7 @@ static int __smsc95xx_mdio_read(struct net_device *netdev, int phy_id, int idx, } /* set the address, index & direction (read from PHY) */ - phy_id &= dev->mii.phy_id_mask; - idx &= dev->mii.reg_num_mask; - addr = (phy_id << 11) | (idx << 6) | MII_READ_ | MII_BUSY_; + addr = mii_address(MII_READ_, phy_id, idx); ret = __smsc95xx_write_reg(dev, MII_ADDR, addr, in_pm); if (ret < 0) { netdev_warn(dev->net, "Error writing MII_ADDR\n"); @@ -219,10 +221,9 @@ static int __smsc95xx_mdio_read(struct net_device *netdev, int phy_id, int idx, return ret; } -static void __smsc95xx_mdio_write(struct net_device *netdev, int phy_id, +static void __smsc95xx_mdio_write(struct usbnet *dev, int phy_id, int idx, int regval, int in_pm) { - struct usbnet *dev = netdev_priv(netdev); u32 val, addr; int ret; @@ -243,9 +244,7 @@ static void __smsc95xx_mdio_write(struct net_device *netdev, int phy_id, } /* set the address, index & direction (write to PHY) */ - phy_id &= dev->mii.phy_id_mask; - idx &= dev->mii.reg_num_mask; - addr = (phy_id << 11) | (idx << 6) | MII_WRITE_ | MII_BUSY_; + addr = mii_address(MII_WRITE_, phy_id, idx); ret = __smsc95xx_write_reg(dev, MII_ADDR, addr, in_pm); if (ret < 0) { netdev_warn(dev->net, "Error writing MII_ADDR\n"); @@ -264,34 +263,23 @@ static void __smsc95xx_mdio_write(struct net_device *netdev, int phy_id, static int smsc95xx_mdio_read_nopm(struct usbnet *dev, int idx) { - struct mii_if_info *mii = &dev->mii; + struct smsc95xx_priv *pdata = dev->driver_priv; - return __smsc95xx_mdio_read(dev->net, mii->phy_id, idx, 1); + return __smsc95xx_mdio_read(dev, pdata->phydev->mdio.addr, idx, 1); } static void smsc95xx_mdio_write_nopm(struct usbnet *dev, int idx, int regval) { - struct mii_if_info *mii = &dev->mii; - - __smsc95xx_mdio_write(dev->net, mii->phy_id, idx, regval, 1); -} - -static int smsc95xx_mdio_read(struct net_device *netdev, int phy_id, int idx) -{ - return __smsc95xx_mdio_read(netdev, phy_id, idx, 0); -} + struct smsc95xx_priv *pdata = dev->driver_priv; -static void smsc95xx_mdio_write(struct net_device *netdev, int phy_id, int idx, - int regval) -{ - __smsc95xx_mdio_write(netdev, phy_id, idx, regval, 0); + __smsc95xx_mdio_write(dev, pdata->phydev->mdio.addr, idx, regval, 1); } static int smsc95xx_mdiobus_read(struct mii_bus *bus, int phy_id, int idx) { struct usbnet *dev = bus->priv; - return __smsc95xx_mdio_read(dev->net, phy_id, idx, 0); + return __smsc95xx_mdio_read(dev, phy_id, idx, 0); } static int smsc95xx_mdiobus_write(struct mii_bus *bus, int phy_id, int idx, @@ -299,7 +287,7 @@ static int smsc95xx_mdiobus_write(struct mii_bus *bus, int phy_id, int idx, { struct usbnet *dev = bus->priv; - __smsc95xx_mdio_write(dev->net, phy_id, idx, regval, 0); + __smsc95xx_mdio_write(dev, phy_id, idx, regval, 0); return 0; } @@ -570,8 +558,7 @@ static int smsc95xx_phy_update_flowcontrol(struct usbnet *dev, u8 duplex, static int smsc95xx_link_reset(struct usbnet *dev) { struct smsc95xx_priv *pdata = dev->driver_priv; - struct mii_if_info *mii = &dev->mii; - struct ethtool_cmd ecmd = { .cmd = ETHTOOL_GSET }; + struct ethtool_link_ksettings cmd; unsigned long flags; u16 lcladv, rmtadv; int ret; @@ -592,13 +579,12 @@ static int smsc95xx_link_reset(struct usbnet *dev) return ret; } - mii_check_media(mii, 1, 1); - mii_ethtool_gset(&dev->mii, &ecmd); + phy_ethtool_ksettings_get(pdata->phydev, &cmd); lcladv = phy_read(pdata->phydev, MII_ADVERTISE); rmtadv = phy_read(pdata->phydev, MII_LPA); spin_lock_irqsave(&pdata->mac_cr_lock, flags); - if (ecmd.duplex != DUPLEX_FULL) { + if (cmd.base.duplex != DUPLEX_FULL) { pdata->mac_cr &= ~MAC_CR_FDPX_; pdata->mac_cr |= MAC_CR_RCVOWN_; } else { @@ -611,7 +597,8 @@ static int smsc95xx_link_reset(struct usbnet *dev) if (ret < 0) return ret; - ret = smsc95xx_phy_update_flowcontrol(dev, ecmd.duplex, lcladv, rmtadv); + ret = smsc95xx_phy_update_flowcontrol(dev, cmd.base.duplex, lcladv, + rmtadv); if (ret < 0) netdev_warn(dev->net, "Error updating PHY flow control\n"); @@ -825,7 +812,7 @@ static int smsc95xx_get_link_ksettings(struct net_device *net, struct smsc95xx_priv *pdata = dev->driver_priv; int retval; - retval = usbnet_get_link_ksettings(net, cmd); + retval = phy_ethtool_get_link_ksettings(net, cmd); if (pdata->internal_phy) { cmd->base.eth_tp_mdix = pdata->mdix_ctrl; cmd->base.eth_tp_mdix_ctrl = pdata->mdix_ctrl; @@ -842,13 +829,18 @@ static int smsc95xx_set_link_ksettings(struct net_device *net, if (pdata->mdix_ctrl != mdix_ctrl && pdata->internal_phy) set_mdix_status(net, mdix_ctrl); + return phy_ethtool_set_link_ksettings(net, cmd); +} - return usbnet_set_link_ksettings(net, cmd); +static u32 smsc95xx_get_link(struct net_device *net) +{ + phy_read_status(net->phydev); + return net->phydev->link; } static const struct ethtool_ops smsc95xx_ethtool_ops = { - .get_link = usbnet_get_link, - .nway_reset = usbnet_nway_reset, + .get_link = smsc95xx_get_link, + .nway_reset = phy_ethtool_nway_reset, .get_drvinfo = usbnet_get_drvinfo, .get_msglevel = usbnet_get_msglevel, .set_msglevel = usbnet_set_msglevel, @@ -866,12 +858,10 @@ static const struct ethtool_ops smsc95xx_ethtool_ops = { static int smsc95xx_ioctl(struct net_device *netdev, struct ifreq *rq, int cmd) { - struct usbnet *dev = netdev_priv(netdev); - if (!netif_running(netdev)) return -EINVAL; - return generic_mii_ioctl(&dev->mii, if_mii(rq), cmd, NULL); + return phy_mii_ioctl(netdev->phydev, rq, cmd); } static void smsc95xx_init_mac_address(struct usbnet *dev) @@ -1233,9 +1223,6 @@ static int smsc95xx_bind(struct usbnet *dev, struct usb_interface *intf) pdata->mdiobus->name = "smsc95xx-mdiobus"; pdata->mdiobus->parent = &dev->udev->dev; - dev->mii.phy_id_mask = 0x1f; - dev->mii.reg_num_mask = 0x1f; - snprintf(pdata->mdiobus->id, ARRAY_SIZE(pdata->mdiobus->id), "usb-%03d:%03d", dev->udev->bus->busnum, dev->udev->devnum); @@ -1252,11 +1239,6 @@ static int smsc95xx_bind(struct usbnet *dev, struct usb_interface *intf) goto unregister_mdio; } - dev->mii.dev = dev->net; - dev->mii.mdio_read = smsc95xx_mdio_read; - dev->mii.mdio_write = smsc95xx_mdio_write; - dev->mii.phy_id = pdata->phydev->mdio.addr; - /* detect device revision as different features may be available */ ret = smsc95xx_read_reg(dev, ID_REV, &val); if (ret < 0)