Lines Matching +full:itu +full:- +full:r
1 // SPDX-License-Identifier: GPL-2.0-only
76 ndev->stats.tx_packets++; in wwan_hwsim_netdev_xmit()
77 ndev->stats.tx_bytes += skb->len; in wwan_hwsim_netdev_xmit()
88 ndev->netdev_ops = &wwan_hwsim_netdev_ops; in wwan_hwsim_netdev_setup()
89 ndev->needs_free_netdev = true; in wwan_hwsim_netdev_setup()
91 ndev->mtu = ETH_DATA_LEN; in wwan_hwsim_netdev_setup()
92 ndev->min_mtu = ETH_MIN_MTU; in wwan_hwsim_netdev_setup()
93 ndev->max_mtu = ETH_MAX_MTU; in wwan_hwsim_netdev_setup()
95 ndev->type = ARPHRD_NONE; in wwan_hwsim_netdev_setup()
96 ndev->flags = IFF_POINTOPOINT | IFF_NOARP; in wwan_hwsim_netdev_setup()
108 port->pstate = AT_PARSER_WAIT_A; in wwan_hwsim_port_start()
119 * ITU-T V.250 recomendations document.
134 for (i = 0, n = 0; i < in->len; ++i) in wwan_hwsim_port_tx()
135 if (in->data[i] == '\r') in wwan_hwsim_port_tx()
137 n = in->len + n * (2 + 2 + 2); /* Output buffer size */ in wwan_hwsim_port_tx()
140 return -ENOMEM; in wwan_hwsim_port_tx()
142 for (i = 0, s = 0; i < in->len; ++i) { in wwan_hwsim_port_tx()
143 char c = in->data[i]; in wwan_hwsim_port_tx()
145 if (port->pstate == AT_PARSER_WAIT_A) { in wwan_hwsim_port_tx()
147 port->pstate = AT_PARSER_WAIT_T; in wwan_hwsim_port_tx()
149 port->pstate = AT_PARSER_SKIP_LINE; in wwan_hwsim_port_tx()
150 } else if (port->pstate == AT_PARSER_WAIT_T) { in wwan_hwsim_port_tx()
152 port->pstate = AT_PARSER_WAIT_TERM; in wwan_hwsim_port_tx()
154 port->pstate = AT_PARSER_SKIP_LINE; in wwan_hwsim_port_tx()
155 } else if (port->pstate == AT_PARSER_WAIT_TERM) { in wwan_hwsim_port_tx()
156 if (c != '\r') in wwan_hwsim_port_tx()
159 if ((i + 1) < in->len && in->data[i + 1] == '\n') in wwan_hwsim_port_tx()
161 n = i - s + 1; in wwan_hwsim_port_tx()
162 skb_put_data(out, &in->data[s], n);/* Echo */ in wwan_hwsim_port_tx()
163 skb_put_data(out, "\r\nOK\r\n", 6); in wwan_hwsim_port_tx()
165 port->pstate = AT_PARSER_WAIT_A; in wwan_hwsim_port_tx()
166 } else if (port->pstate == AT_PARSER_SKIP_LINE) { in wwan_hwsim_port_tx()
167 if (c != '\r') in wwan_hwsim_port_tx()
169 port->pstate = AT_PARSER_WAIT_A; in wwan_hwsim_port_tx()
175 n = i - s; in wwan_hwsim_port_tx()
176 skb_put_data(out, &in->data[s], n); in wwan_hwsim_port_tx()
200 return ERR_PTR(-ENOMEM); in wwan_hwsim_port_new()
202 port->dev = dev; in wwan_hwsim_port_new()
204 spin_lock(&dev->ports_lock); in wwan_hwsim_port_new()
205 port->id = dev->port_idx++; in wwan_hwsim_port_new()
206 spin_unlock(&dev->ports_lock); in wwan_hwsim_port_new()
208 port->wwan = wwan_create_port(&dev->dev, WWAN_PORT_AT, in wwan_hwsim_port_new()
211 if (IS_ERR(port->wwan)) { in wwan_hwsim_port_new()
212 err = PTR_ERR(port->wwan); in wwan_hwsim_port_new()
216 INIT_WORK(&port->del_work, wwan_hwsim_port_del_work); in wwan_hwsim_port_new()
218 snprintf(name, sizeof(name), "port%u", port->id); in wwan_hwsim_port_new()
219 port->debugfs_topdir = debugfs_create_dir(name, dev->debugfs_topdir); in wwan_hwsim_port_new()
220 debugfs_create_file("destroy", 0200, port->debugfs_topdir, port, in wwan_hwsim_port_new()
233 debugfs_remove(port->debugfs_topdir); in wwan_hwsim_port_del()
236 if (current_work() != &port->del_work) in wwan_hwsim_port_del()
237 cancel_work_sync(&port->del_work); in wwan_hwsim_port_del()
239 wwan_remove_port(port->wwan); in wwan_hwsim_port_del()
247 struct wwan_hwsim_dev *dev = port->dev; in wwan_hwsim_port_del_work()
249 spin_lock(&dev->ports_lock); in wwan_hwsim_port_del_work()
250 if (list_empty(&port->list)) { in wwan_hwsim_port_del_work()
252 spin_unlock(&dev->ports_lock); in wwan_hwsim_port_del_work()
255 list_del_init(&port->list); in wwan_hwsim_port_del_work()
256 spin_unlock(&dev->ports_lock); in wwan_hwsim_port_del_work()
275 return ERR_PTR(-ENOMEM); in wwan_hwsim_dev_new()
278 dev->id = wwan_hwsim_dev_idx++; in wwan_hwsim_dev_new()
281 dev->dev.release = wwan_hwsim_dev_release; in wwan_hwsim_dev_new()
282 dev->dev.class = &wwan_hwsim_class; in wwan_hwsim_dev_new()
283 dev_set_name(&dev->dev, "hwsim%u", dev->id); in wwan_hwsim_dev_new()
285 spin_lock_init(&dev->ports_lock); in wwan_hwsim_dev_new()
286 INIT_LIST_HEAD(&dev->ports); in wwan_hwsim_dev_new()
288 err = device_register(&dev->dev); in wwan_hwsim_dev_new()
292 INIT_WORK(&dev->del_work, wwan_hwsim_dev_del_work); in wwan_hwsim_dev_new()
294 err = wwan_register_ops(&dev->dev, &wwan_hwsim_wwan_rtnl_ops, dev, 1); in wwan_hwsim_dev_new()
298 dev->debugfs_topdir = debugfs_create_dir(dev_name(&dev->dev), in wwan_hwsim_dev_new()
300 debugfs_create_file("destroy", 0200, dev->debugfs_topdir, dev, in wwan_hwsim_dev_new()
302 dev->debugfs_portcreate = in wwan_hwsim_dev_new()
304 dev->debugfs_topdir, dev, in wwan_hwsim_dev_new()
310 device_unregister(&dev->dev); in wwan_hwsim_dev_new()
316 put_device(&dev->dev); in wwan_hwsim_dev_new()
323 debugfs_remove(dev->debugfs_portcreate); /* Avoid new ports */ in wwan_hwsim_dev_del()
325 spin_lock(&dev->ports_lock); in wwan_hwsim_dev_del()
326 while (!list_empty(&dev->ports)) { in wwan_hwsim_dev_del()
329 port = list_first_entry(&dev->ports, struct wwan_hwsim_port, in wwan_hwsim_dev_del()
331 list_del_init(&port->list); in wwan_hwsim_dev_del()
332 spin_unlock(&dev->ports_lock); in wwan_hwsim_dev_del()
334 spin_lock(&dev->ports_lock); in wwan_hwsim_dev_del()
336 spin_unlock(&dev->ports_lock); in wwan_hwsim_dev_del()
338 debugfs_remove(dev->debugfs_topdir); in wwan_hwsim_dev_del()
341 wwan_unregister_ops(&dev->dev); in wwan_hwsim_dev_del()
344 if (current_work() != &dev->del_work) in wwan_hwsim_dev_del()
345 cancel_work_sync(&dev->del_work); in wwan_hwsim_dev_del()
347 device_unregister(&dev->dev); in wwan_hwsim_dev_del()
356 if (list_empty(&dev->list)) { in wwan_hwsim_dev_del_work()
361 list_del_init(&dev->list); in wwan_hwsim_dev_del_work()
371 struct wwan_hwsim_port *port = file->private_data; in wwan_hwsim_debugfs_portdestroy_write()
377 queue_work(wwan_wq, &port->del_work); in wwan_hwsim_debugfs_portdestroy_write()
392 struct wwan_hwsim_dev *dev = file->private_data; in wwan_hwsim_debugfs_portcreate_write()
399 spin_lock(&dev->ports_lock); in wwan_hwsim_debugfs_portcreate_write()
400 list_add_tail(&port->list, &dev->ports); in wwan_hwsim_debugfs_portcreate_write()
401 spin_unlock(&dev->ports_lock); in wwan_hwsim_debugfs_portcreate_write()
416 struct wwan_hwsim_dev *dev = file->private_data; in wwan_hwsim_debugfs_devdestroy_write()
422 queue_work(wwan_wq, &dev->del_work); in wwan_hwsim_debugfs_devdestroy_write()
444 list_add_tail(&dev->list, &wwan_hwsim_devs); in wwan_hwsim_debugfs_devcreate_write()
467 list_add_tail(&dev->list, &wwan_hwsim_devs); in wwan_hwsim_init_devs()
480 spin_lock(&dev->ports_lock); in wwan_hwsim_init_devs()
481 list_add_tail(&port->list, &dev->ports); in wwan_hwsim_init_devs()
482 spin_unlock(&dev->ports_lock); in wwan_hwsim_init_devs()
497 list_del_init(&dev->list); in wwan_hwsim_free_devs()
510 return -EINVAL; in wwan_hwsim_init()
514 return -ENOMEM; in wwan_hwsim_init()