blob: 05562b3cca451a9bf5549a9edb6c3e9530653797 [file] [log] [blame]
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001// SPDX-License-Identifier: GPL-2.0
2/*
3 * n_gsm.c GSM 0710 tty multiplexor
4 * Copyright (c) 2009/10 Intel Corporation
5 *
6 * * THIS IS A DEVELOPMENT SNAPSHOT IT IS NOT A FINAL RELEASE *
7 *
8 * TO DO:
9 * Mostly done: ioctls for setting modes/timing
10 * Partly done: hooks so you can pull off frames to non tty devs
11 * Restart DLCI 0 when it closes ?
12 * Improve the tx engine
13 * Resolve tx side locking by adding a queue_head and routing
14 * all control traffic via it
15 * General tidy/document
16 * Review the locking/move to refcounts more (mux now moved to an
17 * alloc/free model ready)
18 * Use newest tty open/close port helpers and install hooks
19 * What to do about power functions ?
20 * Termios setting and negotiation
21 * Do we need a 'which mux are you' ioctl to correlate mux and tty sets
22 *
23 */
24
25#include <linux/types.h>
26#include <linux/major.h>
27#include <linux/errno.h>
28#include <linux/signal.h>
29#include <linux/fcntl.h>
30#include <linux/sched/signal.h>
31#include <linux/interrupt.h>
32#include <linux/tty.h>
33#include <linux/ctype.h>
34#include <linux/mm.h>
35#include <linux/string.h>
36#include <linux/slab.h>
37#include <linux/poll.h>
38#include <linux/bitops.h>
39#include <linux/file.h>
40#include <linux/uaccess.h>
41#include <linux/module.h>
42#include <linux/timer.h>
43#include <linux/tty_flip.h>
44#include <linux/tty_driver.h>
45#include <linux/serial.h>
46#include <linux/kfifo.h>
47#include <linux/skbuff.h>
48#include <net/arp.h>
49#include <linux/ip.h>
50#include <linux/netdevice.h>
51#include <linux/etherdevice.h>
52#include <linux/gsmmux.h>
53
54static int debug;
55module_param(debug, int, 0600);
56
57/* Defaults: these are from the specification */
58
59#define T1 10 /* 100mS */
60#define T2 34 /* 333mS */
61#define N2 3 /* Retry 3 times */
62
63/* Use long timers for testing at low speed with debug on */
64#ifdef DEBUG_TIMING
65#define T1 100
66#define T2 200
67#endif
68
69/*
70 * Semi-arbitrary buffer size limits. 0710 is normally run with 32-64 byte
71 * limits so this is plenty
72 */
73#define MAX_MRU 1500
74#define MAX_MTU 1500
75#define GSM_NET_TX_TIMEOUT (HZ*10)
76
77/**
78 * struct gsm_mux_net - network interface
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000079 *
80 * Created when net interface is initialized.
Olivier Deprez157378f2022-04-04 15:47:50 +020081 */
Andrew Scullb4b6d4a2019-01-02 15:54:55 +000082struct gsm_mux_net {
83 struct kref ref;
84 struct gsm_dlci *dlci;
85};
86
87/*
88 * Each block of data we have queued to go out is in the form of
89 * a gsm_msg which holds everything we need in a link layer independent
90 * format
91 */
92
93struct gsm_msg {
94 struct list_head list;
95 u8 addr; /* DLCI address + flags */
96 u8 ctrl; /* Control byte + flags */
97 unsigned int len; /* Length of data block (can be zero) */
98 unsigned char *data; /* Points into buffer but not at the start */
Olivier Deprez157378f2022-04-04 15:47:50 +020099 unsigned char buffer[];
100};
101
102enum gsm_dlci_state {
103 DLCI_CLOSED,
104 DLCI_OPENING, /* Sending SABM not seen UA */
105 DLCI_OPEN, /* SABM/UA complete */
106 DLCI_CLOSING, /* Sending DISC not seen UA/DM */
107};
108
109enum gsm_dlci_mode {
110 DLCI_MODE_ABM, /* Normal Asynchronous Balanced Mode */
111 DLCI_MODE_ADM, /* Asynchronous Disconnected Mode */
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000112};
113
114/*
115 * Each active data link has a gsm_dlci structure associated which ties
116 * the link layer to an optional tty (if the tty side is open). To avoid
117 * complexity right now these are only ever freed up when the mux is
118 * shut down.
119 *
120 * At the moment we don't free DLCI objects until the mux is torn down
121 * this avoid object life time issues but might be worth review later.
122 */
123
124struct gsm_dlci {
125 struct gsm_mux *gsm;
126 int addr;
Olivier Deprez157378f2022-04-04 15:47:50 +0200127 enum gsm_dlci_state state;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000128 struct mutex mutex;
129
130 /* Link layer */
Olivier Deprez157378f2022-04-04 15:47:50 +0200131 enum gsm_dlci_mode mode;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000132 spinlock_t lock; /* Protects the internal state */
133 struct timer_list t1; /* Retransmit timer for SABM and UA */
134 int retries;
135 /* Uplink tty if active */
136 struct tty_port port; /* The tty bound to this DLCI if there is one */
Olivier Deprez157378f2022-04-04 15:47:50 +0200137 struct kfifo fifo; /* Queue fifo for the DLCI */
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000138 int adaption; /* Adaption layer in use */
139 int prev_adaption;
140 u32 modem_rx; /* Our incoming virtual modem lines */
141 u32 modem_tx; /* Our outgoing modem lines */
Olivier Deprez157378f2022-04-04 15:47:50 +0200142 bool dead; /* Refuse re-open */
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000143 /* Flow control */
Olivier Deprez157378f2022-04-04 15:47:50 +0200144 bool throttled; /* Private copy of throttle state */
145 bool constipated; /* Throttle status for outgoing */
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000146 /* Packetised I/O */
147 struct sk_buff *skb; /* Frame being sent */
148 struct sk_buff_head skb_list; /* Queued frames */
149 /* Data handling callback */
David Brazdil0f672f62019-12-10 10:32:29 +0000150 void (*data)(struct gsm_dlci *dlci, const u8 *data, int len);
151 void (*prev_data)(struct gsm_dlci *dlci, const u8 *data, int len);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000152 struct net_device *net; /* network interface, if created */
153};
154
155/* DLCI 0, 62/63 are special or reserved see gsmtty_open */
156
157#define NUM_DLCI 64
158
159/*
160 * DLCI 0 is used to pass control blocks out of band of the data
161 * flow (and with a higher link priority). One command can be outstanding
162 * at a time and we use this structure to manage them. They are created
163 * and destroyed by the user context, and updated by the receive paths
164 * and timers
165 */
166
167struct gsm_control {
168 u8 cmd; /* Command we are issuing */
169 u8 *data; /* Data for the command in case we retransmit */
170 int len; /* Length of block for retransmission */
171 int done; /* Done flag */
172 int error; /* Error if any */
173};
174
Olivier Deprez157378f2022-04-04 15:47:50 +0200175enum gsm_mux_state {
176 GSM_SEARCH,
177 GSM_START,
178 GSM_ADDRESS,
179 GSM_CONTROL,
180 GSM_LEN,
181 GSM_DATA,
182 GSM_FCS,
183 GSM_OVERRUN,
184 GSM_LEN0,
185 GSM_LEN1,
186 GSM_SSOF,
187};
188
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000189/*
190 * Each GSM mux we have is represented by this structure. If we are
191 * operating as an ldisc then we use this structure as our ldisc
192 * state. We need to sort out lifetimes and locking with respect
193 * to the gsm mux array. For now we don't free DLCI objects that
194 * have been instantiated until the mux itself is terminated.
195 *
196 * To consider further: tty open versus mux shutdown.
197 */
198
199struct gsm_mux {
200 struct tty_struct *tty; /* The tty our ldisc is bound to */
201 spinlock_t lock;
202 struct mutex mutex;
203 unsigned int num;
204 struct kref ref;
205
206 /* Events on the GSM channel */
207 wait_queue_head_t event;
208
209 /* Bits for GSM mode decoding */
210
211 /* Framing Layer */
212 unsigned char *buf;
Olivier Deprez157378f2022-04-04 15:47:50 +0200213 enum gsm_mux_state state;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000214 unsigned int len;
215 unsigned int address;
216 unsigned int count;
Olivier Deprez157378f2022-04-04 15:47:50 +0200217 bool escape;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000218 int encoding;
219 u8 control;
220 u8 fcs;
221 u8 received_fcs;
222 u8 *txframe; /* TX framing buffer */
223
Olivier Deprez157378f2022-04-04 15:47:50 +0200224 /* Method for the receiver side */
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000225 void (*receive)(struct gsm_mux *gsm, u8 ch);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000226
227 /* Link Layer */
228 unsigned int mru;
229 unsigned int mtu;
230 int initiator; /* Did we initiate connection */
Olivier Deprez157378f2022-04-04 15:47:50 +0200231 bool dead; /* Has the mux been shut down */
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000232 struct gsm_dlci *dlci[NUM_DLCI];
Olivier Deprez157378f2022-04-04 15:47:50 +0200233 bool constipated; /* Asked by remote to shut up */
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000234
235 spinlock_t tx_lock;
236 unsigned int tx_bytes; /* TX data outstanding */
237#define TX_THRESH_HI 8192
238#define TX_THRESH_LO 2048
239 struct list_head tx_list; /* Pending data packets */
240
241 /* Control messages */
242 struct timer_list t2_timer; /* Retransmit timer for commands */
243 int cretries; /* Command retry counter */
244 struct gsm_control *pending_cmd;/* Our current pending command */
245 spinlock_t control_lock; /* Protects the pending command */
246
247 /* Configuration */
248 int adaption; /* 1 or 2 supported */
249 u8 ftype; /* UI or UIH */
250 int t1, t2; /* Timers in 1/100th of a sec */
251 int n2; /* Retry count */
252
253 /* Statistics (not currently exposed) */
254 unsigned long bad_fcs;
255 unsigned long malformed;
256 unsigned long io_error;
257 unsigned long bad_size;
258 unsigned long unsupported;
259};
260
261
262/*
263 * Mux objects - needed so that we can translate a tty index into the
264 * relevant mux and DLCI.
265 */
266
267#define MAX_MUX 4 /* 256 minors */
268static struct gsm_mux *gsm_mux[MAX_MUX]; /* GSM muxes */
269static spinlock_t gsm_mux_lock;
270
271static struct tty_driver *gsm_tty_driver;
272
273/*
274 * This section of the driver logic implements the GSM encodings
275 * both the basic and the 'advanced'. Reliable transport is not
276 * supported.
277 */
278
279#define CR 0x02
280#define EA 0x01
281#define PF 0x10
282
283/* I is special: the rest are ..*/
284#define RR 0x01
285#define UI 0x03
286#define RNR 0x05
287#define REJ 0x09
288#define DM 0x0F
289#define SABM 0x2F
290#define DISC 0x43
291#define UA 0x63
292#define UIH 0xEF
293
294/* Channel commands */
295#define CMD_NSC 0x09
296#define CMD_TEST 0x11
297#define CMD_PSC 0x21
298#define CMD_RLS 0x29
299#define CMD_FCOFF 0x31
300#define CMD_PN 0x41
301#define CMD_RPN 0x49
302#define CMD_FCON 0x51
303#define CMD_CLD 0x61
304#define CMD_SNC 0x69
305#define CMD_MSC 0x71
306
307/* Virtual modem bits */
308#define MDM_FC 0x01
309#define MDM_RTC 0x02
310#define MDM_RTR 0x04
311#define MDM_IC 0x20
312#define MDM_DV 0x40
313
314#define GSM0_SOF 0xF9
315#define GSM1_SOF 0x7E
316#define GSM1_ESCAPE 0x7D
317#define GSM1_ESCAPE_BITS 0x20
318#define XON 0x11
319#define XOFF 0x13
Olivier Deprez157378f2022-04-04 15:47:50 +0200320#define ISO_IEC_646_MASK 0x7F
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000321
322static const struct tty_port_operations gsm_port_ops;
323
324/*
325 * CRC table for GSM 0710
326 */
327
328static const u8 gsm_fcs8[256] = {
329 0x00, 0x91, 0xE3, 0x72, 0x07, 0x96, 0xE4, 0x75,
330 0x0E, 0x9F, 0xED, 0x7C, 0x09, 0x98, 0xEA, 0x7B,
331 0x1C, 0x8D, 0xFF, 0x6E, 0x1B, 0x8A, 0xF8, 0x69,
332 0x12, 0x83, 0xF1, 0x60, 0x15, 0x84, 0xF6, 0x67,
333 0x38, 0xA9, 0xDB, 0x4A, 0x3F, 0xAE, 0xDC, 0x4D,
334 0x36, 0xA7, 0xD5, 0x44, 0x31, 0xA0, 0xD2, 0x43,
335 0x24, 0xB5, 0xC7, 0x56, 0x23, 0xB2, 0xC0, 0x51,
336 0x2A, 0xBB, 0xC9, 0x58, 0x2D, 0xBC, 0xCE, 0x5F,
337 0x70, 0xE1, 0x93, 0x02, 0x77, 0xE6, 0x94, 0x05,
338 0x7E, 0xEF, 0x9D, 0x0C, 0x79, 0xE8, 0x9A, 0x0B,
339 0x6C, 0xFD, 0x8F, 0x1E, 0x6B, 0xFA, 0x88, 0x19,
340 0x62, 0xF3, 0x81, 0x10, 0x65, 0xF4, 0x86, 0x17,
341 0x48, 0xD9, 0xAB, 0x3A, 0x4F, 0xDE, 0xAC, 0x3D,
342 0x46, 0xD7, 0xA5, 0x34, 0x41, 0xD0, 0xA2, 0x33,
343 0x54, 0xC5, 0xB7, 0x26, 0x53, 0xC2, 0xB0, 0x21,
344 0x5A, 0xCB, 0xB9, 0x28, 0x5D, 0xCC, 0xBE, 0x2F,
345 0xE0, 0x71, 0x03, 0x92, 0xE7, 0x76, 0x04, 0x95,
346 0xEE, 0x7F, 0x0D, 0x9C, 0xE9, 0x78, 0x0A, 0x9B,
347 0xFC, 0x6D, 0x1F, 0x8E, 0xFB, 0x6A, 0x18, 0x89,
348 0xF2, 0x63, 0x11, 0x80, 0xF5, 0x64, 0x16, 0x87,
349 0xD8, 0x49, 0x3B, 0xAA, 0xDF, 0x4E, 0x3C, 0xAD,
350 0xD6, 0x47, 0x35, 0xA4, 0xD1, 0x40, 0x32, 0xA3,
351 0xC4, 0x55, 0x27, 0xB6, 0xC3, 0x52, 0x20, 0xB1,
352 0xCA, 0x5B, 0x29, 0xB8, 0xCD, 0x5C, 0x2E, 0xBF,
353 0x90, 0x01, 0x73, 0xE2, 0x97, 0x06, 0x74, 0xE5,
354 0x9E, 0x0F, 0x7D, 0xEC, 0x99, 0x08, 0x7A, 0xEB,
355 0x8C, 0x1D, 0x6F, 0xFE, 0x8B, 0x1A, 0x68, 0xF9,
356 0x82, 0x13, 0x61, 0xF0, 0x85, 0x14, 0x66, 0xF7,
357 0xA8, 0x39, 0x4B, 0xDA, 0xAF, 0x3E, 0x4C, 0xDD,
358 0xA6, 0x37, 0x45, 0xD4, 0xA1, 0x30, 0x42, 0xD3,
359 0xB4, 0x25, 0x57, 0xC6, 0xB3, 0x22, 0x50, 0xC1,
360 0xBA, 0x2B, 0x59, 0xC8, 0xBD, 0x2C, 0x5E, 0xCF
361};
362
363#define INIT_FCS 0xFF
364#define GOOD_FCS 0xCF
365
Olivier Deprez157378f2022-04-04 15:47:50 +0200366static int gsmld_output(struct gsm_mux *gsm, u8 *data, int len);
367
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000368/**
369 * gsm_fcs_add - update FCS
370 * @fcs: Current FCS
371 * @c: Next data
372 *
373 * Update the FCS to include c. Uses the algorithm in the specification
374 * notes.
375 */
376
377static inline u8 gsm_fcs_add(u8 fcs, u8 c)
378{
379 return gsm_fcs8[fcs ^ c];
380}
381
382/**
383 * gsm_fcs_add_block - update FCS for a block
384 * @fcs: Current FCS
385 * @c: buffer of data
386 * @len: length of buffer
387 *
388 * Update the FCS to include c. Uses the algorithm in the specification
389 * notes.
390 */
391
392static inline u8 gsm_fcs_add_block(u8 fcs, u8 *c, int len)
393{
394 while (len--)
395 fcs = gsm_fcs8[fcs ^ *c++];
396 return fcs;
397}
398
399/**
400 * gsm_read_ea - read a byte into an EA
401 * @val: variable holding value
Olivier Deprez157378f2022-04-04 15:47:50 +0200402 * @c: byte going into the EA
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000403 *
404 * Processes one byte of an EA. Updates the passed variable
405 * and returns 1 if the EA is now completely read
406 */
407
408static int gsm_read_ea(unsigned int *val, u8 c)
409{
410 /* Add the next 7 bits into the value */
411 *val <<= 7;
412 *val |= c >> 1;
413 /* Was this the last byte of the EA 1 = yes*/
414 return c & EA;
415}
416
417/**
418 * gsm_encode_modem - encode modem data bits
419 * @dlci: DLCI to encode from
420 *
421 * Returns the correct GSM encoded modem status bits (6 bit field) for
422 * the current status of the DLCI and attached tty object
423 */
424
425static u8 gsm_encode_modem(const struct gsm_dlci *dlci)
426{
427 u8 modembits = 0;
428 /* FC is true flow control not modem bits */
429 if (dlci->throttled)
430 modembits |= MDM_FC;
431 if (dlci->modem_tx & TIOCM_DTR)
432 modembits |= MDM_RTC;
433 if (dlci->modem_tx & TIOCM_RTS)
434 modembits |= MDM_RTR;
435 if (dlci->modem_tx & TIOCM_RI)
436 modembits |= MDM_IC;
Olivier Deprez157378f2022-04-04 15:47:50 +0200437 if (dlci->modem_tx & TIOCM_CD || dlci->gsm->initiator)
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000438 modembits |= MDM_DV;
439 return modembits;
440}
441
442/**
443 * gsm_print_packet - display a frame for debug
444 * @hdr: header to print before decode
445 * @addr: address EA from the frame
446 * @cr: C/R bit from the frame
447 * @control: control including PF bit
448 * @data: following data bytes
449 * @dlen: length of data
450 *
451 * Displays a packet in human readable format for debugging purposes. The
452 * style is based on amateur radio LAP-B dump display.
453 */
454
455static void gsm_print_packet(const char *hdr, int addr, int cr,
456 u8 control, const u8 *data, int dlen)
457{
458 if (!(debug & 1))
459 return;
460
461 pr_info("%s %d) %c: ", hdr, addr, "RC"[cr]);
462
463 switch (control & ~PF) {
464 case SABM:
465 pr_cont("SABM");
466 break;
467 case UA:
468 pr_cont("UA");
469 break;
470 case DISC:
471 pr_cont("DISC");
472 break;
473 case DM:
474 pr_cont("DM");
475 break;
476 case UI:
477 pr_cont("UI");
478 break;
479 case UIH:
480 pr_cont("UIH");
481 break;
482 default:
483 if (!(control & 0x01)) {
484 pr_cont("I N(S)%d N(R)%d",
485 (control & 0x0E) >> 1, (control & 0xE0) >> 5);
486 } else switch (control & 0x0F) {
487 case RR:
488 pr_cont("RR(%d)", (control & 0xE0) >> 5);
489 break;
490 case RNR:
491 pr_cont("RNR(%d)", (control & 0xE0) >> 5);
492 break;
493 case REJ:
494 pr_cont("REJ(%d)", (control & 0xE0) >> 5);
495 break;
496 default:
497 pr_cont("[%02X]", control);
498 }
499 }
500
501 if (control & PF)
502 pr_cont("(P)");
503 else
504 pr_cont("(F)");
505
Olivier Deprez157378f2022-04-04 15:47:50 +0200506 print_hex_dump_bytes("", DUMP_PREFIX_NONE, data, dlen);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000507}
508
509
510/*
511 * Link level transmission side
512 */
513
514/**
515 * gsm_stuff_packet - bytestuff a packet
Olivier Deprez157378f2022-04-04 15:47:50 +0200516 * @input: input buffer
517 * @output: output buffer
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000518 * @len: length of input
519 *
520 * Expand a buffer by bytestuffing it. The worst case size change
521 * is doubling and the caller is responsible for handing out
522 * suitable sized buffers.
523 */
524
525static int gsm_stuff_frame(const u8 *input, u8 *output, int len)
526{
527 int olen = 0;
528 while (len--) {
529 if (*input == GSM1_SOF || *input == GSM1_ESCAPE
Olivier Deprez157378f2022-04-04 15:47:50 +0200530 || (*input & ISO_IEC_646_MASK) == XON
531 || (*input & ISO_IEC_646_MASK) == XOFF) {
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000532 *output++ = GSM1_ESCAPE;
533 *output++ = *input++ ^ GSM1_ESCAPE_BITS;
534 olen++;
535 } else
536 *output++ = *input++;
537 olen++;
538 }
539 return olen;
540}
541
542/**
543 * gsm_send - send a control frame
544 * @gsm: our GSM mux
545 * @addr: address for control frame
546 * @cr: command/response bit
547 * @control: control byte including PF bit
548 *
549 * Format up and transmit a control frame. These do not go via the
550 * queueing logic as they should be transmitted ahead of data when
551 * they are needed.
552 *
553 * FIXME: Lock versus data TX path
554 */
555
556static void gsm_send(struct gsm_mux *gsm, int addr, int cr, int control)
557{
558 int len;
559 u8 cbuf[10];
560 u8 ibuf[3];
561
562 switch (gsm->encoding) {
563 case 0:
564 cbuf[0] = GSM0_SOF;
565 cbuf[1] = (addr << 2) | (cr << 1) | EA;
566 cbuf[2] = control;
567 cbuf[3] = EA; /* Length of data = 0 */
568 cbuf[4] = 0xFF - gsm_fcs_add_block(INIT_FCS, cbuf + 1, 3);
569 cbuf[5] = GSM0_SOF;
570 len = 6;
571 break;
572 case 1:
573 case 2:
574 /* Control frame + packing (but not frame stuffing) in mode 1 */
575 ibuf[0] = (addr << 2) | (cr << 1) | EA;
576 ibuf[1] = control;
577 ibuf[2] = 0xFF - gsm_fcs_add_block(INIT_FCS, ibuf, 2);
578 /* Stuffing may double the size worst case */
579 len = gsm_stuff_frame(ibuf, cbuf + 1, 3);
580 /* Now add the SOF markers */
581 cbuf[0] = GSM1_SOF;
582 cbuf[len + 1] = GSM1_SOF;
583 /* FIXME: we can omit the lead one in many cases */
584 len += 2;
585 break;
586 default:
587 WARN_ON(1);
588 return;
589 }
Olivier Deprez157378f2022-04-04 15:47:50 +0200590 gsmld_output(gsm, cbuf, len);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000591 gsm_print_packet("-->", addr, cr, control, NULL, 0);
592}
593
594/**
595 * gsm_response - send a control response
596 * @gsm: our GSM mux
597 * @addr: address for control frame
598 * @control: control byte including PF bit
599 *
600 * Format up and transmit a link level response frame.
601 */
602
603static inline void gsm_response(struct gsm_mux *gsm, int addr, int control)
604{
605 gsm_send(gsm, addr, 0, control);
606}
607
608/**
609 * gsm_command - send a control command
610 * @gsm: our GSM mux
611 * @addr: address for control frame
612 * @control: control byte including PF bit
613 *
614 * Format up and transmit a link level command frame.
615 */
616
617static inline void gsm_command(struct gsm_mux *gsm, int addr, int control)
618{
619 gsm_send(gsm, addr, 1, control);
620}
621
622/* Data transmission */
623
624#define HDR_LEN 6 /* ADDR CTRL [LEN.2] DATA FCS */
625
626/**
627 * gsm_data_alloc - allocate data frame
628 * @gsm: GSM mux
629 * @addr: DLCI address
630 * @len: length excluding header and FCS
631 * @ctrl: control byte
632 *
633 * Allocate a new data buffer for sending frames with data. Space is left
634 * at the front for header bytes but that is treated as an implementation
635 * detail and not for the high level code to use
636 */
637
638static struct gsm_msg *gsm_data_alloc(struct gsm_mux *gsm, u8 addr, int len,
639 u8 ctrl)
640{
641 struct gsm_msg *m = kmalloc(sizeof(struct gsm_msg) + len + HDR_LEN,
642 GFP_ATOMIC);
643 if (m == NULL)
644 return NULL;
645 m->data = m->buffer + HDR_LEN - 1; /* Allow for FCS */
646 m->len = len;
647 m->addr = addr;
648 m->ctrl = ctrl;
649 INIT_LIST_HEAD(&m->list);
650 return m;
651}
652
653/**
654 * gsm_data_kick - poke the queue
655 * @gsm: GSM Mux
656 *
657 * The tty device has called us to indicate that room has appeared in
658 * the transmit queue. Ram more data into the pipe if we have any
659 * If we have been flow-stopped by a CMD_FCOFF, then we can only
660 * send messages on DLCI0 until CMD_FCON
661 *
662 * FIXME: lock against link layer control transmissions
663 */
664
Olivier Deprez0e641232021-09-23 10:07:05 +0200665static void gsm_data_kick(struct gsm_mux *gsm, struct gsm_dlci *dlci)
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000666{
667 struct gsm_msg *msg, *nmsg;
668 int len;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000669
670 list_for_each_entry_safe(msg, nmsg, &gsm->tx_list, list) {
671 if (gsm->constipated && msg->addr)
672 continue;
673 if (gsm->encoding != 0) {
674 gsm->txframe[0] = GSM1_SOF;
675 len = gsm_stuff_frame(msg->data,
676 gsm->txframe + 1, msg->len);
677 gsm->txframe[len + 1] = GSM1_SOF;
678 len += 2;
679 } else {
680 gsm->txframe[0] = GSM0_SOF;
681 memcpy(gsm->txframe + 1 , msg->data, msg->len);
682 gsm->txframe[msg->len + 1] = GSM0_SOF;
683 len = msg->len + 2;
684 }
685
686 if (debug & 4)
687 print_hex_dump_bytes("gsm_data_kick: ",
688 DUMP_PREFIX_OFFSET,
689 gsm->txframe, len);
Olivier Deprez157378f2022-04-04 15:47:50 +0200690 if (gsmld_output(gsm, gsm->txframe, len) < 0)
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000691 break;
692 /* FIXME: Can eliminate one SOF in many more cases */
693 gsm->tx_bytes -= msg->len;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000694
695 list_del(&msg->list);
696 kfree(msg);
Olivier Deprez0e641232021-09-23 10:07:05 +0200697
698 if (dlci) {
699 tty_port_tty_wakeup(&dlci->port);
700 } else {
701 int i = 0;
702
703 for (i = 0; i < NUM_DLCI; i++)
704 if (gsm->dlci[i])
705 tty_port_tty_wakeup(&gsm->dlci[i]->port);
706 }
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000707 }
708}
709
710/**
711 * __gsm_data_queue - queue a UI or UIH frame
712 * @dlci: DLCI sending the data
713 * @msg: message queued
714 *
715 * Add data to the transmit queue and try and get stuff moving
716 * out of the mux tty if not already doing so. The Caller must hold
717 * the gsm tx lock.
718 */
719
720static void __gsm_data_queue(struct gsm_dlci *dlci, struct gsm_msg *msg)
721{
722 struct gsm_mux *gsm = dlci->gsm;
723 u8 *dp = msg->data;
724 u8 *fcs = dp + msg->len;
725
726 /* Fill in the header */
727 if (gsm->encoding == 0) {
728 if (msg->len < 128)
729 *--dp = (msg->len << 1) | EA;
730 else {
731 *--dp = (msg->len >> 7); /* bits 7 - 15 */
732 *--dp = (msg->len & 127) << 1; /* bits 0 - 6 */
733 }
734 }
735
736 *--dp = msg->ctrl;
737 if (gsm->initiator)
738 *--dp = (msg->addr << 2) | 2 | EA;
739 else
740 *--dp = (msg->addr << 2) | EA;
741 *fcs = gsm_fcs_add_block(INIT_FCS, dp , msg->data - dp);
742 /* Ugly protocol layering violation */
743 if (msg->ctrl == UI || msg->ctrl == (UI|PF))
744 *fcs = gsm_fcs_add_block(*fcs, msg->data, msg->len);
745 *fcs = 0xFF - *fcs;
746
747 gsm_print_packet("Q> ", msg->addr, gsm->initiator, msg->ctrl,
748 msg->data, msg->len);
749
750 /* Move the header back and adjust the length, also allow for the FCS
751 now tacked on the end */
752 msg->len += (msg->data - dp) + 1;
753 msg->data = dp;
754
755 /* Add to the actual output queue */
756 list_add_tail(&msg->list, &gsm->tx_list);
757 gsm->tx_bytes += msg->len;
Olivier Deprez0e641232021-09-23 10:07:05 +0200758 gsm_data_kick(gsm, dlci);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000759}
760
761/**
762 * gsm_data_queue - queue a UI or UIH frame
763 * @dlci: DLCI sending the data
764 * @msg: message queued
765 *
766 * Add data to the transmit queue and try and get stuff moving
767 * out of the mux tty if not already doing so. Take the
768 * the gsm tx lock and dlci lock.
769 */
770
771static void gsm_data_queue(struct gsm_dlci *dlci, struct gsm_msg *msg)
772{
773 unsigned long flags;
774 spin_lock_irqsave(&dlci->gsm->tx_lock, flags);
775 __gsm_data_queue(dlci, msg);
776 spin_unlock_irqrestore(&dlci->gsm->tx_lock, flags);
777}
778
779/**
780 * gsm_dlci_data_output - try and push data out of a DLCI
781 * @gsm: mux
782 * @dlci: the DLCI to pull data from
783 *
784 * Pull data from a DLCI and send it into the transmit queue if there
785 * is data. Keep to the MRU of the mux. This path handles the usual tty
786 * interface which is a byte stream with optional modem data.
787 *
788 * Caller must hold the tx_lock of the mux.
789 */
790
791static int gsm_dlci_data_output(struct gsm_mux *gsm, struct gsm_dlci *dlci)
792{
793 struct gsm_msg *msg;
794 u8 *dp;
795 int len, total_size, size;
796 int h = dlci->adaption - 1;
797
798 total_size = 0;
799 while (1) {
Olivier Deprez157378f2022-04-04 15:47:50 +0200800 len = kfifo_len(&dlci->fifo);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000801 if (len == 0)
802 return total_size;
803
804 /* MTU/MRU count only the data bits */
805 if (len > gsm->mtu)
806 len = gsm->mtu;
807
808 size = len + h;
809
810 msg = gsm_data_alloc(gsm, dlci->addr, size, gsm->ftype);
811 /* FIXME: need a timer or something to kick this so it can't
812 get stuck with no work outstanding and no buffer free */
813 if (msg == NULL)
814 return -ENOMEM;
815 dp = msg->data;
816 switch (dlci->adaption) {
817 case 1: /* Unstructured */
818 break;
819 case 2: /* Unstructed with modem bits.
820 Always one byte as we never send inline break data */
821 *dp++ = gsm_encode_modem(dlci);
822 break;
823 }
Olivier Deprez157378f2022-04-04 15:47:50 +0200824 WARN_ON(kfifo_out_locked(&dlci->fifo, dp , len, &dlci->lock) != len);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000825 __gsm_data_queue(dlci, msg);
826 total_size += size;
827 }
828 /* Bytes of data we used up */
829 return total_size;
830}
831
832/**
833 * gsm_dlci_data_output_framed - try and push data out of a DLCI
834 * @gsm: mux
835 * @dlci: the DLCI to pull data from
836 *
837 * Pull data from a DLCI and send it into the transmit queue if there
838 * is data. Keep to the MRU of the mux. This path handles framed data
839 * queued as skbuffs to the DLCI.
840 *
841 * Caller must hold the tx_lock of the mux.
842 */
843
844static int gsm_dlci_data_output_framed(struct gsm_mux *gsm,
845 struct gsm_dlci *dlci)
846{
847 struct gsm_msg *msg;
848 u8 *dp;
849 int len, size;
850 int last = 0, first = 0;
851 int overhead = 0;
852
853 /* One byte per frame is used for B/F flags */
854 if (dlci->adaption == 4)
855 overhead = 1;
856
857 /* dlci->skb is locked by tx_lock */
858 if (dlci->skb == NULL) {
859 dlci->skb = skb_dequeue_tail(&dlci->skb_list);
860 if (dlci->skb == NULL)
861 return 0;
862 first = 1;
863 }
864 len = dlci->skb->len + overhead;
865
866 /* MTU/MRU count only the data bits */
867 if (len > gsm->mtu) {
868 if (dlci->adaption == 3) {
869 /* Over long frame, bin it */
870 dev_kfree_skb_any(dlci->skb);
871 dlci->skb = NULL;
872 return 0;
873 }
874 len = gsm->mtu;
875 } else
876 last = 1;
877
878 size = len + overhead;
879 msg = gsm_data_alloc(gsm, dlci->addr, size, gsm->ftype);
880
881 /* FIXME: need a timer or something to kick this so it can't
882 get stuck with no work outstanding and no buffer free */
883 if (msg == NULL) {
884 skb_queue_tail(&dlci->skb_list, dlci->skb);
885 dlci->skb = NULL;
886 return -ENOMEM;
887 }
888 dp = msg->data;
889
890 if (dlci->adaption == 4) { /* Interruptible framed (Packetised Data) */
891 /* Flag byte to carry the start/end info */
892 *dp++ = last << 7 | first << 6 | 1; /* EA */
893 len--;
894 }
895 memcpy(dp, dlci->skb->data, len);
896 skb_pull(dlci->skb, len);
897 __gsm_data_queue(dlci, msg);
898 if (last) {
899 dev_kfree_skb_any(dlci->skb);
900 dlci->skb = NULL;
901 }
902 return size;
903}
904
905/**
906 * gsm_dlci_data_sweep - look for data to send
907 * @gsm: the GSM mux
908 *
909 * Sweep the GSM mux channels in priority order looking for ones with
910 * data to send. We could do with optimising this scan a bit. We aim
911 * to fill the queue totally or up to TX_THRESH_HI bytes. Once we hit
912 * TX_THRESH_LO we get called again
913 *
914 * FIXME: We should round robin between groups and in theory you can
915 * renegotiate DLCI priorities with optional stuff. Needs optimising.
916 */
917
918static void gsm_dlci_data_sweep(struct gsm_mux *gsm)
919{
920 int len;
921 /* Priority ordering: We should do priority with RR of the groups */
922 int i = 1;
923
924 while (i < NUM_DLCI) {
925 struct gsm_dlci *dlci;
926
927 if (gsm->tx_bytes > TX_THRESH_HI)
928 break;
929 dlci = gsm->dlci[i];
930 if (dlci == NULL || dlci->constipated) {
931 i++;
932 continue;
933 }
934 if (dlci->adaption < 3 && !dlci->net)
935 len = gsm_dlci_data_output(gsm, dlci);
936 else
937 len = gsm_dlci_data_output_framed(gsm, dlci);
938 if (len < 0)
939 break;
940 /* DLCI empty - try the next */
941 if (len == 0)
942 i++;
943 }
944}
945
946/**
947 * gsm_dlci_data_kick - transmit if possible
948 * @dlci: DLCI to kick
949 *
950 * Transmit data from this DLCI if the queue is empty. We can't rely on
951 * a tty wakeup except when we filled the pipe so we need to fire off
952 * new data ourselves in other cases.
953 */
954
955static void gsm_dlci_data_kick(struct gsm_dlci *dlci)
956{
957 unsigned long flags;
958 int sweep;
959
960 if (dlci->constipated)
961 return;
962
963 spin_lock_irqsave(&dlci->gsm->tx_lock, flags);
964 /* If we have nothing running then we need to fire up */
965 sweep = (dlci->gsm->tx_bytes < TX_THRESH_LO);
966 if (dlci->gsm->tx_bytes == 0) {
967 if (dlci->net)
968 gsm_dlci_data_output_framed(dlci->gsm, dlci);
969 else
970 gsm_dlci_data_output(dlci->gsm, dlci);
971 }
972 if (sweep)
973 gsm_dlci_data_sweep(dlci->gsm);
974 spin_unlock_irqrestore(&dlci->gsm->tx_lock, flags);
975}
976
977/*
978 * Control message processing
979 */
980
981
982/**
983 * gsm_control_reply - send a response frame to a control
984 * @gsm: gsm channel
985 * @cmd: the command to use
986 * @data: data to follow encoded info
987 * @dlen: length of data
988 *
989 * Encode up and queue a UI/UIH frame containing our response.
990 */
991
David Brazdil0f672f62019-12-10 10:32:29 +0000992static void gsm_control_reply(struct gsm_mux *gsm, int cmd, const u8 *data,
Andrew Scullb4b6d4a2019-01-02 15:54:55 +0000993 int dlen)
994{
995 struct gsm_msg *msg;
996 msg = gsm_data_alloc(gsm, 0, dlen + 2, gsm->ftype);
997 if (msg == NULL)
998 return;
999 msg->data[0] = (cmd & 0xFE) << 1 | EA; /* Clear C/R */
1000 msg->data[1] = (dlen << 1) | EA;
1001 memcpy(msg->data + 2, data, dlen);
1002 gsm_data_queue(gsm->dlci[0], msg);
1003}
1004
1005/**
1006 * gsm_process_modem - process received modem status
1007 * @tty: virtual tty bound to the DLCI
1008 * @dlci: DLCI to affect
1009 * @modem: modem bits (full EA)
1010 *
1011 * Used when a modem control message or line state inline in adaption
1012 * layer 2 is processed. Sort out the local modem state and throttles
1013 */
1014
1015static void gsm_process_modem(struct tty_struct *tty, struct gsm_dlci *dlci,
1016 u32 modem, int clen)
1017{
1018 int mlines = 0;
1019 u8 brk = 0;
1020 int fc;
1021
1022 /* The modem status command can either contain one octet (v.24 signals)
1023 or two octets (v.24 signals + break signals). The length field will
1024 either be 2 or 3 respectively. This is specified in section
1025 5.4.6.3.7 of the 27.010 mux spec. */
1026
1027 if (clen == 2)
1028 modem = modem & 0x7f;
1029 else {
1030 brk = modem & 0x7f;
1031 modem = (modem >> 7) & 0x7f;
1032 }
1033
1034 /* Flow control/ready to communicate */
1035 fc = (modem & MDM_FC) || !(modem & MDM_RTR);
1036 if (fc && !dlci->constipated) {
1037 /* Need to throttle our output on this device */
Olivier Deprez157378f2022-04-04 15:47:50 +02001038 dlci->constipated = true;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001039 } else if (!fc && dlci->constipated) {
Olivier Deprez157378f2022-04-04 15:47:50 +02001040 dlci->constipated = false;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001041 gsm_dlci_data_kick(dlci);
1042 }
1043
1044 /* Map modem bits */
1045 if (modem & MDM_RTC)
1046 mlines |= TIOCM_DSR | TIOCM_DTR;
1047 if (modem & MDM_RTR)
1048 mlines |= TIOCM_RTS | TIOCM_CTS;
1049 if (modem & MDM_IC)
1050 mlines |= TIOCM_RI;
1051 if (modem & MDM_DV)
1052 mlines |= TIOCM_CD;
1053
1054 /* Carrier drop -> hangup */
1055 if (tty) {
1056 if ((mlines & TIOCM_CD) == 0 && (dlci->modem_rx & TIOCM_CD))
1057 if (!C_CLOCAL(tty))
1058 tty_hangup(tty);
1059 }
1060 if (brk & 0x01)
1061 tty_insert_flip_char(&dlci->port, 0, TTY_BREAK);
1062 dlci->modem_rx = mlines;
1063}
1064
1065/**
1066 * gsm_control_modem - modem status received
1067 * @gsm: GSM channel
1068 * @data: data following command
1069 * @clen: command length
1070 *
1071 * We have received a modem status control message. This is used by
1072 * the GSM mux protocol to pass virtual modem line status and optionally
1073 * to indicate break signals. Unpack it, convert to Linux representation
1074 * and if need be stuff a break message down the tty.
1075 */
1076
David Brazdil0f672f62019-12-10 10:32:29 +00001077static void gsm_control_modem(struct gsm_mux *gsm, const u8 *data, int clen)
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001078{
1079 unsigned int addr = 0;
1080 unsigned int modem = 0;
1081 unsigned int brk = 0;
1082 struct gsm_dlci *dlci;
1083 int len = clen;
David Brazdil0f672f62019-12-10 10:32:29 +00001084 const u8 *dp = data;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001085 struct tty_struct *tty;
1086
1087 while (gsm_read_ea(&addr, *dp++) == 0) {
1088 len--;
1089 if (len == 0)
1090 return;
1091 }
1092 /* Must be at least one byte following the EA */
1093 len--;
1094 if (len <= 0)
1095 return;
1096
1097 addr >>= 1;
1098 /* Closed port, or invalid ? */
1099 if (addr == 0 || addr >= NUM_DLCI || gsm->dlci[addr] == NULL)
1100 return;
1101 dlci = gsm->dlci[addr];
1102
1103 while (gsm_read_ea(&modem, *dp++) == 0) {
1104 len--;
1105 if (len == 0)
1106 return;
1107 }
1108 len--;
1109 if (len > 0) {
1110 while (gsm_read_ea(&brk, *dp++) == 0) {
1111 len--;
1112 if (len == 0)
1113 return;
1114 }
1115 modem <<= 7;
1116 modem |= (brk & 0x7f);
1117 }
1118 tty = tty_port_tty_get(&dlci->port);
1119 gsm_process_modem(tty, dlci, modem, clen);
1120 if (tty) {
1121 tty_wakeup(tty);
1122 tty_kref_put(tty);
1123 }
1124 gsm_control_reply(gsm, CMD_MSC, data, clen);
1125}
1126
1127/**
1128 * gsm_control_rls - remote line status
1129 * @gsm: GSM channel
1130 * @data: data bytes
1131 * @clen: data length
1132 *
1133 * The modem sends us a two byte message on the control channel whenever
1134 * it wishes to send us an error state from the virtual link. Stuff
1135 * this into the uplink tty if present
1136 */
1137
David Brazdil0f672f62019-12-10 10:32:29 +00001138static void gsm_control_rls(struct gsm_mux *gsm, const u8 *data, int clen)
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001139{
1140 struct tty_port *port;
1141 unsigned int addr = 0;
1142 u8 bits;
1143 int len = clen;
David Brazdil0f672f62019-12-10 10:32:29 +00001144 const u8 *dp = data;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001145
1146 while (gsm_read_ea(&addr, *dp++) == 0) {
1147 len--;
1148 if (len == 0)
1149 return;
1150 }
1151 /* Must be at least one byte following ea */
1152 len--;
1153 if (len <= 0)
1154 return;
1155 addr >>= 1;
1156 /* Closed port, or invalid ? */
1157 if (addr == 0 || addr >= NUM_DLCI || gsm->dlci[addr] == NULL)
1158 return;
1159 /* No error ? */
1160 bits = *dp;
1161 if ((bits & 1) == 0)
1162 return;
1163
1164 port = &gsm->dlci[addr]->port;
1165
1166 if (bits & 2)
1167 tty_insert_flip_char(port, 0, TTY_OVERRUN);
1168 if (bits & 4)
1169 tty_insert_flip_char(port, 0, TTY_PARITY);
1170 if (bits & 8)
1171 tty_insert_flip_char(port, 0, TTY_FRAME);
1172
1173 tty_flip_buffer_push(port);
1174
1175 gsm_control_reply(gsm, CMD_RLS, data, clen);
1176}
1177
1178static void gsm_dlci_begin_close(struct gsm_dlci *dlci);
1179
1180/**
1181 * gsm_control_message - DLCI 0 control processing
1182 * @gsm: our GSM mux
1183 * @command: the command EA
1184 * @data: data beyond the command/length EAs
1185 * @clen: length
1186 *
1187 * Input processor for control messages from the other end of the link.
1188 * Processes the incoming request and queues a response frame or an
1189 * NSC response if not supported
1190 */
1191
1192static void gsm_control_message(struct gsm_mux *gsm, unsigned int command,
David Brazdil0f672f62019-12-10 10:32:29 +00001193 const u8 *data, int clen)
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001194{
1195 u8 buf[1];
1196 unsigned long flags;
1197
1198 switch (command) {
1199 case CMD_CLD: {
1200 struct gsm_dlci *dlci = gsm->dlci[0];
1201 /* Modem wishes to close down */
1202 if (dlci) {
Olivier Deprez157378f2022-04-04 15:47:50 +02001203 dlci->dead = true;
1204 gsm->dead = true;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001205 gsm_dlci_begin_close(dlci);
1206 }
1207 }
1208 break;
1209 case CMD_TEST:
1210 /* Modem wishes to test, reply with the data */
1211 gsm_control_reply(gsm, CMD_TEST, data, clen);
1212 break;
1213 case CMD_FCON:
1214 /* Modem can accept data again */
Olivier Deprez157378f2022-04-04 15:47:50 +02001215 gsm->constipated = false;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001216 gsm_control_reply(gsm, CMD_FCON, NULL, 0);
1217 /* Kick the link in case it is idling */
1218 spin_lock_irqsave(&gsm->tx_lock, flags);
Olivier Deprez0e641232021-09-23 10:07:05 +02001219 gsm_data_kick(gsm, NULL);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001220 spin_unlock_irqrestore(&gsm->tx_lock, flags);
1221 break;
1222 case CMD_FCOFF:
1223 /* Modem wants us to STFU */
Olivier Deprez157378f2022-04-04 15:47:50 +02001224 gsm->constipated = true;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001225 gsm_control_reply(gsm, CMD_FCOFF, NULL, 0);
1226 break;
1227 case CMD_MSC:
1228 /* Out of band modem line change indicator for a DLCI */
1229 gsm_control_modem(gsm, data, clen);
1230 break;
1231 case CMD_RLS:
1232 /* Out of band error reception for a DLCI */
1233 gsm_control_rls(gsm, data, clen);
1234 break;
1235 case CMD_PSC:
1236 /* Modem wishes to enter power saving state */
1237 gsm_control_reply(gsm, CMD_PSC, NULL, 0);
1238 break;
1239 /* Optional unsupported commands */
1240 case CMD_PN: /* Parameter negotiation */
1241 case CMD_RPN: /* Remote port negotiation */
1242 case CMD_SNC: /* Service negotiation command */
1243 default:
1244 /* Reply to bad commands with an NSC */
1245 buf[0] = command;
1246 gsm_control_reply(gsm, CMD_NSC, buf, 1);
1247 break;
1248 }
1249}
1250
1251/**
1252 * gsm_control_response - process a response to our control
1253 * @gsm: our GSM mux
1254 * @command: the command (response) EA
1255 * @data: data beyond the command/length EA
1256 * @clen: length
1257 *
1258 * Process a response to an outstanding command. We only allow a single
1259 * control message in flight so this is fairly easy. All the clean up
1260 * is done by the caller, we just update the fields, flag it as done
1261 * and return
1262 */
1263
1264static void gsm_control_response(struct gsm_mux *gsm, unsigned int command,
David Brazdil0f672f62019-12-10 10:32:29 +00001265 const u8 *data, int clen)
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001266{
1267 struct gsm_control *ctrl;
1268 unsigned long flags;
1269
1270 spin_lock_irqsave(&gsm->control_lock, flags);
1271
1272 ctrl = gsm->pending_cmd;
1273 /* Does the reply match our command */
1274 command |= 1;
1275 if (ctrl != NULL && (command == ctrl->cmd || command == CMD_NSC)) {
1276 /* Our command was replied to, kill the retry timer */
1277 del_timer(&gsm->t2_timer);
1278 gsm->pending_cmd = NULL;
1279 /* Rejected by the other end */
1280 if (command == CMD_NSC)
1281 ctrl->error = -EOPNOTSUPP;
1282 ctrl->done = 1;
1283 wake_up(&gsm->event);
1284 }
1285 spin_unlock_irqrestore(&gsm->control_lock, flags);
1286}
1287
1288/**
1289 * gsm_control_transmit - send control packet
1290 * @gsm: gsm mux
1291 * @ctrl: frame to send
1292 *
1293 * Send out a pending control command (called under control lock)
1294 */
1295
1296static void gsm_control_transmit(struct gsm_mux *gsm, struct gsm_control *ctrl)
1297{
1298 struct gsm_msg *msg = gsm_data_alloc(gsm, 0, ctrl->len + 1, gsm->ftype);
1299 if (msg == NULL)
1300 return;
1301 msg->data[0] = (ctrl->cmd << 1) | 2 | EA; /* command */
1302 memcpy(msg->data + 1, ctrl->data, ctrl->len);
1303 gsm_data_queue(gsm->dlci[0], msg);
1304}
1305
1306/**
1307 * gsm_control_retransmit - retransmit a control frame
Olivier Deprez157378f2022-04-04 15:47:50 +02001308 * @t: timer contained in our gsm object
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001309 *
1310 * Called off the T2 timer expiry in order to retransmit control frames
1311 * that have been lost in the system somewhere. The control_lock protects
1312 * us from colliding with another sender or a receive completion event.
1313 * In that situation the timer may still occur in a small window but
1314 * gsm->pending_cmd will be NULL and we just let the timer expire.
1315 */
1316
1317static void gsm_control_retransmit(struct timer_list *t)
1318{
1319 struct gsm_mux *gsm = from_timer(gsm, t, t2_timer);
1320 struct gsm_control *ctrl;
1321 unsigned long flags;
1322 spin_lock_irqsave(&gsm->control_lock, flags);
1323 ctrl = gsm->pending_cmd;
1324 if (ctrl) {
1325 gsm->cretries--;
1326 if (gsm->cretries == 0) {
1327 gsm->pending_cmd = NULL;
1328 ctrl->error = -ETIMEDOUT;
1329 ctrl->done = 1;
1330 spin_unlock_irqrestore(&gsm->control_lock, flags);
1331 wake_up(&gsm->event);
1332 return;
1333 }
1334 gsm_control_transmit(gsm, ctrl);
1335 mod_timer(&gsm->t2_timer, jiffies + gsm->t2 * HZ / 100);
1336 }
1337 spin_unlock_irqrestore(&gsm->control_lock, flags);
1338}
1339
1340/**
1341 * gsm_control_send - send a control frame on DLCI 0
1342 * @gsm: the GSM channel
1343 * @command: command to send including CR bit
1344 * @data: bytes of data (must be kmalloced)
Olivier Deprez157378f2022-04-04 15:47:50 +02001345 * @clen: length of the block to send
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001346 *
1347 * Queue and dispatch a control command. Only one command can be
1348 * active at a time. In theory more can be outstanding but the matching
1349 * gets really complicated so for now stick to one outstanding.
1350 */
1351
1352static struct gsm_control *gsm_control_send(struct gsm_mux *gsm,
1353 unsigned int command, u8 *data, int clen)
1354{
1355 struct gsm_control *ctrl = kzalloc(sizeof(struct gsm_control),
1356 GFP_KERNEL);
1357 unsigned long flags;
1358 if (ctrl == NULL)
1359 return NULL;
1360retry:
1361 wait_event(gsm->event, gsm->pending_cmd == NULL);
1362 spin_lock_irqsave(&gsm->control_lock, flags);
1363 if (gsm->pending_cmd != NULL) {
1364 spin_unlock_irqrestore(&gsm->control_lock, flags);
1365 goto retry;
1366 }
1367 ctrl->cmd = command;
1368 ctrl->data = data;
1369 ctrl->len = clen;
1370 gsm->pending_cmd = ctrl;
1371
1372 /* If DLCI0 is in ADM mode skip retries, it won't respond */
1373 if (gsm->dlci[0]->mode == DLCI_MODE_ADM)
1374 gsm->cretries = 1;
1375 else
1376 gsm->cretries = gsm->n2;
1377
1378 mod_timer(&gsm->t2_timer, jiffies + gsm->t2 * HZ / 100);
1379 gsm_control_transmit(gsm, ctrl);
1380 spin_unlock_irqrestore(&gsm->control_lock, flags);
1381 return ctrl;
1382}
1383
1384/**
1385 * gsm_control_wait - wait for a control to finish
1386 * @gsm: GSM mux
1387 * @control: control we are waiting on
1388 *
1389 * Waits for the control to complete or time out. Frees any used
1390 * resources and returns 0 for success, or an error if the remote
1391 * rejected or ignored the request.
1392 */
1393
1394static int gsm_control_wait(struct gsm_mux *gsm, struct gsm_control *control)
1395{
1396 int err;
1397 wait_event(gsm->event, control->done == 1);
1398 err = control->error;
1399 kfree(control);
1400 return err;
1401}
1402
1403
1404/*
1405 * DLCI level handling: Needs krefs
1406 */
1407
1408/*
1409 * State transitions and timers
1410 */
1411
1412/**
1413 * gsm_dlci_close - a DLCI has closed
1414 * @dlci: DLCI that closed
1415 *
1416 * Perform processing when moving a DLCI into closed state. If there
1417 * is an attached tty this is hung up
1418 */
1419
1420static void gsm_dlci_close(struct gsm_dlci *dlci)
1421{
1422 del_timer(&dlci->t1);
1423 if (debug & 8)
1424 pr_debug("DLCI %d goes closed.\n", dlci->addr);
1425 dlci->state = DLCI_CLOSED;
1426 if (dlci->addr != 0) {
1427 tty_port_tty_hangup(&dlci->port, false);
Olivier Deprez157378f2022-04-04 15:47:50 +02001428 kfifo_reset(&dlci->fifo);
1429 /* Ensure that gsmtty_open() can return. */
1430 tty_port_set_initialized(&dlci->port, 0);
1431 wake_up_interruptible(&dlci->port.open_wait);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001432 } else
Olivier Deprez157378f2022-04-04 15:47:50 +02001433 dlci->gsm->dead = true;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001434 wake_up(&dlci->gsm->event);
1435 /* A DLCI 0 close is a MUX termination so we need to kick that
1436 back to userspace somehow */
1437}
1438
1439/**
1440 * gsm_dlci_open - a DLCI has opened
1441 * @dlci: DLCI that opened
1442 *
1443 * Perform processing when moving a DLCI into open state.
1444 */
1445
1446static void gsm_dlci_open(struct gsm_dlci *dlci)
1447{
1448 /* Note that SABM UA .. SABM UA first UA lost can mean that we go
1449 open -> open */
1450 del_timer(&dlci->t1);
1451 /* This will let a tty open continue */
1452 dlci->state = DLCI_OPEN;
1453 if (debug & 8)
1454 pr_debug("DLCI %d goes open.\n", dlci->addr);
1455 wake_up(&dlci->gsm->event);
1456}
1457
1458/**
1459 * gsm_dlci_t1 - T1 timer expiry
Olivier Deprez157378f2022-04-04 15:47:50 +02001460 * @t: timer contained in the DLCI that opened
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001461 *
1462 * The T1 timer handles retransmits of control frames (essentially of
1463 * SABM and DISC). We resend the command until the retry count runs out
1464 * in which case an opening port goes back to closed and a closing port
1465 * is simply put into closed state (any further frames from the other
1466 * end will get a DM response)
1467 *
1468 * Some control dlci can stay in ADM mode with other dlci working just
1469 * fine. In that case we can just keep the control dlci open after the
1470 * DLCI_OPENING retries time out.
1471 */
1472
1473static void gsm_dlci_t1(struct timer_list *t)
1474{
1475 struct gsm_dlci *dlci = from_timer(dlci, t, t1);
1476 struct gsm_mux *gsm = dlci->gsm;
1477
1478 switch (dlci->state) {
1479 case DLCI_OPENING:
1480 dlci->retries--;
1481 if (dlci->retries) {
1482 gsm_command(dlci->gsm, dlci->addr, SABM|PF);
1483 mod_timer(&dlci->t1, jiffies + gsm->t1 * HZ / 100);
1484 } else if (!dlci->addr && gsm->control == (DM | PF)) {
1485 if (debug & 8)
1486 pr_info("DLCI %d opening in ADM mode.\n",
1487 dlci->addr);
1488 dlci->mode = DLCI_MODE_ADM;
1489 gsm_dlci_open(dlci);
1490 } else {
Olivier Deprez157378f2022-04-04 15:47:50 +02001491 gsm_dlci_begin_close(dlci); /* prevent half open link */
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001492 }
1493
1494 break;
1495 case DLCI_CLOSING:
1496 dlci->retries--;
1497 if (dlci->retries) {
1498 gsm_command(dlci->gsm, dlci->addr, DISC|PF);
1499 mod_timer(&dlci->t1, jiffies + gsm->t1 * HZ / 100);
1500 } else
1501 gsm_dlci_close(dlci);
1502 break;
Olivier Deprez157378f2022-04-04 15:47:50 +02001503 default:
1504 pr_debug("%s: unhandled state: %d\n", __func__, dlci->state);
1505 break;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001506 }
1507}
1508
1509/**
1510 * gsm_dlci_begin_open - start channel open procedure
1511 * @dlci: DLCI to open
1512 *
1513 * Commence opening a DLCI from the Linux side. We issue SABM messages
1514 * to the modem which should then reply with a UA or ADM, at which point
1515 * we will move into open state. Opening is done asynchronously with retry
1516 * running off timers and the responses.
1517 */
1518
1519static void gsm_dlci_begin_open(struct gsm_dlci *dlci)
1520{
1521 struct gsm_mux *gsm = dlci->gsm;
1522 if (dlci->state == DLCI_OPEN || dlci->state == DLCI_OPENING)
1523 return;
1524 dlci->retries = gsm->n2;
1525 dlci->state = DLCI_OPENING;
1526 gsm_command(dlci->gsm, dlci->addr, SABM|PF);
1527 mod_timer(&dlci->t1, jiffies + gsm->t1 * HZ / 100);
1528}
1529
1530/**
1531 * gsm_dlci_begin_close - start channel open procedure
1532 * @dlci: DLCI to open
1533 *
1534 * Commence closing a DLCI from the Linux side. We issue DISC messages
1535 * to the modem which should then reply with a UA, at which point we
1536 * will move into closed state. Closing is done asynchronously with retry
1537 * off timers. We may also receive a DM reply from the other end which
1538 * indicates the channel was already closed.
1539 */
1540
1541static void gsm_dlci_begin_close(struct gsm_dlci *dlci)
1542{
1543 struct gsm_mux *gsm = dlci->gsm;
1544 if (dlci->state == DLCI_CLOSED || dlci->state == DLCI_CLOSING)
1545 return;
1546 dlci->retries = gsm->n2;
1547 dlci->state = DLCI_CLOSING;
1548 gsm_command(dlci->gsm, dlci->addr, DISC|PF);
1549 mod_timer(&dlci->t1, jiffies + gsm->t1 * HZ / 100);
1550}
1551
1552/**
1553 * gsm_dlci_data - data arrived
1554 * @dlci: channel
1555 * @data: block of bytes received
Olivier Deprez157378f2022-04-04 15:47:50 +02001556 * @clen: length of received block
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001557 *
1558 * A UI or UIH frame has arrived which contains data for a channel
1559 * other than the control channel. If the relevant virtual tty is
1560 * open we shovel the bits down it, if not we drop them.
1561 */
1562
David Brazdil0f672f62019-12-10 10:32:29 +00001563static void gsm_dlci_data(struct gsm_dlci *dlci, const u8 *data, int clen)
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001564{
1565 /* krefs .. */
1566 struct tty_port *port = &dlci->port;
1567 struct tty_struct *tty;
1568 unsigned int modem = 0;
1569 int len = clen;
1570
1571 if (debug & 16)
1572 pr_debug("%d bytes for tty\n", len);
1573 switch (dlci->adaption) {
1574 /* Unsupported types */
David Brazdil0f672f62019-12-10 10:32:29 +00001575 case 4: /* Packetised interruptible data */
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001576 break;
David Brazdil0f672f62019-12-10 10:32:29 +00001577 case 3: /* Packetised uininterruptible voice/data */
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001578 break;
David Brazdil0f672f62019-12-10 10:32:29 +00001579 case 2: /* Asynchronous serial with line state in each frame */
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001580 while (gsm_read_ea(&modem, *data++) == 0) {
1581 len--;
1582 if (len == 0)
1583 return;
1584 }
1585 tty = tty_port_tty_get(port);
1586 if (tty) {
1587 gsm_process_modem(tty, dlci, modem, clen);
1588 tty_kref_put(tty);
1589 }
Olivier Deprez157378f2022-04-04 15:47:50 +02001590 fallthrough;
David Brazdil0f672f62019-12-10 10:32:29 +00001591 case 1: /* Line state will go via DLCI 0 controls only */
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001592 default:
1593 tty_insert_flip_string(port, data, len);
1594 tty_flip_buffer_push(port);
1595 }
1596}
1597
1598/**
1599 * gsm_dlci_control - data arrived on control channel
1600 * @dlci: channel
1601 * @data: block of bytes received
1602 * @len: length of received block
1603 *
1604 * A UI or UIH frame has arrived which contains data for DLCI 0 the
1605 * control channel. This should contain a command EA followed by
1606 * control data bytes. The command EA contains a command/response bit
1607 * and we divide up the work accordingly.
1608 */
1609
David Brazdil0f672f62019-12-10 10:32:29 +00001610static void gsm_dlci_command(struct gsm_dlci *dlci, const u8 *data, int len)
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001611{
1612 /* See what command is involved */
1613 unsigned int command = 0;
1614 while (len-- > 0) {
1615 if (gsm_read_ea(&command, *data++) == 1) {
1616 int clen = *data++;
1617 len--;
1618 /* FIXME: this is properly an EA */
1619 clen >>= 1;
1620 /* Malformed command ? */
1621 if (clen > len)
1622 return;
1623 if (command & 1)
1624 gsm_control_message(dlci->gsm, command,
1625 data, clen);
1626 else
1627 gsm_control_response(dlci->gsm, command,
1628 data, clen);
1629 return;
1630 }
1631 }
1632}
1633
1634/*
1635 * Allocate/Free DLCI channels
1636 */
1637
1638/**
1639 * gsm_dlci_alloc - allocate a DLCI
1640 * @gsm: GSM mux
1641 * @addr: address of the DLCI
1642 *
1643 * Allocate and install a new DLCI object into the GSM mux.
1644 *
1645 * FIXME: review locking races
1646 */
1647
1648static struct gsm_dlci *gsm_dlci_alloc(struct gsm_mux *gsm, int addr)
1649{
1650 struct gsm_dlci *dlci = kzalloc(sizeof(struct gsm_dlci), GFP_ATOMIC);
1651 if (dlci == NULL)
1652 return NULL;
1653 spin_lock_init(&dlci->lock);
1654 mutex_init(&dlci->mutex);
Olivier Deprez157378f2022-04-04 15:47:50 +02001655 if (kfifo_alloc(&dlci->fifo, 4096, GFP_KERNEL) < 0) {
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001656 kfree(dlci);
1657 return NULL;
1658 }
1659
1660 skb_queue_head_init(&dlci->skb_list);
1661 timer_setup(&dlci->t1, gsm_dlci_t1, 0);
1662 tty_port_init(&dlci->port);
1663 dlci->port.ops = &gsm_port_ops;
1664 dlci->gsm = gsm;
1665 dlci->addr = addr;
1666 dlci->adaption = gsm->adaption;
1667 dlci->state = DLCI_CLOSED;
1668 if (addr)
1669 dlci->data = gsm_dlci_data;
1670 else
1671 dlci->data = gsm_dlci_command;
1672 gsm->dlci[addr] = dlci;
1673 return dlci;
1674}
1675
1676/**
1677 * gsm_dlci_free - free DLCI
Olivier Deprez157378f2022-04-04 15:47:50 +02001678 * @port: tty port for DLCI to free
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001679 *
1680 * Free up a DLCI.
1681 *
1682 * Can sleep.
1683 */
1684static void gsm_dlci_free(struct tty_port *port)
1685{
1686 struct gsm_dlci *dlci = container_of(port, struct gsm_dlci, port);
1687
1688 del_timer_sync(&dlci->t1);
1689 dlci->gsm->dlci[dlci->addr] = NULL;
Olivier Deprez157378f2022-04-04 15:47:50 +02001690 kfifo_free(&dlci->fifo);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001691 while ((dlci->skb = skb_dequeue(&dlci->skb_list)))
1692 dev_kfree_skb(dlci->skb);
1693 kfree(dlci);
1694}
1695
1696static inline void dlci_get(struct gsm_dlci *dlci)
1697{
1698 tty_port_get(&dlci->port);
1699}
1700
1701static inline void dlci_put(struct gsm_dlci *dlci)
1702{
1703 tty_port_put(&dlci->port);
1704}
1705
1706static void gsm_destroy_network(struct gsm_dlci *dlci);
1707
1708/**
1709 * gsm_dlci_release - release DLCI
1710 * @dlci: DLCI to destroy
1711 *
1712 * Release a DLCI. Actual free is deferred until either
1713 * mux is closed or tty is closed - whichever is last.
1714 *
1715 * Can sleep.
1716 */
1717static void gsm_dlci_release(struct gsm_dlci *dlci)
1718{
1719 struct tty_struct *tty = tty_port_tty_get(&dlci->port);
1720 if (tty) {
1721 mutex_lock(&dlci->mutex);
1722 gsm_destroy_network(dlci);
1723 mutex_unlock(&dlci->mutex);
1724
Olivier Deprez157378f2022-04-04 15:47:50 +02001725 /* We cannot use tty_hangup() because in tty_kref_put() the tty
1726 * driver assumes that the hangup queue is free and reuses it to
1727 * queue release_one_tty() -> NULL pointer panic in
1728 * process_one_work().
1729 */
1730 tty_vhangup(tty);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001731
1732 tty_port_tty_set(&dlci->port, NULL);
1733 tty_kref_put(tty);
1734 }
1735 dlci->state = DLCI_CLOSED;
1736 dlci_put(dlci);
1737}
1738
1739/*
1740 * LAPBish link layer logic
1741 */
1742
1743/**
1744 * gsm_queue - a GSM frame is ready to process
1745 * @gsm: pointer to our gsm mux
1746 *
1747 * At this point in time a frame has arrived and been demangled from
1748 * the line encoding. All the differences between the encodings have
1749 * been handled below us and the frame is unpacked into the structures.
1750 * The fcs holds the header FCS but any data FCS must be added here.
1751 */
1752
1753static void gsm_queue(struct gsm_mux *gsm)
1754{
1755 struct gsm_dlci *dlci;
1756 u8 cr;
1757 int address;
1758 /* We have to sneak a look at the packet body to do the FCS.
1759 A somewhat layering violation in the spec */
1760
1761 if ((gsm->control & ~PF) == UI)
1762 gsm->fcs = gsm_fcs_add_block(gsm->fcs, gsm->buf, gsm->len);
1763 if (gsm->encoding == 0) {
1764 /* WARNING: gsm->received_fcs is used for
1765 gsm->encoding = 0 only.
1766 In this case it contain the last piece of data
1767 required to generate final CRC */
1768 gsm->fcs = gsm_fcs_add(gsm->fcs, gsm->received_fcs);
1769 }
1770 if (gsm->fcs != GOOD_FCS) {
1771 gsm->bad_fcs++;
1772 if (debug & 4)
1773 pr_debug("BAD FCS %02x\n", gsm->fcs);
1774 return;
1775 }
1776 address = gsm->address >> 1;
1777 if (address >= NUM_DLCI)
1778 goto invalid;
1779
1780 cr = gsm->address & 1; /* C/R bit */
1781
1782 gsm_print_packet("<--", address, cr, gsm->control, gsm->buf, gsm->len);
1783
1784 cr ^= 1 - gsm->initiator; /* Flip so 1 always means command */
1785 dlci = gsm->dlci[address];
1786
1787 switch (gsm->control) {
1788 case SABM|PF:
1789 if (cr == 0)
1790 goto invalid;
1791 if (dlci == NULL)
1792 dlci = gsm_dlci_alloc(gsm, address);
1793 if (dlci == NULL)
1794 return;
1795 if (dlci->dead)
1796 gsm_response(gsm, address, DM);
1797 else {
1798 gsm_response(gsm, address, UA);
1799 gsm_dlci_open(dlci);
1800 }
1801 break;
1802 case DISC|PF:
1803 if (cr == 0)
1804 goto invalid;
1805 if (dlci == NULL || dlci->state == DLCI_CLOSED) {
1806 gsm_response(gsm, address, DM);
1807 return;
1808 }
1809 /* Real close complete */
1810 gsm_response(gsm, address, UA);
1811 gsm_dlci_close(dlci);
1812 break;
1813 case UA:
1814 case UA|PF:
1815 if (cr == 0 || dlci == NULL)
1816 break;
1817 switch (dlci->state) {
1818 case DLCI_CLOSING:
1819 gsm_dlci_close(dlci);
1820 break;
1821 case DLCI_OPENING:
1822 gsm_dlci_open(dlci);
1823 break;
Olivier Deprez157378f2022-04-04 15:47:50 +02001824 default:
1825 pr_debug("%s: unhandled state: %d\n", __func__,
1826 dlci->state);
1827 break;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001828 }
1829 break;
1830 case DM: /* DM can be valid unsolicited */
1831 case DM|PF:
1832 if (cr)
1833 goto invalid;
1834 if (dlci == NULL)
1835 return;
1836 gsm_dlci_close(dlci);
1837 break;
1838 case UI:
1839 case UI|PF:
1840 case UIH:
1841 case UIH|PF:
1842#if 0
1843 if (cr)
1844 goto invalid;
1845#endif
1846 if (dlci == NULL || dlci->state != DLCI_OPEN) {
1847 gsm_command(gsm, address, DM|PF);
1848 return;
1849 }
1850 dlci->data(dlci, gsm->buf, gsm->len);
1851 break;
1852 default:
1853 goto invalid;
1854 }
1855 return;
1856invalid:
1857 gsm->malformed++;
1858 return;
1859}
1860
1861
1862/**
1863 * gsm0_receive - perform processing for non-transparency
1864 * @gsm: gsm data for this ldisc instance
1865 * @c: character
1866 *
1867 * Receive bytes in gsm mode 0
1868 */
1869
1870static void gsm0_receive(struct gsm_mux *gsm, unsigned char c)
1871{
1872 unsigned int len;
1873
1874 switch (gsm->state) {
1875 case GSM_SEARCH: /* SOF marker */
1876 if (c == GSM0_SOF) {
1877 gsm->state = GSM_ADDRESS;
1878 gsm->address = 0;
1879 gsm->len = 0;
1880 gsm->fcs = INIT_FCS;
1881 }
1882 break;
1883 case GSM_ADDRESS: /* Address EA */
1884 gsm->fcs = gsm_fcs_add(gsm->fcs, c);
1885 if (gsm_read_ea(&gsm->address, c))
1886 gsm->state = GSM_CONTROL;
1887 break;
1888 case GSM_CONTROL: /* Control Byte */
1889 gsm->fcs = gsm_fcs_add(gsm->fcs, c);
1890 gsm->control = c;
1891 gsm->state = GSM_LEN0;
1892 break;
1893 case GSM_LEN0: /* Length EA */
1894 gsm->fcs = gsm_fcs_add(gsm->fcs, c);
1895 if (gsm_read_ea(&gsm->len, c)) {
1896 if (gsm->len > gsm->mru) {
1897 gsm->bad_size++;
1898 gsm->state = GSM_SEARCH;
1899 break;
1900 }
1901 gsm->count = 0;
1902 if (!gsm->len)
1903 gsm->state = GSM_FCS;
1904 else
1905 gsm->state = GSM_DATA;
1906 break;
1907 }
1908 gsm->state = GSM_LEN1;
1909 break;
1910 case GSM_LEN1:
1911 gsm->fcs = gsm_fcs_add(gsm->fcs, c);
1912 len = c;
1913 gsm->len |= len << 7;
1914 if (gsm->len > gsm->mru) {
1915 gsm->bad_size++;
1916 gsm->state = GSM_SEARCH;
1917 break;
1918 }
1919 gsm->count = 0;
1920 if (!gsm->len)
1921 gsm->state = GSM_FCS;
1922 else
1923 gsm->state = GSM_DATA;
1924 break;
1925 case GSM_DATA: /* Data */
1926 gsm->buf[gsm->count++] = c;
1927 if (gsm->count == gsm->len)
1928 gsm->state = GSM_FCS;
1929 break;
1930 case GSM_FCS: /* FCS follows the packet */
1931 gsm->received_fcs = c;
1932 gsm_queue(gsm);
1933 gsm->state = GSM_SSOF;
1934 break;
1935 case GSM_SSOF:
1936 if (c == GSM0_SOF) {
1937 gsm->state = GSM_SEARCH;
1938 break;
1939 }
1940 break;
Olivier Deprez157378f2022-04-04 15:47:50 +02001941 default:
1942 pr_debug("%s: unhandled state: %d\n", __func__, gsm->state);
1943 break;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001944 }
1945}
1946
1947/**
1948 * gsm1_receive - perform processing for non-transparency
1949 * @gsm: gsm data for this ldisc instance
1950 * @c: character
1951 *
1952 * Receive bytes in mode 1 (Advanced option)
1953 */
1954
1955static void gsm1_receive(struct gsm_mux *gsm, unsigned char c)
1956{
1957 if (c == GSM1_SOF) {
1958 /* EOF is only valid in frame if we have got to the data state
1959 and received at least one byte (the FCS) */
1960 if (gsm->state == GSM_DATA && gsm->count) {
1961 /* Extract the FCS */
1962 gsm->count--;
1963 gsm->fcs = gsm_fcs_add(gsm->fcs, gsm->buf[gsm->count]);
1964 gsm->len = gsm->count;
1965 gsm_queue(gsm);
1966 gsm->state = GSM_START;
1967 return;
1968 }
1969 /* Any partial frame was a runt so go back to start */
1970 if (gsm->state != GSM_START) {
1971 gsm->malformed++;
1972 gsm->state = GSM_START;
1973 }
1974 /* A SOF in GSM_START means we are still reading idling or
1975 framing bytes */
1976 return;
1977 }
1978
1979 if (c == GSM1_ESCAPE) {
Olivier Deprez157378f2022-04-04 15:47:50 +02001980 gsm->escape = true;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001981 return;
1982 }
1983
1984 /* Only an unescaped SOF gets us out of GSM search */
1985 if (gsm->state == GSM_SEARCH)
1986 return;
1987
1988 if (gsm->escape) {
1989 c ^= GSM1_ESCAPE_BITS;
Olivier Deprez157378f2022-04-04 15:47:50 +02001990 gsm->escape = false;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001991 }
1992 switch (gsm->state) {
1993 case GSM_START: /* First byte after SOF */
1994 gsm->address = 0;
1995 gsm->state = GSM_ADDRESS;
1996 gsm->fcs = INIT_FCS;
Olivier Deprez157378f2022-04-04 15:47:50 +02001997 fallthrough;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001998 case GSM_ADDRESS: /* Address continuation */
1999 gsm->fcs = gsm_fcs_add(gsm->fcs, c);
2000 if (gsm_read_ea(&gsm->address, c))
2001 gsm->state = GSM_CONTROL;
2002 break;
2003 case GSM_CONTROL: /* Control Byte */
2004 gsm->fcs = gsm_fcs_add(gsm->fcs, c);
2005 gsm->control = c;
2006 gsm->count = 0;
2007 gsm->state = GSM_DATA;
2008 break;
2009 case GSM_DATA: /* Data */
2010 if (gsm->count > gsm->mru) { /* Allow one for the FCS */
2011 gsm->state = GSM_OVERRUN;
2012 gsm->bad_size++;
2013 } else
2014 gsm->buf[gsm->count++] = c;
2015 break;
2016 case GSM_OVERRUN: /* Over-long - eg a dropped SOF */
2017 break;
Olivier Deprez157378f2022-04-04 15:47:50 +02002018 default:
2019 pr_debug("%s: unhandled state: %d\n", __func__, gsm->state);
2020 break;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002021 }
2022}
2023
2024/**
2025 * gsm_error - handle tty error
2026 * @gsm: ldisc data
2027 * @data: byte received (may be invalid)
2028 * @flag: error received
2029 *
2030 * Handle an error in the receipt of data for a frame. Currently we just
2031 * go back to hunting for a SOF.
2032 *
2033 * FIXME: better diagnostics ?
2034 */
2035
2036static void gsm_error(struct gsm_mux *gsm,
2037 unsigned char data, unsigned char flag)
2038{
2039 gsm->state = GSM_SEARCH;
2040 gsm->io_error++;
2041}
2042
2043static int gsm_disconnect(struct gsm_mux *gsm)
2044{
2045 struct gsm_dlci *dlci = gsm->dlci[0];
2046 struct gsm_control *gc;
2047
2048 if (!dlci)
2049 return 0;
2050
2051 /* In theory disconnecting DLCI 0 is sufficient but for some
2052 modems this is apparently not the case. */
2053 gc = gsm_control_send(gsm, CMD_CLD, NULL, 0);
2054 if (gc)
2055 gsm_control_wait(gsm, gc);
2056
2057 del_timer_sync(&gsm->t2_timer);
2058 /* Now we are sure T2 has stopped */
2059
2060 gsm_dlci_begin_close(dlci);
2061 wait_event_interruptible(gsm->event,
2062 dlci->state == DLCI_CLOSED);
2063
2064 if (signal_pending(current))
2065 return -EINTR;
2066
2067 return 0;
2068}
2069
2070/**
2071 * gsm_cleanup_mux - generic GSM protocol cleanup
2072 * @gsm: our mux
2073 *
2074 * Clean up the bits of the mux which are the same for all framing
2075 * protocols. Remove the mux from the mux table, stop all the timers
2076 * and then shut down each device hanging up the channels as we go.
2077 */
2078
2079static void gsm_cleanup_mux(struct gsm_mux *gsm)
2080{
2081 int i;
2082 struct gsm_dlci *dlci = gsm->dlci[0];
2083 struct gsm_msg *txq, *ntxq;
2084
Olivier Deprez157378f2022-04-04 15:47:50 +02002085 gsm->dead = true;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002086
2087 spin_lock(&gsm_mux_lock);
2088 for (i = 0; i < MAX_MUX; i++) {
2089 if (gsm_mux[i] == gsm) {
2090 gsm_mux[i] = NULL;
2091 break;
2092 }
2093 }
2094 spin_unlock(&gsm_mux_lock);
2095 /* open failed before registering => nothing to do */
2096 if (i == MAX_MUX)
2097 return;
2098
2099 del_timer_sync(&gsm->t2_timer);
2100 /* Now we are sure T2 has stopped */
2101 if (dlci)
Olivier Deprez157378f2022-04-04 15:47:50 +02002102 dlci->dead = true;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002103
2104 /* Free up any link layer users */
2105 mutex_lock(&gsm->mutex);
2106 for (i = 0; i < NUM_DLCI; i++)
2107 if (gsm->dlci[i])
2108 gsm_dlci_release(gsm->dlci[i]);
2109 mutex_unlock(&gsm->mutex);
2110 /* Now wipe the queues */
2111 list_for_each_entry_safe(txq, ntxq, &gsm->tx_list, list)
2112 kfree(txq);
2113 INIT_LIST_HEAD(&gsm->tx_list);
2114}
2115
2116/**
2117 * gsm_activate_mux - generic GSM setup
2118 * @gsm: our mux
2119 *
2120 * Set up the bits of the mux which are the same for all framing
2121 * protocols. Add the mux to the mux table so it can be opened and
2122 * finally kick off connecting to DLCI 0 on the modem.
2123 */
2124
2125static int gsm_activate_mux(struct gsm_mux *gsm)
2126{
2127 struct gsm_dlci *dlci;
2128 int i = 0;
2129
2130 timer_setup(&gsm->t2_timer, gsm_control_retransmit, 0);
2131 init_waitqueue_head(&gsm->event);
2132 spin_lock_init(&gsm->control_lock);
2133 spin_lock_init(&gsm->tx_lock);
2134
2135 if (gsm->encoding == 0)
2136 gsm->receive = gsm0_receive;
2137 else
2138 gsm->receive = gsm1_receive;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002139
2140 spin_lock(&gsm_mux_lock);
2141 for (i = 0; i < MAX_MUX; i++) {
2142 if (gsm_mux[i] == NULL) {
2143 gsm->num = i;
2144 gsm_mux[i] = gsm;
2145 break;
2146 }
2147 }
2148 spin_unlock(&gsm_mux_lock);
2149 if (i == MAX_MUX)
2150 return -EBUSY;
2151
2152 dlci = gsm_dlci_alloc(gsm, 0);
2153 if (dlci == NULL)
2154 return -ENOMEM;
Olivier Deprez157378f2022-04-04 15:47:50 +02002155 gsm->dead = false; /* Tty opens are now permissible */
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002156 return 0;
2157}
2158
2159/**
2160 * gsm_free_mux - free up a mux
Olivier Deprez157378f2022-04-04 15:47:50 +02002161 * @gsm: mux to free
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002162 *
2163 * Dispose of allocated resources for a dead mux
2164 */
2165static void gsm_free_mux(struct gsm_mux *gsm)
2166{
2167 kfree(gsm->txframe);
2168 kfree(gsm->buf);
2169 kfree(gsm);
2170}
2171
2172/**
2173 * gsm_free_muxr - free up a mux
Olivier Deprez157378f2022-04-04 15:47:50 +02002174 * @ref: kreference to the mux to free
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002175 *
2176 * Dispose of allocated resources for a dead mux
2177 */
2178static void gsm_free_muxr(struct kref *ref)
2179{
2180 struct gsm_mux *gsm = container_of(ref, struct gsm_mux, ref);
2181 gsm_free_mux(gsm);
2182}
2183
2184static inline void mux_get(struct gsm_mux *gsm)
2185{
2186 kref_get(&gsm->ref);
2187}
2188
2189static inline void mux_put(struct gsm_mux *gsm)
2190{
2191 kref_put(&gsm->ref, gsm_free_muxr);
2192}
2193
David Brazdil0f672f62019-12-10 10:32:29 +00002194static inline unsigned int mux_num_to_base(struct gsm_mux *gsm)
2195{
2196 return gsm->num * NUM_DLCI;
2197}
2198
2199static inline unsigned int mux_line_to_num(unsigned int line)
2200{
2201 return line / NUM_DLCI;
2202}
2203
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002204/**
2205 * gsm_alloc_mux - allocate a mux
2206 *
2207 * Creates a new mux ready for activation.
2208 */
2209
2210static struct gsm_mux *gsm_alloc_mux(void)
2211{
2212 struct gsm_mux *gsm = kzalloc(sizeof(struct gsm_mux), GFP_KERNEL);
2213 if (gsm == NULL)
2214 return NULL;
2215 gsm->buf = kmalloc(MAX_MRU + 1, GFP_KERNEL);
2216 if (gsm->buf == NULL) {
2217 kfree(gsm);
2218 return NULL;
2219 }
2220 gsm->txframe = kmalloc(2 * MAX_MRU + 2, GFP_KERNEL);
2221 if (gsm->txframe == NULL) {
2222 kfree(gsm->buf);
2223 kfree(gsm);
2224 return NULL;
2225 }
2226 spin_lock_init(&gsm->lock);
2227 mutex_init(&gsm->mutex);
2228 kref_init(&gsm->ref);
2229 INIT_LIST_HEAD(&gsm->tx_list);
2230
2231 gsm->t1 = T1;
2232 gsm->t2 = T2;
2233 gsm->n2 = N2;
2234 gsm->ftype = UIH;
2235 gsm->adaption = 1;
2236 gsm->encoding = 1;
2237 gsm->mru = 64; /* Default to encoding 1 so these should be 64 */
2238 gsm->mtu = 64;
Olivier Deprez157378f2022-04-04 15:47:50 +02002239 gsm->dead = true; /* Avoid early tty opens */
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002240
2241 return gsm;
2242}
2243
David Brazdil0f672f62019-12-10 10:32:29 +00002244static void gsm_copy_config_values(struct gsm_mux *gsm,
2245 struct gsm_config *c)
2246{
2247 memset(c, 0, sizeof(*c));
2248 c->adaption = gsm->adaption;
2249 c->encapsulation = gsm->encoding;
2250 c->initiator = gsm->initiator;
2251 c->t1 = gsm->t1;
2252 c->t2 = gsm->t2;
2253 c->t3 = 0; /* Not supported */
2254 c->n2 = gsm->n2;
2255 if (gsm->ftype == UIH)
2256 c->i = 1;
2257 else
2258 c->i = 2;
2259 pr_debug("Ftype %d i %d\n", gsm->ftype, c->i);
2260 c->mru = gsm->mru;
2261 c->mtu = gsm->mtu;
2262 c->k = 0;
2263}
2264
2265static int gsm_config(struct gsm_mux *gsm, struct gsm_config *c)
2266{
2267 int need_close = 0;
2268 int need_restart = 0;
2269
2270 /* Stuff we don't support yet - UI or I frame transport, windowing */
2271 if ((c->adaption != 1 && c->adaption != 2) || c->k)
2272 return -EOPNOTSUPP;
2273 /* Check the MRU/MTU range looks sane */
2274 if (c->mru > MAX_MRU || c->mtu > MAX_MTU || c->mru < 8 || c->mtu < 8)
2275 return -EINVAL;
2276 if (c->n2 < 3)
2277 return -EINVAL;
2278 if (c->encapsulation > 1) /* Basic, advanced, no I */
2279 return -EINVAL;
2280 if (c->initiator > 1)
2281 return -EINVAL;
2282 if (c->i == 0 || c->i > 2) /* UIH and UI only */
2283 return -EINVAL;
2284 /*
2285 * See what is needed for reconfiguration
2286 */
2287
2288 /* Timing fields */
2289 if (c->t1 != 0 && c->t1 != gsm->t1)
2290 need_restart = 1;
2291 if (c->t2 != 0 && c->t2 != gsm->t2)
2292 need_restart = 1;
2293 if (c->encapsulation != gsm->encoding)
2294 need_restart = 1;
2295 if (c->adaption != gsm->adaption)
2296 need_restart = 1;
2297 /* Requires care */
2298 if (c->initiator != gsm->initiator)
2299 need_close = 1;
2300 if (c->mru != gsm->mru)
2301 need_restart = 1;
2302 if (c->mtu != gsm->mtu)
2303 need_restart = 1;
2304
2305 /*
2306 * Close down what is needed, restart and initiate the new
2307 * configuration
2308 */
2309
2310 if (need_close || need_restart) {
2311 int ret;
2312
2313 ret = gsm_disconnect(gsm);
2314
2315 if (ret)
2316 return ret;
2317 }
2318 if (need_restart)
2319 gsm_cleanup_mux(gsm);
2320
2321 gsm->initiator = c->initiator;
2322 gsm->mru = c->mru;
2323 gsm->mtu = c->mtu;
2324 gsm->encoding = c->encapsulation;
2325 gsm->adaption = c->adaption;
2326 gsm->n2 = c->n2;
2327
2328 if (c->i == 1)
2329 gsm->ftype = UIH;
2330 else if (c->i == 2)
2331 gsm->ftype = UI;
2332
2333 if (c->t1)
2334 gsm->t1 = c->t1;
2335 if (c->t2)
2336 gsm->t2 = c->t2;
2337
2338 /*
2339 * FIXME: We need to separate activation/deactivation from adding
2340 * and removing from the mux array
2341 */
2342 if (need_restart)
2343 gsm_activate_mux(gsm);
2344 if (gsm->initiator && need_close)
2345 gsm_dlci_begin_open(gsm->dlci[0]);
2346 return 0;
2347}
2348
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002349/**
2350 * gsmld_output - write to link
2351 * @gsm: our mux
2352 * @data: bytes to output
2353 * @len: size
2354 *
2355 * Write a block of data from the GSM mux to the data channel. This
2356 * will eventually be serialized from above but at the moment isn't.
2357 */
2358
2359static int gsmld_output(struct gsm_mux *gsm, u8 *data, int len)
2360{
2361 if (tty_write_room(gsm->tty) < len) {
2362 set_bit(TTY_DO_WRITE_WAKEUP, &gsm->tty->flags);
2363 return -ENOSPC;
2364 }
2365 if (debug & 4)
2366 print_hex_dump_bytes("gsmld_output: ", DUMP_PREFIX_OFFSET,
2367 data, len);
2368 gsm->tty->ops->write(gsm->tty, data, len);
2369 return len;
2370}
2371
2372/**
2373 * gsmld_attach_gsm - mode set up
2374 * @tty: our tty structure
2375 * @gsm: our mux
2376 *
2377 * Set up the MUX for basic mode and commence connecting to the
2378 * modem. Currently called from the line discipline set up but
2379 * will need moving to an ioctl path.
2380 */
2381
2382static int gsmld_attach_gsm(struct tty_struct *tty, struct gsm_mux *gsm)
2383{
David Brazdil0f672f62019-12-10 10:32:29 +00002384 unsigned int base;
2385 int ret, i;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002386
2387 gsm->tty = tty_kref_get(tty);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002388 ret = gsm_activate_mux(gsm);
2389 if (ret != 0)
2390 tty_kref_put(gsm->tty);
2391 else {
2392 /* Don't register device 0 - this is the control channel and not
2393 a usable tty interface */
David Brazdil0f672f62019-12-10 10:32:29 +00002394 base = mux_num_to_base(gsm); /* Base for this MUX */
Olivier Deprez0e641232021-09-23 10:07:05 +02002395 for (i = 1; i < NUM_DLCI; i++) {
2396 struct device *dev;
2397
2398 dev = tty_register_device(gsm_tty_driver,
2399 base + i, NULL);
2400 if (IS_ERR(dev)) {
2401 for (i--; i >= 1; i--)
2402 tty_unregister_device(gsm_tty_driver,
2403 base + i);
2404 return PTR_ERR(dev);
2405 }
2406 }
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002407 }
2408 return ret;
2409}
2410
2411
2412/**
2413 * gsmld_detach_gsm - stop doing 0710 mux
2414 * @tty: tty attached to the mux
2415 * @gsm: mux
2416 *
2417 * Shutdown and then clean up the resources used by the line discipline
2418 */
2419
2420static void gsmld_detach_gsm(struct tty_struct *tty, struct gsm_mux *gsm)
2421{
David Brazdil0f672f62019-12-10 10:32:29 +00002422 unsigned int base = mux_num_to_base(gsm); /* Base for this MUX */
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002423 int i;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002424
2425 WARN_ON(tty != gsm->tty);
2426 for (i = 1; i < NUM_DLCI; i++)
2427 tty_unregister_device(gsm_tty_driver, base + i);
2428 gsm_cleanup_mux(gsm);
2429 tty_kref_put(gsm->tty);
2430 gsm->tty = NULL;
2431}
2432
2433static void gsmld_receive_buf(struct tty_struct *tty, const unsigned char *cp,
2434 char *fp, int count)
2435{
2436 struct gsm_mux *gsm = tty->disc_data;
2437 const unsigned char *dp;
2438 char *f;
2439 int i;
2440 char flags = TTY_NORMAL;
2441
2442 if (debug & 4)
2443 print_hex_dump_bytes("gsmld_receive: ", DUMP_PREFIX_OFFSET,
2444 cp, count);
2445
2446 for (i = count, dp = cp, f = fp; i; i--, dp++) {
2447 if (f)
2448 flags = *f++;
2449 switch (flags) {
2450 case TTY_NORMAL:
2451 gsm->receive(gsm, *dp);
2452 break;
2453 case TTY_OVERRUN:
2454 case TTY_BREAK:
2455 case TTY_PARITY:
2456 case TTY_FRAME:
Olivier Deprez157378f2022-04-04 15:47:50 +02002457 gsm_error(gsm, *dp, flags);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002458 break;
2459 default:
2460 WARN_ONCE(1, "%s: unknown flag %d\n",
2461 tty_name(tty), flags);
2462 break;
2463 }
2464 }
2465 /* FASYNC if needed ? */
2466 /* If clogged call tty_throttle(tty); */
2467}
2468
2469/**
2470 * gsmld_flush_buffer - clean input queue
2471 * @tty: terminal device
2472 *
2473 * Flush the input buffer. Called when the line discipline is
2474 * being closed, when the tty layer wants the buffer flushed (eg
2475 * at hangup).
2476 */
2477
2478static void gsmld_flush_buffer(struct tty_struct *tty)
2479{
2480}
2481
2482/**
2483 * gsmld_close - close the ldisc for this tty
2484 * @tty: device
2485 *
2486 * Called from the terminal layer when this line discipline is
2487 * being shut down, either because of a close or becsuse of a
2488 * discipline change. The function will not be called while other
2489 * ldisc methods are in progress.
2490 */
2491
2492static void gsmld_close(struct tty_struct *tty)
2493{
2494 struct gsm_mux *gsm = tty->disc_data;
2495
2496 gsmld_detach_gsm(tty, gsm);
2497
2498 gsmld_flush_buffer(tty);
2499 /* Do other clean up here */
2500 mux_put(gsm);
2501}
2502
2503/**
2504 * gsmld_open - open an ldisc
2505 * @tty: terminal to open
2506 *
2507 * Called when this line discipline is being attached to the
2508 * terminal device. Can sleep. Called serialized so that no
2509 * other events will occur in parallel. No further open will occur
2510 * until a close.
2511 */
2512
2513static int gsmld_open(struct tty_struct *tty)
2514{
2515 struct gsm_mux *gsm;
2516 int ret;
2517
2518 if (tty->ops->write == NULL)
2519 return -EINVAL;
2520
2521 /* Attach our ldisc data */
2522 gsm = gsm_alloc_mux();
2523 if (gsm == NULL)
2524 return -ENOMEM;
2525
2526 tty->disc_data = gsm;
2527 tty->receive_room = 65536;
2528
2529 /* Attach the initial passive connection */
2530 gsm->encoding = 1;
2531
2532 ret = gsmld_attach_gsm(tty, gsm);
2533 if (ret != 0) {
2534 gsm_cleanup_mux(gsm);
2535 mux_put(gsm);
2536 }
2537 return ret;
2538}
2539
2540/**
2541 * gsmld_write_wakeup - asynchronous I/O notifier
2542 * @tty: tty device
2543 *
2544 * Required for the ptys, serial driver etc. since processes
2545 * that attach themselves to the master and rely on ASYNC
2546 * IO must be woken up
2547 */
2548
2549static void gsmld_write_wakeup(struct tty_struct *tty)
2550{
2551 struct gsm_mux *gsm = tty->disc_data;
2552 unsigned long flags;
2553
2554 /* Queue poll */
2555 clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
2556 spin_lock_irqsave(&gsm->tx_lock, flags);
Olivier Deprez0e641232021-09-23 10:07:05 +02002557 gsm_data_kick(gsm, NULL);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002558 if (gsm->tx_bytes < TX_THRESH_LO) {
2559 gsm_dlci_data_sweep(gsm);
2560 }
2561 spin_unlock_irqrestore(&gsm->tx_lock, flags);
2562}
2563
2564/**
2565 * gsmld_read - read function for tty
2566 * @tty: tty device
2567 * @file: file object
2568 * @buf: userspace buffer pointer
2569 * @nr: size of I/O
2570 *
2571 * Perform reads for the line discipline. We are guaranteed that the
2572 * line discipline will not be closed under us but we may get multiple
2573 * parallel readers and must handle this ourselves. We may also get
2574 * a hangup. Always called in user context, may sleep.
2575 *
2576 * This code must be sure never to sleep through a hangup.
2577 */
2578
2579static ssize_t gsmld_read(struct tty_struct *tty, struct file *file,
Olivier Deprez157378f2022-04-04 15:47:50 +02002580 unsigned char *buf, size_t nr,
2581 void **cookie, unsigned long offset)
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002582{
2583 return -EOPNOTSUPP;
2584}
2585
2586/**
2587 * gsmld_write - write function for tty
2588 * @tty: tty device
2589 * @file: file object
2590 * @buf: userspace buffer pointer
2591 * @nr: size of I/O
2592 *
2593 * Called when the owner of the device wants to send a frame
2594 * itself (or some other control data). The data is transferred
2595 * as-is and must be properly framed and checksummed as appropriate
2596 * by userspace. Frames are either sent whole or not at all as this
2597 * avoids pain user side.
2598 */
2599
2600static ssize_t gsmld_write(struct tty_struct *tty, struct file *file,
2601 const unsigned char *buf, size_t nr)
2602{
2603 int space = tty_write_room(tty);
2604 if (space >= nr)
2605 return tty->ops->write(tty, buf, nr);
2606 set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
2607 return -ENOBUFS;
2608}
2609
2610/**
2611 * gsmld_poll - poll method for N_GSM0710
2612 * @tty: terminal device
2613 * @file: file accessing it
2614 * @wait: poll table
2615 *
2616 * Called when the line discipline is asked to poll() for data or
2617 * for special events. This code is not serialized with respect to
2618 * other events save open/close.
2619 *
2620 * This code must be sure never to sleep through a hangup.
2621 * Called without the kernel lock held - fine
2622 */
2623
2624static __poll_t gsmld_poll(struct tty_struct *tty, struct file *file,
2625 poll_table *wait)
2626{
2627 __poll_t mask = 0;
2628 struct gsm_mux *gsm = tty->disc_data;
2629
2630 poll_wait(file, &tty->read_wait, wait);
2631 poll_wait(file, &tty->write_wait, wait);
2632 if (tty_hung_up_p(file))
2633 mask |= EPOLLHUP;
2634 if (!tty_is_writelocked(tty) && tty_write_room(tty) > 0)
2635 mask |= EPOLLOUT | EPOLLWRNORM;
2636 if (gsm->dead)
2637 mask |= EPOLLHUP;
2638 return mask;
2639}
2640
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002641static int gsmld_ioctl(struct tty_struct *tty, struct file *file,
2642 unsigned int cmd, unsigned long arg)
2643{
2644 struct gsm_config c;
2645 struct gsm_mux *gsm = tty->disc_data;
David Brazdil0f672f62019-12-10 10:32:29 +00002646 unsigned int base;
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002647
2648 switch (cmd) {
2649 case GSMIOC_GETCONF:
David Brazdil0f672f62019-12-10 10:32:29 +00002650 gsm_copy_config_values(gsm, &c);
Olivier Deprez157378f2022-04-04 15:47:50 +02002651 if (copy_to_user((void __user *)arg, &c, sizeof(c)))
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002652 return -EFAULT;
2653 return 0;
2654 case GSMIOC_SETCONF:
Olivier Deprez157378f2022-04-04 15:47:50 +02002655 if (copy_from_user(&c, (void __user *)arg, sizeof(c)))
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002656 return -EFAULT;
David Brazdil0f672f62019-12-10 10:32:29 +00002657 return gsm_config(gsm, &c);
2658 case GSMIOC_GETFIRST:
2659 base = mux_num_to_base(gsm);
2660 return put_user(base + 1, (__u32 __user *)arg);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002661 default:
2662 return n_tty_ioctl_helper(tty, file, cmd, arg);
2663 }
2664}
2665
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002666/*
2667 * Network interface
2668 *
2669 */
2670
2671static int gsm_mux_net_open(struct net_device *net)
2672{
2673 pr_debug("%s called\n", __func__);
2674 netif_start_queue(net);
2675 return 0;
2676}
2677
2678static int gsm_mux_net_close(struct net_device *net)
2679{
2680 netif_stop_queue(net);
2681 return 0;
2682}
2683
2684static void dlci_net_free(struct gsm_dlci *dlci)
2685{
2686 if (!dlci->net) {
2687 WARN_ON(1);
2688 return;
2689 }
2690 dlci->adaption = dlci->prev_adaption;
2691 dlci->data = dlci->prev_data;
2692 free_netdev(dlci->net);
2693 dlci->net = NULL;
2694}
2695static void net_free(struct kref *ref)
2696{
2697 struct gsm_mux_net *mux_net;
2698 struct gsm_dlci *dlci;
2699
2700 mux_net = container_of(ref, struct gsm_mux_net, ref);
2701 dlci = mux_net->dlci;
2702
2703 if (dlci->net) {
2704 unregister_netdev(dlci->net);
2705 dlci_net_free(dlci);
2706 }
2707}
2708
2709static inline void muxnet_get(struct gsm_mux_net *mux_net)
2710{
2711 kref_get(&mux_net->ref);
2712}
2713
2714static inline void muxnet_put(struct gsm_mux_net *mux_net)
2715{
2716 kref_put(&mux_net->ref, net_free);
2717}
2718
2719static netdev_tx_t gsm_mux_net_start_xmit(struct sk_buff *skb,
2720 struct net_device *net)
2721{
2722 struct gsm_mux_net *mux_net = netdev_priv(net);
2723 struct gsm_dlci *dlci = mux_net->dlci;
2724 muxnet_get(mux_net);
2725
2726 skb_queue_head(&dlci->skb_list, skb);
2727 net->stats.tx_packets++;
2728 net->stats.tx_bytes += skb->len;
2729 gsm_dlci_data_kick(dlci);
2730 /* And tell the kernel when the last transmit started. */
2731 netif_trans_update(net);
2732 muxnet_put(mux_net);
2733 return NETDEV_TX_OK;
2734}
2735
2736/* called when a packet did not ack after watchdogtimeout */
Olivier Deprez157378f2022-04-04 15:47:50 +02002737static void gsm_mux_net_tx_timeout(struct net_device *net, unsigned int txqueue)
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002738{
2739 /* Tell syslog we are hosed. */
2740 dev_dbg(&net->dev, "Tx timed out.\n");
2741
2742 /* Update statistics */
2743 net->stats.tx_errors++;
2744}
2745
2746static void gsm_mux_rx_netchar(struct gsm_dlci *dlci,
David Brazdil0f672f62019-12-10 10:32:29 +00002747 const unsigned char *in_buf, int size)
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002748{
2749 struct net_device *net = dlci->net;
2750 struct sk_buff *skb;
2751 struct gsm_mux_net *mux_net = netdev_priv(net);
2752 muxnet_get(mux_net);
2753
2754 /* Allocate an sk_buff */
2755 skb = dev_alloc_skb(size + NET_IP_ALIGN);
2756 if (!skb) {
2757 /* We got no receive buffer. */
2758 net->stats.rx_dropped++;
2759 muxnet_put(mux_net);
2760 return;
2761 }
2762 skb_reserve(skb, NET_IP_ALIGN);
2763 skb_put_data(skb, in_buf, size);
2764
2765 skb->dev = net;
2766 skb->protocol = htons(ETH_P_IP);
2767
2768 /* Ship it off to the kernel */
2769 netif_rx(skb);
2770
2771 /* update out statistics */
2772 net->stats.rx_packets++;
2773 net->stats.rx_bytes += size;
2774 muxnet_put(mux_net);
2775 return;
2776}
2777
2778static void gsm_mux_net_init(struct net_device *net)
2779{
2780 static const struct net_device_ops gsm_netdev_ops = {
2781 .ndo_open = gsm_mux_net_open,
2782 .ndo_stop = gsm_mux_net_close,
2783 .ndo_start_xmit = gsm_mux_net_start_xmit,
2784 .ndo_tx_timeout = gsm_mux_net_tx_timeout,
2785 };
2786
2787 net->netdev_ops = &gsm_netdev_ops;
2788
2789 /* fill in the other fields */
2790 net->watchdog_timeo = GSM_NET_TX_TIMEOUT;
2791 net->flags = IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST;
2792 net->type = ARPHRD_NONE;
2793 net->tx_queue_len = 10;
2794}
2795
2796
2797/* caller holds the dlci mutex */
2798static void gsm_destroy_network(struct gsm_dlci *dlci)
2799{
2800 struct gsm_mux_net *mux_net;
2801
Olivier Deprez157378f2022-04-04 15:47:50 +02002802 pr_debug("destroy network interface\n");
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002803 if (!dlci->net)
2804 return;
2805 mux_net = netdev_priv(dlci->net);
2806 muxnet_put(mux_net);
2807}
2808
2809
2810/* caller holds the dlci mutex */
2811static int gsm_create_network(struct gsm_dlci *dlci, struct gsm_netconfig *nc)
2812{
2813 char *netname;
2814 int retval = 0;
2815 struct net_device *net;
2816 struct gsm_mux_net *mux_net;
2817
2818 if (!capable(CAP_NET_ADMIN))
2819 return -EPERM;
2820
2821 /* Already in a non tty mode */
2822 if (dlci->adaption > 2)
2823 return -EBUSY;
2824
2825 if (nc->protocol != htons(ETH_P_IP))
2826 return -EPROTONOSUPPORT;
2827
2828 if (nc->adaption != 3 && nc->adaption != 4)
2829 return -EPROTONOSUPPORT;
2830
Olivier Deprez157378f2022-04-04 15:47:50 +02002831 pr_debug("create network interface\n");
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002832
2833 netname = "gsm%d";
2834 if (nc->if_name[0] != '\0')
2835 netname = nc->if_name;
2836 net = alloc_netdev(sizeof(struct gsm_mux_net), netname,
2837 NET_NAME_UNKNOWN, gsm_mux_net_init);
2838 if (!net) {
Olivier Deprez157378f2022-04-04 15:47:50 +02002839 pr_err("alloc_netdev failed\n");
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002840 return -ENOMEM;
2841 }
2842 net->mtu = dlci->gsm->mtu;
2843 net->min_mtu = 8;
2844 net->max_mtu = dlci->gsm->mtu;
2845 mux_net = netdev_priv(net);
2846 mux_net->dlci = dlci;
2847 kref_init(&mux_net->ref);
2848 strncpy(nc->if_name, net->name, IFNAMSIZ); /* return net name */
2849
2850 /* reconfigure dlci for network */
2851 dlci->prev_adaption = dlci->adaption;
2852 dlci->prev_data = dlci->data;
2853 dlci->adaption = nc->adaption;
2854 dlci->data = gsm_mux_rx_netchar;
2855 dlci->net = net;
2856
Olivier Deprez157378f2022-04-04 15:47:50 +02002857 pr_debug("register netdev\n");
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002858 retval = register_netdev(net);
2859 if (retval) {
2860 pr_err("network register fail %d\n", retval);
2861 dlci_net_free(dlci);
2862 return retval;
2863 }
2864 return net->ifindex; /* return network index */
2865}
2866
2867/* Line discipline for real tty */
2868static struct tty_ldisc_ops tty_ldisc_packet = {
2869 .owner = THIS_MODULE,
2870 .magic = TTY_LDISC_MAGIC,
2871 .name = "n_gsm",
2872 .open = gsmld_open,
2873 .close = gsmld_close,
2874 .flush_buffer = gsmld_flush_buffer,
2875 .read = gsmld_read,
2876 .write = gsmld_write,
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002877 .ioctl = gsmld_ioctl,
2878 .poll = gsmld_poll,
2879 .receive_buf = gsmld_receive_buf,
2880 .write_wakeup = gsmld_write_wakeup
2881};
2882
2883/*
2884 * Virtual tty side
2885 */
2886
2887#define TX_SIZE 512
2888
2889static int gsmtty_modem_update(struct gsm_dlci *dlci, u8 brk)
2890{
2891 u8 modembits[5];
2892 struct gsm_control *ctrl;
2893 int len = 2;
2894
2895 if (brk)
2896 len++;
2897
2898 modembits[0] = len << 1 | EA; /* Data bytes */
2899 modembits[1] = dlci->addr << 2 | 3; /* DLCI, EA, 1 */
2900 modembits[2] = gsm_encode_modem(dlci) << 1 | EA;
2901 if (brk)
2902 modembits[3] = brk << 4 | 2 | EA; /* Valid, EA */
2903 ctrl = gsm_control_send(dlci->gsm, CMD_MSC, modembits, len + 1);
2904 if (ctrl == NULL)
2905 return -ENOMEM;
2906 return gsm_control_wait(dlci->gsm, ctrl);
2907}
2908
2909static int gsm_carrier_raised(struct tty_port *port)
2910{
2911 struct gsm_dlci *dlci = container_of(port, struct gsm_dlci, port);
2912 struct gsm_mux *gsm = dlci->gsm;
2913
2914 /* Not yet open so no carrier info */
2915 if (dlci->state != DLCI_OPEN)
2916 return 0;
2917 if (debug & 2)
2918 return 1;
2919
2920 /*
2921 * Basic mode with control channel in ADM mode may not respond
2922 * to CMD_MSC at all and modem_rx is empty.
2923 */
2924 if (gsm->encoding == 0 && gsm->dlci[0]->mode == DLCI_MODE_ADM &&
2925 !dlci->modem_rx)
2926 return 1;
2927
2928 return dlci->modem_rx & TIOCM_CD;
2929}
2930
2931static void gsm_dtr_rts(struct tty_port *port, int onoff)
2932{
2933 struct gsm_dlci *dlci = container_of(port, struct gsm_dlci, port);
2934 unsigned int modem_tx = dlci->modem_tx;
2935 if (onoff)
2936 modem_tx |= TIOCM_DTR | TIOCM_RTS;
2937 else
2938 modem_tx &= ~(TIOCM_DTR | TIOCM_RTS);
2939 if (modem_tx != dlci->modem_tx) {
2940 dlci->modem_tx = modem_tx;
2941 gsmtty_modem_update(dlci, 0);
2942 }
2943}
2944
2945static const struct tty_port_operations gsm_port_ops = {
2946 .carrier_raised = gsm_carrier_raised,
2947 .dtr_rts = gsm_dtr_rts,
2948 .destruct = gsm_dlci_free,
2949};
2950
2951static int gsmtty_install(struct tty_driver *driver, struct tty_struct *tty)
2952{
2953 struct gsm_mux *gsm;
2954 struct gsm_dlci *dlci;
2955 unsigned int line = tty->index;
David Brazdil0f672f62019-12-10 10:32:29 +00002956 unsigned int mux = mux_line_to_num(line);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00002957 bool alloc = false;
2958 int ret;
2959
2960 line = line & 0x3F;
2961
2962 if (mux >= MAX_MUX)
2963 return -ENXIO;
2964 /* FIXME: we need to lock gsm_mux for lifetimes of ttys eventually */
2965 if (gsm_mux[mux] == NULL)
2966 return -EUNATCH;
2967 if (line == 0 || line > 61) /* 62/63 reserved */
2968 return -ECHRNG;
2969 gsm = gsm_mux[mux];
2970 if (gsm->dead)
2971 return -EL2HLT;
2972 /* If DLCI 0 is not yet fully open return an error.
2973 This is ok from a locking
2974 perspective as we don't have to worry about this
2975 if DLCI0 is lost */
2976 mutex_lock(&gsm->mutex);
2977 if (gsm->dlci[0] && gsm->dlci[0]->state != DLCI_OPEN) {
2978 mutex_unlock(&gsm->mutex);
2979 return -EL2NSYNC;
2980 }
2981 dlci = gsm->dlci[line];
2982 if (dlci == NULL) {
2983 alloc = true;
2984 dlci = gsm_dlci_alloc(gsm, line);
2985 }
2986 if (dlci == NULL) {
2987 mutex_unlock(&gsm->mutex);
2988 return -ENOMEM;
2989 }
2990 ret = tty_port_install(&dlci->port, driver, tty);
2991 if (ret) {
2992 if (alloc)
2993 dlci_put(dlci);
2994 mutex_unlock(&gsm->mutex);
2995 return ret;
2996 }
2997
2998 dlci_get(dlci);
2999 dlci_get(gsm->dlci[0]);
3000 mux_get(gsm);
3001 tty->driver_data = dlci;
3002 mutex_unlock(&gsm->mutex);
3003
3004 return 0;
3005}
3006
3007static int gsmtty_open(struct tty_struct *tty, struct file *filp)
3008{
3009 struct gsm_dlci *dlci = tty->driver_data;
3010 struct tty_port *port = &dlci->port;
3011
3012 port->count++;
3013 tty_port_tty_set(port, tty);
3014
3015 dlci->modem_rx = 0;
3016 /* We could in theory open and close before we wait - eg if we get
3017 a DM straight back. This is ok as that will have caused a hangup */
3018 tty_port_set_initialized(port, 1);
3019 /* Start sending off SABM messages */
3020 gsm_dlci_begin_open(dlci);
3021 /* And wait for virtual carrier */
3022 return tty_port_block_til_ready(port, tty, filp);
3023}
3024
3025static void gsmtty_close(struct tty_struct *tty, struct file *filp)
3026{
3027 struct gsm_dlci *dlci = tty->driver_data;
3028
3029 if (dlci == NULL)
3030 return;
3031 if (dlci->state == DLCI_CLOSED)
3032 return;
3033 mutex_lock(&dlci->mutex);
3034 gsm_destroy_network(dlci);
3035 mutex_unlock(&dlci->mutex);
3036 if (tty_port_close_start(&dlci->port, tty, filp) == 0)
3037 return;
3038 gsm_dlci_begin_close(dlci);
3039 if (tty_port_initialized(&dlci->port) && C_HUPCL(tty))
3040 tty_port_lower_dtr_rts(&dlci->port);
3041 tty_port_close_end(&dlci->port, tty);
3042 tty_port_tty_set(&dlci->port, NULL);
3043 return;
3044}
3045
3046static void gsmtty_hangup(struct tty_struct *tty)
3047{
3048 struct gsm_dlci *dlci = tty->driver_data;
3049 if (dlci->state == DLCI_CLOSED)
3050 return;
3051 tty_port_hangup(&dlci->port);
3052 gsm_dlci_begin_close(dlci);
3053}
3054
3055static int gsmtty_write(struct tty_struct *tty, const unsigned char *buf,
3056 int len)
3057{
3058 int sent;
3059 struct gsm_dlci *dlci = tty->driver_data;
3060 if (dlci->state == DLCI_CLOSED)
3061 return -EINVAL;
3062 /* Stuff the bytes into the fifo queue */
Olivier Deprez157378f2022-04-04 15:47:50 +02003063 sent = kfifo_in_locked(&dlci->fifo, buf, len, &dlci->lock);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00003064 /* Need to kick the channel */
3065 gsm_dlci_data_kick(dlci);
3066 return sent;
3067}
3068
3069static int gsmtty_write_room(struct tty_struct *tty)
3070{
3071 struct gsm_dlci *dlci = tty->driver_data;
3072 if (dlci->state == DLCI_CLOSED)
3073 return -EINVAL;
Olivier Deprez157378f2022-04-04 15:47:50 +02003074 return TX_SIZE - kfifo_len(&dlci->fifo);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00003075}
3076
3077static int gsmtty_chars_in_buffer(struct tty_struct *tty)
3078{
3079 struct gsm_dlci *dlci = tty->driver_data;
3080 if (dlci->state == DLCI_CLOSED)
3081 return -EINVAL;
Olivier Deprez157378f2022-04-04 15:47:50 +02003082 return kfifo_len(&dlci->fifo);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00003083}
3084
3085static void gsmtty_flush_buffer(struct tty_struct *tty)
3086{
3087 struct gsm_dlci *dlci = tty->driver_data;
3088 if (dlci->state == DLCI_CLOSED)
3089 return;
3090 /* Caution needed: If we implement reliable transport classes
3091 then the data being transmitted can't simply be junked once
3092 it has first hit the stack. Until then we can just blow it
3093 away */
Olivier Deprez157378f2022-04-04 15:47:50 +02003094 kfifo_reset(&dlci->fifo);
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00003095 /* Need to unhook this DLCI from the transmit queue logic */
3096}
3097
3098static void gsmtty_wait_until_sent(struct tty_struct *tty, int timeout)
3099{
3100 /* The FIFO handles the queue so the kernel will do the right
3101 thing waiting on chars_in_buffer before calling us. No work
3102 to do here */
3103}
3104
3105static int gsmtty_tiocmget(struct tty_struct *tty)
3106{
3107 struct gsm_dlci *dlci = tty->driver_data;
3108 if (dlci->state == DLCI_CLOSED)
3109 return -EINVAL;
3110 return dlci->modem_rx;
3111}
3112
3113static int gsmtty_tiocmset(struct tty_struct *tty,
3114 unsigned int set, unsigned int clear)
3115{
3116 struct gsm_dlci *dlci = tty->driver_data;
3117 unsigned int modem_tx = dlci->modem_tx;
3118
3119 if (dlci->state == DLCI_CLOSED)
3120 return -EINVAL;
3121 modem_tx &= ~clear;
3122 modem_tx |= set;
3123
3124 if (modem_tx != dlci->modem_tx) {
3125 dlci->modem_tx = modem_tx;
3126 return gsmtty_modem_update(dlci, 0);
3127 }
3128 return 0;
3129}
3130
3131
3132static int gsmtty_ioctl(struct tty_struct *tty,
3133 unsigned int cmd, unsigned long arg)
3134{
3135 struct gsm_dlci *dlci = tty->driver_data;
3136 struct gsm_netconfig nc;
3137 int index;
3138
3139 if (dlci->state == DLCI_CLOSED)
3140 return -EINVAL;
3141 switch (cmd) {
3142 case GSMIOC_ENABLE_NET:
3143 if (copy_from_user(&nc, (void __user *)arg, sizeof(nc)))
3144 return -EFAULT;
3145 nc.if_name[IFNAMSIZ-1] = '\0';
3146 /* return net interface index or error code */
3147 mutex_lock(&dlci->mutex);
3148 index = gsm_create_network(dlci, &nc);
3149 mutex_unlock(&dlci->mutex);
3150 if (copy_to_user((void __user *)arg, &nc, sizeof(nc)))
3151 return -EFAULT;
3152 return index;
3153 case GSMIOC_DISABLE_NET:
3154 if (!capable(CAP_NET_ADMIN))
3155 return -EPERM;
3156 mutex_lock(&dlci->mutex);
3157 gsm_destroy_network(dlci);
3158 mutex_unlock(&dlci->mutex);
3159 return 0;
3160 default:
3161 return -ENOIOCTLCMD;
3162 }
3163}
3164
3165static void gsmtty_set_termios(struct tty_struct *tty, struct ktermios *old)
3166{
3167 struct gsm_dlci *dlci = tty->driver_data;
3168 if (dlci->state == DLCI_CLOSED)
3169 return;
3170 /* For the moment its fixed. In actual fact the speed information
3171 for the virtual channel can be propogated in both directions by
3172 the RPN control message. This however rapidly gets nasty as we
3173 then have to remap modem signals each way according to whether
3174 our virtual cable is null modem etc .. */
3175 tty_termios_copy_hw(&tty->termios, old);
3176}
3177
3178static void gsmtty_throttle(struct tty_struct *tty)
3179{
3180 struct gsm_dlci *dlci = tty->driver_data;
3181 if (dlci->state == DLCI_CLOSED)
3182 return;
3183 if (C_CRTSCTS(tty))
Olivier Deprez157378f2022-04-04 15:47:50 +02003184 dlci->modem_tx &= ~TIOCM_RTS;
3185 dlci->throttled = true;
3186 /* Send an MSC with RTS cleared */
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00003187 gsmtty_modem_update(dlci, 0);
3188}
3189
3190static void gsmtty_unthrottle(struct tty_struct *tty)
3191{
3192 struct gsm_dlci *dlci = tty->driver_data;
3193 if (dlci->state == DLCI_CLOSED)
3194 return;
3195 if (C_CRTSCTS(tty))
Olivier Deprez157378f2022-04-04 15:47:50 +02003196 dlci->modem_tx |= TIOCM_RTS;
3197 dlci->throttled = false;
3198 /* Send an MSC with RTS set */
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00003199 gsmtty_modem_update(dlci, 0);
3200}
3201
3202static int gsmtty_break_ctl(struct tty_struct *tty, int state)
3203{
3204 struct gsm_dlci *dlci = tty->driver_data;
3205 int encode = 0; /* Off */
3206 if (dlci->state == DLCI_CLOSED)
3207 return -EINVAL;
3208
3209 if (state == -1) /* "On indefinitely" - we can't encode this
3210 properly */
3211 encode = 0x0F;
3212 else if (state > 0) {
3213 encode = state / 200; /* mS to encoding */
3214 if (encode > 0x0F)
3215 encode = 0x0F; /* Best effort */
3216 }
3217 return gsmtty_modem_update(dlci, encode);
3218}
3219
3220static void gsmtty_cleanup(struct tty_struct *tty)
3221{
3222 struct gsm_dlci *dlci = tty->driver_data;
3223 struct gsm_mux *gsm = dlci->gsm;
3224
3225 dlci_put(dlci);
3226 dlci_put(gsm->dlci[0]);
3227 mux_put(gsm);
3228}
3229
3230/* Virtual ttys for the demux */
3231static const struct tty_operations gsmtty_ops = {
3232 .install = gsmtty_install,
3233 .open = gsmtty_open,
3234 .close = gsmtty_close,
3235 .write = gsmtty_write,
3236 .write_room = gsmtty_write_room,
3237 .chars_in_buffer = gsmtty_chars_in_buffer,
3238 .flush_buffer = gsmtty_flush_buffer,
3239 .ioctl = gsmtty_ioctl,
3240 .throttle = gsmtty_throttle,
3241 .unthrottle = gsmtty_unthrottle,
3242 .set_termios = gsmtty_set_termios,
3243 .hangup = gsmtty_hangup,
3244 .wait_until_sent = gsmtty_wait_until_sent,
3245 .tiocmget = gsmtty_tiocmget,
3246 .tiocmset = gsmtty_tiocmset,
3247 .break_ctl = gsmtty_break_ctl,
3248 .cleanup = gsmtty_cleanup,
3249};
3250
3251
3252
3253static int __init gsm_init(void)
3254{
3255 /* Fill in our line protocol discipline, and register it */
3256 int status = tty_register_ldisc(N_GSM0710, &tty_ldisc_packet);
3257 if (status != 0) {
3258 pr_err("n_gsm: can't register line discipline (err = %d)\n",
3259 status);
3260 return status;
3261 }
3262
3263 gsm_tty_driver = alloc_tty_driver(256);
3264 if (!gsm_tty_driver) {
3265 tty_unregister_ldisc(N_GSM0710);
3266 pr_err("gsm_init: tty allocation failed.\n");
3267 return -EINVAL;
3268 }
3269 gsm_tty_driver->driver_name = "gsmtty";
3270 gsm_tty_driver->name = "gsmtty";
3271 gsm_tty_driver->major = 0; /* Dynamic */
3272 gsm_tty_driver->minor_start = 0;
3273 gsm_tty_driver->type = TTY_DRIVER_TYPE_SERIAL;
3274 gsm_tty_driver->subtype = SERIAL_TYPE_NORMAL;
3275 gsm_tty_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV
3276 | TTY_DRIVER_HARDWARE_BREAK;
3277 gsm_tty_driver->init_termios = tty_std_termios;
3278 /* Fixme */
3279 gsm_tty_driver->init_termios.c_lflag &= ~ECHO;
3280 tty_set_operations(gsm_tty_driver, &gsmtty_ops);
3281
3282 spin_lock_init(&gsm_mux_lock);
3283
3284 if (tty_register_driver(gsm_tty_driver)) {
3285 put_tty_driver(gsm_tty_driver);
3286 tty_unregister_ldisc(N_GSM0710);
3287 pr_err("gsm_init: tty registration failed.\n");
3288 return -EBUSY;
3289 }
3290 pr_debug("gsm_init: loaded as %d,%d.\n",
3291 gsm_tty_driver->major, gsm_tty_driver->minor_start);
3292 return 0;
3293}
3294
3295static void __exit gsm_exit(void)
3296{
3297 int status = tty_unregister_ldisc(N_GSM0710);
3298 if (status != 0)
3299 pr_err("n_gsm: can't unregister line discipline (err = %d)\n",
3300 status);
3301 tty_unregister_driver(gsm_tty_driver);
3302 put_tty_driver(gsm_tty_driver);
3303}
3304
3305module_init(gsm_init);
3306module_exit(gsm_exit);
3307
3308
3309MODULE_LICENSE("GPL");
3310MODULE_ALIAS_LDISC(N_GSM0710);