From patchwork Mon Jun 29 13:11:23 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andre Edich X-Patchwork-Id: 1319072 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=WLEbtxLk; dkim=pass (1024-bit key; unprotected) header.d=microchiptechnology.onmicrosoft.com header.i=@microchiptechnology.onmicrosoft.com header.a=rsa-sha256 header.s=selector2-microchiptechnology-onmicrosoft-com header.b=pto1RMAb; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by ozlabs.org (Postfix) with ESMTP id 49wd1Y3PRyz9sPF for ; Tue, 30 Jun 2020 05:32:49 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730925AbgF2Tcr (ORCPT ); Mon, 29 Jun 2020 15:32:47 -0400 Received: from esa4.microchip.iphmx.com ([68.232.154.123]:52988 "EHLO esa4.microchip.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732959AbgF2Tc1 (ORCPT ); Mon, 29 Jun 2020 15:32:27 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1593459146; x=1624995146; h=from:to:cc:subject:date:message-id:content-id: content-transfer-encoding:mime-version; bh=C3Ya8bTFqqzU2Fo0u4EI3pJuxu+j01mfFN/aq6BzCi8=; b=WLEbtxLk6AfMAzPIfQ2v4ltDWhzMzAvLVt2XljDESIB64xu2NUtgNG6M do/nMGTD02NE/zYzNtuKz0hZVt6BanmymPQFWKtJKDD+HbynAwgIfIZNA BV9T2khjkEc9SuNA47u+ZZdw5E7UI6/srjgq6IrkbIcxLjQQq15WKkD5L gk/0If1wgZBrQqxg1qgH67ZW1RgkjbwqgDOlS1WD0sOCD2Z5F33CelqXX /EL7H1TCakrIbik0QYRgUXNu3OKh5F8uhPtdcWqZToJtM+se4qfWKzhvY iAHRddYxtxb15ULLo9Vd4zFKVse01+93lG+w1exdvoyHJzuPLGtpPgZl2 w==; IronPort-SDR: MlYKJUuNS4Y6PL7H4pnML4kKTHH2i2fTjCnMykd9VjW3eSFmUXDNtk9Pfoi0NhO1zWt+1wPcvJ dgfWaWI/sIc/9OeyhheHqRSLthu3zm5nGI4hSpHe+YAJjQ7P+2V8XgmQtVtiehUrCsW7FmYLbt MNCDOVDRAfkO1DB3sMLO58+o4O9y4wG+ozXcRSr+rXULSjU+u3ByK5qiaehi8AGhq7kGNB8RKH J9o7AvzK+eUFXl/BPx/ohGyn2dqxhcTzh9SwqnF7YJzGtee6ELXVRx2zgDVY3+xziAQnULZpIz /PQ= X-IronPort-AV: E=Sophos;i="5.75,294,1589266800"; d="scan'208";a="78141675" Received: from smtpout.microchip.com (HELO email.microchip.com) ([198.175.253.82]) by esa4.microchip.iphmx.com with ESMTP/TLS/AES256-SHA256; 29 Jun 2020 06:11:27 -0700 Received: from chn-vm-ex01.mchp-main.com (10.10.85.143) by chn-vm-ex04.mchp-main.com (10.10.85.152) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1979.3; Mon, 29 Jun 2020 06:11:27 -0700 Received: from NAM12-BN8-obe.outbound.protection.outlook.com (10.10.215.89) by email.microchip.com (10.10.87.71) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1979.3 via Frontend Transport; Mon, 29 Jun 2020 06:11:10 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=WRjjLgTp4ht7yqi8YCa3CjmUWVEDQFjnRp+a/hz4181rfU9EQcLD+RE3Zox+SUL5erlwIB7KCDj81rYc+SMLu27OObJrb349lBYkV4BdtQfrr57DlQw+HFEruHA5BWnywQHvUpfaF/wfAjCRm4kIXlYQJDhhswETTNB07+qITy5nB7tZ2Q1V4FO8WSZsedz4wvO1LPvOIuJA+LHYn9tBu3IDIC2pBPf1jcbxbwnlkqg3x26o/NHSX5Q1Qy120Xi8DPQMK7F36Dt/kV9NWgkg4CHDFdTiLiLajN/ksVdp40lIZQj0Anno7vfYSBqcvHERGZBsO3ugTJGM+DE4N/ZVqw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=C3Ya8bTFqqzU2Fo0u4EI3pJuxu+j01mfFN/aq6BzCi8=; b=YrTwl5tz5rkqRTp3aYgrl/FXHg4gFUqptujwUIPKK6T+IF1MC36iqQecCFFWDWDIu7MpZHSscCtoIOMJ2CNKYLdHPAlm44/UqHaTXg6Ss5RGiB3S46dpOi20OucA+zejJ0Y0XlrM2Cefn6YAlX0jgsG3i8E9NnhywgajAuvyWg0xrnYWtXl1WeA70nOSViEatsDPEGTyFvK+xJGE9vKdheNG9b+Tt5zZDvLYCN7Edefi+vDT9le2+jd0z0b6q0Qw2T10gswMTHndpq6Ov+FZveFigIQkHWUpI82JKTEqH3TTcN5X1eJ/deHVqKibcbT9Bbkn7iPVTCk8V3liJggF2g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=microchip.com; dmarc=pass action=none header.from=microchip.com; dkim=pass header.d=microchip.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=microchiptechnology.onmicrosoft.com; s=selector2-microchiptechnology-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=C3Ya8bTFqqzU2Fo0u4EI3pJuxu+j01mfFN/aq6BzCi8=; b=pto1RMAbFvRjrgJCyABAa15kyzNg93HhNID5lxwGewvyCwPcukki+6blnz4hCyQYVR7UBBtyV+KN3I7mTFENER6JjR3QaBBRPTWmgRNbg4W2wpFRFhyONGaAV494miI3FwnlJSIy6Eu919P32NadtIFxRiqscNtHVURX8tRo33k= Received: from BY5PR11MB3927.namprd11.prod.outlook.com (2603:10b6:a03:186::21) by BY5PR11MB4434.namprd11.prod.outlook.com (2603:10b6:a03:1c2::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3131.20; Mon, 29 Jun 2020 13:11:23 +0000 Received: from BY5PR11MB3927.namprd11.prod.outlook.com ([fe80::5993:d0ac:9849:d311]) by BY5PR11MB3927.namprd11.prod.outlook.com ([fe80::5993:d0ac:9849:d311%7]) with mapi id 15.20.3131.027; Mon, 29 Jun 2020 13:11:23 +0000 From: To: , , CC: Subject: [PATCH net-next 3/8] smsc95xx: add PAL support to use external PHY drivers Thread-Topic: [PATCH net-next 3/8] smsc95xx: add PAL support to use external PHY drivers Thread-Index: AQHWThbJp1OL/7i7s0a154kEDSCNvQ== Date: Mon, 29 Jun 2020 13:11:23 +0000 Message-ID: <26c4eee749db5a5430fa9df9c12651dd34bdbaa6.camel@microchip.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: user-agent: Evolution 3.36.3 authentication-results: vger.kernel.org; dkim=none (message not signed) header.d=none;vger.kernel.org; dmarc=none action=none header.from=microchip.com; x-originating-ip: [93.202.178.57] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 0c1220ba-05a8-46a8-bc93-08d81c2dec6a x-ms-traffictypediagnostic: BY5PR11MB4434: x-ms-exchange-transport-forked: True x-microsoft-antispam-prvs: x-bypassexternaltag: True x-ms-oob-tlc-oobclassifiers: OLM:7691; x-forefront-prvs: 044968D9E1 x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: +lH6no6czL9B4+dI1YwXxJB5oyDbFAMIRumFKNWyQ7o78SzNFuxCvdOYNuVOZB4fzZqPdJbh+qoN/AcbmecQJ9DRd0n/c2Lbfz5Otjialg2hePEUmflZBXRGluVsPCMs4yPdu4UsGsi+rcwHklkUH85wtgL53VKgl4KECfOhCnvUZG6CGe4wjl7j0AQDcEm5MPOAs1+kSBICbeAYioL9tsvCoIiDGR6+JAvttVi9ZWtl8J7310qYDEpXohZ8eZYnkBJtfXbfo6eCPf0auODO1w6jTdDFA9HdM+FUQDj8fOmmvUxd/wbalsSQv9Vy8Qg3 x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:BY5PR11MB3927.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFTY:;SFS:(396003)(366004)(136003)(39860400002)(346002)(376002)(83380400001)(6512007)(8676002)(8936002)(5660300002)(36756003)(110136005)(4326008)(316002)(2906002)(6486002)(107886003)(66946007)(6506007)(2616005)(76116006)(91956017)(66476007)(66556008)(64756008)(66446008)(186003)(26005)(478600001)(86362001)(71200400001);DIR:OUT;SFP:1101; x-ms-exchange-antispam-messagedata: SSLAlyhOA6ma/q2+zRaTEiwtv9/5QQfrIQCEltepp56E4NWgUW6IKgCCAW2H3GWOvsCLjLzatYOSPHVjk66lhnaqFXkHUnMbqGqpfbWvP6KU4UEY9yqqKNzq9rVyJSt0fJO/qiOYFlD/U728dIPJbeK9rnrM/KtW9hjfvQaEoMmcW/Y6KsGR2bpo4jidEVEcmK6/CU+1KdEBZ3v4c29Zer8UYikDyXEttFBhPeeMmoke2GiyM1KLqTz2Ic0OJdI1hiKo+j7LLoTTAbAaJ7KgSVYa2qHzT6Va89jnED5BscCIT18nNWg2sL5Rk3SPnmq35g1lAbXfxE3ratzfAfp/FH3Se7Pq2Qos8QspL9WLCfZps7K5ZXnAQ7tk/TW/8PhaBVGLVFuGFEYSuvnXhGnI7ahlVZ55zC92zTkOBiqxfqVvmEpY5fbocmut3+MZWQ9zbUNsbfs2wQNQ2+7gcgW66QaNqM8Pb+1dLzyGWGsCKW8= Content-ID: MIME-Version: 1.0 X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: BY5PR11MB3927.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 0c1220ba-05a8-46a8-bc93-08d81c2dec6a X-MS-Exchange-CrossTenant-originalarrivaltime: 29 Jun 2020 13:11:23.6910 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 3f4057f3-b418-4d4e-ba84-d55b4e897d88 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: WGS8/qx9HPNt/HkXD2F3ikanc0DuAaw7TSKRBm4zAov2naFhk7ZV0jkFtuUcOdkpjuXCFw8nkH5LfgChvsFm7/9c2PZHU9Uk6eIG2cPXLGA= X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY5PR11MB4434 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 --- drivers/net/usb/smsc95xx.c | 165 +++++++++++++++++++++++++------------ 1 file changed, 112 insertions(+), 53 deletions(-) static int __must_check smsc95xx_wait_eeprom(struct usbnet *dev) { unsigned long start_time = jiffies; @@ -972,51 +992,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 = (struct smsc95xx_priv *)(dev- >data[0]); @@ -1198,12 +1173,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; @@ -1231,6 +1200,43 @@ static int smsc95xx_reset(struct usbnet *dev) return 0; } +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 = (struct smsc95xx_priv *)(dev- >data[0]); + struct net_device *net = dev->net; + int ret; + + ret = smsc95xx_reset(dev); + if (ret < 0) + return ret; + + /* attach the mac to the phy */ + 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); + mii_nway_restart(&dev->mii); + return 0; +} + +static int smsc95xx_disconnect_phy(struct usbnet *dev) +{ + phy_stop(dev->net->phydev); + phy_disconnect(dev->net->phydev); + return 0; +} + static const struct net_device_ops smsc95xx_netdev_ops = { .ndo_open = usbnet_open, .ndo_stop = usbnet_stop, @@ -1290,10 +1296,53 @@ 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; + + /* check for internal phy */ + if (!(val & HW_CFG_PSEL_)) + 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"; + + 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; @@ -1321,6 +1370,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,6 +1387,8 @@ static void smsc95xx_unbind(struct usbnet *dev, struct usb_interface *intf) if (pdata) { 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); pdata = NULL; @@ -1893,6 +1950,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; } @@ -2098,7 +2156,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, diff --git a/drivers/net/usb/smsc95xx.c b/drivers/net/usb/smsc95xx.c index bb4ccbda031a..fbb80a7aef32 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,8 @@ struct smsc95xx_priv { bool link_ok; struct delayed_work carrier_check; struct usbnet *dev; + struct mii_bus *mdiobus; + struct phy_device *phydev; }; static bool turbo_mode = true; @@ -284,6 +288,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; +} +