From patchwork Mon Feb 6 11:46:06 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "D. Starke" X-Patchwork-Id: 53198 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:eb09:0:0:0:0:0 with SMTP id s9csp2188921wrn; Mon, 6 Feb 2023 03:54:45 -0800 (PST) X-Google-Smtp-Source: AK7set9e3vSAlVa3073VRezTctDfuKUQCaKTLObxry5dONTAN4FDqg0Zd1aHm4dhfLgeeiS6s0b3 X-Received: by 2002:a17:906:6886:b0:887:8f6:c1d7 with SMTP id n6-20020a170906688600b0088708f6c1d7mr18025559ejr.38.1675684485644; Mon, 06 Feb 2023 03:54:45 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1675684485; cv=none; d=google.com; s=arc-20160816; b=UfGeZ7tmI19R3Sr7BHK3xZDRp34I8RoAuQJ7uwyiVqSwYtvulJVSg7M4CuMKu5ZRz6 jDeaV3cs3fp1Wc+MaRZ56EJYRORJOmpvedPgWsa6UvkYu71N+SpQcijoBOfNuGVFbF2K l9o2YBc+ojt0Wll10mAxYt698SF/pRjLaiFaF3FrVAWQVuXb1Lt8Wkspi7RPotTz7LwR Frk70UH9lHHu8XWSoxA9M1t+nfxsNZjSiURl4d4IHORqZlFAI+QgCME3/65lywNThLI0 3/x7BHQpeYv98Vmc9u8KSY6xhw9r3xQfvn7ryyXX3+Mk5Md68WL1ew+hOCcBX37UGbsm iGSA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:feedback-id:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=domF8YVtcGEgafqQbH+2EimrKfYiC4Tyhq8j6uN7Cl8=; b=itEn/6hOBLtfG5poItCvQGWzGlWn6M2KUiVEjZ595cgdUufL0tYo/wLD96cNM2mIey 3Cfyzf7jc2pH0oz065B/SV/Fbiec4iBXNfSlUY57WWAwYSveQ1GevSzZ0/IblJFExRZ7 bSbS4Kfl8CZmI5AWV+0QFnC3SbwEk0UOpT27hLVSH86ACNi990tuh236f4YhZ6IaEIKT 5yymjbwo/5fqTWKPGdsfwjGkH6r4px3BMlRcQiEmFr7u0dNISLBJr8cgsaQ+e/jb9jv3 GWnrxAylmr8ljIrhh4P6eiCSFELX9D8a40bCsvQpZXvlq6OZqZkwZWYGRnfBGFBud3di 5sfQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@siemens.com header.s=fm1 header.b=G3QSpwrV; 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=NONE sp=NONE dis=NONE) header.from=siemens.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id j17-20020a05640211d100b004a24e51305esi16478375edw.111.2023.02.06.03.54.22; Mon, 06 Feb 2023 03:54:45 -0800 (PST) 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=@siemens.com header.s=fm1 header.b=G3QSpwrV; 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=NONE sp=NONE dis=NONE) header.from=siemens.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229868AbjBFLrs (ORCPT + 99 others); Mon, 6 Feb 2023 06:47:48 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57438 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229942AbjBFLrl (ORCPT ); Mon, 6 Feb 2023 06:47:41 -0500 Received: from mta-65-225.siemens.flowmailer.net (mta-65-225.siemens.flowmailer.net [185.136.65.225]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 80777B760 for ; Mon, 6 Feb 2023 03:47:40 -0800 (PST) Received: by mta-65-225.siemens.flowmailer.net with ESMTPSA id 20230206114738d5142321c9338b5a31 for ; Mon, 06 Feb 2023 12:47:38 +0100 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; s=fm1; d=siemens.com; i=daniel.starke@siemens.com; h=Date:From:Subject:To:Message-ID:MIME-Version:Content-Type:Content-Transfer-Encoding:Cc:References:In-Reply-To; bh=domF8YVtcGEgafqQbH+2EimrKfYiC4Tyhq8j6uN7Cl8=; b=G3QSpwrViFPBEsQfV/TVUPLvxOREDjSYVk8g7XNjwMOmS4oV6KNiEwVvsfZsBCgyiW56aI pbynbUEVI3mVskAoKL3/KN7nBaGKLCmYoNAFVF4xuRGDKcajeJb9xH7iVaa3Clpt3Cn5QClk G1ONb7BIHH1A0kZ8FppdC2N0XBmFU=; From: "D. Starke" To: linux-serial@vger.kernel.org, gregkh@linuxfoundation.org, jirislaby@kernel.org, ilpo.jarvinen@linux.intel.com Cc: linux-kernel@vger.kernel.org, Daniel Starke Subject: [PATCH v4 4/4] tty: n_gsm: add TIOCMIWAIT support Date: Mon, 6 Feb 2023 12:46:06 +0100 Message-Id: <20230206114606.2133-4-daniel.starke@siemens.com> In-Reply-To: <20230206114606.2133-1-daniel.starke@siemens.com> References: <20230206114606.2133-1-daniel.starke@siemens.com> MIME-Version: 1.0 X-Flowmailer-Platform: Siemens Feedback-ID: 519:519-314044:519-21489:flowmailer X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_MSPIKE_H2, SPF_HELO_NONE,SPF_PASS autolearn=unavailable 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 X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1757082534817426310?= X-GMAIL-MSGID: =?utf-8?q?1757082534817426310?= From: Daniel Starke Add support for the TIOCMIWAIT ioctl on the virtual ttys. This enables the user to wait for virtual modem signals like RING. More work is needed to support also TIOCGICOUNT. Signed-off-by: Daniel Starke --- drivers/tty/n_gsm.c | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) v3 -> v4: No changes. Link: https://lore.kernel.org/all/20230203145023.6012-4-daniel.starke@siemens.com/ diff --git a/drivers/tty/n_gsm.c b/drivers/tty/n_gsm.c index 79efbfd27171..e405d76cb696 100644 --- a/drivers/tty/n_gsm.c +++ b/drivers/tty/n_gsm.c @@ -1542,6 +1542,7 @@ static void gsm_process_modem(struct tty_struct *tty, struct gsm_dlci *dlci, if (brk & 0x01) tty_insert_flip_char(&dlci->port, 0, TTY_BREAK); dlci->modem_rx = mlines; + wake_up_interruptible(&dlci->gsm->event); } /** @@ -2129,7 +2130,7 @@ static void gsm_dlci_close(struct gsm_dlci *dlci) /* A DLCI 0 close is a MUX termination so we need to kick that back to userspace somehow */ gsm_dlci_data_kick(dlci); - wake_up(&dlci->gsm->event); + wake_up_all(&dlci->gsm->event); } /** @@ -2339,6 +2340,7 @@ static void gsm_dlci_begin_close(struct gsm_dlci *dlci) dlci->state = DLCI_CLOSING; gsm_command(dlci->gsm, dlci->addr, DISC|PF); mod_timer(&dlci->t1, jiffies + gsm->t1 * HZ / 100); + wake_up_interruptible(&gsm->event); } /** @@ -3878,6 +3880,33 @@ static int gsm_modem_update(struct gsm_dlci *dlci, u8 brk) return -EPROTONOSUPPORT; } +/** + * gsm_wait_modem_change - wait for modem status line change + * @dlci: channel + * @mask: modem status line bits + * + * The function returns if: + * - any given modem status line bit changed + * - the wait event function got interrupted (e.g. by a signal) + * - the underlying DLCI was closed + * - the underlying ldisc device was removed + */ +static int gsm_wait_modem_change(struct gsm_dlci *dlci, u32 mask) +{ + struct gsm_mux *gsm = dlci->gsm; + u32 old = dlci->modem_rx; + int ret; + + ret = wait_event_interruptible(gsm->event, gsm->dead || + dlci->state != DLCI_OPEN || + (old ^ dlci->modem_rx) & mask); + if (gsm->dead) + return -ENODEV; + if (dlci->state != DLCI_OPEN) + return -EL2NSYNC; + return ret; +} + static bool gsm_carrier_raised(struct tty_port *port) { struct gsm_dlci *dlci = container_of(port, struct gsm_dlci, port); @@ -4137,6 +4166,8 @@ static int gsmtty_ioctl(struct tty_struct *tty, gsm_destroy_network(dlci); mutex_unlock(&dlci->mutex); return 0; + case TIOCMIWAIT: + return gsm_wait_modem_change(dlci, (u32)arg); default: return -ENOIOCTLCMD; }