2 * Copyright (c) 2011, 2012, Qualcomm Atheros Communications Inc.
3 * Copyright (c) 2017, I2SE GmbH
5 * Permission to use, copy, modify, and/or distribute this software
6 * for any purpose with or without fee is hereby granted, provided
7 * that the above copyright notice and this permission notice appear
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
13 * THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR
14 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
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.
20 /* This module implements the Qualcomm Atheros UART protocol for
21 * kernel-based UART device; it is essentially an Ethernet-to-UART
25 #include <linux/device.h>
26 #include <linux/errno.h>
27 #include <linux/etherdevice.h>
28 #include <linux/if_arp.h>
29 #include <linux/if_ether.h>
30 #include <linux/jiffies.h>
31 #include <linux/kernel.h>
32 #include <linux/module.h>
33 #include <linux/netdevice.h>
35 #include <linux/of_device.h>
36 #include <linux/of_net.h>
37 #include <linux/sched.h>
38 #include <linux/serdev.h>
39 #include <linux/skbuff.h>
40 #include <linux/types.h>
42 #include "qca_7k_common.h"
44 #define QCAUART_DRV_VERSION "0.1.0"
45 #define QCAUART_DRV_NAME "qcauart"
46 #define QCAUART_TX_TIMEOUT (1 * HZ)
49 struct net_device
*net_dev
;
50 spinlock_t lock
; /* transmit lock */
51 struct work_struct tx_work
; /* Flushes transmit buffer */
53 struct serdev_device
*serdev
;
54 struct qcafrm_handle frm_handle
;
55 struct sk_buff
*rx_skb
;
57 unsigned char *tx_head
; /* pointer to next XMIT byte */
58 int tx_left
; /* bytes left in XMIT queue */
59 unsigned char *tx_buffer
;
63 qca_tty_receive(struct serdev_device
*serdev
, const unsigned char *data
,
66 struct qcauart
*qca
= serdev_device_get_drvdata(serdev
);
67 struct net_device
*netdev
= qca
->net_dev
;
68 struct net_device_stats
*n_stats
= &netdev
->stats
;
72 qca
->rx_skb
= netdev_alloc_skb_ip_align(netdev
,
77 n_stats
->rx_dropped
++;
82 for (i
= 0; i
< count
; i
++) {
85 retcode
= qcafrm_fsm_decode(&qca
->frm_handle
,
87 skb_tailroom(qca
->rx_skb
),
95 netdev_dbg(netdev
, "recv: no RX tail\n");
97 n_stats
->rx_dropped
++;
100 netdev_dbg(netdev
, "recv: invalid RX length\n");
101 n_stats
->rx_errors
++;
102 n_stats
->rx_dropped
++;
105 n_stats
->rx_packets
++;
106 n_stats
->rx_bytes
+= retcode
;
107 skb_put(qca
->rx_skb
, retcode
);
108 qca
->rx_skb
->protocol
= eth_type_trans(
109 qca
->rx_skb
, qca
->rx_skb
->dev
);
110 qca
->rx_skb
->ip_summed
= CHECKSUM_UNNECESSARY
;
111 netif_rx_ni(qca
->rx_skb
);
112 qca
->rx_skb
= netdev_alloc_skb_ip_align(netdev
,
116 netdev_dbg(netdev
, "recv: out of RX resources\n");
117 n_stats
->rx_errors
++;
126 /* Write out any remaining transmit buffer. Scheduled when tty is writable */
127 static void qcauart_transmit(struct work_struct
*work
)
129 struct qcauart
*qca
= container_of(work
, struct qcauart
, tx_work
);
130 struct net_device_stats
*n_stats
= &qca
->net_dev
->stats
;
133 spin_lock_bh(&qca
->lock
);
135 /* First make sure we're connected. */
136 if (!netif_running(qca
->net_dev
)) {
137 spin_unlock_bh(&qca
->lock
);
141 if (qca
->tx_left
<= 0) {
142 /* Now serial buffer is almost free & we can start
143 * transmission of another packet
145 n_stats
->tx_packets
++;
146 spin_unlock_bh(&qca
->lock
);
147 netif_wake_queue(qca
->net_dev
);
151 written
= serdev_device_write_buf(qca
->serdev
, qca
->tx_head
,
154 qca
->tx_left
-= written
;
155 qca
->tx_head
+= written
;
157 spin_unlock_bh(&qca
->lock
);
160 /* Called by the driver when there's room for more data.
161 * Schedule the transmit.
163 static void qca_tty_wakeup(struct serdev_device
*serdev
)
165 struct qcauart
*qca
= serdev_device_get_drvdata(serdev
);
167 schedule_work(&qca
->tx_work
);
170 static struct serdev_device_ops qca_serdev_ops
= {
171 .receive_buf
= qca_tty_receive
,
172 .write_wakeup
= qca_tty_wakeup
,
175 static int qcauart_netdev_open(struct net_device
*dev
)
177 struct qcauart
*qca
= netdev_priv(dev
);
179 netif_start_queue(qca
->net_dev
);
184 static int qcauart_netdev_close(struct net_device
*dev
)
186 struct qcauart
*qca
= netdev_priv(dev
);
188 netif_stop_queue(dev
);
189 flush_work(&qca
->tx_work
);
191 spin_lock_bh(&qca
->lock
);
193 spin_unlock_bh(&qca
->lock
);
199 qcauart_netdev_xmit(struct sk_buff
*skb
, struct net_device
*dev
)
201 struct net_device_stats
*n_stats
= &dev
->stats
;
202 struct qcauart
*qca
= netdev_priv(dev
);
207 spin_lock(&qca
->lock
);
209 WARN_ON(qca
->tx_left
);
211 if (!netif_running(dev
)) {
212 spin_unlock(&qca
->lock
);
213 netdev_warn(qca
->net_dev
, "xmit: iface is down\n");
217 pos
= qca
->tx_buffer
;
219 if (skb
->len
< QCAFRM_MIN_LEN
)
220 pad_len
= QCAFRM_MIN_LEN
- skb
->len
;
222 pos
+= qcafrm_create_header(pos
, skb
->len
+ pad_len
);
224 memcpy(pos
, skb
->data
, skb
->len
);
228 memset(pos
, 0, pad_len
);
232 pos
+= qcafrm_create_footer(pos
);
234 netif_stop_queue(qca
->net_dev
);
236 written
= serdev_device_write_buf(qca
->serdev
, qca
->tx_buffer
,
237 pos
- qca
->tx_buffer
);
239 qca
->tx_left
= (pos
- qca
->tx_buffer
) - written
;
240 qca
->tx_head
= qca
->tx_buffer
+ written
;
241 n_stats
->tx_bytes
+= written
;
243 spin_unlock(&qca
->lock
);
245 netif_trans_update(dev
);
247 dev_kfree_skb_any(skb
);
251 static void qcauart_netdev_tx_timeout(struct net_device
*dev
, unsigned int txqueue
)
253 struct qcauart
*qca
= netdev_priv(dev
);
255 netdev_info(qca
->net_dev
, "Transmit timeout at %ld, latency %ld\n",
256 jiffies
, dev_trans_start(dev
));
257 dev
->stats
.tx_errors
++;
258 dev
->stats
.tx_dropped
++;
261 static int qcauart_netdev_init(struct net_device
*dev
)
263 struct qcauart
*qca
= netdev_priv(dev
);
266 /* Finish setting up the device info. */
267 dev
->mtu
= QCAFRM_MAX_MTU
;
268 dev
->type
= ARPHRD_ETHER
;
270 len
= QCAFRM_HEADER_LEN
+ QCAFRM_MAX_LEN
+ QCAFRM_FOOTER_LEN
;
271 qca
->tx_buffer
= devm_kmalloc(&qca
->serdev
->dev
, len
, GFP_KERNEL
);
275 qca
->rx_skb
= netdev_alloc_skb_ip_align(qca
->net_dev
,
284 static void qcauart_netdev_uninit(struct net_device
*dev
)
286 struct qcauart
*qca
= netdev_priv(dev
);
288 dev_kfree_skb(qca
->rx_skb
);
291 static const struct net_device_ops qcauart_netdev_ops
= {
292 .ndo_init
= qcauart_netdev_init
,
293 .ndo_uninit
= qcauart_netdev_uninit
,
294 .ndo_open
= qcauart_netdev_open
,
295 .ndo_stop
= qcauart_netdev_close
,
296 .ndo_start_xmit
= qcauart_netdev_xmit
,
297 .ndo_set_mac_address
= eth_mac_addr
,
298 .ndo_tx_timeout
= qcauart_netdev_tx_timeout
,
299 .ndo_validate_addr
= eth_validate_addr
,
302 static void qcauart_netdev_setup(struct net_device
*dev
)
304 dev
->netdev_ops
= &qcauart_netdev_ops
;
305 dev
->watchdog_timeo
= QCAUART_TX_TIMEOUT
;
306 dev
->priv_flags
&= ~IFF_TX_SKB_SHARING
;
307 dev
->tx_queue_len
= 100;
309 /* MTU range: 46 - 1500 */
310 dev
->min_mtu
= QCAFRM_MIN_MTU
;
311 dev
->max_mtu
= QCAFRM_MAX_MTU
;
314 static const struct of_device_id qca_uart_of_match
[] = {
316 .compatible
= "qca,qca7000",
320 MODULE_DEVICE_TABLE(of
, qca_uart_of_match
);
322 static int qca_uart_probe(struct serdev_device
*serdev
)
324 struct net_device
*qcauart_dev
= alloc_etherdev(sizeof(struct qcauart
));
333 qcauart_netdev_setup(qcauart_dev
);
334 SET_NETDEV_DEV(qcauart_dev
, &serdev
->dev
);
336 qca
= netdev_priv(qcauart_dev
);
338 pr_err("qca_uart: Fail to retrieve private structure\n");
342 qca
->net_dev
= qcauart_dev
;
343 qca
->serdev
= serdev
;
344 qcafrm_fsm_init_uart(&qca
->frm_handle
);
346 spin_lock_init(&qca
->lock
);
347 INIT_WORK(&qca
->tx_work
, qcauart_transmit
);
349 of_property_read_u32(serdev
->dev
.of_node
, "current-speed", &speed
);
351 mac
= of_get_mac_address(serdev
->dev
.of_node
);
354 ether_addr_copy(qca
->net_dev
->dev_addr
, mac
);
356 if (!is_valid_ether_addr(qca
->net_dev
->dev_addr
)) {
357 eth_hw_addr_random(qca
->net_dev
);
358 dev_info(&serdev
->dev
, "Using random MAC address: %pM\n",
359 qca
->net_dev
->dev_addr
);
362 netif_carrier_on(qca
->net_dev
);
363 serdev_device_set_drvdata(serdev
, qca
);
364 serdev_device_set_client_ops(serdev
, &qca_serdev_ops
);
366 ret
= serdev_device_open(serdev
);
368 dev_err(&serdev
->dev
, "Unable to open device %s\n",
373 speed
= serdev_device_set_baudrate(serdev
, speed
);
374 dev_info(&serdev
->dev
, "Using baudrate: %u\n", speed
);
376 serdev_device_set_flow_control(serdev
, false);
378 ret
= register_netdev(qcauart_dev
);
380 dev_err(&serdev
->dev
, "Unable to register net device %s\n",
382 serdev_device_close(serdev
);
383 cancel_work_sync(&qca
->tx_work
);
390 free_netdev(qcauart_dev
);
394 static void qca_uart_remove(struct serdev_device
*serdev
)
396 struct qcauart
*qca
= serdev_device_get_drvdata(serdev
);
398 unregister_netdev(qca
->net_dev
);
400 /* Flush any pending characters in the driver. */
401 serdev_device_close(serdev
);
402 cancel_work_sync(&qca
->tx_work
);
404 free_netdev(qca
->net_dev
);
407 static struct serdev_device_driver qca_uart_driver
= {
408 .probe
= qca_uart_probe
,
409 .remove
= qca_uart_remove
,
411 .name
= QCAUART_DRV_NAME
,
412 .of_match_table
= of_match_ptr(qca_uart_of_match
),
416 module_serdev_device_driver(qca_uart_driver
);
418 MODULE_DESCRIPTION("Qualcomm Atheros QCA7000 UART Driver");
419 MODULE_AUTHOR("Qualcomm Atheros Communications");
420 MODULE_AUTHOR("Stefan Wahren <stefan.wahren@i2se.com>");
421 MODULE_LICENSE("Dual BSD/GPL");
422 MODULE_VERSION(QCAUART_DRV_VERSION
);