Received: by 2002:ad5:4acb:0:0:0:0:0 with SMTP id n11csp997634imw; Wed, 13 Jul 2022 11:51:34 -0700 (PDT) X-Google-Smtp-Source: AGRyM1vzFQKnnmMd7K/gs3tKVJwEb+P+HWHcI/nOSQg0iBu0+id/c4LfZ/Fc/qeIXYNWVelABp/a X-Received: by 2002:aa7:80ce:0:b0:529:5e4f:7f67 with SMTP id a14-20020aa780ce000000b005295e4f7f67mr4453521pfn.3.1657738294353; Wed, 13 Jul 2022 11:51:34 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1657738294; cv=none; d=google.com; s=arc-20160816; b=HPw/MGNG5oQztu7KwH0ybqQhC+hDvtZA6K3U3cNY6DYiFvdXAt1R/ztBwScU4ZMc8m qIEn2pLNZ/d8Ci67PErKs/0Q1ULN4VfAGhPRbnVzJdlB/kNkIfC7xtzuZG13J9YksUWg ivqqQd8SC8Z28cPfwt/Ja/F+8vS/YAZ3OTOkVexkHS25i5xZgGMdw49HYe5Bgmt1D9F7 bP9Ypj4IHKvEg5zY2RQZNTtKZ/W2o9hwQ7gGghejGoiq61jf+PemkxgNhQ7wVyixAe1G kBUWdL7za4Aoi7yPed+LYoPq0OnP3FH39bdrbH2jI1IIS5BnAG4uRBEpeOMVjII/T6ZQ 1ucg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version:dkim-signature; bh=s0/VHpNQ9RNaH4zKX955bl36QOw/Zy/4YbokavoGCgM=; b=f9Y5tzGCqhnmxDDIeO4pHQLQNA24640QlRc5ibmpv3oaS1lrkaARqmXhMYj/vlHUUt M/12Q+1WCvMBw46OzcKMiNeYD0f5ru1F6yspLGEQacfBT/ZtggAB4LEu91wug19GVUjN X9PKf09j66CJI+UhngsEqUEuXrLLP/GG670FHWin+l/ToV3/jF8NQA/+rmwyI9Tt+b4V gvBZHJrMobIeHEA4HBj0H0you/5olKpmspP7t5NwnOR5PpA3qc2RbBF/1imF1nLHryYz y3KGAndledeEkFrTcL7nKe53TjMskzs3y5pp/efHYhkLYwVMfSq+O6lpSYrk8UnvXv// Vy0w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=Ny4Pqz5A; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id j62-20020a638b41000000b00419ae08962asi238856pge.683.2022.07.13.11.51.22; Wed, 13 Jul 2022 11:51:34 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=Ny4Pqz5A; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236141AbiGMSQD (ORCPT + 99 others); Wed, 13 Jul 2022 14:16:03 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53312 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231477AbiGMSQB (ORCPT ); Wed, 13 Jul 2022 14:16:01 -0400 Received: from mail-ej1-x633.google.com (mail-ej1-x633.google.com [IPv6:2a00:1450:4864:20::633]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 812692E69D for ; Wed, 13 Jul 2022 11:16:00 -0700 (PDT) Received: by mail-ej1-x633.google.com with SMTP id t1so5536672ejd.12 for ; Wed, 13 Jul 2022 11:16:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=s0/VHpNQ9RNaH4zKX955bl36QOw/Zy/4YbokavoGCgM=; b=Ny4Pqz5A/eak6mJZG9FHAhtrBD57iegbQK9b5ZE/Wo0hwEKnlm79zPJSnzf9K7vSov iGsKF/twoL/k9zGAafixG9JVJHYDnpRlU7oOtrHiN+3f2PCEgTrVIg33Noggk4brABam xrx4O3+I+AaXtWQ3LzUlvCB7HzYgrsstAGI1V3nrQch5fRAFEprCPRXdcGLlw1vhBeLL BUt3LwuW8iwiKf4x8bV0RkeSZCq/4JyTfLci4DWKgChMy5fvD6lzU8NAa6rGfo9IoATM x6qt/3OYw+Hz64MfOUQE+e1OoU5QpvBrfrrfsWNKCOYOZXZa9s8zdNv0SPhx5ftHQ8KW rPpA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=s0/VHpNQ9RNaH4zKX955bl36QOw/Zy/4YbokavoGCgM=; b=8ERyvXXXvVk0SCA4/ktN+tawyMOtAKCrcXNnib6ydLvSFBHs/k1T5JVA/gEvbAxTrI BlOTKlWMqxXfpXNMP/8rGgsidfR88ARL/q37IsFFzSBQR6YU+nEbgatVYMx/XMNKuc8r NGDAZ2bXeThFn4twjXoZbX21P1XAqtslzAg977iNN3wygeyGl7NP4kxel9qjF2+NxGnO AeSl1R64Zj/QJ86NOTezPwMTtc1DsstacAJLJwaDkdCSQG9oLgFe5S/sUpP683beYvak D7duN3EXO+2fE6idP/8kdsrNdizYMpkTOHE4yNkQ8WqSzUGJkpswjbb99Do/b4+BOzKV TVkQ== X-Gm-Message-State: AJIora/nnbPrAufBarsW3v1vrYxToSf7s+hyKcc80+qoHr4ATWMG87m3 M0RBbDhrH4M5UrLAv1upLIjDa1R6IrS5ZF914cls9SiYpCo= X-Received: by 2002:a17:907:720a:b0:72b:549e:305a with SMTP id dr10-20020a170907720a00b0072b549e305amr4447049ejc.691.1657736158879; Wed, 13 Jul 2022 11:15:58 -0700 (PDT) MIME-Version: 1.0 References: <20220628024913.1755292-1-tzungbi@kernel.org> <20220628024913.1755292-6-tzungbi@kernel.org> In-Reply-To: <20220628024913.1755292-6-tzungbi@kernel.org> From: Guenter Roeck Date: Wed, 13 Jul 2022 11:15:47 -0700 Message-ID: Subject: Re: [RESEND PATCH 05/11] platform/chrome: cros_ec_proto: separate cros_ec_wait_until_complete() To: Tzung-Bi Shih Cc: Benson Leung , Guenter Roeck , "open list:CHROME HARDWARE PLATFORM SUPPORT" , linux-kernel Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-17.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF, ENV_AND_HDR_SPF_MATCH,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS, T_SCC_BODY_TEXT_LINE,USER_IN_DEF_DKIM_WL,USER_IN_DEF_SPF_WL autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, Jun 27, 2022 at 7:49 PM Tzung-Bi Shih wrote: > > EC returns EC_RES_IN_PROGRESS if the host command needs more time to > complete. Whenever receives the return code, cros_ec_send_command() > sends EC_CMD_GET_COMMS_STATUS to query the command status. > > Separate cros_ec_wait_until_complete() from cros_ec_send_command(). > It sends EC_CMD_GET_COMMS_STATUS and waits until the previous command > was completed, or encountered error, or timed out. > > Signed-off-by: Tzung-Bi Shih > --- > drivers/platform/chrome/cros_ec_proto.c | 75 ++++++++++++------------- > 1 file changed, 36 insertions(+), 39 deletions(-) > > diff --git a/drivers/platform/chrome/cros_ec_proto.c b/drivers/platform/chrome/cros_ec_proto.c > index 0cec013be3d3..466ecb063bd6 100644 > --- a/drivers/platform/chrome/cros_ec_proto.c > +++ b/drivers/platform/chrome/cros_ec_proto.c > @@ -134,53 +134,50 @@ static int cros_ec_xfer_command(struct cros_ec_device *ec_dev, struct cros_ec_co > return ret; > } > > -static int cros_ec_send_command(struct cros_ec_device *ec_dev, struct cros_ec_command *msg) > +static int cros_ec_wait_until_complete(struct cros_ec_device *ec_dev, uint32_t *result) > { > - int ret = cros_ec_xfer_command(ec_dev, msg); > + struct cros_ec_command *msg; > + struct ec_response_get_comms_status *status; > + int ret = 0, i; > + > + msg = kzalloc(sizeof(*msg) + sizeof(*status), GFP_KERNEL); > + if (!msg) > + return -ENOMEM; AFAICS this is always 24 bytes. I would suggest to allocate it on the stack to reduce overhead. > > - if (msg->result == EC_RES_IN_PROGRESS) { > - int i; > - struct cros_ec_command *status_msg; > - struct ec_response_get_comms_status *status; > + msg->command = EC_CMD_GET_COMMS_STATUS; > + msg->insize = sizeof(*status); > > - status_msg = kmalloc(sizeof(*status_msg) + sizeof(*status), > - GFP_KERNEL); > - if (!status_msg) > - return -ENOMEM; > + status = (struct ec_response_get_comms_status *)msg->data; > > - status_msg->version = 0; > - status_msg->command = EC_CMD_GET_COMMS_STATUS; > - status_msg->insize = sizeof(*status); > - status_msg->outsize = 0; > + /* Query the EC's status until it's no longer busy or we encounter an error. */ > + for (i = 0; i < EC_COMMAND_RETRIES; ++i) { > + usleep_range(10000, 11000); > > - /* > - * Query the EC's status until it's no longer busy or > - * we encounter an error. > - */ > - for (i = 0; i < EC_COMMAND_RETRIES; i++) { > - usleep_range(10000, 11000); > - > - trace_cros_ec_request_start(status_msg); > - ret = (*xfer_fxn)(ec_dev, status_msg); > - trace_cros_ec_request_done(status_msg, ret); > - if (ret == -EAGAIN) > - continue; > - if (ret < 0) > - break; > - > - msg->result = status_msg->result; > - if (status_msg->result != EC_RES_SUCCESS) > - break; > - > - status = (struct ec_response_get_comms_status *) > - status_msg->data; > - if (!(status->flags & EC_COMMS_STATUS_PROCESSING)) > - break; > - } > + ret = cros_ec_xfer_command(ec_dev, msg); > + if (ret == -EAGAIN) > + continue; > + if (ret < 0) > + break; With the command allocated on the stack, this can return immediately. > + > + *result = msg->result; > + if (msg->result != EC_RES_SUCCESS) > + break; Again, this can return immediately if the command buffer is on the stack. > > - kfree(status_msg); > + if (!(status->flags & EC_COMMS_STATUS_PROCESSING)) > + break; Can return immediately. > } > > + kfree(msg); > + return ret; What should this return on timeout ? > +} > + > +static int cros_ec_send_command(struct cros_ec_device *ec_dev, struct cros_ec_command *msg) > +{ > + int ret = cros_ec_xfer_command(ec_dev, msg); > + > + if (msg->result == EC_RES_IN_PROGRESS) > + ret = cros_ec_wait_until_complete(ec_dev, &msg->result); > + > return ret; > } > > -- > 2.37.0.rc0.161.g10f37bed90-goog >