From nobody Fri Sep 20 13:23:43 2024 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2984BC001B0 for ; Fri, 14 Jul 2023 09:18:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234487AbjGNJS1 (ORCPT ); Fri, 14 Jul 2023 05:18:27 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47328 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235800AbjGNJSV (ORCPT ); Fri, 14 Jul 2023 05:18:21 -0400 Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 281392D63; Fri, 14 Jul 2023 02:18:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1689326298; x=1720862298; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=f2TaQRe8Y+T7dRECaJ0Jn57KTug3LWzKNLUk11W0vjM=; b=bvBqOUEMuGPpdYbBheo1pvCUJUqhxhcA1ZqYSIeiXw257tznfOKS7Mp5 uIIU/jW4eDokT+P5kBKJuaWt7npUmYD5e0mnx7Vp26P5ADBYGg4X8rh1/ yB68ulzzTR+3sn/l0acb47iuQkeAA+Rok2TWy+dOhceUX8AgCYcDssx/N IpS1pZvlUB3YTCFWAMSvvKYVfkpUW4OmIiH05lJhp3mTeUr2FnSpinGLf OhLyBWpvBr/pJ2Rjy8MtGG9dbaORihu/rBukSLaarPluZ4sBvWWDMNO93 MkBYxGJ72Yqyo2mSvuJ/56UqNywPkdiZvKrntOolcRA+Trqm4rZKe4Czs w==; X-IronPort-AV: E=McAfee;i="6600,9927,10770"; a="365469001" X-IronPort-AV: E=Sophos;i="6.01,204,1684825200"; d="scan'208";a="365469001" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 Jul 2023 02:17:46 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10770"; a="716281743" X-IronPort-AV: E=Sophos;i="6.01,204,1684825200"; d="scan'208";a="716281743" Received: from black.fi.intel.com ([10.237.72.28]) by orsmga007.jf.intel.com with ESMTP; 14 Jul 2023 02:17:44 -0700 Received: by black.fi.intel.com (Postfix, from userid 1003) id 8421F241; Fri, 14 Jul 2023 12:17:50 +0300 (EEST) From: Andy Shevchenko To: Mark Brown , Andy Shevchenko , linux-spi@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Sebastian Reichel Subject: [PATCH v4 1/4] spi: Remove code duplication in spi_add_device*() Date: Fri, 14 Jul 2023 12:17:45 +0300 Message-Id: <20230714091748.89681-2-andriy.shevchenko@linux.intel.com> X-Mailer: git-send-email 2.40.0.1.gaa8946217a0b In-Reply-To: <20230714091748.89681-1-andriy.shevchenko@linux.intel.com> References: <20230714091748.89681-1-andriy.shevchenko@linux.intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" The commit 0c79378c0199 ("spi: add ancillary device support") added a dozen of duplicating lines of code. We may move them to the __spi_add_device(). Note, that the code may be called under the mutex. Signed-off-by: Andy Shevchenko Reviewed-by: Sebastian Reichel --- drivers/spi/spi.c | 32 ++++++++++---------------------- 1 file changed, 10 insertions(+), 22 deletions(-) diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index ae2693ba1744..8e70f4183e62 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c @@ -631,6 +631,16 @@ static int __spi_add_device(struct spi_device *spi) struct device *dev =3D ctlr->dev.parent; int status; =20 + /* Chipselects are numbered 0..max; validate. */ + if (spi_get_chipselect(spi, 0) >=3D ctlr->num_chipselect) { + dev_err(dev, "cs%d >=3D max %d\n", spi_get_chipselect(spi, 0), + ctlr->num_chipselect); + return -EINVAL; + } + + /* Set the bus ID string */ + spi_dev_set_name(spi); + /* * We need to make sure there's no other device with this * chipselect **BEFORE** we call setup(), else we'll trash @@ -689,19 +699,8 @@ static int __spi_add_device(struct spi_device *spi) int spi_add_device(struct spi_device *spi) { struct spi_controller *ctlr =3D spi->controller; - struct device *dev =3D ctlr->dev.parent; int status; =20 - /* Chipselects are numbered 0..max; validate. */ - if (spi_get_chipselect(spi, 0) >=3D ctlr->num_chipselect) { - dev_err(dev, "cs%d >=3D max %d\n", spi_get_chipselect(spi, 0), - ctlr->num_chipselect); - return -EINVAL; - } - - /* Set the bus ID string */ - spi_dev_set_name(spi); - mutex_lock(&ctlr->add_lock); status =3D __spi_add_device(spi); mutex_unlock(&ctlr->add_lock); @@ -712,17 +711,6 @@ EXPORT_SYMBOL_GPL(spi_add_device); static int spi_add_device_locked(struct spi_device *spi) { struct spi_controller *ctlr =3D spi->controller; - struct device *dev =3D ctlr->dev.parent; - - /* Chipselects are numbered 0..max; validate. */ - if (spi_get_chipselect(spi, 0) >=3D ctlr->num_chipselect) { - dev_err(dev, "cs%d >=3D max %d\n", spi_get_chipselect(spi, 0), - ctlr->num_chipselect); - return -EINVAL; - } - - /* Set the bus ID string */ - spi_dev_set_name(spi); =20 WARN_ON(!mutex_is_locked(&ctlr->add_lock)); return __spi_add_device(spi); --=20 2.40.0.1.gaa8946217a0b From nobody Fri Sep 20 13:23:43 2024 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 26098EB64DC for ; Fri, 14 Jul 2023 09:18:32 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235821AbjGNJSa (ORCPT ); Fri, 14 Jul 2023 05:18:30 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47390 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235801AbjGNJSV (ORCPT ); Fri, 14 Jul 2023 05:18:21 -0400 Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4A1952D51; Fri, 14 Jul 2023 02:18:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1689326298; x=1720862298; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=zN+eDH4bSonahOLd7oZfC6x/CMBxwEXOjKeHROeGChE=; b=MCARfTwUMLBcCdiH7djCuTtadkbhmKboMsBdn2zWSFV+QkPQRm8P5fGQ b1V8mc9jZ8mesR9GgKUMjHcZYxzlrXqfpT7j/il4JCQo8UxNcP0YYq/mO tY5fc7NhbZNtFP6+m/HMXl1MzSZ+DUbzeBYzdUffy03LJxcM5x/7FS/ZY 1+RCY0Rz7Hm6PozBmPgTiHJV0pI16y1sBeRPBXul0AoUr8nlKfJpfq7Yj l/xrXShiytF/aQULn8m9NlmDd/gFj/qro/M/e4PxFPyQ4id0c25iQPJKw dODWp2Azc6tR3o2DB6BYYNuBl+1hmSd8GXie9iENRPTePdXttdINJghXa A==; X-IronPort-AV: E=McAfee;i="6600,9927,10770"; a="365468998" X-IronPort-AV: E=Sophos;i="6.01,204,1684825200"; d="scan'208";a="365468998" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 Jul 2023 02:17:46 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10770"; a="716281742" X-IronPort-AV: E=Sophos;i="6.01,204,1684825200"; d="scan'208";a="716281742" Received: from black.fi.intel.com ([10.237.72.28]) by orsmga007.jf.intel.com with ESMTP; 14 Jul 2023 02:17:44 -0700 Received: by black.fi.intel.com (Postfix, from userid 1003) id 93C71385; Fri, 14 Jul 2023 12:17:50 +0300 (EEST) From: Andy Shevchenko To: Mark Brown , Andy Shevchenko , linux-spi@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Sebastian Reichel Subject: [PATCH v4 2/4] spi: Kill spi_add_device_locked() Date: Fri, 14 Jul 2023 12:17:46 +0300 Message-Id: <20230714091748.89681-3-andriy.shevchenko@linux.intel.com> X-Mailer: git-send-email 2.40.0.1.gaa8946217a0b In-Reply-To: <20230714091748.89681-1-andriy.shevchenko@linux.intel.com> References: <20230714091748.89681-1-andriy.shevchenko@linux.intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Now, spi_add_device_locked() has just a line on top of __spi_add_device(). Besides that, it has a single caller. So, just kill it and embed its parts into the caller. Signed-off-by: Andy Shevchenko --- drivers/spi/spi.c | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index 8e70f4183e62..05f702339182 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c @@ -708,14 +708,6 @@ int spi_add_device(struct spi_device *spi) } EXPORT_SYMBOL_GPL(spi_add_device); =20 -static int spi_add_device_locked(struct spi_device *spi) -{ - struct spi_controller *ctlr =3D spi->controller; - - WARN_ON(!mutex_is_locked(&ctlr->add_lock)); - return __spi_add_device(spi); -} - /** * spi_new_device - instantiate one new SPI device * @ctlr: Controller to which device is connected @@ -2417,11 +2409,12 @@ static void of_register_spi_devices(struct spi_cont= roller *ctlr) { } struct spi_device *spi_new_ancillary_device(struct spi_device *spi, u8 chip_select) { + struct spi_controller *ctlr =3D spi->controller; struct spi_device *ancillary; int rc =3D 0; =20 /* Alloc an spi_device */ - ancillary =3D spi_alloc_device(spi->controller); + ancillary =3D spi_alloc_device(ctlr); if (!ancillary) { rc =3D -ENOMEM; goto err_out; @@ -2436,8 +2429,10 @@ struct spi_device *spi_new_ancillary_device(struct s= pi_device *spi, ancillary->max_speed_hz =3D spi->max_speed_hz; ancillary->mode =3D spi->mode; =20 + WARN_ON(!mutex_is_locked(&ctlr->add_lock)); + /* Register the new device */ - rc =3D spi_add_device_locked(ancillary); + rc =3D __spi_add_device(ancillary); if (rc) { dev_err(&spi->dev, "failed to register ancillary device\n"); goto err_out; --=20 2.40.0.1.gaa8946217a0b From nobody Fri Sep 20 13:23:43 2024 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 41DC8EB64DC for ; Fri, 14 Jul 2023 09:18:24 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235803AbjGNJSV (ORCPT ); Fri, 14 Jul 2023 05:18:21 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47318 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231415AbjGNJSS (ORCPT ); Fri, 14 Jul 2023 05:18:18 -0400 Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DC6682D77; Fri, 14 Jul 2023 02:18:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1689326289; x=1720862289; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=H0rPHJ2jq2GzhHsonePV+vqX4ZEBf1cEpTQE3p6vSwE=; b=L8LfPZ4wD2c2davDQGqrFRU8kVeBWQtGLMOkPb0XmugTaWUT3QaWfrMk bDG5B2IiXDf8pHuL2TV1UAEvdOymhfvvtMwvCdV3w1IDMsPnogqcgrt2s MuYKaHZxSiGFMiXTn95WrgVSSr+x5IdIAVDwPjFygguDno8arnqS/46Gu GjtAfAXhZh4EUWWjG6J+OzHnGQzJmgidsTXPKxYxoKa2v53AM3a6LPY3/ Dw4vmBPExw5trK5mo3fvPTo1BemrN8VGbgF0Ki4k1bMETXZ6pJaRJnFoR JckdNAJzrdoB6HzrNSWScmMjQsIya2x5t/vtKckBGIgO/BS/DlYNA3Flo Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10770"; a="365469003" X-IronPort-AV: E=Sophos;i="6.01,204,1684825200"; d="scan'208";a="365469003" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 Jul 2023 02:17:46 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10770"; a="716281744" X-IronPort-AV: E=Sophos;i="6.01,204,1684825200"; d="scan'208";a="716281744" Received: from black.fi.intel.com ([10.237.72.28]) by orsmga007.jf.intel.com with ESMTP; 14 Jul 2023 02:17:44 -0700 Received: by black.fi.intel.com (Postfix, from userid 1003) id A652C4BD; Fri, 14 Jul 2023 12:17:50 +0300 (EEST) From: Andy Shevchenko To: Mark Brown , Andy Shevchenko , linux-spi@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Sebastian Reichel Subject: [PATCH v4 3/4] spi: Use BITS_TO_BYTES() Date: Fri, 14 Jul 2023 12:17:47 +0300 Message-Id: <20230714091748.89681-4-andriy.shevchenko@linux.intel.com> X-Mailer: git-send-email 2.40.0.1.gaa8946217a0b In-Reply-To: <20230714091748.89681-1-andriy.shevchenko@linux.intel.com> References: <20230714091748.89681-1-andriy.shevchenko@linux.intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" BITS_TO_BYTES() is the existing macro which takes care about full bytes that may fully hold the given amount of bits. Use it. Signed-off-by: Andy Shevchenko --- drivers/spi/spi.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index 05f702339182..8d6304cb061e 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c @@ -3877,11 +3877,9 @@ static int __spi_validate(struct spi_device *spi, st= ruct spi_message *message) */ if ((spi->mode & SPI_CS_WORD) && (!(ctlr->mode_bits & SPI_CS_WORD) || spi_get_csgpiod(spi, 0))) { - size_t maxsize; + size_t maxsize =3D BITS_TO_BYTES(spi->bits_per_word); int ret; =20 - maxsize =3D (spi->bits_per_word + 7) / 8; - /* spi_split_transfers_maxsize() requires message->spi */ message->spi =3D spi; =20 --=20 2.40.0.1.gaa8946217a0b From nobody Fri Sep 20 13:23:43 2024 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 862E9EB64DC for ; Fri, 14 Jul 2023 09:17:52 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235603AbjGNJRv (ORCPT ); Fri, 14 Jul 2023 05:17:51 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46862 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234953AbjGNJRt (ORCPT ); Fri, 14 Jul 2023 05:17:49 -0400 Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5AA4B211C; Fri, 14 Jul 2023 02:17:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1689326268; x=1720862268; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=3dTgIUvDYhlnavXOxaZLL1p9dKAgNDGlalBZILcSqRs=; b=BhhCLTE1MFAnNbrfcS+QIW5/jHf9m0AXXqASs9f9rEIqw9QLVLJYhDaI NwsLQTbAv5CnqZSE8OXJTvCxmI/UlZ67orZOXJLWPmO/wqywZG8iA3mvV GL5yS4WGnIPrbI5/R0Kr9FqSor1TVHxJTUS8R9Co9VuWkvEy7poq04Mnu tw8Awp9aVpxqRGe1NBBB8aRq8UUlJomhtz/S3UL+UidGDsO5o2+qKzy1x ceCbb1lWtx2XAbf5AYXBhhMBzwTiO70hg7b8KQXQ04kie1l2VyGzZw8nw NLqjRzYhRJ+shTCOM/Z1TpxjZ/k/AkO17v/CJM9XB5JigajgiUvXpVEv4 g==; X-IronPort-AV: E=McAfee;i="6600,9927,10770"; a="362897874" X-IronPort-AV: E=Sophos;i="6.01,204,1684825200"; d="scan'208";a="362897874" Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 Jul 2023 02:17:46 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10770"; a="812357261" X-IronPort-AV: E=Sophos;i="6.01,204,1684825200"; d="scan'208";a="812357261" Received: from black.fi.intel.com ([10.237.72.28]) by FMSMGA003.fm.intel.com with ESMTP; 14 Jul 2023 02:17:44 -0700 Received: by black.fi.intel.com (Postfix, from userid 1003) id AB94A3E3; Fri, 14 Jul 2023 12:17:50 +0300 (EEST) From: Andy Shevchenko To: Mark Brown , Andy Shevchenko , linux-spi@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Sebastian Reichel Subject: [PATCH v4 4/4] spi: Use struct_size() helper Date: Fri, 14 Jul 2023 12:17:48 +0300 Message-Id: <20230714091748.89681-5-andriy.shevchenko@linux.intel.com> X-Mailer: git-send-email 2.40.0.1.gaa8946217a0b In-Reply-To: <20230714091748.89681-1-andriy.shevchenko@linux.intel.com> References: <20230714091748.89681-1-andriy.shevchenko@linux.intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" The Documentation/process/deprecated.rst suggests to use flexible array members to provide a way to declare having a dynamically sized set of trailing elements in a structure.This makes code robust agains bunch of the issues described in the documentation, main of which is about the correctness of the sizeof() calculation for this data structure. Due to above, prefer struct_size() over open-coded versions. Signed-off-by: Andy Shevchenko --- include/linux/spi/spi.h | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h index 04daf61dfd3f..7f8b478fdeb3 100644 --- a/include/linux/spi/spi.h +++ b/include/linux/spi/spi.h @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -1085,6 +1086,8 @@ struct spi_transfer { * @state: for use by whichever driver currently owns the message * @resources: for resource management when the SPI message is processed * @prepared: spi_prepare_message was called for the this message + * @t: for use with spi_message_alloc() when message and transfers have + * been allocated together * * A @spi_message is used to execute an atomic sequence of data transfers, * each represented by a struct spi_transfer. The sequence is "atomic" @@ -1139,6 +1142,9 @@ struct spi_message { =20 /* List of spi_res resources when the SPI message is processed */ struct list_head resources; + + /* For embedding transfers into the memory of the message */ + struct spi_transfer t[]; }; =20 static inline void spi_message_init_no_memset(struct spi_message *m) @@ -1199,16 +1205,13 @@ static inline struct spi_message *spi_message_alloc= (unsigned ntrans, gfp_t flags { struct spi_message *m; =20 - m =3D kzalloc(sizeof(struct spi_message) - + ntrans * sizeof(struct spi_transfer), - flags); + m =3D kzalloc(struct_size(m, t, ntrans), flags); if (m) { unsigned i; - struct spi_transfer *t =3D (struct spi_transfer *)(m + 1); =20 spi_message_init_no_memset(m); - for (i =3D 0; i < ntrans; i++, t++) - spi_message_add_tail(t, m); + for (i =3D 0; i < ntrans; i++) + spi_message_add_tail(&m->t[i], m); } return m; } --=20 2.40.0.1.gaa8946217a0b