linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Martin Hundebøll" <martin@geanix.com>
To: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Jiri Slaby <jslaby@suse.com>,
	linux-kernel@vger.kernel.org
Cc: "Martin Hundebøll" <martin@geanix.com>,
	"Sean Nyekjær" <sean@geanix.com>,
	"Esben Haabendal" <esben@geanix.com>
Subject: [PATCHv2 4/4] tty: n_gsm: add ioctl to map serial device to mux'ed tty
Date: Tue,  9 Jul 2019 08:46:33 +0200	[thread overview]
Message-ID: <20190709064633.45411-4-martin@geanix.com> (raw)
In-Reply-To: <20190709064633.45411-1-martin@geanix.com>

Guessing the base tty for a gsm0710 multiplexed serial device is not
currently possible, which makes it racy to use with multiple modems.

Add a way to map the physical serial tty to its related mux devices
using a ioctl.

Signed-off-by: Martin Hundebøll <martin@geanix.com>
---

Changes since v1:
 * use put_user() instead of copy_to_user()
 * add missing opening quote

 Documentation/serial/n_gsm.rst | 12 ++++++++++--
 drivers/tty/n_gsm.c            |  4 ++++
 include/uapi/linux/gsmmux.h    |  2 ++
 3 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/Documentation/serial/n_gsm.rst b/Documentation/serial/n_gsm.rst
index 0ba731ab00b2..4a52499567f5 100644
--- a/Documentation/serial/n_gsm.rst
+++ b/Documentation/serial/n_gsm.rst
@@ -18,10 +18,12 @@ How to use it
 2. switch the serial line to using the n_gsm line discipline by using
    TIOCSETD ioctl,
 3. configure the mux using GSMIOC_GETCONF / GSMIOC_SETCONF ioctl,
+4. obtain base gsmtty number for the used serial port,
 
 Major parts of the initialization program :
 (a good starting point is util-linux-ng/sys-utils/ldattach.c)::
 
+  #include <stdio.h>
   #include <linux/gsmmux.h>
   #include <linux/tty.h>
   #define DEFAULT_SPEED	B115200
@@ -30,6 +32,7 @@ Major parts of the initialization program :
 	int ldisc = N_GSM0710;
 	struct gsm_config c;
 	struct termios configuration;
+	int base;
 
 	/* open the serial port connected to the modem */
 	fd = open(SERIAL_PORT, O_RDWR | O_NOCTTY | O_NDELAY);
@@ -58,19 +61,24 @@ Major parts of the initialization program :
 	c.mtu = 127;
 	/* set the new configuration */
 	ioctl(fd, GSMIOC_SETCONF, &c);
+	/* get base gsmtty device node */
+	ioctl(fd, GSMIOC_GETBASE, &base);
+	/* the base node is used for mux control by the driver */
+	printf("first muxed line: /dev/gsmtty%i\n", base + 1);
+
 
 	/* and wait for ever to keep the line discipline enabled */
 	daemon(0,0);
 	pause();
 
-4. use these devices as plain serial ports.
+5. use these devices as plain serial ports.
 
    for example, it's possible:
 
    - and to use gnokii to send / receive SMS on ttygsm1
    - to use ppp to establish a datalink on ttygsm2
 
-5. first close all virtual ports before closing the physical port.
+6. first close all virtual ports before closing the physical port.
 
    Note that after closing the physical port the modem is still in multiplexing
    mode. This may prevent a successful re-opening of the port later. To avoid
diff --git a/drivers/tty/n_gsm.c b/drivers/tty/n_gsm.c
index cba06063c44a..e7aea4ccbebd 100644
--- a/drivers/tty/n_gsm.c
+++ b/drivers/tty/n_gsm.c
@@ -2612,6 +2612,7 @@ static int gsmld_ioctl(struct tty_struct *tty, struct file *file,
 {
 	struct gsm_config c;
 	struct gsm_mux *gsm = tty->disc_data;
+	int base;
 
 	switch (cmd) {
 	case GSMIOC_GETCONF:
@@ -2623,6 +2624,9 @@ static int gsmld_ioctl(struct tty_struct *tty, struct file *file,
 		if (copy_from_user(&c, (void *)arg, sizeof(c)))
 			return -EFAULT;
 		return gsm_config(gsm, &c);
+	case GSMIOC_GETBASE:
+		base = mux_num_to_base(gsm);
+		return put_user(base, (int __user *)arg);
 	default:
 		return n_tty_ioctl_helper(tty, file, cmd, arg);
 	}
diff --git a/include/uapi/linux/gsmmux.h b/include/uapi/linux/gsmmux.h
index 101d3c469acb..6eb63be3ed9e 100644
--- a/include/uapi/linux/gsmmux.h
+++ b/include/uapi/linux/gsmmux.h
@@ -37,5 +37,7 @@ struct gsm_netconfig {
 #define GSMIOC_ENABLE_NET      _IOW('G', 2, struct gsm_netconfig)
 #define GSMIOC_DISABLE_NET     _IO('G', 3)
 
+/* get the base tty number for a configured gsmmux tty */
+#define GSMIOC_GETBASE		_IOR('G', 4, int)
 
 #endif
-- 
2.22.0


  parent reply	other threads:[~2019-07-09  6:46 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-07-09  6:46 [PATCHv2 1/4] tty: n_gsm: remove obsolete mknod doc example Martin Hundebøll
2019-07-09  6:46 ` [PATCHv2 2/4] tty: n_gsm: update doc example to use header for N_GSM0710 define Martin Hundebøll
2019-07-09  6:46 ` [PATCHv2 3/4] tty: n_gsm: add helper to convert mux-num to/from tty-base Martin Hundebøll
2019-07-10 11:48   ` Alan Cox
2019-07-09  6:46 ` Martin Hundebøll [this message]
2019-07-09  6:49   ` [PATCHv2 4/4] tty: n_gsm: add ioctl to map serial device to mux'ed tty Jiri Slaby
2019-07-09  6:52     ` Martin Hundebøll

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190709064633.45411-4-martin@geanix.com \
    --to=martin@geanix.com \
    --cc=esben@geanix.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=jslaby@suse.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=sean@geanix.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).