1 // SPDX-License-Identifier: GPL-2.0-only
2 /* Copyright (c) 2021, Linaro Ltd <loic.poulain@linaro.org> */
3
4 #include <linux/err.h>
5 #include <linux/errno.h>
6 #include <linux/debugfs.h>
7 #include <linux/fs.h>
8 #include <linux/init.h>
9 #include <linux/idr.h>
10 #include <linux/kernel.h>
11 #include <linux/module.h>
12 #include <linux/poll.h>
13 #include <linux/skbuff.h>
14 #include <linux/slab.h>
15 #include <linux/types.h>
16 #include <linux/uaccess.h>
17 #include <linux/termios.h>
18 #include <linux/wwan.h>
19 #include <net/rtnetlink.h>
20 #include <uapi/linux/wwan.h>
21
22 /* Maximum number of minors in use */
23 #define WWAN_MAX_MINORS (1 << MINORBITS)
24
25 static DEFINE_MUTEX(wwan_register_lock); /* WWAN device create|remove lock */
26 static DEFINE_IDA(minors); /* minors for WWAN port chardevs */
27 static DEFINE_IDA(wwan_dev_ids); /* for unique WWAN device IDs */
28 static struct class *wwan_class;
29 static int wwan_major;
30 static struct dentry *wwan_debugfs_dir;
31
32 #define to_wwan_dev(d) container_of(d, struct wwan_device, dev)
33 #define to_wwan_port(d) container_of(d, struct wwan_port, dev)
34
35 /* WWAN port flags */
36 #define WWAN_PORT_TX_OFF 0
37
38 /**
39 * struct wwan_device - The structure that defines a WWAN device
40 *
41 * @id: WWAN device unique ID.
42 * @dev: Underlying device.
43 * @port_id: Current available port ID to pick.
44 * @ops: wwan device ops
45 * @ops_ctxt: context to pass to ops
46 * @debugfs_dir: WWAN device debugfs dir
47 */
48 struct wwan_device {
49 unsigned int id;
50 struct device dev;
51 atomic_t port_id;
52 const struct wwan_ops *ops;
53 void *ops_ctxt;
54 #ifdef CONFIG_WWAN_DEBUGFS
55 struct dentry *debugfs_dir;
56 #endif
57 };
58
59 /**
60 * struct wwan_port - The structure that defines a WWAN port
61 * @type: Port type
62 * @start_count: Port start counter
63 * @flags: Store port state and capabilities
64 * @ops: Pointer to WWAN port operations
65 * @ops_lock: Protect port ops
66 * @dev: Underlying device
67 * @rxq: Buffer inbound queue
68 * @waitqueue: The waitqueue for port fops (read/write/poll)
69 * @data_lock: Port specific data access serialization
70 * @at_data: AT port specific data
71 */
72 struct wwan_port {
73 enum wwan_port_type type;
74 unsigned int start_count;
75 unsigned long flags;
76 const struct wwan_port_ops *ops;
77 struct mutex ops_lock; /* Serialize ops + protect against removal */
78 struct device dev;
79 struct sk_buff_head rxq;
80 wait_queue_head_t waitqueue;
81 struct mutex data_lock; /* Port specific data access serialization */
82 union {
83 struct {
84 struct ktermios termios;
85 int mdmbits;
86 } at_data;
87 };
88 };
89
index_show(struct device * dev,struct device_attribute * attr,char * buf)90 static ssize_t index_show(struct device *dev, struct device_attribute *attr, char *buf)
91 {
92 struct wwan_device *wwan = to_wwan_dev(dev);
93
94 return sprintf(buf, "%d\n", wwan->id);
95 }
96 static DEVICE_ATTR_RO(index);
97
98 static struct attribute *wwan_dev_attrs[] = {
99 &dev_attr_index.attr,
100 NULL,
101 };
102 ATTRIBUTE_GROUPS(wwan_dev);
103
wwan_dev_destroy(struct device * dev)104 static void wwan_dev_destroy(struct device *dev)
105 {
106 struct wwan_device *wwandev = to_wwan_dev(dev);
107
108 ida_free(&wwan_dev_ids, wwandev->id);
109 kfree(wwandev);
110 }
111
112 static const struct device_type wwan_dev_type = {
113 .name = "wwan_dev",
114 .release = wwan_dev_destroy,
115 .groups = wwan_dev_groups,
116 };
117
wwan_dev_parent_match(struct device * dev,const void * parent)118 static int wwan_dev_parent_match(struct device *dev, const void *parent)
119 {
120 return (dev->type == &wwan_dev_type &&
121 (dev->parent == parent || dev == parent));
122 }
123
wwan_dev_get_by_parent(struct device * parent)124 static struct wwan_device *wwan_dev_get_by_parent(struct device *parent)
125 {
126 struct device *dev;
127
128 dev = class_find_device(wwan_class, NULL, parent, wwan_dev_parent_match);
129 if (!dev)
130 return ERR_PTR(-ENODEV);
131
132 return to_wwan_dev(dev);
133 }
134
wwan_dev_name_match(struct device * dev,const void * name)135 static int wwan_dev_name_match(struct device *dev, const void *name)
136 {
137 return dev->type == &wwan_dev_type &&
138 strcmp(dev_name(dev), name) == 0;
139 }
140
wwan_dev_get_by_name(const char * name)141 static struct wwan_device *wwan_dev_get_by_name(const char *name)
142 {
143 struct device *dev;
144
145 dev = class_find_device(wwan_class, NULL, name, wwan_dev_name_match);
146 if (!dev)
147 return ERR_PTR(-ENODEV);
148
149 return to_wwan_dev(dev);
150 }
151
152 #ifdef CONFIG_WWAN_DEBUGFS
wwan_get_debugfs_dir(struct device * parent)153 struct dentry *wwan_get_debugfs_dir(struct device *parent)
154 {
155 struct wwan_device *wwandev;
156
157 wwandev = wwan_dev_get_by_parent(parent);
158 if (IS_ERR(wwandev))
159 return ERR_CAST(wwandev);
160
161 return wwandev->debugfs_dir;
162 }
163 EXPORT_SYMBOL_GPL(wwan_get_debugfs_dir);
164
wwan_dev_debugfs_match(struct device * dev,const void * dir)165 static int wwan_dev_debugfs_match(struct device *dev, const void *dir)
166 {
167 struct wwan_device *wwandev;
168
169 if (dev->type != &wwan_dev_type)
170 return 0;
171
172 wwandev = to_wwan_dev(dev);
173
174 return wwandev->debugfs_dir == dir;
175 }
176
wwan_dev_get_by_debugfs(struct dentry * dir)177 static struct wwan_device *wwan_dev_get_by_debugfs(struct dentry *dir)
178 {
179 struct device *dev;
180
181 dev = class_find_device(wwan_class, NULL, dir, wwan_dev_debugfs_match);
182 if (!dev)
183 return ERR_PTR(-ENODEV);
184
185 return to_wwan_dev(dev);
186 }
187
wwan_put_debugfs_dir(struct dentry * dir)188 void wwan_put_debugfs_dir(struct dentry *dir)
189 {
190 struct wwan_device *wwandev = wwan_dev_get_by_debugfs(dir);
191
192 if (WARN_ON(IS_ERR(wwandev)))
193 return;
194
195 /* wwan_dev_get_by_debugfs() also got a reference */
196 put_device(&wwandev->dev);
197 put_device(&wwandev->dev);
198 }
199 EXPORT_SYMBOL_GPL(wwan_put_debugfs_dir);
200 #endif
201
202 /* This function allocates and registers a new WWAN device OR if a WWAN device
203 * already exist for the given parent, it gets a reference and return it.
204 * This function is not exported (for now), it is called indirectly via
205 * wwan_create_port().
206 */
wwan_create_dev(struct device * parent)207 static struct wwan_device *wwan_create_dev(struct device *parent)
208 {
209 struct wwan_device *wwandev;
210 int err, id;
211
212 /* The 'find-alloc-register' operation must be protected against
213 * concurrent execution, a WWAN device is possibly shared between
214 * multiple callers or concurrently unregistered from wwan_remove_dev().
215 */
216 mutex_lock(&wwan_register_lock);
217
218 /* If wwandev already exists, return it */
219 wwandev = wwan_dev_get_by_parent(parent);
220 if (!IS_ERR(wwandev))
221 goto done_unlock;
222
223 id = ida_alloc(&wwan_dev_ids, GFP_KERNEL);
224 if (id < 0) {
225 wwandev = ERR_PTR(id);
226 goto done_unlock;
227 }
228
229 wwandev = kzalloc(sizeof(*wwandev), GFP_KERNEL);
230 if (!wwandev) {
231 wwandev = ERR_PTR(-ENOMEM);
232 ida_free(&wwan_dev_ids, id);
233 goto done_unlock;
234 }
235
236 wwandev->dev.parent = parent;
237 wwandev->dev.class = wwan_class;
238 wwandev->dev.type = &wwan_dev_type;
239 wwandev->id = id;
240 dev_set_name(&wwandev->dev, "wwan%d", wwandev->id);
241
242 err = device_register(&wwandev->dev);
243 if (err) {
244 put_device(&wwandev->dev);
245 wwandev = ERR_PTR(err);
246 goto done_unlock;
247 }
248
249 #ifdef CONFIG_WWAN_DEBUGFS
250 wwandev->debugfs_dir =
251 debugfs_create_dir(kobject_name(&wwandev->dev.kobj),
252 wwan_debugfs_dir);
253 #endif
254
255 done_unlock:
256 mutex_unlock(&wwan_register_lock);
257
258 return wwandev;
259 }
260
is_wwan_child(struct device * dev,void * data)261 static int is_wwan_child(struct device *dev, void *data)
262 {
263 return dev->class == wwan_class;
264 }
265
wwan_remove_dev(struct wwan_device * wwandev)266 static void wwan_remove_dev(struct wwan_device *wwandev)
267 {
268 int ret;
269
270 /* Prevent concurrent picking from wwan_create_dev */
271 mutex_lock(&wwan_register_lock);
272
273 /* WWAN device is created and registered (get+add) along with its first
274 * child port, and subsequent port registrations only grab a reference
275 * (get). The WWAN device must then be unregistered (del+put) along with
276 * its last port, and reference simply dropped (put) otherwise. In the
277 * same fashion, we must not unregister it when the ops are still there.
278 */
279 if (wwandev->ops)
280 ret = 1;
281 else
282 ret = device_for_each_child(&wwandev->dev, NULL, is_wwan_child);
283
284 if (!ret) {
285 #ifdef CONFIG_WWAN_DEBUGFS
286 debugfs_remove_recursive(wwandev->debugfs_dir);
287 #endif
288 device_unregister(&wwandev->dev);
289 } else {
290 put_device(&wwandev->dev);
291 }
292
293 mutex_unlock(&wwan_register_lock);
294 }
295
296 /* ------- WWAN port management ------- */
297
298 static const struct {
299 const char * const name; /* Port type name */
300 const char * const devsuf; /* Port devce name suffix */
301 } wwan_port_types[WWAN_PORT_MAX + 1] = {
302 [WWAN_PORT_AT] = {
303 .name = "AT",
304 .devsuf = "at",
305 },
306 [WWAN_PORT_MBIM] = {
307 .name = "MBIM",
308 .devsuf = "mbim",
309 },
310 [WWAN_PORT_QMI] = {
311 .name = "QMI",
312 .devsuf = "qmi",
313 },
314 [WWAN_PORT_QCDM] = {
315 .name = "QCDM",
316 .devsuf = "qcdm",
317 },
318 [WWAN_PORT_FIREHOSE] = {
319 .name = "FIREHOSE",
320 .devsuf = "firehose",
321 },
322 };
323
type_show(struct device * dev,struct device_attribute * attr,char * buf)324 static ssize_t type_show(struct device *dev, struct device_attribute *attr,
325 char *buf)
326 {
327 struct wwan_port *port = to_wwan_port(dev);
328
329 return sprintf(buf, "%s\n", wwan_port_types[port->type].name);
330 }
331 static DEVICE_ATTR_RO(type);
332
333 static struct attribute *wwan_port_attrs[] = {
334 &dev_attr_type.attr,
335 NULL,
336 };
337 ATTRIBUTE_GROUPS(wwan_port);
338
wwan_port_destroy(struct device * dev)339 static void wwan_port_destroy(struct device *dev)
340 {
341 struct wwan_port *port = to_wwan_port(dev);
342
343 ida_free(&minors, MINOR(port->dev.devt));
344 mutex_destroy(&port->data_lock);
345 mutex_destroy(&port->ops_lock);
346 kfree(port);
347 }
348
349 static const struct device_type wwan_port_dev_type = {
350 .name = "wwan_port",
351 .release = wwan_port_destroy,
352 .groups = wwan_port_groups,
353 };
354
wwan_port_minor_match(struct device * dev,const void * minor)355 static int wwan_port_minor_match(struct device *dev, const void *minor)
356 {
357 return (dev->type == &wwan_port_dev_type &&
358 MINOR(dev->devt) == *(unsigned int *)minor);
359 }
360
wwan_port_get_by_minor(unsigned int minor)361 static struct wwan_port *wwan_port_get_by_minor(unsigned int minor)
362 {
363 struct device *dev;
364
365 dev = class_find_device(wwan_class, NULL, &minor, wwan_port_minor_match);
366 if (!dev)
367 return ERR_PTR(-ENODEV);
368
369 return to_wwan_port(dev);
370 }
371
372 /* Allocate and set unique name based on passed format
373 *
374 * Name allocation approach is highly inspired by the __dev_alloc_name()
375 * function.
376 *
377 * To avoid names collision, the caller must prevent the new port device
378 * registration as well as concurrent invocation of this function.
379 */
__wwan_port_dev_assign_name(struct wwan_port * port,const char * fmt)380 static int __wwan_port_dev_assign_name(struct wwan_port *port, const char *fmt)
381 {
382 struct wwan_device *wwandev = to_wwan_dev(port->dev.parent);
383 const unsigned int max_ports = PAGE_SIZE * 8;
384 struct class_dev_iter iter;
385 unsigned long *idmap;
386 struct device *dev;
387 char buf[0x20];
388 int id;
389
390 idmap = (unsigned long *)get_zeroed_page(GFP_KERNEL);
391 if (!idmap)
392 return -ENOMEM;
393
394 /* Collect ids of same name format ports */
395 class_dev_iter_init(&iter, wwan_class, NULL, &wwan_port_dev_type);
396 while ((dev = class_dev_iter_next(&iter))) {
397 if (dev->parent != &wwandev->dev)
398 continue;
399 if (sscanf(dev_name(dev), fmt, &id) != 1)
400 continue;
401 if (id < 0 || id >= max_ports)
402 continue;
403 set_bit(id, idmap);
404 }
405 class_dev_iter_exit(&iter);
406
407 /* Allocate unique id */
408 id = find_first_zero_bit(idmap, max_ports);
409 free_page((unsigned long)idmap);
410
411 snprintf(buf, sizeof(buf), fmt, id); /* Name generation */
412
413 dev = device_find_child_by_name(&wwandev->dev, buf);
414 if (dev) {
415 put_device(dev);
416 return -ENFILE;
417 }
418
419 return dev_set_name(&port->dev, buf);
420 }
421
wwan_create_port(struct device * parent,enum wwan_port_type type,const struct wwan_port_ops * ops,void * drvdata)422 struct wwan_port *wwan_create_port(struct device *parent,
423 enum wwan_port_type type,
424 const struct wwan_port_ops *ops,
425 void *drvdata)
426 {
427 struct wwan_device *wwandev;
428 struct wwan_port *port;
429 char namefmt[0x20];
430 int minor, err;
431
432 if (type > WWAN_PORT_MAX || !ops)
433 return ERR_PTR(-EINVAL);
434
435 /* A port is always a child of a WWAN device, retrieve (allocate or
436 * pick) the WWAN device based on the provided parent device.
437 */
438 wwandev = wwan_create_dev(parent);
439 if (IS_ERR(wwandev))
440 return ERR_CAST(wwandev);
441
442 /* A port is exposed as character device, get a minor */
443 minor = ida_alloc_range(&minors, 0, WWAN_MAX_MINORS - 1, GFP_KERNEL);
444 if (minor < 0) {
445 err = minor;
446 goto error_wwandev_remove;
447 }
448
449 port = kzalloc(sizeof(*port), GFP_KERNEL);
450 if (!port) {
451 err = -ENOMEM;
452 ida_free(&minors, minor);
453 goto error_wwandev_remove;
454 }
455
456 port->type = type;
457 port->ops = ops;
458 mutex_init(&port->ops_lock);
459 skb_queue_head_init(&port->rxq);
460 init_waitqueue_head(&port->waitqueue);
461 mutex_init(&port->data_lock);
462
463 port->dev.parent = &wwandev->dev;
464 port->dev.class = wwan_class;
465 port->dev.type = &wwan_port_dev_type;
466 port->dev.devt = MKDEV(wwan_major, minor);
467 dev_set_drvdata(&port->dev, drvdata);
468
469 /* allocate unique name based on wwan device id, port type and number */
470 snprintf(namefmt, sizeof(namefmt), "wwan%u%s%%d", wwandev->id,
471 wwan_port_types[port->type].devsuf);
472
473 /* Serialize ports registration */
474 mutex_lock(&wwan_register_lock);
475
476 __wwan_port_dev_assign_name(port, namefmt);
477 err = device_register(&port->dev);
478
479 mutex_unlock(&wwan_register_lock);
480
481 if (err)
482 goto error_put_device;
483
484 return port;
485
486 error_put_device:
487 put_device(&port->dev);
488 error_wwandev_remove:
489 wwan_remove_dev(wwandev);
490
491 return ERR_PTR(err);
492 }
493 EXPORT_SYMBOL_GPL(wwan_create_port);
494
wwan_remove_port(struct wwan_port * port)495 void wwan_remove_port(struct wwan_port *port)
496 {
497 struct wwan_device *wwandev = to_wwan_dev(port->dev.parent);
498
499 mutex_lock(&port->ops_lock);
500 if (port->start_count)
501 port->ops->stop(port);
502 port->ops = NULL; /* Prevent any new port operations (e.g. from fops) */
503 mutex_unlock(&port->ops_lock);
504
505 wake_up_interruptible(&port->waitqueue);
506
507 skb_queue_purge(&port->rxq);
508 dev_set_drvdata(&port->dev, NULL);
509 device_unregister(&port->dev);
510
511 /* Release related wwan device */
512 wwan_remove_dev(wwandev);
513 }
514 EXPORT_SYMBOL_GPL(wwan_remove_port);
515
wwan_port_rx(struct wwan_port * port,struct sk_buff * skb)516 void wwan_port_rx(struct wwan_port *port, struct sk_buff *skb)
517 {
518 skb_queue_tail(&port->rxq, skb);
519 wake_up_interruptible(&port->waitqueue);
520 }
521 EXPORT_SYMBOL_GPL(wwan_port_rx);
522
wwan_port_txon(struct wwan_port * port)523 void wwan_port_txon(struct wwan_port *port)
524 {
525 clear_bit(WWAN_PORT_TX_OFF, &port->flags);
526 wake_up_interruptible(&port->waitqueue);
527 }
528 EXPORT_SYMBOL_GPL(wwan_port_txon);
529
wwan_port_txoff(struct wwan_port * port)530 void wwan_port_txoff(struct wwan_port *port)
531 {
532 set_bit(WWAN_PORT_TX_OFF, &port->flags);
533 }
534 EXPORT_SYMBOL_GPL(wwan_port_txoff);
535
wwan_port_get_drvdata(struct wwan_port * port)536 void *wwan_port_get_drvdata(struct wwan_port *port)
537 {
538 return dev_get_drvdata(&port->dev);
539 }
540 EXPORT_SYMBOL_GPL(wwan_port_get_drvdata);
541
wwan_port_op_start(struct wwan_port * port)542 static int wwan_port_op_start(struct wwan_port *port)
543 {
544 int ret = 0;
545
546 mutex_lock(&port->ops_lock);
547 if (!port->ops) { /* Port got unplugged */
548 ret = -ENODEV;
549 goto out_unlock;
550 }
551
552 /* If port is already started, don't start again */
553 if (!port->start_count)
554 ret = port->ops->start(port);
555
556 if (!ret)
557 port->start_count++;
558
559 out_unlock:
560 mutex_unlock(&port->ops_lock);
561
562 return ret;
563 }
564
wwan_port_op_stop(struct wwan_port * port)565 static void wwan_port_op_stop(struct wwan_port *port)
566 {
567 mutex_lock(&port->ops_lock);
568 port->start_count--;
569 if (!port->start_count) {
570 if (port->ops)
571 port->ops->stop(port);
572 skb_queue_purge(&port->rxq);
573 }
574 mutex_unlock(&port->ops_lock);
575 }
576
wwan_port_op_tx(struct wwan_port * port,struct sk_buff * skb,bool nonblock)577 static int wwan_port_op_tx(struct wwan_port *port, struct sk_buff *skb,
578 bool nonblock)
579 {
580 int ret;
581
582 mutex_lock(&port->ops_lock);
583 if (!port->ops) { /* Port got unplugged */
584 ret = -ENODEV;
585 goto out_unlock;
586 }
587
588 if (nonblock || !port->ops->tx_blocking)
589 ret = port->ops->tx(port, skb);
590 else
591 ret = port->ops->tx_blocking(port, skb);
592
593 out_unlock:
594 mutex_unlock(&port->ops_lock);
595
596 return ret;
597 }
598
is_read_blocked(struct wwan_port * port)599 static bool is_read_blocked(struct wwan_port *port)
600 {
601 return skb_queue_empty(&port->rxq) && port->ops;
602 }
603
is_write_blocked(struct wwan_port * port)604 static bool is_write_blocked(struct wwan_port *port)
605 {
606 return test_bit(WWAN_PORT_TX_OFF, &port->flags) && port->ops;
607 }
608
wwan_wait_rx(struct wwan_port * port,bool nonblock)609 static int wwan_wait_rx(struct wwan_port *port, bool nonblock)
610 {
611 if (!is_read_blocked(port))
612 return 0;
613
614 if (nonblock)
615 return -EAGAIN;
616
617 if (wait_event_interruptible(port->waitqueue, !is_read_blocked(port)))
618 return -ERESTARTSYS;
619
620 return 0;
621 }
622
wwan_wait_tx(struct wwan_port * port,bool nonblock)623 static int wwan_wait_tx(struct wwan_port *port, bool nonblock)
624 {
625 if (!is_write_blocked(port))
626 return 0;
627
628 if (nonblock)
629 return -EAGAIN;
630
631 if (wait_event_interruptible(port->waitqueue, !is_write_blocked(port)))
632 return -ERESTARTSYS;
633
634 return 0;
635 }
636
wwan_port_fops_open(struct inode * inode,struct file * file)637 static int wwan_port_fops_open(struct inode *inode, struct file *file)
638 {
639 struct wwan_port *port;
640 int err = 0;
641
642 port = wwan_port_get_by_minor(iminor(inode));
643 if (IS_ERR(port))
644 return PTR_ERR(port);
645
646 file->private_data = port;
647 stream_open(inode, file);
648
649 err = wwan_port_op_start(port);
650 if (err)
651 put_device(&port->dev);
652
653 return err;
654 }
655
wwan_port_fops_release(struct inode * inode,struct file * filp)656 static int wwan_port_fops_release(struct inode *inode, struct file *filp)
657 {
658 struct wwan_port *port = filp->private_data;
659
660 wwan_port_op_stop(port);
661 put_device(&port->dev);
662
663 return 0;
664 }
665
wwan_port_fops_read(struct file * filp,char __user * buf,size_t count,loff_t * ppos)666 static ssize_t wwan_port_fops_read(struct file *filp, char __user *buf,
667 size_t count, loff_t *ppos)
668 {
669 struct wwan_port *port = filp->private_data;
670 struct sk_buff *skb;
671 size_t copied;
672 int ret;
673
674 ret = wwan_wait_rx(port, !!(filp->f_flags & O_NONBLOCK));
675 if (ret)
676 return ret;
677
678 skb = skb_dequeue(&port->rxq);
679 if (!skb)
680 return -EIO;
681
682 copied = min_t(size_t, count, skb->len);
683 if (copy_to_user(buf, skb->data, copied)) {
684 kfree_skb(skb);
685 return -EFAULT;
686 }
687 skb_pull(skb, copied);
688
689 /* skb is not fully consumed, keep it in the queue */
690 if (skb->len)
691 skb_queue_head(&port->rxq, skb);
692 else
693 consume_skb(skb);
694
695 return copied;
696 }
697
wwan_port_fops_write(struct file * filp,const char __user * buf,size_t count,loff_t * offp)698 static ssize_t wwan_port_fops_write(struct file *filp, const char __user *buf,
699 size_t count, loff_t *offp)
700 {
701 struct wwan_port *port = filp->private_data;
702 struct sk_buff *skb;
703 int ret;
704
705 ret = wwan_wait_tx(port, !!(filp->f_flags & O_NONBLOCK));
706 if (ret)
707 return ret;
708
709 skb = alloc_skb(count, GFP_KERNEL);
710 if (!skb)
711 return -ENOMEM;
712
713 if (copy_from_user(skb_put(skb, count), buf, count)) {
714 kfree_skb(skb);
715 return -EFAULT;
716 }
717
718 ret = wwan_port_op_tx(port, skb, !!(filp->f_flags & O_NONBLOCK));
719 if (ret) {
720 kfree_skb(skb);
721 return ret;
722 }
723
724 return count;
725 }
726
wwan_port_fops_poll(struct file * filp,poll_table * wait)727 static __poll_t wwan_port_fops_poll(struct file *filp, poll_table *wait)
728 {
729 struct wwan_port *port = filp->private_data;
730 __poll_t mask = 0;
731
732 poll_wait(filp, &port->waitqueue, wait);
733
734 mutex_lock(&port->ops_lock);
735 if (port->ops && port->ops->tx_poll)
736 mask |= port->ops->tx_poll(port, filp, wait);
737 else if (!is_write_blocked(port))
738 mask |= EPOLLOUT | EPOLLWRNORM;
739 if (!is_read_blocked(port))
740 mask |= EPOLLIN | EPOLLRDNORM;
741 if (!port->ops)
742 mask |= EPOLLHUP | EPOLLERR;
743 mutex_unlock(&port->ops_lock);
744
745 return mask;
746 }
747
748 /* Implements minimalistic stub terminal IOCTLs support */
wwan_port_fops_at_ioctl(struct wwan_port * port,unsigned int cmd,unsigned long arg)749 static long wwan_port_fops_at_ioctl(struct wwan_port *port, unsigned int cmd,
750 unsigned long arg)
751 {
752 int ret = 0;
753
754 mutex_lock(&port->data_lock);
755
756 switch (cmd) {
757 case TCFLSH:
758 break;
759
760 case TCGETS:
761 if (copy_to_user((void __user *)arg, &port->at_data.termios,
762 sizeof(struct termios)))
763 ret = -EFAULT;
764 break;
765
766 case TCSETS:
767 case TCSETSW:
768 case TCSETSF:
769 if (copy_from_user(&port->at_data.termios, (void __user *)arg,
770 sizeof(struct termios)))
771 ret = -EFAULT;
772 break;
773
774 #ifdef TCGETS2
775 case TCGETS2:
776 if (copy_to_user((void __user *)arg, &port->at_data.termios,
777 sizeof(struct termios2)))
778 ret = -EFAULT;
779 break;
780
781 case TCSETS2:
782 case TCSETSW2:
783 case TCSETSF2:
784 if (copy_from_user(&port->at_data.termios, (void __user *)arg,
785 sizeof(struct termios2)))
786 ret = -EFAULT;
787 break;
788 #endif
789
790 case TIOCMGET:
791 ret = put_user(port->at_data.mdmbits, (int __user *)arg);
792 break;
793
794 case TIOCMSET:
795 case TIOCMBIC:
796 case TIOCMBIS: {
797 int mdmbits;
798
799 if (copy_from_user(&mdmbits, (int __user *)arg, sizeof(int))) {
800 ret = -EFAULT;
801 break;
802 }
803 if (cmd == TIOCMBIC)
804 port->at_data.mdmbits &= ~mdmbits;
805 else if (cmd == TIOCMBIS)
806 port->at_data.mdmbits |= mdmbits;
807 else
808 port->at_data.mdmbits = mdmbits;
809 break;
810 }
811
812 default:
813 ret = -ENOIOCTLCMD;
814 }
815
816 mutex_unlock(&port->data_lock);
817
818 return ret;
819 }
820
wwan_port_fops_ioctl(struct file * filp,unsigned int cmd,unsigned long arg)821 static long wwan_port_fops_ioctl(struct file *filp, unsigned int cmd,
822 unsigned long arg)
823 {
824 struct wwan_port *port = filp->private_data;
825 int res;
826
827 if (port->type == WWAN_PORT_AT) { /* AT port specific IOCTLs */
828 res = wwan_port_fops_at_ioctl(port, cmd, arg);
829 if (res != -ENOIOCTLCMD)
830 return res;
831 }
832
833 switch (cmd) {
834 case TIOCINQ: { /* aka SIOCINQ aka FIONREAD */
835 unsigned long flags;
836 struct sk_buff *skb;
837 int amount = 0;
838
839 spin_lock_irqsave(&port->rxq.lock, flags);
840 skb_queue_walk(&port->rxq, skb)
841 amount += skb->len;
842 spin_unlock_irqrestore(&port->rxq.lock, flags);
843
844 return put_user(amount, (int __user *)arg);
845 }
846
847 default:
848 return -ENOIOCTLCMD;
849 }
850 }
851
852 static const struct file_operations wwan_port_fops = {
853 .owner = THIS_MODULE,
854 .open = wwan_port_fops_open,
855 .release = wwan_port_fops_release,
856 .read = wwan_port_fops_read,
857 .write = wwan_port_fops_write,
858 .poll = wwan_port_fops_poll,
859 .unlocked_ioctl = wwan_port_fops_ioctl,
860 #ifdef CONFIG_COMPAT
861 .compat_ioctl = compat_ptr_ioctl,
862 #endif
863 .llseek = noop_llseek,
864 };
865
wwan_rtnl_validate(struct nlattr * tb[],struct nlattr * data[],struct netlink_ext_ack * extack)866 static int wwan_rtnl_validate(struct nlattr *tb[], struct nlattr *data[],
867 struct netlink_ext_ack *extack)
868 {
869 if (!data)
870 return -EINVAL;
871
872 if (!tb[IFLA_PARENT_DEV_NAME])
873 return -EINVAL;
874
875 if (!data[IFLA_WWAN_LINK_ID])
876 return -EINVAL;
877
878 return 0;
879 }
880
881 static struct device_type wwan_type = { .name = "wwan" };
882
wwan_rtnl_alloc(struct nlattr * tb[],const char * ifname,unsigned char name_assign_type,unsigned int num_tx_queues,unsigned int num_rx_queues)883 static struct net_device *wwan_rtnl_alloc(struct nlattr *tb[],
884 const char *ifname,
885 unsigned char name_assign_type,
886 unsigned int num_tx_queues,
887 unsigned int num_rx_queues)
888 {
889 const char *devname = nla_data(tb[IFLA_PARENT_DEV_NAME]);
890 struct wwan_device *wwandev = wwan_dev_get_by_name(devname);
891 struct net_device *dev;
892 unsigned int priv_size;
893
894 if (IS_ERR(wwandev))
895 return ERR_CAST(wwandev);
896
897 /* only supported if ops were registered (not just ports) */
898 if (!wwandev->ops) {
899 dev = ERR_PTR(-EOPNOTSUPP);
900 goto out;
901 }
902
903 priv_size = sizeof(struct wwan_netdev_priv) + wwandev->ops->priv_size;
904 dev = alloc_netdev_mqs(priv_size, ifname, name_assign_type,
905 wwandev->ops->setup, num_tx_queues, num_rx_queues);
906
907 if (dev) {
908 SET_NETDEV_DEV(dev, &wwandev->dev);
909 SET_NETDEV_DEVTYPE(dev, &wwan_type);
910 }
911
912 out:
913 /* release the reference */
914 put_device(&wwandev->dev);
915 return dev;
916 }
917
wwan_rtnl_newlink(struct net * src_net,struct net_device * dev,struct nlattr * tb[],struct nlattr * data[],struct netlink_ext_ack * extack)918 static int wwan_rtnl_newlink(struct net *src_net, struct net_device *dev,
919 struct nlattr *tb[], struct nlattr *data[],
920 struct netlink_ext_ack *extack)
921 {
922 struct wwan_device *wwandev = wwan_dev_get_by_parent(dev->dev.parent);
923 u32 link_id = nla_get_u32(data[IFLA_WWAN_LINK_ID]);
924 struct wwan_netdev_priv *priv = netdev_priv(dev);
925 int ret;
926
927 if (IS_ERR(wwandev))
928 return PTR_ERR(wwandev);
929
930 /* shouldn't have a netdev (left) with us as parent so WARN */
931 if (WARN_ON(!wwandev->ops)) {
932 ret = -EOPNOTSUPP;
933 goto out;
934 }
935
936 priv->link_id = link_id;
937 if (wwandev->ops->newlink)
938 ret = wwandev->ops->newlink(wwandev->ops_ctxt, dev,
939 link_id, extack);
940 else
941 ret = register_netdevice(dev);
942
943 out:
944 /* release the reference */
945 put_device(&wwandev->dev);
946 return ret;
947 }
948
wwan_rtnl_dellink(struct net_device * dev,struct list_head * head)949 static void wwan_rtnl_dellink(struct net_device *dev, struct list_head *head)
950 {
951 struct wwan_device *wwandev = wwan_dev_get_by_parent(dev->dev.parent);
952
953 if (IS_ERR(wwandev))
954 return;
955
956 /* shouldn't have a netdev (left) with us as parent so WARN */
957 if (WARN_ON(!wwandev->ops))
958 goto out;
959
960 if (wwandev->ops->dellink)
961 wwandev->ops->dellink(wwandev->ops_ctxt, dev, head);
962 else
963 unregister_netdevice_queue(dev, head);
964
965 out:
966 /* release the reference */
967 put_device(&wwandev->dev);
968 }
969
wwan_rtnl_get_size(const struct net_device * dev)970 static size_t wwan_rtnl_get_size(const struct net_device *dev)
971 {
972 return
973 nla_total_size(4) + /* IFLA_WWAN_LINK_ID */
974 0;
975 }
976
wwan_rtnl_fill_info(struct sk_buff * skb,const struct net_device * dev)977 static int wwan_rtnl_fill_info(struct sk_buff *skb,
978 const struct net_device *dev)
979 {
980 struct wwan_netdev_priv *priv = netdev_priv(dev);
981
982 if (nla_put_u32(skb, IFLA_WWAN_LINK_ID, priv->link_id))
983 goto nla_put_failure;
984
985 return 0;
986
987 nla_put_failure:
988 return -EMSGSIZE;
989 }
990
991 static const struct nla_policy wwan_rtnl_policy[IFLA_WWAN_MAX + 1] = {
992 [IFLA_WWAN_LINK_ID] = { .type = NLA_U32 },
993 };
994
995 static struct rtnl_link_ops wwan_rtnl_link_ops __read_mostly = {
996 .kind = "wwan",
997 .maxtype = __IFLA_WWAN_MAX,
998 .alloc = wwan_rtnl_alloc,
999 .validate = wwan_rtnl_validate,
1000 .newlink = wwan_rtnl_newlink,
1001 .dellink = wwan_rtnl_dellink,
1002 .get_size = wwan_rtnl_get_size,
1003 .fill_info = wwan_rtnl_fill_info,
1004 .policy = wwan_rtnl_policy,
1005 };
1006
wwan_create_default_link(struct wwan_device * wwandev,u32 def_link_id)1007 static void wwan_create_default_link(struct wwan_device *wwandev,
1008 u32 def_link_id)
1009 {
1010 struct nlattr *tb[IFLA_MAX + 1], *linkinfo[IFLA_INFO_MAX + 1];
1011 struct nlattr *data[IFLA_WWAN_MAX + 1];
1012 struct net_device *dev;
1013 struct nlmsghdr *nlh;
1014 struct sk_buff *msg;
1015
1016 /* Forge attributes required to create a WWAN netdev. We first
1017 * build a netlink message and then parse it. This looks
1018 * odd, but such approach is less error prone.
1019 */
1020 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
1021 if (WARN_ON(!msg))
1022 return;
1023 nlh = nlmsg_put(msg, 0, 0, RTM_NEWLINK, 0, 0);
1024 if (WARN_ON(!nlh))
1025 goto free_attrs;
1026
1027 if (nla_put_string(msg, IFLA_PARENT_DEV_NAME, dev_name(&wwandev->dev)))
1028 goto free_attrs;
1029 tb[IFLA_LINKINFO] = nla_nest_start(msg, IFLA_LINKINFO);
1030 if (!tb[IFLA_LINKINFO])
1031 goto free_attrs;
1032 linkinfo[IFLA_INFO_DATA] = nla_nest_start(msg, IFLA_INFO_DATA);
1033 if (!linkinfo[IFLA_INFO_DATA])
1034 goto free_attrs;
1035 if (nla_put_u32(msg, IFLA_WWAN_LINK_ID, def_link_id))
1036 goto free_attrs;
1037 nla_nest_end(msg, linkinfo[IFLA_INFO_DATA]);
1038 nla_nest_end(msg, tb[IFLA_LINKINFO]);
1039
1040 nlmsg_end(msg, nlh);
1041
1042 /* The next three parsing calls can not fail */
1043 nlmsg_parse_deprecated(nlh, 0, tb, IFLA_MAX, NULL, NULL);
1044 nla_parse_nested_deprecated(linkinfo, IFLA_INFO_MAX, tb[IFLA_LINKINFO],
1045 NULL, NULL);
1046 nla_parse_nested_deprecated(data, IFLA_WWAN_MAX,
1047 linkinfo[IFLA_INFO_DATA], NULL, NULL);
1048
1049 rtnl_lock();
1050
1051 dev = rtnl_create_link(&init_net, "wwan%d", NET_NAME_ENUM,
1052 &wwan_rtnl_link_ops, tb, NULL);
1053 if (WARN_ON(IS_ERR(dev)))
1054 goto unlock;
1055
1056 if (WARN_ON(wwan_rtnl_newlink(&init_net, dev, tb, data, NULL))) {
1057 free_netdev(dev);
1058 goto unlock;
1059 }
1060
1061 rtnl_configure_link(dev, NULL); /* Link initialized, notify new link */
1062
1063 unlock:
1064 rtnl_unlock();
1065
1066 free_attrs:
1067 nlmsg_free(msg);
1068 }
1069
1070 /**
1071 * wwan_register_ops - register WWAN device ops
1072 * @parent: Device to use as parent and shared by all WWAN ports and
1073 * created netdevs
1074 * @ops: operations to register
1075 * @ctxt: context to pass to operations
1076 * @def_link_id: id of the default link that will be automatically created by
1077 * the WWAN core for the WWAN device. The default link will not be created
1078 * if the passed value is WWAN_NO_DEFAULT_LINK.
1079 *
1080 * Returns: 0 on success, a negative error code on failure
1081 */
wwan_register_ops(struct device * parent,const struct wwan_ops * ops,void * ctxt,u32 def_link_id)1082 int wwan_register_ops(struct device *parent, const struct wwan_ops *ops,
1083 void *ctxt, u32 def_link_id)
1084 {
1085 struct wwan_device *wwandev;
1086
1087 if (WARN_ON(!parent || !ops || !ops->setup))
1088 return -EINVAL;
1089
1090 wwandev = wwan_create_dev(parent);
1091 if (IS_ERR(wwandev))
1092 return PTR_ERR(wwandev);
1093
1094 if (WARN_ON(wwandev->ops)) {
1095 wwan_remove_dev(wwandev);
1096 return -EBUSY;
1097 }
1098
1099 wwandev->ops = ops;
1100 wwandev->ops_ctxt = ctxt;
1101
1102 /* NB: we do not abort ops registration in case of default link
1103 * creation failure. Link ops is the management interface, while the
1104 * default link creation is a service option. And we should not prevent
1105 * a user from manually creating a link latter if service option failed
1106 * now.
1107 */
1108 if (def_link_id != WWAN_NO_DEFAULT_LINK)
1109 wwan_create_default_link(wwandev, def_link_id);
1110
1111 return 0;
1112 }
1113 EXPORT_SYMBOL_GPL(wwan_register_ops);
1114
1115 /* Enqueue child netdev deletion */
wwan_child_dellink(struct device * dev,void * data)1116 static int wwan_child_dellink(struct device *dev, void *data)
1117 {
1118 struct list_head *kill_list = data;
1119
1120 if (dev->type == &wwan_type)
1121 wwan_rtnl_dellink(to_net_dev(dev), kill_list);
1122
1123 return 0;
1124 }
1125
1126 /**
1127 * wwan_unregister_ops - remove WWAN device ops
1128 * @parent: Device to use as parent and shared by all WWAN ports and
1129 * created netdevs
1130 */
wwan_unregister_ops(struct device * parent)1131 void wwan_unregister_ops(struct device *parent)
1132 {
1133 struct wwan_device *wwandev = wwan_dev_get_by_parent(parent);
1134 LIST_HEAD(kill_list);
1135
1136 if (WARN_ON(IS_ERR(wwandev)))
1137 return;
1138 if (WARN_ON(!wwandev->ops)) {
1139 put_device(&wwandev->dev);
1140 return;
1141 }
1142
1143 /* put the reference obtained by wwan_dev_get_by_parent(),
1144 * we should still have one (that the owner is giving back
1145 * now) due to the ops being assigned.
1146 */
1147 put_device(&wwandev->dev);
1148
1149 rtnl_lock(); /* Prevent concurent netdev(s) creation/destroying */
1150
1151 /* Remove all child netdev(s), using batch removing */
1152 device_for_each_child(&wwandev->dev, &kill_list,
1153 wwan_child_dellink);
1154 unregister_netdevice_many(&kill_list);
1155
1156 wwandev->ops = NULL; /* Finally remove ops */
1157
1158 rtnl_unlock();
1159
1160 wwandev->ops_ctxt = NULL;
1161 wwan_remove_dev(wwandev);
1162 }
1163 EXPORT_SYMBOL_GPL(wwan_unregister_ops);
1164
wwan_init(void)1165 static int __init wwan_init(void)
1166 {
1167 int err;
1168
1169 err = rtnl_link_register(&wwan_rtnl_link_ops);
1170 if (err)
1171 return err;
1172
1173 wwan_class = class_create(THIS_MODULE, "wwan");
1174 if (IS_ERR(wwan_class)) {
1175 err = PTR_ERR(wwan_class);
1176 goto unregister;
1177 }
1178
1179 /* chrdev used for wwan ports */
1180 wwan_major = __register_chrdev(0, 0, WWAN_MAX_MINORS, "wwan_port",
1181 &wwan_port_fops);
1182 if (wwan_major < 0) {
1183 err = wwan_major;
1184 goto destroy;
1185 }
1186
1187 #ifdef CONFIG_WWAN_DEBUGFS
1188 wwan_debugfs_dir = debugfs_create_dir("wwan", NULL);
1189 #endif
1190
1191 return 0;
1192
1193 destroy:
1194 class_destroy(wwan_class);
1195 unregister:
1196 rtnl_link_unregister(&wwan_rtnl_link_ops);
1197 return err;
1198 }
1199
wwan_exit(void)1200 static void __exit wwan_exit(void)
1201 {
1202 debugfs_remove_recursive(wwan_debugfs_dir);
1203 __unregister_chrdev(wwan_major, 0, WWAN_MAX_MINORS, "wwan_port");
1204 rtnl_link_unregister(&wwan_rtnl_link_ops);
1205 class_destroy(wwan_class);
1206 }
1207
1208 module_init(wwan_init);
1209 module_exit(wwan_exit);
1210
1211 MODULE_AUTHOR("Loic Poulain <loic.poulain@linaro.org>");
1212 MODULE_DESCRIPTION("WWAN core");
1213 MODULE_LICENSE("GPL v2");
1214