From patchwork Sun Sep 2 21:52:16 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yinghai Lu X-Patchwork-Id: 1397991 Return-Path: X-Original-To: patchwork-linux-acpi@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork2.kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by patchwork2.kernel.org (Postfix) with ESMTP id 1A57FDF283 for ; Sun, 2 Sep 2012 21:59:49 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755602Ab2IBVyR (ORCPT ); Sun, 2 Sep 2012 17:54:17 -0400 Received: from rcsinet15.oracle.com ([148.87.113.117]:23545 "EHLO rcsinet15.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755861Ab2IBVwl (ORCPT ); Sun, 2 Sep 2012 17:52:41 -0400 Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237]) by rcsinet15.oracle.com (Sentrion-MTA-4.2.2/Sentrion-MTA-4.2.2) with ESMTP id q82LqVnn028798 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sun, 2 Sep 2012 21:52:32 GMT Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id q82LqUDw009463 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Sun, 2 Sep 2012 21:52:31 GMT Received: from abhmt105.oracle.com (abhmt105.oracle.com [141.146.116.57]) by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id q82LqU4O029424; Sun, 2 Sep 2012 16:52:30 -0500 Received: from linux-siqj.site (/75.55.221.75) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Sun, 02 Sep 2012 14:52:30 -0700 From: Yinghai Lu To: Bjorn Helgaas , Taku Izumi , Jiang Liu , x86 Cc: Andrew Morton , Linus Torvalds , Greg Kroah-Hartman , linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, linux-acpi@vger.kernel.org, Yinghai Lu , Randy Dunlap Subject: [PATCH part3 06/11] PCI, sysfs: Create rescan_bridge under /sys/.../pci/devices/... for pci bridges Date: Sun, 2 Sep 2012 14:52:16 -0700 Message-Id: <1346622741-30799-7-git-send-email-yinghai@kernel.org> X-Mailer: git-send-email 1.7.7 In-Reply-To: <1346622741-30799-1-git-send-email-yinghai@kernel.org> References: <1346622741-30799-1-git-send-email-yinghai@kernel.org> X-Source-IP: acsinet21.oracle.com [141.146.126.237] Sender: linux-acpi-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-acpi@vger.kernel.org Current code will create rescan for every pci device under parent bus. that is not right. The device is already there, there is no reason to rescan it. We could have rescan for pci bridges. less confusing. Need to move rescan attr to pci dev bridge attribute group. And we should rescan bridge's secondary bus instead of primary bus. -v3: Use device_type for pci dev. -v4: Seperate pci device type change out -v5: add rescan_bridge for bridge type, and still keep the old rescan. may remove the old rescan later. Signed-off-by: Yinghai Lu Cc: Randy Dunlap Cc: Greg Kroah-Hartman --- Documentation/ABI/testing/sysfs-bus-pci | 10 ++++++++++ drivers/pci/pci-sysfs.c | 24 ++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 0 deletions(-) diff --git a/Documentation/ABI/testing/sysfs-bus-pci b/Documentation/ABI/testing/sysfs-bus-pci index 34f5110..95f0f37 100644 --- a/Documentation/ABI/testing/sysfs-bus-pci +++ b/Documentation/ABI/testing/sysfs-bus-pci @@ -111,6 +111,16 @@ Description: from this part of the device tree. Depends on CONFIG_HOTPLUG. +What: /sys/bus/pci/devices/.../rescan_bridge +Date: February 2012 +Contact: Linux PCI developers +Description: + Writing a non-zero value to this attribute will + force a rescan of the bridge and all child buses, and + re-discover devices removed earlier from this part of + the device tree. + Depends on CONFIG_HOTPLUG. + What: /sys/bus/pci/devices/.../reset Date: July 2009 Contact: Michael S. Tsirkin diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c index e37a0e0..2100c04 100644 --- a/drivers/pci/pci-sysfs.c +++ b/drivers/pci/pci-sysfs.c @@ -327,6 +327,27 @@ dev_rescan_store(struct device *dev, struct device_attribute *attr, return count; } +static ssize_t +dev_bridge_rescan_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + unsigned long val; + struct pci_dev *pdev = to_pci_dev(dev); + + if (kstrtoul(buf, 0, &val) < 0) + return -EINVAL; + + if (val) { + mutex_lock(&pci_remove_rescan_mutex); + pci_rescan_bus(pdev->subordinate); + mutex_unlock(&pci_remove_rescan_mutex); + } + return count; +} + +static struct device_attribute pci_dev_bridge_rescan_attr = + __ATTR(rescan_bridge, (S_IWUSR|S_IWGRP), NULL, dev_bridge_rescan_store); + static void remove_callback(struct device *dev) { struct pci_dev *pdev = to_pci_dev(dev); @@ -1371,6 +1392,9 @@ static int __init pci_sysfs_init(void) late_initcall(pci_sysfs_init); static struct attribute *pci_dev_bridge_attrs[] = { +#ifdef CONFIG_HOTPLUG + &pci_dev_bridge_rescan_attr.attr, +#endif NULL, };