Lines Matching refs:ssi
210 static struct hsi_msg *ssip_alloc_data(struct ssi_protocol *ssi, in ssip_alloc_data() argument
220 msg->channel = ssi->channel_id_data; in ssip_alloc_data()
228 struct ssi_protocol *ssi = hsi_client_drvdata(msg->cl); in ssip_release_cmd() local
231 spin_lock_bh(&ssi->lock); in ssip_release_cmd()
232 list_add_tail(&msg->link, &ssi->cmdqueue); in ssip_release_cmd()
233 spin_unlock_bh(&ssi->lock); in ssip_release_cmd()
236 static struct hsi_msg *ssip_claim_cmd(struct ssi_protocol *ssi) in ssip_claim_cmd() argument
240 BUG_ON(list_empty(&ssi->cmdqueue)); in ssip_claim_cmd()
242 spin_lock_bh(&ssi->lock); in ssip_claim_cmd()
243 msg = list_first_entry(&ssi->cmdqueue, struct hsi_msg, link); in ssip_claim_cmd()
245 spin_unlock_bh(&ssi->lock); in ssip_claim_cmd()
251 static void ssip_free_cmds(struct ssi_protocol *ssi) in ssip_free_cmds() argument
255 list_for_each_entry_safe(msg, tmp, &ssi->cmdqueue, link) { in ssip_free_cmds()
263 static int ssip_alloc_cmds(struct ssi_protocol *ssi) in ssip_alloc_cmds() argument
279 msg->channel = ssi->channel_id_cmd; in ssip_alloc_cmds()
280 list_add_tail(&msg->link, &ssi->cmdqueue); in ssip_alloc_cmds()
285 ssip_free_cmds(ssi); in ssip_alloc_cmds()
290 static void ssip_set_rxstate(struct ssi_protocol *ssi, unsigned int state) in ssip_set_rxstate() argument
292 ssi->recv_state = state; in ssip_set_rxstate()
295 del_timer(&ssi->rx_wd); in ssip_set_rxstate()
296 if (ssi->send_state == SEND_IDLE) in ssip_set_rxstate()
297 del_timer(&ssi->keep_alive); in ssip_set_rxstate()
301 if (atomic_read(&ssi->tx_usecnt)) in ssip_set_rxstate()
305 mod_timer(&ssi->keep_alive, jiffies + in ssip_set_rxstate()
307 mod_timer(&ssi->rx_wd, jiffies + msecs_to_jiffies(SSIP_WDTOUT)); in ssip_set_rxstate()
314 static void ssip_set_txstate(struct ssi_protocol *ssi, unsigned int state) in ssip_set_txstate() argument
316 ssi->send_state = state; in ssip_set_txstate()
320 del_timer(&ssi->tx_wd); in ssip_set_txstate()
321 if (ssi->recv_state == RECV_IDLE) in ssip_set_txstate()
322 del_timer(&ssi->keep_alive); in ssip_set_txstate()
327 mod_timer(&ssi->keep_alive, in ssip_set_txstate()
329 mod_timer(&ssi->tx_wd, jiffies + msecs_to_jiffies(SSIP_WDTOUT)); in ssip_set_txstate()
339 struct ssi_protocol *ssi; in ssip_slave_get_master() local
341 list_for_each_entry(ssi, &ssip_list, link) in ssip_slave_get_master()
342 if (slave->device.parent == ssi->cl->device.parent) { in ssip_slave_get_master()
343 master = ssi->cl; in ssip_slave_get_master()
353 struct ssi_protocol *ssi = hsi_client_drvdata(master); in ssip_slave_start_tx() local
355 dev_dbg(&master->device, "start TX %d\n", atomic_read(&ssi->tx_usecnt)); in ssip_slave_start_tx()
356 spin_lock_bh(&ssi->lock); in ssip_slave_start_tx()
357 if (ssi->send_state == SEND_IDLE) { in ssip_slave_start_tx()
358 ssip_set_txstate(ssi, WAIT4READY); in ssip_slave_start_tx()
361 spin_unlock_bh(&ssi->lock); in ssip_slave_start_tx()
362 atomic_inc(&ssi->tx_usecnt); in ssip_slave_start_tx()
370 struct ssi_protocol *ssi = hsi_client_drvdata(master); in ssip_slave_stop_tx() local
372 WARN_ON_ONCE(atomic_read(&ssi->tx_usecnt) == 0); in ssip_slave_stop_tx()
374 if (atomic_dec_and_test(&ssi->tx_usecnt)) { in ssip_slave_stop_tx()
375 spin_lock_bh(&ssi->lock); in ssip_slave_stop_tx()
376 if ((ssi->send_state == SEND_READY) || in ssip_slave_stop_tx()
377 (ssi->send_state == WAIT4READY)) { in ssip_slave_stop_tx()
378 ssip_set_txstate(ssi, SEND_IDLE); in ssip_slave_stop_tx()
381 spin_unlock_bh(&ssi->lock); in ssip_slave_stop_tx()
383 dev_dbg(&master->device, "stop TX %d\n", atomic_read(&ssi->tx_usecnt)); in ssip_slave_stop_tx()
391 struct ssi_protocol *ssi = hsi_client_drvdata(master); in ssip_slave_running() local
392 return netif_running(ssi->netdev); in ssip_slave_running()
398 struct ssi_protocol *ssi = hsi_client_drvdata(cl); in ssip_reset() local
402 if (netif_running(ssi->netdev)) in ssip_reset()
403 netif_carrier_off(ssi->netdev); in ssip_reset()
405 spin_lock_bh(&ssi->lock); in ssip_reset()
406 if (ssi->send_state != SEND_IDLE) in ssip_reset()
408 if (ssi->waketest) in ssip_reset()
410 del_timer(&ssi->rx_wd); in ssip_reset()
411 del_timer(&ssi->tx_wd); in ssip_reset()
412 del_timer(&ssi->keep_alive); in ssip_reset()
413 ssi->main_state = 0; in ssip_reset()
414 ssi->send_state = 0; in ssip_reset()
415 ssi->recv_state = 0; in ssip_reset()
416 ssi->waketest = 0; in ssip_reset()
417 ssi->rxid = 0; in ssip_reset()
418 ssi->txid = 0; in ssip_reset()
419 list_for_each_safe(head, tmp, &ssi->txqueue) { in ssip_reset()
425 ssi->txqueue_len = 0; in ssip_reset()
426 spin_unlock_bh(&ssi->lock); in ssip_reset()
431 struct ssi_protocol *ssi = hsi_client_drvdata(cl); in ssip_dump_state() local
434 spin_lock_bh(&ssi->lock); in ssip_dump_state()
435 dev_err(&cl->device, "Main state: %d\n", ssi->main_state); in ssip_dump_state()
436 dev_err(&cl->device, "Recv state: %d\n", ssi->recv_state); in ssip_dump_state()
437 dev_err(&cl->device, "Send state: %d\n", ssi->send_state); in ssip_dump_state()
438 dev_err(&cl->device, "CMT %s\n", (ssi->main_state == ACTIVE) ? in ssip_dump_state()
440 dev_err(&cl->device, "Wake test %d\n", ssi->waketest); in ssip_dump_state()
441 dev_err(&cl->device, "Data RX id: %d\n", ssi->rxid); in ssip_dump_state()
442 dev_err(&cl->device, "Data TX id: %d\n", ssi->txid); in ssip_dump_state()
444 list_for_each_entry(msg, &ssi->txqueue, link) in ssip_dump_state()
446 spin_unlock_bh(&ssi->lock); in ssip_dump_state()
451 struct ssi_protocol *ssi = hsi_client_drvdata(cl); in ssip_error() local
456 msg = ssip_claim_cmd(ssi); in ssip_error()
464 struct ssi_protocol *ssi = hsi_client_drvdata(cl); in ssip_keep_alive() local
467 ssi->main_state, ssi->recv_state, ssi->send_state); in ssip_keep_alive()
469 spin_lock(&ssi->lock); in ssip_keep_alive()
470 if (ssi->recv_state == RECV_IDLE) in ssip_keep_alive()
471 switch (ssi->send_state) { in ssip_keep_alive()
473 if (atomic_read(&ssi->tx_usecnt) == 0) in ssip_keep_alive()
480 spin_unlock(&ssi->lock); in ssip_keep_alive()
483 mod_timer(&ssi->keep_alive, jiffies + msecs_to_jiffies(SSIP_KATOUT)); in ssip_keep_alive()
484 spin_unlock(&ssi->lock); in ssip_keep_alive()
497 struct ssi_protocol *ssi = hsi_client_drvdata(cl); in ssip_send_bootinfo_req_cmd() local
501 msg = ssip_claim_cmd(ssi); in ssip_send_bootinfo_req_cmd()
506 msg = ssip_claim_cmd(ssi); in ssip_send_bootinfo_req_cmd()
513 struct ssi_protocol *ssi = hsi_client_drvdata(cl); in ssip_start_rx() local
516 dev_dbg(&cl->device, "RX start M(%d) R(%d)\n", ssi->main_state, in ssip_start_rx()
517 ssi->recv_state); in ssip_start_rx()
518 spin_lock(&ssi->lock); in ssip_start_rx()
523 if ((ssi->main_state != ACTIVE) || (ssi->recv_state == RECV_READY)) { in ssip_start_rx()
524 if (ssi->main_state == INIT) { in ssip_start_rx()
525 ssi->main_state = HANDSHAKE; in ssip_start_rx()
526 spin_unlock(&ssi->lock); in ssip_start_rx()
529 spin_unlock(&ssi->lock); in ssip_start_rx()
533 ssip_set_rxstate(ssi, RECV_READY); in ssip_start_rx()
534 spin_unlock(&ssi->lock); in ssip_start_rx()
536 msg = ssip_claim_cmd(ssi); in ssip_start_rx()
545 struct ssi_protocol *ssi = hsi_client_drvdata(cl); in ssip_stop_rx() local
547 dev_dbg(&cl->device, "RX stop M(%d)\n", ssi->main_state); in ssip_stop_rx()
548 spin_lock(&ssi->lock); in ssip_stop_rx()
549 if (likely(ssi->main_state == ACTIVE)) in ssip_stop_rx()
550 ssip_set_rxstate(ssi, RECV_IDLE); in ssip_stop_rx()
551 spin_unlock(&ssi->lock); in ssip_stop_rx()
563 struct ssi_protocol *ssi = hsi_client_drvdata(cl); in ssip_strans_complete() local
568 spin_lock(&ssi->lock); in ssip_strans_complete()
569 ssip_set_txstate(ssi, SENDING); in ssip_strans_complete()
570 spin_unlock(&ssi->lock); in ssip_strans_complete()
576 struct ssi_protocol *ssi = hsi_client_drvdata(cl); in ssip_xmit() local
580 spin_lock_bh(&ssi->lock); in ssip_xmit()
581 if (list_empty(&ssi->txqueue)) { in ssip_xmit()
582 spin_unlock_bh(&ssi->lock); in ssip_xmit()
585 dmsg = list_first_entry(&ssi->txqueue, struct hsi_msg, link); in ssip_xmit()
587 ssi->txqueue_len--; in ssip_xmit()
588 spin_unlock_bh(&ssi->lock); in ssip_xmit()
590 msg = ssip_claim_cmd(ssi); in ssip_xmit()
596 spin_lock_bh(&ssi->lock); in ssip_xmit()
598 ssi->txid)); in ssip_xmit()
599 ssi->txid++; in ssip_xmit()
600 ssip_set_txstate(ssi, SENDING); in ssip_xmit()
601 spin_unlock_bh(&ssi->lock); in ssip_xmit()
644 struct ssi_protocol *ssi = hsi_client_drvdata(cl); in ssip_rx_data_complete() local
653 del_timer(&ssi->rx_wd); /* FIXME: Revisit */ in ssip_rx_data_complete()
661 struct ssi_protocol *ssi = hsi_client_drvdata(cl); in ssip_rx_bootinforeq() local
668 switch (ssi->main_state) { in ssip_rx_bootinforeq()
674 spin_lock(&ssi->lock); in ssip_rx_bootinforeq()
675 ssi->main_state = HANDSHAKE; in ssip_rx_bootinforeq()
676 if (!ssi->waketest) { in ssip_rx_bootinforeq()
677 ssi->waketest = 1; in ssip_rx_bootinforeq()
681 mod_timer(&ssi->tx_wd, jiffies + msecs_to_jiffies(SSIP_WDTOUT)); in ssip_rx_bootinforeq()
682 spin_unlock(&ssi->lock); in ssip_rx_bootinforeq()
686 msg = ssip_claim_cmd(ssi); in ssip_rx_bootinforeq()
695 dev_dbg(&cl->device, "Wrong state M(%d)\n", ssi->main_state); in ssip_rx_bootinforeq()
702 struct ssi_protocol *ssi = hsi_client_drvdata(cl); in ssip_rx_bootinforesp() local
707 spin_lock(&ssi->lock); in ssip_rx_bootinforesp()
708 if (ssi->main_state != ACTIVE) in ssip_rx_bootinforesp()
710 mod_timer(&ssi->tx_wd, jiffies + msecs_to_jiffies(SSIP_WDTOUT)); in ssip_rx_bootinforesp()
713 ssi->main_state); in ssip_rx_bootinforesp()
714 spin_unlock(&ssi->lock); in ssip_rx_bootinforesp()
719 struct ssi_protocol *ssi = hsi_client_drvdata(cl); in ssip_rx_waketest() local
722 spin_lock(&ssi->lock); in ssip_rx_waketest()
723 if (ssi->main_state != HANDSHAKE) { in ssip_rx_waketest()
725 ssi->main_state); in ssip_rx_waketest()
726 spin_unlock(&ssi->lock); in ssip_rx_waketest()
729 if (ssi->waketest) { in ssip_rx_waketest()
730 ssi->waketest = 0; 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(&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(&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(&ssi->lock); in ssip_rx_ready()
759 if (ssi->send_state != WAIT4READY) { in ssip_rx_ready()
761 spin_unlock(&ssi->lock); in ssip_rx_ready()
764 ssip_set_txstate(ssi, SEND_READY); in ssip_rx_ready()
765 spin_unlock(&ssi->lock); in ssip_rx_ready()
771 struct ssi_protocol *ssi = hsi_client_drvdata(cl); in ssip_rx_strans() local
777 spin_lock(&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(&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(&ssi->lock); in ssip_rx_strans()
791 ssi->rxid++; in ssip_rx_strans()
792 spin_unlock(&ssi->lock); in ssip_rx_strans()
793 skb = netdev_alloc_skb(ssi->netdev, len * 4); in ssip_rx_strans()
798 skb->dev = ssi->netdev; in ssip_rx_strans()
800 msg = ssip_alloc_data(ssi, skb, GFP_ATOMIC); in ssip_rx_strans()
857 struct ssi_protocol *ssi = hsi_client_drvdata(cl); in ssip_swbreak_complete() local
860 spin_lock(&ssi->lock); in ssip_swbreak_complete()
861 if (list_empty(&ssi->txqueue)) { in ssip_swbreak_complete()
862 if (atomic_read(&ssi->tx_usecnt)) { in ssip_swbreak_complete()
863 ssip_set_txstate(ssi, SEND_READY); in ssip_swbreak_complete()
865 ssip_set_txstate(ssi, SEND_IDLE); in ssip_swbreak_complete()
868 spin_unlock(&ssi->lock); in ssip_swbreak_complete()
870 spin_unlock(&ssi->lock); in ssip_swbreak_complete()
873 netif_wake_queue(ssi->netdev); in ssip_swbreak_complete()
879 struct ssi_protocol *ssi = hsi_client_drvdata(cl); in ssip_tx_data_complete() local
887 spin_lock(&ssi->lock); in ssip_tx_data_complete()
888 if (list_empty(&ssi->txqueue)) { in ssip_tx_data_complete()
889 ssip_set_txstate(ssi, SENDING_SWBREAK); in ssip_tx_data_complete()
890 spin_unlock(&ssi->lock); in ssip_tx_data_complete()
891 cmsg = ssip_claim_cmd(ssi); in ssip_tx_data_complete()
897 spin_unlock(&ssi->lock); in ssip_tx_data_complete()
921 struct ssi_protocol *ssi = hsi_client_drvdata(cl); in ssip_pn_open() local
937 spin_lock_bh(&ssi->lock); in ssip_pn_open()
938 if (!ssi->waketest) { in ssip_pn_open()
939 ssi->waketest = 1; in ssip_pn_open()
942 ssi->main_state = INIT; in ssip_pn_open()
943 spin_unlock_bh(&ssi->lock); in ssip_pn_open()
971 struct ssi_protocol *ssi = hsi_client_drvdata(cl); in ssip_pn_xmit() local
991 msg = ssip_alloc_data(ssi, skb, GFP_ATOMIC); in ssip_pn_xmit()
998 spin_lock_bh(&ssi->lock); in ssip_pn_xmit()
999 if (unlikely(ssi->main_state != ACTIVE)) { in ssip_pn_xmit()
1000 spin_unlock_bh(&ssi->lock); in ssip_pn_xmit()
1004 list_add_tail(&msg->link, &ssi->txqueue); in ssip_pn_xmit()
1005 ssi->txqueue_len++; in ssip_pn_xmit()
1006 if (dev->tx_queue_len < ssi->txqueue_len) { in ssip_pn_xmit()
1007 dev_info(&cl->device, "TX queue full %d\n", ssi->txqueue_len); in ssip_pn_xmit()
1010 if (ssi->send_state == SEND_IDLE) { in ssip_pn_xmit()
1011 ssip_set_txstate(ssi, WAIT4READY); in ssip_pn_xmit()
1012 spin_unlock_bh(&ssi->lock); in ssip_pn_xmit()
1013 dev_dbg(&cl->device, "Start TX qlen %d\n", ssi->txqueue_len); in ssip_pn_xmit()
1015 } else if (ssi->send_state == SEND_READY) { in ssip_pn_xmit()
1018 ssi->txqueue_len); in ssip_pn_xmit()
1019 spin_unlock_bh(&ssi->lock); in ssip_pn_xmit()
1022 spin_unlock_bh(&ssi->lock); in ssip_pn_xmit()
1040 struct ssi_protocol *ssi = hsi_client_drvdata(master); in ssip_reset_event() local
1041 dev_err(&ssi->cl->device, "CMT reset detected!\n"); in ssip_reset_event()
1042 ssip_error(ssi->cl); in ssip_reset_event()
1073 struct ssi_protocol *ssi; in ssi_protocol_probe() local
1076 ssi = kzalloc(sizeof(*ssi), GFP_KERNEL); in ssi_protocol_probe()
1077 if (!ssi) { in ssi_protocol_probe()
1082 spin_lock_init(&ssi->lock); in ssi_protocol_probe()
1083 init_timer_deferrable(&ssi->rx_wd); in ssi_protocol_probe()
1084 init_timer_deferrable(&ssi->tx_wd); in ssi_protocol_probe()
1085 init_timer(&ssi->keep_alive); in ssi_protocol_probe()
1086 ssi->rx_wd.data = (unsigned long)cl; in ssi_protocol_probe()
1087 ssi->rx_wd.function = ssip_wd; in ssi_protocol_probe()
1088 ssi->tx_wd.data = (unsigned long)cl; in ssi_protocol_probe()
1089 ssi->tx_wd.function = ssip_wd; in ssi_protocol_probe()
1090 ssi->keep_alive.data = (unsigned long)cl; in ssi_protocol_probe()
1091 ssi->keep_alive.function = ssip_keep_alive; in ssi_protocol_probe()
1092 INIT_LIST_HEAD(&ssi->txqueue); in ssi_protocol_probe()
1093 INIT_LIST_HEAD(&ssi->cmdqueue); in ssi_protocol_probe()
1094 atomic_set(&ssi->tx_usecnt, 0); in ssi_protocol_probe()
1095 hsi_client_set_drvdata(cl, ssi); in ssi_protocol_probe()
1096 ssi->cl = cl; in ssi_protocol_probe()
1098 ssi->channel_id_cmd = hsi_get_channel_id_by_name(cl, "mcsaab-control"); in ssi_protocol_probe()
1099 if (ssi->channel_id_cmd < 0) { in ssi_protocol_probe()
1100 err = ssi->channel_id_cmd; in ssi_protocol_probe()
1105 ssi->channel_id_data = hsi_get_channel_id_by_name(cl, "mcsaab-data"); in ssi_protocol_probe()
1106 if (ssi->channel_id_data < 0) { in ssi_protocol_probe()
1107 err = ssi->channel_id_data; in ssi_protocol_probe()
1112 err = ssip_alloc_cmds(ssi); in ssi_protocol_probe()
1118 ssi->netdev = alloc_netdev(0, ifname, NET_NAME_UNKNOWN, ssip_pn_setup); in ssi_protocol_probe()
1119 if (!ssi->netdev) { in ssi_protocol_probe()
1125 SET_NETDEV_DEV(ssi->netdev, dev); in ssi_protocol_probe()
1126 netif_carrier_off(ssi->netdev); in ssi_protocol_probe()
1127 err = register_netdev(ssi->netdev); in ssi_protocol_probe()
1133 list_add(&ssi->link, &ssip_list); in ssi_protocol_probe()
1136 ssi->channel_id_cmd, ssi->channel_id_data); in ssi_protocol_probe()
1140 free_netdev(ssi->netdev); in ssi_protocol_probe()
1142 ssip_free_cmds(ssi); in ssi_protocol_probe()
1144 kfree(ssi); in ssi_protocol_probe()
1152 struct ssi_protocol *ssi = hsi_client_drvdata(cl); in ssi_protocol_remove() local
1154 list_del(&ssi->link); in ssi_protocol_remove()
1155 unregister_netdev(ssi->netdev); in ssi_protocol_remove()
1156 ssip_free_cmds(ssi); in ssi_protocol_remove()
1158 kfree(ssi); in ssi_protocol_remove()