From patchwork Mon May 29 11:57:19 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefan Wahren X-Patchwork-Id: 768161 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 3wbwLr6b0sz9s0m for ; Mon, 29 May 2017 22:01:24 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751297AbdE2L7F (ORCPT ); Mon, 29 May 2017 07:59:05 -0400 Received: from mout.kundenserver.de ([212.227.126.187]:59789 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750954AbdE2L7D (ORCPT ); Mon, 29 May 2017 07:59:03 -0400 Received: from duckbill-v2-sdk.fritz.box ([109.104.48.59]) by mrelayeu.kundenserver.de (mreue005 [212.227.15.167]) with ESMTPSA (Nemesis) id 0MbtTu-1dWQTv2tZ0-00JKyh; Mon, 29 May 2017 13:57:37 +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 v8 net-next 11/17] net: qualcomm: prepare frame decoding for UART driver Date: Mon, 29 May 2017 13:57:19 +0200 Message-Id: <1496059045-13572-12-git-send-email-stefan.wahren@i2se.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1496059045-13572-1-git-send-email-stefan.wahren@i2se.com> References: <1496059045-13572-1-git-send-email-stefan.wahren@i2se.com> X-Provags-ID: V03:K0:vt7ZkX43MlLYaHWhICvXqfqNvd3coUEViKHYxZ1ezYo83Al1jT2 Z1aZkClSFjWpO6ho48WUlQcMGvsEOopOlvaOpFUqSJzZ8nH2PaX7vU+ueuFBfTQLar0/0q0 l1vTy2bnFFOHyGfc13nXPb3rJ1YF5x1OpEvhC+HQ3OcHLXjufUkh/UAOoWk2luDsY189tQu bI/N8LyE3QdAkjcGMO52g== X-UI-Out-Filterresults: notjunk:1; V01:K0:DmmnYk3tems=:GblPUcDjfXzf4O8oh15yZ0 bS0TDH0mEWgbmTtC8Ah6TzZkP9II9X8gSyD1kehGUelPuydBRzyD2fHh3Ju+nNeUlX6FRDqu+ 4ZnZzhGrIj5DcmODP456xO0spGT1euLOsYoWG/Vgu+/6j490LiME9PdcAerM0FaAW5qTUaW4x Cvn/tt4CgLnJlZ/Us/wEz0Pt1pwDMHRzc0DECqEJJLPDw8+NI0xMqBF/frplJwFoDXMcZCb0R kSmwBPZB3Gf7JV2B/6X5Os1+Mj9OqfEIvsomcodXkERzB3cq4O62EyNDHdTY6Yu72e2rJB1/0 tMr5Xb5Efv1fu/lKozmDfgjLG5CZPYVFxD7Y5XXvP/pWQOFQFOaUqnaxq9dJIQRyO7rAy9DVX VtqzCWVSeHK3yKM82Mge2BbDCm8xslLFdZeZmAMs6M7gYHANbfUeIOqnshbYTUDCbqSxqSvWt aH2iYLSO1pPtLhjihr095Jnfl6+rolwJ5rBZ8VaaFxnVpd2YONo00bra3p22tbuzEOePpmdcU +3P313CZUTvYAzwrm5HCjnk79N5/DJ8D3C4ScNYTmJRlt7qNm35qtd1hQTZX+EZVOKAKkdkbi Iml+uk6Dx+z6P2bWPdIxKTJGApu1IOMOpYNm8PG3/XylaxlCD7JolMLWgFMGZ23dnF/8nxVnp VVL46G26E5pE0OrwG+sICwKiK3cggl3y+SWGhV/7wIOpqlH9uMmHmcTDM0AZi/N2GH6Q= 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);