Received: by 2002:a25:ad19:0:0:0:0:0 with SMTP id y25csp3162852ybi; Fri, 5 Jul 2019 03:00:19 -0700 (PDT) X-Google-Smtp-Source: APXvYqy2V9Vl3g13cTQ6bYJGq9vL+VpNazfgilG6JY5S2I/Vo9SI5hgQaaPaXFfsMrSqnGB6/Fd5 X-Received: by 2002:a17:90a:35e6:: with SMTP id r93mr4395722pjb.20.1562320819111; Fri, 05 Jul 2019 03:00:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1562320819; cv=none; d=google.com; s=arc-20160816; b=N4PQ70WZXTobEUaZ5IflrDoN1SAOt2bJr6oKZiPg0NLb69aw4lDjKd39x6I+5KR8ph Ulo06t5OVQD+K86F61r+BV380KRJLFGNTILiZJjdpi1jY2lu8QT8M8Gba7ucNgrOEcjB Mmat2iQjzVhGKhrhJtEHoiIW7FZojRHl142uU31s5T8wVynDU/n1xUl1NP9LVrKHAo6i cqvQ+Mj72uAIsrqnr9e8I+0g85q+kSloh46P6tBbel2kmhMIOLCvWVubL/cmTjPpUL6x MlamvVr2cV9TgZFdJox3RFwer/f3C2OEhLXeYCGIRIdqzEdpIpf1D2Xvt3qY5rN3IAQB Q8pQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=+bVitBtKla3NxRGNYJ7hbI+QlHX/WFUWPBalR+/jL+A=; b=KhlE/bCRELGlLPy65EN9Lf+BK90uZt0DF5mOqDNfqlmee+n41/MaUp6FbNHaaOa2XI 1VJvAy0H+T8TP12QBt6LNRpSegF59ZHFCw785OmbJHvKPOM/Jsu3IwDTdQ8KUDm1ilIf W+SdhB3uZJX1pYCWVrzBR8gb3/u7up3HEVZBkPnbDamkEqRVPABvY3ygpVLbhPD+2SbF OJvbadqCS9s5ZLo0b1zlU8e21r/4Ey+wHKZUnQ7Do/+9Hz5m2eoR4sagixEp4feJ/A5P k8hyngw4kLZmRpQDiJTPvppJdebXdK5s3GGAcc4a2H8ikDLEWvMx2ki21ak79zBvCrZ5 Lsrw== 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id e6si8882131pfl.254.2019.07.05.03.00.04; Fri, 05 Jul 2019 03:00:19 -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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728541AbfGEJ7I (ORCPT + 99 others); Fri, 5 Jul 2019 05:59:08 -0400 Received: from mga07.intel.com ([134.134.136.100]:55406 "EHLO mga07.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728407AbfGEJ6G (ORCPT ); Fri, 5 Jul 2019 05:58:06 -0400 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 05 Jul 2019 02:58:04 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.63,454,1557212400"; d="scan'208";a="363141328" Received: from black.fi.intel.com ([10.237.72.28]) by fmsmga005.fm.intel.com with ESMTP; 05 Jul 2019 02:58:01 -0700 Received: by black.fi.intel.com (Postfix, from userid 1001) id F36B13B8; Fri, 5 Jul 2019 12:58:00 +0300 (EEST) From: Mika Westerberg To: linux-kernel@vger.kernel.org Cc: Andreas Noever , Michael Jamet , Yehezkel Bernat , "Rafael J . Wysocki" , Len Brown , Lukas Wunner , Mario.Limonciello@dell.com, Anthony Wong , Mika Westerberg , linux-acpi@vger.kernel.org Subject: [PATCH 4/8] thunderbolt: Do not fail adding switch if some port is not implemented Date: Fri, 5 Jul 2019 12:57:56 +0300 Message-Id: <20190705095800.43534-5-mika.westerberg@linux.intel.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190705095800.43534-1-mika.westerberg@linux.intel.com> References: <20190705095800.43534-1-mika.westerberg@linux.intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org There are two ways to mark a port as unimplemented. Typical way is to return port type as TB_TYPE_INACTIVE when its config space is read. Alternatively if the port is not physically present (such as ports 10 and 11 in ICL) reading from port config space returns TB_CFG_ERROR_INVALID_CONFIG_SPACE instead. Currently the driver bails out from adding the switch if it receives any error during port inititialization which is wrong. Handle this properly and just leave the port as TB_TYPE_INACTIVE before continuing to the next port. Signed-off-by: Mika Westerberg --- drivers/thunderbolt/ctl.c | 23 +++++++++++++++++++---- drivers/thunderbolt/switch.c | 8 +++++++- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/drivers/thunderbolt/ctl.c b/drivers/thunderbolt/ctl.c index 2427d73be731..2ec1af8f7968 100644 --- a/drivers/thunderbolt/ctl.c +++ b/drivers/thunderbolt/ctl.c @@ -930,6 +930,23 @@ struct tb_cfg_result tb_cfg_write_raw(struct tb_ctl *ctl, const void *buffer, return res; } +static int tb_cfg_get_error(struct tb_ctl *ctl, enum tb_cfg_space space, + const struct tb_cfg_result *res) +{ + /* + * For unimplemented ports access to port config space may return + * TB_CFG_ERROR_INVALID_CONFIG_SPACE (alternatively their type is + * set to TB_TYPE_INACTIVE). In the former case return -ENODEV so + * that the caller can mark the port as disabled. + */ + if (space == TB_CFG_PORT && + res->tb_error == TB_CFG_ERROR_INVALID_CONFIG_SPACE) + return -ENODEV; + + tb_cfg_print_error(ctl, res); + return -EIO; +} + int tb_cfg_read(struct tb_ctl *ctl, void *buffer, u64 route, u32 port, enum tb_cfg_space space, u32 offset, u32 length) { @@ -942,8 +959,7 @@ int tb_cfg_read(struct tb_ctl *ctl, void *buffer, u64 route, u32 port, case 1: /* Thunderbolt error, tb_error holds the actual number */ - tb_cfg_print_error(ctl, &res); - return -EIO; + return tb_cfg_get_error(ctl, space, &res); case -ETIMEDOUT: tb_ctl_warn(ctl, "timeout reading config space %u from %#x\n", @@ -969,8 +985,7 @@ int tb_cfg_write(struct tb_ctl *ctl, const void *buffer, u64 route, u32 port, case 1: /* Thunderbolt error, tb_error holds the actual number */ - tb_cfg_print_error(ctl, &res); - return -EIO; + return tb_cfg_get_error(ctl, space, &res); case -ETIMEDOUT: tb_ctl_warn(ctl, "timeout writing config space %u to %#x\n", diff --git a/drivers/thunderbolt/switch.c b/drivers/thunderbolt/switch.c index 10b56c66fec3..eac62ff1b85c 100644 --- a/drivers/thunderbolt/switch.c +++ b/drivers/thunderbolt/switch.c @@ -611,8 +611,14 @@ static int tb_init_port(struct tb_port *port) int cap; res = tb_port_read(port, &port->config, TB_CFG_PORT, 0, 8); - if (res) + if (res) { + if (res == -ENODEV) { + tb_dbg(port->sw->tb, " Port %d: not implemented\n", + port->port); + return 0; + } return res; + } /* Port 0 is the switch itself and has no PHY. */ if (port->config.type == TB_TYPE_PORT && port->port != 0) { -- 2.20.1