Received: by 2002:a05:7412:8d10:b0:f3:1519:9f41 with SMTP id bj16csp4598675rdb; Tue, 12 Dec 2023 04:25:07 -0800 (PST) X-Google-Smtp-Source: AGHT+IFXvJE9xxLST/BZK0wEqCuL0vFrISVcbzvVyOrl9x2E6cd/Zyvt+YrG8BykOK3jP/gKu4v3 X-Received: by 2002:a05:6358:15c6:b0:170:17eb:3791 with SMTP id t6-20020a05635815c600b0017017eb3791mr8442982rwh.57.1702383906822; Tue, 12 Dec 2023 04:25:06 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1702383906; cv=none; d=google.com; s=arc-20160816; b=fbsezfMOESFY6bQlKnsJfpOu+6akOmh9K1lTv083FKlB26lwNCd8IsAGyEZi5SMnbB uK/RXBSuwJdglHc3luUj02O8i07QhOX4x5I06H2uTx8SH0y28aee5WIUSpl/m3NGL1re 4wNYSd0pCiv7bzBYQnsiGGzOfcRbxclI4NF0WB8tkuwapkMO4AYvQt4C4Oy0RoRPRVja zT6kxY00yYN8nyQvHmC/OydKq62s05kLao3XW5115lHEde1XQnWpHAFni8eH5duoUjf6 4oXyQgTnxiFNuEOu/kQSeesOGvGhUUAE5HfRWqnQFXOnCGFGg5aWS8fHhYk2/S1vJpSK Zk9A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=MPxfA+Fw6SFqhcCBnRUU8oAo7o3oEA1meINhEAtorVQ=; fh=yiOm0c1MZDOAhiHuEKPYtmRWWn7azc8vd2PxSnYsGeY=; b=jEymotsu/Asc2i+d2zq/6ObYNy4bhEECypwtH4qiHoJK97TokTZgFSwumOG2cSHbav m5Woni4mj6DG2iIjtSjyY6j1/PTIG1qr1s7+oQdfd5cIhNUDe/SVWOdqlQwVci0RRCwr mDpps/8/eB/Da8PnWFsruHv1nBmaWoZ+BTJv+h6njcKzRyzx9oGihIhJOrCSTFxLxw3H dzWuQfy6cXN9C9uS/fFyt9Aru8q/3R9p0zWYKcwoHGuYsEO5A1RVGDJuL40QE+pcRHit kgYFuUlzyLpSWGIEVWcSkVr8JYw8t6OXIUrvoVcgHgld2V9JAyfPsUxf1WnmKRpuPZXV M8/g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=OZPe3MDf; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:7 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from snail.vger.email (snail.vger.email. [2620:137:e000::3:7]) by mx.google.com with ESMTPS id b12-20020a63eb4c000000b005be1ee5be76si7532490pgk.373.2023.12.12.04.25.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 12 Dec 2023 04:25:06 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:7 as permitted sender) client-ip=2620:137:e000::3:7; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=OZPe3MDf; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:7 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by snail.vger.email (Postfix) with ESMTP id 9A493804BDD4; Tue, 12 Dec 2023 04:25:04 -0800 (PST) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.11 at snail.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1346466AbjLLMYz (ORCPT + 99 others); Tue, 12 Dec 2023 07:24:55 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38974 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230055AbjLLMYy (ORCPT ); Tue, 12 Dec 2023 07:24:54 -0500 Received: from mgamail.intel.com (mgamail.intel.com [192.55.52.115]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 454D9D0; Tue, 12 Dec 2023 04:25:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1702383900; x=1733919900; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=a+HxPDxjo50u2YJFdQR4IbXPie9mvKr7sOtSvZDcYoc=; b=OZPe3MDfq967N9CNbeaKkcLVXF4U2euvqliZGhMrF3+5Bxtrbu20PF0l 7tvLI4DNJF0FcPg0IGAlFvfOj8STVaD3f61vxe2wmJuyEU6E9gLtv3C6q zPLw0pA31nbm9jk8SHTJbiugHBPhGnE/Kt1ZcDi4iT+UHhJkoECN3F9YQ FoX0eJXY8kABMif2mqb/K3cUdKRTD+rM9DY1l36JHfsnhaBV0hpBwDtxD p+dHQXpmzcuiJsbO+QjpBWMapXBd8r5BqmqkF1ek4H3UMtYMmcWs1TZMF 4C981xuRz46hHVd3T/7bFZgKf4KlcCjW+Um15SBRH8QVVklL8i/2WnEhu w==; X-IronPort-AV: E=McAfee;i="6600,9927,10921"; a="394545808" X-IronPort-AV: E=Sophos;i="6.04,270,1695711600"; d="scan'208";a="394545808" Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Dec 2023 04:24:59 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10921"; a="917269454" X-IronPort-AV: E=Sophos;i="6.04,270,1695711600"; d="scan'208";a="917269454" Received: from unknown (HELO amlin-019-225.igk.intel.com) ([10.102.19.225]) by fmsmga001.fm.intel.com with ESMTP; 12 Dec 2023 04:24:58 -0800 From: Andrii Staikov To: intel-wired-lan@lists.osuosl.org Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Andrii Staikov , Karen Ostrowska , Mateusz Palczewski , Drewek Wojciech , Kitszel Przemyslaw Subject: [PATCH iwl-net v4] i40e: Restore VF MSI-X state during PCI reset Date: Tue, 12 Dec 2023 13:24:52 +0100 Message-Id: <20231212122452.3250691-1-andrii.staikov@intel.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-4.4 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED, SPF_HELO_NONE,SPF_NONE,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (snail.vger.email [0.0.0.0]); Tue, 12 Dec 2023 04:25:04 -0800 (PST) During a PCI FLR the MSI-X Enable flag in the VF PCI MSI-X capability register will be cleared. This can lead to issues when a VF is assigned to a VM because in these cases the VF driver receives no indication of the PF PCI error/reset and additionally it is incapable of restoring the cleared flag in the hypervisor configuration space without fully reinitializing the driver interrupt functionality. Since the VF driver is unable to easily resolve this condition on its own, restore the VF MSI-X flag during the PF PCI reset handling. Fixes: 19b7960b2da1 ("i40e: implement split PCI error reset handler") Co-developed-by: Karen Ostrowska Signed-off-by: Karen Ostrowska Co-developed-by: Mateusz Palczewski Signed-off-by: Mateusz Palczewski Reviewed-by: Drewek Wojciech Reviewed-by: Kitszel Przemyslaw Signed-off-by: Andrii Staikov --- v1 -> v2: Fix signed-off tags https://patchwork.ozlabs.org/project/intel-wired-lan/patch/20231204131041.3369693-1-andrii.staikov@intel.com/ v2 -> v3: use @vf_dev in pci_get_device() instead of NULL and remove unnecessary call https://patchwork.ozlabs.org/project/intel-wired-lan/patch/20231206125127.218350-1-andrii.staikov@intel.com/ v3 -> v4: wrap the added functionality into the CONFIG_PCI_IOV define as this is VF-related functionality --- drivers/net/ethernet/intel/i40e/i40e_main.c | 3 +++ .../ethernet/intel/i40e/i40e_virtchnl_pf.c | 26 +++++++++++++++++++ .../ethernet/intel/i40e/i40e_virtchnl_pf.h | 3 +++ 3 files changed, 32 insertions(+) diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c index 7bb1f64833eb..bbe2d115fb15 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_main.c +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c @@ -16513,6 +16513,9 @@ static void i40e_pci_error_reset_done(struct pci_dev *pdev) return; i40e_reset_and_rebuild(pf, false, false); +#ifdef CONFIG_PCI_IOV + i40e_restore_all_vfs_msi_state(pdev); +#endif /* CONFIG_PCI_IOV */ } /** diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c index 3f99eb198245..d60f5419d6bd 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c +++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c @@ -154,6 +154,32 @@ void i40e_vc_notify_reset(struct i40e_pf *pf) (u8 *)&pfe, sizeof(struct virtchnl_pf_event)); } +#ifdef CONFIG_PCI_IOV +void i40e_restore_all_vfs_msi_state(struct pci_dev *pdev) +{ + u16 vf_id; + u16 pos; + + /* Continue only if this is a PF */ + if (!pdev->is_physfn) + return; + + if (!pci_num_vf(pdev)) + return; + + pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_SRIOV); + if (pos) { + struct pci_dev *vf_dev = NULL; + + pci_read_config_word(pdev, pos + PCI_SRIOV_VF_DID, &vf_id); + while ((vf_dev = pci_get_device(pdev->vendor, vf_id, vf_dev))) { + if (vf_dev->is_virtfn && vf_dev->physfn == pdev) + pci_restore_msi_state(vf_dev); + } + } +} +#endif /* CONFIG_PCI_IOV */ + /** * i40e_vc_notify_vf_reset * @vf: pointer to the VF structure diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.h b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.h index 2ee0f8a23248..5fd607c0de0a 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.h +++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.h @@ -137,6 +137,9 @@ int i40e_ndo_set_vf_spoofchk(struct net_device *netdev, int vf_id, bool enable); void i40e_vc_notify_link_state(struct i40e_pf *pf); void i40e_vc_notify_reset(struct i40e_pf *pf); +#ifdef CONFIG_PCI_IOV +void i40e_restore_all_vfs_msi_state(struct pci_dev *pdev); +#endif /* CONFIG_PCI_IOV */ int i40e_get_vf_stats(struct net_device *netdev, int vf_id, struct ifla_vf_stats *vf_stats); -- 2.25.1