From patchwork Tue May 23 13:12:47 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefan Wahren X-Patchwork-Id: 765952 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3wXGGs3TwGz9sPJ for ; Tue, 23 May 2017 23:15:17 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S967582AbdEWNPD (ORCPT ); Tue, 23 May 2017 09:15:03 -0400 Received: from mout.kundenserver.de ([217.72.192.73]:59587 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S967522AbdEWNPA (ORCPT ); Tue, 23 May 2017 09:15:00 -0400 Received: from duckbill-v2-sdk.fritz.box ([109.104.44.37]) by mrelayeu.kundenserver.de (mreue101 [212.227.15.183]) with ESMTPSA (Nemesis) id 0MZUcf-1dWCRo1mRB-00LFZl; Tue, 23 May 2017 15:13:21 +0200 From: Stefan Wahren To: Rob Herring , Mark Rutland , "David S. Miller" Cc: Greg Kroah-Hartman , Jiri Slaby , Lino Sanfilippo , Jakub Kicinski , devicetree@vger.kernel.org, netdev@vger.kernel.org, linux-serial@vger.kernel.org, linux-kernel@vger.kernel.org, Stefan Wahren Subject: [PATCH v6 net-next 11/17] net: qualcomm: prepare frame decoding for UART driver Date: Tue, 23 May 2017 15:12:47 +0200 Message-Id: <1495545173-22150-12-git-send-email-stefan.wahren@i2se.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1495545173-22150-1-git-send-email-stefan.wahren@i2se.com> References: <1495545173-22150-1-git-send-email-stefan.wahren@i2se.com> X-Provags-ID: V03:K0:h9gCGPmIOGNdjCbx+FkcoJNfiXsUEX+3znhspITDghn8a4TVFb+ i/hsGBrKbj/L/w9rsgZDaEKz9EgK7kzabr9N+2ENg8gPYrtlFI9kUwV1OfEuLxQ12waR4Av NcZpmqBUwnu17tk6GkR3cqyIU9Jaynh1bH0gSfESlkadRJQPtmC4PWFippZVkrVdPfFTKji X3i4AOdX8AIbAb+zGDwoQ== X-UI-Out-Filterresults: notjunk:1; V01:K0:gQqw+yKZQ5Y=:QbwmLgRnXLdnjayv5xLf78 MvolfxZLonSGVQX2zn6xEkE0b9xQ7PGlOCftk1nnynRt/N9devD7ukAtvTWjpqjN/T2DzhMqa Az60M/DEgsk/mLShHibsElPCLasZymZ4i+NIhUNSRrC+EPDYmJx8D/P4Mh4+t4vg2kSlb6Hoc 6iOXEzz+ZTWqlWU9pvDlqt2S1zmqAADxVZSi/wFQQ/ddAR+nMxCSK5dtZ1hdju8B0eGOARSRT lXtobyoRNqAlUzdivHAM6rrzH8W2mPluvSIFx6ADcrgkOJRclXX94tm05SPoGKGTREY+/grft YPyiJ9H2GhYJAP0oEHBDP/99JIqbfLVrLgFBGThonMFBHBqzHNLAnmuIdFKA8X5L0iu004PiQ ttwz8dx53QwFoyUruLoKWbPSLXG3It/FwxrPotcRUkWV5fF9jHoseCRuYSGuW37IUB/XGb029 Mwg8kfXXWEz491QRbDjW0X/WSZR+p5heZCpP+BAqiUvY3ACgiCbHsGaPIe35VbqiBC3r/dGFA A2CtjEl3m2ZnkS5cCSDFNmLB1rJiqTPx6MLr5LcD4esI0cpZYQNsspmsMGG027K1clZK/XzX8 C+p0Ct08zL88JwvaV9Dd+5qCEIt/vVLiWt92cIeYN5tsCWRjzO8CERQqDs4bJ0gHQKxK8lYXV C8v+dtnSylwftgg1ymJm8nUWDxYgEKFiVmYruxFydmdw3snkgiqn9i8Z92bmSRRlWDU8= Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Unfortunately the frame format is not exactly identical between SPI and UART. In case of SPI there is an additional HW length at the beginning. So store the initial state to make the decoding state machine more flexible and easy to extend for UART support. Signed-off-by: Stefan Wahren --- drivers/net/ethernet/qualcomm/qca_7k_common.c | 12 ++++++------ drivers/net/ethernet/qualcomm/qca_7k_common.h | 8 ++++++-- drivers/net/ethernet/qualcomm/qca_spi.c | 2 +- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/drivers/net/ethernet/qualcomm/qca_7k_common.c b/drivers/net/ethernet/qualcomm/qca_7k_common.c index 6d17fbd..0d3daa9 100644 --- a/drivers/net/ethernet/qualcomm/qca_7k_common.c +++ b/drivers/net/ethernet/qualcomm/qca_7k_common.c @@ -83,7 +83,7 @@ qcafrm_fsm_decode(struct qcafrm_handle *handle, u8 *buf, u16 buf_len, u8 recv_by if (recv_byte != 0x00) { /* first two bytes of length must be 0 */ - handle->state = QCAFRM_HW_LEN0; + handle->state = handle->init; } break; case QCAFRM_HW_LEN2: @@ -97,7 +97,7 @@ qcafrm_fsm_decode(struct qcafrm_handle *handle, u8 *buf, u16 buf_len, u8 recv_by case QCAFRM_WAIT_AA4: if (recv_byte != 0xAA) { ret = QCAFRM_NOHEAD; - handle->state = QCAFRM_HW_LEN0; + handle->state = handle->init; } else { handle->state--; } @@ -119,7 +119,7 @@ qcafrm_fsm_decode(struct qcafrm_handle *handle, u8 *buf, u16 buf_len, u8 recv_by len = handle->offset; if (len > buf_len || len < QCAFRM_MIN_LEN) { ret = QCAFRM_INVLEN; - handle->state = QCAFRM_HW_LEN0; + handle->state = handle->init; } else { handle->state = (enum qcafrm_state)(len + 1); /* Remaining number of bytes. */ @@ -135,7 +135,7 @@ qcafrm_fsm_decode(struct qcafrm_handle *handle, u8 *buf, u16 buf_len, u8 recv_by case QCAFRM_WAIT_551: if (recv_byte != 0x55) { ret = QCAFRM_NOTAIL; - handle->state = QCAFRM_HW_LEN0; + handle->state = handle->init; } else { handle->state = QCAFRM_WAIT_552; } @@ -143,11 +143,11 @@ qcafrm_fsm_decode(struct qcafrm_handle *handle, u8 *buf, u16 buf_len, u8 recv_by case QCAFRM_WAIT_552: if (recv_byte != 0x55) { ret = QCAFRM_NOTAIL; - handle->state = QCAFRM_HW_LEN0; + handle->state = handle->init; } else { ret = handle->offset; /* Frame is fully received. */ - handle->state = QCAFRM_HW_LEN0; + handle->state = handle->init; } break; } diff --git a/drivers/net/ethernet/qualcomm/qca_7k_common.h b/drivers/net/ethernet/qualcomm/qca_7k_common.h index 5df7c65..07bdd6c 100644 --- a/drivers/net/ethernet/qualcomm/qca_7k_common.h +++ b/drivers/net/ethernet/qualcomm/qca_7k_common.h @@ -61,6 +61,7 @@ #define QCAFRM_ERR_BASE -1000 enum qcafrm_state { + /* HW length is only available on SPI */ QCAFRM_HW_LEN0 = 0x8000, QCAFRM_HW_LEN1 = QCAFRM_HW_LEN0 - 1, QCAFRM_HW_LEN2 = QCAFRM_HW_LEN1 - 1, @@ -101,6 +102,8 @@ enum qcafrm_state { struct qcafrm_handle { /* Current decoding state */ enum qcafrm_state state; + /* Initial state depends on connection type */ + enum qcafrm_state init; /* Offset in buffer (borrowed for length too) */ u16 offset; @@ -113,9 +116,10 @@ u16 qcafrm_create_header(u8 *buf, u16 len); u16 qcafrm_create_footer(u8 *buf); -static inline void qcafrm_fsm_init(struct qcafrm_handle *handle) +static inline void qcafrm_fsm_init_spi(struct qcafrm_handle *handle) { - handle->state = QCAFRM_HW_LEN0; + handle->init = QCAFRM_HW_LEN0; + handle->state = handle->init; } /* Gather received bytes and try to extract a full Ethernet frame diff --git a/drivers/net/ethernet/qualcomm/qca_spi.c b/drivers/net/ethernet/qualcomm/qca_spi.c index 43cc7de..de78f60 100644 --- a/drivers/net/ethernet/qualcomm/qca_spi.c +++ b/drivers/net/ethernet/qualcomm/qca_spi.c @@ -638,7 +638,7 @@ qcaspi_netdev_open(struct net_device *dev) qca->intr_req = 1; qca->intr_svc = 0; qca->sync = QCASPI_SYNC_UNKNOWN; - qcafrm_fsm_init(&qca->frm_handle); + qcafrm_fsm_init_spi(&qca->frm_handle); qca->spi_thread = kthread_run((void *)qcaspi_spi_thread, qca, "%s", dev->name);