Lines Matching full:ssi
5 * Implementation of the SSI McSAAB improved protocol.
45 * SSI protocol command definitions
101 * struct ssi_protocol - SSI protocol (McSAAB) data
111 * @keep_alive: Workaround for SSI HW bug
146 /* List of ssi protocol instances */
199 static struct hsi_msg *ssip_alloc_data(struct ssi_protocol *ssi, in ssip_alloc_data() argument
209 msg->channel = ssi->channel_id_data; in ssip_alloc_data()
217 struct ssi_protocol *ssi = hsi_client_drvdata(msg->cl); in ssip_release_cmd() local
220 spin_lock_bh(&ssi->lock); in ssip_release_cmd()
221 list_add_tail(&msg->link, &ssi->cmdqueue); in ssip_release_cmd()
222 spin_unlock_bh(&ssi->lock); in ssip_release_cmd()
225 static struct hsi_msg *ssip_claim_cmd(struct ssi_protocol *ssi) in ssip_claim_cmd() argument
229 BUG_ON(list_empty(&ssi->cmdqueue)); in ssip_claim_cmd()
231 spin_lock_bh(&ssi->lock); in ssip_claim_cmd()
232 msg = list_first_entry(&ssi->cmdqueue, struct hsi_msg, link); in ssip_claim_cmd()
234 spin_unlock_bh(&ssi->lock); in ssip_claim_cmd()
240 static void ssip_free_cmds(struct ssi_protocol *ssi) in ssip_free_cmds() argument
244 list_for_each_entry_safe(msg, tmp, &ssi->cmdqueue, link) { in ssip_free_cmds()
252 static int ssip_alloc_cmds(struct ssi_protocol *ssi) in ssip_alloc_cmds() argument
268 msg->channel = ssi->channel_id_cmd; in ssip_alloc_cmds()
269 list_add_tail(&msg->link, &ssi->cmdqueue); in ssip_alloc_cmds()
274 ssip_free_cmds(ssi); in ssip_alloc_cmds()
279 static void ssip_set_rxstate(struct ssi_protocol *ssi, unsigned int state) in ssip_set_rxstate() argument
281 ssi->recv_state = state; in ssip_set_rxstate()
284 del_timer(&ssi->rx_wd); in ssip_set_rxstate()
285 if (ssi->send_state == SEND_IDLE) in ssip_set_rxstate()
286 del_timer(&ssi->keep_alive); in ssip_set_rxstate()
290 if (atomic_read(&ssi->tx_usecnt)) in ssip_set_rxstate()
294 mod_timer(&ssi->keep_alive, jiffies + in ssip_set_rxstate()
296 mod_timer(&ssi->rx_wd, jiffies + msecs_to_jiffies(SSIP_WDTOUT)); in ssip_set_rxstate()
303 static void ssip_set_txstate(struct ssi_protocol *ssi, unsigned int state) in ssip_set_txstate() argument
305 ssi->send_state = state; in ssip_set_txstate()
309 del_timer(&ssi->tx_wd); in ssip_set_txstate()
310 if (ssi->recv_state == RECV_IDLE) in ssip_set_txstate()
311 del_timer(&ssi->keep_alive); in ssip_set_txstate()
316 mod_timer(&ssi->keep_alive, in ssip_set_txstate()
318 mod_timer(&ssi->tx_wd, jiffies + msecs_to_jiffies(SSIP_WDTOUT)); in ssip_set_txstate()
328 struct ssi_protocol *ssi; in ssip_slave_get_master() local
330 list_for_each_entry(ssi, &ssip_list, link) in ssip_slave_get_master()
331 if (slave->device.parent == ssi->cl->device.parent) { in ssip_slave_get_master()
332 master = ssi->cl; in ssip_slave_get_master()
342 struct ssi_protocol *ssi = hsi_client_drvdata(master); in ssip_slave_start_tx() local
344 dev_dbg(&master->device, "start TX %d\n", atomic_read(&ssi->tx_usecnt)); in ssip_slave_start_tx()
345 spin_lock_bh(&ssi->lock); in ssip_slave_start_tx()
346 if (ssi->send_state == SEND_IDLE) { in ssip_slave_start_tx()
347 ssip_set_txstate(ssi, WAIT4READY); in ssip_slave_start_tx()
350 spin_unlock_bh(&ssi->lock); in ssip_slave_start_tx()
351 atomic_inc(&ssi->tx_usecnt); in ssip_slave_start_tx()
359 struct ssi_protocol *ssi = hsi_client_drvdata(master); in ssip_slave_stop_tx() local
361 WARN_ON_ONCE(atomic_read(&ssi->tx_usecnt) == 0); in ssip_slave_stop_tx()
363 if (atomic_dec_and_test(&ssi->tx_usecnt)) { in ssip_slave_stop_tx()
364 spin_lock_bh(&ssi->lock); in ssip_slave_stop_tx()
365 if ((ssi->send_state == SEND_READY) || in ssip_slave_stop_tx()
366 (ssi->send_state == WAIT4READY)) { in ssip_slave_stop_tx()
367 ssip_set_txstate(ssi, SEND_IDLE); in ssip_slave_stop_tx()
370 spin_unlock_bh(&ssi->lock); in ssip_slave_stop_tx()
372 dev_dbg(&master->device, "stop TX %d\n", atomic_read(&ssi->tx_usecnt)); in ssip_slave_stop_tx()
380 struct ssi_protocol *ssi = hsi_client_drvdata(master); in ssip_slave_running() local
381 return netif_running(ssi->netdev); in ssip_slave_running()
387 struct ssi_protocol *ssi = hsi_client_drvdata(cl); in ssip_reset() local
391 if (netif_running(ssi->netdev)) in ssip_reset()
392 netif_carrier_off(ssi->netdev); in ssip_reset()
394 spin_lock_bh(&ssi->lock); in ssip_reset()
395 if (ssi->send_state != SEND_IDLE) in ssip_reset()
397 spin_unlock_bh(&ssi->lock); in ssip_reset()
398 if (test_and_clear_bit(SSIP_WAKETEST_FLAG, &ssi->flags)) in ssip_reset()
400 spin_lock_bh(&ssi->lock); in ssip_reset()
401 del_timer(&ssi->rx_wd); in ssip_reset()
402 del_timer(&ssi->tx_wd); in ssip_reset()
403 del_timer(&ssi->keep_alive); in ssip_reset()
404 cancel_work_sync(&ssi->work); in ssip_reset()
405 ssi->main_state = 0; in ssip_reset()
406 ssi->send_state = 0; in ssip_reset()
407 ssi->recv_state = 0; in ssip_reset()
408 ssi->flags = 0; in ssip_reset()
409 ssi->rxid = 0; in ssip_reset()
410 ssi->txid = 0; in ssip_reset()
411 list_for_each_safe(head, tmp, &ssi->txqueue) { in ssip_reset()
417 ssi->txqueue_len = 0; in ssip_reset()
418 spin_unlock_bh(&ssi->lock); in ssip_reset()
423 struct ssi_protocol *ssi = hsi_client_drvdata(cl); in ssip_dump_state() local
426 spin_lock_bh(&ssi->lock); in ssip_dump_state()
427 dev_err(&cl->device, "Main state: %d\n", ssi->main_state); in ssip_dump_state()
428 dev_err(&cl->device, "Recv state: %d\n", ssi->recv_state); in ssip_dump_state()
429 dev_err(&cl->device, "Send state: %d\n", ssi->send_state); in ssip_dump_state()
430 dev_err(&cl->device, "CMT %s\n", (ssi->main_state == ACTIVE) ? in ssip_dump_state()
433 test_bit(SSIP_WAKETEST_FLAG, &ssi->flags)); in ssip_dump_state()
434 dev_err(&cl->device, "Data RX id: %d\n", ssi->rxid); in ssip_dump_state()
435 dev_err(&cl->device, "Data TX id: %d\n", ssi->txid); in ssip_dump_state()
437 list_for_each_entry(msg, &ssi->txqueue, link) in ssip_dump_state()
439 spin_unlock_bh(&ssi->lock); in ssip_dump_state()
444 struct ssi_protocol *ssi = hsi_client_drvdata(cl); in ssip_error() local
449 msg = ssip_claim_cmd(ssi); in ssip_error()
456 struct ssi_protocol *ssi = from_timer(ssi, t, keep_alive); in ssip_keep_alive() local
457 struct hsi_client *cl = ssi->cl; in ssip_keep_alive()
460 ssi->main_state, ssi->recv_state, ssi->send_state); in ssip_keep_alive()
462 spin_lock(&ssi->lock); in ssip_keep_alive()
463 if (ssi->recv_state == RECV_IDLE) in ssip_keep_alive()
464 switch (ssi->send_state) { in ssip_keep_alive()
466 if (atomic_read(&ssi->tx_usecnt) == 0) in ssip_keep_alive()
474 spin_unlock(&ssi->lock); in ssip_keep_alive()
477 mod_timer(&ssi->keep_alive, jiffies + msecs_to_jiffies(SSIP_KATOUT)); in ssip_keep_alive()
478 spin_unlock(&ssi->lock); in ssip_keep_alive()
483 struct ssi_protocol *ssi = from_timer(ssi, t, rx_wd); in ssip_rx_wd() local
484 struct hsi_client *cl = ssi->cl; in ssip_rx_wd()
492 struct ssi_protocol *ssi = from_timer(ssi, t, tx_wd); in ssip_tx_wd() local
493 struct hsi_client *cl = ssi->cl; in ssip_tx_wd()
501 struct ssi_protocol *ssi = hsi_client_drvdata(cl); in ssip_send_bootinfo_req_cmd() local
505 msg = ssip_claim_cmd(ssi); in ssip_send_bootinfo_req_cmd()
510 msg = ssip_claim_cmd(ssi); in ssip_send_bootinfo_req_cmd()
517 struct ssi_protocol *ssi = hsi_client_drvdata(cl); in ssip_start_rx() local
520 dev_dbg(&cl->device, "RX start M(%d) R(%d)\n", ssi->main_state, in ssip_start_rx()
521 ssi->recv_state); in ssip_start_rx()
522 spin_lock_bh(&ssi->lock); in ssip_start_rx()
527 if ((ssi->main_state != ACTIVE) || (ssi->recv_state == RECV_READY)) { in ssip_start_rx()
528 spin_unlock_bh(&ssi->lock); in ssip_start_rx()
531 ssip_set_rxstate(ssi, RECV_READY); in ssip_start_rx()
532 spin_unlock_bh(&ssi->lock); in ssip_start_rx()
534 msg = ssip_claim_cmd(ssi); in ssip_start_rx()
543 struct ssi_protocol *ssi = hsi_client_drvdata(cl); in ssip_stop_rx() local
545 dev_dbg(&cl->device, "RX stop M(%d)\n", ssi->main_state); in ssip_stop_rx()
546 spin_lock_bh(&ssi->lock); in ssip_stop_rx()
547 if (likely(ssi->main_state == ACTIVE)) in ssip_stop_rx()
548 ssip_set_rxstate(ssi, RECV_IDLE); in ssip_stop_rx()
549 spin_unlock_bh(&ssi->lock); in ssip_stop_rx()
561 struct ssi_protocol *ssi = hsi_client_drvdata(cl); in ssip_strans_complete() local
566 spin_lock_bh(&ssi->lock); in ssip_strans_complete()
567 ssip_set_txstate(ssi, SENDING); in ssip_strans_complete()
568 spin_unlock_bh(&ssi->lock); in ssip_strans_complete()
574 struct ssi_protocol *ssi = hsi_client_drvdata(cl); in ssip_xmit() local
578 spin_lock_bh(&ssi->lock); in ssip_xmit()
579 if (list_empty(&ssi->txqueue)) { in ssip_xmit()
580 spin_unlock_bh(&ssi->lock); in ssip_xmit()
583 dmsg = list_first_entry(&ssi->txqueue, struct hsi_msg, link); in ssip_xmit()
585 ssi->txqueue_len--; in ssip_xmit()
586 spin_unlock_bh(&ssi->lock); in ssip_xmit()
588 msg = ssip_claim_cmd(ssi); in ssip_xmit()
594 spin_lock_bh(&ssi->lock); in ssip_xmit()
596 ssi->txid)); in ssip_xmit()
597 ssi->txid++; in ssip_xmit()
598 ssip_set_txstate(ssi, SENDING); in ssip_xmit()
599 spin_unlock_bh(&ssi->lock); in ssip_xmit()
642 struct ssi_protocol *ssi = hsi_client_drvdata(cl); in ssip_rx_data_complete() local
651 del_timer(&ssi->rx_wd); /* FIXME: Revisit */ in ssip_rx_data_complete()
659 struct ssi_protocol *ssi = hsi_client_drvdata(cl); in ssip_rx_bootinforeq() local
666 switch (ssi->main_state) { in ssip_rx_bootinforeq()
673 spin_lock_bh(&ssi->lock); in ssip_rx_bootinforeq()
674 ssi->main_state = HANDSHAKE; in ssip_rx_bootinforeq()
675 spin_unlock_bh(&ssi->lock); in ssip_rx_bootinforeq()
677 if (!test_and_set_bit(SSIP_WAKETEST_FLAG, &ssi->flags)) in ssip_rx_bootinforeq()
680 spin_lock_bh(&ssi->lock); in ssip_rx_bootinforeq()
682 mod_timer(&ssi->tx_wd, jiffies + msecs_to_jiffies(SSIP_WDTOUT)); in ssip_rx_bootinforeq()
683 spin_unlock_bh(&ssi->lock); in ssip_rx_bootinforeq()
687 msg = ssip_claim_cmd(ssi); in ssip_rx_bootinforeq()
693 dev_dbg(&cl->device, "Wrong state M(%d)\n", ssi->main_state); in ssip_rx_bootinforeq()
700 struct ssi_protocol *ssi = hsi_client_drvdata(cl); in ssip_rx_bootinforesp() local
705 spin_lock_bh(&ssi->lock); in ssip_rx_bootinforesp()
706 if (ssi->main_state != ACTIVE) in ssip_rx_bootinforesp()
708 mod_timer(&ssi->tx_wd, jiffies + msecs_to_jiffies(SSIP_WDTOUT)); in ssip_rx_bootinforesp()
711 ssi->main_state); in ssip_rx_bootinforesp()
712 spin_unlock_bh(&ssi->lock); in ssip_rx_bootinforesp()
717 struct ssi_protocol *ssi = hsi_client_drvdata(cl); in ssip_rx_waketest() local
720 spin_lock_bh(&ssi->lock); in ssip_rx_waketest()
721 if (ssi->main_state != HANDSHAKE) { in ssip_rx_waketest()
723 ssi->main_state); in ssip_rx_waketest()
724 spin_unlock_bh(&ssi->lock); in ssip_rx_waketest()
727 spin_unlock_bh(&ssi->lock); in ssip_rx_waketest()
729 if (test_and_clear_bit(SSIP_WAKETEST_FLAG, &ssi->flags)) in ssip_rx_waketest()
732 spin_lock_bh(&ssi->lock); in ssip_rx_waketest()
733 ssi->main_state = ACTIVE; in ssip_rx_waketest()
734 del_timer(&ssi->tx_wd); /* Stop boot handshake timer */ in ssip_rx_waketest()
735 spin_unlock_bh(&ssi->lock); in ssip_rx_waketest()
744 netif_wake_queue(ssi->netdev); in ssip_rx_waketest()
745 netif_carrier_on(ssi->netdev); in ssip_rx_waketest()
750 struct ssi_protocol *ssi = hsi_client_drvdata(cl); in ssip_rx_ready() local
752 spin_lock_bh(&ssi->lock); in ssip_rx_ready()
753 if (unlikely(ssi->main_state != ACTIVE)) { in ssip_rx_ready()
755 ssi->send_state, ssi->main_state); in ssip_rx_ready()
756 spin_unlock_bh(&ssi->lock); in ssip_rx_ready()
759 if (ssi->send_state != WAIT4READY) { in ssip_rx_ready()
761 spin_unlock_bh(&ssi->lock); in ssip_rx_ready()
764 ssip_set_txstate(ssi, SEND_READY); in ssip_rx_ready()
765 spin_unlock_bh(&ssi->lock); in ssip_rx_ready()
771 struct ssi_protocol *ssi = hsi_client_drvdata(cl); in ssip_rx_strans() local
777 spin_lock_bh(&ssi->lock); in ssip_rx_strans()
778 if (unlikely(ssi->main_state != ACTIVE)) { in ssip_rx_strans()
780 ssi->send_state, ssi->main_state); in ssip_rx_strans()
781 spin_unlock_bh(&ssi->lock); in ssip_rx_strans()
784 ssip_set_rxstate(ssi, RECEIVING); in ssip_rx_strans()
785 if (unlikely(SSIP_MSG_ID(cmd) != ssi->rxid)) { in ssip_rx_strans()
787 SSIP_MSG_ID(cmd), ssi->rxid); in ssip_rx_strans()
788 spin_unlock_bh(&ssi->lock); in ssip_rx_strans()
791 ssi->rxid++; in ssip_rx_strans()
792 spin_unlock_bh(&ssi->lock); in ssip_rx_strans()
793 skb = netdev_alloc_skb(ssi->netdev, len * 4); in ssip_rx_strans()
799 msg = ssip_alloc_data(ssi, skb, GFP_ATOMIC); in ssip_rx_strans()
856 struct ssi_protocol *ssi = hsi_client_drvdata(cl); in ssip_swbreak_complete() local
859 spin_lock_bh(&ssi->lock); in ssip_swbreak_complete()
860 if (list_empty(&ssi->txqueue)) { in ssip_swbreak_complete()
861 if (atomic_read(&ssi->tx_usecnt)) { in ssip_swbreak_complete()
862 ssip_set_txstate(ssi, SEND_READY); in ssip_swbreak_complete()
864 ssip_set_txstate(ssi, SEND_IDLE); in ssip_swbreak_complete()
867 spin_unlock_bh(&ssi->lock); in ssip_swbreak_complete()
869 spin_unlock_bh(&ssi->lock); in ssip_swbreak_complete()
872 netif_wake_queue(ssi->netdev); in ssip_swbreak_complete()
878 struct ssi_protocol *ssi = hsi_client_drvdata(cl); in ssip_tx_data_complete() local
886 spin_lock_bh(&ssi->lock); in ssip_tx_data_complete()
887 if (list_empty(&ssi->txqueue)) { in ssip_tx_data_complete()
888 ssip_set_txstate(ssi, SENDING_SWBREAK); in ssip_tx_data_complete()
889 spin_unlock_bh(&ssi->lock); in ssip_tx_data_complete()
890 cmsg = ssip_claim_cmd(ssi); in ssip_tx_data_complete()
896 spin_unlock_bh(&ssi->lock); in ssip_tx_data_complete()
920 struct ssi_protocol *ssi = hsi_client_drvdata(cl); in ssip_pn_open() local
925 dev_err(&cl->device, "SSI port already claimed\n"); in ssip_pn_open()
935 dev_dbg(&cl->device, "Configuring SSI port\n"); in ssip_pn_open()
938 if (!test_and_set_bit(SSIP_WAKETEST_FLAG, &ssi->flags)) in ssip_pn_open()
941 spin_lock_bh(&ssi->lock); in ssip_pn_open()
942 ssi->main_state = HANDSHAKE; in ssip_pn_open()
943 spin_unlock_bh(&ssi->lock); in ssip_pn_open()
963 struct ssi_protocol *ssi = in ssip_xmit_work() local
965 struct hsi_client *cl = ssi->cl; in ssip_xmit_work()
973 struct ssi_protocol *ssi = hsi_client_drvdata(cl); in ssip_pn_xmit() local
984 * Modem sends Phonet messages over SSI with its own endianness. in ssip_pn_xmit()
993 msg = ssip_alloc_data(ssi, skb, GFP_ATOMIC); in ssip_pn_xmit()
1000 spin_lock_bh(&ssi->lock); in ssip_pn_xmit()
1001 if (unlikely(ssi->main_state != ACTIVE)) { in ssip_pn_xmit()
1002 spin_unlock_bh(&ssi->lock); in ssip_pn_xmit()
1006 list_add_tail(&msg->link, &ssi->txqueue); in ssip_pn_xmit()
1007 ssi->txqueue_len++; in ssip_pn_xmit()
1008 if (dev->tx_queue_len < ssi->txqueue_len) { in ssip_pn_xmit()
1009 dev_info(&cl->device, "TX queue full %d\n", ssi->txqueue_len); in ssip_pn_xmit()
1012 if (ssi->send_state == SEND_IDLE) { in ssip_pn_xmit()
1013 ssip_set_txstate(ssi, WAIT4READY); in ssip_pn_xmit()
1014 spin_unlock_bh(&ssi->lock); in ssip_pn_xmit()
1015 dev_dbg(&cl->device, "Start TX qlen %d\n", ssi->txqueue_len); in ssip_pn_xmit()
1017 } else if (ssi->send_state == SEND_READY) { in ssip_pn_xmit()
1020 ssi->txqueue_len); in ssip_pn_xmit()
1021 spin_unlock_bh(&ssi->lock); in ssip_pn_xmit()
1022 schedule_work(&ssi->work); in ssip_pn_xmit()
1024 spin_unlock_bh(&ssi->lock); in ssip_pn_xmit()
1043 struct ssi_protocol *ssi = hsi_client_drvdata(master); in ssip_reset_event() local
1044 dev_err(&ssi->cl->device, "CMT reset detected!\n"); in ssip_reset_event()
1045 ssip_error(ssi->cl); in ssip_reset_event()
1077 struct ssi_protocol *ssi; in ssi_protocol_probe() local
1080 ssi = kzalloc(sizeof(*ssi), GFP_KERNEL); in ssi_protocol_probe()
1081 if (!ssi) in ssi_protocol_probe()
1084 spin_lock_init(&ssi->lock); in ssi_protocol_probe()
1085 timer_setup(&ssi->rx_wd, ssip_rx_wd, TIMER_DEFERRABLE); in ssi_protocol_probe()
1086 timer_setup(&ssi->tx_wd, ssip_tx_wd, TIMER_DEFERRABLE); in ssi_protocol_probe()
1087 timer_setup(&ssi->keep_alive, ssip_keep_alive, 0); in ssi_protocol_probe()
1088 INIT_LIST_HEAD(&ssi->txqueue); in ssi_protocol_probe()
1089 INIT_LIST_HEAD(&ssi->cmdqueue); in ssi_protocol_probe()
1090 atomic_set(&ssi->tx_usecnt, 0); in ssi_protocol_probe()
1091 hsi_client_set_drvdata(cl, ssi); in ssi_protocol_probe()
1092 ssi->cl = cl; in ssi_protocol_probe()
1093 INIT_WORK(&ssi->work, ssip_xmit_work); in ssi_protocol_probe()
1095 ssi->channel_id_cmd = hsi_get_channel_id_by_name(cl, "mcsaab-control"); in ssi_protocol_probe()
1096 if (ssi->channel_id_cmd < 0) { in ssi_protocol_probe()
1097 err = ssi->channel_id_cmd; in ssi_protocol_probe()
1102 ssi->channel_id_data = hsi_get_channel_id_by_name(cl, "mcsaab-data"); in ssi_protocol_probe()
1103 if (ssi->channel_id_data < 0) { in ssi_protocol_probe()
1104 err = ssi->channel_id_data; in ssi_protocol_probe()
1109 err = ssip_alloc_cmds(ssi); in ssi_protocol_probe()
1115 ssi->netdev = alloc_netdev(0, ifname, NET_NAME_UNKNOWN, ssip_pn_setup); in ssi_protocol_probe()
1116 if (!ssi->netdev) { in ssi_protocol_probe()
1123 ssi->netdev->min_mtu = PHONET_MIN_MTU; in ssi_protocol_probe()
1124 ssi->netdev->max_mtu = SSIP_MAX_MTU; in ssi_protocol_probe()
1126 SET_NETDEV_DEV(ssi->netdev, dev); in ssi_protocol_probe()
1127 netif_carrier_off(ssi->netdev); in ssi_protocol_probe()
1128 err = register_netdev(ssi->netdev); in ssi_protocol_probe()
1134 list_add(&ssi->link, &ssip_list); in ssi_protocol_probe()
1137 ssi->channel_id_cmd, ssi->channel_id_data); in ssi_protocol_probe()
1141 free_netdev(ssi->netdev); in ssi_protocol_probe()
1143 ssip_free_cmds(ssi); in ssi_protocol_probe()
1145 kfree(ssi); in ssi_protocol_probe()
1153 struct ssi_protocol *ssi = hsi_client_drvdata(cl); in ssi_protocol_remove() local
1155 list_del(&ssi->link); in ssi_protocol_remove()
1156 unregister_netdev(ssi->netdev); in ssi_protocol_remove()
1157 ssip_free_cmds(ssi); in ssi_protocol_remove()
1159 kfree(ssi); in ssi_protocol_remove()
1166 .name = "ssi-protocol",
1175 pr_info("SSI protocol aka McSAAB added\n"); in ssip_init()
1184 pr_info("SSI protocol driver removed\n"); in ssip_exit()
1188 MODULE_ALIAS("hsi:ssi-protocol");
1191 MODULE_DESCRIPTION("SSI protocol improved aka McSAAB");