cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

wwan_core.c (28636B)


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