From patchwork Fri Sep 18 05:56:21 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: AceLan Kao X-Patchwork-Id: 1366563 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.ubuntu.com (client-ip=91.189.94.19; helo=huckleberry.canonical.com; envelope-from=kernel-team-bounces@lists.ubuntu.com; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=canonical.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=gCTnHf86; dkim-atps=neutral Received: from huckleberry.canonical.com (huckleberry.canonical.com [91.189.94.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4Bt34K5Px3z9sTC; Fri, 18 Sep 2020 15:56:33 +1000 (AEST) Received: from localhost ([127.0.0.1] helo=huckleberry.canonical.com) by huckleberry.canonical.com with esmtp (Exim 4.86_2) (envelope-from ) id 1kJ9Nl-0003pQ-Tj; Fri, 18 Sep 2020 05:56:29 +0000 Received: from mail-pg1-f194.google.com ([209.85.215.194]) by huckleberry.canonical.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1kJ9Nk-0003on-5n for kernel-team@lists.ubuntu.com; Fri, 18 Sep 2020 05:56:28 +0000 Received: by mail-pg1-f194.google.com with SMTP id d13so2821802pgl.6 for ; Thu, 17 Sep 2020 22:56:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=ezrWB8/GFibJYAIlq8Cc0z7dmhoQjLiQKhxccR83I6Q=; b=gCTnHf86odDi7xB2P3q2uIqbbHIwYymhrDbeJnTbZEikk0WEqgqSeQAlnJcORNjWOB mMWfWSNoKW4G7JclgcZSuB/DGxzb0AfTne8DIi+YkLuFG3Kh+RZok/sRHlNKDtaJrRPV GYBS0BAKbUGqP1uHs/IMAeNVPs8RaURwRmFasjrqQQL8u3WfS0UO+ZgbyESQyPezlZ92 I5cHINfM53l6six2LP4uUKxkr3BX53ZAlir/FB90aOMOsuHncgYdZEVCdOXjgtT2oY3a SOg6M+Dh3D//O8Iv8k74XPKrGseqNGwQeWi4VdFQF8bTIE35jyhGcVyED2nf/YK4pPOX Z/Ng== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=ezrWB8/GFibJYAIlq8Cc0z7dmhoQjLiQKhxccR83I6Q=; b=MCvDECZyibf2GTetDtLkcm4r2J9iEBtzUvfOKN+cMrITuC+42UEaDtM8/rt2fU4y9R 2UFNHoGJvYUeywdsAqG/l/Dco/c7JnSoTt99tU/ZZ4SJgYqjr9B6lMI9YO5cKCZGCrS6 YlovVDY/m3CCu6ytVC/hFUrkI5VUVVKSN0Xw2MNo/+lVvt9X5ls8md1YUoHnwq2MVUG4 PbMhCdbC/nkUi3eskSBii/jfgnS6Fq+5CistkieqTCOUw3SPPilvVKroQoAxuS5/A88F pEoCbV6BbfdcGCnj507VJGJz7NfHhu1wSYMrc+3CQy8wDw8fK46MM1GrRPs9Hyq+NNdM aCvA== X-Gm-Message-State: AOAM533KvZd9xTlcIq+vcmNu/7N3EVKrOsdEI8fR+PrVlmzc/vUKiB5c PyumwG7UuiqJ7uXlL+i+MaRm2OJrA1k= X-Google-Smtp-Source: ABdhPJzTvdh/GpHnF2jU5KQpPOeqyCX/TYLPx69TJwTXqL0Bip5qyEnurukaAgXI6ffGuQ+Xsyh5Ew== X-Received: by 2002:a65:628f:: with SMTP id f15mr9364175pgv.78.1600408586102; Thu, 17 Sep 2020 22:56:26 -0700 (PDT) Received: from localhost (61-220-137-37.HINET-IP.hinet.net. [61.220.137.37]) by smtp.gmail.com with ESMTPSA id n67sm1602919pgn.14.2020.09.17.22.56.25 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 17 Sep 2020 22:56:25 -0700 (PDT) From: AceLan Kao To: kernel-team@lists.ubuntu.com Subject: [PATCH v2 1/1][SRU][F][OEM-B-OSP1] thunderbolt: Retry DROM read once if parsing fails Date: Fri, 18 Sep 2020 13:56:21 +0800 Message-Id: <20200918055621.254184-2-acelan.kao@canonical.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200918055621.254184-1-acelan.kao@canonical.com> References: <20200918055621.254184-1-acelan.kao@canonical.com> MIME-Version: 1.0 Received-SPF: pass client-ip=209.85.215.194; envelope-from=acelan@gmail.com; helo=mail-pg1-f194.google.com X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: "kernel-team" From: Mika Westerberg BugLink: https://bugs.launchpad.net/bugs/1895606 Kai-Heng reported that sometimes DROM parsing of ASUS PA27AC Thunderbolt 3 monitor fails. This makes the driver to fail to add the device so only DisplayPort tunneling is functional. It is not clear what exactly happens but waiting for 100 ms and retrying the read seems to work this around so we do that here. Link: https://bugzilla.kernel.org/show_bug.cgi?id=206493 Reported-by: Kai-Heng Feng Tested-by: Kai-Heng Feng Cc: stable@vger.kernel.org Signed-off-by: Mika Westerberg (bacported from commit f022ff7bf377ca94367be05de61277934d42ea74 linux-next) Signed-off-by: AceLan Kao Acked-by: Colin Ian King Acked-by: Stefan Bader --- drivers/thunderbolt/eeprom.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/drivers/thunderbolt/eeprom.c b/drivers/thunderbolt/eeprom.c index ee5196479854..3f7baf5aa524 100644 --- a/drivers/thunderbolt/eeprom.c +++ b/drivers/thunderbolt/eeprom.c @@ -7,6 +7,7 @@ */ #include +#include #include #include #include "tb.h" @@ -386,8 +387,8 @@ static int tb_drom_parse_entries(struct tb_switch *sw) struct tb_drom_entry_header *entry = (void *) (sw->drom + pos); if (pos + 1 == drom_size || pos + entry->len > drom_size || !entry->len) { - tb_sw_warn(sw, "drom buffer overrun, aborting\n"); - return -EIO; + tb_sw_warn(sw, "DROM buffer overrun\n"); + return -EILSEQ; } switch (entry->type) { @@ -493,7 +494,8 @@ int tb_drom_read(struct tb_switch *sw) u16 size; u32 crc; struct tb_drom_header *header; - int res; + int res, retries = 1; + if (sw->drom) return 0; @@ -581,7 +583,17 @@ int tb_drom_read(struct tb_switch *sw) tb_sw_warn(sw, "drom device_rom_revision %#x unknown\n", header->device_rom_revision); - return tb_drom_parse_entries(sw); + res = tb_drom_parse_entries(sw); + /* If the DROM parsing fails, wait a moment and retry once */ + if (res == -EILSEQ && retries--) { + tb_sw_warn(sw, "parsing DROM failed, retrying\n"); + msleep(100); + res = tb_eeprom_read_n(sw, 0, sw->drom, size); + if (!res) + goto parse; + } + + return res; err: kfree(sw->drom); sw->drom = NULL;