From patchwork Mon Jan 28 16:12:59 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Whitten X-Patchwork-Id: 1032005 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="S6Aw+hUO"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43pF7D6vybz9sRL for ; Tue, 29 Jan 2019 03:14:00 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387539AbfA1QN7 (ORCPT ); Mon, 28 Jan 2019 11:13:59 -0500 Received: from mail-wr1-f65.google.com ([209.85.221.65]:45682 "EHLO mail-wr1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2387514AbfA1QNx (ORCPT ); Mon, 28 Jan 2019 11:13:53 -0500 Received: by mail-wr1-f65.google.com with SMTP id t6so18654622wrr.12; Mon, 28 Jan 2019 08:13:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=qitsf1i7oCTC9R2MN+j37S7wP/F6/6ncV7JvZFtiRs0=; b=S6Aw+hUOZLuh2alGmqkgc/KZ3j8Iij+2tYUSbQeu8EzCpnVrE6UFxP4+S1WdF4bi+t 7xa4jV6LlJGti+0qQlzDsJe88HUCcCb2eMxZ9TWHeMwOOP8GN/VXH+FjGbuOCQq1k7JW s5YoWvuaAMFhrZOCna91FlgSltEUkWVtFCVSLx72H76ApO3QlubsxgsCu8euB2jyiMwt fGULyzPH/Rk4JqSAwbcx2VMasLAAKJsTpwavSoHE0fJZAAJJjb9oox7bRdohkXuB9OXQ aoZ+fq9oNhBJGOUwRFrqqrw84l7JPaPNMs1pmCpYsMNZI3i6/NA3CgKihd+P6bC6SNRO RgSA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=qitsf1i7oCTC9R2MN+j37S7wP/F6/6ncV7JvZFtiRs0=; b=AAodz/oPOvx17JClHncp8wswHvihOd6oWvq/ebwby/f+dkiHl7wT/MMNeu38A8dwmY REvq47pPfC9cgyqZ06RIrEQxYdd4kJTYAVOhqEd1Hkz9xrEoWyXKB8x5+iHRpzb8QCxf lvCv9HFZnUhnom26g4qBMaSEinlztYADu1Bb+WQmSuPbjV2Akyi/eMDWhJ76jm0QhhrR JBpKdcxOltiwqnte+/wq1n2wptQ4Wcbz2AwPmM5y9rSYpmz53EUcfj+a3QWk6OHBGJTe Q1Qmnv0ywPJpO5HZ3BwDp84V64k2AyGemmpuDAhJ4EenJzcHu33hLxWVdkZ56uE17Ca6 x0IA== X-Gm-Message-State: AJcUukfYpNk6IF+XAVfxXZtL9JiT3ijNthMzk2U0KYPD+Au9u11EQmjs TARNilciuH/7pbTP/oD7Ay8= X-Google-Smtp-Source: ALg8bN4pkUWDKjLT1mdZs6vD7FCNGq34AHvvCev201NtMwmoc7ynEWJDztO1JRXaR+jIDyZFNga7DQ== X-Received: by 2002:adf:bb8d:: with SMTP id q13mr22154860wrg.183.1548692031264; Mon, 28 Jan 2019 08:13:51 -0800 (PST) Received: from Sarah.corp.lairdtech.com ([109.174.151.67]) by smtp.gmail.com with ESMTPSA id l20sm246445944wrb.93.2019.01.28.08.13.50 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 28 Jan 2019 08:13:50 -0800 (PST) From: Ben Whitten X-Google-Original-From: Ben Whitten To: afaerber@suse.de Cc: linux-lpwan@lists.infradead.org, Ben Whitten , "David S. Miller" , netdev@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH lora-next 05/11] net: lora: sx130x: initialise AGC Date: Mon, 28 Jan 2019 16:12:59 +0000 Message-Id: <20190128161306.27805-6-ben.whitten@lairdtech.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190128161306.27805-1-ben.whitten@lairdtech.com> References: <20190128161306.27805-1-ben.whitten@lairdtech.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Ben Whitten Initialisation of the AGC firmware requires a couple of steps to be completed; - Loading a TX LUT - Loading the two MSBs for the radio tx synthesizer frequencies, (Always 3 if f > 768 for SX1257 and SX1258 or f > 384 for SX1255) - Loading a firmware option - Finish initialisation by writing intended value of the radio select register. Signed-off-by: Ben Whitten --- drivers/net/lora/sx130x.c | 110 ++++++++++++++++++++++++++++++++++++++ drivers/net/lora/sx130x.h | 7 +++ 2 files changed, 117 insertions(+) diff --git a/drivers/net/lora/sx130x.c b/drivers/net/lora/sx130x.c index 818a1c9192b3..18acfc8e934d 100644 --- a/drivers/net/lora/sx130x.c +++ b/drivers/net/lora/sx130x.c @@ -537,6 +537,111 @@ static int sx130x_load_all_firmware(struct sx130x_priv *priv) return 0; } +static int sx130x_load_tx_gain_lut(struct sx130x_priv *priv) +{ + struct net_device *netdev = dev_get_drvdata(priv->dev); + struct sx130x_tx_gain_lut *lut = priv->tx_gain_lut; + unsigned int status, val; + int ret, i; + + for (i = 0; i < priv->tx_gain_lut_size; i++) { + val = lut->pa_gain << SX1301_PA_GAIN_OFFSET; + val |= lut->dac_gain << SX1301_DAC_GAIN_OFFSET; + val |= lut->mix_gain; + + netdev_info(netdev, "AGC LUT entry %d dBm: 0x%02x\n", lut->power, val); + ret = sx130x_agc_transaction(priv, val, &status); + if (ret) { + netdev_err(netdev, "AGC LUT load failed\n"); + return ret; + } + if (status != (SX1301_AGC_STATUS_SUCCESS | i)) { + netdev_err(netdev, "AGC firmware LUT init error: 0x%02x", status); + return -ENXIO; + } + lut++; + } + + /* Abort the transaction if there are less then 16 entries */ + if (priv->tx_gain_lut_size < SX1301_TX_GAIN_LUT_MAX) { + ret = sx130x_agc_transaction(priv, SX1301_AGC_CMD_ABORT, &status); + if (ret) { + netdev_err(netdev, "AGC LUT abort failed\n"); + return ret; + } + if (status != SX1301_AGC_STATUS_SUCCESS) { + netdev_err(netdev, "AGC firmware LUT abort error: 0x%02x", status); + return -ENXIO; + } + } + + return ret; +}; + +static int sx130x_agc_init(struct sx130x_priv *priv) +{ + struct net_device *netdev = dev_get_drvdata(priv->dev); + unsigned int tx_msb; + unsigned int val; + int ret; + + ret = regmap_read(priv->regmap, SX1301_AGCSTS, &val); + if (ret) { + netdev_err(netdev, "AGC status read failed\n"); + return ret; + } + if (val != SX1301_AGC_STATUS_READY) { + netdev_err(netdev, "AGC firmware init failure: 0x%02x\n", val); + return -ENXIO; + } + + ret = sx130x_load_tx_gain_lut(priv); + if (ret) + return ret; + + /* + * Load Tx freq MSBs + * Always 3 if f > 768 for SX1257 and SX1258 or f > 384 for SX1255 + */ + tx_msb = 3; /* TODO detect radio type */ + + ret = sx130x_agc_transaction(priv, tx_msb, &val); + if (ret) { + netdev_err(netdev, "AGC Tx MSBs load failed\n"); + return ret; + } + if (val != (SX1301_AGC_STATUS_SUCCESS | tx_msb)) { + netdev_err(netdev, "AGC firmware Tx MSBs error: 0x%02x", val); + return -ENXIO; + } + + /* Load chan_select firmware option */ + ret = sx130x_agc_transaction(priv, 0, &val); + if (ret) { + netdev_err(netdev, "AGC chan select failed\n"); + return ret; + } + if (val != (SX1301_AGC_STATUS_SUCCESS | 0)) { + netdev_err(netdev, "AGC firmware chan select error: 0x%02x", val); + return -ENXIO; + } + + /* End AGC firmware init and check status */ + /* TODO load the intended value of radio_select here + * LORA IF mapping to radio A/B (per bit, 0=A, 1=B) */ + ret = sx130x_agc_transaction(priv, 0, &val); + if (ret) { + netdev_err(netdev, "AGC radio select failed\n"); + return ret; + } + if (val != SX1301_AGC_STATUS_INITIALISED) { + netdev_err(netdev, "AGC firmware init error: 0x%02x", val); + return -ENXIO; + } + + return ret; +} + static netdev_tx_t sx130x_loradev_start_xmit(struct sk_buff *skb, struct net_device *netdev) { if (skb->protocol != htons(ETH_P_LORA)) { @@ -589,6 +694,11 @@ static int sx130x_loradev_open(struct net_device *netdev) if (ret) goto err_firmware; + usleep_range(1000, 2000); + ret = sx130x_agc_init(priv); + if (ret) + goto err_firmware; + ret = open_loradev(netdev); if (ret) goto err_open; diff --git a/drivers/net/lora/sx130x.h b/drivers/net/lora/sx130x.h index 69bb9cbd1aba..2878dd3cc547 100644 --- a/drivers/net/lora/sx130x.h +++ b/drivers/net/lora/sx130x.h @@ -19,8 +19,15 @@ #define SX1301_MCU_AGC_CAL_FW_VERSION 2 #define SX1301_AGC_CMD_WAIT 16 +#define SX1301_AGC_CMD_ABORT 17 + +#define SX1301_AGC_STATUS_READY 0x10 +#define SX1301_AGC_STATUS_SUCCESS 0x30 +#define SX1301_AGC_STATUS_INITIALISED 0x40 #define SX1301_TX_GAIN_LUT_MAX 16 +#define SX1301_PA_GAIN_OFFSET 6 +#define SX1301_DAC_GAIN_OFFSET 4 /* Page independent */ #define SX1301_PAGE 0x00