aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Reichel <sre@kernel.org>2016-01-17 10:49:08 -0500
committerSebastian Reichel <sre@kernel.org>2016-01-28 11:47:56 -0500
commit87d99063be016ceee90723a13365a40b21eec0d9 (patch)
tree51ba9ea0edae2fb35cab4a1a42aab11652a3f5ff
parent633f67a51d078bea627f22d6208442e1e1f391cb (diff)
HSI: ssi-protocol: Use handshake logic from n950
When using the ssi-protocol driver with the Nokia N950, the following error is thrown during modem powered up sequence. [13852.274993] port0: SSI error: 0x01 [13852.279205] ssi-protocol ssi-protocol: RX error detected [13852.284820] ssi-protocol ssi-protocol: Main state: 1 [13852.290069] ssi-protocol ssi-protocol: Recv state: 0 [13852.295288] ssi-protocol ssi-protocol: Send state: 0 [13852.300537] ssi-protocol ssi-protocol: CMT Offline [13852.305603] ssi-protocol ssi-protocol: Wake test 1 [13852.310638] ssi-protocol ssi-protocol: Data RX id: 0 [13852.315887] ssi-protocol ssi-protocol: Data TX id: 0 [13856.001464] ssi-protocol ssi-protocol: Watchdog trigerred [13856.007293] ssi-protocol ssi-protocol: Main state: 1 [13856.012542] ssi-protocol ssi-protocol: Recv state: 0 [13856.017761] ssi-protocol ssi-protocol: Send state: 0 [13856.023010] ssi-protocol ssi-protocol: CMT Offline [13856.028045] ssi-protocol ssi-protocol: Wake test 0 [13856.033111] ssi-protocol ssi-protocol: Data RX id: 0 [13856.038330] ssi-protocol ssi-protocol: Data TX id: 0 This patch fixes the issue by using the handshake setup from the Nokia N950 kernel. The new handshake sequence also works with the N900, so there is no need to differentiate between both modems. Tested-by: Aaro Koskinen <aaro.koskinen@iki.fi> Signed-off-by: Sebastian Reichel <sre@kernel.org>
-rw-r--r--drivers/hsi/clients/ssi_protocol.c16
1 files changed, 5 insertions, 11 deletions
diff --git a/drivers/hsi/clients/ssi_protocol.c b/drivers/hsi/clients/ssi_protocol.c
index a38af68cf326..6595d2091268 100644
--- a/drivers/hsi/clients/ssi_protocol.c
+++ b/drivers/hsi/clients/ssi_protocol.c
@@ -521,13 +521,7 @@ static void ssip_start_rx(struct hsi_client *cl)
521 * high transition. Therefore we need to ignore the sencond UP event. 521 * high transition. Therefore we need to ignore the sencond UP event.
522 */ 522 */
523 if ((ssi->main_state != ACTIVE) || (ssi->recv_state == RECV_READY)) { 523 if ((ssi->main_state != ACTIVE) || (ssi->recv_state == RECV_READY)) {
524 if (ssi->main_state == INIT) { 524 spin_unlock(&ssi->lock);
525 ssi->main_state = HANDSHAKE;
526 spin_unlock(&ssi->lock);
527 ssip_send_bootinfo_req_cmd(cl);
528 } else {
529 spin_unlock(&ssi->lock);
530 }
531 return; 525 return;
532 } 526 }
533 ssip_set_rxstate(ssi, RECV_READY); 527 ssip_set_rxstate(ssi, RECV_READY);
@@ -671,6 +665,7 @@ static void ssip_rx_bootinforeq(struct hsi_client *cl, u32 cmd)
671 ssip_error(cl); 665 ssip_error(cl);
672 /* Fall through */ 666 /* Fall through */
673 case INIT: 667 case INIT:
668 case HANDSHAKE:
674 spin_lock(&ssi->lock); 669 spin_lock(&ssi->lock);
675 ssi->main_state = HANDSHAKE; 670 ssi->main_state = HANDSHAKE;
676 if (!ssi->waketest) { 671 if (!ssi->waketest) {
@@ -688,9 +683,6 @@ static void ssip_rx_bootinforeq(struct hsi_client *cl, u32 cmd)
688 msg->complete = ssip_release_cmd; 683 msg->complete = ssip_release_cmd;
689 hsi_async_write(cl, msg); 684 hsi_async_write(cl, msg);
690 break; 685 break;
691 case HANDSHAKE:
692 /* Ignore */
693 break;
694 default: 686 default:
695 dev_dbg(&cl->device, "Wrong state M(%d)\n", ssi->main_state); 687 dev_dbg(&cl->device, "Wrong state M(%d)\n", ssi->main_state);
696 break; 688 break;
@@ -939,9 +931,11 @@ static int ssip_pn_open(struct net_device *dev)
939 ssi->waketest = 1; 931 ssi->waketest = 1;
940 ssi_waketest(cl, 1); /* FIXME: To be removed */ 932 ssi_waketest(cl, 1); /* FIXME: To be removed */
941 } 933 }
942 ssi->main_state = INIT; 934 ssi->main_state = HANDSHAKE;
943 spin_unlock_bh(&ssi->lock); 935 spin_unlock_bh(&ssi->lock);
944 936
937 ssip_send_bootinfo_req_cmd(cl);
938
945 return 0; 939 return 0;
946} 940}
947 941