Lines Matching +full:itu +full:- +full:r

1 // SPDX-License-Identifier: GPL-2.0-only
74 ndev->stats.tx_packets++; in wwan_hwsim_netdev_xmit()
75 ndev->stats.tx_bytes += skb->len; in wwan_hwsim_netdev_xmit()
86 ndev->netdev_ops = &wwan_hwsim_netdev_ops; in wwan_hwsim_netdev_setup()
87 ndev->needs_free_netdev = true; in wwan_hwsim_netdev_setup()
89 ndev->mtu = ETH_DATA_LEN; in wwan_hwsim_netdev_setup()
90 ndev->min_mtu = ETH_MIN_MTU; in wwan_hwsim_netdev_setup()
91 ndev->max_mtu = ETH_MAX_MTU; in wwan_hwsim_netdev_setup()
93 ndev->type = ARPHRD_NONE; in wwan_hwsim_netdev_setup()
94 ndev->flags = IFF_POINTOPOINT | IFF_NOARP; in wwan_hwsim_netdev_setup()
106 port->pstate = AT_PARSER_WAIT_A; in wwan_hwsim_port_start()
117 * ITU-T V.250 recomendations document.
132 for (i = 0, n = 0; i < in->len; ++i) in wwan_hwsim_port_tx()
133 if (in->data[i] == '\r') in wwan_hwsim_port_tx()
135 n = in->len + n * (2 + 2 + 2); /* Output buffer size */ in wwan_hwsim_port_tx()
138 return -ENOMEM; in wwan_hwsim_port_tx()
140 for (i = 0, s = 0; i < in->len; ++i) { in wwan_hwsim_port_tx()
141 char c = in->data[i]; in wwan_hwsim_port_tx()
143 if (port->pstate == AT_PARSER_WAIT_A) { in wwan_hwsim_port_tx()
145 port->pstate = AT_PARSER_WAIT_T; in wwan_hwsim_port_tx()
147 port->pstate = AT_PARSER_SKIP_LINE; in wwan_hwsim_port_tx()
148 } else if (port->pstate == AT_PARSER_WAIT_T) { in wwan_hwsim_port_tx()
150 port->pstate = AT_PARSER_WAIT_TERM; in wwan_hwsim_port_tx()
152 port->pstate = AT_PARSER_SKIP_LINE; in wwan_hwsim_port_tx()
153 } else if (port->pstate == AT_PARSER_WAIT_TERM) { in wwan_hwsim_port_tx()
154 if (c != '\r') in wwan_hwsim_port_tx()
157 if ((i + 1) < in->len && in->data[i + 1] == '\n') in wwan_hwsim_port_tx()
159 n = i - s + 1; in wwan_hwsim_port_tx()
160 skb_put_data(out, &in->data[s], n);/* Echo */ in wwan_hwsim_port_tx()
161 skb_put_data(out, "\r\nOK\r\n", 6); in wwan_hwsim_port_tx()
163 port->pstate = AT_PARSER_WAIT_A; in wwan_hwsim_port_tx()
164 } else if (port->pstate == AT_PARSER_SKIP_LINE) { in wwan_hwsim_port_tx()
165 if (c != '\r') in wwan_hwsim_port_tx()
167 port->pstate = AT_PARSER_WAIT_A; in wwan_hwsim_port_tx()
173 n = i - s; in wwan_hwsim_port_tx()
174 skb_put_data(out, &in->data[s], n); in wwan_hwsim_port_tx()
198 return ERR_PTR(-ENOMEM); in wwan_hwsim_port_new()
200 port->dev = dev; in wwan_hwsim_port_new()
202 spin_lock(&dev->ports_lock); in wwan_hwsim_port_new()
203 port->id = dev->port_idx++; in wwan_hwsim_port_new()
204 spin_unlock(&dev->ports_lock); in wwan_hwsim_port_new()
206 port->wwan = wwan_create_port(&dev->dev, WWAN_PORT_AT, in wwan_hwsim_port_new()
209 if (IS_ERR(port->wwan)) { in wwan_hwsim_port_new()
210 err = PTR_ERR(port->wwan); in wwan_hwsim_port_new()
214 INIT_WORK(&port->del_work, wwan_hwsim_port_del_work); in wwan_hwsim_port_new()
216 snprintf(name, sizeof(name), "port%u", port->id); in wwan_hwsim_port_new()
217 port->debugfs_topdir = debugfs_create_dir(name, dev->debugfs_topdir); in wwan_hwsim_port_new()
218 debugfs_create_file("destroy", 0200, port->debugfs_topdir, port, in wwan_hwsim_port_new()
231 debugfs_remove(port->debugfs_topdir); in wwan_hwsim_port_del()
234 if (current_work() != &port->del_work) in wwan_hwsim_port_del()
235 cancel_work_sync(&port->del_work); in wwan_hwsim_port_del()
237 wwan_remove_port(port->wwan); in wwan_hwsim_port_del()
245 struct wwan_hwsim_dev *dev = port->dev; in wwan_hwsim_port_del_work()
247 spin_lock(&dev->ports_lock); in wwan_hwsim_port_del_work()
248 if (list_empty(&port->list)) { in wwan_hwsim_port_del_work()
250 spin_unlock(&dev->ports_lock); in wwan_hwsim_port_del_work()
253 list_del_init(&port->list); in wwan_hwsim_port_del_work()
254 spin_unlock(&dev->ports_lock); in wwan_hwsim_port_del_work()
273 return ERR_PTR(-ENOMEM); in wwan_hwsim_dev_new()
276 dev->id = wwan_hwsim_dev_idx++; in wwan_hwsim_dev_new()
279 dev->dev.release = wwan_hwsim_dev_release; in wwan_hwsim_dev_new()
280 dev->dev.class = wwan_hwsim_class; in wwan_hwsim_dev_new()
281 dev_set_name(&dev->dev, "hwsim%u", dev->id); in wwan_hwsim_dev_new()
283 spin_lock_init(&dev->ports_lock); in wwan_hwsim_dev_new()
284 INIT_LIST_HEAD(&dev->ports); in wwan_hwsim_dev_new()
286 err = device_register(&dev->dev); in wwan_hwsim_dev_new()
290 INIT_WORK(&dev->del_work, wwan_hwsim_dev_del_work); in wwan_hwsim_dev_new()
292 err = wwan_register_ops(&dev->dev, &wwan_hwsim_wwan_rtnl_ops, dev, 1); in wwan_hwsim_dev_new()
296 dev->debugfs_topdir = debugfs_create_dir(dev_name(&dev->dev), in wwan_hwsim_dev_new()
298 debugfs_create_file("destroy", 0200, dev->debugfs_topdir, dev, in wwan_hwsim_dev_new()
300 dev->debugfs_portcreate = in wwan_hwsim_dev_new()
302 dev->debugfs_topdir, dev, in wwan_hwsim_dev_new()
308 device_unregister(&dev->dev); in wwan_hwsim_dev_new()
314 put_device(&dev->dev); in wwan_hwsim_dev_new()
321 debugfs_remove(dev->debugfs_portcreate); /* Avoid new ports */ in wwan_hwsim_dev_del()
323 spin_lock(&dev->ports_lock); in wwan_hwsim_dev_del()
324 while (!list_empty(&dev->ports)) { in wwan_hwsim_dev_del()
327 port = list_first_entry(&dev->ports, struct wwan_hwsim_port, in wwan_hwsim_dev_del()
329 list_del_init(&port->list); in wwan_hwsim_dev_del()
330 spin_unlock(&dev->ports_lock); in wwan_hwsim_dev_del()
332 spin_lock(&dev->ports_lock); in wwan_hwsim_dev_del()
334 spin_unlock(&dev->ports_lock); in wwan_hwsim_dev_del()
336 debugfs_remove(dev->debugfs_topdir); in wwan_hwsim_dev_del()
339 wwan_unregister_ops(&dev->dev); in wwan_hwsim_dev_del()
342 if (current_work() != &dev->del_work) in wwan_hwsim_dev_del()
343 cancel_work_sync(&dev->del_work); in wwan_hwsim_dev_del()
345 device_unregister(&dev->dev); in wwan_hwsim_dev_del()
354 if (list_empty(&dev->list)) { in wwan_hwsim_dev_del_work()
359 list_del_init(&dev->list); in wwan_hwsim_dev_del_work()
369 struct wwan_hwsim_port *port = file->private_data; in wwan_hwsim_debugfs_portdestroy_write()
375 queue_work(wwan_wq, &port->del_work); in wwan_hwsim_debugfs_portdestroy_write()
390 struct wwan_hwsim_dev *dev = file->private_data; in wwan_hwsim_debugfs_portcreate_write()
397 spin_lock(&dev->ports_lock); in wwan_hwsim_debugfs_portcreate_write()
398 list_add_tail(&port->list, &dev->ports); in wwan_hwsim_debugfs_portcreate_write()
399 spin_unlock(&dev->ports_lock); in wwan_hwsim_debugfs_portcreate_write()
414 struct wwan_hwsim_dev *dev = file->private_data; in wwan_hwsim_debugfs_devdestroy_write()
420 queue_work(wwan_wq, &dev->del_work); in wwan_hwsim_debugfs_devdestroy_write()
442 list_add_tail(&dev->list, &wwan_hwsim_devs); in wwan_hwsim_debugfs_devcreate_write()
465 list_add_tail(&dev->list, &wwan_hwsim_devs); in wwan_hwsim_init_devs()
478 spin_lock(&dev->ports_lock); in wwan_hwsim_init_devs()
479 list_add_tail(&port->list, &dev->ports); in wwan_hwsim_init_devs()
480 spin_unlock(&dev->ports_lock); in wwan_hwsim_init_devs()
495 list_del_init(&dev->list); in wwan_hwsim_free_devs()
508 return -EINVAL; in wwan_hwsim_init()
512 return -ENOMEM; in wwan_hwsim_init()