Skip to content

Commit

Permalink
tty: n_gsm: add ioctl to map serial device to mux'ed tty
Browse files Browse the repository at this point in the history
Guessing the first 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 an ioctl.

Signed-off-by: Martin Hundebøll <martin@geanix.com>
Link: https://lore.kernel.org/r/20190812211243.98686-1-martin@geanix.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Martin Hundebøll authored and Greg Kroah-Hartman committed Sep 4, 2019
1 parent d193db7 commit a7b121b
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 2 deletions.
11 changes: 9 additions & 2 deletions Documentation/driver-api/serial/n_gsm.rst
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,13 @@ 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 <stdint.h>
#include <linux/gsmmux.h>
#include <linux/tty.h>
#define DEFAULT_SPEED B115200
Expand All @@ -30,6 +33,7 @@ Major parts of the initialization program :
int ldisc = N_GSM0710;
struct gsm_config c;
struct termios configuration;
uint32_t first;

/* open the serial port connected to the modem */
fd = open(SERIAL_PORT, O_RDWR | O_NOCTTY | O_NDELAY);
Expand Down Expand Up @@ -58,19 +62,22 @@ Major parts of the initialization program :
c.mtu = 127;
/* set the new configuration */
ioctl(fd, GSMIOC_SETCONF, &c);
/* get first gsmtty device node */
ioctl(fd, GSMIOC_GETFIRST, &first);
printf("first muxed line: /dev/gsmtty%i\n", first);

/* 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
Expand Down
4 changes: 4 additions & 0 deletions drivers/tty/n_gsm.c
Original file line number Diff line number Diff line change
Expand Up @@ -2613,6 +2613,7 @@ static int gsmld_ioctl(struct tty_struct *tty, struct file *file,
{
struct gsm_config c;
struct gsm_mux *gsm = tty->disc_data;
unsigned int base;

switch (cmd) {
case GSMIOC_GETCONF:
Expand All @@ -2624,6 +2625,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_GETFIRST:
base = mux_num_to_base(gsm);
return put_user(base + 1, (__u32 __user *)arg);
default:
return n_tty_ioctl_helper(tty, file, cmd, arg);
}
Expand Down
2 changes: 2 additions & 0 deletions include/uapi/linux/gsmmux.h
Original file line number Diff line number Diff line change
Expand Up @@ -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_GETFIRST _IOR('G', 4, __u32)

#endif

0 comments on commit a7b121b

Please sign in to comment.