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
)
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
);
289 dev_kfree_skb(qca
->rx_skb
);
292 static const struct net_device_ops qcauart_netdev_ops
= {
293 .ndo_init
= qcauart_netdev_init
,
294 .ndo_uninit
= qcauart_netdev_uninit
,
295 .ndo_open
= qcauart_netdev_open
,
296 .ndo_stop
= qcauart_netdev_close
,
297 .ndo_start_xmit
= qcauart_netdev_xmit
,
298 .ndo_set_mac_address
= eth_mac_addr
,
299 .ndo_tx_timeout
= qcauart_netdev_tx_timeout
,
300 .ndo_validate_addr
= eth_validate_addr
,
303 static void qcauart_netdev_setup(struct net_device
*dev
)
305 dev
->netdev_ops
= &qcauart_netdev_ops
;
306 dev
->watchdog_timeo
= QCAUART_TX_TIMEOUT
;
307 dev
->priv_flags
&= ~IFF_TX_SKB_SHARING
;
308 dev
->tx_queue_len
= 100;
310 /* MTU range: 46 - 1500 */
311 dev
->min_mtu
= QCAFRM_MIN_MTU
;
312 dev
->max_mtu
= QCAFRM_MAX_MTU
;
315 static const struct of_device_id qca_uart_of_match
[] = {
317 .compatible
= "qca,qca7000",
321 MODULE_DEVICE_TABLE(of
, qca_uart_of_match
);
323 static int qca_uart_probe(struct serdev_device
*serdev
)
325 struct net_device
*qcauart_dev
= alloc_etherdev(sizeof(struct qcauart
));
334 qcauart_netdev_setup(qcauart_dev
);
335 SET_NETDEV_DEV(qcauart_dev
, &serdev
->dev
);
337 qca
= netdev_priv(qcauart_dev
);
339 pr_err("qca_uart: Fail to retrieve private structure\n");
343 qca
->net_dev
= qcauart_dev
;
344 qca
->serdev
= serdev
;
345 qcafrm_fsm_init_uart(&qca
->frm_handle
);
347 spin_lock_init(&qca
->lock
);
348 INIT_WORK(&qca
->tx_work
, qcauart_transmit
);
350 of_property_read_u32(serdev
->dev
.of_node
, "current-speed", &speed
);
352 mac
= of_get_mac_address(serdev
->dev
.of_node
);
355 ether_addr_copy(qca
->net_dev
->dev_addr
, mac
);
357 if (!is_valid_ether_addr(qca
->net_dev
->dev_addr
)) {
358 eth_hw_addr_random(qca
->net_dev
);
359 dev_info(&serdev
->dev
, "Using random MAC address: %pM\n",
360 qca
->net_dev
->dev_addr
);
363 netif_carrier_on(qca
->net_dev
);
364 serdev_device_set_drvdata(serdev
, qca
);
365 serdev_device_set_client_ops(serdev
, &qca_serdev_ops
);
367 ret
= serdev_device_open(serdev
);
369 dev_err(&serdev
->dev
, "Unable to open device %s\n",
374 speed
= serdev_device_set_baudrate(serdev
, speed
);
375 dev_info(&serdev
->dev
, "Using baudrate: %u\n", speed
);
377 serdev_device_set_flow_control(serdev
, false);
379 ret
= register_netdev(qcauart_dev
);
381 dev_err(&serdev
->dev
, "Unable to register net device %s\n",
383 serdev_device_close(serdev
);
384 cancel_work_sync(&qca
->tx_work
);
391 free_netdev(qcauart_dev
);
395 static void qca_uart_remove(struct serdev_device
*serdev
)
397 struct qcauart
*qca
= serdev_device_get_drvdata(serdev
);
399 unregister_netdev(qca
->net_dev
);
401 /* Flush any pending characters in the driver. */
402 serdev_device_close(serdev
);
403 cancel_work_sync(&qca
->tx_work
);
405 free_netdev(qca
->net_dev
);
408 static struct serdev_device_driver qca_uart_driver
= {
409 .probe
= qca_uart_probe
,
410 .remove
= qca_uart_remove
,
412 .name
= QCAUART_DRV_NAME
,
413 .of_match_table
= of_match_ptr(qca_uart_of_match
),
417 module_serdev_device_driver(qca_uart_driver
);
419 MODULE_DESCRIPTION("Qualcomm Atheros QCA7000 UART Driver");
420 MODULE_AUTHOR("Qualcomm Atheros Communications");
421 MODULE_AUTHOR("Stefan Wahren <stefan.wahren@i2se.com>");
422 MODULE_LICENSE("Dual BSD/GPL");
423 MODULE_VERSION(QCAUART_DRV_VERSION
);