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>
49 spinlock_t lock; /* transmit lock */ member
65 struct net_device *netdev = qca->net_dev; in qca_tty_receive()
66 struct net_device_stats *n_stats = &netdev->stats; in qca_tty_receive()
69 if (!qca->rx_skb) { in qca_tty_receive()
70 qca->rx_skb = netdev_alloc_skb_ip_align(netdev, in qca_tty_receive()
71 netdev->mtu + in qca_tty_receive()
73 if (!qca->rx_skb) { in qca_tty_receive()
74 n_stats->rx_errors++; in qca_tty_receive()
75 n_stats->rx_dropped++; in qca_tty_receive()
83 retcode = qcafrm_fsm_decode(&qca->frm_handle, in qca_tty_receive()
84 qca->rx_skb->data, in qca_tty_receive()
85 skb_tailroom(qca->rx_skb), in qca_tty_receive()
94 n_stats->rx_errors++; in qca_tty_receive()
95 n_stats->rx_dropped++; in qca_tty_receive()
99 n_stats->rx_errors++; in qca_tty_receive()
100 n_stats->rx_dropped++; in qca_tty_receive()
103 n_stats->rx_packets++; in qca_tty_receive()
104 n_stats->rx_bytes += retcode; in qca_tty_receive()
105 skb_put(qca->rx_skb, retcode); in qca_tty_receive()
106 qca->rx_skb->protocol = eth_type_trans( in qca_tty_receive()
107 qca->rx_skb, qca->rx_skb->dev); in qca_tty_receive()
108 skb_checksum_none_assert(qca->rx_skb); in qca_tty_receive()
109 netif_rx(qca->rx_skb); in qca_tty_receive()
110 qca->rx_skb = netdev_alloc_skb_ip_align(netdev, in qca_tty_receive()
111 netdev->mtu + in qca_tty_receive()
113 if (!qca->rx_skb) { in qca_tty_receive()
114 netdev_dbg(netdev, "recv: out of RX resources\n"); in qca_tty_receive()
115 n_stats->rx_errors++; in qca_tty_receive()
128 struct net_device_stats *n_stats = &qca->net_dev->stats; in qcauart_transmit()
131 spin_lock_bh(&qca->lock); in qcauart_transmit()
134 if (!netif_running(qca->net_dev)) { in qcauart_transmit()
135 spin_unlock_bh(&qca->lock); in qcauart_transmit()
139 if (qca->tx_left <= 0) { in qcauart_transmit()
141 * transmission of another packet in qcauart_transmit()
143 n_stats->tx_packets++; in qcauart_transmit()
144 spin_unlock_bh(&qca->lock); in qcauart_transmit()
145 netif_wake_queue(qca->net_dev); in qcauart_transmit()
149 written = serdev_device_write_buf(qca->serdev, qca->tx_head, in qcauart_transmit()
150 qca->tx_left); in qcauart_transmit()
152 qca->tx_left -= written; in qcauart_transmit()
153 qca->tx_head += written; in qcauart_transmit()
155 spin_unlock_bh(&qca->lock); in qcauart_transmit()
165 schedule_work(&qca->tx_work); in qca_tty_wakeup()
177 netif_start_queue(qca->net_dev); in qcauart_netdev_open()
187 flush_work(&qca->tx_work); in qcauart_netdev_close()
189 spin_lock_bh(&qca->lock); in qcauart_netdev_close()
190 qca->tx_left = 0; in qcauart_netdev_close()
191 spin_unlock_bh(&qca->lock); in qcauart_netdev_close()
199 struct net_device_stats *n_stats = &dev->stats; in qcauart_netdev_xmit()
205 spin_lock(&qca->lock); in qcauart_netdev_xmit()
207 WARN_ON(qca->tx_left); in qcauart_netdev_xmit()
210 spin_unlock(&qca->lock); in qcauart_netdev_xmit()
211 netdev_warn(qca->net_dev, "xmit: iface is down\n"); in qcauart_netdev_xmit()
215 pos = qca->tx_buffer; in qcauart_netdev_xmit()
217 if (skb->len < QCAFRM_MIN_LEN) in qcauart_netdev_xmit()
218 pad_len = QCAFRM_MIN_LEN - skb->len; in qcauart_netdev_xmit()
220 pos += qcafrm_create_header(pos, skb->len + pad_len); in qcauart_netdev_xmit()
222 memcpy(pos, skb->data, skb->len); in qcauart_netdev_xmit()
223 pos += skb->len; in qcauart_netdev_xmit()
232 netif_stop_queue(qca->net_dev); in qcauart_netdev_xmit()
234 written = serdev_device_write_buf(qca->serdev, qca->tx_buffer, in qcauart_netdev_xmit()
235 pos - qca->tx_buffer); in qcauart_netdev_xmit()
237 qca->tx_left = (pos - qca->tx_buffer) - written; in qcauart_netdev_xmit()
238 qca->tx_head = qca->tx_buffer + written; in qcauart_netdev_xmit()
239 n_stats->tx_bytes += written; in qcauart_netdev_xmit()
241 spin_unlock(&qca->lock); in qcauart_netdev_xmit()
253 netdev_info(qca->net_dev, "Transmit timeout at %ld, latency %ld\n", in qcauart_netdev_tx_timeout()
255 dev->stats.tx_errors++; in qcauart_netdev_tx_timeout()
256 dev->stats.tx_dropped++; in qcauart_netdev_tx_timeout()
265 dev->mtu = QCAFRM_MAX_MTU; in qcauart_netdev_init()
266 dev->type = ARPHRD_ETHER; in qcauart_netdev_init()
269 qca->tx_buffer = devm_kmalloc(&qca->serdev->dev, len, GFP_KERNEL); in qcauart_netdev_init()
270 if (!qca->tx_buffer) in qcauart_netdev_init()
271 return -ENOMEM; in qcauart_netdev_init()
273 qca->rx_skb = netdev_alloc_skb_ip_align(qca->net_dev, in qcauart_netdev_init()
274 qca->net_dev->mtu + in qcauart_netdev_init()
276 if (!qca->rx_skb) in qcauart_netdev_init()
277 return -ENOBUFS; in qcauart_netdev_init()
286 dev_kfree_skb(qca->rx_skb); in qcauart_netdev_uninit()
302 dev->netdev_ops = &qcauart_netdev_ops; in qcauart_netdev_setup()
303 dev->watchdog_timeo = QCAUART_TX_TIMEOUT; in qcauart_netdev_setup()
304 dev->priv_flags &= ~IFF_TX_SKB_SHARING; in qcauart_netdev_setup()
305 dev->tx_queue_len = 100; in qcauart_netdev_setup()
307 /* MTU range: 46 - 1500 */ in qcauart_netdev_setup()
308 dev->min_mtu = QCAFRM_MIN_MTU; in qcauart_netdev_setup()
309 dev->max_mtu = QCAFRM_MAX_MTU; in qcauart_netdev_setup()
318 MODULE_DEVICE_TABLE(of, qca_uart_of_match);
328 return -ENOMEM; in qca_uart_probe()
331 SET_NETDEV_DEV(qcauart_dev, &serdev->dev); in qca_uart_probe()
336 ret = -ENOMEM; in qca_uart_probe()
339 qca->net_dev = qcauart_dev; in qca_uart_probe()
340 qca->serdev = serdev; in qca_uart_probe()
341 qcafrm_fsm_init_uart(&qca->frm_handle); in qca_uart_probe()
343 spin_lock_init(&qca->lock); in qca_uart_probe()
344 INIT_WORK(&qca->tx_work, qcauart_transmit); in qca_uart_probe()
346 of_property_read_u32(serdev->dev.of_node, "current-speed", &speed); in qca_uart_probe()
348 ret = of_get_ethdev_address(serdev->dev.of_node, qca->net_dev); in qca_uart_probe()
350 eth_hw_addr_random(qca->net_dev); in qca_uart_probe()
351 dev_info(&serdev->dev, "Using random MAC address: %pM\n", in qca_uart_probe()
352 qca->net_dev->dev_addr); in qca_uart_probe()
355 netif_carrier_on(qca->net_dev); in qca_uart_probe()
361 dev_err(&serdev->dev, "Unable to open device %s\n", in qca_uart_probe()
362 qcauart_dev->name); in qca_uart_probe()
367 dev_info(&serdev->dev, "Using baudrate: %u\n", speed); in qca_uart_probe()
373 dev_err(&serdev->dev, "Unable to register net device %s\n", in qca_uart_probe()
374 qcauart_dev->name); in qca_uart_probe()
376 cancel_work_sync(&qca->tx_work); in qca_uart_probe()
391 unregister_netdev(qca->net_dev); in qca_uart_remove()
395 cancel_work_sync(&qca->tx_work); in qca_uart_remove()
397 free_netdev(qca->net_dev); in qca_uart_remove()