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

1 // SPDX-License-Identifier: GPL-2.0-only
73 ndev->stats.tx_packets++; in wwan_hwsim_netdev_xmit()
74 ndev->stats.tx_bytes += skb->len; in wwan_hwsim_netdev_xmit()
85 ndev->netdev_ops = &wwan_hwsim_netdev_ops; in wwan_hwsim_netdev_setup()
86 ndev->needs_free_netdev = true; in wwan_hwsim_netdev_setup()
88 ndev->mtu = ETH_DATA_LEN; in wwan_hwsim_netdev_setup()
89 ndev->min_mtu = ETH_MIN_MTU; in wwan_hwsim_netdev_setup()
90 ndev->max_mtu = ETH_MAX_MTU; in wwan_hwsim_netdev_setup()
92 ndev->type = ARPHRD_NONE; in wwan_hwsim_netdev_setup()
93 ndev->flags = IFF_POINTOPOINT | IFF_NOARP; in wwan_hwsim_netdev_setup()
105 port->pstate = AT_PARSER_WAIT_A; in wwan_hwsim_port_start()
116 * ITU-T V.250 recomendations document.
131 for (i = 0, n = 0; i < in->len; ++i) in wwan_hwsim_port_tx()
132 if (in->data[i] == '\r') in wwan_hwsim_port_tx()
134 n = in->len + n * (2 + 2 + 2); /* Output buffer size */ in wwan_hwsim_port_tx()
137 return -ENOMEM; in wwan_hwsim_port_tx()
139 for (i = 0, s = 0; i < in->len; ++i) { in wwan_hwsim_port_tx()
140 char c = in->data[i]; in wwan_hwsim_port_tx()
142 if (port->pstate == AT_PARSER_WAIT_A) { in wwan_hwsim_port_tx()
144 port->pstate = AT_PARSER_WAIT_T; in wwan_hwsim_port_tx()
146 port->pstate = AT_PARSER_SKIP_LINE; in wwan_hwsim_port_tx()
147 } else if (port->pstate == AT_PARSER_WAIT_T) { in wwan_hwsim_port_tx()
149 port->pstate = AT_PARSER_WAIT_TERM; in wwan_hwsim_port_tx()
151 port->pstate = AT_PARSER_SKIP_LINE; in wwan_hwsim_port_tx()
152 } else if (port->pstate == AT_PARSER_WAIT_TERM) { in wwan_hwsim_port_tx()
153 if (c != '\r') in wwan_hwsim_port_tx()
156 if ((i + 1) < in->len && in->data[i + 1] == '\n') in wwan_hwsim_port_tx()
158 n = i - s + 1; in wwan_hwsim_port_tx()
159 memcpy(skb_put(out, n), &in->data[s], n);/* Echo */ in wwan_hwsim_port_tx()
160 memcpy(skb_put(out, 6), "\r\nOK\r\n", 6); in wwan_hwsim_port_tx()
162 port->pstate = AT_PARSER_WAIT_A; in wwan_hwsim_port_tx()
163 } else if (port->pstate == AT_PARSER_SKIP_LINE) { in wwan_hwsim_port_tx()
164 if (c != '\r') in wwan_hwsim_port_tx()
166 port->pstate = AT_PARSER_WAIT_A; in wwan_hwsim_port_tx()
172 n = i - s; in wwan_hwsim_port_tx()
173 memcpy(skb_put(out, n), &in->data[s], n); in wwan_hwsim_port_tx()
197 return ERR_PTR(-ENOMEM); in wwan_hwsim_port_new()
199 port->dev = dev; in wwan_hwsim_port_new()
201 spin_lock(&dev->ports_lock); in wwan_hwsim_port_new()
202 port->id = dev->port_idx++; in wwan_hwsim_port_new()
203 spin_unlock(&dev->ports_lock); in wwan_hwsim_port_new()
205 port->wwan = wwan_create_port(&dev->dev, WWAN_PORT_AT, in wwan_hwsim_port_new()
208 if (IS_ERR(port->wwan)) { in wwan_hwsim_port_new()
209 err = PTR_ERR(port->wwan); in wwan_hwsim_port_new()
213 INIT_WORK(&port->del_work, wwan_hwsim_port_del_work); in wwan_hwsim_port_new()
215 snprintf(name, sizeof(name), "port%u", port->id); in wwan_hwsim_port_new()
216 port->debugfs_topdir = debugfs_create_dir(name, dev->debugfs_topdir); in wwan_hwsim_port_new()
217 debugfs_create_file("destroy", 0200, port->debugfs_topdir, port, in wwan_hwsim_port_new()
230 debugfs_remove(port->debugfs_topdir); in wwan_hwsim_port_del()
233 if (current_work() != &port->del_work) in wwan_hwsim_port_del()
234 cancel_work_sync(&port->del_work); in wwan_hwsim_port_del()
236 wwan_remove_port(port->wwan); in wwan_hwsim_port_del()
244 struct wwan_hwsim_dev *dev = port->dev; in wwan_hwsim_port_del_work()
246 spin_lock(&dev->ports_lock); in wwan_hwsim_port_del_work()
247 if (list_empty(&port->list)) { in wwan_hwsim_port_del_work()
249 spin_unlock(&dev->ports_lock); in wwan_hwsim_port_del_work()
252 list_del_init(&port->list); in wwan_hwsim_port_del_work()
253 spin_unlock(&dev->ports_lock); in wwan_hwsim_port_del_work()
272 return ERR_PTR(-ENOMEM); in wwan_hwsim_dev_new()
275 dev->id = wwan_hwsim_dev_idx++; in wwan_hwsim_dev_new()
278 dev->dev.release = wwan_hwsim_dev_release; in wwan_hwsim_dev_new()
279 dev->dev.class = wwan_hwsim_class; in wwan_hwsim_dev_new()
280 dev_set_name(&dev->dev, "hwsim%u", dev->id); in wwan_hwsim_dev_new()
282 spin_lock_init(&dev->ports_lock); in wwan_hwsim_dev_new()
283 INIT_LIST_HEAD(&dev->ports); in wwan_hwsim_dev_new()
285 err = device_register(&dev->dev); in wwan_hwsim_dev_new()
289 INIT_WORK(&dev->del_work, wwan_hwsim_dev_del_work); in wwan_hwsim_dev_new()
291 err = wwan_register_ops(&dev->dev, &wwan_hwsim_wwan_rtnl_ops, dev, 1); in wwan_hwsim_dev_new()
295 dev->debugfs_topdir = debugfs_create_dir(dev_name(&dev->dev), in wwan_hwsim_dev_new()
297 debugfs_create_file("destroy", 0200, dev->debugfs_topdir, dev, in wwan_hwsim_dev_new()
299 dev->debugfs_portcreate = in wwan_hwsim_dev_new()
301 dev->debugfs_topdir, dev, in wwan_hwsim_dev_new()
307 device_unregister(&dev->dev); in wwan_hwsim_dev_new()
320 debugfs_remove(dev->debugfs_portcreate); /* Avoid new ports */ in wwan_hwsim_dev_del()
322 spin_lock(&dev->ports_lock); in wwan_hwsim_dev_del()
323 while (!list_empty(&dev->ports)) { in wwan_hwsim_dev_del()
326 port = list_first_entry(&dev->ports, struct wwan_hwsim_port, in wwan_hwsim_dev_del()
328 list_del_init(&port->list); in wwan_hwsim_dev_del()
329 spin_unlock(&dev->ports_lock); in wwan_hwsim_dev_del()
331 spin_lock(&dev->ports_lock); in wwan_hwsim_dev_del()
333 spin_unlock(&dev->ports_lock); in wwan_hwsim_dev_del()
335 debugfs_remove(dev->debugfs_topdir); in wwan_hwsim_dev_del()
338 wwan_unregister_ops(&dev->dev); in wwan_hwsim_dev_del()
341 if (current_work() != &dev->del_work) in wwan_hwsim_dev_del()
342 cancel_work_sync(&dev->del_work); in wwan_hwsim_dev_del()
344 device_unregister(&dev->dev); in wwan_hwsim_dev_del()
353 if (list_empty(&dev->list)) { in wwan_hwsim_dev_del_work()
358 list_del_init(&dev->list); in wwan_hwsim_dev_del_work()
368 struct wwan_hwsim_port *port = file->private_data; in wwan_hwsim_debugfs_portdestroy_write()
374 schedule_work(&port->del_work); in wwan_hwsim_debugfs_portdestroy_write()
389 struct wwan_hwsim_dev *dev = file->private_data; in wwan_hwsim_debugfs_portcreate_write()
396 spin_lock(&dev->ports_lock); in wwan_hwsim_debugfs_portcreate_write()
397 list_add_tail(&port->list, &dev->ports); in wwan_hwsim_debugfs_portcreate_write()
398 spin_unlock(&dev->ports_lock); in wwan_hwsim_debugfs_portcreate_write()
413 struct wwan_hwsim_dev *dev = file->private_data; in wwan_hwsim_debugfs_devdestroy_write()
419 schedule_work(&dev->del_work); in wwan_hwsim_debugfs_devdestroy_write()
441 list_add_tail(&dev->list, &wwan_hwsim_devs); in wwan_hwsim_debugfs_devcreate_write()
464 list_add_tail(&dev->list, &wwan_hwsim_devs); in wwan_hwsim_init_devs()
477 spin_lock(&dev->ports_lock); in wwan_hwsim_init_devs()
478 list_add_tail(&port->list, &dev->ports); in wwan_hwsim_init_devs()
479 spin_unlock(&dev->ports_lock); in wwan_hwsim_init_devs()
494 list_del_init(&dev->list); in wwan_hwsim_free_devs()
507 return -EINVAL; in wwan_hwsim_init()