blob: 4465dd04fead46c4467323a1a73f8fc3ffce8ee4 [file] [log] [blame]
Greg Kroah-Hartmane3b3d0f2017-11-06 18:11:51 +01001// SPDX-License-Identifier: GPL-2.0
Alan Coxe1eaea42010-03-26 11:32:54 +00002/*
3 * n_gsm.c GSM 0710 tty multiplexor
4 * Copyright (c) 2009/10 Intel Corporation
5 *
Alan Coxe1eaea42010-03-26 11:32:54 +00006 * * THIS IS A DEVELOPMENT SNAPSHOT IT IS NOT A FINAL RELEASE *
7 *
8 * TO DO:
9 * Mostly done: ioctls for setting modes/timing
Alan Cox5f9a31d2010-11-04 15:17:27 +000010 * Partly done: hooks so you can pull off frames to non tty devs
Alan Coxe1eaea42010-03-26 11:32:54 +000011 * Restart DLCI 0 when it closes ?
Alan Coxe1eaea42010-03-26 11:32:54 +000012 * 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>
Ingo Molnar174cd4b2017-02-02 19:15:33 +010030#include <linux/sched/signal.h>
Alan Coxe1eaea42010-03-26 11:32:54 +000031#include <linux/interrupt.h>
32#include <linux/tty.h>
Alan Coxe1eaea42010-03-26 11:32:54 +000033#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>
Russ Gorbybcd5abe2011-06-16 14:20:12 -070048#include <net/arp.h>
49#include <linux/ip.h>
50#include <linux/netdevice.h>
51#include <linux/etherdevice.h>
Alan Coxe1eaea42010-03-26 11:32:54 +000052#include <linux/gsmmux.h>
53
54static int debug;
55module_param(debug, int, 0600);
56
Alan Coxa8d12002011-11-08 18:02:10 +000057/* Defaults: these are from the specification */
58
59#define T1 10 /* 100mS */
60#define T2 34 /* 333mS */
61#define N2 3 /* Retry 3 times */
Alan Coxe1eaea42010-03-26 11:32:54 +000062
63/* Use long timers for testing at low speed with debug on */
64#ifdef DEBUG_TIMING
Alan Coxa8d12002011-11-08 18:02:10 +000065#define T1 100
66#define T2 200
Alan Coxe1eaea42010-03-26 11:32:54 +000067#endif
68
Alan Cox5f9a31d2010-11-04 15:17:27 +000069/*
Lucas De Marchi25985ed2011-03-30 22:57:33 -030070 * Semi-arbitrary buffer size limits. 0710 is normally run with 32-64 byte
Alan Cox5f9a31d2010-11-04 15:17:27 +000071 * limits so this is plenty
72 */
Russ Gorbybcd5abe2011-06-16 14:20:12 -070073#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
79 * @struct gsm_dlci* dlci
Russ Gorbybcd5abe2011-06-16 14:20:12 -070080 *
81 * Created when net interface is initialized.
82 **/
83struct gsm_mux_net {
84 struct kref ref;
85 struct gsm_dlci *dlci;
Russ Gorbybcd5abe2011-06-16 14:20:12 -070086};
87
Alan Coxe1eaea42010-03-26 11:32:54 +000088/*
89 * Each block of data we have queued to go out is in the form of
Lucas De Marchi25985ed2011-03-30 22:57:33 -030090 * a gsm_msg which holds everything we need in a link layer independent
Alan Coxe1eaea42010-03-26 11:32:54 +000091 * format
92 */
93
94struct gsm_msg {
Russ Gorbyb4338e12012-08-13 13:44:59 +010095 struct list_head list;
Alan Coxe1eaea42010-03-26 11:32:54 +000096 u8 addr; /* DLCI address + flags */
97 u8 ctrl; /* Control byte + flags */
98 unsigned int len; /* Length of data block (can be zero) */
99 unsigned char *data; /* Points into buffer but not at the start */
Gustavo A. R. Silva2f202d02020-02-12 13:35:23 -0600100 unsigned char buffer[];
Alan Coxe1eaea42010-03-26 11:32:54 +0000101};
102
Jiri Slaby72ae8cc2020-02-19 09:49:41 +0100103enum gsm_dlci_state {
104 DLCI_CLOSED,
105 DLCI_OPENING, /* Sending SABM not seen UA */
106 DLCI_OPEN, /* SABM/UA complete */
107 DLCI_CLOSING, /* Sending DISC not seen UA/DM */
108};
109
Jiri Slabye1785992020-02-19 09:49:42 +0100110enum gsm_dlci_mode {
111 DLCI_MODE_ABM, /* Normal Asynchronous Balanced Mode */
112 DLCI_MODE_ADM, /* Asynchronous Disconnected Mode */
113};
114
Alan Coxe1eaea42010-03-26 11:32:54 +0000115/*
116 * Each active data link has a gsm_dlci structure associated which ties
117 * the link layer to an optional tty (if the tty side is open). To avoid
118 * complexity right now these are only ever freed up when the mux is
119 * shut down.
120 *
121 * At the moment we don't free DLCI objects until the mux is torn down
122 * this avoid object life time issues but might be worth review later.
123 */
124
125struct gsm_dlci {
126 struct gsm_mux *gsm;
127 int addr;
Jiri Slaby72ae8cc2020-02-19 09:49:41 +0100128 enum gsm_dlci_state state;
Russ Gorbybcd5abe2011-06-16 14:20:12 -0700129 struct mutex mutex;
Alan Coxe1eaea42010-03-26 11:32:54 +0000130
131 /* Link layer */
Jiri Slabye1785992020-02-19 09:49:42 +0100132 enum gsm_dlci_mode mode;
Alan Coxe1eaea42010-03-26 11:32:54 +0000133 spinlock_t lock; /* Protects the internal state */
134 struct timer_list t1; /* Retransmit timer for SABM and UA */
135 int retries;
136 /* Uplink tty if active */
137 struct tty_port port; /* The tty bound to this DLCI if there is one */
Jiri Slaby036bca1fc2020-02-19 09:49:40 +0100138 struct kfifo fifo; /* Queue fifo for the DLCI */
Alan Coxe1eaea42010-03-26 11:32:54 +0000139 int adaption; /* Adaption layer in use */
Russ Gorbybcd5abe2011-06-16 14:20:12 -0700140 int prev_adaption;
Alan Coxe1eaea42010-03-26 11:32:54 +0000141 u32 modem_rx; /* Our incoming virtual modem lines */
142 u32 modem_tx; /* Our outgoing modem lines */
Jiri Slaby5677fcf2020-02-19 09:49:46 +0100143 bool dead; /* Refuse re-open */
Alan Coxe1eaea42010-03-26 11:32:54 +0000144 /* Flow control */
Jiri Slabye9360b92020-02-19 09:49:47 +0100145 bool throttled; /* Private copy of throttle state */
Jiri Slaby7a9ed9c2020-02-19 09:49:48 +0100146 bool constipated; /* Throttle status for outgoing */
Alan Coxe1eaea42010-03-26 11:32:54 +0000147 /* Packetised I/O */
148 struct sk_buff *skb; /* Frame being sent */
149 struct sk_buff_head skb_list; /* Queued frames */
150 /* Data handling callback */
Tony Lindgren4feb7a42019-01-13 17:25:27 -0800151 void (*data)(struct gsm_dlci *dlci, const u8 *data, int len);
152 void (*prev_data)(struct gsm_dlci *dlci, const u8 *data, int len);
Russ Gorbybcd5abe2011-06-16 14:20:12 -0700153 struct net_device *net; /* network interface, if created */
Alan Coxe1eaea42010-03-26 11:32:54 +0000154};
155
Geert Uytterhoevenc33eecc72015-05-21 14:06:11 +0200156/* DLCI 0, 62/63 are special or reserved see gsmtty_open */
Alan Coxe1eaea42010-03-26 11:32:54 +0000157
158#define NUM_DLCI 64
159
160/*
161 * DLCI 0 is used to pass control blocks out of band of the data
162 * flow (and with a higher link priority). One command can be outstanding
163 * at a time and we use this structure to manage them. They are created
164 * and destroyed by the user context, and updated by the receive paths
165 * and timers
166 */
167
168struct gsm_control {
169 u8 cmd; /* Command we are issuing */
170 u8 *data; /* Data for the command in case we retransmit */
171 int len; /* Length of block for retransmission */
172 int done; /* Done flag */
173 int error; /* Error if any */
174};
175
Jiri Slaby329aa6e2020-02-19 09:49:43 +0100176enum gsm_mux_state {
177 GSM_SEARCH,
178 GSM_START,
179 GSM_ADDRESS,
180 GSM_CONTROL,
181 GSM_LEN,
182 GSM_DATA,
183 GSM_FCS,
184 GSM_OVERRUN,
185 GSM_LEN0,
186 GSM_LEN1,
187 GSM_SSOF,
188};
189
Alan Coxe1eaea42010-03-26 11:32:54 +0000190/*
191 * Each GSM mux we have is represented by this structure. If we are
192 * operating as an ldisc then we use this structure as our ldisc
193 * state. We need to sort out lifetimes and locking with respect
194 * to the gsm mux array. For now we don't free DLCI objects that
195 * have been instantiated until the mux itself is terminated.
196 *
197 * To consider further: tty open versus mux shutdown.
198 */
199
200struct gsm_mux {
201 struct tty_struct *tty; /* The tty our ldisc is bound to */
202 spinlock_t lock;
Chao Bidfabf7f2013-11-26 12:09:39 +0800203 struct mutex mutex;
Russ Gorbyd50f6dc2011-06-14 13:35:32 -0700204 unsigned int num;
Russ Gorby6ab8fba2011-06-16 14:20:13 -0700205 struct kref ref;
Alan Coxe1eaea42010-03-26 11:32:54 +0000206
207 /* Events on the GSM channel */
208 wait_queue_head_t event;
209
210 /* Bits for GSM mode decoding */
211
212 /* Framing Layer */
213 unsigned char *buf;
Jiri Slaby329aa6e2020-02-19 09:49:43 +0100214 enum gsm_mux_state state;
Alan Coxe1eaea42010-03-26 11:32:54 +0000215 unsigned int len;
216 unsigned int address;
217 unsigned int count;
Jiri Slabyc50704b2020-02-19 09:49:49 +0100218 bool escape;
Alan Coxe1eaea42010-03-26 11:32:54 +0000219 int encoding;
220 u8 control;
221 u8 fcs;
Alan Coxc2f2f002010-11-04 15:17:03 +0000222 u8 received_fcs;
Alan Coxe1eaea42010-03-26 11:32:54 +0000223 u8 *txframe; /* TX framing buffer */
224
225 /* Methods for the receiver side */
226 void (*receive)(struct gsm_mux *gsm, u8 ch);
227 void (*error)(struct gsm_mux *gsm, u8 ch, u8 flag);
228 /* And transmit side */
229 int (*output)(struct gsm_mux *mux, u8 *data, int len);
230
231 /* Link Layer */
232 unsigned int mru;
233 unsigned int mtu;
234 int initiator; /* Did we initiate connection */
Jiri Slaby5677fcf2020-02-19 09:49:46 +0100235 bool dead; /* Has the mux been shut down */
Alan Coxe1eaea42010-03-26 11:32:54 +0000236 struct gsm_dlci *dlci[NUM_DLCI];
Jiri Slaby7a9ed9c2020-02-19 09:49:48 +0100237 bool constipated; /* Asked by remote to shut up */
Alan Coxe1eaea42010-03-26 11:32:54 +0000238
239 spinlock_t tx_lock;
240 unsigned int tx_bytes; /* TX data outstanding */
241#define TX_THRESH_HI 8192
242#define TX_THRESH_LO 2048
Russ Gorbyb4338e12012-08-13 13:44:59 +0100243 struct list_head tx_list; /* Pending data packets */
Alan Coxe1eaea42010-03-26 11:32:54 +0000244
245 /* Control messages */
246 struct timer_list t2_timer; /* Retransmit timer for commands */
247 int cretries; /* Command retry counter */
248 struct gsm_control *pending_cmd;/* Our current pending command */
249 spinlock_t control_lock; /* Protects the pending command */
250
251 /* Configuration */
252 int adaption; /* 1 or 2 supported */
253 u8 ftype; /* UI or UIH */
254 int t1, t2; /* Timers in 1/100th of a sec */
255 int n2; /* Retry count */
256
257 /* Statistics (not currently exposed) */
258 unsigned long bad_fcs;
259 unsigned long malformed;
260 unsigned long io_error;
261 unsigned long bad_size;
262 unsigned long unsupported;
263};
264
265
266/*
267 * Mux objects - needed so that we can translate a tty index into the
268 * relevant mux and DLCI.
269 */
270
271#define MAX_MUX 4 /* 256 minors */
272static struct gsm_mux *gsm_mux[MAX_MUX]; /* GSM muxes */
273static spinlock_t gsm_mux_lock;
274
Russ Gorbyd50f6dc2011-06-14 13:35:32 -0700275static struct tty_driver *gsm_tty_driver;
276
Alan Coxe1eaea42010-03-26 11:32:54 +0000277/*
278 * This section of the driver logic implements the GSM encodings
279 * both the basic and the 'advanced'. Reliable transport is not
280 * supported.
281 */
282
283#define CR 0x02
284#define EA 0x01
285#define PF 0x10
286
287/* I is special: the rest are ..*/
288#define RR 0x01
289#define UI 0x03
290#define RNR 0x05
291#define REJ 0x09
292#define DM 0x0F
293#define SABM 0x2F
294#define DISC 0x43
295#define UA 0x63
296#define UIH 0xEF
297
298/* Channel commands */
299#define CMD_NSC 0x09
300#define CMD_TEST 0x11
301#define CMD_PSC 0x21
302#define CMD_RLS 0x29
303#define CMD_FCOFF 0x31
304#define CMD_PN 0x41
305#define CMD_RPN 0x49
306#define CMD_FCON 0x51
307#define CMD_CLD 0x61
308#define CMD_SNC 0x69
309#define CMD_MSC 0x71
310
311/* Virtual modem bits */
312#define MDM_FC 0x01
313#define MDM_RTC 0x02
314#define MDM_RTR 0x04
315#define MDM_IC 0x20
316#define MDM_DV 0x40
317
318#define GSM0_SOF 0xF9
Alan Cox5f9a31d2010-11-04 15:17:27 +0000319#define GSM1_SOF 0x7E
Alan Coxe1eaea42010-03-26 11:32:54 +0000320#define GSM1_ESCAPE 0x7D
321#define GSM1_ESCAPE_BITS 0x20
322#define XON 0x11
323#define XOFF 0x13
324
325static const struct tty_port_operations gsm_port_ops;
326
327/*
328 * CRC table for GSM 0710
329 */
330
331static const u8 gsm_fcs8[256] = {
332 0x00, 0x91, 0xE3, 0x72, 0x07, 0x96, 0xE4, 0x75,
333 0x0E, 0x9F, 0xED, 0x7C, 0x09, 0x98, 0xEA, 0x7B,
334 0x1C, 0x8D, 0xFF, 0x6E, 0x1B, 0x8A, 0xF8, 0x69,
335 0x12, 0x83, 0xF1, 0x60, 0x15, 0x84, 0xF6, 0x67,
336 0x38, 0xA9, 0xDB, 0x4A, 0x3F, 0xAE, 0xDC, 0x4D,
337 0x36, 0xA7, 0xD5, 0x44, 0x31, 0xA0, 0xD2, 0x43,
338 0x24, 0xB5, 0xC7, 0x56, 0x23, 0xB2, 0xC0, 0x51,
339 0x2A, 0xBB, 0xC9, 0x58, 0x2D, 0xBC, 0xCE, 0x5F,
340 0x70, 0xE1, 0x93, 0x02, 0x77, 0xE6, 0x94, 0x05,
341 0x7E, 0xEF, 0x9D, 0x0C, 0x79, 0xE8, 0x9A, 0x0B,
342 0x6C, 0xFD, 0x8F, 0x1E, 0x6B, 0xFA, 0x88, 0x19,
343 0x62, 0xF3, 0x81, 0x10, 0x65, 0xF4, 0x86, 0x17,
344 0x48, 0xD9, 0xAB, 0x3A, 0x4F, 0xDE, 0xAC, 0x3D,
345 0x46, 0xD7, 0xA5, 0x34, 0x41, 0xD0, 0xA2, 0x33,
346 0x54, 0xC5, 0xB7, 0x26, 0x53, 0xC2, 0xB0, 0x21,
347 0x5A, 0xCB, 0xB9, 0x28, 0x5D, 0xCC, 0xBE, 0x2F,
348 0xE0, 0x71, 0x03, 0x92, 0xE7, 0x76, 0x04, 0x95,
349 0xEE, 0x7F, 0x0D, 0x9C, 0xE9, 0x78, 0x0A, 0x9B,
350 0xFC, 0x6D, 0x1F, 0x8E, 0xFB, 0x6A, 0x18, 0x89,
351 0xF2, 0x63, 0x11, 0x80, 0xF5, 0x64, 0x16, 0x87,
352 0xD8, 0x49, 0x3B, 0xAA, 0xDF, 0x4E, 0x3C, 0xAD,
353 0xD6, 0x47, 0x35, 0xA4, 0xD1, 0x40, 0x32, 0xA3,
354 0xC4, 0x55, 0x27, 0xB6, 0xC3, 0x52, 0x20, 0xB1,
355 0xCA, 0x5B, 0x29, 0xB8, 0xCD, 0x5C, 0x2E, 0xBF,
356 0x90, 0x01, 0x73, 0xE2, 0x97, 0x06, 0x74, 0xE5,
357 0x9E, 0x0F, 0x7D, 0xEC, 0x99, 0x08, 0x7A, 0xEB,
358 0x8C, 0x1D, 0x6F, 0xFE, 0x8B, 0x1A, 0x68, 0xF9,
359 0x82, 0x13, 0x61, 0xF0, 0x85, 0x14, 0x66, 0xF7,
360 0xA8, 0x39, 0x4B, 0xDA, 0xAF, 0x3E, 0x4C, 0xDD,
361 0xA6, 0x37, 0x45, 0xD4, 0xA1, 0x30, 0x42, 0xD3,
362 0xB4, 0x25, 0x57, 0xC6, 0xB3, 0x22, 0x50, 0xC1,
363 0xBA, 0x2B, 0x59, 0xC8, 0xBD, 0x2C, 0x5E, 0xCF
364};
365
366#define INIT_FCS 0xFF
367#define GOOD_FCS 0xCF
368
369/**
370 * gsm_fcs_add - update FCS
371 * @fcs: Current FCS
372 * @c: Next data
373 *
374 * Update the FCS to include c. Uses the algorithm in the specification
375 * notes.
376 */
377
378static inline u8 gsm_fcs_add(u8 fcs, u8 c)
379{
380 return gsm_fcs8[fcs ^ c];
381}
382
383/**
384 * gsm_fcs_add_block - update FCS for a block
385 * @fcs: Current FCS
386 * @c: buffer of data
387 * @len: length of buffer
388 *
389 * Update the FCS to include c. Uses the algorithm in the specification
390 * notes.
391 */
392
393static inline u8 gsm_fcs_add_block(u8 fcs, u8 *c, int len)
394{
395 while (len--)
396 fcs = gsm_fcs8[fcs ^ *c++];
397 return fcs;
398}
399
400/**
401 * gsm_read_ea - read a byte into an EA
402 * @val: variable holding value
403 * c: byte going into the EA
404 *
405 * Processes one byte of an EA. Updates the passed variable
406 * and returns 1 if the EA is now completely read
407 */
408
409static int gsm_read_ea(unsigned int *val, u8 c)
410{
411 /* Add the next 7 bits into the value */
412 *val <<= 7;
413 *val |= c >> 1;
414 /* Was this the last byte of the EA 1 = yes*/
415 return c & EA;
416}
417
418/**
419 * gsm_encode_modem - encode modem data bits
420 * @dlci: DLCI to encode from
421 *
422 * Returns the correct GSM encoded modem status bits (6 bit field) for
423 * the current status of the DLCI and attached tty object
424 */
425
426static u8 gsm_encode_modem(const struct gsm_dlci *dlci)
427{
428 u8 modembits = 0;
429 /* FC is true flow control not modem bits */
430 if (dlci->throttled)
431 modembits |= MDM_FC;
432 if (dlci->modem_tx & TIOCM_DTR)
433 modembits |= MDM_RTC;
434 if (dlci->modem_tx & TIOCM_RTS)
435 modembits |= MDM_RTR;
436 if (dlci->modem_tx & TIOCM_RI)
437 modembits |= MDM_IC;
438 if (dlci->modem_tx & TIOCM_CD)
439 modembits |= MDM_DV;
440 return modembits;
441}
442
443/**
444 * gsm_print_packet - display a frame for debug
445 * @hdr: header to print before decode
446 * @addr: address EA from the frame
447 * @cr: C/R bit from the frame
448 * @control: control including PF bit
449 * @data: following data bytes
450 * @dlen: length of data
451 *
452 * Displays a packet in human readable format for debugging purposes. The
453 * style is based on amateur radio LAP-B dump display.
454 */
455
456static void gsm_print_packet(const char *hdr, int addr, int cr,
457 u8 control, const u8 *data, int dlen)
458{
459 if (!(debug & 1))
460 return;
461
Alan Cox5f9a31d2010-11-04 15:17:27 +0000462 pr_info("%s %d) %c: ", hdr, addr, "RC"[cr]);
Alan Coxe1eaea42010-03-26 11:32:54 +0000463
464 switch (control & ~PF) {
465 case SABM:
Alan Cox5f9a31d2010-11-04 15:17:27 +0000466 pr_cont("SABM");
Alan Coxe1eaea42010-03-26 11:32:54 +0000467 break;
468 case UA:
Alan Cox5f9a31d2010-11-04 15:17:27 +0000469 pr_cont("UA");
Alan Coxe1eaea42010-03-26 11:32:54 +0000470 break;
471 case DISC:
Alan Cox5f9a31d2010-11-04 15:17:27 +0000472 pr_cont("DISC");
Alan Coxe1eaea42010-03-26 11:32:54 +0000473 break;
474 case DM:
Alan Cox5f9a31d2010-11-04 15:17:27 +0000475 pr_cont("DM");
Alan Coxe1eaea42010-03-26 11:32:54 +0000476 break;
477 case UI:
Alan Cox5f9a31d2010-11-04 15:17:27 +0000478 pr_cont("UI");
Alan Coxe1eaea42010-03-26 11:32:54 +0000479 break;
480 case UIH:
Alan Cox5f9a31d2010-11-04 15:17:27 +0000481 pr_cont("UIH");
Alan Coxe1eaea42010-03-26 11:32:54 +0000482 break;
483 default:
484 if (!(control & 0x01)) {
Alan Cox5f9a31d2010-11-04 15:17:27 +0000485 pr_cont("I N(S)%d N(R)%d",
Alan Cox47fdd642012-09-17 12:02:35 +0100486 (control & 0x0E) >> 1, (control & 0xE0) >> 5);
Alan Coxe1eaea42010-03-26 11:32:54 +0000487 } else switch (control & 0x0F) {
Alan Cox5f9a31d2010-11-04 15:17:27 +0000488 case RR:
489 pr_cont("RR(%d)", (control & 0xE0) >> 5);
490 break;
491 case RNR:
492 pr_cont("RNR(%d)", (control & 0xE0) >> 5);
493 break;
494 case REJ:
495 pr_cont("REJ(%d)", (control & 0xE0) >> 5);
496 break;
497 default:
498 pr_cont("[%02X]", control);
Alan Coxe1eaea42010-03-26 11:32:54 +0000499 }
500 }
501
502 if (control & PF)
Alan Cox5f9a31d2010-11-04 15:17:27 +0000503 pr_cont("(P)");
Alan Coxe1eaea42010-03-26 11:32:54 +0000504 else
Alan Cox5f9a31d2010-11-04 15:17:27 +0000505 pr_cont("(F)");
Alan Coxe1eaea42010-03-26 11:32:54 +0000506
Gregory CLEMENT57626ff2020-05-18 10:45:12 +0200507 print_hex_dump_bytes("", DUMP_PREFIX_NONE, data, dlen);
Alan Coxe1eaea42010-03-26 11:32:54 +0000508}
509
510
511/*
512 * Link level transmission side
513 */
514
515/**
516 * gsm_stuff_packet - bytestuff a packet
517 * @ibuf: input
518 * @obuf: output
519 * @len: length of input
520 *
521 * Expand a buffer by bytestuffing it. The worst case size change
522 * is doubling and the caller is responsible for handing out
523 * suitable sized buffers.
524 */
525
526static int gsm_stuff_frame(const u8 *input, u8 *output, int len)
527{
528 int olen = 0;
529 while (len--) {
530 if (*input == GSM1_SOF || *input == GSM1_ESCAPE
531 || *input == XON || *input == XOFF) {
532 *output++ = GSM1_ESCAPE;
533 *output++ = *input++ ^ GSM1_ESCAPE_BITS;
534 olen++;
535 } else
536 *output++ = *input++;
537 olen++;
538 }
539 return olen;
540}
541
Alan Coxe1eaea42010-03-26 11:32:54 +0000542/**
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 }
590 gsm->output(gsm, cbuf, len);
591 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;
Russ Gorbyb4338e12012-08-13 13:44:59 +0100649 INIT_LIST_HEAD(&m->list);
Alan Coxe1eaea42010-03-26 11:32:54 +0000650 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
Frederic Beratc01af4f2012-08-13 13:43:58 +0100659 * If we have been flow-stopped by a CMD_FCOFF, then we can only
660 * send messages on DLCI0 until CMD_FCON
Alan Coxe1eaea42010-03-26 11:32:54 +0000661 *
662 * FIXME: lock against link layer control transmissions
663 */
664
Gregory CLEMENT01dbb362020-05-12 13:53:23 +0200665static void gsm_data_kick(struct gsm_mux *gsm, struct gsm_dlci *dlci)
Alan Coxe1eaea42010-03-26 11:32:54 +0000666{
Russ Gorbyb4338e12012-08-13 13:44:59 +0100667 struct gsm_msg *msg, *nmsg;
Alan Coxe1eaea42010-03-26 11:32:54 +0000668 int len;
Alan Coxe1eaea42010-03-26 11:32:54 +0000669
Russ Gorbyb4338e12012-08-13 13:44:59 +0100670 list_for_each_entry_safe(msg, nmsg, &gsm->tx_list, list) {
671 if (gsm->constipated && msg->addr)
Frederic Beratc01af4f2012-08-13 13:43:58 +0100672 continue;
Alan Coxe1eaea42010-03-26 11:32:54 +0000673 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
Joe Perches0a77c4f2011-04-25 16:46:49 -0700686 if (debug & 4)
687 print_hex_dump_bytes("gsm_data_kick: ",
688 DUMP_PREFIX_OFFSET,
689 gsm->txframe, len);
Gregory CLEMENT84d6f812020-05-12 13:53:22 +0200690 if (gsm->output(gsm, gsm->txframe, len) < 0)
Alan Coxe1eaea42010-03-26 11:32:54 +0000691 break;
692 /* FIXME: Can eliminate one SOF in many more cases */
Alan Coxe1eaea42010-03-26 11:32:54 +0000693 gsm->tx_bytes -= msg->len;
Frederic Beratc01af4f2012-08-13 13:43:58 +0100694
Russ Gorbyb4338e12012-08-13 13:44:59 +0100695 list_del(&msg->list);
696 kfree(msg);
Gregory CLEMENT01dbb362020-05-12 13:53:23 +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 struct gsm_dlci *dlci;
705
706 dlci = gsm->dlci[i];
707 if (dlci == NULL) {
708 i++;
709 continue;
710 }
711
712 tty_port_tty_wakeup(&dlci->port);
713 }
714 }
Alan Coxe1eaea42010-03-26 11:32:54 +0000715 }
716}
717
718/**
719 * __gsm_data_queue - queue a UI or UIH frame
720 * @dlci: DLCI sending the data
721 * @msg: message queued
722 *
723 * Add data to the transmit queue and try and get stuff moving
724 * out of the mux tty if not already doing so. The Caller must hold
725 * the gsm tx lock.
726 */
727
728static void __gsm_data_queue(struct gsm_dlci *dlci, struct gsm_msg *msg)
729{
730 struct gsm_mux *gsm = dlci->gsm;
731 u8 *dp = msg->data;
732 u8 *fcs = dp + msg->len;
733
734 /* Fill in the header */
735 if (gsm->encoding == 0) {
736 if (msg->len < 128)
737 *--dp = (msg->len << 1) | EA;
738 else {
Ken Millsbe7a7412010-12-13 15:27:27 +0000739 *--dp = (msg->len >> 7); /* bits 7 - 15 */
740 *--dp = (msg->len & 127) << 1; /* bits 0 - 6 */
Alan Coxe1eaea42010-03-26 11:32:54 +0000741 }
742 }
743
744 *--dp = msg->ctrl;
745 if (gsm->initiator)
746 *--dp = (msg->addr << 2) | 2 | EA;
747 else
748 *--dp = (msg->addr << 2) | EA;
749 *fcs = gsm_fcs_add_block(INIT_FCS, dp , msg->data - dp);
750 /* Ugly protocol layering violation */
751 if (msg->ctrl == UI || msg->ctrl == (UI|PF))
752 *fcs = gsm_fcs_add_block(*fcs, msg->data, msg->len);
753 *fcs = 0xFF - *fcs;
754
755 gsm_print_packet("Q> ", msg->addr, gsm->initiator, msg->ctrl,
756 msg->data, msg->len);
757
758 /* Move the header back and adjust the length, also allow for the FCS
759 now tacked on the end */
760 msg->len += (msg->data - dp) + 1;
761 msg->data = dp;
762
763 /* Add to the actual output queue */
Russ Gorbyb4338e12012-08-13 13:44:59 +0100764 list_add_tail(&msg->list, &gsm->tx_list);
Alan Coxe1eaea42010-03-26 11:32:54 +0000765 gsm->tx_bytes += msg->len;
Gregory CLEMENT01dbb362020-05-12 13:53:23 +0200766 gsm_data_kick(gsm, dlci);
Alan Coxe1eaea42010-03-26 11:32:54 +0000767}
768
769/**
770 * gsm_data_queue - queue a UI or UIH frame
771 * @dlci: DLCI sending the data
772 * @msg: message queued
773 *
774 * Add data to the transmit queue and try and get stuff moving
775 * out of the mux tty if not already doing so. Take the
776 * the gsm tx lock and dlci lock.
777 */
778
779static void gsm_data_queue(struct gsm_dlci *dlci, struct gsm_msg *msg)
780{
781 unsigned long flags;
782 spin_lock_irqsave(&dlci->gsm->tx_lock, flags);
783 __gsm_data_queue(dlci, msg);
784 spin_unlock_irqrestore(&dlci->gsm->tx_lock, flags);
785}
786
787/**
788 * gsm_dlci_data_output - try and push data out of a DLCI
789 * @gsm: mux
790 * @dlci: the DLCI to pull data from
791 *
792 * Pull data from a DLCI and send it into the transmit queue if there
793 * is data. Keep to the MRU of the mux. This path handles the usual tty
794 * interface which is a byte stream with optional modem data.
795 *
796 * Caller must hold the tx_lock of the mux.
797 */
798
799static int gsm_dlci_data_output(struct gsm_mux *gsm, struct gsm_dlci *dlci)
800{
801 struct gsm_msg *msg;
802 u8 *dp;
Mikhail Kshevetskiy268e5262011-09-23 19:22:56 +0400803 int len, total_size, size;
Alan Coxe1eaea42010-03-26 11:32:54 +0000804 int h = dlci->adaption - 1;
805
Mikhail Kshevetskiy268e5262011-09-23 19:22:56 +0400806 total_size = 0;
Aldo Iljazif3c909b2013-07-08 22:28:00 +0300807 while (1) {
Jiri Slaby036bca1fc2020-02-19 09:49:40 +0100808 len = kfifo_len(&dlci->fifo);
Mikhail Kshevetskiy268e5262011-09-23 19:22:56 +0400809 if (len == 0)
810 return total_size;
Alan Coxe1eaea42010-03-26 11:32:54 +0000811
Mikhail Kshevetskiy268e5262011-09-23 19:22:56 +0400812 /* MTU/MRU count only the data bits */
813 if (len > gsm->mtu)
814 len = gsm->mtu;
Alan Coxe1eaea42010-03-26 11:32:54 +0000815
Mikhail Kshevetskiy268e5262011-09-23 19:22:56 +0400816 size = len + h;
Alan Coxe1eaea42010-03-26 11:32:54 +0000817
Mikhail Kshevetskiy268e5262011-09-23 19:22:56 +0400818 msg = gsm_data_alloc(gsm, dlci->addr, size, gsm->ftype);
819 /* FIXME: need a timer or something to kick this so it can't
820 get stuck with no work outstanding and no buffer free */
821 if (msg == NULL)
822 return -ENOMEM;
823 dp = msg->data;
824 switch (dlci->adaption) {
825 case 1: /* Unstructured */
826 break;
Aldo Iljazif3c909b2013-07-08 22:28:00 +0300827 case 2: /* Unstructed with modem bits.
828 Always one byte as we never send inline break data */
Mikhail Kshevetskiy268e5262011-09-23 19:22:56 +0400829 *dp++ = gsm_encode_modem(dlci);
830 break;
831 }
Jiri Slaby036bca1fc2020-02-19 09:49:40 +0100832 WARN_ON(kfifo_out_locked(&dlci->fifo, dp , len, &dlci->lock) != len);
Mikhail Kshevetskiy268e5262011-09-23 19:22:56 +0400833 __gsm_data_queue(dlci, msg);
834 total_size += size;
Alan Coxe1eaea42010-03-26 11:32:54 +0000835 }
Alan Coxe1eaea42010-03-26 11:32:54 +0000836 /* Bytes of data we used up */
Mikhail Kshevetskiy268e5262011-09-23 19:22:56 +0400837 return total_size;
Alan Coxe1eaea42010-03-26 11:32:54 +0000838}
839
840/**
841 * gsm_dlci_data_output_framed - try and push data out of a DLCI
842 * @gsm: mux
843 * @dlci: the DLCI to pull data from
844 *
845 * Pull data from a DLCI and send it into the transmit queue if there
846 * is data. Keep to the MRU of the mux. This path handles framed data
847 * queued as skbuffs to the DLCI.
848 *
849 * Caller must hold the tx_lock of the mux.
850 */
851
852static int gsm_dlci_data_output_framed(struct gsm_mux *gsm,
853 struct gsm_dlci *dlci)
854{
855 struct gsm_msg *msg;
856 u8 *dp;
857 int len, size;
858 int last = 0, first = 0;
859 int overhead = 0;
860
861 /* One byte per frame is used for B/F flags */
862 if (dlci->adaption == 4)
863 overhead = 1;
864
865 /* dlci->skb is locked by tx_lock */
866 if (dlci->skb == NULL) {
Russ Gorby88ed2a62012-08-13 13:45:30 +0100867 dlci->skb = skb_dequeue_tail(&dlci->skb_list);
Alan Coxe1eaea42010-03-26 11:32:54 +0000868 if (dlci->skb == NULL)
869 return 0;
870 first = 1;
871 }
872 len = dlci->skb->len + overhead;
873
874 /* MTU/MRU count only the data bits */
875 if (len > gsm->mtu) {
876 if (dlci->adaption == 3) {
877 /* Over long frame, bin it */
Russ Gorby329e5672012-08-13 13:45:15 +0100878 dev_kfree_skb_any(dlci->skb);
Alan Coxe1eaea42010-03-26 11:32:54 +0000879 dlci->skb = NULL;
880 return 0;
881 }
882 len = gsm->mtu;
883 } else
884 last = 1;
885
886 size = len + overhead;
887 msg = gsm_data_alloc(gsm, dlci->addr, size, gsm->ftype);
888
889 /* FIXME: need a timer or something to kick this so it can't
890 get stuck with no work outstanding and no buffer free */
Russ Gorby88ed2a62012-08-13 13:45:30 +0100891 if (msg == NULL) {
892 skb_queue_tail(&dlci->skb_list, dlci->skb);
893 dlci->skb = NULL;
Alan Coxe1eaea42010-03-26 11:32:54 +0000894 return -ENOMEM;
Russ Gorby88ed2a62012-08-13 13:45:30 +0100895 }
Alan Coxe1eaea42010-03-26 11:32:54 +0000896 dp = msg->data;
897
898 if (dlci->adaption == 4) { /* Interruptible framed (Packetised Data) */
899 /* Flag byte to carry the start/end info */
900 *dp++ = last << 7 | first << 6 | 1; /* EA */
901 len--;
902 }
Russ Gorby57f21042011-06-14 13:23:29 -0700903 memcpy(dp, dlci->skb->data, len);
904 skb_pull(dlci->skb, len);
Alan Coxe1eaea42010-03-26 11:32:54 +0000905 __gsm_data_queue(dlci, msg);
Russ Gorbybcd5abe2011-06-16 14:20:12 -0700906 if (last) {
Russ Gorby329e5672012-08-13 13:45:15 +0100907 dev_kfree_skb_any(dlci->skb);
Alan Coxe1eaea42010-03-26 11:32:54 +0000908 dlci->skb = NULL;
Russ Gorbybcd5abe2011-06-16 14:20:12 -0700909 }
Alan Coxe1eaea42010-03-26 11:32:54 +0000910 return size;
911}
912
913/**
914 * gsm_dlci_data_sweep - look for data to send
915 * @gsm: the GSM mux
916 *
917 * Sweep the GSM mux channels in priority order looking for ones with
918 * data to send. We could do with optimising this scan a bit. We aim
919 * to fill the queue totally or up to TX_THRESH_HI bytes. Once we hit
920 * TX_THRESH_LO we get called again
921 *
922 * FIXME: We should round robin between groups and in theory you can
923 * renegotiate DLCI priorities with optional stuff. Needs optimising.
924 */
925
926static void gsm_dlci_data_sweep(struct gsm_mux *gsm)
927{
928 int len;
929 /* Priority ordering: We should do priority with RR of the groups */
930 int i = 1;
Alan Coxe1eaea42010-03-26 11:32:54 +0000931
Alan Coxe1eaea42010-03-26 11:32:54 +0000932 while (i < NUM_DLCI) {
933 struct gsm_dlci *dlci;
934
935 if (gsm->tx_bytes > TX_THRESH_HI)
936 break;
937 dlci = gsm->dlci[i];
938 if (dlci == NULL || dlci->constipated) {
939 i++;
940 continue;
941 }
Russ Gorbybcd5abe2011-06-16 14:20:12 -0700942 if (dlci->adaption < 3 && !dlci->net)
Alan Coxe1eaea42010-03-26 11:32:54 +0000943 len = gsm_dlci_data_output(gsm, dlci);
944 else
945 len = gsm_dlci_data_output_framed(gsm, dlci);
946 if (len < 0)
Julia Lawalle73790a2010-08-10 18:03:12 -0700947 break;
Alan Coxe1eaea42010-03-26 11:32:54 +0000948 /* DLCI empty - try the next */
949 if (len == 0)
950 i++;
951 }
Alan Coxe1eaea42010-03-26 11:32:54 +0000952}
953
954/**
955 * gsm_dlci_data_kick - transmit if possible
956 * @dlci: DLCI to kick
957 *
958 * Transmit data from this DLCI if the queue is empty. We can't rely on
959 * a tty wakeup except when we filled the pipe so we need to fire off
960 * new data ourselves in other cases.
961 */
962
963static void gsm_dlci_data_kick(struct gsm_dlci *dlci)
964{
965 unsigned long flags;
Russ Gorby192b6042012-08-13 13:43:36 +0100966 int sweep;
Alan Coxe1eaea42010-03-26 11:32:54 +0000967
Aldo Iljazif3c909b2013-07-08 22:28:00 +0300968 if (dlci->constipated)
Frederic Beratc01af4f2012-08-13 13:43:58 +0100969 return;
Frederic Beratc01af4f2012-08-13 13:43:58 +0100970
Alan Coxe1eaea42010-03-26 11:32:54 +0000971 spin_lock_irqsave(&dlci->gsm->tx_lock, flags);
972 /* If we have nothing running then we need to fire up */
Russ Gorby192b6042012-08-13 13:43:36 +0100973 sweep = (dlci->gsm->tx_bytes < TX_THRESH_LO);
Russ Gorbybcd5abe2011-06-16 14:20:12 -0700974 if (dlci->gsm->tx_bytes == 0) {
975 if (dlci->net)
976 gsm_dlci_data_output_framed(dlci->gsm, dlci);
977 else
978 gsm_dlci_data_output(dlci->gsm, dlci);
Russ Gorby192b6042012-08-13 13:43:36 +0100979 }
980 if (sweep)
Aldo Iljazif3c909b2013-07-08 22:28:00 +0300981 gsm_dlci_data_sweep(dlci->gsm);
Alan Coxe1eaea42010-03-26 11:32:54 +0000982 spin_unlock_irqrestore(&dlci->gsm->tx_lock, flags);
983}
984
985/*
986 * Control message processing
987 */
988
989
990/**
991 * gsm_control_reply - send a response frame to a control
992 * @gsm: gsm channel
993 * @cmd: the command to use
994 * @data: data to follow encoded info
995 * @dlen: length of data
996 *
997 * Encode up and queue a UI/UIH frame containing our response.
998 */
999
Tony Lindgren4feb7a42019-01-13 17:25:27 -08001000static void gsm_control_reply(struct gsm_mux *gsm, int cmd, const u8 *data,
Alan Coxe1eaea42010-03-26 11:32:54 +00001001 int dlen)
1002{
1003 struct gsm_msg *msg;
1004 msg = gsm_data_alloc(gsm, 0, dlen + 2, gsm->ftype);
Ken Mills093d8042010-12-13 15:28:03 +00001005 if (msg == NULL)
1006 return;
Alan Coxe1eaea42010-03-26 11:32:54 +00001007 msg->data[0] = (cmd & 0xFE) << 1 | EA; /* Clear C/R */
1008 msg->data[1] = (dlen << 1) | EA;
1009 memcpy(msg->data + 2, data, dlen);
1010 gsm_data_queue(gsm->dlci[0], msg);
1011}
1012
1013/**
1014 * gsm_process_modem - process received modem status
1015 * @tty: virtual tty bound to the DLCI
1016 * @dlci: DLCI to affect
1017 * @modem: modem bits (full EA)
1018 *
1019 * Used when a modem control message or line state inline in adaption
1020 * layer 2 is processed. Sort out the local modem state and throttles
1021 */
1022
1023static void gsm_process_modem(struct tty_struct *tty, struct gsm_dlci *dlci,
Russ Gorby72632872011-06-14 13:23:28 -07001024 u32 modem, int clen)
Alan Coxe1eaea42010-03-26 11:32:54 +00001025{
1026 int mlines = 0;
Russ Gorby72632872011-06-14 13:23:28 -07001027 u8 brk = 0;
Frederic Beratc01af4f2012-08-13 13:43:58 +01001028 int fc;
Russ Gorby72632872011-06-14 13:23:28 -07001029
1030 /* The modem status command can either contain one octet (v.24 signals)
1031 or two octets (v.24 signals + break signals). The length field will
1032 either be 2 or 3 respectively. This is specified in section
1033 5.4.6.3.7 of the 27.010 mux spec. */
1034
1035 if (clen == 2)
1036 modem = modem & 0x7f;
1037 else {
1038 brk = modem & 0x7f;
1039 modem = (modem >> 7) & 0x7f;
Frederic Beratc01af4f2012-08-13 13:43:58 +01001040 }
Alan Coxe1eaea42010-03-26 11:32:54 +00001041
1042 /* Flow control/ready to communicate */
Frederic Beratc01af4f2012-08-13 13:43:58 +01001043 fc = (modem & MDM_FC) || !(modem & MDM_RTR);
1044 if (fc && !dlci->constipated) {
Alan Coxe1eaea42010-03-26 11:32:54 +00001045 /* Need to throttle our output on this device */
Jiri Slaby7a9ed9c2020-02-19 09:49:48 +01001046 dlci->constipated = true;
Frederic Beratc01af4f2012-08-13 13:43:58 +01001047 } else if (!fc && dlci->constipated) {
Jiri Slaby7a9ed9c2020-02-19 09:49:48 +01001048 dlci->constipated = false;
Alan Coxe1eaea42010-03-26 11:32:54 +00001049 gsm_dlci_data_kick(dlci);
1050 }
Frederic Beratc01af4f2012-08-13 13:43:58 +01001051
Alan Coxe1eaea42010-03-26 11:32:54 +00001052 /* Map modem bits */
Frederic Beratc01af4f2012-08-13 13:43:58 +01001053 if (modem & MDM_RTC)
1054 mlines |= TIOCM_DSR | TIOCM_DTR;
Alan Coxe1eaea42010-03-26 11:32:54 +00001055 if (modem & MDM_RTR)
1056 mlines |= TIOCM_RTS | TIOCM_CTS;
1057 if (modem & MDM_IC)
1058 mlines |= TIOCM_RI;
1059 if (modem & MDM_DV)
1060 mlines |= TIOCM_CD;
1061
1062 /* Carrier drop -> hangup */
1063 if (tty) {
1064 if ((mlines & TIOCM_CD) == 0 && (dlci->modem_rx & TIOCM_CD))
Peter Hurley9db276f2016-01-10 20:36:15 -08001065 if (!C_CLOCAL(tty))
Alan Coxe1eaea42010-03-26 11:32:54 +00001066 tty_hangup(tty);
Alan Coxe1eaea42010-03-26 11:32:54 +00001067 }
Jiri Slaby92a19f92013-01-03 15:53:03 +01001068 if (brk & 0x01)
1069 tty_insert_flip_char(&dlci->port, 0, TTY_BREAK);
Alan Coxe1eaea42010-03-26 11:32:54 +00001070 dlci->modem_rx = mlines;
1071}
1072
1073/**
1074 * gsm_control_modem - modem status received
1075 * @gsm: GSM channel
1076 * @data: data following command
1077 * @clen: command length
1078 *
1079 * We have received a modem status control message. This is used by
1080 * the GSM mux protocol to pass virtual modem line status and optionally
1081 * to indicate break signals. Unpack it, convert to Linux representation
1082 * and if need be stuff a break message down the tty.
1083 */
1084
Tony Lindgren4feb7a42019-01-13 17:25:27 -08001085static void gsm_control_modem(struct gsm_mux *gsm, const u8 *data, int clen)
Alan Coxe1eaea42010-03-26 11:32:54 +00001086{
1087 unsigned int addr = 0;
1088 unsigned int modem = 0;
Lars Poeschel3ac06b92014-01-07 13:34:37 +01001089 unsigned int brk = 0;
Alan Coxe1eaea42010-03-26 11:32:54 +00001090 struct gsm_dlci *dlci;
1091 int len = clen;
Tony Lindgren4feb7a42019-01-13 17:25:27 -08001092 const u8 *dp = data;
Alan Coxe1eaea42010-03-26 11:32:54 +00001093 struct tty_struct *tty;
1094
1095 while (gsm_read_ea(&addr, *dp++) == 0) {
1096 len--;
1097 if (len == 0)
1098 return;
1099 }
1100 /* Must be at least one byte following the EA */
1101 len--;
1102 if (len <= 0)
1103 return;
1104
1105 addr >>= 1;
1106 /* Closed port, or invalid ? */
1107 if (addr == 0 || addr >= NUM_DLCI || gsm->dlci[addr] == NULL)
1108 return;
1109 dlci = gsm->dlci[addr];
1110
1111 while (gsm_read_ea(&modem, *dp++) == 0) {
1112 len--;
1113 if (len == 0)
1114 return;
1115 }
Lars Poeschel3ac06b92014-01-07 13:34:37 +01001116 len--;
1117 if (len > 0) {
1118 while (gsm_read_ea(&brk, *dp++) == 0) {
1119 len--;
1120 if (len == 0)
1121 return;
1122 }
1123 modem <<= 7;
1124 modem |= (brk & 0x7f);
1125 }
Alan Coxe1eaea42010-03-26 11:32:54 +00001126 tty = tty_port_tty_get(&dlci->port);
Russ Gorby72632872011-06-14 13:23:28 -07001127 gsm_process_modem(tty, dlci, modem, clen);
Alan Coxe1eaea42010-03-26 11:32:54 +00001128 if (tty) {
1129 tty_wakeup(tty);
1130 tty_kref_put(tty);
1131 }
1132 gsm_control_reply(gsm, CMD_MSC, data, clen);
1133}
1134
1135/**
1136 * gsm_control_rls - remote line status
1137 * @gsm: GSM channel
1138 * @data: data bytes
1139 * @clen: data length
1140 *
1141 * The modem sends us a two byte message on the control channel whenever
1142 * it wishes to send us an error state from the virtual link. Stuff
1143 * this into the uplink tty if present
1144 */
1145
Tony Lindgren4feb7a42019-01-13 17:25:27 -08001146static void gsm_control_rls(struct gsm_mux *gsm, const u8 *data, int clen)
Alan Coxe1eaea42010-03-26 11:32:54 +00001147{
Jiri Slaby92a19f92013-01-03 15:53:03 +01001148 struct tty_port *port;
Aldo Iljazif3c909b2013-07-08 22:28:00 +03001149 unsigned int addr = 0;
Alan Coxe1eaea42010-03-26 11:32:54 +00001150 u8 bits;
1151 int len = clen;
Tony Lindgren4feb7a42019-01-13 17:25:27 -08001152 const u8 *dp = data;
Alan Coxe1eaea42010-03-26 11:32:54 +00001153
1154 while (gsm_read_ea(&addr, *dp++) == 0) {
1155 len--;
1156 if (len == 0)
1157 return;
1158 }
1159 /* Must be at least one byte following ea */
1160 len--;
1161 if (len <= 0)
1162 return;
1163 addr >>= 1;
1164 /* Closed port, or invalid ? */
1165 if (addr == 0 || addr >= NUM_DLCI || gsm->dlci[addr] == NULL)
1166 return;
1167 /* No error ? */
1168 bits = *dp;
1169 if ((bits & 1) == 0)
1170 return;
Alan Coxe1eaea42010-03-26 11:32:54 +00001171
Jiri Slaby92a19f92013-01-03 15:53:03 +01001172 port = &gsm->dlci[addr]->port;
1173
1174 if (bits & 2)
1175 tty_insert_flip_char(port, 0, TTY_OVERRUN);
1176 if (bits & 4)
1177 tty_insert_flip_char(port, 0, TTY_PARITY);
1178 if (bits & 8)
1179 tty_insert_flip_char(port, 0, TTY_FRAME);
1180
Jiri Slaby2e124b42013-01-03 15:53:06 +01001181 tty_flip_buffer_push(port);
1182
Alan Coxe1eaea42010-03-26 11:32:54 +00001183 gsm_control_reply(gsm, CMD_RLS, data, clen);
1184}
1185
1186static void gsm_dlci_begin_close(struct gsm_dlci *dlci);
1187
1188/**
1189 * gsm_control_message - DLCI 0 control processing
1190 * @gsm: our GSM mux
1191 * @command: the command EA
1192 * @data: data beyond the command/length EAs
1193 * @clen: length
1194 *
1195 * Input processor for control messages from the other end of the link.
1196 * Processes the incoming request and queues a response frame or an
1197 * NSC response if not supported
1198 */
1199
1200static void gsm_control_message(struct gsm_mux *gsm, unsigned int command,
Tony Lindgren4feb7a42019-01-13 17:25:27 -08001201 const u8 *data, int clen)
Alan Coxe1eaea42010-03-26 11:32:54 +00001202{
1203 u8 buf[1];
Russ Gorby5e447082012-08-13 13:44:40 +01001204 unsigned long flags;
1205
Alan Coxe1eaea42010-03-26 11:32:54 +00001206 switch (command) {
1207 case CMD_CLD: {
1208 struct gsm_dlci *dlci = gsm->dlci[0];
1209 /* Modem wishes to close down */
1210 if (dlci) {
Jiri Slaby5677fcf2020-02-19 09:49:46 +01001211 dlci->dead = true;
1212 gsm->dead = true;
Alan Coxe1eaea42010-03-26 11:32:54 +00001213 gsm_dlci_begin_close(dlci);
1214 }
1215 }
1216 break;
1217 case CMD_TEST:
1218 /* Modem wishes to test, reply with the data */
1219 gsm_control_reply(gsm, CMD_TEST, data, clen);
1220 break;
1221 case CMD_FCON:
Alan Coxe1eaea42010-03-26 11:32:54 +00001222 /* Modem can accept data again */
Jiri Slaby7a9ed9c2020-02-19 09:49:48 +01001223 gsm->constipated = false;
Frederic Beratc01af4f2012-08-13 13:43:58 +01001224 gsm_control_reply(gsm, CMD_FCON, NULL, 0);
Alan Coxe1eaea42010-03-26 11:32:54 +00001225 /* Kick the link in case it is idling */
Russ Gorby5e447082012-08-13 13:44:40 +01001226 spin_lock_irqsave(&gsm->tx_lock, flags);
Gregory CLEMENT01dbb362020-05-12 13:53:23 +02001227 gsm_data_kick(gsm, NULL);
Russ Gorby5e447082012-08-13 13:44:40 +01001228 spin_unlock_irqrestore(&gsm->tx_lock, flags);
Alan Coxe1eaea42010-03-26 11:32:54 +00001229 break;
Frederic Beratc01af4f2012-08-13 13:43:58 +01001230 case CMD_FCOFF:
1231 /* Modem wants us to STFU */
Jiri Slaby7a9ed9c2020-02-19 09:49:48 +01001232 gsm->constipated = true;
Frederic Beratc01af4f2012-08-13 13:43:58 +01001233 gsm_control_reply(gsm, CMD_FCOFF, NULL, 0);
1234 break;
Alan Coxe1eaea42010-03-26 11:32:54 +00001235 case CMD_MSC:
1236 /* Out of band modem line change indicator for a DLCI */
1237 gsm_control_modem(gsm, data, clen);
1238 break;
1239 case CMD_RLS:
1240 /* Out of band error reception for a DLCI */
1241 gsm_control_rls(gsm, data, clen);
1242 break;
1243 case CMD_PSC:
1244 /* Modem wishes to enter power saving state */
1245 gsm_control_reply(gsm, CMD_PSC, NULL, 0);
1246 break;
1247 /* Optional unsupported commands */
1248 case CMD_PN: /* Parameter negotiation */
Lucas De Marchi25985ed2011-03-30 22:57:33 -03001249 case CMD_RPN: /* Remote port negotiation */
1250 case CMD_SNC: /* Service negotiation command */
Alan Coxe1eaea42010-03-26 11:32:54 +00001251 default:
1252 /* Reply to bad commands with an NSC */
1253 buf[0] = command;
1254 gsm_control_reply(gsm, CMD_NSC, buf, 1);
1255 break;
1256 }
1257}
1258
1259/**
1260 * gsm_control_response - process a response to our control
1261 * @gsm: our GSM mux
1262 * @command: the command (response) EA
1263 * @data: data beyond the command/length EA
1264 * @clen: length
1265 *
1266 * Process a response to an outstanding command. We only allow a single
1267 * control message in flight so this is fairly easy. All the clean up
1268 * is done by the caller, we just update the fields, flag it as done
1269 * and return
1270 */
1271
1272static void gsm_control_response(struct gsm_mux *gsm, unsigned int command,
Tony Lindgren4feb7a42019-01-13 17:25:27 -08001273 const u8 *data, int clen)
Alan Coxe1eaea42010-03-26 11:32:54 +00001274{
1275 struct gsm_control *ctrl;
1276 unsigned long flags;
1277
1278 spin_lock_irqsave(&gsm->control_lock, flags);
1279
1280 ctrl = gsm->pending_cmd;
1281 /* Does the reply match our command */
1282 command |= 1;
1283 if (ctrl != NULL && (command == ctrl->cmd || command == CMD_NSC)) {
1284 /* Our command was replied to, kill the retry timer */
1285 del_timer(&gsm->t2_timer);
1286 gsm->pending_cmd = NULL;
1287 /* Rejected by the other end */
1288 if (command == CMD_NSC)
1289 ctrl->error = -EOPNOTSUPP;
1290 ctrl->done = 1;
1291 wake_up(&gsm->event);
1292 }
1293 spin_unlock_irqrestore(&gsm->control_lock, flags);
1294}
1295
1296/**
Alan Cox5f9a31d2010-11-04 15:17:27 +00001297 * gsm_control_transmit - send control packet
Alan Coxe1eaea42010-03-26 11:32:54 +00001298 * @gsm: gsm mux
1299 * @ctrl: frame to send
1300 *
1301 * Send out a pending control command (called under control lock)
1302 */
1303
1304static void gsm_control_transmit(struct gsm_mux *gsm, struct gsm_control *ctrl)
1305{
Eric Bénarded43b472011-03-09 19:24:49 +01001306 struct gsm_msg *msg = gsm_data_alloc(gsm, 0, ctrl->len + 1, gsm->ftype);
Alan Coxe1eaea42010-03-26 11:32:54 +00001307 if (msg == NULL)
1308 return;
1309 msg->data[0] = (ctrl->cmd << 1) | 2 | EA; /* command */
1310 memcpy(msg->data + 1, ctrl->data, ctrl->len);
1311 gsm_data_queue(gsm->dlci[0], msg);
1312}
1313
1314/**
1315 * gsm_control_retransmit - retransmit a control frame
1316 * @data: pointer to our gsm object
1317 *
1318 * Called off the T2 timer expiry in order to retransmit control frames
1319 * that have been lost in the system somewhere. The control_lock protects
1320 * us from colliding with another sender or a receive completion event.
1321 * In that situation the timer may still occur in a small window but
1322 * gsm->pending_cmd will be NULL and we just let the timer expire.
1323 */
1324
Kees Cooke99e88a2017-10-16 14:43:17 -07001325static void gsm_control_retransmit(struct timer_list *t)
Alan Coxe1eaea42010-03-26 11:32:54 +00001326{
Kees Cooke99e88a2017-10-16 14:43:17 -07001327 struct gsm_mux *gsm = from_timer(gsm, t, t2_timer);
Alan Coxe1eaea42010-03-26 11:32:54 +00001328 struct gsm_control *ctrl;
1329 unsigned long flags;
1330 spin_lock_irqsave(&gsm->control_lock, flags);
1331 ctrl = gsm->pending_cmd;
1332 if (ctrl) {
1333 gsm->cretries--;
1334 if (gsm->cretries == 0) {
1335 gsm->pending_cmd = NULL;
1336 ctrl->error = -ETIMEDOUT;
1337 ctrl->done = 1;
1338 spin_unlock_irqrestore(&gsm->control_lock, flags);
1339 wake_up(&gsm->event);
1340 return;
1341 }
1342 gsm_control_transmit(gsm, ctrl);
1343 mod_timer(&gsm->t2_timer, jiffies + gsm->t2 * HZ / 100);
1344 }
1345 spin_unlock_irqrestore(&gsm->control_lock, flags);
1346}
1347
1348/**
1349 * gsm_control_send - send a control frame on DLCI 0
1350 * @gsm: the GSM channel
1351 * @command: command to send including CR bit
1352 * @data: bytes of data (must be kmalloced)
1353 * @len: length of the block to send
1354 *
1355 * Queue and dispatch a control command. Only one command can be
1356 * active at a time. In theory more can be outstanding but the matching
1357 * gets really complicated so for now stick to one outstanding.
1358 */
1359
1360static struct gsm_control *gsm_control_send(struct gsm_mux *gsm,
1361 unsigned int command, u8 *data, int clen)
1362{
1363 struct gsm_control *ctrl = kzalloc(sizeof(struct gsm_control),
1364 GFP_KERNEL);
1365 unsigned long flags;
1366 if (ctrl == NULL)
1367 return NULL;
1368retry:
1369 wait_event(gsm->event, gsm->pending_cmd == NULL);
1370 spin_lock_irqsave(&gsm->control_lock, flags);
1371 if (gsm->pending_cmd != NULL) {
1372 spin_unlock_irqrestore(&gsm->control_lock, flags);
1373 goto retry;
1374 }
1375 ctrl->cmd = command;
1376 ctrl->data = data;
1377 ctrl->len = clen;
1378 gsm->pending_cmd = ctrl;
Tony Lindgrene9ec2252018-04-07 10:19:50 -07001379
1380 /* If DLCI0 is in ADM mode skip retries, it won't respond */
1381 if (gsm->dlci[0]->mode == DLCI_MODE_ADM)
1382 gsm->cretries = 1;
1383 else
1384 gsm->cretries = gsm->n2;
1385
Alan Coxe1eaea42010-03-26 11:32:54 +00001386 mod_timer(&gsm->t2_timer, jiffies + gsm->t2 * HZ / 100);
1387 gsm_control_transmit(gsm, ctrl);
1388 spin_unlock_irqrestore(&gsm->control_lock, flags);
1389 return ctrl;
1390}
1391
1392/**
1393 * gsm_control_wait - wait for a control to finish
1394 * @gsm: GSM mux
1395 * @control: control we are waiting on
1396 *
1397 * Waits for the control to complete or time out. Frees any used
1398 * resources and returns 0 for success, or an error if the remote
1399 * rejected or ignored the request.
1400 */
1401
1402static int gsm_control_wait(struct gsm_mux *gsm, struct gsm_control *control)
1403{
1404 int err;
1405 wait_event(gsm->event, control->done == 1);
1406 err = control->error;
1407 kfree(control);
1408 return err;
1409}
1410
1411
1412/*
1413 * DLCI level handling: Needs krefs
1414 */
1415
1416/*
1417 * State transitions and timers
1418 */
1419
1420/**
1421 * gsm_dlci_close - a DLCI has closed
1422 * @dlci: DLCI that closed
1423 *
1424 * Perform processing when moving a DLCI into closed state. If there
1425 * is an attached tty this is hung up
1426 */
1427
1428static void gsm_dlci_close(struct gsm_dlci *dlci)
1429{
1430 del_timer(&dlci->t1);
1431 if (debug & 8)
Alan Cox5f9a31d2010-11-04 15:17:27 +00001432 pr_debug("DLCI %d goes closed.\n", dlci->addr);
Alan Coxe1eaea42010-03-26 11:32:54 +00001433 dlci->state = DLCI_CLOSED;
1434 if (dlci->addr != 0) {
Jiri Slabyaa27a092013-03-07 13:12:30 +01001435 tty_port_tty_hangup(&dlci->port, false);
Jiri Slaby036bca1fc2020-02-19 09:49:40 +01001436 kfifo_reset(&dlci->fifo);
Alan Coxe1eaea42010-03-26 11:32:54 +00001437 } else
Jiri Slaby5677fcf2020-02-19 09:49:46 +01001438 dlci->gsm->dead = true;
Alan Coxe1eaea42010-03-26 11:32:54 +00001439 wake_up(&dlci->gsm->event);
1440 /* A DLCI 0 close is a MUX termination so we need to kick that
1441 back to userspace somehow */
1442}
1443
1444/**
1445 * gsm_dlci_open - a DLCI has opened
1446 * @dlci: DLCI that opened
1447 *
1448 * Perform processing when moving a DLCI into open state.
1449 */
1450
1451static void gsm_dlci_open(struct gsm_dlci *dlci)
1452{
1453 /* Note that SABM UA .. SABM UA first UA lost can mean that we go
1454 open -> open */
1455 del_timer(&dlci->t1);
1456 /* This will let a tty open continue */
1457 dlci->state = DLCI_OPEN;
1458 if (debug & 8)
Alan Cox5f9a31d2010-11-04 15:17:27 +00001459 pr_debug("DLCI %d goes open.\n", dlci->addr);
Alan Coxe1eaea42010-03-26 11:32:54 +00001460 wake_up(&dlci->gsm->event);
1461}
1462
1463/**
1464 * gsm_dlci_t1 - T1 timer expiry
1465 * @dlci: DLCI that opened
1466 *
1467 * The T1 timer handles retransmits of control frames (essentially of
1468 * SABM and DISC). We resend the command until the retry count runs out
1469 * in which case an opening port goes back to closed and a closing port
1470 * is simply put into closed state (any further frames from the other
1471 * end will get a DM response)
Tony Lindgrenea3d8462018-01-03 10:18:03 -08001472 *
1473 * Some control dlci can stay in ADM mode with other dlci working just
1474 * fine. In that case we can just keep the control dlci open after the
1475 * DLCI_OPENING retries time out.
Alan Coxe1eaea42010-03-26 11:32:54 +00001476 */
1477
Kees Cooke99e88a2017-10-16 14:43:17 -07001478static void gsm_dlci_t1(struct timer_list *t)
Alan Coxe1eaea42010-03-26 11:32:54 +00001479{
Kees Cooke99e88a2017-10-16 14:43:17 -07001480 struct gsm_dlci *dlci = from_timer(dlci, t, t1);
Alan Coxe1eaea42010-03-26 11:32:54 +00001481 struct gsm_mux *gsm = dlci->gsm;
1482
1483 switch (dlci->state) {
1484 case DLCI_OPENING:
1485 dlci->retries--;
1486 if (dlci->retries) {
1487 gsm_command(dlci->gsm, dlci->addr, SABM|PF);
1488 mod_timer(&dlci->t1, jiffies + gsm->t1 * HZ / 100);
Tony Lindgrenea3d8462018-01-03 10:18:03 -08001489 } else if (!dlci->addr && gsm->control == (DM | PF)) {
1490 if (debug & 8)
1491 pr_info("DLCI %d opening in ADM mode.\n",
1492 dlci->addr);
Tony Lindgrene9ec2252018-04-07 10:19:50 -07001493 dlci->mode = DLCI_MODE_ADM;
Tony Lindgrenea3d8462018-01-03 10:18:03 -08001494 gsm_dlci_open(dlci);
1495 } else {
Alan Coxe1eaea42010-03-26 11:32:54 +00001496 gsm_dlci_close(dlci);
Tony Lindgrenea3d8462018-01-03 10:18:03 -08001497 }
1498
Alan Coxe1eaea42010-03-26 11:32:54 +00001499 break;
1500 case DLCI_CLOSING:
1501 dlci->retries--;
1502 if (dlci->retries) {
1503 gsm_command(dlci->gsm, dlci->addr, DISC|PF);
1504 mod_timer(&dlci->t1, jiffies + gsm->t1 * HZ / 100);
1505 } else
1506 gsm_dlci_close(dlci);
1507 break;
Jiri Slaby72ae8cc2020-02-19 09:49:41 +01001508 default:
1509 pr_debug("%s: unhandled state: %d\n", __func__, dlci->state);
1510 break;
Alan Coxe1eaea42010-03-26 11:32:54 +00001511 }
1512}
1513
1514/**
1515 * gsm_dlci_begin_open - start channel open procedure
1516 * @dlci: DLCI to open
1517 *
1518 * Commence opening a DLCI from the Linux side. We issue SABM messages
Tony Lindgrenea3d8462018-01-03 10:18:03 -08001519 * to the modem which should then reply with a UA or ADM, at which point
1520 * we will move into open state. Opening is done asynchronously with retry
Alan Coxe1eaea42010-03-26 11:32:54 +00001521 * running off timers and the responses.
1522 */
1523
1524static void gsm_dlci_begin_open(struct gsm_dlci *dlci)
1525{
1526 struct gsm_mux *gsm = dlci->gsm;
1527 if (dlci->state == DLCI_OPEN || dlci->state == DLCI_OPENING)
1528 return;
1529 dlci->retries = gsm->n2;
1530 dlci->state = DLCI_OPENING;
1531 gsm_command(dlci->gsm, dlci->addr, SABM|PF);
1532 mod_timer(&dlci->t1, jiffies + gsm->t1 * HZ / 100);
1533}
1534
1535/**
1536 * gsm_dlci_begin_close - start channel open procedure
1537 * @dlci: DLCI to open
1538 *
1539 * Commence closing a DLCI from the Linux side. We issue DISC messages
1540 * to the modem which should then reply with a UA, at which point we
1541 * will move into closed state. Closing is done asynchronously with retry
1542 * off timers. We may also receive a DM reply from the other end which
1543 * indicates the channel was already closed.
1544 */
1545
1546static void gsm_dlci_begin_close(struct gsm_dlci *dlci)
1547{
1548 struct gsm_mux *gsm = dlci->gsm;
1549 if (dlci->state == DLCI_CLOSED || dlci->state == DLCI_CLOSING)
1550 return;
1551 dlci->retries = gsm->n2;
1552 dlci->state = DLCI_CLOSING;
1553 gsm_command(dlci->gsm, dlci->addr, DISC|PF);
1554 mod_timer(&dlci->t1, jiffies + gsm->t1 * HZ / 100);
1555}
1556
1557/**
1558 * gsm_dlci_data - data arrived
1559 * @dlci: channel
1560 * @data: block of bytes received
1561 * @len: length of received block
1562 *
1563 * A UI or UIH frame has arrived which contains data for a channel
1564 * other than the control channel. If the relevant virtual tty is
1565 * open we shovel the bits down it, if not we drop them.
1566 */
1567
Tony Lindgren4feb7a42019-01-13 17:25:27 -08001568static void gsm_dlci_data(struct gsm_dlci *dlci, const u8 *data, int clen)
Alan Coxe1eaea42010-03-26 11:32:54 +00001569{
1570 /* krefs .. */
1571 struct tty_port *port = &dlci->port;
Jiri Slaby2e124b42013-01-03 15:53:06 +01001572 struct tty_struct *tty;
Alan Coxe1eaea42010-03-26 11:32:54 +00001573 unsigned int modem = 0;
Russ Gorby72632872011-06-14 13:23:28 -07001574 int len = clen;
Alan Coxe1eaea42010-03-26 11:32:54 +00001575
1576 if (debug & 16)
Jiri Slaby2e124b42013-01-03 15:53:06 +01001577 pr_debug("%d bytes for tty\n", len);
1578 switch (dlci->adaption) {
1579 /* Unsupported types */
Gustavo A. R. Silva3e913ee2019-02-25 11:28:14 -06001580 case 4: /* Packetised interruptible data */
Jiri Slaby2e124b42013-01-03 15:53:06 +01001581 break;
Gustavo A. R. Silva3e913ee2019-02-25 11:28:14 -06001582 case 3: /* Packetised uininterruptible voice/data */
Jiri Slaby2e124b42013-01-03 15:53:06 +01001583 break;
Gustavo A. R. Silva3e913ee2019-02-25 11:28:14 -06001584 case 2: /* Asynchronous serial with line state in each frame */
Jiri Slaby2e124b42013-01-03 15:53:06 +01001585 while (gsm_read_ea(&modem, *data++) == 0) {
1586 len--;
1587 if (len == 0)
1588 return;
Alan Coxe1eaea42010-03-26 11:32:54 +00001589 }
Jiri Slaby2e124b42013-01-03 15:53:06 +01001590 tty = tty_port_tty_get(port);
1591 if (tty) {
1592 gsm_process_modem(tty, dlci, modem, clen);
1593 tty_kref_put(tty);
1594 }
Gustavo A. R. Silva3e913ee2019-02-25 11:28:14 -06001595 /* Fall through */
1596 case 1: /* Line state will go via DLCI 0 controls only */
Jiri Slaby2e124b42013-01-03 15:53:06 +01001597 default:
1598 tty_insert_flip_string(port, data, len);
1599 tty_flip_buffer_push(port);
Alan Coxe1eaea42010-03-26 11:32:54 +00001600 }
1601}
1602
1603/**
1604 * gsm_dlci_control - data arrived on control channel
1605 * @dlci: channel
1606 * @data: block of bytes received
1607 * @len: length of received block
1608 *
1609 * A UI or UIH frame has arrived which contains data for DLCI 0 the
1610 * control channel. This should contain a command EA followed by
1611 * control data bytes. The command EA contains a command/response bit
1612 * and we divide up the work accordingly.
1613 */
1614
Tony Lindgren4feb7a42019-01-13 17:25:27 -08001615static void gsm_dlci_command(struct gsm_dlci *dlci, const u8 *data, int len)
Alan Coxe1eaea42010-03-26 11:32:54 +00001616{
1617 /* See what command is involved */
1618 unsigned int command = 0;
1619 while (len-- > 0) {
1620 if (gsm_read_ea(&command, *data++) == 1) {
1621 int clen = *data++;
1622 len--;
1623 /* FIXME: this is properly an EA */
1624 clen >>= 1;
1625 /* Malformed command ? */
1626 if (clen > len)
1627 return;
1628 if (command & 1)
1629 gsm_control_message(dlci->gsm, command,
1630 data, clen);
1631 else
1632 gsm_control_response(dlci->gsm, command,
1633 data, clen);
1634 return;
1635 }
1636 }
1637}
1638
1639/*
1640 * Allocate/Free DLCI channels
1641 */
1642
1643/**
1644 * gsm_dlci_alloc - allocate a DLCI
1645 * @gsm: GSM mux
1646 * @addr: address of the DLCI
1647 *
1648 * Allocate and install a new DLCI object into the GSM mux.
1649 *
1650 * FIXME: review locking races
1651 */
1652
1653static struct gsm_dlci *gsm_dlci_alloc(struct gsm_mux *gsm, int addr)
1654{
1655 struct gsm_dlci *dlci = kzalloc(sizeof(struct gsm_dlci), GFP_ATOMIC);
1656 if (dlci == NULL)
1657 return NULL;
1658 spin_lock_init(&dlci->lock);
Russ Gorbybcd5abe2011-06-16 14:20:12 -07001659 mutex_init(&dlci->mutex);
Jiri Slaby036bca1fc2020-02-19 09:49:40 +01001660 if (kfifo_alloc(&dlci->fifo, 4096, GFP_KERNEL) < 0) {
Alan Coxe1eaea42010-03-26 11:32:54 +00001661 kfree(dlci);
1662 return NULL;
1663 }
1664
1665 skb_queue_head_init(&dlci->skb_list);
Kees Cooke99e88a2017-10-16 14:43:17 -07001666 timer_setup(&dlci->t1, gsm_dlci_t1, 0);
Alan Coxe1eaea42010-03-26 11:32:54 +00001667 tty_port_init(&dlci->port);
1668 dlci->port.ops = &gsm_port_ops;
1669 dlci->gsm = gsm;
1670 dlci->addr = addr;
1671 dlci->adaption = gsm->adaption;
1672 dlci->state = DLCI_CLOSED;
1673 if (addr)
1674 dlci->data = gsm_dlci_data;
1675 else
1676 dlci->data = gsm_dlci_command;
1677 gsm->dlci[addr] = dlci;
1678 return dlci;
1679}
1680
1681/**
Russ Gorby6ab8fba2011-06-16 14:20:13 -07001682 * gsm_dlci_free - free DLCI
1683 * @dlci: DLCI to free
Alan Coxe1eaea42010-03-26 11:32:54 +00001684 *
Russ Gorby6ab8fba2011-06-16 14:20:13 -07001685 * Free up a DLCI.
Alan Coxe1eaea42010-03-26 11:32:54 +00001686 *
1687 * Can sleep.
1688 */
Jiri Slaby9a8e62b2012-11-15 09:49:53 +01001689static void gsm_dlci_free(struct tty_port *port)
Russ Gorby6ab8fba2011-06-16 14:20:13 -07001690{
Jiri Slaby9a8e62b2012-11-15 09:49:53 +01001691 struct gsm_dlci *dlci = container_of(port, struct gsm_dlci, port);
Russ Gorby6ab8fba2011-06-16 14:20:13 -07001692
1693 del_timer_sync(&dlci->t1);
1694 dlci->gsm->dlci[dlci->addr] = NULL;
Jiri Slaby036bca1fc2020-02-19 09:49:40 +01001695 kfifo_free(&dlci->fifo);
Russ Gorby6ab8fba2011-06-16 14:20:13 -07001696 while ((dlci->skb = skb_dequeue(&dlci->skb_list)))
Russ Gorby329e5672012-08-13 13:45:15 +01001697 dev_kfree_skb(dlci->skb);
Russ Gorby6ab8fba2011-06-16 14:20:13 -07001698 kfree(dlci);
1699}
1700
1701static inline void dlci_get(struct gsm_dlci *dlci)
1702{
Jiri Slaby9a8e62b2012-11-15 09:49:53 +01001703 tty_port_get(&dlci->port);
Russ Gorby6ab8fba2011-06-16 14:20:13 -07001704}
1705
1706static inline void dlci_put(struct gsm_dlci *dlci)
1707{
Jiri Slaby9a8e62b2012-11-15 09:49:53 +01001708 tty_port_put(&dlci->port);
Russ Gorby6ab8fba2011-06-16 14:20:13 -07001709}
1710
Dirkjan Bussink4d9b1092013-01-30 11:44:50 +01001711static void gsm_destroy_network(struct gsm_dlci *dlci);
1712
Russ Gorby6ab8fba2011-06-16 14:20:13 -07001713/**
1714 * gsm_dlci_release - release DLCI
1715 * @dlci: DLCI to destroy
1716 *
1717 * Release a DLCI. Actual free is deferred until either
1718 * mux is closed or tty is closed - whichever is last.
1719 *
1720 * Can sleep.
1721 */
1722static void gsm_dlci_release(struct gsm_dlci *dlci)
Alan Coxe1eaea42010-03-26 11:32:54 +00001723{
1724 struct tty_struct *tty = tty_port_tty_get(&dlci->port);
1725 if (tty) {
Dirkjan Bussink4d9b1092013-01-30 11:44:50 +01001726 mutex_lock(&dlci->mutex);
1727 gsm_destroy_network(dlci);
1728 mutex_unlock(&dlci->mutex);
1729
Martin Hundebøll70300822019-08-22 23:56:01 +02001730 tty_hangup(tty);
Chuansheng Liube706572013-12-18 13:30:11 +08001731
Dirkjan Bussink4d9b1092013-01-30 11:44:50 +01001732 tty_port_tty_set(&dlci->port, NULL);
Alan Coxe1eaea42010-03-26 11:32:54 +00001733 tty_kref_put(tty);
1734 }
Dirkjan Bussink4d9b1092013-01-30 11:44:50 +01001735 dlci->state = DLCI_CLOSED;
Russ Gorby6ab8fba2011-06-16 14:20:13 -07001736 dlci_put(dlci);
Alan Coxe1eaea42010-03-26 11:32:54 +00001737}
1738
Alan Coxe1eaea42010-03-26 11:32:54 +00001739/*
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);
Aldo Iljazif3c909b2013-07-08 22:28:00 +03001763 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 */
Mikhail Kshevetskiy9db4e432011-03-27 04:05:00 +04001768 gsm->fcs = gsm_fcs_add(gsm->fcs, gsm->received_fcs);
1769 }
Alan Coxe1eaea42010-03-26 11:32:54 +00001770 if (gsm->fcs != GOOD_FCS) {
1771 gsm->bad_fcs++;
1772 if (debug & 4)
Alan Cox5f9a31d2010-11-04 15:17:27 +00001773 pr_debug("BAD FCS %02x\n", gsm->fcs);
Alan Coxe1eaea42010-03-26 11:32:54 +00001774 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;
Jiri Slaby72ae8cc2020-02-19 09:49:41 +01001824 default:
1825 pr_debug("%s: unhandled state: %d\n", __func__,
1826 dlci->state);
1827 break;
Alan Coxe1eaea42010-03-26 11:32:54 +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{
Alan Coxc2f2f002010-11-04 15:17:03 +00001872 unsigned int len;
1873
Alan Coxe1eaea42010-03-26 11:32:54 +00001874 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 }
Alan Coxc2f2f002010-11-04 15:17:03 +00001882 break;
1883 case GSM_ADDRESS: /* Address EA */
Alan Coxe1eaea42010-03-26 11:32:54 +00001884 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;
Alan Coxc2f2f002010-11-04 15:17:03 +00001891 gsm->state = GSM_LEN0;
Alan Coxe1eaea42010-03-26 11:32:54 +00001892 break;
Alan Coxc2f2f002010-11-04 15:17:03 +00001893 case GSM_LEN0: /* Length EA */
Alan Coxe1eaea42010-03-26 11:32:54 +00001894 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;
Alan Coxc2f2f002010-11-04 15:17:03 +00001902 if (!gsm->len)
1903 gsm->state = GSM_FCS;
1904 else
1905 gsm->state = GSM_DATA;
1906 break;
Alan Coxe1eaea42010-03-26 11:32:54 +00001907 }
Alan Coxc2f2f002010-11-04 15:17:03 +00001908 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;
Alan Coxe1eaea42010-03-26 11:32:54 +00001924 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 */
Alan Coxc2f2f002010-11-04 15:17:03 +00001931 gsm->received_fcs = c;
Alan Coxe1eaea42010-03-26 11:32:54 +00001932 gsm_queue(gsm);
Alan Coxc2f2f002010-11-04 15:17:03 +00001933 gsm->state = GSM_SSOF;
1934 break;
1935 case GSM_SSOF:
1936 if (c == GSM0_SOF) {
1937 gsm->state = GSM_SEARCH;
1938 break;
1939 }
Alan Coxe1eaea42010-03-26 11:32:54 +00001940 break;
Jiri Slaby329aa6e2020-02-19 09:49:43 +01001941 default:
1942 pr_debug("%s: unhandled state: %d\n", __func__, gsm->state);
1943 break;
Alan Coxe1eaea42010-03-26 11:32:54 +00001944 }
1945}
1946
1947/**
Alan Coxc2f2f002010-11-04 15:17:03 +00001948 * gsm1_receive - perform processing for non-transparency
Alan Coxe1eaea42010-03-26 11:32:54 +00001949 * @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) {
Jiri Slabyc50704b2020-02-19 09:49:49 +01001980 gsm->escape = true;
Alan Coxe1eaea42010-03-26 11:32:54 +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;
Jiri Slabyc50704b2020-02-19 09:49:49 +01001990 gsm->escape = false;
Alan Coxe1eaea42010-03-26 11:32:54 +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;
Gustavo A. R. Silva3e913ee2019-02-25 11:28:14 -06001997 /* Fall through */
Alan Coxe1eaea42010-03-26 11:32:54 +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 */
Alan Cox5f9a31d2010-11-04 15:17:27 +00002010 if (gsm->count > gsm->mru) { /* Allow one for the FCS */
Alan Coxe1eaea42010-03-26 11:32:54 +00002011 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;
Jiri Slaby329aa6e2020-02-19 09:49:43 +01002018 default:
2019 pr_debug("%s: unhandled state: %d\n", __func__, gsm->state);
2020 break;
Alan Coxe1eaea42010-03-26 11:32:54 +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
Sascha Hauer71e07792017-05-31 08:19:05 +02002043static 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
Alan Coxe1eaea42010-03-26 11:32:54 +00002070/**
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
Rashika Kheria54af5832013-12-16 16:28:24 +05302079static void gsm_cleanup_mux(struct gsm_mux *gsm)
Alan Coxe1eaea42010-03-26 11:32:54 +00002080{
2081 int i;
2082 struct gsm_dlci *dlci = gsm->dlci[0];
Russ Gorby329e5672012-08-13 13:45:15 +01002083 struct gsm_msg *txq, *ntxq;
Alan Coxe1eaea42010-03-26 11:32:54 +00002084
Jiri Slaby5677fcf2020-02-19 09:49:46 +01002085 gsm->dead = true;
Alan Coxe1eaea42010-03-26 11:32:54 +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);
Jiri Slabyd175fec2016-03-22 18:09:51 +01002095 /* open failed before registering => nothing to do */
2096 if (i == MAX_MUX)
2097 return;
Alan Coxe1eaea42010-03-26 11:32:54 +00002098
2099 del_timer_sync(&gsm->t2_timer);
2100 /* Now we are sure T2 has stopped */
Sascha Hauer71e07792017-05-31 08:19:05 +02002101 if (dlci)
Jiri Slaby5677fcf2020-02-19 09:49:46 +01002102 dlci->dead = true;
Sascha Hauer71e07792017-05-31 08:19:05 +02002103
Alan Coxe1eaea42010-03-26 11:32:54 +00002104 /* Free up any link layer users */
Chao Bidfabf7f2013-11-26 12:09:39 +08002105 mutex_lock(&gsm->mutex);
Alan Coxe1eaea42010-03-26 11:32:54 +00002106 for (i = 0; i < NUM_DLCI; i++)
2107 if (gsm->dlci[i])
Russ Gorby6ab8fba2011-06-16 14:20:13 -07002108 gsm_dlci_release(gsm->dlci[i]);
Chao Bidfabf7f2013-11-26 12:09:39 +08002109 mutex_unlock(&gsm->mutex);
Alan Coxe1eaea42010-03-26 11:32:54 +00002110 /* Now wipe the queues */
Russ Gorbyb4338e12012-08-13 13:44:59 +01002111 list_for_each_entry_safe(txq, ntxq, &gsm->tx_list, list)
Alan Coxe1eaea42010-03-26 11:32:54 +00002112 kfree(txq);
Russ Gorbyb4338e12012-08-13 13:44:59 +01002113 INIT_LIST_HEAD(&gsm->tx_list);
Alan Coxe1eaea42010-03-26 11:32:54 +00002114}
Alan Coxe1eaea42010-03-26 11:32:54 +00002115
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
Rashika Kheria54af5832013-12-16 16:28:24 +05302125static int gsm_activate_mux(struct gsm_mux *gsm)
Alan Coxe1eaea42010-03-26 11:32:54 +00002126{
2127 struct gsm_dlci *dlci;
2128 int i = 0;
2129
Kees Cooke99e88a2017-10-16 14:43:17 -07002130 timer_setup(&gsm->t2_timer, gsm_control_retransmit, 0);
Alan Coxe1eaea42010-03-26 11:32:54 +00002131 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;
2139 gsm->error = gsm_error;
2140
2141 spin_lock(&gsm_mux_lock);
2142 for (i = 0; i < MAX_MUX; i++) {
2143 if (gsm_mux[i] == NULL) {
Russ Gorbyd50f6dc2011-06-14 13:35:32 -07002144 gsm->num = i;
Alan Coxe1eaea42010-03-26 11:32:54 +00002145 gsm_mux[i] = gsm;
2146 break;
2147 }
2148 }
2149 spin_unlock(&gsm_mux_lock);
2150 if (i == MAX_MUX)
2151 return -EBUSY;
2152
2153 dlci = gsm_dlci_alloc(gsm, 0);
2154 if (dlci == NULL)
2155 return -ENOMEM;
Jiri Slaby5677fcf2020-02-19 09:49:46 +01002156 gsm->dead = false; /* Tty opens are now permissible */
Alan Coxe1eaea42010-03-26 11:32:54 +00002157 return 0;
2158}
Alan Coxe1eaea42010-03-26 11:32:54 +00002159
2160/**
2161 * gsm_free_mux - free up a mux
2162 * @mux: mux to free
2163 *
Russ Gorby6ab8fba2011-06-16 14:20:13 -07002164 * Dispose of allocated resources for a dead mux
Alan Coxe1eaea42010-03-26 11:32:54 +00002165 */
Rashika Kheria54af5832013-12-16 16:28:24 +05302166static void gsm_free_mux(struct gsm_mux *gsm)
Alan Coxe1eaea42010-03-26 11:32:54 +00002167{
2168 kfree(gsm->txframe);
2169 kfree(gsm->buf);
2170 kfree(gsm);
2171}
Alan Coxe1eaea42010-03-26 11:32:54 +00002172
2173/**
Russ Gorby6ab8fba2011-06-16 14:20:13 -07002174 * gsm_free_muxr - free up a mux
2175 * @mux: mux to free
2176 *
2177 * Dispose of allocated resources for a dead mux
2178 */
2179static void gsm_free_muxr(struct kref *ref)
2180{
2181 struct gsm_mux *gsm = container_of(ref, struct gsm_mux, ref);
2182 gsm_free_mux(gsm);
2183}
2184
2185static inline void mux_get(struct gsm_mux *gsm)
2186{
2187 kref_get(&gsm->ref);
2188}
2189
2190static inline void mux_put(struct gsm_mux *gsm)
2191{
2192 kref_put(&gsm->ref, gsm_free_muxr);
2193}
2194
Martin Hundebøll43a9e712019-07-10 21:26:55 +02002195static inline unsigned int mux_num_to_base(struct gsm_mux *gsm)
2196{
2197 return gsm->num * NUM_DLCI;
2198}
2199
2200static inline unsigned int mux_line_to_num(unsigned int line)
2201{
2202 return line / NUM_DLCI;
2203}
2204
Russ Gorby6ab8fba2011-06-16 14:20:13 -07002205/**
Alan Coxe1eaea42010-03-26 11:32:54 +00002206 * gsm_alloc_mux - allocate a mux
2207 *
2208 * Creates a new mux ready for activation.
2209 */
2210
Rashika Kheria54af5832013-12-16 16:28:24 +05302211static struct gsm_mux *gsm_alloc_mux(void)
Alan Coxe1eaea42010-03-26 11:32:54 +00002212{
2213 struct gsm_mux *gsm = kzalloc(sizeof(struct gsm_mux), GFP_KERNEL);
2214 if (gsm == NULL)
2215 return NULL;
2216 gsm->buf = kmalloc(MAX_MRU + 1, GFP_KERNEL);
2217 if (gsm->buf == NULL) {
2218 kfree(gsm);
2219 return NULL;
2220 }
2221 gsm->txframe = kmalloc(2 * MAX_MRU + 2, GFP_KERNEL);
2222 if (gsm->txframe == NULL) {
2223 kfree(gsm->buf);
2224 kfree(gsm);
2225 return NULL;
2226 }
2227 spin_lock_init(&gsm->lock);
Chao Bidfabf7f2013-11-26 12:09:39 +08002228 mutex_init(&gsm->mutex);
Russ Gorby6ab8fba2011-06-16 14:20:13 -07002229 kref_init(&gsm->ref);
Russ Gorbyb4338e12012-08-13 13:44:59 +01002230 INIT_LIST_HEAD(&gsm->tx_list);
Alan Coxe1eaea42010-03-26 11:32:54 +00002231
2232 gsm->t1 = T1;
2233 gsm->t2 = T2;
2234 gsm->n2 = N2;
2235 gsm->ftype = UIH;
Alan Coxe1eaea42010-03-26 11:32:54 +00002236 gsm->adaption = 1;
2237 gsm->encoding = 1;
2238 gsm->mru = 64; /* Default to encoding 1 so these should be 64 */
2239 gsm->mtu = 64;
Jiri Slaby5677fcf2020-02-19 09:49:46 +01002240 gsm->dead = true; /* Avoid early tty opens */
Alan Coxe1eaea42010-03-26 11:32:54 +00002241
2242 return gsm;
2243}
Alan Coxe1eaea42010-03-26 11:32:54 +00002244
Tony Lindgren33841042019-01-13 17:25:26 -08002245static void gsm_copy_config_values(struct gsm_mux *gsm,
2246 struct gsm_config *c)
2247{
2248 memset(c, 0, sizeof(*c));
2249 c->adaption = gsm->adaption;
2250 c->encapsulation = gsm->encoding;
2251 c->initiator = gsm->initiator;
2252 c->t1 = gsm->t1;
2253 c->t2 = gsm->t2;
2254 c->t3 = 0; /* Not supported */
2255 c->n2 = gsm->n2;
2256 if (gsm->ftype == UIH)
2257 c->i = 1;
2258 else
2259 c->i = 2;
2260 pr_debug("Ftype %d i %d\n", gsm->ftype, c->i);
2261 c->mru = gsm->mru;
2262 c->mtu = gsm->mtu;
2263 c->k = 0;
2264}
2265
2266static int gsm_config(struct gsm_mux *gsm, struct gsm_config *c)
2267{
2268 int need_close = 0;
2269 int need_restart = 0;
2270
2271 /* Stuff we don't support yet - UI or I frame transport, windowing */
2272 if ((c->adaption != 1 && c->adaption != 2) || c->k)
2273 return -EOPNOTSUPP;
2274 /* Check the MRU/MTU range looks sane */
2275 if (c->mru > MAX_MRU || c->mtu > MAX_MTU || c->mru < 8 || c->mtu < 8)
2276 return -EINVAL;
2277 if (c->n2 < 3)
2278 return -EINVAL;
2279 if (c->encapsulation > 1) /* Basic, advanced, no I */
2280 return -EINVAL;
2281 if (c->initiator > 1)
2282 return -EINVAL;
2283 if (c->i == 0 || c->i > 2) /* UIH and UI only */
2284 return -EINVAL;
2285 /*
2286 * See what is needed for reconfiguration
2287 */
2288
2289 /* Timing fields */
2290 if (c->t1 != 0 && c->t1 != gsm->t1)
2291 need_restart = 1;
2292 if (c->t2 != 0 && c->t2 != gsm->t2)
2293 need_restart = 1;
2294 if (c->encapsulation != gsm->encoding)
2295 need_restart = 1;
2296 if (c->adaption != gsm->adaption)
2297 need_restart = 1;
2298 /* Requires care */
2299 if (c->initiator != gsm->initiator)
2300 need_close = 1;
2301 if (c->mru != gsm->mru)
2302 need_restart = 1;
2303 if (c->mtu != gsm->mtu)
2304 need_restart = 1;
2305
2306 /*
2307 * Close down what is needed, restart and initiate the new
2308 * configuration
2309 */
2310
2311 if (need_close || need_restart) {
2312 int ret;
2313
2314 ret = gsm_disconnect(gsm);
2315
2316 if (ret)
2317 return ret;
2318 }
2319 if (need_restart)
2320 gsm_cleanup_mux(gsm);
2321
2322 gsm->initiator = c->initiator;
2323 gsm->mru = c->mru;
2324 gsm->mtu = c->mtu;
2325 gsm->encoding = c->encapsulation;
2326 gsm->adaption = c->adaption;
2327 gsm->n2 = c->n2;
2328
2329 if (c->i == 1)
2330 gsm->ftype = UIH;
2331 else if (c->i == 2)
2332 gsm->ftype = UI;
2333
2334 if (c->t1)
2335 gsm->t1 = c->t1;
2336 if (c->t2)
2337 gsm->t2 = c->t2;
2338
2339 /*
2340 * FIXME: We need to separate activation/deactivation from adding
2341 * and removing from the mux array
2342 */
2343 if (need_restart)
2344 gsm_activate_mux(gsm);
2345 if (gsm->initiator && need_close)
2346 gsm_dlci_begin_open(gsm->dlci[0]);
2347 return 0;
2348}
2349
Alan Coxe1eaea42010-03-26 11:32:54 +00002350/**
2351 * gsmld_output - write to link
2352 * @gsm: our mux
2353 * @data: bytes to output
2354 * @len: size
2355 *
2356 * Write a block of data from the GSM mux to the data channel. This
2357 * will eventually be serialized from above but at the moment isn't.
2358 */
2359
2360static int gsmld_output(struct gsm_mux *gsm, u8 *data, int len)
2361{
2362 if (tty_write_room(gsm->tty) < len) {
2363 set_bit(TTY_DO_WRITE_WAKEUP, &gsm->tty->flags);
2364 return -ENOSPC;
2365 }
Joe Perches0a77c4f2011-04-25 16:46:49 -07002366 if (debug & 4)
2367 print_hex_dump_bytes("gsmld_output: ", DUMP_PREFIX_OFFSET,
2368 data, len);
Alan Coxe1eaea42010-03-26 11:32:54 +00002369 gsm->tty->ops->write(gsm->tty, data, len);
2370 return len;
2371}
2372
2373/**
2374 * gsmld_attach_gsm - mode set up
2375 * @tty: our tty structure
2376 * @gsm: our mux
2377 *
2378 * Set up the MUX for basic mode and commence connecting to the
2379 * modem. Currently called from the line discipline set up but
2380 * will need moving to an ioctl path.
2381 */
2382
2383static int gsmld_attach_gsm(struct tty_struct *tty, struct gsm_mux *gsm)
2384{
Martin Hundebøll43a9e712019-07-10 21:26:55 +02002385 unsigned int base;
2386 int ret, i;
Alan Coxe1eaea42010-03-26 11:32:54 +00002387
2388 gsm->tty = tty_kref_get(tty);
2389 gsm->output = gsmld_output;
2390 ret = gsm_activate_mux(gsm);
2391 if (ret != 0)
2392 tty_kref_put(gsm->tty);
Russ Gorbyd50f6dc2011-06-14 13:35:32 -07002393 else {
2394 /* Don't register device 0 - this is the control channel and not
2395 a usable tty interface */
Martin Hundebøll43a9e712019-07-10 21:26:55 +02002396 base = mux_num_to_base(gsm); /* Base for this MUX */
Russ Gorbyd50f6dc2011-06-14 13:35:32 -07002397 for (i = 1; i < NUM_DLCI; i++)
2398 tty_register_device(gsm_tty_driver, base + i, NULL);
2399 }
Alan Coxe1eaea42010-03-26 11:32:54 +00002400 return ret;
2401}
2402
2403
2404/**
2405 * gsmld_detach_gsm - stop doing 0710 mux
Justin P. Mattock70f23fd2011-05-10 10:16:21 +02002406 * @tty: tty attached to the mux
Alan Coxe1eaea42010-03-26 11:32:54 +00002407 * @gsm: mux
2408 *
2409 * Shutdown and then clean up the resources used by the line discipline
2410 */
2411
2412static void gsmld_detach_gsm(struct tty_struct *tty, struct gsm_mux *gsm)
2413{
Martin Hundebøll43a9e712019-07-10 21:26:55 +02002414 unsigned int base = mux_num_to_base(gsm); /* Base for this MUX */
Russ Gorbyd50f6dc2011-06-14 13:35:32 -07002415 int i;
Russ Gorbyd50f6dc2011-06-14 13:35:32 -07002416
Alan Coxe1eaea42010-03-26 11:32:54 +00002417 WARN_ON(tty != gsm->tty);
Russ Gorbyd50f6dc2011-06-14 13:35:32 -07002418 for (i = 1; i < NUM_DLCI; i++)
2419 tty_unregister_device(gsm_tty_driver, base + i);
Alan Coxe1eaea42010-03-26 11:32:54 +00002420 gsm_cleanup_mux(gsm);
2421 tty_kref_put(gsm->tty);
2422 gsm->tty = NULL;
2423}
2424
Linus Torvalds55db4c62011-06-04 06:33:24 +09002425static void gsmld_receive_buf(struct tty_struct *tty, const unsigned char *cp,
2426 char *fp, int count)
Alan Coxe1eaea42010-03-26 11:32:54 +00002427{
2428 struct gsm_mux *gsm = tty->disc_data;
2429 const unsigned char *dp;
2430 char *f;
2431 int i;
Peter Hurley82f91fe2013-12-02 13:56:03 -05002432 char flags = TTY_NORMAL;
Alan Coxe1eaea42010-03-26 11:32:54 +00002433
Joe Perches0a77c4f2011-04-25 16:46:49 -07002434 if (debug & 4)
2435 print_hex_dump_bytes("gsmld_receive: ", DUMP_PREFIX_OFFSET,
2436 cp, count);
Alan Coxe1eaea42010-03-26 11:32:54 +00002437
2438 for (i = count, dp = cp, f = fp; i; i--, dp++) {
Peter Hurley82f91fe2013-12-02 13:56:03 -05002439 if (f)
2440 flags = *f++;
Alan Coxe1eaea42010-03-26 11:32:54 +00002441 switch (flags) {
2442 case TTY_NORMAL:
2443 gsm->receive(gsm, *dp);
2444 break;
2445 case TTY_OVERRUN:
2446 case TTY_BREAK:
2447 case TTY_PARITY:
2448 case TTY_FRAME:
2449 gsm->error(gsm, *dp, flags);
2450 break;
2451 default:
Frederic Beratc01af4f2012-08-13 13:43:58 +01002452 WARN_ONCE(1, "%s: unknown flag %d\n",
Rasmus Villemoes429b4742015-03-31 15:55:59 +02002453 tty_name(tty), flags);
Alan Coxe1eaea42010-03-26 11:32:54 +00002454 break;
2455 }
2456 }
2457 /* FASYNC if needed ? */
2458 /* If clogged call tty_throttle(tty); */
2459}
2460
2461/**
Alan Coxe1eaea42010-03-26 11:32:54 +00002462 * gsmld_flush_buffer - clean input queue
2463 * @tty: terminal device
2464 *
2465 * Flush the input buffer. Called when the line discipline is
2466 * being closed, when the tty layer wants the buffer flushed (eg
2467 * at hangup).
2468 */
2469
2470static void gsmld_flush_buffer(struct tty_struct *tty)
2471{
2472}
2473
2474/**
2475 * gsmld_close - close the ldisc for this tty
2476 * @tty: device
2477 *
2478 * Called from the terminal layer when this line discipline is
2479 * being shut down, either because of a close or becsuse of a
2480 * discipline change. The function will not be called while other
2481 * ldisc methods are in progress.
2482 */
2483
2484static void gsmld_close(struct tty_struct *tty)
2485{
2486 struct gsm_mux *gsm = tty->disc_data;
2487
2488 gsmld_detach_gsm(tty, gsm);
2489
2490 gsmld_flush_buffer(tty);
2491 /* Do other clean up here */
Russ Gorby6ab8fba2011-06-16 14:20:13 -07002492 mux_put(gsm);
Alan Coxe1eaea42010-03-26 11:32:54 +00002493}
2494
2495/**
2496 * gsmld_open - open an ldisc
2497 * @tty: terminal to open
2498 *
2499 * Called when this line discipline is being attached to the
2500 * terminal device. Can sleep. Called serialized so that no
2501 * other events will occur in parallel. No further open will occur
2502 * until a close.
2503 */
2504
2505static int gsmld_open(struct tty_struct *tty)
2506{
2507 struct gsm_mux *gsm;
xinhui.pan5a640962014-07-28 16:14:52 +08002508 int ret;
Alan Coxe1eaea42010-03-26 11:32:54 +00002509
2510 if (tty->ops->write == NULL)
2511 return -EINVAL;
2512
2513 /* Attach our ldisc data */
2514 gsm = gsm_alloc_mux();
2515 if (gsm == NULL)
2516 return -ENOMEM;
2517
2518 tty->disc_data = gsm;
2519 tty->receive_room = 65536;
2520
2521 /* Attach the initial passive connection */
2522 gsm->encoding = 1;
xinhui.pan5a640962014-07-28 16:14:52 +08002523
2524 ret = gsmld_attach_gsm(tty, gsm);
2525 if (ret != 0) {
2526 gsm_cleanup_mux(gsm);
2527 mux_put(gsm);
2528 }
2529 return ret;
Alan Coxe1eaea42010-03-26 11:32:54 +00002530}
2531
2532/**
2533 * gsmld_write_wakeup - asynchronous I/O notifier
2534 * @tty: tty device
2535 *
2536 * Required for the ptys, serial driver etc. since processes
2537 * that attach themselves to the master and rely on ASYNC
2538 * IO must be woken up
2539 */
2540
2541static void gsmld_write_wakeup(struct tty_struct *tty)
2542{
2543 struct gsm_mux *gsm = tty->disc_data;
Dan Carpenter328be392010-05-25 11:37:17 +02002544 unsigned long flags;
Alan Coxe1eaea42010-03-26 11:32:54 +00002545
2546 /* Queue poll */
2547 clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
Russ Gorby5e447082012-08-13 13:44:40 +01002548 spin_lock_irqsave(&gsm->tx_lock, flags);
Gregory CLEMENT01dbb362020-05-12 13:53:23 +02002549 gsm_data_kick(gsm, NULL);
Dan Carpenter328be392010-05-25 11:37:17 +02002550 if (gsm->tx_bytes < TX_THRESH_LO) {
Alan Coxe1eaea42010-03-26 11:32:54 +00002551 gsm_dlci_data_sweep(gsm);
Dan Carpenter328be392010-05-25 11:37:17 +02002552 }
Russ Gorby5e447082012-08-13 13:44:40 +01002553 spin_unlock_irqrestore(&gsm->tx_lock, flags);
Alan Coxe1eaea42010-03-26 11:32:54 +00002554}
2555
2556/**
2557 * gsmld_read - read function for tty
2558 * @tty: tty device
2559 * @file: file object
2560 * @buf: userspace buffer pointer
2561 * @nr: size of I/O
2562 *
2563 * Perform reads for the line discipline. We are guaranteed that the
2564 * line discipline will not be closed under us but we may get multiple
2565 * parallel readers and must handle this ourselves. We may also get
2566 * a hangup. Always called in user context, may sleep.
2567 *
2568 * This code must be sure never to sleep through a hangup.
2569 */
2570
2571static ssize_t gsmld_read(struct tty_struct *tty, struct file *file,
2572 unsigned char __user *buf, size_t nr)
2573{
2574 return -EOPNOTSUPP;
2575}
2576
2577/**
2578 * gsmld_write - write function for tty
2579 * @tty: tty device
2580 * @file: file object
2581 * @buf: userspace buffer pointer
2582 * @nr: size of I/O
2583 *
2584 * Called when the owner of the device wants to send a frame
2585 * itself (or some other control data). The data is transferred
2586 * as-is and must be properly framed and checksummed as appropriate
2587 * by userspace. Frames are either sent whole or not at all as this
2588 * avoids pain user side.
2589 */
2590
2591static ssize_t gsmld_write(struct tty_struct *tty, struct file *file,
2592 const unsigned char *buf, size_t nr)
2593{
2594 int space = tty_write_room(tty);
2595 if (space >= nr)
2596 return tty->ops->write(tty, buf, nr);
2597 set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
2598 return -ENOBUFS;
2599}
2600
2601/**
2602 * gsmld_poll - poll method for N_GSM0710
2603 * @tty: terminal device
2604 * @file: file accessing it
2605 * @wait: poll table
2606 *
2607 * Called when the line discipline is asked to poll() for data or
2608 * for special events. This code is not serialized with respect to
2609 * other events save open/close.
2610 *
2611 * This code must be sure never to sleep through a hangup.
2612 * Called without the kernel lock held - fine
2613 */
2614
Al Viroafc9a422017-07-03 06:39:46 -04002615static __poll_t gsmld_poll(struct tty_struct *tty, struct file *file,
Alan Coxe1eaea42010-03-26 11:32:54 +00002616 poll_table *wait)
2617{
Al Viroafc9a422017-07-03 06:39:46 -04002618 __poll_t mask = 0;
Alan Coxe1eaea42010-03-26 11:32:54 +00002619 struct gsm_mux *gsm = tty->disc_data;
2620
2621 poll_wait(file, &tty->read_wait, wait);
2622 poll_wait(file, &tty->write_wait, wait);
2623 if (tty_hung_up_p(file))
Linus Torvaldsa9a08842018-02-11 14:34:03 -08002624 mask |= EPOLLHUP;
Alan Coxe1eaea42010-03-26 11:32:54 +00002625 if (!tty_is_writelocked(tty) && tty_write_room(tty) > 0)
Linus Torvaldsa9a08842018-02-11 14:34:03 -08002626 mask |= EPOLLOUT | EPOLLWRNORM;
Alan Coxe1eaea42010-03-26 11:32:54 +00002627 if (gsm->dead)
Linus Torvaldsa9a08842018-02-11 14:34:03 -08002628 mask |= EPOLLHUP;
Alan Coxe1eaea42010-03-26 11:32:54 +00002629 return mask;
2630}
2631
Alan Coxe1eaea42010-03-26 11:32:54 +00002632static int gsmld_ioctl(struct tty_struct *tty, struct file *file,
2633 unsigned int cmd, unsigned long arg)
2634{
2635 struct gsm_config c;
2636 struct gsm_mux *gsm = tty->disc_data;
Martin Hundebølla7b121b2019-08-12 23:12:43 +02002637 unsigned int base;
Alan Coxe1eaea42010-03-26 11:32:54 +00002638
2639 switch (cmd) {
2640 case GSMIOC_GETCONF:
Tony Lindgren33841042019-01-13 17:25:26 -08002641 gsm_copy_config_values(gsm, &c);
Jiri Slabyedd05a72020-02-19 09:49:44 +01002642 if (copy_to_user((void __user *)arg, &c, sizeof(c)))
Alan Coxe1eaea42010-03-26 11:32:54 +00002643 return -EFAULT;
2644 return 0;
2645 case GSMIOC_SETCONF:
Jiri Slabyedd05a72020-02-19 09:49:44 +01002646 if (copy_from_user(&c, (void __user *)arg, sizeof(c)))
Alan Coxe1eaea42010-03-26 11:32:54 +00002647 return -EFAULT;
Tony Lindgren33841042019-01-13 17:25:26 -08002648 return gsm_config(gsm, &c);
Martin Hundebølla7b121b2019-08-12 23:12:43 +02002649 case GSMIOC_GETFIRST:
2650 base = mux_num_to_base(gsm);
2651 return put_user(base + 1, (__u32 __user *)arg);
Alan Coxe1eaea42010-03-26 11:32:54 +00002652 default:
2653 return n_tty_ioctl_helper(tty, file, cmd, arg);
2654 }
2655}
2656
Russ Gorbybcd5abe2011-06-16 14:20:12 -07002657/*
2658 * Network interface
2659 *
2660 */
2661
2662static int gsm_mux_net_open(struct net_device *net)
2663{
2664 pr_debug("%s called\n", __func__);
2665 netif_start_queue(net);
2666 return 0;
2667}
2668
2669static int gsm_mux_net_close(struct net_device *net)
2670{
2671 netif_stop_queue(net);
2672 return 0;
2673}
2674
Russ Gorbybcd5abe2011-06-16 14:20:12 -07002675static void dlci_net_free(struct gsm_dlci *dlci)
2676{
2677 if (!dlci->net) {
2678 WARN_ON(1);
2679 return;
2680 }
2681 dlci->adaption = dlci->prev_adaption;
2682 dlci->data = dlci->prev_data;
2683 free_netdev(dlci->net);
2684 dlci->net = NULL;
2685}
2686static void net_free(struct kref *ref)
2687{
2688 struct gsm_mux_net *mux_net;
2689 struct gsm_dlci *dlci;
2690
2691 mux_net = container_of(ref, struct gsm_mux_net, ref);
2692 dlci = mux_net->dlci;
2693
2694 if (dlci->net) {
2695 unregister_netdev(dlci->net);
2696 dlci_net_free(dlci);
2697 }
2698}
2699
Russ Gorby6ab8fba2011-06-16 14:20:13 -07002700static inline void muxnet_get(struct gsm_mux_net *mux_net)
2701{
2702 kref_get(&mux_net->ref);
2703}
2704
2705static inline void muxnet_put(struct gsm_mux_net *mux_net)
2706{
2707 kref_put(&mux_net->ref, net_free);
2708}
2709
Luc Van Oostenryck2468b3e2018-04-24 15:18:39 +02002710static netdev_tx_t gsm_mux_net_start_xmit(struct sk_buff *skb,
Russ Gorbybcd5abe2011-06-16 14:20:12 -07002711 struct net_device *net)
2712{
Julia Lawall5dbc32a2015-03-29 14:54:13 +02002713 struct gsm_mux_net *mux_net = netdev_priv(net);
Russ Gorbybcd5abe2011-06-16 14:20:12 -07002714 struct gsm_dlci *dlci = mux_net->dlci;
Russ Gorby6ab8fba2011-06-16 14:20:13 -07002715 muxnet_get(mux_net);
Russ Gorbybcd5abe2011-06-16 14:20:12 -07002716
2717 skb_queue_head(&dlci->skb_list, skb);
Tobias Klauser47baf1a2017-03-13 12:00:50 +01002718 net->stats.tx_packets++;
2719 net->stats.tx_bytes += skb->len;
Russ Gorbybcd5abe2011-06-16 14:20:12 -07002720 gsm_dlci_data_kick(dlci);
2721 /* And tell the kernel when the last transmit started. */
Florian Westphal860e9532016-05-03 16:33:13 +02002722 netif_trans_update(net);
Russ Gorby6ab8fba2011-06-16 14:20:13 -07002723 muxnet_put(mux_net);
Russ Gorbybcd5abe2011-06-16 14:20:12 -07002724 return NETDEV_TX_OK;
2725}
2726
2727/* called when a packet did not ack after watchdogtimeout */
Michael S. Tsirkin0290bd22019-12-10 09:23:51 -05002728static void gsm_mux_net_tx_timeout(struct net_device *net, unsigned int txqueue)
Russ Gorbybcd5abe2011-06-16 14:20:12 -07002729{
2730 /* Tell syslog we are hosed. */
2731 dev_dbg(&net->dev, "Tx timed out.\n");
2732
2733 /* Update statistics */
Tobias Klauser47baf1a2017-03-13 12:00:50 +01002734 net->stats.tx_errors++;
Russ Gorbybcd5abe2011-06-16 14:20:12 -07002735}
2736
2737static void gsm_mux_rx_netchar(struct gsm_dlci *dlci,
Tony Lindgren4feb7a42019-01-13 17:25:27 -08002738 const unsigned char *in_buf, int size)
Russ Gorbybcd5abe2011-06-16 14:20:12 -07002739{
2740 struct net_device *net = dlci->net;
2741 struct sk_buff *skb;
Julia Lawall5dbc32a2015-03-29 14:54:13 +02002742 struct gsm_mux_net *mux_net = netdev_priv(net);
Russ Gorby6ab8fba2011-06-16 14:20:13 -07002743 muxnet_get(mux_net);
Russ Gorbybcd5abe2011-06-16 14:20:12 -07002744
2745 /* Allocate an sk_buff */
2746 skb = dev_alloc_skb(size + NET_IP_ALIGN);
2747 if (!skb) {
2748 /* We got no receive buffer. */
Tobias Klauser47baf1a2017-03-13 12:00:50 +01002749 net->stats.rx_dropped++;
Russ Gorby6ab8fba2011-06-16 14:20:13 -07002750 muxnet_put(mux_net);
Russ Gorbybcd5abe2011-06-16 14:20:12 -07002751 return;
2752 }
2753 skb_reserve(skb, NET_IP_ALIGN);
Johannes Berg59ae1d12017-06-16 14:29:20 +02002754 skb_put_data(skb, in_buf, size);
Russ Gorbybcd5abe2011-06-16 14:20:12 -07002755
2756 skb->dev = net;
Vaishali Thakkar75406b32015-06-06 06:05:24 +05302757 skb->protocol = htons(ETH_P_IP);
Russ Gorbybcd5abe2011-06-16 14:20:12 -07002758
2759 /* Ship it off to the kernel */
2760 netif_rx(skb);
2761
2762 /* update out statistics */
Tobias Klauser47baf1a2017-03-13 12:00:50 +01002763 net->stats.rx_packets++;
2764 net->stats.rx_bytes += size;
Russ Gorby6ab8fba2011-06-16 14:20:13 -07002765 muxnet_put(mux_net);
Russ Gorbybcd5abe2011-06-16 14:20:12 -07002766 return;
2767}
2768
Russ Gorbybcd5abe2011-06-16 14:20:12 -07002769static void gsm_mux_net_init(struct net_device *net)
2770{
2771 static const struct net_device_ops gsm_netdev_ops = {
2772 .ndo_open = gsm_mux_net_open,
2773 .ndo_stop = gsm_mux_net_close,
2774 .ndo_start_xmit = gsm_mux_net_start_xmit,
2775 .ndo_tx_timeout = gsm_mux_net_tx_timeout,
Russ Gorbybcd5abe2011-06-16 14:20:12 -07002776 };
2777
2778 net->netdev_ops = &gsm_netdev_ops;
2779
2780 /* fill in the other fields */
2781 net->watchdog_timeo = GSM_NET_TX_TIMEOUT;
2782 net->flags = IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST;
2783 net->type = ARPHRD_NONE;
2784 net->tx_queue_len = 10;
2785}
2786
2787
2788/* caller holds the dlci mutex */
2789static void gsm_destroy_network(struct gsm_dlci *dlci)
2790{
2791 struct gsm_mux_net *mux_net;
2792
Jiri Slabyd8ca4ec2020-02-19 09:49:45 +01002793 pr_debug("destroy network interface\n");
Russ Gorbybcd5abe2011-06-16 14:20:12 -07002794 if (!dlci->net)
2795 return;
Julia Lawall5dbc32a2015-03-29 14:54:13 +02002796 mux_net = netdev_priv(dlci->net);
Russ Gorby6ab8fba2011-06-16 14:20:13 -07002797 muxnet_put(mux_net);
Russ Gorbybcd5abe2011-06-16 14:20:12 -07002798}
2799
2800
2801/* caller holds the dlci mutex */
2802static int gsm_create_network(struct gsm_dlci *dlci, struct gsm_netconfig *nc)
2803{
2804 char *netname;
2805 int retval = 0;
2806 struct net_device *net;
2807 struct gsm_mux_net *mux_net;
2808
2809 if (!capable(CAP_NET_ADMIN))
2810 return -EPERM;
2811
2812 /* Already in a non tty mode */
2813 if (dlci->adaption > 2)
2814 return -EBUSY;
2815
2816 if (nc->protocol != htons(ETH_P_IP))
2817 return -EPROTONOSUPPORT;
2818
2819 if (nc->adaption != 3 && nc->adaption != 4)
2820 return -EPROTONOSUPPORT;
2821
Jiri Slabyd8ca4ec2020-02-19 09:49:45 +01002822 pr_debug("create network interface\n");
Russ Gorbybcd5abe2011-06-16 14:20:12 -07002823
2824 netname = "gsm%d";
2825 if (nc->if_name[0] != '\0')
2826 netname = nc->if_name;
Tom Gundersenc835a672014-07-14 16:37:24 +02002827 net = alloc_netdev(sizeof(struct gsm_mux_net), netname,
2828 NET_NAME_UNKNOWN, gsm_mux_net_init);
Russ Gorbybcd5abe2011-06-16 14:20:12 -07002829 if (!net) {
Jiri Slabyd8ca4ec2020-02-19 09:49:45 +01002830 pr_err("alloc_netdev failed\n");
Russ Gorbybcd5abe2011-06-16 14:20:12 -07002831 return -ENOMEM;
2832 }
2833 net->mtu = dlci->gsm->mtu;
Jarod Wilson9c22b4a2016-10-20 13:55:18 -04002834 net->min_mtu = 8;
2835 net->max_mtu = dlci->gsm->mtu;
Julia Lawall5dbc32a2015-03-29 14:54:13 +02002836 mux_net = netdev_priv(net);
Russ Gorbybcd5abe2011-06-16 14:20:12 -07002837 mux_net->dlci = dlci;
2838 kref_init(&mux_net->ref);
2839 strncpy(nc->if_name, net->name, IFNAMSIZ); /* return net name */
2840
2841 /* reconfigure dlci for network */
2842 dlci->prev_adaption = dlci->adaption;
2843 dlci->prev_data = dlci->data;
2844 dlci->adaption = nc->adaption;
2845 dlci->data = gsm_mux_rx_netchar;
2846 dlci->net = net;
2847
Jiri Slabyd8ca4ec2020-02-19 09:49:45 +01002848 pr_debug("register netdev\n");
Russ Gorbybcd5abe2011-06-16 14:20:12 -07002849 retval = register_netdev(net);
2850 if (retval) {
2851 pr_err("network register fail %d\n", retval);
2852 dlci_net_free(dlci);
2853 return retval;
2854 }
2855 return net->ifindex; /* return network index */
2856}
Alan Coxe1eaea42010-03-26 11:32:54 +00002857
2858/* Line discipline for real tty */
Lad, Prabhakard3157b22015-02-04 18:23:59 +00002859static struct tty_ldisc_ops tty_ldisc_packet = {
Alan Coxe1eaea42010-03-26 11:32:54 +00002860 .owner = THIS_MODULE,
2861 .magic = TTY_LDISC_MAGIC,
2862 .name = "n_gsm",
2863 .open = gsmld_open,
2864 .close = gsmld_close,
2865 .flush_buffer = gsmld_flush_buffer,
Alan Coxe1eaea42010-03-26 11:32:54 +00002866 .read = gsmld_read,
2867 .write = gsmld_write,
2868 .ioctl = gsmld_ioctl,
2869 .poll = gsmld_poll,
2870 .receive_buf = gsmld_receive_buf,
2871 .write_wakeup = gsmld_write_wakeup
2872};
2873
2874/*
2875 * Virtual tty side
2876 */
2877
2878#define TX_SIZE 512
2879
2880static int gsmtty_modem_update(struct gsm_dlci *dlci, u8 brk)
2881{
2882 u8 modembits[5];
2883 struct gsm_control *ctrl;
2884 int len = 2;
2885
2886 if (brk)
2887 len++;
2888
2889 modembits[0] = len << 1 | EA; /* Data bytes */
2890 modembits[1] = dlci->addr << 2 | 3; /* DLCI, EA, 1 */
2891 modembits[2] = gsm_encode_modem(dlci) << 1 | EA;
2892 if (brk)
2893 modembits[3] = brk << 4 | 2 | EA; /* Valid, EA */
2894 ctrl = gsm_control_send(dlci->gsm, CMD_MSC, modembits, len + 1);
2895 if (ctrl == NULL)
2896 return -ENOMEM;
2897 return gsm_control_wait(dlci->gsm, ctrl);
2898}
2899
2900static int gsm_carrier_raised(struct tty_port *port)
2901{
2902 struct gsm_dlci *dlci = container_of(port, struct gsm_dlci, port);
Tony Lindgrenb2d89ad92018-04-07 10:19:51 -07002903 struct gsm_mux *gsm = dlci->gsm;
2904
Alan Coxe1eaea42010-03-26 11:32:54 +00002905 /* Not yet open so no carrier info */
2906 if (dlci->state != DLCI_OPEN)
2907 return 0;
2908 if (debug & 2)
2909 return 1;
Tony Lindgrenb2d89ad92018-04-07 10:19:51 -07002910
2911 /*
2912 * Basic mode with control channel in ADM mode may not respond
2913 * to CMD_MSC at all and modem_rx is empty.
2914 */
2915 if (gsm->encoding == 0 && gsm->dlci[0]->mode == DLCI_MODE_ADM &&
2916 !dlci->modem_rx)
2917 return 1;
2918
Alan Coxe1eaea42010-03-26 11:32:54 +00002919 return dlci->modem_rx & TIOCM_CD;
2920}
2921
2922static void gsm_dtr_rts(struct tty_port *port, int onoff)
2923{
2924 struct gsm_dlci *dlci = container_of(port, struct gsm_dlci, port);
2925 unsigned int modem_tx = dlci->modem_tx;
2926 if (onoff)
2927 modem_tx |= TIOCM_DTR | TIOCM_RTS;
2928 else
2929 modem_tx &= ~(TIOCM_DTR | TIOCM_RTS);
2930 if (modem_tx != dlci->modem_tx) {
2931 dlci->modem_tx = modem_tx;
2932 gsmtty_modem_update(dlci, 0);
2933 }
2934}
2935
2936static const struct tty_port_operations gsm_port_ops = {
2937 .carrier_raised = gsm_carrier_raised,
2938 .dtr_rts = gsm_dtr_rts,
Jiri Slaby9a8e62b2012-11-15 09:49:53 +01002939 .destruct = gsm_dlci_free,
Alan Coxe1eaea42010-03-26 11:32:54 +00002940};
2941
Jiri Slaby86176ed2012-08-07 21:47:28 +02002942static int gsmtty_install(struct tty_driver *driver, struct tty_struct *tty)
Alan Coxe1eaea42010-03-26 11:32:54 +00002943{
2944 struct gsm_mux *gsm;
2945 struct gsm_dlci *dlci;
Alan Coxe1eaea42010-03-26 11:32:54 +00002946 unsigned int line = tty->index;
Martin Hundebøll43a9e712019-07-10 21:26:55 +02002947 unsigned int mux = mux_line_to_num(line);
Jiri Slaby86176ed2012-08-07 21:47:28 +02002948 bool alloc = false;
2949 int ret;
Alan Coxe1eaea42010-03-26 11:32:54 +00002950
2951 line = line & 0x3F;
2952
2953 if (mux >= MAX_MUX)
2954 return -ENXIO;
2955 /* FIXME: we need to lock gsm_mux for lifetimes of ttys eventually */
2956 if (gsm_mux[mux] == NULL)
2957 return -EUNATCH;
2958 if (line == 0 || line > 61) /* 62/63 reserved */
2959 return -ECHRNG;
2960 gsm = gsm_mux[mux];
2961 if (gsm->dead)
2962 return -EL2HLT;
Aldo Iljazif3c909b2013-07-08 22:28:00 +03002963 /* If DLCI 0 is not yet fully open return an error.
2964 This is ok from a locking
2965 perspective as we don't have to worry about this
2966 if DLCI0 is lost */
Chao Bidfabf7f2013-11-26 12:09:39 +08002967 mutex_lock(&gsm->mutex);
2968 if (gsm->dlci[0] && gsm->dlci[0]->state != DLCI_OPEN) {
2969 mutex_unlock(&gsm->mutex);
xiaojin7e8ac7b2012-08-13 13:43:15 +01002970 return -EL2NSYNC;
Chao Bidfabf7f2013-11-26 12:09:39 +08002971 }
Alan Coxe1eaea42010-03-26 11:32:54 +00002972 dlci = gsm->dlci[line];
Jiri Slaby86176ed2012-08-07 21:47:28 +02002973 if (dlci == NULL) {
2974 alloc = true;
Alan Coxe1eaea42010-03-26 11:32:54 +00002975 dlci = gsm_dlci_alloc(gsm, line);
Jiri Slaby86176ed2012-08-07 21:47:28 +02002976 }
Chao Bidfabf7f2013-11-26 12:09:39 +08002977 if (dlci == NULL) {
2978 mutex_unlock(&gsm->mutex);
Alan Coxe1eaea42010-03-26 11:32:54 +00002979 return -ENOMEM;
Chao Bidfabf7f2013-11-26 12:09:39 +08002980 }
Jiri Slaby86176ed2012-08-07 21:47:28 +02002981 ret = tty_port_install(&dlci->port, driver, tty);
2982 if (ret) {
2983 if (alloc)
2984 dlci_put(dlci);
Chao Bidfabf7f2013-11-26 12:09:39 +08002985 mutex_unlock(&gsm->mutex);
Jiri Slaby86176ed2012-08-07 21:47:28 +02002986 return ret;
2987 }
2988
Chao Bidfabf7f2013-11-26 12:09:39 +08002989 dlci_get(dlci);
2990 dlci_get(gsm->dlci[0]);
2991 mux_get(gsm);
Alan Coxe1eaea42010-03-26 11:32:54 +00002992 tty->driver_data = dlci;
Chao Bidfabf7f2013-11-26 12:09:39 +08002993 mutex_unlock(&gsm->mutex);
Jiri Slaby86176ed2012-08-07 21:47:28 +02002994
2995 return 0;
2996}
2997
2998static int gsmtty_open(struct tty_struct *tty, struct file *filp)
2999{
3000 struct gsm_dlci *dlci = tty->driver_data;
3001 struct tty_port *port = &dlci->port;
3002
3003 port->count++;
Alan Coxe1eaea42010-03-26 11:32:54 +00003004 tty_port_tty_set(port, tty);
3005
3006 dlci->modem_rx = 0;
3007 /* We could in theory open and close before we wait - eg if we get
3008 a DM straight back. This is ok as that will have caused a hangup */
Peter Hurleyd41861c2016-04-09 17:53:25 -07003009 tty_port_set_initialized(port, 1);
Alan Coxe1eaea42010-03-26 11:32:54 +00003010 /* Start sending off SABM messages */
3011 gsm_dlci_begin_open(dlci);
3012 /* And wait for virtual carrier */
3013 return tty_port_block_til_ready(port, tty, filp);
3014}
3015
3016static void gsmtty_close(struct tty_struct *tty, struct file *filp)
3017{
3018 struct gsm_dlci *dlci = tty->driver_data;
Russ Gorby6ab8fba2011-06-16 14:20:13 -07003019
Alan Coxe1eaea42010-03-26 11:32:54 +00003020 if (dlci == NULL)
3021 return;
Dirkjan Bussink4d9b1092013-01-30 11:44:50 +01003022 if (dlci->state == DLCI_CLOSED)
3023 return;
Russ Gorbybcd5abe2011-06-16 14:20:12 -07003024 mutex_lock(&dlci->mutex);
3025 gsm_destroy_network(dlci);
3026 mutex_unlock(&dlci->mutex);
Alan Coxe1eaea42010-03-26 11:32:54 +00003027 if (tty_port_close_start(&dlci->port, tty, filp) == 0)
Chao Bidfabf7f2013-11-26 12:09:39 +08003028 return;
Alan Coxe1eaea42010-03-26 11:32:54 +00003029 gsm_dlci_begin_close(dlci);
Peter Hurleyd41861c2016-04-09 17:53:25 -07003030 if (tty_port_initialized(&dlci->port) && C_HUPCL(tty))
3031 tty_port_lower_dtr_rts(&dlci->port);
Alan Coxe1eaea42010-03-26 11:32:54 +00003032 tty_port_close_end(&dlci->port, tty);
3033 tty_port_tty_set(&dlci->port, NULL);
Chao Bidfabf7f2013-11-26 12:09:39 +08003034 return;
Alan Coxe1eaea42010-03-26 11:32:54 +00003035}
3036
3037static void gsmtty_hangup(struct tty_struct *tty)
3038{
3039 struct gsm_dlci *dlci = tty->driver_data;
Dirkjan Bussink4d9b1092013-01-30 11:44:50 +01003040 if (dlci->state == DLCI_CLOSED)
3041 return;
Alan Coxe1eaea42010-03-26 11:32:54 +00003042 tty_port_hangup(&dlci->port);
3043 gsm_dlci_begin_close(dlci);
3044}
3045
3046static int gsmtty_write(struct tty_struct *tty, const unsigned char *buf,
3047 int len)
3048{
Dirkjan Bussink4d9b1092013-01-30 11:44:50 +01003049 int sent;
Alan Coxe1eaea42010-03-26 11:32:54 +00003050 struct gsm_dlci *dlci = tty->driver_data;
Dirkjan Bussink4d9b1092013-01-30 11:44:50 +01003051 if (dlci->state == DLCI_CLOSED)
3052 return -EINVAL;
Alan Coxe1eaea42010-03-26 11:32:54 +00003053 /* Stuff the bytes into the fifo queue */
Jiri Slaby036bca1fc2020-02-19 09:49:40 +01003054 sent = kfifo_in_locked(&dlci->fifo, buf, len, &dlci->lock);
Alan Coxe1eaea42010-03-26 11:32:54 +00003055 /* Need to kick the channel */
3056 gsm_dlci_data_kick(dlci);
3057 return sent;
3058}
3059
3060static int gsmtty_write_room(struct tty_struct *tty)
3061{
3062 struct gsm_dlci *dlci = tty->driver_data;
Dirkjan Bussink4d9b1092013-01-30 11:44:50 +01003063 if (dlci->state == DLCI_CLOSED)
3064 return -EINVAL;
Jiri Slaby036bca1fc2020-02-19 09:49:40 +01003065 return TX_SIZE - kfifo_len(&dlci->fifo);
Alan Coxe1eaea42010-03-26 11:32:54 +00003066}
3067
3068static int gsmtty_chars_in_buffer(struct tty_struct *tty)
3069{
3070 struct gsm_dlci *dlci = tty->driver_data;
Dirkjan Bussink4d9b1092013-01-30 11:44:50 +01003071 if (dlci->state == DLCI_CLOSED)
3072 return -EINVAL;
Jiri Slaby036bca1fc2020-02-19 09:49:40 +01003073 return kfifo_len(&dlci->fifo);
Alan Coxe1eaea42010-03-26 11:32:54 +00003074}
3075
3076static void gsmtty_flush_buffer(struct tty_struct *tty)
3077{
3078 struct gsm_dlci *dlci = tty->driver_data;
Dirkjan Bussink4d9b1092013-01-30 11:44:50 +01003079 if (dlci->state == DLCI_CLOSED)
3080 return;
Alan Coxe1eaea42010-03-26 11:32:54 +00003081 /* Caution needed: If we implement reliable transport classes
3082 then the data being transmitted can't simply be junked once
3083 it has first hit the stack. Until then we can just blow it
3084 away */
Jiri Slaby036bca1fc2020-02-19 09:49:40 +01003085 kfifo_reset(&dlci->fifo);
Alan Coxe1eaea42010-03-26 11:32:54 +00003086 /* Need to unhook this DLCI from the transmit queue logic */
3087}
3088
3089static void gsmtty_wait_until_sent(struct tty_struct *tty, int timeout)
3090{
3091 /* The FIFO handles the queue so the kernel will do the right
3092 thing waiting on chars_in_buffer before calling us. No work
3093 to do here */
3094}
3095
Alan Cox60b33c12011-02-14 16:26:14 +00003096static int gsmtty_tiocmget(struct tty_struct *tty)
Alan Coxe1eaea42010-03-26 11:32:54 +00003097{
3098 struct gsm_dlci *dlci = tty->driver_data;
Dirkjan Bussink4d9b1092013-01-30 11:44:50 +01003099 if (dlci->state == DLCI_CLOSED)
3100 return -EINVAL;
Alan Coxe1eaea42010-03-26 11:32:54 +00003101 return dlci->modem_rx;
3102}
3103
Alan Cox20b9d172011-02-14 16:26:50 +00003104static int gsmtty_tiocmset(struct tty_struct *tty,
Alan Coxe1eaea42010-03-26 11:32:54 +00003105 unsigned int set, unsigned int clear)
3106{
3107 struct gsm_dlci *dlci = tty->driver_data;
3108 unsigned int modem_tx = dlci->modem_tx;
3109
Dirkjan Bussink4d9b1092013-01-30 11:44:50 +01003110 if (dlci->state == DLCI_CLOSED)
3111 return -EINVAL;
Nikola Diklic-Perincf168072011-09-23 10:59:43 +02003112 modem_tx &= ~clear;
Alan Coxe1eaea42010-03-26 11:32:54 +00003113 modem_tx |= set;
3114
3115 if (modem_tx != dlci->modem_tx) {
3116 dlci->modem_tx = modem_tx;
3117 return gsmtty_modem_update(dlci, 0);
3118 }
3119 return 0;
3120}
3121
3122
Alan Cox6caa76b2011-02-14 16:27:22 +00003123static int gsmtty_ioctl(struct tty_struct *tty,
Alan Coxe1eaea42010-03-26 11:32:54 +00003124 unsigned int cmd, unsigned long arg)
3125{
Russ Gorbybcd5abe2011-06-16 14:20:12 -07003126 struct gsm_dlci *dlci = tty->driver_data;
3127 struct gsm_netconfig nc;
3128 int index;
3129
Dirkjan Bussink4d9b1092013-01-30 11:44:50 +01003130 if (dlci->state == DLCI_CLOSED)
3131 return -EINVAL;
Russ Gorbybcd5abe2011-06-16 14:20:12 -07003132 switch (cmd) {
3133 case GSMIOC_ENABLE_NET:
3134 if (copy_from_user(&nc, (void __user *)arg, sizeof(nc)))
3135 return -EFAULT;
3136 nc.if_name[IFNAMSIZ-1] = '\0';
3137 /* return net interface index or error code */
3138 mutex_lock(&dlci->mutex);
3139 index = gsm_create_network(dlci, &nc);
3140 mutex_unlock(&dlci->mutex);
3141 if (copy_to_user((void __user *)arg, &nc, sizeof(nc)))
3142 return -EFAULT;
3143 return index;
3144 case GSMIOC_DISABLE_NET:
3145 if (!capable(CAP_NET_ADMIN))
3146 return -EPERM;
3147 mutex_lock(&dlci->mutex);
3148 gsm_destroy_network(dlci);
3149 mutex_unlock(&dlci->mutex);
3150 return 0;
3151 default:
3152 return -ENOIOCTLCMD;
3153 }
Alan Coxe1eaea42010-03-26 11:32:54 +00003154}
3155
3156static void gsmtty_set_termios(struct tty_struct *tty, struct ktermios *old)
3157{
Dirkjan Bussink4d9b1092013-01-30 11:44:50 +01003158 struct gsm_dlci *dlci = tty->driver_data;
3159 if (dlci->state == DLCI_CLOSED)
3160 return;
Alan Coxe1eaea42010-03-26 11:32:54 +00003161 /* For the moment its fixed. In actual fact the speed information
3162 for the virtual channel can be propogated in both directions by
3163 the RPN control message. This however rapidly gets nasty as we
3164 then have to remap modem signals each way according to whether
3165 our virtual cable is null modem etc .. */
Alan Coxadc8d742012-07-14 15:31:47 +01003166 tty_termios_copy_hw(&tty->termios, old);
Alan Coxe1eaea42010-03-26 11:32:54 +00003167}
3168
3169static void gsmtty_throttle(struct tty_struct *tty)
3170{
3171 struct gsm_dlci *dlci = tty->driver_data;
Dirkjan Bussink4d9b1092013-01-30 11:44:50 +01003172 if (dlci->state == DLCI_CLOSED)
3173 return;
Peter Hurley9db276f2016-01-10 20:36:15 -08003174 if (C_CRTSCTS(tty))
Alan Coxe1eaea42010-03-26 11:32:54 +00003175 dlci->modem_tx &= ~TIOCM_DTR;
Jiri Slabye9360b92020-02-19 09:49:47 +01003176 dlci->throttled = true;
Alan Coxe1eaea42010-03-26 11:32:54 +00003177 /* Send an MSC with DTR cleared */
3178 gsmtty_modem_update(dlci, 0);
3179}
3180
3181static void gsmtty_unthrottle(struct tty_struct *tty)
3182{
3183 struct gsm_dlci *dlci = tty->driver_data;
Dirkjan Bussink4d9b1092013-01-30 11:44:50 +01003184 if (dlci->state == DLCI_CLOSED)
3185 return;
Peter Hurley9db276f2016-01-10 20:36:15 -08003186 if (C_CRTSCTS(tty))
Alan Coxe1eaea42010-03-26 11:32:54 +00003187 dlci->modem_tx |= TIOCM_DTR;
Jiri Slabye9360b92020-02-19 09:49:47 +01003188 dlci->throttled = false;
Alan Coxe1eaea42010-03-26 11:32:54 +00003189 /* Send an MSC with DTR set */
3190 gsmtty_modem_update(dlci, 0);
3191}
3192
3193static int gsmtty_break_ctl(struct tty_struct *tty, int state)
3194{
3195 struct gsm_dlci *dlci = tty->driver_data;
3196 int encode = 0; /* Off */
Dirkjan Bussink4d9b1092013-01-30 11:44:50 +01003197 if (dlci->state == DLCI_CLOSED)
3198 return -EINVAL;
Alan Coxe1eaea42010-03-26 11:32:54 +00003199
3200 if (state == -1) /* "On indefinitely" - we can't encode this
3201 properly */
3202 encode = 0x0F;
3203 else if (state > 0) {
3204 encode = state / 200; /* mS to encoding */
3205 if (encode > 0x0F)
3206 encode = 0x0F; /* Best effort */
3207 }
3208 return gsmtty_modem_update(dlci, encode);
3209}
3210
Pan Xinhui8f9cfee2015-03-28 10:42:56 +08003211static void gsmtty_cleanup(struct tty_struct *tty)
Chao Bidfabf7f2013-11-26 12:09:39 +08003212{
3213 struct gsm_dlci *dlci = tty->driver_data;
3214 struct gsm_mux *gsm = dlci->gsm;
3215
3216 dlci_put(dlci);
3217 dlci_put(gsm->dlci[0]);
3218 mux_put(gsm);
Chao Bidfabf7f2013-11-26 12:09:39 +08003219}
Alan Coxe1eaea42010-03-26 11:32:54 +00003220
3221/* Virtual ttys for the demux */
3222static const struct tty_operations gsmtty_ops = {
Jiri Slaby86176ed2012-08-07 21:47:28 +02003223 .install = gsmtty_install,
Alan Coxe1eaea42010-03-26 11:32:54 +00003224 .open = gsmtty_open,
3225 .close = gsmtty_close,
3226 .write = gsmtty_write,
3227 .write_room = gsmtty_write_room,
3228 .chars_in_buffer = gsmtty_chars_in_buffer,
3229 .flush_buffer = gsmtty_flush_buffer,
3230 .ioctl = gsmtty_ioctl,
3231 .throttle = gsmtty_throttle,
3232 .unthrottle = gsmtty_unthrottle,
3233 .set_termios = gsmtty_set_termios,
3234 .hangup = gsmtty_hangup,
3235 .wait_until_sent = gsmtty_wait_until_sent,
3236 .tiocmget = gsmtty_tiocmget,
3237 .tiocmset = gsmtty_tiocmset,
3238 .break_ctl = gsmtty_break_ctl,
Pan Xinhui8f9cfee2015-03-28 10:42:56 +08003239 .cleanup = gsmtty_cleanup,
Alan Coxe1eaea42010-03-26 11:32:54 +00003240};
3241
3242
3243
3244static int __init gsm_init(void)
3245{
3246 /* Fill in our line protocol discipline, and register it */
3247 int status = tty_register_ldisc(N_GSM0710, &tty_ldisc_packet);
3248 if (status != 0) {
Alan Cox5f9a31d2010-11-04 15:17:27 +00003249 pr_err("n_gsm: can't register line discipline (err = %d)\n",
3250 status);
Alan Coxe1eaea42010-03-26 11:32:54 +00003251 return status;
3252 }
3253
3254 gsm_tty_driver = alloc_tty_driver(256);
3255 if (!gsm_tty_driver) {
3256 tty_unregister_ldisc(N_GSM0710);
Alan Cox5f9a31d2010-11-04 15:17:27 +00003257 pr_err("gsm_init: tty allocation failed.\n");
Alan Coxe1eaea42010-03-26 11:32:54 +00003258 return -EINVAL;
3259 }
Alan Coxe1eaea42010-03-26 11:32:54 +00003260 gsm_tty_driver->driver_name = "gsmtty";
3261 gsm_tty_driver->name = "gsmtty";
3262 gsm_tty_driver->major = 0; /* Dynamic */
3263 gsm_tty_driver->minor_start = 0;
3264 gsm_tty_driver->type = TTY_DRIVER_TYPE_SERIAL;
3265 gsm_tty_driver->subtype = SERIAL_TYPE_NORMAL;
3266 gsm_tty_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV
Alan Cox5f9a31d2010-11-04 15:17:27 +00003267 | TTY_DRIVER_HARDWARE_BREAK;
Alan Coxe1eaea42010-03-26 11:32:54 +00003268 gsm_tty_driver->init_termios = tty_std_termios;
3269 /* Fixme */
3270 gsm_tty_driver->init_termios.c_lflag &= ~ECHO;
3271 tty_set_operations(gsm_tty_driver, &gsmtty_ops);
3272
3273 spin_lock_init(&gsm_mux_lock);
3274
3275 if (tty_register_driver(gsm_tty_driver)) {
3276 put_tty_driver(gsm_tty_driver);
3277 tty_unregister_ldisc(N_GSM0710);
Alan Cox5f9a31d2010-11-04 15:17:27 +00003278 pr_err("gsm_init: tty registration failed.\n");
Alan Coxe1eaea42010-03-26 11:32:54 +00003279 return -EBUSY;
3280 }
Alan Cox5f9a31d2010-11-04 15:17:27 +00003281 pr_debug("gsm_init: loaded as %d,%d.\n",
3282 gsm_tty_driver->major, gsm_tty_driver->minor_start);
Alan Coxe1eaea42010-03-26 11:32:54 +00003283 return 0;
3284}
3285
3286static void __exit gsm_exit(void)
3287{
3288 int status = tty_unregister_ldisc(N_GSM0710);
3289 if (status != 0)
Alan Cox5f9a31d2010-11-04 15:17:27 +00003290 pr_err("n_gsm: can't unregister line discipline (err = %d)\n",
3291 status);
Alan Coxe1eaea42010-03-26 11:32:54 +00003292 tty_unregister_driver(gsm_tty_driver);
3293 put_tty_driver(gsm_tty_driver);
Alan Coxe1eaea42010-03-26 11:32:54 +00003294}
3295
3296module_init(gsm_init);
3297module_exit(gsm_exit);
3298
3299
3300MODULE_LICENSE("GPL");
3301MODULE_ALIAS_LDISC(N_GSM0710);