Received: by 2002:ac0:a581:0:0:0:0:0 with SMTP id m1-v6csp3557720imm; Mon, 2 Jul 2018 01:01:13 -0700 (PDT) X-Google-Smtp-Source: ADUXVKJoRNy7eXvHB0+OAHxMnMTiX+ZrBxR2WFDawITuNhHVrb1rPOFNL8o1ngxLEYUqEX7MSvSJ X-Received: by 2002:a63:40c7:: with SMTP id n190-v6mr20823229pga.116.1530518473315; Mon, 02 Jul 2018 01:01:13 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1530518473; cv=none; d=google.com; s=arc-20160816; b=OTG8/Rr0VbKgisjNsDKiWrWC07OQspGbl/wNDJfnqsdRGXz1Yb9Z4Eo5J2feWIEQpv SizIcfx6//IWR5dzqi8b7c2zNS7uIh+GSK6amzCV0+R3pcAPhDt9E5ZCkaRvUIKh6oRE DuCt1qCG7ue1BmIKkM/7kS3ERdVDFlNF505lrh+i34pktjfm0cih0UTc1UJlZCgLgFwm nTwEZ2hDGTFS6Eof/RD9dGzKsincliiN/85Qx2GgI4pAmri9rTTdXPxdKATR15oy3YTp 2nBSInqZCOK0pvOBW9F2Sxi1y3sqoK4b3spQ4ZM6yw183kdqMuIlLJ8QUo9/eMGrASpT OLpQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:arc-authentication-results; bh=g7XqHzI5LY+vMxGi+SqLeNdZCBR15CKeBguBRb1uczU=; b=VJLWNKy5cyXl3X8VhZ0ajbiiV/ALlhlAbcFu0xoCHVuUt90xnHEJhmSLrAfEjNZWRs K2ip4qejHaOEgCJ4SFbe9rvo23qC2KdWDNxnVFjacL2RP+d42Ba9yPphDKVVC5D32bQI utcuz1Ngr3ZUksuZL6fpeRSGmYqI7Fy8C7iJd4/t62gggOQ5+nwB0dUddGAVhutPANPa 6JYudUqdnnHFkImvQhDCz8Kxwq4kAmz2VfE/gjZOVCYDTp7YYsAdAMoXM8rLRjUa0GhH UXrCWhJSE7QpDjR/wEeXs/AL5NS3EvkWUC9kaGhgKVRp5YNvTAa3AYfRsorBNRAHKHGA Awgg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f8-v6si16959218plb.381.2018.07.02.01.00.58; Mon, 02 Jul 2018 01:01:13 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S964776AbeGBH6S (ORCPT + 99 others); Mon, 2 Jul 2018 03:58:18 -0400 Received: from mailgw02.mediatek.com ([210.61.82.184]:43457 "EHLO mailgw02.mediatek.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S932988AbeGBH6Q (ORCPT ); Mon, 2 Jul 2018 03:58:16 -0400 X-UUID: 29dae81092f941608214d6e525b22cfc-20180702 Received: from mtkcas08.mediatek.inc [(172.21.101.126)] by mailgw02.mediatek.com (envelope-from ) (mhqrelay.mediatek.com ESMTP with TLS) with ESMTP id 1830051628; Mon, 02 Jul 2018 15:58:14 +0800 Received: from mtkcas07.mediatek.inc (172.21.101.84) by mtkmbs01n1.mediatek.inc (172.21.101.68) with Microsoft SMTP Server (TLS) id 15.0.1210.3; Mon, 2 Jul 2018 15:58:12 +0800 Received: from localhost.localdomain (10.17.3.153) by mtkcas07.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1210.3 via Frontend Transport; Mon, 2 Jul 2018 15:58:10 +0800 From: To: , , , , , , , , , , , CC: , , , , , Subject: [PATCH v3 1/4] PCI: mediatek: fixup mtk_pcie_find_port logical Date: Mon, 2 Jul 2018 15:57:41 +0800 Message-ID: <1530518264-6125-2-git-send-email-honghui.zhang@mediatek.com> X-Mailer: git-send-email 2.6.4 In-Reply-To: <1530518264-6125-1-git-send-email-honghui.zhang@mediatek.com> References: <1530518264-6125-1-git-send-email-honghui.zhang@mediatek.com> MIME-Version: 1.0 Content-Type: text/plain X-MTK: N Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Honghui Zhang The Mediatek's host controller has two slots, each with it's own control registers. The host driver need to identify which slot was connected in order to access the device's configuration space. There's problem for current host driver to find out which slot was connected to for a given EP device. Assuming each slot have connect with one EP device as below: host bridge bus 0 --> __________|_______ | | | | slot 0 slot 1 bus 1 -->| bus 2 --> | | | EP 0 EP 1 During PCI enumeration, system software will scan all the PCI device starting from devfn 0. So it will get the proper port for slot0 and slot1 device when using PCI_SLOT(devfn) for match. But it will get the wrong slot for EP1: The devfn will be start from 0 when scanning EP1 behind slot1, it will get port0 since the PCI_SLOT(EP1) is match for port0's slot value. So the host driver should not using EP's devfn but the slot's devfn(the slot which EP was connected to) for match. This patch fix the mtk_pcie_find_port's logical by using the slot's devfn for match. Signed-off-by: Honghui Zhang Acked-by: Ryder Lee --- drivers/pci/controller/pcie-mediatek.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/drivers/pci/controller/pcie-mediatek.c b/drivers/pci/controller/pcie-mediatek.c index 0baabe3..b43f41d 100644 --- a/drivers/pci/controller/pcie-mediatek.c +++ b/drivers/pci/controller/pcie-mediatek.c @@ -337,11 +337,26 @@ static struct mtk_pcie_port *mtk_pcie_find_port(struct pci_bus *bus, { struct mtk_pcie *pcie = bus->sysdata; struct mtk_pcie_port *port; + struct pci_dev *dev; + struct pci_bus *pbus; - list_for_each_entry(port, &pcie->ports, list) - if (port->slot == PCI_SLOT(devfn)) + list_for_each_entry(port, &pcie->ports, list) { + if (!bus->number && port->slot == PCI_SLOT(devfn)) return port; + if (bus->number) { + pbus = bus; + + while (pbus->number) { + dev = pbus->self; + pbus = dev->bus; + } + + if (port->slot == PCI_SLOT(dev->devfn)) + return port; + } + } + return NULL; } -- 2.6.4