1 // SPDX-License-Identifier: GPL-2.0-only
5 * Implementation of the SSI McSAAB improved protocol.
7 * Copyright (C) 2010 Nokia Corporation. All rights reserved.
8 * Copyright (C) 2013 Sebastian Reichel <sre@kernel.org>
10 * Contact: Carlos Chinea <carlos.chinea@nokia.com>
13 #include <linux/atomic.h>
14 #include <linux/clk.h>
15 #include <linux/device.h>
16 #include <linux/err.h>
17 #include <linux/gpio.h>
18 #include <linux/if_ether.h>
19 #include <linux/if_arp.h>
20 #include <linux/if_phonet.h>
21 #include <linux/init.h>
22 #include <linux/irq.h>
23 #include <linux/list.h>
24 #include <linux/module.h>
25 #include <linux/netdevice.h>
26 #include <linux/notifier.h>
27 #include <linux/scatterlist.h>
28 #include <linux/skbuff.h>
29 #include <linux/slab.h>
30 #include <linux/spinlock.h>
31 #include <linux/timer.h>
32 #include <linux/hsi/hsi.h>
33 #include <linux/hsi/ssi_protocol.h>
35 void ssi_waketest(struct hsi_client
*cl
, unsigned int enable
);
37 #define SSIP_TXQUEUE_LEN 100
38 #define SSIP_MAX_MTU 65535
39 #define SSIP_DEFAULT_MTU 4000
40 #define PN_MEDIA_SOS 21
41 #define SSIP_MIN_PN_HDR 6 /* FIXME: Revisit */
42 #define SSIP_WDTOUT 2000 /* FIXME: has to be 500 msecs */
43 #define SSIP_KATOUT 15 /* 15 msecs */
44 #define SSIP_MAX_CMDS 5 /* Number of pre-allocated commands buffers */
45 #define SSIP_BYTES_TO_FRAMES(x) ((((x) - 1) >> 2) + 1)
46 #define SSIP_CMT_LOADER_SYNC 0x11223344
48 * SSI protocol command definitions
50 #define SSIP_COMMAND(data) ((data) >> 28)
51 #define SSIP_PAYLOAD(data) ((data) & 0xfffffff)
53 #define SSIP_SW_BREAK 0
54 #define SSIP_BOOTINFO_REQ 1
55 #define SSIP_BOOTINFO_RESP 2
56 #define SSIP_WAKETEST_RESULT 3
57 #define SSIP_START_TRANS 4
60 #define SSIP_DATA_VERSION(data) ((data) & 0xff)
61 #define SSIP_LOCAL_VERID 1
62 #define SSIP_WAKETEST_OK 0
63 #define SSIP_WAKETEST_FAILED 1
64 #define SSIP_PDU_LENGTH(data) (((data) >> 8) & 0xffff)
65 #define SSIP_MSG_ID(data) ((data) & 0xff)
67 #define SSIP_CMD(cmd, payload) (((cmd) << 28) | ((payload) & 0xfffffff))
68 /* Commands for the control channel */
69 #define SSIP_BOOTINFO_REQ_CMD(ver) \
70 SSIP_CMD(SSIP_BOOTINFO_REQ, SSIP_DATA_VERSION(ver))
71 #define SSIP_BOOTINFO_RESP_CMD(ver) \
72 SSIP_CMD(SSIP_BOOTINFO_RESP, SSIP_DATA_VERSION(ver))
73 #define SSIP_START_TRANS_CMD(pdulen, id) \
74 SSIP_CMD(SSIP_START_TRANS, (((pdulen) << 8) | SSIP_MSG_ID(id)))
75 #define SSIP_READY_CMD SSIP_CMD(SSIP_READY, 0)
76 #define SSIP_SWBREAK_CMD SSIP_CMD(SSIP_SW_BREAK, 0)
78 #define SSIP_WAKETEST_FLAG 0
80 /* Main state machine states */
87 /* Send state machine states */
96 /* Receive state machine states */
104 * struct ssi_protocol - SSI protocol (McSAAB) data
105 * @main_state: Main state machine
106 * @send_state: TX state machine
107 * @recv_state: RX state machine
108 * @flags: Flags, currently only used to follow wake line test
111 * @txqueue_len: TX queue length
112 * @tx_wd: TX watchdog
113 * @rx_wd: RX watchdog
114 * @keep_alive: Workaround for SSI HW bug
115 * @lock: To serialize access to this struct
116 * @netdev: Phonet network device
117 * @txqueue: TX data queue
118 * @cmdqueue: Queue of free commands
119 * @cl: HSI client own reference
120 * @link: Link for ssip_list
121 * @tx_usecount: Refcount to keep track the slaves that use the wake line
122 * @channel_id_cmd: HSI channel id for command stream
123 * @channel_id_data: HSI channel id for data stream
125 struct ssi_protocol
{
126 unsigned int main_state
;
127 unsigned int send_state
;
128 unsigned int recv_state
;
132 unsigned int txqueue_len
;
133 struct timer_list tx_wd
;
134 struct timer_list rx_wd
;
135 struct timer_list keep_alive
; /* wake-up workaround */
137 struct net_device
*netdev
;
138 struct list_head txqueue
;
139 struct list_head cmdqueue
;
140 struct work_struct work
;
141 struct hsi_client
*cl
;
142 struct list_head link
;
148 /* List of ssi protocol instances */
149 static LIST_HEAD(ssip_list
);
151 static void ssip_rxcmd_complete(struct hsi_msg
*msg
);
153 static inline void ssip_set_cmd(struct hsi_msg
*msg
, u32 cmd
)
157 data
= sg_virt(msg
->sgt
.sgl
);
161 static inline u32
ssip_get_cmd(struct hsi_msg
*msg
)
165 data
= sg_virt(msg
->sgt
.sgl
);
170 static void ssip_skb_to_msg(struct sk_buff
*skb
, struct hsi_msg
*msg
)
173 struct scatterlist
*sg
;
176 BUG_ON(msg
->sgt
.nents
!= (unsigned int)(skb_shinfo(skb
)->nr_frags
+ 1));
179 sg_set_buf(sg
, skb
->data
, skb_headlen(skb
));
180 for (i
= 0; i
< skb_shinfo(skb
)->nr_frags
; i
++) {
183 frag
= &skb_shinfo(skb
)->frags
[i
];
184 sg_set_page(sg
, frag
->page
.p
, frag
->size
, frag
->page_offset
);
188 static void ssip_free_data(struct hsi_msg
*msg
)
193 pr_debug("free data: msg %p context %p skb %p\n", msg
, msg
->context
,
195 msg
->destructor
= NULL
;
200 static struct hsi_msg
*ssip_alloc_data(struct ssi_protocol
*ssi
,
201 struct sk_buff
*skb
, gfp_t flags
)
205 msg
= hsi_alloc_msg(skb_shinfo(skb
)->nr_frags
+ 1, flags
);
208 ssip_skb_to_msg(skb
, msg
);
209 msg
->destructor
= ssip_free_data
;
210 msg
->channel
= ssi
->channel_id_data
;
216 static inline void ssip_release_cmd(struct hsi_msg
*msg
)
218 struct ssi_protocol
*ssi
= hsi_client_drvdata(msg
->cl
);
220 dev_dbg(&msg
->cl
->device
, "Release cmd 0x%08x\n", ssip_get_cmd(msg
));
221 spin_lock_bh(&ssi
->lock
);
222 list_add_tail(&msg
->link
, &ssi
->cmdqueue
);
223 spin_unlock_bh(&ssi
->lock
);
226 static struct hsi_msg
*ssip_claim_cmd(struct ssi_protocol
*ssi
)
230 BUG_ON(list_empty(&ssi
->cmdqueue
));
232 spin_lock_bh(&ssi
->lock
);
233 msg
= list_first_entry(&ssi
->cmdqueue
, struct hsi_msg
, link
);
234 list_del(&msg
->link
);
235 spin_unlock_bh(&ssi
->lock
);
236 msg
->destructor
= ssip_release_cmd
;
241 static void ssip_free_cmds(struct ssi_protocol
*ssi
)
243 struct hsi_msg
*msg
, *tmp
;
245 list_for_each_entry_safe(msg
, tmp
, &ssi
->cmdqueue
, link
) {
246 list_del(&msg
->link
);
247 msg
->destructor
= NULL
;
248 kfree(sg_virt(msg
->sgt
.sgl
));
253 static int ssip_alloc_cmds(struct ssi_protocol
*ssi
)
259 for (i
= 0; i
< SSIP_MAX_CMDS
; i
++) {
260 msg
= hsi_alloc_msg(1, GFP_KERNEL
);
263 buf
= kmalloc(sizeof(*buf
), GFP_KERNEL
);
268 sg_init_one(msg
->sgt
.sgl
, buf
, sizeof(*buf
));
269 msg
->channel
= ssi
->channel_id_cmd
;
270 list_add_tail(&msg
->link
, &ssi
->cmdqueue
);
280 static void ssip_set_rxstate(struct ssi_protocol
*ssi
, unsigned int state
)
282 ssi
->recv_state
= state
;
285 del_timer(&ssi
->rx_wd
);
286 if (ssi
->send_state
== SEND_IDLE
)
287 del_timer(&ssi
->keep_alive
);
290 /* CMT speech workaround */
291 if (atomic_read(&ssi
->tx_usecnt
))
293 /* Otherwise fall through */
295 mod_timer(&ssi
->keep_alive
, jiffies
+
296 msecs_to_jiffies(SSIP_KATOUT
));
297 mod_timer(&ssi
->rx_wd
, jiffies
+ msecs_to_jiffies(SSIP_WDTOUT
));
304 static void ssip_set_txstate(struct ssi_protocol
*ssi
, unsigned int state
)
306 ssi
->send_state
= state
;
310 del_timer(&ssi
->tx_wd
);
311 if (ssi
->recv_state
== RECV_IDLE
)
312 del_timer(&ssi
->keep_alive
);
316 case SENDING_SWBREAK
:
317 mod_timer(&ssi
->keep_alive
,
318 jiffies
+ msecs_to_jiffies(SSIP_KATOUT
));
319 mod_timer(&ssi
->tx_wd
, jiffies
+ msecs_to_jiffies(SSIP_WDTOUT
));
326 struct hsi_client
*ssip_slave_get_master(struct hsi_client
*slave
)
328 struct hsi_client
*master
= ERR_PTR(-ENODEV
);
329 struct ssi_protocol
*ssi
;
331 list_for_each_entry(ssi
, &ssip_list
, link
)
332 if (slave
->device
.parent
== ssi
->cl
->device
.parent
) {
339 EXPORT_SYMBOL_GPL(ssip_slave_get_master
);
341 int ssip_slave_start_tx(struct hsi_client
*master
)
343 struct ssi_protocol
*ssi
= hsi_client_drvdata(master
);
345 dev_dbg(&master
->device
, "start TX %d\n", atomic_read(&ssi
->tx_usecnt
));
346 spin_lock_bh(&ssi
->lock
);
347 if (ssi
->send_state
== SEND_IDLE
) {
348 ssip_set_txstate(ssi
, WAIT4READY
);
349 hsi_start_tx(master
);
351 spin_unlock_bh(&ssi
->lock
);
352 atomic_inc(&ssi
->tx_usecnt
);
356 EXPORT_SYMBOL_GPL(ssip_slave_start_tx
);
358 int ssip_slave_stop_tx(struct hsi_client
*master
)
360 struct ssi_protocol
*ssi
= hsi_client_drvdata(master
);
362 WARN_ON_ONCE(atomic_read(&ssi
->tx_usecnt
) == 0);
364 if (atomic_dec_and_test(&ssi
->tx_usecnt
)) {
365 spin_lock_bh(&ssi
->lock
);
366 if ((ssi
->send_state
== SEND_READY
) ||
367 (ssi
->send_state
== WAIT4READY
)) {
368 ssip_set_txstate(ssi
, SEND_IDLE
);
371 spin_unlock_bh(&ssi
->lock
);
373 dev_dbg(&master
->device
, "stop TX %d\n", atomic_read(&ssi
->tx_usecnt
));
377 EXPORT_SYMBOL_GPL(ssip_slave_stop_tx
);
379 int ssip_slave_running(struct hsi_client
*master
)
381 struct ssi_protocol
*ssi
= hsi_client_drvdata(master
);
382 return netif_running(ssi
->netdev
);
384 EXPORT_SYMBOL_GPL(ssip_slave_running
);
386 static void ssip_reset(struct hsi_client
*cl
)
388 struct ssi_protocol
*ssi
= hsi_client_drvdata(cl
);
389 struct list_head
*head
, *tmp
;
392 if (netif_running(ssi
->netdev
))
393 netif_carrier_off(ssi
->netdev
);
395 spin_lock_bh(&ssi
->lock
);
396 if (ssi
->send_state
!= SEND_IDLE
)
398 spin_unlock_bh(&ssi
->lock
);
399 if (test_and_clear_bit(SSIP_WAKETEST_FLAG
, &ssi
->flags
))
400 ssi_waketest(cl
, 0); /* FIXME: To be removed */
401 spin_lock_bh(&ssi
->lock
);
402 del_timer(&ssi
->rx_wd
);
403 del_timer(&ssi
->tx_wd
);
404 del_timer(&ssi
->keep_alive
);
411 list_for_each_safe(head
, tmp
, &ssi
->txqueue
) {
412 msg
= list_entry(head
, struct hsi_msg
, link
);
413 dev_dbg(&cl
->device
, "Pending TX data\n");
417 ssi
->txqueue_len
= 0;
418 spin_unlock_bh(&ssi
->lock
);
421 static void ssip_dump_state(struct hsi_client
*cl
)
423 struct ssi_protocol
*ssi
= hsi_client_drvdata(cl
);
426 spin_lock_bh(&ssi
->lock
);
427 dev_err(&cl
->device
, "Main state: %d\n", ssi
->main_state
);
428 dev_err(&cl
->device
, "Recv state: %d\n", ssi
->recv_state
);
429 dev_err(&cl
->device
, "Send state: %d\n", ssi
->send_state
);
430 dev_err(&cl
->device
, "CMT %s\n", (ssi
->main_state
== ACTIVE
) ?
431 "Online" : "Offline");
432 dev_err(&cl
->device
, "Wake test %d\n",
433 test_bit(SSIP_WAKETEST_FLAG
, &ssi
->flags
));
434 dev_err(&cl
->device
, "Data RX id: %d\n", ssi
->rxid
);
435 dev_err(&cl
->device
, "Data TX id: %d\n", ssi
->txid
);
437 list_for_each_entry(msg
, &ssi
->txqueue
, link
)
438 dev_err(&cl
->device
, "pending TX data (%p)\n", msg
);
439 spin_unlock_bh(&ssi
->lock
);
442 static void ssip_error(struct hsi_client
*cl
)
444 struct ssi_protocol
*ssi
= hsi_client_drvdata(cl
);
449 msg
= ssip_claim_cmd(ssi
);
450 msg
->complete
= ssip_rxcmd_complete
;
451 hsi_async_read(cl
, msg
);
454 static void ssip_keep_alive(struct timer_list
*t
)
456 struct ssi_protocol
*ssi
= from_timer(ssi
, t
, keep_alive
);
457 struct hsi_client
*cl
= ssi
->cl
;
459 dev_dbg(&cl
->device
, "Keep alive kick in: m(%d) r(%d) s(%d)\n",
460 ssi
->main_state
, ssi
->recv_state
, ssi
->send_state
);
462 spin_lock(&ssi
->lock
);
463 if (ssi
->recv_state
== RECV_IDLE
)
464 switch (ssi
->send_state
) {
466 if (atomic_read(&ssi
->tx_usecnt
) == 0)
469 * Fall through. Workaround for cmt-speech
470 * in that case we relay on audio timers.
473 spin_unlock(&ssi
->lock
);
476 mod_timer(&ssi
->keep_alive
, jiffies
+ msecs_to_jiffies(SSIP_KATOUT
));
477 spin_unlock(&ssi
->lock
);
480 static void ssip_rx_wd(struct timer_list
*t
)
482 struct ssi_protocol
*ssi
= from_timer(ssi
, t
, rx_wd
);
483 struct hsi_client
*cl
= ssi
->cl
;
485 dev_err(&cl
->device
, "Watchdog triggered\n");
489 static void ssip_tx_wd(struct timer_list
*t
)
491 struct ssi_protocol
*ssi
= from_timer(ssi
, t
, tx_wd
);
492 struct hsi_client
*cl
= ssi
->cl
;
494 dev_err(&cl
->device
, "Watchdog triggered\n");
498 static void ssip_send_bootinfo_req_cmd(struct hsi_client
*cl
)
500 struct ssi_protocol
*ssi
= hsi_client_drvdata(cl
);
503 dev_dbg(&cl
->device
, "Issuing BOOT INFO REQ command\n");
504 msg
= ssip_claim_cmd(ssi
);
505 ssip_set_cmd(msg
, SSIP_BOOTINFO_REQ_CMD(SSIP_LOCAL_VERID
));
506 msg
->complete
= ssip_release_cmd
;
507 hsi_async_write(cl
, msg
);
508 dev_dbg(&cl
->device
, "Issuing RX command\n");
509 msg
= ssip_claim_cmd(ssi
);
510 msg
->complete
= ssip_rxcmd_complete
;
511 hsi_async_read(cl
, msg
);
514 static void ssip_start_rx(struct hsi_client
*cl
)
516 struct ssi_protocol
*ssi
= hsi_client_drvdata(cl
);
519 dev_dbg(&cl
->device
, "RX start M(%d) R(%d)\n", ssi
->main_state
,
521 spin_lock_bh(&ssi
->lock
);
523 * We can have two UP events in a row due to a short low
524 * high transition. Therefore we need to ignore the sencond UP event.
526 if ((ssi
->main_state
!= ACTIVE
) || (ssi
->recv_state
== RECV_READY
)) {
527 spin_unlock_bh(&ssi
->lock
);
530 ssip_set_rxstate(ssi
, RECV_READY
);
531 spin_unlock_bh(&ssi
->lock
);
533 msg
= ssip_claim_cmd(ssi
);
534 ssip_set_cmd(msg
, SSIP_READY_CMD
);
535 msg
->complete
= ssip_release_cmd
;
536 dev_dbg(&cl
->device
, "Send READY\n");
537 hsi_async_write(cl
, msg
);
540 static void ssip_stop_rx(struct hsi_client
*cl
)
542 struct ssi_protocol
*ssi
= hsi_client_drvdata(cl
);
544 dev_dbg(&cl
->device
, "RX stop M(%d)\n", ssi
->main_state
);
545 spin_lock_bh(&ssi
->lock
);
546 if (likely(ssi
->main_state
== ACTIVE
))
547 ssip_set_rxstate(ssi
, RECV_IDLE
);
548 spin_unlock_bh(&ssi
->lock
);
551 static void ssip_free_strans(struct hsi_msg
*msg
)
553 ssip_free_data(msg
->context
);
554 ssip_release_cmd(msg
);
557 static void ssip_strans_complete(struct hsi_msg
*msg
)
559 struct hsi_client
*cl
= msg
->cl
;
560 struct ssi_protocol
*ssi
= hsi_client_drvdata(cl
);
561 struct hsi_msg
*data
;
564 ssip_release_cmd(msg
);
565 spin_lock_bh(&ssi
->lock
);
566 ssip_set_txstate(ssi
, SENDING
);
567 spin_unlock_bh(&ssi
->lock
);
568 hsi_async_write(cl
, data
);
571 static int ssip_xmit(struct hsi_client
*cl
)
573 struct ssi_protocol
*ssi
= hsi_client_drvdata(cl
);
574 struct hsi_msg
*msg
, *dmsg
;
577 spin_lock_bh(&ssi
->lock
);
578 if (list_empty(&ssi
->txqueue
)) {
579 spin_unlock_bh(&ssi
->lock
);
582 dmsg
= list_first_entry(&ssi
->txqueue
, struct hsi_msg
, link
);
583 list_del(&dmsg
->link
);
585 spin_unlock_bh(&ssi
->lock
);
587 msg
= ssip_claim_cmd(ssi
);
590 msg
->complete
= ssip_strans_complete
;
591 msg
->destructor
= ssip_free_strans
;
593 spin_lock_bh(&ssi
->lock
);
594 ssip_set_cmd(msg
, SSIP_START_TRANS_CMD(SSIP_BYTES_TO_FRAMES(skb
->len
),
597 ssip_set_txstate(ssi
, SENDING
);
598 spin_unlock_bh(&ssi
->lock
);
600 dev_dbg(&cl
->device
, "Send STRANS (%d frames)\n",
601 SSIP_BYTES_TO_FRAMES(skb
->len
));
603 return hsi_async_write(cl
, msg
);
606 /* In soft IRQ context */
607 static void ssip_pn_rx(struct sk_buff
*skb
)
609 struct net_device
*dev
= skb
->dev
;
611 if (unlikely(!netif_running(dev
))) {
612 dev_dbg(&dev
->dev
, "Drop RX packet\n");
613 dev
->stats
.rx_dropped
++;
617 if (unlikely(!pskb_may_pull(skb
, SSIP_MIN_PN_HDR
))) {
618 dev_dbg(&dev
->dev
, "Error drop RX packet\n");
619 dev
->stats
.rx_errors
++;
620 dev
->stats
.rx_length_errors
++;
624 dev
->stats
.rx_packets
++;
625 dev
->stats
.rx_bytes
+= skb
->len
;
627 /* length field is exchanged in network byte order */
628 ((u16
*)skb
->data
)[2] = ntohs(((u16
*)skb
->data
)[2]);
629 dev_dbg(&dev
->dev
, "RX length fixed (%04x -> %u)\n",
630 ((u16
*)skb
->data
)[2], ntohs(((u16
*)skb
->data
)[2]));
632 skb
->protocol
= htons(ETH_P_PHONET
);
633 skb_reset_mac_header(skb
);
638 static void ssip_rx_data_complete(struct hsi_msg
*msg
)
640 struct hsi_client
*cl
= msg
->cl
;
641 struct ssi_protocol
*ssi
= hsi_client_drvdata(cl
);
644 if (msg
->status
== HSI_STATUS_ERROR
) {
645 dev_err(&cl
->device
, "RX data error\n");
650 del_timer(&ssi
->rx_wd
); /* FIXME: Revisit */
656 static void ssip_rx_bootinforeq(struct hsi_client
*cl
, u32 cmd
)
658 struct ssi_protocol
*ssi
= hsi_client_drvdata(cl
);
661 /* Workaroud: Ignore CMT Loader message leftover */
662 if (cmd
== SSIP_CMT_LOADER_SYNC
)
665 switch (ssi
->main_state
) {
667 dev_err(&cl
->device
, "Boot info req on active state\n");
672 spin_lock_bh(&ssi
->lock
);
673 ssi
->main_state
= HANDSHAKE
;
674 spin_unlock_bh(&ssi
->lock
);
676 if (!test_and_set_bit(SSIP_WAKETEST_FLAG
, &ssi
->flags
))
677 ssi_waketest(cl
, 1); /* FIXME: To be removed */
679 spin_lock_bh(&ssi
->lock
);
680 /* Start boot handshake watchdog */
681 mod_timer(&ssi
->tx_wd
, jiffies
+ msecs_to_jiffies(SSIP_WDTOUT
));
682 spin_unlock_bh(&ssi
->lock
);
683 dev_dbg(&cl
->device
, "Send BOOTINFO_RESP\n");
684 if (SSIP_DATA_VERSION(cmd
) != SSIP_LOCAL_VERID
)
685 dev_warn(&cl
->device
, "boot info req verid mismatch\n");
686 msg
= ssip_claim_cmd(ssi
);
687 ssip_set_cmd(msg
, SSIP_BOOTINFO_RESP_CMD(SSIP_LOCAL_VERID
));
688 msg
->complete
= ssip_release_cmd
;
689 hsi_async_write(cl
, msg
);
692 dev_dbg(&cl
->device
, "Wrong state M(%d)\n", ssi
->main_state
);
697 static void ssip_rx_bootinforesp(struct hsi_client
*cl
, u32 cmd
)
699 struct ssi_protocol
*ssi
= hsi_client_drvdata(cl
);
701 if (SSIP_DATA_VERSION(cmd
) != SSIP_LOCAL_VERID
)
702 dev_warn(&cl
->device
, "boot info resp verid mismatch\n");
704 spin_lock_bh(&ssi
->lock
);
705 if (ssi
->main_state
!= ACTIVE
)
706 /* Use tx_wd as a boot watchdog in non ACTIVE state */
707 mod_timer(&ssi
->tx_wd
, jiffies
+ msecs_to_jiffies(SSIP_WDTOUT
));
709 dev_dbg(&cl
->device
, "boot info resp ignored M(%d)\n",
711 spin_unlock_bh(&ssi
->lock
);
714 static void ssip_rx_waketest(struct hsi_client
*cl
, u32 cmd
)
716 struct ssi_protocol
*ssi
= hsi_client_drvdata(cl
);
717 unsigned int wkres
= SSIP_PAYLOAD(cmd
);
719 spin_lock_bh(&ssi
->lock
);
720 if (ssi
->main_state
!= HANDSHAKE
) {
721 dev_dbg(&cl
->device
, "wake lines test ignored M(%d)\n",
723 spin_unlock_bh(&ssi
->lock
);
726 spin_unlock_bh(&ssi
->lock
);
728 if (test_and_clear_bit(SSIP_WAKETEST_FLAG
, &ssi
->flags
))
729 ssi_waketest(cl
, 0); /* FIXME: To be removed */
731 spin_lock_bh(&ssi
->lock
);
732 ssi
->main_state
= ACTIVE
;
733 del_timer(&ssi
->tx_wd
); /* Stop boot handshake timer */
734 spin_unlock_bh(&ssi
->lock
);
736 dev_notice(&cl
->device
, "WAKELINES TEST %s\n",
737 wkres
& SSIP_WAKETEST_FAILED
? "FAILED" : "OK");
738 if (wkres
& SSIP_WAKETEST_FAILED
) {
742 dev_dbg(&cl
->device
, "CMT is ONLINE\n");
743 netif_wake_queue(ssi
->netdev
);
744 netif_carrier_on(ssi
->netdev
);
747 static void ssip_rx_ready(struct hsi_client
*cl
)
749 struct ssi_protocol
*ssi
= hsi_client_drvdata(cl
);
751 spin_lock_bh(&ssi
->lock
);
752 if (unlikely(ssi
->main_state
!= ACTIVE
)) {
753 dev_dbg(&cl
->device
, "READY on wrong state: S(%d) M(%d)\n",
754 ssi
->send_state
, ssi
->main_state
);
755 spin_unlock_bh(&ssi
->lock
);
758 if (ssi
->send_state
!= WAIT4READY
) {
759 dev_dbg(&cl
->device
, "Ignore spurious READY command\n");
760 spin_unlock_bh(&ssi
->lock
);
763 ssip_set_txstate(ssi
, SEND_READY
);
764 spin_unlock_bh(&ssi
->lock
);
768 static void ssip_rx_strans(struct hsi_client
*cl
, u32 cmd
)
770 struct ssi_protocol
*ssi
= hsi_client_drvdata(cl
);
773 int len
= SSIP_PDU_LENGTH(cmd
);
775 dev_dbg(&cl
->device
, "RX strans: %d frames\n", len
);
776 spin_lock_bh(&ssi
->lock
);
777 if (unlikely(ssi
->main_state
!= ACTIVE
)) {
778 dev_err(&cl
->device
, "START TRANS wrong state: S(%d) M(%d)\n",
779 ssi
->send_state
, ssi
->main_state
);
780 spin_unlock_bh(&ssi
->lock
);
783 ssip_set_rxstate(ssi
, RECEIVING
);
784 if (unlikely(SSIP_MSG_ID(cmd
) != ssi
->rxid
)) {
785 dev_err(&cl
->device
, "START TRANS id %d expected %d\n",
786 SSIP_MSG_ID(cmd
), ssi
->rxid
);
787 spin_unlock_bh(&ssi
->lock
);
791 spin_unlock_bh(&ssi
->lock
);
792 skb
= netdev_alloc_skb(ssi
->netdev
, len
* 4);
793 if (unlikely(!skb
)) {
794 dev_err(&cl
->device
, "No memory for rx skb\n");
797 skb
->dev
= ssi
->netdev
;
798 skb_put(skb
, len
* 4);
799 msg
= ssip_alloc_data(ssi
, skb
, GFP_ATOMIC
);
800 if (unlikely(!msg
)) {
801 dev_err(&cl
->device
, "No memory for RX data msg\n");
804 msg
->complete
= ssip_rx_data_complete
;
805 hsi_async_read(cl
, msg
);
814 static void ssip_rxcmd_complete(struct hsi_msg
*msg
)
816 struct hsi_client
*cl
= msg
->cl
;
817 u32 cmd
= ssip_get_cmd(msg
);
818 unsigned int cmdid
= SSIP_COMMAND(cmd
);
820 if (msg
->status
== HSI_STATUS_ERROR
) {
821 dev_err(&cl
->device
, "RX error detected\n");
822 ssip_release_cmd(msg
);
826 hsi_async_read(cl
, msg
);
827 dev_dbg(&cl
->device
, "RX cmd: 0x%08x\n", cmd
);
832 case SSIP_BOOTINFO_REQ
:
833 ssip_rx_bootinforeq(cl
, cmd
);
835 case SSIP_BOOTINFO_RESP
:
836 ssip_rx_bootinforesp(cl
, cmd
);
838 case SSIP_WAKETEST_RESULT
:
839 ssip_rx_waketest(cl
, cmd
);
841 case SSIP_START_TRANS
:
842 ssip_rx_strans(cl
, cmd
);
848 dev_warn(&cl
->device
, "command 0x%08x not supported\n", cmd
);
853 static void ssip_swbreak_complete(struct hsi_msg
*msg
)
855 struct hsi_client
*cl
= msg
->cl
;
856 struct ssi_protocol
*ssi
= hsi_client_drvdata(cl
);
858 ssip_release_cmd(msg
);
859 spin_lock_bh(&ssi
->lock
);
860 if (list_empty(&ssi
->txqueue
)) {
861 if (atomic_read(&ssi
->tx_usecnt
)) {
862 ssip_set_txstate(ssi
, SEND_READY
);
864 ssip_set_txstate(ssi
, SEND_IDLE
);
867 spin_unlock_bh(&ssi
->lock
);
869 spin_unlock_bh(&ssi
->lock
);
872 netif_wake_queue(ssi
->netdev
);
875 static void ssip_tx_data_complete(struct hsi_msg
*msg
)
877 struct hsi_client
*cl
= msg
->cl
;
878 struct ssi_protocol
*ssi
= hsi_client_drvdata(cl
);
879 struct hsi_msg
*cmsg
;
881 if (msg
->status
== HSI_STATUS_ERROR
) {
882 dev_err(&cl
->device
, "TX data error\n");
886 spin_lock_bh(&ssi
->lock
);
887 if (list_empty(&ssi
->txqueue
)) {
888 ssip_set_txstate(ssi
, SENDING_SWBREAK
);
889 spin_unlock_bh(&ssi
->lock
);
890 cmsg
= ssip_claim_cmd(ssi
);
891 ssip_set_cmd(cmsg
, SSIP_SWBREAK_CMD
);
892 cmsg
->complete
= ssip_swbreak_complete
;
893 dev_dbg(&cl
->device
, "Send SWBREAK\n");
894 hsi_async_write(cl
, cmsg
);
896 spin_unlock_bh(&ssi
->lock
);
903 static void ssip_port_event(struct hsi_client
*cl
, unsigned long event
)
906 case HSI_EVENT_START_RX
:
909 case HSI_EVENT_STOP_RX
:
917 static int ssip_pn_open(struct net_device
*dev
)
919 struct hsi_client
*cl
= to_hsi_client(dev
->dev
.parent
);
920 struct ssi_protocol
*ssi
= hsi_client_drvdata(cl
);
923 err
= hsi_claim_port(cl
, 1);
925 dev_err(&cl
->device
, "SSI port already claimed\n");
928 err
= hsi_register_port_event(cl
, ssip_port_event
);
930 dev_err(&cl
->device
, "Register HSI port event failed (%d)\n",
934 dev_dbg(&cl
->device
, "Configuring SSI port\n");
937 if (!test_and_set_bit(SSIP_WAKETEST_FLAG
, &ssi
->flags
))
938 ssi_waketest(cl
, 1); /* FIXME: To be removed */
940 spin_lock_bh(&ssi
->lock
);
941 ssi
->main_state
= HANDSHAKE
;
942 spin_unlock_bh(&ssi
->lock
);
944 ssip_send_bootinfo_req_cmd(cl
);
949 static int ssip_pn_stop(struct net_device
*dev
)
951 struct hsi_client
*cl
= to_hsi_client(dev
->dev
.parent
);
954 hsi_unregister_port_event(cl
);
955 hsi_release_port(cl
);
960 static void ssip_xmit_work(struct work_struct
*work
)
962 struct ssi_protocol
*ssi
=
963 container_of(work
, struct ssi_protocol
, work
);
964 struct hsi_client
*cl
= ssi
->cl
;
969 static int ssip_pn_xmit(struct sk_buff
*skb
, struct net_device
*dev
)
971 struct hsi_client
*cl
= to_hsi_client(dev
->dev
.parent
);
972 struct ssi_protocol
*ssi
= hsi_client_drvdata(cl
);
975 if ((skb
->protocol
!= htons(ETH_P_PHONET
)) ||
976 (skb
->len
< SSIP_MIN_PN_HDR
))
978 /* Pad to 32-bits - FIXME: Revisit*/
979 if ((skb
->len
& 3) && skb_pad(skb
, 4 - (skb
->len
& 3)))
983 * Modem sends Phonet messages over SSI with its own endianness.
984 * Assume that modem has the same endianness as we do.
986 if (skb_cow_head(skb
, 0))
989 /* length field is exchanged in network byte order */
990 ((u16
*)skb
->data
)[2] = htons(((u16
*)skb
->data
)[2]);
992 msg
= ssip_alloc_data(ssi
, skb
, GFP_ATOMIC
);
994 dev_dbg(&cl
->device
, "Dropping tx data: No memory\n");
997 msg
->complete
= ssip_tx_data_complete
;
999 spin_lock_bh(&ssi
->lock
);
1000 if (unlikely(ssi
->main_state
!= ACTIVE
)) {
1001 spin_unlock_bh(&ssi
->lock
);
1002 dev_dbg(&cl
->device
, "Dropping tx data: CMT is OFFLINE\n");
1005 list_add_tail(&msg
->link
, &ssi
->txqueue
);
1007 if (dev
->tx_queue_len
< ssi
->txqueue_len
) {
1008 dev_info(&cl
->device
, "TX queue full %d\n", ssi
->txqueue_len
);
1009 netif_stop_queue(dev
);
1011 if (ssi
->send_state
== SEND_IDLE
) {
1012 ssip_set_txstate(ssi
, WAIT4READY
);
1013 spin_unlock_bh(&ssi
->lock
);
1014 dev_dbg(&cl
->device
, "Start TX qlen %d\n", ssi
->txqueue_len
);
1016 } else if (ssi
->send_state
== SEND_READY
) {
1017 /* Needed for cmt-speech workaround */
1018 dev_dbg(&cl
->device
, "Start TX on SEND READY qlen %d\n",
1020 spin_unlock_bh(&ssi
->lock
);
1021 schedule_work(&ssi
->work
);
1023 spin_unlock_bh(&ssi
->lock
);
1025 dev
->stats
.tx_packets
++;
1026 dev
->stats
.tx_bytes
+= skb
->len
;
1034 dev
->stats
.tx_dropped
++;
1039 /* CMT reset event handler */
1040 void ssip_reset_event(struct hsi_client
*master
)
1042 struct ssi_protocol
*ssi
= hsi_client_drvdata(master
);
1043 dev_err(&ssi
->cl
->device
, "CMT reset detected!\n");
1044 ssip_error(ssi
->cl
);
1046 EXPORT_SYMBOL_GPL(ssip_reset_event
);
1048 static const struct net_device_ops ssip_pn_ops
= {
1049 .ndo_open
= ssip_pn_open
,
1050 .ndo_stop
= ssip_pn_stop
,
1051 .ndo_start_xmit
= ssip_pn_xmit
,
1054 static void ssip_pn_setup(struct net_device
*dev
)
1057 dev
->netdev_ops
= &ssip_pn_ops
;
1058 dev
->type
= ARPHRD_PHONET
;
1059 dev
->flags
= IFF_POINTOPOINT
| IFF_NOARP
;
1060 dev
->mtu
= SSIP_DEFAULT_MTU
;
1061 dev
->hard_header_len
= 1;
1062 dev
->dev_addr
[0] = PN_MEDIA_SOS
;
1064 dev
->tx_queue_len
= SSIP_TXQUEUE_LEN
;
1066 dev
->needs_free_netdev
= true;
1067 dev
->header_ops
= &phonet_header_ops
;
1070 static int ssi_protocol_probe(struct device
*dev
)
1072 static const char ifname
[] = "phonet%d";
1073 struct hsi_client
*cl
= to_hsi_client(dev
);
1074 struct ssi_protocol
*ssi
;
1077 ssi
= kzalloc(sizeof(*ssi
), GFP_KERNEL
);
1081 spin_lock_init(&ssi
->lock
);
1082 timer_setup(&ssi
->rx_wd
, ssip_rx_wd
, TIMER_DEFERRABLE
);
1083 timer_setup(&ssi
->tx_wd
, ssip_tx_wd
, TIMER_DEFERRABLE
);
1084 timer_setup(&ssi
->keep_alive
, ssip_keep_alive
, 0);
1085 INIT_LIST_HEAD(&ssi
->txqueue
);
1086 INIT_LIST_HEAD(&ssi
->cmdqueue
);
1087 atomic_set(&ssi
->tx_usecnt
, 0);
1088 hsi_client_set_drvdata(cl
, ssi
);
1090 INIT_WORK(&ssi
->work
, ssip_xmit_work
);
1092 ssi
->channel_id_cmd
= hsi_get_channel_id_by_name(cl
, "mcsaab-control");
1093 if (ssi
->channel_id_cmd
< 0) {
1094 err
= ssi
->channel_id_cmd
;
1095 dev_err(dev
, "Could not get cmd channel (%d)\n", err
);
1099 ssi
->channel_id_data
= hsi_get_channel_id_by_name(cl
, "mcsaab-data");
1100 if (ssi
->channel_id_data
< 0) {
1101 err
= ssi
->channel_id_data
;
1102 dev_err(dev
, "Could not get data channel (%d)\n", err
);
1106 err
= ssip_alloc_cmds(ssi
);
1108 dev_err(dev
, "No memory for commands\n");
1112 ssi
->netdev
= alloc_netdev(0, ifname
, NET_NAME_UNKNOWN
, ssip_pn_setup
);
1114 dev_err(dev
, "No memory for netdev\n");
1119 /* MTU range: 6 - 65535 */
1120 ssi
->netdev
->min_mtu
= PHONET_MIN_MTU
;
1121 ssi
->netdev
->max_mtu
= SSIP_MAX_MTU
;
1123 SET_NETDEV_DEV(ssi
->netdev
, dev
);
1124 netif_carrier_off(ssi
->netdev
);
1125 err
= register_netdev(ssi
->netdev
);
1127 dev_err(dev
, "Register netdev failed (%d)\n", err
);
1131 list_add(&ssi
->link
, &ssip_list
);
1133 dev_dbg(dev
, "channel configuration: cmd=%d, data=%d\n",
1134 ssi
->channel_id_cmd
, ssi
->channel_id_data
);
1138 free_netdev(ssi
->netdev
);
1140 ssip_free_cmds(ssi
);
1147 static int ssi_protocol_remove(struct device
*dev
)
1149 struct hsi_client
*cl
= to_hsi_client(dev
);
1150 struct ssi_protocol
*ssi
= hsi_client_drvdata(cl
);
1152 list_del(&ssi
->link
);
1153 unregister_netdev(ssi
->netdev
);
1154 ssip_free_cmds(ssi
);
1155 hsi_client_set_drvdata(cl
, NULL
);
1161 static struct hsi_client_driver ssip_driver
= {
1163 .name
= "ssi-protocol",
1164 .owner
= THIS_MODULE
,
1165 .probe
= ssi_protocol_probe
,
1166 .remove
= ssi_protocol_remove
,
1170 static int __init
ssip_init(void)
1172 pr_info("SSI protocol aka McSAAB added\n");
1174 return hsi_register_client_driver(&ssip_driver
);
1176 module_init(ssip_init
);
1178 static void __exit
ssip_exit(void)
1180 hsi_unregister_client_driver(&ssip_driver
);
1181 pr_info("SSI protocol driver removed\n");
1183 module_exit(ssip_exit
);
1185 MODULE_ALIAS("hsi:ssi-protocol");
1186 MODULE_AUTHOR("Carlos Chinea <carlos.chinea@nokia.com>");
1187 MODULE_AUTHOR("Remi Denis-Courmont <remi.denis-courmont@nokia.com>");
1188 MODULE_DESCRIPTION("SSI protocol improved aka McSAAB");
1189 MODULE_LICENSE("GPL");