Lines Matching +full:loss +full:- +full:of +full:- +full:lock

12  *   WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
15 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
16 * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
17 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
21 * kernel-based UART device; it is essentially an Ethernet-to-UART
34 #include <linux/of.h>
50 spinlock_t lock; /* transmit lock */ member
67 struct net_device *netdev = qca->net_dev; in qca_tty_receive()
68 struct net_device_stats *n_stats = &netdev->stats; in qca_tty_receive()
71 if (!qca->rx_skb) { in qca_tty_receive()
72 qca->rx_skb = netdev_alloc_skb_ip_align(netdev, in qca_tty_receive()
73 netdev->mtu + in qca_tty_receive()
75 if (!qca->rx_skb) { in qca_tty_receive()
76 n_stats->rx_errors++; in qca_tty_receive()
77 n_stats->rx_dropped++; in qca_tty_receive()
85 retcode = qcafrm_fsm_decode(&qca->frm_handle, in qca_tty_receive()
86 qca->rx_skb->data, in qca_tty_receive()
87 skb_tailroom(qca->rx_skb), in qca_tty_receive()
96 n_stats->rx_errors++; in qca_tty_receive()
97 n_stats->rx_dropped++; in qca_tty_receive()
101 n_stats->rx_errors++; in qca_tty_receive()
102 n_stats->rx_dropped++; in qca_tty_receive()
105 n_stats->rx_packets++; in qca_tty_receive()
106 n_stats->rx_bytes += retcode; in qca_tty_receive()
107 skb_put(qca->rx_skb, retcode); in qca_tty_receive()
108 qca->rx_skb->protocol = eth_type_trans( in qca_tty_receive()
109 qca->rx_skb, qca->rx_skb->dev); in qca_tty_receive()
110 skb_checksum_none_assert(qca->rx_skb); in qca_tty_receive()
111 netif_rx_ni(qca->rx_skb); in qca_tty_receive()
112 qca->rx_skb = netdev_alloc_skb_ip_align(netdev, in qca_tty_receive()
113 netdev->mtu + in qca_tty_receive()
115 if (!qca->rx_skb) { in qca_tty_receive()
116 netdev_dbg(netdev, "recv: out of RX resources\n"); in qca_tty_receive()
117 n_stats->rx_errors++; in qca_tty_receive()
130 struct net_device_stats *n_stats = &qca->net_dev->stats; in qcauart_transmit()
133 spin_lock_bh(&qca->lock); in qcauart_transmit()
136 if (!netif_running(qca->net_dev)) { in qcauart_transmit()
137 spin_unlock_bh(&qca->lock); in qcauart_transmit()
141 if (qca->tx_left <= 0) { in qcauart_transmit()
143 * transmission of another packet in qcauart_transmit()
145 n_stats->tx_packets++; in qcauart_transmit()
146 spin_unlock_bh(&qca->lock); in qcauart_transmit()
147 netif_wake_queue(qca->net_dev); in qcauart_transmit()
151 written = serdev_device_write_buf(qca->serdev, qca->tx_head, in qcauart_transmit()
152 qca->tx_left); in qcauart_transmit()
154 qca->tx_left -= written; in qcauart_transmit()
155 qca->tx_head += written; in qcauart_transmit()
157 spin_unlock_bh(&qca->lock); in qcauart_transmit()
167 schedule_work(&qca->tx_work); in qca_tty_wakeup()
179 netif_start_queue(qca->net_dev); in qcauart_netdev_open()
189 flush_work(&qca->tx_work); in qcauart_netdev_close()
191 spin_lock_bh(&qca->lock); in qcauart_netdev_close()
192 qca->tx_left = 0; in qcauart_netdev_close()
193 spin_unlock_bh(&qca->lock); in qcauart_netdev_close()
201 struct net_device_stats *n_stats = &dev->stats; in qcauart_netdev_xmit()
207 spin_lock(&qca->lock); in qcauart_netdev_xmit()
209 WARN_ON(qca->tx_left); in qcauart_netdev_xmit()
212 spin_unlock(&qca->lock); in qcauart_netdev_xmit()
213 netdev_warn(qca->net_dev, "xmit: iface is down\n"); in qcauart_netdev_xmit()
217 pos = qca->tx_buffer; in qcauart_netdev_xmit()
219 if (skb->len < QCAFRM_MIN_LEN) in qcauart_netdev_xmit()
220 pad_len = QCAFRM_MIN_LEN - skb->len; in qcauart_netdev_xmit()
222 pos += qcafrm_create_header(pos, skb->len + pad_len); in qcauart_netdev_xmit()
224 memcpy(pos, skb->data, skb->len); in qcauart_netdev_xmit()
225 pos += skb->len; in qcauart_netdev_xmit()
234 netif_stop_queue(qca->net_dev); in qcauart_netdev_xmit()
236 written = serdev_device_write_buf(qca->serdev, qca->tx_buffer, in qcauart_netdev_xmit()
237 pos - qca->tx_buffer); in qcauart_netdev_xmit()
239 qca->tx_left = (pos - qca->tx_buffer) - written; in qcauart_netdev_xmit()
240 qca->tx_head = qca->tx_buffer + written; in qcauart_netdev_xmit()
241 n_stats->tx_bytes += written; in qcauart_netdev_xmit()
243 spin_unlock(&qca->lock); in qcauart_netdev_xmit()
255 netdev_info(qca->net_dev, "Transmit timeout at %ld, latency %ld\n", in qcauart_netdev_tx_timeout()
257 dev->stats.tx_errors++; in qcauart_netdev_tx_timeout()
258 dev->stats.tx_dropped++; in qcauart_netdev_tx_timeout()
267 dev->mtu = QCAFRM_MAX_MTU; in qcauart_netdev_init()
268 dev->type = ARPHRD_ETHER; in qcauart_netdev_init()
271 qca->tx_buffer = devm_kmalloc(&qca->serdev->dev, len, GFP_KERNEL); in qcauart_netdev_init()
272 if (!qca->tx_buffer) in qcauart_netdev_init()
273 return -ENOMEM; in qcauart_netdev_init()
275 qca->rx_skb = netdev_alloc_skb_ip_align(qca->net_dev, in qcauart_netdev_init()
276 qca->net_dev->mtu + in qcauart_netdev_init()
278 if (!qca->rx_skb) in qcauart_netdev_init()
279 return -ENOBUFS; in qcauart_netdev_init()
288 dev_kfree_skb(qca->rx_skb); in qcauart_netdev_uninit()
304 dev->netdev_ops = &qcauart_netdev_ops; in qcauart_netdev_setup()
305 dev->watchdog_timeo = QCAUART_TX_TIMEOUT; in qcauart_netdev_setup()
306 dev->priv_flags &= ~IFF_TX_SKB_SHARING; in qcauart_netdev_setup()
307 dev->tx_queue_len = 100; in qcauart_netdev_setup()
309 /* MTU range: 46 - 1500 */ in qcauart_netdev_setup()
310 dev->min_mtu = QCAFRM_MIN_MTU; in qcauart_netdev_setup()
311 dev->max_mtu = QCAFRM_MAX_MTU; in qcauart_netdev_setup()
320 MODULE_DEVICE_TABLE(of, qca_uart_of_match);
330 return -ENOMEM; in qca_uart_probe()
333 SET_NETDEV_DEV(qcauart_dev, &serdev->dev); in qca_uart_probe()
338 ret = -ENOMEM; in qca_uart_probe()
341 qca->net_dev = qcauart_dev; in qca_uart_probe()
342 qca->serdev = serdev; in qca_uart_probe()
343 qcafrm_fsm_init_uart(&qca->frm_handle); in qca_uart_probe()
345 spin_lock_init(&qca->lock); in qca_uart_probe()
346 INIT_WORK(&qca->tx_work, qcauart_transmit); in qca_uart_probe()
348 of_property_read_u32(serdev->dev.of_node, "current-speed", &speed); in qca_uart_probe()
350 ret = of_get_mac_address(serdev->dev.of_node, qca->net_dev->dev_addr); in qca_uart_probe()
352 eth_hw_addr_random(qca->net_dev); in qca_uart_probe()
353 dev_info(&serdev->dev, "Using random MAC address: %pM\n", in qca_uart_probe()
354 qca->net_dev->dev_addr); in qca_uart_probe()
357 netif_carrier_on(qca->net_dev); in qca_uart_probe()
363 dev_err(&serdev->dev, "Unable to open device %s\n", in qca_uart_probe()
364 qcauart_dev->name); in qca_uart_probe()
369 dev_info(&serdev->dev, "Using baudrate: %u\n", speed); in qca_uart_probe()
375 dev_err(&serdev->dev, "Unable to register net device %s\n", in qca_uart_probe()
376 qcauart_dev->name); in qca_uart_probe()
378 cancel_work_sync(&qca->tx_work); in qca_uart_probe()
393 unregister_netdev(qca->net_dev); in qca_uart_remove()
397 cancel_work_sync(&qca->tx_work); in qca_uart_remove()
399 free_netdev(qca->net_dev); in qca_uart_remove()