From mboxrd@z Thu Jan 1 00:00:00 1970 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 alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 6F32CC6FA8F for ; Thu, 24 Aug 2023 16:34:33 +0000 (UTC) Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id A2BCE84A; Thu, 24 Aug 2023 18:33:40 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz A2BCE84A DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1692894870; bh=hKGWz6i/h9Cf23s8/pZBaFc10Qdcje7xm2fp2fCkVFI=; h=Date:From:To:Cc:Subject:In-Reply-To:References:List-Id: List-Archive:List-Help:List-Owner:List-Post:List-Subscribe: List-Unsubscribe:From; b=Xa5nvVRIeVKWRTz0PQYcE2Y/RNR4E8f4rL7Q+aIy6WFsc2S090mnutvgM64SlKKY6 sWPlvxKEl40FrFViGSPfTZIhA8X/cC4nEHmtHMI5sWMHHckjtRl/BMNkz3W3v9HYSS tbu5B7+H7Zxjd2T2yD1JJ7V/W6FBUZK9cHGHg3Rg= Received: by alsa1.perex.cz (Postfix, from userid 50401) id E415BF80536; Thu, 24 Aug 2023 18:33:05 +0200 (CEST) Received: from mailman-core.alsa-project.org (mailman-core.alsa-project.org [10.254.200.10]) by alsa1.perex.cz (Postfix) with ESMTP id 81EDBF80158; Thu, 24 Aug 2023 18:33:05 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id E8AC9F80158; Thu, 24 Aug 2023 18:33:00 +0200 (CEST) Received: from relay9-d.mail.gandi.net (relay9-d.mail.gandi.net [217.70.183.199]) (using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 27481F800BF for ; Thu, 24 Aug 2023 18:32:52 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 27481F800BF Authentication-Results: alsa1.perex.cz; dkim=pass (2048-bit key, unprotected) header.d=bootlin.com header.i=@bootlin.com header.a=rsa-sha256 header.s=gm1 header.b=nFqLNEvP Received: by mail.gandi.net (Postfix) with ESMTPSA id E7751FF805; Thu, 24 Aug 2023 16:32:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1692894771; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=bsZa7pZKZNbOWTMTAuaVYbIB0/GSiNJq7wZvQfer+ls=; b=nFqLNEvPxHjcfURhNwgVrXak5QCYFYuY/xVoa2IdayasepT7+bAW6cycLkh5qxW2v/blqb tIm3mQ5Vd8ytwAOyuhV3ZZOGkBO2OUcbGr1ZxCrLKW+ptuNJt4wNaLv3Xiq43vbcUs4q7h vfD5hXaYwMqEzhVXe+iOUgiiyYBTQr5qnIFUytGfxXFyG5bPC9G49VMll2D7OxAI1LWeVR PjTqnx2eyDwQWulJUtPAco2jbccZtAXUjq6YsfYQFfCqo/PvOaqu9s7dedj24KU02U8dGc 5/DxtsUwOk7cg6s2XKm6BNMJ58dM27YmcBy9wLVI0DkEMhSL4xig+IzZEYRZzw== Date: Thu, 24 Aug 2023 18:32:45 +0200 From: Herve Codina To: Christophe JAILLET Cc: Christophe Leroy , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Andrew Lunn , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Lee Jones , Linus Walleij , Qiang Zhao , Li Yang , Liam Girdwood , Mark Brown , Jaroslav Kysela , Takashi Iwai , Shengjiu Wang , Xiubo Li , Fabio Estevam , Nicolin Chen , netdev@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-gpio@vger.kernel.org, linux-arm-kernel@lists.infradead.org, alsa-devel@alsa-project.org, Thomas Petazzoni Subject: Re: [PATCH v4 20/28] wan: qmc_hdlc: Add runtime timeslots changes support Message-ID: <20230824183245.26bea22a@bootlin.com> In-Reply-To: References: <1364a0742fc76e7d275273dbbc4c97b008ec70a5.1692376361.git.christophe.leroy@csgroup.eu> Organization: Bootlin X-Mailer: Claws Mail 4.1.1 (GTK 3.24.38; x86_64-redhat-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-GND-Sasl: herve.codina@bootlin.com Message-ID-Hash: 2FRUBQKNT5J2YAIKHNMEOCIZZSHAA6PY X-Message-ID-Hash: 2FRUBQKNT5J2YAIKHNMEOCIZZSHAA6PY X-MailFrom: herve.codina@bootlin.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-alsa-devel.alsa-project.org-0; header-match-alsa-devel.alsa-project.org-1; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.8 Precedence: list List-Id: "Alsa-devel mailing list for ALSA developers - http://www.alsa-project.org" Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: Hi Christophe, On Mon, 21 Aug 2023 07:40:26 +0200 Christophe JAILLET wrote: > Le 18/08/2023 à 18:39, Christophe Leroy a écrit : > > From: Herve Codina > > > > QMC channels support runtime timeslots changes but nothing is done at > > the QMC HDLC driver to handle these changes. > > > > Use existing IFACE ioctl in order to configure the timeslots to use. > > > > Signed-off-by: Herve Codina > > Reviewed-by: Christophe Leroy > > Signed-off-by: Christophe Leroy > > --- > > Hi, > > a few nits below, should there be a v5. > > > drivers/net/wan/fsl_qmc_hdlc.c | 169 ++++++++++++++++++++++++++++++++- > > 1 file changed, 168 insertions(+), 1 deletion(-) > > > > diff --git a/drivers/net/wan/fsl_qmc_hdlc.c b/drivers/net/wan/fsl_qmc_hdlc.c > > index 4f84ac5fc63e..4b8cb5761fd1 100644 > > --- a/drivers/net/wan/fsl_qmc_hdlc.c > > +++ b/drivers/net/wan/fsl_qmc_hdlc.c > > @@ -32,6 +32,7 @@ struct qmc_hdlc { > > struct qmc_hdlc_desc tx_descs[8]; > > unsigned int tx_out; > > struct qmc_hdlc_desc rx_descs[4]; > > + u32 slot_map; > > }; > > > > static inline struct qmc_hdlc *netdev_to_qmc_hdlc(struct net_device *netdev) > > @@ -202,6 +203,162 @@ static netdev_tx_t qmc_hdlc_xmit(struct sk_buff *skb, struct net_device *netdev) > > return NETDEV_TX_OK; > > } > > > > +static int qmc_hdlc_xlate_slot_map(struct qmc_hdlc *qmc_hdlc, > > + u32 slot_map, struct qmc_chan_ts_info *ts_info) > > +{ > > + u64 ts_mask_avail; > > + unsigned int bit; > > + unsigned int i; > > + u64 ts_mask; > > + u64 map = 0; > > This init looks useless. Will be removed in the next iteration. > > > + > > + /* Tx and Rx masks must be identical */ > > + if (ts_info->rx_ts_mask_avail != ts_info->tx_ts_mask_avail) { > > + dev_err(qmc_hdlc->dev, "tx and rx available timeslots mismatch (0x%llx, 0x%llx)\n", > > + ts_info->rx_ts_mask_avail, ts_info->tx_ts_mask_avail); > > + return -EINVAL; > > + } > > + > > + ts_mask_avail = ts_info->rx_ts_mask_avail; > > + ts_mask = 0; > > + map = slot_map; > > + bit = 0; > > + for (i = 0; i < 64; i++) { > > + if (ts_mask_avail & BIT_ULL(i)) { > > + if (map & BIT_ULL(bit)) > > + ts_mask |= BIT_ULL(i); > > + bit++; > > + } > > + } > > + > > + if (hweight64(ts_mask) != hweight64(map)) { > > + dev_err(qmc_hdlc->dev, "Cannot translate timeslots 0x%llx -> (0x%llx,0x%llx)\n", > > + map, ts_mask_avail, ts_mask); > > + return -EINVAL; > > + } > > + > > + ts_info->tx_ts_mask = ts_mask; > > + ts_info->rx_ts_mask = ts_mask; > > + return 0; > > +} > > + > > +static int qmc_hdlc_xlate_ts_info(struct qmc_hdlc *qmc_hdlc, > > + const struct qmc_chan_ts_info *ts_info, u32 *slot_map) > > +{ > > + u64 ts_mask_avail; > > + unsigned int bit; > > + unsigned int i; > > + u64 ts_mask; > > + u64 map = 0; > > This init looks useless. Will be remove in the next iteration. > > > + > > + /* Tx and Rx masks must be identical */ > > + if (ts_info->rx_ts_mask_avail != ts_info->tx_ts_mask_avail) { > > + dev_err(qmc_hdlc->dev, "tx and rx available timeslots mismatch (0x%llx, 0x%llx)\n", > > + ts_info->rx_ts_mask_avail, ts_info->tx_ts_mask_avail); > > + return -EINVAL; > > + } > > + if (ts_info->rx_ts_mask != ts_info->tx_ts_mask) { > > + dev_err(qmc_hdlc->dev, "tx and rx timeslots mismatch (0x%llx, 0x%llx)\n", > > + ts_info->rx_ts_mask, ts_info->tx_ts_mask); > > + return -EINVAL; > > + } > > + > > + ts_mask_avail = ts_info->rx_ts_mask_avail; > > + ts_mask = ts_info->rx_ts_mask; > > + map = 0; > > + bit = 0; > > + for (i = 0; i < 64; i++) { > > + if (ts_mask_avail & BIT_ULL(i)) { > > + if (ts_mask & BIT_ULL(i)) > > + map |= BIT_ULL(bit); > > + bit++; > > + } > > + } > > + > > + if (hweight64(ts_mask) != hweight64(map)) { > > + dev_err(qmc_hdlc->dev, "Cannot translate timeslots (0x%llx,0x%llx) -> 0x%llx\n", > > + ts_mask_avail, ts_mask, map); > > + return -EINVAL; > > + } > > + > > + if (map >= BIT_ULL(32)) { > > + dev_err(qmc_hdlc->dev, "Slot map out of 32bit (0x%llx,0x%llx) -> 0x%llx\n", > > + ts_mask_avail, ts_mask, map); > > + return -EINVAL; > > + } > > + > > + *slot_map = map; > > + return 0; > > +} > > ... > > > +static int qmc_hdlc_ioctl(struct net_device *netdev, struct if_settings *ifs) > > +{ > > + struct qmc_hdlc *qmc_hdlc = netdev_to_qmc_hdlc(netdev); > > + te1_settings te1; > > + > > + switch (ifs->type) { > > + case IF_GET_IFACE: > > + ifs->type = IF_IFACE_E1; > > + if (ifs->size < sizeof(te1)) { > > + if (!ifs->size) > > + return 0; /* only type requested */ > > + > > + ifs->size = sizeof(te1); /* data size wanted */ > > + return -ENOBUFS; > > + } > > + > > + memset(&te1, 0, sizeof(te1)); > > + > > + /* Update slot_map */ > > + te1.slot_map = qmc_hdlc->slot_map; > > + > > + if (copy_to_user(ifs->ifs_ifsu.te1, &te1, sizeof(te1))) > > ~~ > Extra space. Will be fixed in the next iteration. > > > + return -EFAULT; > > + return 0; > > + > > + case IF_IFACE_E1: > > + case IF_IFACE_T1: > > + if (!capable(CAP_NET_ADMIN)) > > + return -EPERM; > > + > > + if (netdev->flags & IFF_UP) > > + return -EBUSY; > > + > > + if (copy_from_user(&te1, ifs->ifs_ifsu.te1, sizeof(te1))) > > + return -EFAULT; > > + > > + return qmc_hdlc_set_iface(qmc_hdlc, ifs->type, &te1); > > + > > + default: > > + return hdlc_ioctl(netdev, ifs); > > + } > > +} > > ... > Thanks for the review, Best regards, Hervé -- Hervé Codina, Bootlin Embedded Linux and Kernel engineering https://bootlin.com From mboxrd@z Thu Jan 1 00:00:00 1970 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 lists.ozlabs.org (lists.ozlabs.org [112.213.38.117]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id AA5E8EE49A6 for ; Thu, 24 Aug 2023 16:33:48 +0000 (UTC) Authentication-Results: lists.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=bootlin.com header.i=@bootlin.com header.a=rsa-sha256 header.s=gm1 header.b=nFqLNEvP; dkim-atps=neutral Received: from boromir.ozlabs.org (localhost [IPv6:::1]) by lists.ozlabs.org (Postfix) with ESMTP id 4RWpYl0LZrz3c9G for ; Fri, 25 Aug 2023 02:33:47 +1000 (AEST) Authentication-Results: lists.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=bootlin.com header.i=@bootlin.com header.a=rsa-sha256 header.s=gm1 header.b=nFqLNEvP; dkim-atps=neutral Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=bootlin.com (client-ip=217.70.183.199; helo=relay9-d.mail.gandi.net; envelope-from=herve.codina@bootlin.com; receiver=lists.ozlabs.org) Received: from relay9-d.mail.gandi.net (relay9-d.mail.gandi.net [217.70.183.199]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 4RWpXn1rxPz3c5S for ; Fri, 25 Aug 2023 02:32:56 +1000 (AEST) Received: by mail.gandi.net (Postfix) with ESMTPSA id E7751FF805; Thu, 24 Aug 2023 16:32:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1692894771; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=bsZa7pZKZNbOWTMTAuaVYbIB0/GSiNJq7wZvQfer+ls=; b=nFqLNEvPxHjcfURhNwgVrXak5QCYFYuY/xVoa2IdayasepT7+bAW6cycLkh5qxW2v/blqb tIm3mQ5Vd8ytwAOyuhV3ZZOGkBO2OUcbGr1ZxCrLKW+ptuNJt4wNaLv3Xiq43vbcUs4q7h vfD5hXaYwMqEzhVXe+iOUgiiyYBTQr5qnIFUytGfxXFyG5bPC9G49VMll2D7OxAI1LWeVR PjTqnx2eyDwQWulJUtPAco2jbccZtAXUjq6YsfYQFfCqo/PvOaqu9s7dedj24KU02U8dGc 5/DxtsUwOk7cg6s2XKm6BNMJ58dM27YmcBy9wLVI0DkEMhSL4xig+IzZEYRZzw== Date: Thu, 24 Aug 2023 18:32:45 +0200 From: Herve Codina To: Christophe JAILLET Subject: Re: [PATCH v4 20/28] wan: qmc_hdlc: Add runtime timeslots changes support Message-ID: <20230824183245.26bea22a@bootlin.com> In-Reply-To: References: <1364a0742fc76e7d275273dbbc4c97b008ec70a5.1692376361.git.christophe.leroy@csgroup.eu> Organization: Bootlin X-Mailer: Claws Mail 4.1.1 (GTK 3.24.38; x86_64-redhat-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-GND-Sasl: herve.codina@bootlin.com X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Andrew Lunn , alsa-devel@alsa-project.org, Thomas Petazzoni , Xiubo Li , Linus Walleij , Jaroslav Kysela , Eric Dumazet , Krzysztof Kozlowski , Fabio Estevam , Qiang Zhao , Shengjiu Wang , Lee Jones , Jakub Kicinski , Paolo Abeni , devicetree@vger.kernel.org, Conor Dooley , linux-kernel@vger.kernel.org, Nicolin Chen , linux-gpio@vger.kernel.org, Rob Herring , Takashi Iwai , linux-arm-kernel@lists.infradead.org, netdev@vger.kernel.org, Liam Girdwood , Li Yang , Mark Brown , linuxppc-dev@lists.ozlabs.org, "David S. Miller" Errors-To: linuxppc-dev-bounces+linuxppc-dev=archiver.kernel.org@lists.ozlabs.org Sender: "Linuxppc-dev" Hi Christophe, On Mon, 21 Aug 2023 07:40:26 +0200 Christophe JAILLET wrote: > Le 18/08/2023 à 18:39, Christophe Leroy a écrit : > > From: Herve Codina > > > > QMC channels support runtime timeslots changes but nothing is done at > > the QMC HDLC driver to handle these changes. > > > > Use existing IFACE ioctl in order to configure the timeslots to use. > > > > Signed-off-by: Herve Codina > > Reviewed-by: Christophe Leroy > > Signed-off-by: Christophe Leroy > > --- > > Hi, > > a few nits below, should there be a v5. > > > drivers/net/wan/fsl_qmc_hdlc.c | 169 ++++++++++++++++++++++++++++++++- > > 1 file changed, 168 insertions(+), 1 deletion(-) > > > > diff --git a/drivers/net/wan/fsl_qmc_hdlc.c b/drivers/net/wan/fsl_qmc_hdlc.c > > index 4f84ac5fc63e..4b8cb5761fd1 100644 > > --- a/drivers/net/wan/fsl_qmc_hdlc.c > > +++ b/drivers/net/wan/fsl_qmc_hdlc.c > > @@ -32,6 +32,7 @@ struct qmc_hdlc { > > struct qmc_hdlc_desc tx_descs[8]; > > unsigned int tx_out; > > struct qmc_hdlc_desc rx_descs[4]; > > + u32 slot_map; > > }; > > > > static inline struct qmc_hdlc *netdev_to_qmc_hdlc(struct net_device *netdev) > > @@ -202,6 +203,162 @@ static netdev_tx_t qmc_hdlc_xmit(struct sk_buff *skb, struct net_device *netdev) > > return NETDEV_TX_OK; > > } > > > > +static int qmc_hdlc_xlate_slot_map(struct qmc_hdlc *qmc_hdlc, > > + u32 slot_map, struct qmc_chan_ts_info *ts_info) > > +{ > > + u64 ts_mask_avail; > > + unsigned int bit; > > + unsigned int i; > > + u64 ts_mask; > > + u64 map = 0; > > This init looks useless. Will be removed in the next iteration. > > > + > > + /* Tx and Rx masks must be identical */ > > + if (ts_info->rx_ts_mask_avail != ts_info->tx_ts_mask_avail) { > > + dev_err(qmc_hdlc->dev, "tx and rx available timeslots mismatch (0x%llx, 0x%llx)\n", > > + ts_info->rx_ts_mask_avail, ts_info->tx_ts_mask_avail); > > + return -EINVAL; > > + } > > + > > + ts_mask_avail = ts_info->rx_ts_mask_avail; > > + ts_mask = 0; > > + map = slot_map; > > + bit = 0; > > + for (i = 0; i < 64; i++) { > > + if (ts_mask_avail & BIT_ULL(i)) { > > + if (map & BIT_ULL(bit)) > > + ts_mask |= BIT_ULL(i); > > + bit++; > > + } > > + } > > + > > + if (hweight64(ts_mask) != hweight64(map)) { > > + dev_err(qmc_hdlc->dev, "Cannot translate timeslots 0x%llx -> (0x%llx,0x%llx)\n", > > + map, ts_mask_avail, ts_mask); > > + return -EINVAL; > > + } > > + > > + ts_info->tx_ts_mask = ts_mask; > > + ts_info->rx_ts_mask = ts_mask; > > + return 0; > > +} > > + > > +static int qmc_hdlc_xlate_ts_info(struct qmc_hdlc *qmc_hdlc, > > + const struct qmc_chan_ts_info *ts_info, u32 *slot_map) > > +{ > > + u64 ts_mask_avail; > > + unsigned int bit; > > + unsigned int i; > > + u64 ts_mask; > > + u64 map = 0; > > This init looks useless. Will be remove in the next iteration. > > > + > > + /* Tx and Rx masks must be identical */ > > + if (ts_info->rx_ts_mask_avail != ts_info->tx_ts_mask_avail) { > > + dev_err(qmc_hdlc->dev, "tx and rx available timeslots mismatch (0x%llx, 0x%llx)\n", > > + ts_info->rx_ts_mask_avail, ts_info->tx_ts_mask_avail); > > + return -EINVAL; > > + } > > + if (ts_info->rx_ts_mask != ts_info->tx_ts_mask) { > > + dev_err(qmc_hdlc->dev, "tx and rx timeslots mismatch (0x%llx, 0x%llx)\n", > > + ts_info->rx_ts_mask, ts_info->tx_ts_mask); > > + return -EINVAL; > > + } > > + > > + ts_mask_avail = ts_info->rx_ts_mask_avail; > > + ts_mask = ts_info->rx_ts_mask; > > + map = 0; > > + bit = 0; > > + for (i = 0; i < 64; i++) { > > + if (ts_mask_avail & BIT_ULL(i)) { > > + if (ts_mask & BIT_ULL(i)) > > + map |= BIT_ULL(bit); > > + bit++; > > + } > > + } > > + > > + if (hweight64(ts_mask) != hweight64(map)) { > > + dev_err(qmc_hdlc->dev, "Cannot translate timeslots (0x%llx,0x%llx) -> 0x%llx\n", > > + ts_mask_avail, ts_mask, map); > > + return -EINVAL; > > + } > > + > > + if (map >= BIT_ULL(32)) { > > + dev_err(qmc_hdlc->dev, "Slot map out of 32bit (0x%llx,0x%llx) -> 0x%llx\n", > > + ts_mask_avail, ts_mask, map); > > + return -EINVAL; > > + } > > + > > + *slot_map = map; > > + return 0; > > +} > > ... > > > +static int qmc_hdlc_ioctl(struct net_device *netdev, struct if_settings *ifs) > > +{ > > + struct qmc_hdlc *qmc_hdlc = netdev_to_qmc_hdlc(netdev); > > + te1_settings te1; > > + > > + switch (ifs->type) { > > + case IF_GET_IFACE: > > + ifs->type = IF_IFACE_E1; > > + if (ifs->size < sizeof(te1)) { > > + if (!ifs->size) > > + return 0; /* only type requested */ > > + > > + ifs->size = sizeof(te1); /* data size wanted */ > > + return -ENOBUFS; > > + } > > + > > + memset(&te1, 0, sizeof(te1)); > > + > > + /* Update slot_map */ > > + te1.slot_map = qmc_hdlc->slot_map; > > + > > + if (copy_to_user(ifs->ifs_ifsu.te1, &te1, sizeof(te1))) > > ~~ > Extra space. Will be fixed in the next iteration. > > > + return -EFAULT; > > + return 0; > > + > > + case IF_IFACE_E1: > > + case IF_IFACE_T1: > > + if (!capable(CAP_NET_ADMIN)) > > + return -EPERM; > > + > > + if (netdev->flags & IFF_UP) > > + return -EBUSY; > > + > > + if (copy_from_user(&te1, ifs->ifs_ifsu.te1, sizeof(te1))) > > + return -EFAULT; > > + > > + return qmc_hdlc_set_iface(qmc_hdlc, ifs->type, &te1); > > + > > + default: > > + return hdlc_ioctl(netdev, ifs); > > + } > > +} > > ... > Thanks for the review, Best regards, Hervé -- Hervé Codina, Bootlin Embedded Linux and Kernel engineering https://bootlin.com From mboxrd@z Thu Jan 1 00:00:00 1970 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 bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 5E719C3DA6F for ; Thu, 24 Aug 2023 16:33:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=MRv5jXQMXBEUsb/9/jnuAoM3DoU+oi/2tMbU++2uCHs=; b=mssmfZS+PgVUEw YdTujYj+246evIdeSZOe1QXvDthC6gBNdW/sx5cY0XKogYLlg0i8jTDjCKK6iGIVNT9V+VHVpCxMx QS1lhsAdvPiK25Zo5ac2yHOOnsa/6of9ixBRQvqulThUTg+hATQJT6BPYh1AvH1WepLSwTLOX3U1+ RjOg8pLHZxaMbiq6b9vyyAZ5qY4saSErMWVv6eYM21wwWa/KI7J9lMrzDo1A2yFwEcA1NG9IYO6sU hgJWIkL4vc/F7kvURn6ETdXRx6sIQLqkaAIOrHJN4cfmLCCReMFgNgbxQaA2ZiwUdp/zNxgGFO4NY mF79UGfr3JJiE6dEFIdw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qZDGV-003SXF-26; Thu, 24 Aug 2023 16:32:59 +0000 Received: from relay9-d.mail.gandi.net ([2001:4b98:dc4:8::229]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qZDGS-003SWs-0n for linux-arm-kernel@lists.infradead.org; Thu, 24 Aug 2023 16:32:58 +0000 Received: by mail.gandi.net (Postfix) with ESMTPSA id E7751FF805; Thu, 24 Aug 2023 16:32:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1692894771; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=bsZa7pZKZNbOWTMTAuaVYbIB0/GSiNJq7wZvQfer+ls=; b=nFqLNEvPxHjcfURhNwgVrXak5QCYFYuY/xVoa2IdayasepT7+bAW6cycLkh5qxW2v/blqb tIm3mQ5Vd8ytwAOyuhV3ZZOGkBO2OUcbGr1ZxCrLKW+ptuNJt4wNaLv3Xiq43vbcUs4q7h vfD5hXaYwMqEzhVXe+iOUgiiyYBTQr5qnIFUytGfxXFyG5bPC9G49VMll2D7OxAI1LWeVR PjTqnx2eyDwQWulJUtPAco2jbccZtAXUjq6YsfYQFfCqo/PvOaqu9s7dedj24KU02U8dGc 5/DxtsUwOk7cg6s2XKm6BNMJ58dM27YmcBy9wLVI0DkEMhSL4xig+IzZEYRZzw== Date: Thu, 24 Aug 2023 18:32:45 +0200 From: Herve Codina To: Christophe JAILLET Cc: Christophe Leroy , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Andrew Lunn , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Lee Jones , Linus Walleij , Qiang Zhao , Li Yang , Liam Girdwood , Mark Brown , Jaroslav Kysela , Takashi Iwai , Shengjiu Wang , Xiubo Li , Fabio Estevam , Nicolin Chen , netdev@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-gpio@vger.kernel.org, linux-arm-kernel@lists.infradead.org, alsa-devel@alsa-project.org, Thomas Petazzoni Subject: Re: [PATCH v4 20/28] wan: qmc_hdlc: Add runtime timeslots changes support Message-ID: <20230824183245.26bea22a@bootlin.com> In-Reply-To: References: <1364a0742fc76e7d275273dbbc4c97b008ec70a5.1692376361.git.christophe.leroy@csgroup.eu> Organization: Bootlin X-Mailer: Claws Mail 4.1.1 (GTK 3.24.38; x86_64-redhat-linux-gnu) MIME-Version: 1.0 X-GND-Sasl: herve.codina@bootlin.com X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230824_093256_595133_7C9A9AD3 X-CRM114-Status: GOOD ( 29.36 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org SGkgQ2hyaXN0b3BoZSwKCk9uIE1vbiwgMjEgQXVnIDIwMjMgMDc6NDA6MjYgKzAyMDAKQ2hyaXN0 b3BoZSBKQUlMTEVUIDxjaHJpc3RvcGhlLmphaWxsZXRAd2FuYWRvby5mcj4gd3JvdGU6Cgo+IExl IDE4LzA4LzIwMjMgw6AgMTg6MzksIENocmlzdG9waGUgTGVyb3kgYSDDqWNyaXTCoDoKPiA+IEZy b206IEhlcnZlIENvZGluYSA8aGVydmUuY29kaW5hQGJvb3RsaW4uY29tPgo+ID4gCj4gPiBRTUMg Y2hhbm5lbHMgc3VwcG9ydCBydW50aW1lIHRpbWVzbG90cyBjaGFuZ2VzIGJ1dCBub3RoaW5nIGlz IGRvbmUgYXQKPiA+IHRoZSBRTUMgSERMQyBkcml2ZXIgdG8gaGFuZGxlIHRoZXNlIGNoYW5nZXMu Cj4gPiAKPiA+IFVzZSBleGlzdGluZyBJRkFDRSBpb2N0bCBpbiBvcmRlciB0byBjb25maWd1cmUg dGhlIHRpbWVzbG90cyB0byB1c2UuCj4gPiAKPiA+IFNpZ25lZC1vZmYtYnk6IEhlcnZlIENvZGlu YSA8aGVydmUuY29kaW5hQGJvb3RsaW4uY29tPgo+ID4gUmV2aWV3ZWQtYnk6IENocmlzdG9waGUg TGVyb3kgPGNocmlzdG9waGUubGVyb3lAY3Nncm91cC5ldT4KPiA+IFNpZ25lZC1vZmYtYnk6IENo cmlzdG9waGUgTGVyb3kgPGNocmlzdG9waGUubGVyb3lAY3Nncm91cC5ldT4KPiA+IC0tLSAgCj4g Cj4gSGksCj4gCj4gYSBmZXcgbml0cyBiZWxvdywgc2hvdWxkIHRoZXJlIGJlIGEgdjUuCj4gCj4g PiAgIGRyaXZlcnMvbmV0L3dhbi9mc2xfcW1jX2hkbGMuYyB8IDE2OSArKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKy0KPiA+ICAgMSBmaWxlIGNoYW5nZWQsIDE2OCBpbnNlcnRpb25zKCsp LCAxIGRlbGV0aW9uKC0pCj4gPiAKPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vZnNs X3FtY19oZGxjLmMgYi9kcml2ZXJzL25ldC93YW4vZnNsX3FtY19oZGxjLmMKPiA+IGluZGV4IDRm ODRhYzVmYzYzZS4uNGI4Y2I1NzYxZmQxIDEwMDY0NAo+ID4gLS0tIGEvZHJpdmVycy9uZXQvd2Fu L2ZzbF9xbWNfaGRsYy5jCj4gPiArKysgYi9kcml2ZXJzL25ldC93YW4vZnNsX3FtY19oZGxjLmMK PiA+IEBAIC0zMiw2ICszMiw3IEBAIHN0cnVjdCBxbWNfaGRsYyB7Cj4gPiAgIAlzdHJ1Y3QgcW1j X2hkbGNfZGVzYyB0eF9kZXNjc1s4XTsKPiA+ICAgCXVuc2lnbmVkIGludCB0eF9vdXQ7Cj4gPiAg IAlzdHJ1Y3QgcW1jX2hkbGNfZGVzYyByeF9kZXNjc1s0XTsKPiA+ICsJdTMyIHNsb3RfbWFwOwo+ ID4gICB9Owo+ID4gICAKPiA+ICAgc3RhdGljIGlubGluZSBzdHJ1Y3QgcW1jX2hkbGMgKm5ldGRl dl90b19xbWNfaGRsYyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQo+ID4gQEAgLTIwMiw2ICsy MDMsMTYyIEBAIHN0YXRpYyBuZXRkZXZfdHhfdCBxbWNfaGRsY194bWl0KHN0cnVjdCBza19idWZm ICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCj4gPiAgIAlyZXR1cm4gTkVUREVWX1RY X09LOwo+ID4gICB9Cj4gPiAgIAo+ID4gK3N0YXRpYyBpbnQgcW1jX2hkbGNfeGxhdGVfc2xvdF9t YXAoc3RydWN0IHFtY19oZGxjICpxbWNfaGRsYywKPiA+ICsJCQkJICAgdTMyIHNsb3RfbWFwLCBz dHJ1Y3QgcW1jX2NoYW5fdHNfaW5mbyAqdHNfaW5mbykKPiA+ICt7Cj4gPiArCXU2NCB0c19tYXNr X2F2YWlsOwo+ID4gKwl1bnNpZ25lZCBpbnQgYml0Owo+ID4gKwl1bnNpZ25lZCBpbnQgaTsKPiA+ ICsJdTY0IHRzX21hc2s7Cj4gPiArCXU2NCBtYXAgPSAwOyAgCj4gCj4gVGhpcyBpbml0IGxvb2tz IHVzZWxlc3MuCgpXaWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgaXRlcmF0aW9uLgoKPiAKPiA+ ICsKPiA+ICsJLyogVHggYW5kIFJ4IG1hc2tzIG11c3QgYmUgaWRlbnRpY2FsICovCj4gPiArCWlm ICh0c19pbmZvLT5yeF90c19tYXNrX2F2YWlsICE9IHRzX2luZm8tPnR4X3RzX21hc2tfYXZhaWwp IHsKPiA+ICsJCWRldl9lcnIocW1jX2hkbGMtPmRldiwgInR4IGFuZCByeCBhdmFpbGFibGUgdGlt ZXNsb3RzIG1pc21hdGNoICgweCVsbHgsIDB4JWxseClcbiIsCj4gPiArCQkJdHNfaW5mby0+cnhf dHNfbWFza19hdmFpbCwgdHNfaW5mby0+dHhfdHNfbWFza19hdmFpbCk7Cj4gPiArCQlyZXR1cm4g LUVJTlZBTDsKPiA+ICsJfQo+ID4gKwo+ID4gKwl0c19tYXNrX2F2YWlsID0gdHNfaW5mby0+cnhf dHNfbWFza19hdmFpbDsKPiA+ICsJdHNfbWFzayA9IDA7Cj4gPiArCW1hcCA9IHNsb3RfbWFwOwo+ ID4gKwliaXQgPSAwOwo+ID4gKwlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgewo+ID4gKwkJaWYg KHRzX21hc2tfYXZhaWwgJiBCSVRfVUxMKGkpKSB7Cj4gPiArCQkJaWYgKG1hcCAmIEJJVF9VTEwo Yml0KSkKPiA+ICsJCQkJdHNfbWFzayB8PSBCSVRfVUxMKGkpOwo+ID4gKwkJCWJpdCsrOwo+ID4g KwkJfQo+ID4gKwl9Cj4gPiArCj4gPiArCWlmIChod2VpZ2h0NjQodHNfbWFzaykgIT0gaHdlaWdo dDY0KG1hcCkpIHsKPiA+ICsJCWRldl9lcnIocW1jX2hkbGMtPmRldiwgIkNhbm5vdCB0cmFuc2xh dGUgdGltZXNsb3RzIDB4JWxseCAtPiAoMHglbGx4LDB4JWxseClcbiIsCj4gPiArCQkJbWFwLCB0 c19tYXNrX2F2YWlsLCB0c19tYXNrKTsKPiA+ICsJCXJldHVybiAtRUlOVkFMOwo+ID4gKwl9Cj4g PiArCj4gPiArCXRzX2luZm8tPnR4X3RzX21hc2sgPSB0c19tYXNrOwo+ID4gKwl0c19pbmZvLT5y eF90c19tYXNrID0gdHNfbWFzazsKPiA+ICsJcmV0dXJuIDA7Cj4gPiArfQo+ID4gKwo+ID4gK3N0 YXRpYyBpbnQgcW1jX2hkbGNfeGxhdGVfdHNfaW5mbyhzdHJ1Y3QgcW1jX2hkbGMgKnFtY19oZGxj LAo+ID4gKwkJCQkgIGNvbnN0IHN0cnVjdCBxbWNfY2hhbl90c19pbmZvICp0c19pbmZvLCB1MzIg KnNsb3RfbWFwKQo+ID4gK3sKPiA+ICsJdTY0IHRzX21hc2tfYXZhaWw7Cj4gPiArCXVuc2lnbmVk IGludCBiaXQ7Cj4gPiArCXVuc2lnbmVkIGludCBpOwo+ID4gKwl1NjQgdHNfbWFzazsKPiA+ICsJ dTY0IG1hcCA9IDA7ICAKPiAKPiBUaGlzIGluaXQgbG9va3MgdXNlbGVzcy4KCldpbGwgYmUgcmVt b3ZlIGluIHRoZSBuZXh0IGl0ZXJhdGlvbi4KCj4gCj4gPiArCj4gPiArCS8qIFR4IGFuZCBSeCBt YXNrcyBtdXN0IGJlIGlkZW50aWNhbCAqLwo+ID4gKwlpZiAodHNfaW5mby0+cnhfdHNfbWFza19h dmFpbCAhPSB0c19pbmZvLT50eF90c19tYXNrX2F2YWlsKSB7Cj4gPiArCQlkZXZfZXJyKHFtY19o ZGxjLT5kZXYsICJ0eCBhbmQgcnggYXZhaWxhYmxlIHRpbWVzbG90cyBtaXNtYXRjaCAoMHglbGx4 LCAweCVsbHgpXG4iLAo+ID4gKwkJCXRzX2luZm8tPnJ4X3RzX21hc2tfYXZhaWwsIHRzX2luZm8t PnR4X3RzX21hc2tfYXZhaWwpOwo+ID4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gPiArCX0KPiA+ICsJ aWYgKHRzX2luZm8tPnJ4X3RzX21hc2sgIT0gdHNfaW5mby0+dHhfdHNfbWFzaykgewo+ID4gKwkJ ZGV2X2VycihxbWNfaGRsYy0+ZGV2LCAidHggYW5kIHJ4IHRpbWVzbG90cyBtaXNtYXRjaCAoMHgl bGx4LCAweCVsbHgpXG4iLAo+ID4gKwkJCXRzX2luZm8tPnJ4X3RzX21hc2ssIHRzX2luZm8tPnR4 X3RzX21hc2spOwo+ID4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gPiArCX0KPiA+ICsKPiA+ICsJdHNf bWFza19hdmFpbCA9IHRzX2luZm8tPnJ4X3RzX21hc2tfYXZhaWw7Cj4gPiArCXRzX21hc2sgPSB0 c19pbmZvLT5yeF90c19tYXNrOwo+ID4gKwltYXAgPSAwOwo+ID4gKwliaXQgPSAwOwo+ID4gKwlm b3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgewo+ID4gKwkJaWYgKHRzX21hc2tfYXZhaWwgJiBCSVRf VUxMKGkpKSB7Cj4gPiArCQkJaWYgKHRzX21hc2sgJiBCSVRfVUxMKGkpKQo+ID4gKwkJCQltYXAg fD0gQklUX1VMTChiaXQpOwo+ID4gKwkJCWJpdCsrOwo+ID4gKwkJfQo+ID4gKwl9Cj4gPiArCj4g PiArCWlmIChod2VpZ2h0NjQodHNfbWFzaykgIT0gaHdlaWdodDY0KG1hcCkpIHsKPiA+ICsJCWRl dl9lcnIocW1jX2hkbGMtPmRldiwgIkNhbm5vdCB0cmFuc2xhdGUgdGltZXNsb3RzICgweCVsbHgs MHglbGx4KSAtPiAweCVsbHhcbiIsCj4gPiArCQkJdHNfbWFza19hdmFpbCwgdHNfbWFzaywgbWFw KTsKPiA+ICsJCXJldHVybiAtRUlOVkFMOwo+ID4gKwl9Cj4gPiArCj4gPiArCWlmIChtYXAgPj0g QklUX1VMTCgzMikpIHsKPiA+ICsJCWRldl9lcnIocW1jX2hkbGMtPmRldiwgIlNsb3QgbWFwIG91 dCBvZiAzMmJpdCAoMHglbGx4LDB4JWxseCkgLT4gMHglbGx4XG4iLAo+ID4gKwkJCXRzX21hc2tf YXZhaWwsIHRzX21hc2ssIG1hcCk7Cj4gPiArCQlyZXR1cm4gLUVJTlZBTDsKPiA+ICsJfQo+ID4g Kwo+ID4gKwkqc2xvdF9tYXAgPSBtYXA7Cj4gPiArCXJldHVybiAwOwo+ID4gK30gIAo+IAo+IC4u Lgo+IAo+ID4gK3N0YXRpYyBpbnQgcW1jX2hkbGNfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKm5l dGRldiwgc3RydWN0IGlmX3NldHRpbmdzICppZnMpCj4gPiArewo+ID4gKwlzdHJ1Y3QgcW1jX2hk bGMgKnFtY19oZGxjID0gbmV0ZGV2X3RvX3FtY19oZGxjKG5ldGRldik7Cj4gPiArCXRlMV9zZXR0 aW5ncyB0ZTE7Cj4gPiArCj4gPiArCXN3aXRjaCAoaWZzLT50eXBlKSB7Cj4gPiArCWNhc2UgSUZf R0VUX0lGQUNFOgo+ID4gKwkJaWZzLT50eXBlID0gSUZfSUZBQ0VfRTE7Cj4gPiArCQlpZiAoaWZz LT5zaXplIDwgc2l6ZW9mKHRlMSkpIHsKPiA+ICsJCQlpZiAoIWlmcy0+c2l6ZSkKPiA+ICsJCQkJ cmV0dXJuIDA7IC8qIG9ubHkgdHlwZSByZXF1ZXN0ZWQgKi8KPiA+ICsKPiA+ICsJCQlpZnMtPnNp emUgPSBzaXplb2YodGUxKTsgLyogZGF0YSBzaXplIHdhbnRlZCAqLwo+ID4gKwkJCXJldHVybiAt RU5PQlVGUzsKPiA+ICsJCX0KPiA+ICsKPiA+ICsJCW1lbXNldCgmdGUxLCAwLCBzaXplb2YodGUx KSk7Cj4gPiArCj4gPiArCQkvKiBVcGRhdGUgc2xvdF9tYXAgKi8KPiA+ICsJCXRlMS5zbG90X21h cCA9IHFtY19oZGxjLT5zbG90X21hcDsKPiA+ICsKPiA+ICsJCWlmIChjb3B5X3RvX3VzZXIoaWZz LT5pZnNfaWZzdS50ZTEsICZ0ZTEsICBzaXplb2YodGUxKSkpICAKPiAKPiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfn4KPiBFeHRyYSBz cGFjZS4KCldpbGwgYmUgZml4ZWQgaW4gdGhlIG5leHQgaXRlcmF0aW9uLgoKPiAKPiA+ICsJCQly ZXR1cm4gLUVGQVVMVDsKPiA+ICsJCXJldHVybiAwOwo+ID4gKwo+ID4gKwljYXNlIElGX0lGQUNF X0UxOgo+ID4gKwljYXNlIElGX0lGQUNFX1QxOgo+ID4gKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRf QURNSU4pKQo+ID4gKwkJCXJldHVybiAtRVBFUk07Cj4gPiArCj4gPiArCQlpZiAobmV0ZGV2LT5m bGFncyAmIElGRl9VUCkKPiA+ICsJCQlyZXR1cm4gLUVCVVNZOwo+ID4gKwo+ID4gKwkJaWYgKGNv cHlfZnJvbV91c2VyKCZ0ZTEsIGlmcy0+aWZzX2lmc3UudGUxLCBzaXplb2YodGUxKSkpCj4gPiAr CQkJcmV0dXJuIC1FRkFVTFQ7Cj4gPiArCj4gPiArCQlyZXR1cm4gcW1jX2hkbGNfc2V0X2lmYWNl KHFtY19oZGxjLCBpZnMtPnR5cGUsICZ0ZTEpOwo+ID4gKwo+ID4gKwlkZWZhdWx0Ogo+ID4gKwkJ cmV0dXJuIGhkbGNfaW9jdGwobmV0ZGV2LCBpZnMpOwo+ID4gKwl9Cj4gPiArfSAgCj4gCj4gLi4u Cj4gCgpUaGFua3MgZm9yIHRoZSByZXZpZXcsCkJlc3QgcmVnYXJkcywKSGVydsOpCgotLSAKSGVy dsOpIENvZGluYSwgQm9vdGxpbgpFbWJlZGRlZCBMaW51eCBhbmQgS2VybmVsIGVuZ2luZWVyaW5n Cmh0dHBzOi8vYm9vdGxpbi5jb20KCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJu ZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFu L2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK