From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-11.2 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,HK_RANDOM_FROM,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 12B29C2D0A3 for ; Sun, 1 Nov 2020 12:52:23 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id A648420719 for ; Sun, 1 Nov 2020 12:52:22 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="bY3KGijK" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726694AbgKAMwV (ORCPT ); Sun, 1 Nov 2020 07:52:21 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38654 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726529AbgKAMwT (ORCPT ); Sun, 1 Nov 2020 07:52:19 -0500 Received: from mail-ed1-x52d.google.com (mail-ed1-x52d.google.com [IPv6:2a00:1450:4864:20::52d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4049CC0617A6; Sun, 1 Nov 2020 04:52:19 -0800 (PST) Received: by mail-ed1-x52d.google.com with SMTP id a71so5992405edf.9; Sun, 01 Nov 2020 04:52:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=CE8O+iXI0LJQAsd2XN/mBfygYe3MHSbV6Xjjfa6myGg=; b=bY3KGijKaZrE+H+4EsPcZmNIRwa4Vjrq7mHtOlk6+J1WA2vOton0rok6K/p04jo65T 3DCp8WpK1mS2PP12IjfvMrBP5+reSuvhg2ynMWm27yaor6SwNNQg/SIkxGK1gZgRCL/f keIZczOna4QAURVs/U6gatYSl1ERiqcUNxBOKw2pDMmNjhwbpFVFg9OCX/b0HVJ7w47Z 2FeU52pcu4rLzEkiIm3PpW/X+9gTnBzyERwJ9dJ54pu2y62zXXc/VhYLRyu0ce+ZFqN1 wN4HpdvfrATBK2+lThQ4Wf4NlMV5LERSffNDEJRu4PTrcGZPLF9GvGoW/P47pfaNo1xH RL/A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=CE8O+iXI0LJQAsd2XN/mBfygYe3MHSbV6Xjjfa6myGg=; b=U6WYiGdP+R9WtyYYaUCUvf+5lp1ZpTiPz3naIBqf0lfv058OpZ/DGVXyhL4AV0ZNM/ fMVUxdqjpM1WX6o5rJN9fcCShjuh4OnsQReMN+2fkVbK+2uR7O+7gkMVA1Dc46SvYTFI oIOsIEGPUvKpHWNJFeXO+5woPRj8XTTmbjivN77w+ev7eedUwaooe5dEvBt3umqGJ2Qh inVyPH9CC1Ru9KUHFStAlvP5hbv07e3gNn+6zqvw3zAXX0EQqNLmyCPO4leIMw9eQsH+ prVFKk6dNUnHiLpkDHoSpfMp033M1nhD4e8PP77b9FcKa6rV658T+petkW+lv1/h5p50 MdsQ== X-Gm-Message-State: AOAM530yrKw4XjDVraJmUofotSDQd1ndvRSGWS3pIbWkFtq0Yj0Hoq7y PrvJ/rik0I7ZTClXQjAHjlk= X-Google-Smtp-Source: ABdhPJzHILBkIMTJrRxPo/2zBo0IQx3U94dogfMJZ3V76uANNJmcFhHb4q8WbExTEKfOoaMnXGixtw== X-Received: by 2002:a05:6402:2292:: with SMTP id cw18mr12199049edb.112.1604235137193; Sun, 01 Nov 2020 04:52:17 -0800 (PST) Received: from yoga-910.localhost ([188.25.2.177]) by smtp.gmail.com with ESMTPSA id c5sm8133603edx.58.2020.11.01.04.52.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Nov 2020 04:52:16 -0800 (PST) From: Ioana Ciornei To: Andrew Lunn , Heiner Kallweit , Russell King , Florian Fainelli , Jakub Kicinski , netdev@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Ioana Ciornei , Alexandru Ardelean , Andre Edich , Antoine Tenart , Baruch Siach , Christophe Leroy , Dan Murphy , Divya Koppera , Hauke Mehrtens , Jerome Brunet , Kavya Sree Kotagiri , Linus Walleij , Marco Felsch , Marek Vasut , Martin Blumenstingl , Mathias Kresin , Maxim Kochetkov , Michael Walle , Neil Armstrong , Nisar Sayed , Oleksij Rempel , Philippe Schenker , Willy Liu , Yuiko Oshino Subject: [PATCH net-next v2 00/19] net: phy: add support for shared interrupts (part 1) Date: Sun, 1 Nov 2020 14:50:55 +0200 Message-Id: <20201101125114.1316879-1-ciorneiioana@gmail.com> X-Mailer: git-send-email 2.28.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Ioana Ciornei This patch set aims to actually add support for shared interrupts in phylib and not only for multi-PHY devices. While we are at it, streamline the interrupt handling in phylib. For a bit of context, at the moment, there are multiple phy_driver ops that deal with this subject: - .config_intr() - Enable/disable the interrupt line. - .ack_interrupt() - Should quiesce any interrupts that may have been fired. It's also used by phylib in conjunction with .config_intr() to clear any pending interrupts after the line was disabled, and before it is going to be enabled. - .did_interrupt() - Intended for multi-PHY devices with a shared IRQ line and used by phylib to discern which PHY from the package was the one that actually fired the interrupt. - .handle_interrupt() - Completely overrides the default interrupt handling logic from phylib. The PHY driver is responsible for checking if any interrupt was fired by the respective PHY and choose accordingly if it's the one that should trigger the link state machine. >From my point of view, the interrupt handling in phylib has become somewhat confusing with all these callbacks that actually read the same PHY register - the interrupt status. A more streamlined approach would be to just move the responsibility to write an interrupt handler to the driver (as any other device driver does) and make .handle_interrupt() the only way to deal with interrupts. Another advantage with this approach would be that phylib would gain support for shared IRQs between different PHY (not just multi-PHY devices), something which at the moment would require extending every PHY driver anyway in order to implement their .did_interrupt() callback and duplicate the same logic as in .ack_interrupt(). The disadvantage of making .did_interrupt() mandatory would be that we are slightly changing the semantics of the phylib API and that would increase confusion instead of reducing it. What I am proposing is the following: - As a first step, make the .ack_interrupt() callback optional so that we do not break any PHY driver amid the transition. - Every PHY driver gains a .handle_interrupt() implementation that, for the most part, would look like below: irq_status = phy_read(phydev, INTR_STATUS); if (irq_status < 0) { phy_error(phydev); return IRQ_NONE; } if (!(irq_status & irq_mask)) return IRQ_NONE; phy_trigger_machine(phydev); return IRQ_HANDLED; - Remove each PHY driver's implementation of the .ack_interrupt() by actually taking care of quiescing any pending interrupts before enabling/after disabling the interrupt line. - Finally, after all drivers have been ported, remove the .ack_interrupt() and .did_interrupt() callbacks from phy_driver. This patch set is part 1 and it addresses the changes needed in phylib and 7 PHY drivers. The rest can be found on my Github branch here: https://github.com/IoanaCiornei/linux/commits/phylib-shared-irq I do not have access to most of these PHY's, therefore I Cc-ed the latest contributors to the individual PHY drivers in order to have access, hopefully, to more regression testing. Changes in v2: - Rework the .handle_interrupt() implementation for each driver so that only the enabled interrupts are taken into account when IRQ_NONE/IRQ_HANDLED it returned. The main idea is so that we avoid falsely blaming a device for triggering an interrupt when this is not the case. The only devices for which I was unable to make this adjustment were the BCM8706, BCM8727, BCMAC131 and BCM5241 since I do not have access to their datasheets. - I also updated the pseudo-code added in the cover-letter so that it's more clear how a .handle_interrupt() callback should look like. Ioana Ciornei (19): net: phy: export phy_error and phy_trigger_machine net: phy: add a shutdown procedure net: phy: make .ack_interrupt() optional net: phy: at803x: implement generic .handle_interrupt() callback net: phy: at803x: remove the use of .ack_interrupt() net: phy: mscc: use phy_trigger_machine() to notify link change net: phy: mscc: implement generic .handle_interrupt() callback net: phy: mscc: remove the use of .ack_interrupt() net: phy: aquantia: implement generic .handle_interrupt() callback net: phy: aquantia: remove the use of .ack_interrupt() net: phy: broadcom: implement generic .handle_interrupt() callback net: phy: broadcom: remove use of ack_interrupt() net: phy: cicada: implement the generic .handle_interrupt() callback net: phy: cicada: remove the use of .ack_interrupt() net: phy: davicom: implement generic .handle_interrupt() calback net: phy: davicom: remove the use of .ack_interrupt() net: phy: add genphy_handle_interrupt_no_ack() net: phy: realtek: implement generic .handle_interrupt() callback net: phy: realtek: remove the use of .ack_interrupt() drivers/net/phy/aquantia_main.c | 59 +++++++++---- drivers/net/phy/at803x.c | 50 +++++++++-- drivers/net/phy/bcm-cygnus.c | 2 +- drivers/net/phy/bcm-phy-lib.c | 49 ++++++++++- drivers/net/phy/bcm-phy-lib.h | 1 + drivers/net/phy/bcm54140.c | 46 +++++++--- drivers/net/phy/bcm63xx.c | 20 +++-- drivers/net/phy/bcm87xx.c | 50 ++++++----- drivers/net/phy/broadcom.c | 70 +++++++++++----- drivers/net/phy/cicada.c | 35 +++++++- drivers/net/phy/davicom.c | 63 ++++++++++---- drivers/net/phy/mscc/mscc_main.c | 70 ++++++++-------- drivers/net/phy/phy.c | 6 +- drivers/net/phy/phy_device.c | 23 ++++- drivers/net/phy/realtek.c | 140 +++++++++++++++++++++++++++---- include/linux/phy.h | 3 + 16 files changed, 529 insertions(+), 158 deletions(-) Cc: Alexandru Ardelean Cc: Andre Edich Cc: Antoine Tenart Cc: Baruch Siach Cc: Christophe Leroy Cc: Dan Murphy Cc: Divya Koppera Cc: Florian Fainelli Cc: Hauke Mehrtens Cc: Heiner Kallweit Cc: Jerome Brunet Cc: Kavya Sree Kotagiri Cc: Linus Walleij Cc: Marco Felsch Cc: Marek Vasut Cc: Martin Blumenstingl Cc: Mathias Kresin Cc: Maxim Kochetkov Cc: Michael Walle Cc: Neil Armstrong Cc: Nisar Sayed Cc: Oleksij Rempel Cc: Philippe Schenker Cc: Willy Liu Cc: Yuiko Oshino -- 2.28.0