From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S935259AbcIGIpp (ORCPT ); Wed, 7 Sep 2016 04:45:45 -0400 Received: from atlantic540.startdedicated.de ([188.138.9.77]:49449 "EHLO atlantic540.startdedicated.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754227AbcIGIpX (ORCPT ); Wed, 7 Sep 2016 04:45:23 -0400 From: Daniel Wagner To: linux-kernel@vger.kernel.org Cc: Daniel Wagner , Ming Lei , "Luis R . Rodriguez" , Greg Kroah-Hartman Subject: [PATCH v4 3/4] firmware: Drop bit ops in favor of simple state machine Date: Wed, 7 Sep 2016 10:45:07 +0200 Message-Id: <1473237908-20989-4-git-send-email-wagi@monom.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1473237908-20989-1-git-send-email-wagi@monom.org> References: <1473237908-20989-1-git-send-email-wagi@monom.org> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Daniel Wagner We track the state of the loading with bit ops. Since the state machine has only a couple of states and there are only a few simple state transition we can model this simplify. UNKNOWN -> LOADING -> DONE | ABORTED Signed-off-by: Daniel Wagner Cc: Ming Lei Cc: Luis R. Rodriguez Cc: Greg Kroah-Hartman --- drivers/base/firmware_class.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/drivers/base/firmware_class.c b/drivers/base/firmware_class.c index b11fbb0..7757c03 100644 --- a/drivers/base/firmware_class.c +++ b/drivers/base/firmware_class.c @@ -120,16 +120,18 @@ static void fw_status_init(struct fw_status *fw_st) static int __fw_status_check(struct fw_status *fw_st, unsigned long status) { - return test_bit(status, &fw_st->status); + return fw_st->status == status; } static int fw_status_wait_timeout(struct fw_status *fw_st, long timeout) { + unsigned long status; int ret; ret = wait_for_completion_interruptible_timeout(&fw_st->completion, timeout); - if (ret == 0 && test_bit(FW_STATUS_ABORTED, &fw_st->status)) + status = READ_ONCE(fw_st->status); + if (ret == 0 && status == FW_STATUS_ABORTED) return -ENOENT; return ret; @@ -138,13 +140,11 @@ static int fw_status_wait_timeout(struct fw_status *fw_st, long timeout) static void __fw_status_set(struct fw_status *fw_st, unsigned long status) { - set_bit(status, &fw_st->status); + WRITE_ONCE(fw_st->status, status); if (status == FW_STATUS_DONE || - status == FW_STATUS_ABORTED) { - clear_bit(FW_STATUS_LOADING, &fw_st->status); + status == FW_STATUS_ABORTED) complete_all(&fw_st->completion); - } } #define fw_status_start(fw_st) \ -- 2.7.4