Received: by 2002:a05:6a10:f347:0:0:0:0 with SMTP id d7csp5469546pxu; Tue, 22 Dec 2020 19:07:07 -0800 (PST) X-Google-Smtp-Source: ABdhPJxYvYCl4t3TEsvhjbzEmk2ZGFwrI6bRHVkLec1riZaMmTDZqvMZLjCa0lJsuvF0KumgVqLc X-Received: by 2002:a50:b905:: with SMTP id m5mr22499116ede.292.1608692827498; Tue, 22 Dec 2020 19:07:07 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1608692827; cv=none; d=google.com; s=arc-20160816; b=T9YA8gvznlil3imorxrHOOFuiIvgzFCrtKL9uI1LBiF5krelvwk1m0wK5PyEXTdtzP Bbl5ab/9gVbJwlRVsuMU/Xa9AHOFDw375cvHZauR0aSBV37DJm03FS8Jy/oElIlYf9O7 Ri1tGFqfCk4wpZu92g9l9kb7vDVpzw/0RUc3GCDotcxMrdw3RmERdwPESbKkyzmne6gz olm7PkaDR/mONvjqvIBRMKFBC0Kw1Qlo4gUhEh3czaxiEze6bOhLAoXI+pDwJYInMu/N qMoDHzblaN8X4TGojinY6yOz0kwZV1thxTWUSFefLE387kQKXSxGt6IjrNWheKxY8hXK 1KdQ== 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 :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=WbFUpn/PJB1NR8AP9l7hqU6igAfHSa+lEA7/8ldcrzg=; b=tycWmXiXLwVscJK+T0lrkw5SZ5m6okbvSgW819S8brxw0P9TN4UJzbIjoDDegNf8CC Erx6qYzY98BahYsbzWenJ4KGB26qmyXiUr4gq84FETXDF5xjC83KykU2TI/ZRopncALe t1p9BAB74YHa7pNPwWbyDxl8lC0HSyN5bOcxFfZF7njmeZLwTRsRcHcEttJQPCWzo40Y lvicZfzLG348hZ4/1zpPcC416kEdJ+uIttm8/X+3PC6IzMbukL1CaJ8lgg9pQ3MKbdmI C6tuQffNAR0Bo7zV9dKUyMV9Y/xviw3mCcjQ3g+7Vf9p9KApjxLUC3PcgNvMYeDjlEIU BeJg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=nqB4lNLZ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id j23si10816554ejb.158.2020.12.22.19.06.45; Tue, 22 Dec 2020 19:07:07 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=nqB4lNLZ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731303AbgLWDFS (ORCPT + 99 others); Tue, 22 Dec 2020 22:05:18 -0500 Received: from mail.kernel.org ([198.145.29.99]:45452 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728521AbgLWCTL (ORCPT ); Tue, 22 Dec 2020 21:19:11 -0500 Received: by mail.kernel.org (Postfix) with ESMTPSA id 4E1E823333; Wed, 23 Dec 2020 02:18:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1608689910; bh=8S4+xlE7pBFJj77/azyqVKfA3Qa2ZAaGnJZsbWx11gc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=nqB4lNLZQrC+vPfzwNwa9cSDJqzVKDsiqRdX5WyxuyL8GirH9/esf3gKfsCx3yHNM 4zMRn4LJ4CktkaHBXeVyNqC9Vru/zZ+tNBMF8wCCDK7bQPJdXcqnPxaWqNx/9s96ab XhofkmfOfjNnfILl2orPLjjTpe89ElzAjqKj/k/s2J1uZQR1xShHUZ/8anR2QWMj4P YXZZRMNyAaNfDYP4dL5XaOgt5M5ABFJF1hFlJIOm2nwa/MKs4V6ABZ3jWOdnAbgtOt DPmilJeClvA6CgMpb/Ucbv+I0SXbQuMamiUtFWYrffvgg3UrLu6ZtaKG1wFQQN0AuV q+rLIW7cSGpPQ== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: akshatzen , Jack Wang , Viswas G , Ruksar Devadi , Radha Ramachandran , "Martin K . Petersen" , Sasha Levin , linux-scsi@vger.kernel.org Subject: [PATCH AUTOSEL 5.4 012/130] scsi: pm80xx: Avoid busywait in FW ready check Date: Tue, 22 Dec 2020 21:16:15 -0500 Message-Id: <20201223021813.2791612-12-sashal@kernel.org> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20201223021813.2791612-1-sashal@kernel.org> References: <20201223021813.2791612-1-sashal@kernel.org> MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: akshatzen [ Upstream commit 48cd6b38eb4f2874f091c4776ea1c26e7e4f967e ] In function check_fw_ready() we busy wait using udelay. The CPU is not released and we see need_resched failures. Busy waiting is not necessary since we are in process context and we can sleep instead. Replace udelay with msleep of 20 ms intervals while waiting for firmware to become ready. It has been verified that check_fw_ready is not being used in interrupt context anywhere, hence it is safe to make this change. Link: https://lore.kernel.org/r/20201102165528.26510-4-Viswas.G@microchip.com.com Acked-by: Jack Wang Signed-off-by: akshatzen Signed-off-by: Viswas G Signed-off-by: Ruksar Devadi Signed-off-by: Radha Ramachandran Signed-off-by: Martin K. Petersen Signed-off-by: Sasha Levin --- drivers/scsi/pm8001/pm80xx_hwi.c | 21 +++++++++++---------- drivers/scsi/pm8001/pm80xx_hwi.h | 6 ++++++ 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/drivers/scsi/pm8001/pm80xx_hwi.c b/drivers/scsi/pm8001/pm80xx_hwi.c index 8756bbf2c3896..a3c58cf2d68c9 100644 --- a/drivers/scsi/pm8001/pm80xx_hwi.c +++ b/drivers/scsi/pm8001/pm80xx_hwi.c @@ -703,6 +703,7 @@ static int mpi_init_check(struct pm8001_hba_info *pm8001_ha) /** * check_fw_ready - The LLDD check if the FW is ready, if not, return error. + * This function sleeps hence it must not be used in atomic context. * @pm8001_ha: our hba card information */ static int check_fw_ready(struct pm8001_hba_info *pm8001_ha) @@ -713,16 +714,16 @@ static int check_fw_ready(struct pm8001_hba_info *pm8001_ha) int ret = 0; /* reset / PCIe ready */ - max_wait_time = max_wait_count = 100 * 1000; /* 100 milli sec */ + max_wait_time = max_wait_count = 5; /* 100 milli sec */ do { - udelay(1); + msleep(FW_READY_INTERVAL); value = pm8001_cr32(pm8001_ha, 0, MSGU_SCRATCH_PAD_1); } while ((value == 0xFFFFFFFF) && (--max_wait_count)); /* check ila status */ - max_wait_time = max_wait_count = 1000 * 1000; /* 1000 milli sec */ + max_wait_time = max_wait_count = 50; /* 1000 milli sec */ do { - udelay(1); + msleep(FW_READY_INTERVAL); value = pm8001_cr32(pm8001_ha, 0, MSGU_SCRATCH_PAD_1); } while (((value & SCRATCH_PAD_ILA_READY) != SCRATCH_PAD_ILA_READY) && (--max_wait_count)); @@ -735,9 +736,9 @@ static int check_fw_ready(struct pm8001_hba_info *pm8001_ha) } /* check RAAE status */ - max_wait_time = max_wait_count = 1800 * 1000; /* 1800 milli sec */ + max_wait_time = max_wait_count = 90; /* 1800 milli sec */ do { - udelay(1); + msleep(FW_READY_INTERVAL); value = pm8001_cr32(pm8001_ha, 0, MSGU_SCRATCH_PAD_1); } while (((value & SCRATCH_PAD_RAAE_READY) != SCRATCH_PAD_RAAE_READY) && (--max_wait_count)); @@ -750,9 +751,9 @@ static int check_fw_ready(struct pm8001_hba_info *pm8001_ha) } /* check iop0 status */ - max_wait_time = max_wait_count = 600 * 1000; /* 600 milli sec */ + max_wait_time = max_wait_count = 30; /* 600 milli sec */ do { - udelay(1); + msleep(FW_READY_INTERVAL); value = pm8001_cr32(pm8001_ha, 0, MSGU_SCRATCH_PAD_1); } while (((value & SCRATCH_PAD_IOP0_READY) != SCRATCH_PAD_IOP0_READY) && (--max_wait_count)); @@ -768,9 +769,9 @@ static int check_fw_ready(struct pm8001_hba_info *pm8001_ha) if ((pm8001_ha->chip_id != chip_8008) && (pm8001_ha->chip_id != chip_8009)) { /* 200 milli sec */ - max_wait_time = max_wait_count = 200 * 1000; + max_wait_time = max_wait_count = 10; do { - udelay(1); + msleep(FW_READY_INTERVAL); value = pm8001_cr32(pm8001_ha, 0, MSGU_SCRATCH_PAD_1); } while (((value & SCRATCH_PAD_IOP1_READY) != SCRATCH_PAD_IOP1_READY) && (--max_wait_count)); diff --git a/drivers/scsi/pm8001/pm80xx_hwi.h b/drivers/scsi/pm8001/pm80xx_hwi.h index dc9ab7689060b..806cf07eefff4 100644 --- a/drivers/scsi/pm8001/pm80xx_hwi.h +++ b/drivers/scsi/pm8001/pm80xx_hwi.h @@ -1636,3 +1636,9 @@ typedef struct SASProtocolTimerConfig SASProtocolTimerConfig_t; #define MEMBASE_II_SHIFT_REGISTER 0x1010 #endif + +/** + * As we know sleep (1~20) ms may result in sleep longer than ~20 ms, hence we + * choose 20 ms interval. + */ +#define FW_READY_INTERVAL 20 -- 2.27.0