From patchwork Mon Jan 28 16:12:55 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Whitten X-Patchwork-Id: 1032053 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="azGyiivK"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43pGGH18VZz9sRL for ; Tue, 29 Jan 2019 04:05:10 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387843AbfA1RFF (ORCPT ); Mon, 28 Jan 2019 12:05:05 -0500 Received: from mail-wr1-f66.google.com ([209.85.221.66]:45673 "EHLO mail-wr1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731037AbfA1QNs (ORCPT ); Mon, 28 Jan 2019 11:13:48 -0500 Received: by mail-wr1-f66.google.com with SMTP id t6so18654318wrr.12; Mon, 28 Jan 2019 08:13:47 -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=2+sJQfhRPX6mgylgaohdp6BE3uFottGVMdhI97In/E4=; b=azGyiivKbCzx3Bvy+KIIjB2yZfo2+rITf8W3lChR2G2ZxvIivU9DclhzliIDCRkNfB 3djqkW/od2EwAeDq9yMKepogcPGIWr1DaxqWrI4Pv9yQ+ko1njFBmzzy5L4wgUQjVoAm JHFDXHCJl/5Hkc1OMgCyL+wOT/1YX7h1yV945cZIeTeRfd0ZHOcTzzNKHNwzSnWhBvrj mF/M6vmE1ZpZC0sLSOnNFDQGKvvkDVQJkXzj5M6jSXejrq7wGKDnDe9gApJUm3OThOcv OKR1+e0PCq3M/dC7ylXRN3bZJ1VY3ZpVM/Zy/knYQRDxSnw/gp62yZ23FC1Bcb7prF7s 6AWw== 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=2+sJQfhRPX6mgylgaohdp6BE3uFottGVMdhI97In/E4=; b=DlegejmrDMIsqJAEsdQJU8MrFUXHmVaWIIB8aGbrQqpkvUauaLwOjFS43q10BohhVU KRUbYrXHFp8I8ZRnYIE/pL0IvkiY0MzCOLKxjaO0s5kV0XAWHywQm8iscS1yluf84ktI spIdletnmbUE9wv9ejVJyNXSjP6uVQabjWHNpVTBtLv/9u1fdX9u/jPTeeNQhn65iwpM V/RZfBiK/PWNrIyqvAdAYH5J2QHkRHuJwROhYxhx7cd4T8a/5BLX08HbpyLk1z21m7/1 g5KE24Ny+5i5QgZ6SB89hqWpB4TVKxkllYwZWIsjqkJSQkX/W5Y7YchMDfpSHSjkogCR zZOw== X-Gm-Message-State: AJcUukdc4nGmtsmzOAQGDW5zjOj1ZeTSajERI1FH2PtS3hbtlP1JJxKo KO4D5c92ffqbzH8c7cDpbkQ= X-Google-Smtp-Source: ALg8bN5uddej6N91AE+Kg95AktnFUdX/H201nmBnlH0aAKU35B6K35IvD0280V1sLCyRuC5f1taG5Q== X-Received: by 2002:adf:900f:: with SMTP id h15mr22393334wrh.18.1548692026370; Mon, 28 Jan 2019 08:13:46 -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.45 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 28 Jan 2019 08:13:45 -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" , Rob Herring , Mark Rutland , netdev@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH lora-next 01/11] dt-bindings: net: lora: sx130x: add power lut binding Date: Mon, 28 Jan 2019 16:12:55 +0000 Message-Id: <20190128161306.27805-2-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 Adding power lookup table for the concentrator specified in DT. These values are calibrated for the hardware and are unique to hardware designs and certifications. First byte is signed power in dBm measured at the rf connector. Second byte is unsigned value for DIGITAL gain. Third byte is unsigned value for PA gain, 2 bits only. Fourth byte is unsigned value for DAC gain, 2 bits only. Fifth byte is unsigned value for MIXER gain, 4 bits only. Signed-off-by: Ben Whitten --- .../bindings/net/lora/semtech,sx130x.yaml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Documentation/devicetree/bindings/net/lora/semtech,sx130x.yaml b/Documentation/devicetree/bindings/net/lora/semtech,sx130x.yaml index 24fad1218735..187fa2090a0b 100644 --- a/Documentation/devicetree/bindings/net/lora/semtech,sx130x.yaml +++ b/Documentation/devicetree/bindings/net/lora/semtech,sx130x.yaml @@ -37,6 +37,15 @@ properties: maxItems: 1 description: A connection of the reset gpio line. + power-lut: + description: Power lookup table for the concentrator. + Consisting of maximum 16 entries, each entry having the following format; + First byte is signed power in dBm measured at the rf connector. + Second byte is unsigned value for DIGITAL gain. + Third byte is unsigned value for PA gain, 2 bits only. + Fourth byte is unsigned value for DAC gain, 2 bits only. + Fifth byte is unsigned value for MIXER gain, 4 bits only. + radio-spi: type: object description: The concentrator can have two radios connected which are @@ -83,6 +92,10 @@ examples: reset-gpios = <&pioB 27 GPIO_ACTIVE_HIGH>; spi-max-frequency = <8000000>; + power-lut = [ 00 00 00 03 09 + 03 00 00 03 0C + 04 00 00 03 0D ]; + radio-spi { #address-cells = <1>; #size-cells = <0>; From patchwork Mon Jan 28 16:12:56 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Whitten X-Patchwork-Id: 1032052 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="Jazvh5Y1"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43pGFw1by3z9sPJ for ; Tue, 29 Jan 2019 04:04:52 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387572AbfA1REi (ORCPT ); Mon, 28 Jan 2019 12:04:38 -0500 Received: from mail-wm1-f65.google.com ([209.85.128.65]:39455 "EHLO mail-wm1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2387484AbfA1QNt (ORCPT ); Mon, 28 Jan 2019 11:13:49 -0500 Received: by mail-wm1-f65.google.com with SMTP id y8so14487412wmi.4; Mon, 28 Jan 2019 08:13:48 -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=7vJbqda7iNfsdkEaTDsRhUcFyf2+2O1DQ8LxmuJuzHg=; b=Jazvh5Y1f/v+gpqvtOuhcL1/QBuu/0j8BV1WPiW0NrcRiW501QqH0Vgz/LbbNuiV24 QSLGOEOdO93sDGidWhZPN4lsNH/O5b5oOvfXnyRA7ppSsVoi59Da+aZIldkKW0gBz6er 6DC317YbKWSxeZDsrrVLBJkNpA7gEH0rf2HnW8ONXrlXFTsIOqhJxgjWat9ap1HAzc9R Nxz06V9deFhQb10Slo+7BuklQzFFOBIf7l4l7CuvEl5y2bPGTic15obdtkd7q/8c3xBP 4yRI9CE7i994rLVBvUn9K22Qem5VLfv4wMk2ndlVo52/IQoKcl7sKQcVwyL8eC+C4pnb cWgw== 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=7vJbqda7iNfsdkEaTDsRhUcFyf2+2O1DQ8LxmuJuzHg=; b=YEK8DigFuK4OulzlVMXflAhBB69SBG8SLnaNz4PzzUaJQjuwt6vFzC8Leska0sfmxj Wh+yThvnI3W1mNiK2af4A60jfHzsKXvGIdNEm/8z2A0Umxbqjld/OA3Ig1/72QHl6C8s pS69oWS210rtvM9P5SKg9Os+5G5+T4B6kdxe4hvA8HX/m5v/h8aVkmOtkWExn9xxcmBd nhzuE+YtDKI2BR3+FjZcMbdSpbmPeC8/Wnxtq0ucYEj6pQyVuhiu2FNakDPX4jBgSEb8 ljoXQHtEDK2nvC9vvZwGiZOt1EK2YxTTwUHw3hKm3ch44ozla1FFmNkJh2BV3217FtD1 6zgw== X-Gm-Message-State: AJcUukcko0V6d8QPdc+7/i7WUdi+bO2BBG8GKnGVV0lcsNdgUbWKLShk JqTgABu0kpP14x5FP1N9uoc= X-Google-Smtp-Source: ALg8bN478f2KbrS5TRr8sDSZd97jwRteH3GPk+QMkUpMj7yWe4T3az5DbCqidcDK6sQ/jRpAuE8BMw== X-Received: by 2002:a7b:c156:: with SMTP id z22mr17616880wmi.24.1548692027665; Mon, 28 Jan 2019 08:13:47 -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.46 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 28 Jan 2019 08:13:47 -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 02/11] net: lora: sx130x: add loading of tx lut from DT Date: Mon, 28 Jan 2019 16:12:56 +0000 Message-Id: <20190128161306.27805-3-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 The AGC software requires loading of a power lookup table on initialisation prior to transmission. The fields required are digital, pa, dac, and mixer gain. These values are typically hardware specific and calibrated for a particular power output at the card rf port. The format of the DT binding is a valid entry is 5 bytes, a valid table is up to 16 entries. Signed-off-by: Ben Whitten --- drivers/net/lora/sx130x.c | 29 +++++++++++++++++++++++++++++ drivers/net/lora/sx130x.h | 2 ++ 2 files changed, 31 insertions(+) diff --git a/drivers/net/lora/sx130x.c b/drivers/net/lora/sx130x.c index 3174fc695d54..70cfb4532b51 100644 --- a/drivers/net/lora/sx130x.c +++ b/drivers/net/lora/sx130x.c @@ -51,6 +51,14 @@ static const struct reg_field sx130x_regmap_fields[] = { REG_FIELD(SX1301_EMERGENCY_FORCE_HOST_CTRL, 0, 0), }; +struct sx130x_tx_gain_lut { + s8 power; /* dBm measured at board connector */ + u8 dig_gain; + u8 pa_gain; + u8 dac_gain; + u8 mix_gain; +}; + struct sx130x_priv { struct lora_dev_priv lora; struct device *dev; @@ -59,6 +67,8 @@ struct sx130x_priv { struct regmap_field *regmap_fields[ARRAY_SIZE(sx130x_regmap_fields)]; struct mutex io_lock; void *drvdata; + struct sx130x_tx_gain_lut tx_gain_lut[SX1301_TX_GAIN_LUT_MAX]; + u8 tx_gain_lut_size; }; struct regmap *sx130x_get_regmap(struct device *dev) @@ -589,6 +599,7 @@ int sx130x_early_probe(struct regmap *regmap, struct gpio_desc *rst) struct device *dev = regmap_get_device(regmap); struct net_device *netdev; struct sx130x_priv *priv; + const u8 *power_lut; int ret; int i; @@ -620,6 +631,24 @@ int sx130x_early_probe(struct regmap *regmap, struct gpio_desc *rst) return ret; } } + + if (IS_ENABLED(CONFIG_OF)) { + power_lut = of_get_property(dev->of_node, "power-lut", &ret); + if (power_lut && (ret % 5)) { + dev_err(dev, "Invalid power table\n"); + return -EINVAL; + } else if (power_lut) { + priv->tx_gain_lut_size = ret / 5; + for (i = 0; i < priv->tx_gain_lut_size; i++) { + priv->tx_gain_lut[i].power = *(power_lut++); + priv->tx_gain_lut[i].dig_gain = *(power_lut++); + priv->tx_gain_lut[i].pa_gain = *(power_lut++) & 0x03; + priv->tx_gain_lut[i].dac_gain = *(power_lut++) & 0x03; + priv->tx_gain_lut[i].mix_gain = *(power_lut++) & 0x0F; + } + } + } + return 0; } EXPORT_SYMBOL_GPL(sx130x_early_probe); diff --git a/drivers/net/lora/sx130x.h b/drivers/net/lora/sx130x.h index abab2ee42512..6330777f4eac 100644 --- a/drivers/net/lora/sx130x.h +++ b/drivers/net/lora/sx130x.h @@ -18,6 +18,8 @@ #define SX1301_MCU_AGC_FW_VERSION 4 #define SX1301_MCU_AGC_CAL_FW_VERSION 2 +#define SX1301_TX_GAIN_LUT_MAX 16 + /* Page independent */ #define SX1301_PAGE 0x00 #define SX1301_VER 0x01 From patchwork Mon Jan 28 16:12:57 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Whitten X-Patchwork-Id: 1032048 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="Kg0Gf4/2"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43pGFN2sCqz9sPP for ; Tue, 29 Jan 2019 04:04:24 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387512AbfA1QNv (ORCPT ); Mon, 28 Jan 2019 11:13:51 -0500 Received: from mail-wr1-f67.google.com ([209.85.221.67]:46986 "EHLO mail-wr1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2387491AbfA1QNu (ORCPT ); Mon, 28 Jan 2019 11:13:50 -0500 Received: by mail-wr1-f67.google.com with SMTP id l9so18631549wrt.13; Mon, 28 Jan 2019 08:13:49 -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=1zfoc6CoBhTv79t1tVnJWGGdH9udjSmsd+rMCNx1WR0=; b=Kg0Gf4/2msvShoD5YIrJ53NWsRTrporTZyCnFfSqPX5kahvwtrRIBeSzcg3R7G028y cEun3loSxKs/5IeRgKxgCq37y/p7GGkG7VlNjkU+opoWHHOjoZABCNWgF9RvhBh/sEYA EGv5kiVA51/Pwdgh3Gpk/y+eViJKweY15MXngM5ASBERzekan5CO3edeeK1WhmP8p95B sTsjqQFg9ell8Wfc1uPxDiwAwaiK8bSGJlSfubjdBequUULcoXydsilBB+BhztdbSziw BP6O8C9PaYzjlbVPohpXNog2tpUtFP/hCn3YuCk9kbcZcyUUVnlwWDIqHUz3dbcafpEh 8mjg== 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=1zfoc6CoBhTv79t1tVnJWGGdH9udjSmsd+rMCNx1WR0=; b=Mv3Q3Nuix+e4pkU+LOjmvQyFLi+Qf1Bve65bcVw/xacYNI+cxHhigjkttdg+OMXo6H THqNfne+w+M+GnDwQurNZrNe/bqmlTb+0R+3rm+IpCJdSAg0CZRwCpARKwWb6RPMtlla ROZja9ZGrs8bV9Yi2QQNSYTCSbYvwSW462lyTBBsBuTa4oIEmq/Uep9ud4Btofd98/iZ dGcMRqEqxSdsZ4IuRdVIV37nJHyDk8rE/1HWH2SbTJEVUghEQEGQgz9Bid8FufIoWAVw HGqmD0tavMr/V8nYOxo+O08ISwyqBEncGq440I4I/vDZdbkLKN2ZR1BbxGbzhnhc7PTi k5zA== X-Gm-Message-State: AJcUukePDrKA5FPOeLeCwhXpelZ+s8k9rU83jw8m4EfcRK+ebXTnus/O xL5femnVRCx/JmUStsRW/qI= X-Google-Smtp-Source: ALg8bN75uN+qIYmUdIl09AGHrB3vPkV/b5pMzaXkadQqJV9MQZi55toiIsYm156ySHFijMWczG2pbA== X-Received: by 2002:a5d:664a:: with SMTP id f10mr22109476wrw.311.1548692028868; Mon, 28 Jan 2019 08:13:48 -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.47 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 28 Jan 2019 08:13:48 -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 03/11] net: lora: sx130x: add CHRS to volatile register list Date: Mon, 28 Jan 2019 16:12:57 +0000 Message-Id: <20190128161306.27805-4-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 The CHRS register is used in transactions to the MCU within the SX130x, we need to always write to it. Signed-off-by: Ben Whitten --- drivers/net/lora/sx130x.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/net/lora/sx130x.c b/drivers/net/lora/sx130x.c index 70cfb4532b51..529ca6622878 100644 --- a/drivers/net/lora/sx130x.c +++ b/drivers/net/lora/sx130x.c @@ -134,6 +134,7 @@ static bool sx130x_volatile_reg(struct device *dev, unsigned int reg) case SX1301_MPD: case SX1301_AGCSTS: + case SX1301_CHRS: case SX1301_MCU_CTRL: case SX1301_RADIO_A_SPI_DATA_RB: From patchwork Mon Jan 28 16:12:58 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Whitten X-Patchwork-Id: 1032047 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="nWY9dYgO"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43pGFJ00kBz9sRH for ; Tue, 29 Jan 2019 04:04:19 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387742AbfA1REE (ORCPT ); Mon, 28 Jan 2019 12:04:04 -0500 Received: from mail-wm1-f65.google.com ([209.85.128.65]:50922 "EHLO mail-wm1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2387499AbfA1QNw (ORCPT ); Mon, 28 Jan 2019 11:13:52 -0500 Received: by mail-wm1-f65.google.com with SMTP id n190so14635177wmd.0; Mon, 28 Jan 2019 08:13:50 -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=L2gKyLYkowozqfijDGFMP55qaLskmB+BRZLlU0AhdSc=; b=nWY9dYgO6UiwryAAXlREPXPFwRMlr1tqiOAdxRTXONzioloYS9i0ughc6wnw7PrDeD GAL/0j5bZ9j6Pv7KO+4x5fGyNPp0viMihy4/oQdLJnnaP+Cgac1BAoHYfg+rnZEmLjHN ciqWuupTZB0cHEljbowL4124PuV4vvd1BMHvDXEjXfWxs2h+Whz+HjBiV8LfrOyEOOoP b3sy90u0vET1RH8LcJTbE5zj/sDEdqC5EiVLLS96svsZYaqJjjR/bd6ZMMuqGk+2on7L wHQtnmgtbBxErLEOreRFFyiiNgOkWbqAWPeeiYzJB0yV/4cbCYwAhQMqcJAXVKIrjCkS eKDg== 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=L2gKyLYkowozqfijDGFMP55qaLskmB+BRZLlU0AhdSc=; b=j5By9P0xLn5E5nP6qpExoKfeu9ST7Qpi1oKNiZR1RZKJ/J5E0vn73KzTukgGf9GZWU xVQhCol8mCe2ajJAHfdYwZrLa4jivAjzqM7MDf3F5IPXNE+OersGfg09HT+DDf8RjJvF 7+ubRRsbSHqdwYPxUptkFHaTmHBvB4leExqmK9CfsZuhNqVhlDsNy6agexpVB43o+sTW 5bIV9QxItUb2KuBVtuLCGw0zQ7klNQn6UPncC1KihnWMKdxlD6VC7PVPW/o8wTCoLTB4 EcClnsHUE7bTqOLU1GAZc5lW8Mo5OQcRt+b+PQ5X+pac61c5NsMjxth/6YsCWRbfbwSW Dftw== X-Gm-Message-State: AJcUukdTHJdnioR0piIGXbiZyDeV3039Miu28/o6/enJO1PNRqTupqWJ SP74I0DSmiHlukx76wZ/jWc= X-Google-Smtp-Source: ALg8bN5Z/tQEsqHAY7YrRtIUgtyqu4CHMPSSZw9br+HnebYEFXQezfp7QBR+GM28vUWKYUWzwyMd3w== X-Received: by 2002:a7b:c397:: with SMTP id s23mr17096099wmj.127.1548692030062; Mon, 28 Jan 2019 08:13:50 -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.49 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 28 Jan 2019 08:13:49 -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 04/11] net: lora: sx130x: add helper function for writing to the SX130x MCU Date: Mon, 28 Jan 2019 16:12:58 +0000 Message-Id: <20190128161306.27805-5-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 The transaction to the internal MCU starts with CMD_WAIT to start a transaction, written to CHRS followed by writing the value, the status of the command is read back from AGCSTS. Signed-off-by: Ben Whitten --- drivers/net/lora/sx130x.c | 28 ++++++++++++++++++++++++++++ drivers/net/lora/sx130x.h | 2 ++ 2 files changed, 30 insertions(+) diff --git a/drivers/net/lora/sx130x.c b/drivers/net/lora/sx130x.c index 529ca6622878..818a1c9192b3 100644 --- a/drivers/net/lora/sx130x.c +++ b/drivers/net/lora/sx130x.c @@ -337,6 +337,34 @@ static int sx130x_load_firmware(struct sx130x_priv *priv, int mcu, const struct return 0; } +static int sx130x_agc_transaction(struct sx130x_priv *priv, unsigned int val, + unsigned int *status) +{ + int ret; + + ret = regmap_write(priv->regmap, SX1301_CHRS, SX1301_AGC_CMD_WAIT); + if (ret) { + dev_err(priv->dev, "AGC transaction start failed\n"); + return ret; + } + usleep_range(1000, 2000); + + ret = regmap_write(priv->regmap, SX1301_CHRS, val); + if (ret) { + dev_err(priv->dev, "AGC transaction value failed\n"); + return ret; + } + usleep_range(1000, 2000); + + ret = regmap_read(priv->regmap, SX1301_AGCSTS, status); + if (ret) { + dev_err(priv->dev, "AGC status read failed\n"); + return ret; + } + + return 0; +} + static int sx130x_agc_calibrate(struct sx130x_priv *priv) { const struct firmware *fw; diff --git a/drivers/net/lora/sx130x.h b/drivers/net/lora/sx130x.h index 6330777f4eac..69bb9cbd1aba 100644 --- a/drivers/net/lora/sx130x.h +++ b/drivers/net/lora/sx130x.h @@ -18,6 +18,8 @@ #define SX1301_MCU_AGC_FW_VERSION 4 #define SX1301_MCU_AGC_CAL_FW_VERSION 2 +#define SX1301_AGC_CMD_WAIT 16 + #define SX1301_TX_GAIN_LUT_MAX 16 /* Page independent */ 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 From patchwork Mon Jan 28 16:13:00 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Whitten X-Patchwork-Id: 1032045 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="YveQTyQR"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43pGDh0G0Tz9sCh for ; Tue, 29 Jan 2019 04:03:48 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387525AbfA1QN5 (ORCPT ); Mon, 28 Jan 2019 11:13:57 -0500 Received: from mail-wm1-f68.google.com ([209.85.128.68]:56076 "EHLO mail-wm1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2387518AbfA1QNy (ORCPT ); Mon, 28 Jan 2019 11:13:54 -0500 Received: by mail-wm1-f68.google.com with SMTP id y139so14488751wmc.5; Mon, 28 Jan 2019 08:13:53 -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=YBHXHHgSpmktvhhZLNppFJSU9VEAE5bW3T4VPQodZvQ=; b=YveQTyQRrB6K1EdAFcTo7hcmsTKE+mNtyQySaqqf0tJ9GkYtFOOTANvAIjTIqevZHK Aw1SgHL/2xB/67/8VzlaxFq4DSbeFr2BbDENuqXCsXttwbP7HxvSZKj97FL5gcWPi7jX NGj48ZNdNK9NoCx1Hx6MSiF0VKdWk1YZvZp+oDQxn6Op4/lkwDAtyyyvQgkU3ggfhLBS Py1hzhyC/+dcXHB6TvdPcu0QTvu2JX3c3+7+DpivoNyuIs91ToOu4YoerBXiKuxx3Jdn MBsw/gY8SaIikUSssyt0d5ciTrZ9iXQ+qAQxaaHaXu1TEMyXnfkjJPepA4ggenoY7nA0 TBTQ== 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=YBHXHHgSpmktvhhZLNppFJSU9VEAE5bW3T4VPQodZvQ=; b=H4+V5Oy9Sh5wYjMKhCBHVzVhGmMDm0V6POVnPdmi8UzdUZkT+Po3qr/HdzHAotMsxr OnjJy74fXc/dbtiRJrVvK8s4EphN0OUMNjNGdjxKJrskn3xhF6H+HV2iYJzxXuVfLuY3 cEj8CGcIpk5fpE0PJIQnReDd/xyCQ3cRdufl7vlRD38BxSBGNTSlWhyqMK9Gt0wJV6tH bYSZo3qAFWoM15nQDwSNA2YUi8F8z5i7zemdKSGsnThgBo4c6ic87zsUj5e/+c+UShK7 r9M5BNJz6MG5x9JaSyEBIu0jsGGxn0qYDL7RGLQl0oF4MCGhUZec3HPRTDxjGJx1AthQ loFA== X-Gm-Message-State: AJcUuke/ldM5bNJDmItWbtJ5nWBIRDXCxLkBUkd+CaDKGPM23u4E1woo kx088YQLsWEE37a9tPQsImdt+4y17M5BnA== X-Google-Smtp-Source: ALg8bN4B+p+JRWrLKToi2goBVgWc2IS6Ox7QMF9Exp5CTbDTbpaLFCxPSlz9n7rCDQe3yANiaodgpg== X-Received: by 2002:a1c:2d4b:: with SMTP id t72mr16497235wmt.99.1548692032494; Mon, 28 Jan 2019 08:13:52 -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.51 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 28 Jan 2019 08:13:51 -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 06/11] net: lora: sx130x: add detail to TODO in setup Date: Mon, 28 Jan 2019 16:13:00 +0000 Message-Id: <20190128161306.27805-7-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 Setup requires a more steps to be complete, call these out specifically so they are not missed. Signed-off-by: Ben Whitten --- drivers/net/lora/sx130x.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/drivers/net/lora/sx130x.c b/drivers/net/lora/sx130x.c index 18acfc8e934d..88932fbbb598 100644 --- a/drivers/net/lora/sx130x.c +++ b/drivers/net/lora/sx130x.c @@ -688,7 +688,17 @@ static int sx130x_loradev_open(struct net_device *netdev) if (ret) goto err_calibrate; - /* TODO */ + /* TODO Load constant adjustments, patches */ + + /* TODO Frequency time drift */ + + /* TODO Configure lora multi demods, bitfield of active */ + + /* TODO Load concentrator multi channel frequencies */ + + /* TODO enable the correlator on enabled frequencies */ + + /* TODO PPM, and modem enable */ ret = sx130x_load_all_firmware(priv); if (ret) From patchwork Mon Jan 28 16:13:01 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Whitten X-Patchwork-Id: 1032046 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="C64yiCtq"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43pGDz0fNxz9sPM for ; Tue, 29 Jan 2019 04:04:03 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387615AbfA1RD4 (ORCPT ); Mon, 28 Jan 2019 12:03:56 -0500 Received: from mail-wr1-f66.google.com ([209.85.221.66]:40371 "EHLO mail-wr1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732603AbfA1QNz (ORCPT ); Mon, 28 Jan 2019 11:13:55 -0500 Received: by mail-wr1-f66.google.com with SMTP id p4so18698835wrt.7; Mon, 28 Jan 2019 08:13:54 -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=4BHGAOwTGYEwJ11CGOnGrvCubOUh6o7ZP9RgKZ/+o7Y=; b=C64yiCtqeDPjQzdcbMPpNwOThiFFMclyyOqiQlTO1T3fLrh/nUB6QmxBIoI1D0BYxK tyUpATdZ4/KlbpttZLp/DbUQJq1zczXVElKwp8tnGH+zJyIYbycQUHIDVFwl0gGn/d2w Nz/l4RRmAaNcEoqhhsANPIlPNbvZxpZ3Mw+KhAamkrlf1vC90GMZDJk/f90XUz6/rWvm Ws4kmUjZ2kAmppa4nrlXOtuWQuexFiKX1RJHKUHbWIiGI0s4MIqC7KxukbmhjLYY2Zmx WZN+WvNUJkaX3F8NLYNWjeNuPO1CWmpmeInA4t91jivsIzXnnEvtWYFKkRYm5OhNLD3D WgHw== 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=4BHGAOwTGYEwJ11CGOnGrvCubOUh6o7ZP9RgKZ/+o7Y=; b=uEzx/+1ZzblFpGbwwNmG+okUCYxiLYMAOXKA5Yk3BdZbzICHCPpTcFlsqQ39l9Wft+ JEzmdSwoXyzkdb8D8h3Qo8Jk/KrUYiOweRYuNr8PVqPeExTnrv5VbDE/EjXf1ZZ6Wh1h PiJV9DUEuAre0iLPU1ziMkq7yG8T5p7XNn7owBXHN5O6IHGCz+Yyqvh3L/Ia/mSo9TTZ 99riSknKAD2x4M4GkAo3tvq/Z3MVFYJAuusutxFxfmxMO0CTIEgnn6M+Cb8b5amQHtsb AnFGb4yMVNNeyoWscnd+mwh8aIEFVL9gkCcvE+8sHD02/zuNOZyxM5CGXapAlkrX1giP UTYw== X-Gm-Message-State: AJcUukfChje7h3Ehma9MtICLn691swdH8EZzCoGnkNCd912uZknw4ryc 2JZvxu81jHHZN4jyaWZB97I= X-Google-Smtp-Source: ALg8bN5UrhY7uK212ivDf9mhJYtbQ5qQllxo2qc7aGKTaXpQys23ygTQqJeh4lIom74m4RPf6nFsaw== X-Received: by 2002:a5d:56d2:: with SMTP id m18mr23564413wrw.113.1548692033913; Mon, 28 Jan 2019 08:13:53 -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.52 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 28 Jan 2019 08:13:53 -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 07/11] net: lora: sx130x: add work queue to tx path Date: Mon, 28 Jan 2019 16:13:01 +0000 Message-Id: <20190128161306.27805-8-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 As we are not allowed to sleep in _start_xmit, we need to add a work queue to handle transmission of the packets. Signed-off-by: Ben Whitten --- drivers/net/lora/sx130x.c | 50 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/drivers/net/lora/sx130x.c b/drivers/net/lora/sx130x.c index 88932fbbb598..820ec0220e28 100644 --- a/drivers/net/lora/sx130x.c +++ b/drivers/net/lora/sx130x.c @@ -69,6 +69,10 @@ struct sx130x_priv { void *drvdata; struct sx130x_tx_gain_lut tx_gain_lut[SX1301_TX_GAIN_LUT_MAX]; u8 tx_gain_lut_size; + + struct sk_buff *tx_skb; + struct workqueue_struct *wq; + struct work_struct tx_work; }; struct regmap *sx130x_get_regmap(struct device *dev) @@ -644,6 +648,8 @@ static int sx130x_agc_init(struct sx130x_priv *priv) static netdev_tx_t sx130x_loradev_start_xmit(struct sk_buff *skb, struct net_device *netdev) { + struct sx130x_priv *priv = netdev_priv(netdev); + if (skb->protocol != htons(ETH_P_LORA)) { kfree_skb(skb); netdev->stats.tx_dropped++; @@ -651,11 +657,36 @@ static netdev_tx_t sx130x_loradev_start_xmit(struct sk_buff *skb, struct net_dev } netif_stop_queue(netdev); + priv->tx_skb = skb; + queue_work(priv->wq, &priv->tx_work); - /* TODO */ return NETDEV_TX_OK; } +static void sx130x_tx_work_handler(struct work_struct *ws) +{ + struct sx130x_priv *priv = container_of(ws, struct sx130x_priv, tx_work); + struct net_device *netdev = dev_get_drvdata(priv->dev); + int ret; + + netdev_dbg(netdev, "%s\n", __func__); + + if (priv->tx_skb) { + + /* TODO actual tx* */ + + if (!(netdev->flags & IFF_ECHO) || + priv->tx_skb->pkt_type != PACKET_LOOPBACK || + priv->tx_skb->protocol != htons(ETH_P_LORA)) + kfree_skb(priv->tx_skb); + + priv->tx_skb = NULL; + } + + if (netif_queue_stopped(netdev)) + netif_wake_queue(netdev); +} + static int sx130x_loradev_open(struct net_device *netdev) { struct sx130x_priv *priv = netdev_priv(netdev); @@ -715,6 +746,12 @@ static int sx130x_loradev_open(struct net_device *netdev) mutex_unlock(&priv->io_lock); + priv->tx_skb = NULL; + + priv->wq = alloc_workqueue("sx130x_wq", + WQ_FREEZABLE | WQ_MEM_RECLAIM, 0); + INIT_WORK(&priv->tx_work, sx130x_tx_work_handler); + netif_start_queue(netdev); return 0; @@ -729,11 +766,22 @@ static int sx130x_loradev_open(struct net_device *netdev) static int sx130x_loradev_stop(struct net_device *netdev) { + struct sx130x_priv *priv = netdev_priv(netdev); + netdev_dbg(netdev, "%s", __func__); netif_stop_queue(netdev); close_loradev(netdev); + destroy_workqueue(priv->wq); + priv->wq = NULL; + + if (priv->tx_skb) { + netdev->stats.tx_errors++; + dev_kfree_skb(priv->tx_skb); + } + priv->tx_skb = NULL; + return 0; } From patchwork Mon Jan 28 16:13:02 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Whitten X-Patchwork-Id: 1032006 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="KrCqbnbu"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43pF7H5sdBz9sSH for ; Tue, 29 Jan 2019 03:14:03 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387547AbfA1QOA (ORCPT ); Mon, 28 Jan 2019 11:14:00 -0500 Received: from mail-wm1-f68.google.com ([209.85.128.68]:39469 "EHLO mail-wm1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732992AbfA1QN5 (ORCPT ); Mon, 28 Jan 2019 11:13:57 -0500 Received: by mail-wm1-f68.google.com with SMTP id y8so14487890wmi.4; Mon, 28 Jan 2019 08:13:55 -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=5EffI9q2BZp3g+80ucZcvCbCgpN9YaivlTi4sYtsNkk=; b=KrCqbnbuV4AhLGlkPXUp1JZDjyKLk3YTkemj+Y7kkgz0ICdAgMEe8Wt/gqWnTQMKrt FVp9NuLlm3EpDKwUyFobAUl+zsABmPC2P0ekjGH9IvOXxi211MqZWeVJolLINWuSUVnf sqNcE8diOxzrRvjMSMZ55h0lU/y7dzoeLosibf2gYBgXCa6z/t/o5tjXKuamrgE+HVw0 CCrq6INUyE4FlJD0L+OzS3C3sHL5Ecamn+aVZ/jVoBs2PgAajoG+aV3dEDUSy/0ED3we kRth46by5L0PAezpZc6/hv/Kn1P741G+SSta7XRWeaco8/wJKAxHLFAUksvPQopm2i9X 2Zsg== 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=5EffI9q2BZp3g+80ucZcvCbCgpN9YaivlTi4sYtsNkk=; b=l+E5jkGmvRLQ0xkgzzoJfAtByVDQxnW/+nxbiCZlu9Gp8derqJvexFo6UIXTBljdXX V1OB9x0F6dFHtJwM9y2XdbPte0vvRTtQ2hFpam02YK1Z13W69WJMRPv3ESIegjeI4k92 ZF+2fs79lVIOtNMb1uYLfkuI1eswm/v+U8Ma/pSZi7iYabDGB6Kp1k3Rb56p2r4J7trN tX9n+qBATjpVb1EbH6RsynaByfvKDB85m3aZYOfWtKrmb0nRDxcYCZk9Cg84/W4BXv/j tEiNGaP3glKwEAxcuWwyRSlh6vGh5AiZBCI5U9FSstznwwLdXLb5Y2frPEfRVvn5jw6W IKTA== X-Gm-Message-State: AJcUukfzLi5TRYYW6+HZ5xZK/TGtu85B/slQARBeW4OFXLoJpsUTVGe7 SC54/JrIb6//Ol9dBdBizDw= X-Google-Smtp-Source: ALg8bN6/xSkxkF0zDGNSwHl0rOIAHbwu4KbxEcDN4/X1nfdyVjWwTmYUvoO32rQ8f+f2XV+iJdnPfA== X-Received: by 2002:a1c:87cc:: with SMTP id j195mr17449412wmd.2.1548692035066; Mon, 28 Jan 2019 08:13:55 -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.54 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 28 Jan 2019 08:13:54 -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 08/11] net: lora: sx130x: add test transmission Date: Mon, 28 Jan 2019 16:13:02 +0000 Message-Id: <20190128161306.27805-9-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 First transmission from the SX130x, all metadata values are hardcoded and will be replaced with a suitable alternative. Data sent into the socket is sent straight out of the card. Signed-off-by: Ben Whitten --- drivers/net/lora/sx130x.c | 128 +++++++++++++++++++++++++++++++++++++- drivers/net/lora/sx130x.h | 11 ++++ 2 files changed, 137 insertions(+), 2 deletions(-) diff --git a/drivers/net/lora/sx130x.c b/drivers/net/lora/sx130x.c index 820ec0220e28..f96f32d2e1ff 100644 --- a/drivers/net/lora/sx130x.c +++ b/drivers/net/lora/sx130x.c @@ -49,8 +49,50 @@ static const struct reg_field sx130x_regmap_fields[] = { /* EMERGENCY_FORCE_HOST_CTRL */ [F_EMERGENCY_FORCE_HOST_CTRL] = REG_FIELD(SX1301_EMERGENCY_FORCE_HOST_CTRL, 0, 0), + /* TX_TRIG */ + [F_TX_TRIG_IMMEDIATE] = REG_FIELD(SX1301_TX_TRIG, 0, 0), + [F_TX_TRIG_DELAYED] = REG_FIELD(SX1301_TX_TRIG, 1, 1), + [F_TX_TRIG_GPS] = REG_FIELD(SX1301_TX_TRIG, 2, 2), }; +struct sx130x_tx_header { + u8 tx_freq[3]; + u32 start; + u8 tx_power:4, + modulation_type:1, + radio_select:1, + resered0:2; + u8 reserved1; + + union { + struct lora_t { + u8 sf:4, + cr:3, + crc16_en:1; + u8 payload_len; + u8 mod_bw:2, + implicit_header:1, + ppm_offset:1, + invert_pol:1, + reserved0:3; + u16 preamble; + u8 reserved1; + u8 reserved2; + } lora; + struct fsk_t { + u8 freq_dev; + u8 payload_len; + u8 packet_mode:1, + crc_en:1, + enc_mode:2, + crc_mode:1, + reserved0:3; + u16 preamble; + u16 bitrate; + } fsk; + } u; +} __packed; + struct sx130x_tx_gain_lut { s8 power; /* dBm measured at board connector */ u8 dig_gain; @@ -646,6 +688,83 @@ static int sx130x_agc_init(struct sx130x_priv *priv) return ret; } +static int sx130x_tx(struct sx130x_priv *priv, void *data, int len) +{ + int ret, i; + u8 buff[256 + 16]; + struct sx130x_tx_header *hdr = (struct sx130x_tx_header *)buff; + struct net_device *netdev = dev_get_drvdata(priv->dev); + + /* TODO general checks to make sure we CAN send */ + + /* TODO Enable notch filter for lora 125 */ + + /* TODO get start delay for this TX */ + + /* TODO interpret tx power, HACK just set max power */ + + /* TODO get TX imbalance for this pow index from calibration step */ + + /* TODO set the dig gain */ + + /* TODO set TX PLL freq based on radio used to TX */ + + memset(buff, 0, sizeof(buff)); + + /* HACK set to 868MHz */ + hdr->tx_freq[0] = 217; + hdr->tx_freq[1] = 0; + hdr->tx_freq[2] = 0; + + hdr->start = 0; /* Start imediatly */ + hdr->radio_select = 0; /* HACK Radio A transmit */ + hdr->modulation_type = 0; /* HACK modulation LORA */ + hdr->tx_power = 15; /* HACK power entry 15 */ + + hdr->u.lora.crc16_en = 1; /* Enable CRC16 */ + hdr->u.lora.cr = 1; /* CR 4/5 */ + hdr->u.lora.sf = 7; /* SF7 */ + hdr->u.lora.payload_len = len; /* Set the data len to the skb len */ + hdr->u.lora.implicit_header = 0; /* No implicit header */ + hdr->u.lora.mod_bw = 0; /* Set 125KHz BW */ + hdr->u.lora.ppm_offset = 0; /* TODO no ppm offset? */ + hdr->u.lora.invert_pol = 0; /* TODO set no inverted polarity */ + + hdr->u.lora.preamble = 8; /* Set the standard preamble */ + + /* TODO 2 Msb in tx_freq0 for large narrow filtering, unset for now */ + hdr->tx_freq[0] &= 0x3F; + + /* Copy the TX data into the buffer ready to go */ + + memcpy((void *)&buff[16], data, len); + + /* Reset any transmissions */ + ret = regmap_write(priv->regmap, SX1301_TX_TRIG, 0); + if (ret) + return ret; + + /* Put the buffer into the tranmit fifo */ + ret = regmap_write(priv->regmap, SX1301_TX_DATA_BUF_ADDR, 0); + if (ret) + return ret; + ret = regmap_noinc_write(priv->regmap, SX1301_TX_DATA_BUF_DATA, buff, + len + 16); + if (ret) + return ret; + + /* HACK just go for immediate transfer */ + ret = sx130x_field_force_write(priv, F_TX_TRIG_IMMEDIATE, 1); + if (ret) + return ret; + + netdev_dbg(netdev, "Transmitting packet of size %d: ", len); + for (i = 0; i < len + 16; i++) + netdev_dbg(netdev, "%X", buff[i]); + + return ret; +} + static netdev_tx_t sx130x_loradev_start_xmit(struct sk_buff *skb, struct net_device *netdev) { struct sx130x_priv *priv = netdev_priv(netdev); @@ -672,8 +791,13 @@ static void sx130x_tx_work_handler(struct work_struct *ws) netdev_dbg(netdev, "%s\n", __func__); if (priv->tx_skb) { - - /* TODO actual tx* */ + ret = sx130x_tx(priv, priv->tx_skb->data, priv->tx_skb->len); + if (ret) { + netdev->stats.tx_errors++; + } else { + netdev->stats.tx_packets++; + netdev->stats.tx_bytes += priv->tx_skb->len; + } if (!(netdev->flags & IFF_ECHO) || priv->tx_skb->pkt_type != PACKET_LOOPBACK || diff --git a/drivers/net/lora/sx130x.h b/drivers/net/lora/sx130x.h index 2878dd3cc547..38f1b58b2165 100644 --- a/drivers/net/lora/sx130x.h +++ b/drivers/net/lora/sx130x.h @@ -32,6 +32,10 @@ /* Page independent */ #define SX1301_PAGE 0x00 #define SX1301_VER 0x01 +#define SX1301_RX_DATA_BUF_ADDR 0x02 /* 16 wide */ +#define SX1301_RX_DATA_BUF_DATA 0x04 +#define SX1301_TX_DATA_BUF_ADDR 0x05 +#define SX1301_TX_DATA_BUF_DATA 0x06 #define SX1301_MPA 0x09 #define SX1301_MPD 0x0A #define SX1301_GEN 0x10 @@ -49,6 +53,9 @@ #define SX1301_FORCE_CTRL (SX1301_PAGE_BASE(0) + 0x69) #define SX1301_MCU_CTRL (SX1301_PAGE_BASE(0) + 0x6A) +/* Page 1 */ +#define SX1301_TX_TRIG (SX1301_PAGE_BASE(1) + 0x21) + /* Page 2 */ #define SX1301_RADIO_A_SPI_DATA (SX1301_PAGE_BASE(2) + 0x21) #define SX1301_RADIO_A_SPI_DATA_RB (SX1301_PAGE_BASE(2) + 0x22) @@ -87,6 +94,10 @@ enum sx130x_fields { F_FORCE_DEC_FILTER_GAIN, F_EMERGENCY_FORCE_HOST_CTRL, + + F_TX_TRIG_IMMEDIATE, + F_TX_TRIG_DELAYED, + F_TX_TRIG_GPS, }; struct regmap *sx130x_get_regmap(struct device *dev); From patchwork Mon Jan 28 16:13:03 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Whitten X-Patchwork-Id: 1032044 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="ZAaANvc+"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43pGDM2dKBz9sRt for ; Tue, 29 Jan 2019 04:03:31 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387882AbfA1RD3 (ORCPT ); Mon, 28 Jan 2019 12:03:29 -0500 Received: from mail-wr1-f68.google.com ([209.85.221.68]:33849 "EHLO mail-wr1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2387527AbfA1QN7 (ORCPT ); Mon, 28 Jan 2019 11:13:59 -0500 Received: by mail-wr1-f68.google.com with SMTP id f7so18770229wrp.1; Mon, 28 Jan 2019 08:13:57 -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=3iWLsQKWSdm0NgJ85ZFgVcH5evF1kFvhDVwP7Yj1TPE=; b=ZAaANvc+iCyiO42llxT4mz4NugiZaQ3YMn5LhmWkbdFDd+uBLi8LSHN3oQ+riBBOFg c0dIF/XLZLkg1hVQkoIVw8iVmEbM0dGUnBnUPKvJJ7l669hWt1jassJh0d+TQaL5eBoK EHT7sLRvUzL6XJODk5SP+iySIy7jxckVBbO1if+6wKqfm4IkEPZtEkVl3YJM6xfFKfb/ NE1QSUZ+jpRr1CNVpIgd3jttibtGtn24YqECioO+XzOHkcKp1ZhtZ0cUdsgl0t1v94Ns FjpUuryEQ+/MUl20vs16gDWWX5s+uBYtNO71NvE8OBa+wSau4mSy84DlrhIWA8Owcg5j up1A== 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=3iWLsQKWSdm0NgJ85ZFgVcH5evF1kFvhDVwP7Yj1TPE=; b=gjJ5IRhpH/HKgDKCRuydK5fC5osI04wBmRVdiJ7YIeaMyAy7Z9Lm5c2cRzw4Sp1ZjN 8aDgMzpSwfGmYlXlrT/5tqmECwOwYiEXZx8u+iVuunR3iJob/vjS+48qkNYmtOmh0iS0 UHdonxifjT/jmf0o4iaphgSKqoXhK9/CnL9N4mK+uOG5kpNwAebgYG//cQhz7yoLPfGJ cH6XYJwRzXAzmdNJewdDOkLtkoE0z4I2YoMSZYhIiAFL305KgERgQCv8YQ3RLic6Xvhp p/C/du411yxnuF5OmeVvBhZ83axBf7dsR8T1zpjuHhBRVQzzEZ67Wz2A13T3TTE252sr z8dQ== X-Gm-Message-State: AJcUukfd/zY7jP/2uZrdRlW5IE354N0+MTlY9lGOAJ4r4yvFaicYM2y1 3UC5Axc0mNqra21oYcanvTs= X-Google-Smtp-Source: ALg8bN7k7QoAa5ZQw8z32bugwnSj8NBLHx/EvHf69SCWDqkV+gCItdF7hf5bAxYgIL7zLCxGGTrZuw== X-Received: by 2002:adf:de91:: with SMTP id w17mr23997899wrl.320.1548692036634; Mon, 28 Jan 2019 08:13:56 -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.55 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 28 Jan 2019 08:13:55 -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" , linux-kernel@vger.kernel.org, netdev@vger.kernel.org Subject: [PATCH lora-next 09/11] net: lora: introduce lora socket addressing for metadata Date: Mon, 28 Jan 2019 16:13:03 +0000 Message-Id: <20190128161306.27805-10-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 Information such as spreading factor, coding rate and power are on a per transmission basis so we can encode this information in the lora socket address. In future we may have a different format for receive with additional fields which get populated. Signed-off-by: Ben Whitten --- include/linux/lora/skb.h | 9 ++++++++ include/uapi/linux/lora.h | 14 ++++++++++++ net/lora/dgram.c | 45 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 68 insertions(+) diff --git a/include/linux/lora/skb.h b/include/linux/lora/skb.h index 8806741464d0..6abeb39b8b7f 100644 --- a/include/linux/lora/skb.h +++ b/include/linux/lora/skb.h @@ -12,6 +12,15 @@ struct lora_skb_priv { int ifindex; + + u64 freq; + u8 sf; + u8 cr; + u16 bw; + + u8 sync; + + s8 power; }; static inline struct lora_skb_priv *lora_skb_prv(struct sk_buff *skb) diff --git a/include/uapi/linux/lora.h b/include/uapi/linux/lora.h index 4ff00b9c3c20..4c458ee3ed9a 100644 --- a/include/uapi/linux/lora.h +++ b/include/uapi/linux/lora.h @@ -10,6 +10,18 @@ #include #include +/* TX addressing definition */ +struct tx_addr { + __u64 freq; + __u8 sf; + __u8 cr; + __u16 bw; + + __u8 sync; + + __s8 power; +}; + /* particular protocols of the protocol family PF_LORA */ #define LORA_PROTO_DATAGRAM 0 #define LORA_NPROTO 1 @@ -17,7 +29,9 @@ struct sockaddr_lora { __kernel_sa_family_t lora_family; int lora_ifindex; + __u8 lora_protocol; union { + struct tx_addr tx; } lora_addr; }; diff --git a/net/lora/dgram.c b/net/lora/dgram.c index 4d931fd3778a..1556ad0f8835 100644 --- a/net/lora/dgram.c +++ b/net/lora/dgram.c @@ -20,6 +20,15 @@ struct dgram_sock { int ifindex; bool bound; struct notifier_block notifier; + + u64 freq; + u8 sf; + u8 cr; + u16 bw; + + u8 sync; + + s8 power; }; static inline struct dgram_sock *dgram_sk(const struct sock *sk) @@ -69,6 +78,12 @@ static int dgram_bind(struct socket *sock, struct sockaddr *uaddr, int len) ifindex = 0; dgram->ifindex = ifindex; + dgram->freq = addr->lora_addr.tx.freq; + dgram->sf = addr->lora_addr.tx.sf; + dgram->cr = addr->lora_addr.tx.cr; + dgram->bw = addr->lora_addr.tx.bw; + dgram->sync = addr->lora_addr.tx.sync; + dgram->power = addr->lora_addr.tx.power; dgram->bound = true; out: @@ -118,6 +133,12 @@ static int dgram_sendmsg(struct socket *sock, struct msghdr *msg, size_t size) lora_skb_reserve(skb); lora_skb_prv(skb)->ifindex = netdev->ifindex; + lora_skb_prv(skb)->freq = dgram->freq; + lora_skb_prv(skb)->sf = dgram->sf; + lora_skb_prv(skb)->cr = dgram->cr; + lora_skb_prv(skb)->bw = dgram->bw; + lora_skb_prv(skb)->sync = dgram->sync; + lora_skb_prv(skb)->power = dgram->power; ret = memcpy_from_msg(skb_put(skb, size), msg, size); if (ret < 0) @@ -172,6 +193,12 @@ static int dgram_getname(struct socket *sock, struct sockaddr *uaddr, memset(addr, 0, sizeof(*addr)); addr->lora_family = AF_LORA; addr->lora_ifindex = dgram->ifindex; + addr->lora_addr.tx.freq = dgram->freq; + addr->lora_addr.tx.sf = dgram->sf; + addr->lora_addr.tx.cr = dgram->cr; + addr->lora_addr.tx.bw = dgram->bw; + addr->lora_addr.tx.sync = dgram->sync; + addr->lora_addr.tx.power = dgram->power; #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 13, 0) return sizeof(*addr); @@ -198,6 +225,12 @@ static int dgram_release(struct socket *sock) lock_sock(sk); dgram->ifindex = 0; + dgram->freq = 0; + dgram->sf = 0; + dgram->cr = 0; + dgram->bw = 0; + dgram->sync = 0; + dgram->power = 0; dgram->bound = false; sock_orphan(sk); @@ -251,6 +284,12 @@ static int dgram_notifier(struct notifier_block *nb, unsigned long msg, void *pt lock_sock(sk); dgram->ifindex = 0; + dgram->freq = 0; + dgram->sf = 0; + dgram->cr = 0; + dgram->bw = 0; + dgram->sync = 0; + dgram->power = 0; dgram->bound = false; release_sock(sk); @@ -277,6 +316,12 @@ static int dgram_init(struct sock *sk) pr_debug("lora: %s\n", __func__); dgram->bound = false; + dgram->freq = 0; + dgram->sf = 0; + dgram->cr = 0; + dgram->bw = 0; + dgram->sync = 0; + dgram->power = 0; dgram->ifindex = 0; dgram->notifier.notifier_call = dgram_notifier; From patchwork Mon Jan 28 16:13:04 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Whitten X-Patchwork-Id: 1032043 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="LhEsWxvc"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43pGDF74w5z9sS0 for ; Tue, 29 Jan 2019 04:03:25 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727227AbfA1RDO (ORCPT ); Mon, 28 Jan 2019 12:03:14 -0500 Received: from mail-wr1-f67.google.com ([209.85.221.67]:38784 "EHLO mail-wr1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2387535AbfA1QN7 (ORCPT ); Mon, 28 Jan 2019 11:13:59 -0500 Received: by mail-wr1-f67.google.com with SMTP id v13so18668851wrw.5; Mon, 28 Jan 2019 08:13:58 -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=cQEg/fY/4fwqAOKXHFbwz+lUp8voIQMkvzv/xUhihWI=; b=LhEsWxvcA8ZKFNzXsM8CAXLOkre80zmk59bJiSD+C/XpA5l9CSJoTAd0prZvVyRjL4 /+I+qiJ544oeVDg+KbjlaReAyMgjfElTe8kDzic+EM041ocHSkii0Hw0mrKAUr7mDb6H 5OwLxQ7cLeWixUT56F05SUmWy+axQ7PUT6OQGkGhXbvp3/M5AARyYzZBwDYZy2C9iAuv qikbphP6R9RHJuy44so1aX+g/m5jcZL8sUnVcX7jjyETQAz99zfm0vEWIBlWEGdSWRaI Xn640JFN/j9UeG0XRBIU7w7JloyZ74vfcR8SduruBEDYLcEsy+7U8nMhI2e4WZrPYASU 5alQ== 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=cQEg/fY/4fwqAOKXHFbwz+lUp8voIQMkvzv/xUhihWI=; b=IZe89kZOzCqDrimDiyQrlg5TifhvTgsl6Oi+BbcZSXEWGxBBmxE0UtP//I6HscA3iL aBiOzE0vz8DnaMwE9wQH2VfY4ES+5Eh+MX4I8mU1iVQNvjmLi9JCNjw8TE6ZdOyWkllx 6YWZkj89nBWVaciLXpZjdEOuk9LNWvkv3Oiti7cIM1dwe9zIbcgs7ARP+fyzn8w37XoA CEVpa0PCpeVRAA23wsYzeJCpQRzKGbRtGHFhZOdyYg4U91rn6n8hAookl4wu+85m0X4x dmrcxjtOELAezYMpH7bMZBJcKsh6ZQoO63pmgyfeJoh/m6v2/WthwFAnNI+Adr0/u8pu Bf1A== X-Gm-Message-State: AJcUukeNSlWdiNNJJ4sW9GPH3z1MQSgAvLhrJxTzEMVCmnCM8JxFR+NE aWgDiADxVlxBqWtW9C+rlnY= X-Google-Smtp-Source: ALg8bN5s7yfAyHgs+ZB4dPMs59FIlB2K5LwQJlwtLnfbJccI+k0i0Sb1E/NqiUNYMBk9eFZPvs9dzw== X-Received: by 2002:a5d:480d:: with SMTP id l13mr23765784wrq.175.1548692037725; Mon, 28 Jan 2019 08:13:57 -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.56 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 28 Jan 2019 08:13:57 -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 10/11] net: lora: sx130x: make use of lora address metadata in transmission Date: Mon, 28 Jan 2019 16:13:04 +0000 Message-Id: <20190128161306.27805-11-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 We take the metadata encoded in the lora address and apply it to the outgoing transmission. Signed-off-by: Ben Whitten --- drivers/net/lora/sx130x.c | 58 ++++++++++++++++++++++++++++++++------- 1 file changed, 48 insertions(+), 10 deletions(-) diff --git a/drivers/net/lora/sx130x.c b/drivers/net/lora/sx130x.c index f96f32d2e1ff..428e82b4ccb8 100644 --- a/drivers/net/lora/sx130x.c +++ b/drivers/net/lora/sx130x.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include "sx130x.h" @@ -688,12 +689,13 @@ static int sx130x_agc_init(struct sx130x_priv *priv) return ret; } -static int sx130x_tx(struct sx130x_priv *priv, void *data, int len) +static int sx130x_tx(struct sx130x_priv *priv, struct sk_buff *skb) { int ret, i; u8 buff[256 + 16]; struct sx130x_tx_header *hdr = (struct sx130x_tx_header *)buff; struct net_device *netdev = dev_get_drvdata(priv->dev); + u8 sf; /* TODO general checks to make sure we CAN send */ @@ -722,11 +724,47 @@ static int sx130x_tx(struct sx130x_priv *priv, void *data, int len) hdr->tx_power = 15; /* HACK power entry 15 */ hdr->u.lora.crc16_en = 1; /* Enable CRC16 */ - hdr->u.lora.cr = 1; /* CR 4/5 */ - hdr->u.lora.sf = 7; /* SF7 */ - hdr->u.lora.payload_len = len; /* Set the data len to the skb len */ + + switch (lora_skb_prv(skb)->cr) { + case 5: + hdr->u.lora.cr = 1; /* CR 4/5 */ + break; + case 6: + hdr->u.lora.cr = 2; /* CR 4/6 */ + break; + case 7: + hdr->u.lora.cr = 3; /* CR 4/7 */ + break; + case 8: + hdr->u.lora.cr = 4; /* CR 4/8 */ + break; + default: + return -ENXIO; + } + + sf = lora_skb_prv(skb)->sf; + if ((sf < 6) || (sf > 12)) + return -ENXIO; + + hdr->u.lora.sf = sf; + + hdr->u.lora.payload_len = skb->len; /* Set the data length */ hdr->u.lora.implicit_header = 0; /* No implicit header */ - hdr->u.lora.mod_bw = 0; /* Set 125KHz BW */ + + switch(lora_skb_prv(skb)->bw) { + case 125: + hdr->u.lora.mod_bw = 0; /* 125KHz BW */ + break; + case 250: + hdr->u.lora.mod_bw = 1; /* 250KHz BW */ + break; + case 500: + hdr->u.lora.mod_bw = 2; /* 500KHz BW */ + break; + default: + return -ENXIO; + } + hdr->u.lora.ppm_offset = 0; /* TODO no ppm offset? */ hdr->u.lora.invert_pol = 0; /* TODO set no inverted polarity */ @@ -737,7 +775,7 @@ static int sx130x_tx(struct sx130x_priv *priv, void *data, int len) /* Copy the TX data into the buffer ready to go */ - memcpy((void *)&buff[16], data, len); + memcpy((void *)&buff[16], skb->data, skb->len); /* Reset any transmissions */ ret = regmap_write(priv->regmap, SX1301_TX_TRIG, 0); @@ -749,7 +787,7 @@ static int sx130x_tx(struct sx130x_priv *priv, void *data, int len) if (ret) return ret; ret = regmap_noinc_write(priv->regmap, SX1301_TX_DATA_BUF_DATA, buff, - len + 16); + skb->len + 16); if (ret) return ret; @@ -758,8 +796,8 @@ static int sx130x_tx(struct sx130x_priv *priv, void *data, int len) if (ret) return ret; - netdev_dbg(netdev, "Transmitting packet of size %d: ", len); - for (i = 0; i < len + 16; i++) + netdev_dbg(netdev, "Transmitting packet of size %d: ", skb->len); + for (i = 0; i < skb->len + 16; i++) netdev_dbg(netdev, "%X", buff[i]); return ret; @@ -791,7 +829,7 @@ static void sx130x_tx_work_handler(struct work_struct *ws) netdev_dbg(netdev, "%s\n", __func__); if (priv->tx_skb) { - ret = sx130x_tx(priv, priv->tx_skb->data, priv->tx_skb->len); + ret = sx130x_tx(priv, priv->tx_skb); if (ret) { netdev->stats.tx_errors++; } else { From patchwork Mon Jan 28 16:13:05 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Whitten X-Patchwork-Id: 1032041 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="iB4BhIO3"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43pGCt6Dx6z9sRt for ; Tue, 29 Jan 2019 04:03:06 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387836AbfA1RDB (ORCPT ); Mon, 28 Jan 2019 12:03:01 -0500 Received: from mail-wr1-f66.google.com ([209.85.221.66]:36463 "EHLO mail-wr1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1733011AbfA1QOC (ORCPT ); Mon, 28 Jan 2019 11:14:02 -0500 Received: by mail-wr1-f66.google.com with SMTP id u4so18706683wrp.3; Mon, 28 Jan 2019 08:13:59 -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=iepLtzBVPhX7pl8gXv2iT2Rr+6RSkbyfrOjRx9czEQU=; b=iB4BhIO3cQH34C9OZgNQSCSdLG2PUwZy1YtzezvtYtCL40i4Z0QPv+v3xzmNAhL06L ZVZn9Bv53oWX1qRiblXT9as4Hs5ifJKaXvShRq9gOwZVS4vx2vYxB0a8U0FVKHTvJndW YW/BCJdo6m4yaSbzrkeKWIdxpxaztlkzqb8tEMGVFYY12gbk+4+NRQATcqgqL3rcspXt BHg6SxTZcLl+n+OajkcIFYkdLCxeUbY5O8562qmMdPgB26PodYyiFp1M4h59N6D8siG2 2rC8UJZxXU5ibgOg0vg+xOx3Y3r6aHj/d9wMrbrBKt8w208L/ofpkZdDknqOIu3YbP3B 3TbQ== 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=iepLtzBVPhX7pl8gXv2iT2Rr+6RSkbyfrOjRx9czEQU=; b=iYfT09Mi9aZngGwIM+Z9xSxRZuAtJD4CdO/fdekbhCSkdx4DASraQrmZ834AeAn+ko 42ArSIhFlvhhVlMBgHyul+P0C32zH8MVPj+A58isXtyIWavK0KAGzN9rX4Ai3fYR1kiN tZByYpat6hQe0iFZSwUlkAalcb0jYk1tA5alDhIYl0+3RSCxKlR/EaWhY1DtBW6XXzij GS+8KbM20Kk2tHNZIgTDOrcqoyrxHzl2UJQQCY+loru1Rz17e6jm41stUfLkMfzZGz2S nNQVPIK8/znSOsRbALr/27wvE8wVPMttOkHmOSEfZtDoZUKUr5fOIMMD0cF+3gVbCEsG EQQg== X-Gm-Message-State: AJcUukfR/eHPFaLVgfIxqZjO62dlbuYAXpvbl9tMUvC6FN6uGtMU8nUw GXa3/zrh6ucINiTRlHP8huo= X-Google-Smtp-Source: ALg8bN6drcVo2/5yizY4N2gTwsczFFPBN0wuWFroWZzR9DyRs/hX1vWpD2hq8uft79zfwNXr9DyAJA== X-Received: by 2002:adf:df01:: with SMTP id y1mr23302210wrl.127.1548692039020; Mon, 28 Jan 2019 08:13:59 -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.58 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 28 Jan 2019 08:13:58 -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 11/11] net: lora: sx130x: add patch to register fields Date: Mon, 28 Jan 2019 16:13:05 +0000 Message-Id: <20190128161306.27805-12-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 The SX130x chips require a number of constant adjustments and patches. We add the fields for the registers which require patches, add patch values then add a helper to patch fields. Removing one TODO. Signed-off-by: Ben Whitten --- drivers/net/lora/sx130x.c | 131 +++++++++++++++++++++++++++++++++++++- drivers/net/lora/sx130x.h | 75 ++++++++++++++++++++++ 2 files changed, 205 insertions(+), 1 deletion(-) diff --git a/drivers/net/lora/sx130x.c b/drivers/net/lora/sx130x.c index 428e82b4ccb8..6e3b42de98a0 100644 --- a/drivers/net/lora/sx130x.c +++ b/drivers/net/lora/sx130x.c @@ -27,6 +27,63 @@ #include "sx130x.h" +struct sx130x_fields_sequence { + enum sx130x_fields field; + u8 val; +}; + +static const struct sx130x_fields_sequence sx130x_regmap_fields_patch[] = { + /* I/Q path setup */ + {F_RSSI_BB_FILTER_ALPHA, 6}, + {F_RSSI_DEC_FILTER_ALPHA, 7}, + {F_RSSI_CHANN_FILTER_ALPHA, 7}, + {F_RSSI_BB_DEFAULT_VALUE, 23}, + {F_RSSI_DEC_DEFAULT_VALUE, 85}, + {F_RSSI_CHANN_DEFAULT_VALUE, 66}, + {F_DEC_GAIN_OFFSET, 7}, + {F_CHAN_GAIN_OFFSET, 6}, + + /* LoRa 'multi' demodulator setup */ + {F_SNR_AVG_CST, 3}, + {F_FRAME_SYNCH_PEAK1_POS, 3}, // Public LoRa network + {F_FRAME_SYNCH_PEAK2_POS, 4}, // Public LoRa network + + /* LoRa standalone 'MBWSSF' demodulator setup */ + {F_MBWSSF_FRAME_SYNCH_PEAK1_POS, 3}, // Public LoRa network + {F_MBWSSF_FRAME_SYNCH_PEAK2_POS, 4}, // Public LoRa network + + /* Improvement of ref clock freq error tolerance */ + {F_ADJUST_MODEM_START_OFFSET_RDX4L, 1}, + {F_ADJUST_MODEM_START_OFFSET_SF12_RDX4L, (4094 & 0xFF)}, + {F_ADJUST_MODEM_START_OFFSET_SF12_RDX4H, (4094 >> 8)}, + {F_CORR_MAC_GAIN, 7}, + + /* FSK datapath setup */ + {F_FSK_RX_INVERT, 1}, + {F_FSK_MODEM_INVERT_IQ, 1}, + + /* FSK demodulator setup */ + {F_FSK_RSSI_LENGTH, 4}, + {F_FSK_PKT_MODE, 1}, + {F_FSK_CRC_EN, 1}, + {F_FSK_DCFREE_ENC, 2}, + {F_FSK_ERROR_OSR_TOL, 10}, + {F_FSK_PKT_LENGTH, 255}, + {F_FSK_PATTERN_TIMEOUT_CFGL, 128}, + + /* TX general parameters */ + {F_TX_START_DELAYL, (TX_START_DELAY_DEFAULT & 0xFF)}, + {F_TX_START_DELAYH, (TX_START_DELAY_DEFAULT >> 8)}, + + /* TX LoRa */ + {F_TX_SWAP_IQ, 1}, + {F_TX_FRAME_SYNCH_PEAK1_POS, 3}, // Public LoRa network + {F_TX_FRAME_SYNCH_PEAK2_POS, 4}, // Public LoRa network + + /* TX FSK */ + {F_FSK_TX_GAUSSIAN_SELECT_BT, 2}, +}; + static const struct reg_field sx130x_regmap_fields[] = { /* PAGE */ [F_SOFT_RESET] = REG_FIELD(SX1301_PAGE, 7, 7), @@ -54,6 +111,59 @@ static const struct reg_field sx130x_regmap_fields[] = { [F_TX_TRIG_IMMEDIATE] = REG_FIELD(SX1301_TX_TRIG, 0, 0), [F_TX_TRIG_DELAYED] = REG_FIELD(SX1301_TX_TRIG, 1, 1), [F_TX_TRIG_GPS] = REG_FIELD(SX1301_TX_TRIG, 2, 2), + + /* RSSI_X_FILTER_ALPHA */ + [F_RSSI_BB_FILTER_ALPHA] = REG_FIELD(SX1301_RSSI_BB_FILTER_ALPHA, 0, 4), + [F_RSSI_DEC_FILTER_ALPHA] = REG_FIELD(SX1301_RSSI_DEC_FILTER_ALPHA, 0, 4), + [F_RSSI_CHANN_FILTER_ALPHA] = REG_FIELD(SX1301_RSSI_CHANN_FILTER_ALPHA, 0, 4), + /* RSSI_X_DEFAULT_VALUE */ + [F_RSSI_BB_DEFAULT_VALUE] = REG_FIELD(SX1301_RSSI_BB_DEFAULT_VALUE, 0, 7), + [F_RSSI_DEC_DEFAULT_VALUE] = REG_FIELD(SX1301_RSSI_DEC_DEFAULT_VALUE, 0, 7), + [F_RSSI_CHANN_DEFAULT_VALUE] = REG_FIELD(SX1301_RSSI_CHANN_DEFAULT_VALUE, 0, 7), + /* GAIN_OFFSET */ + [F_DEC_GAIN_OFFSET] = REG_FIELD(SX1301_GAIN_OFFSET, 0, 3), + [F_CHAN_GAIN_OFFSET] = REG_FIELD(SX1301_GAIN_OFFSET, 4, 7), + + [F_SNR_AVG_CST] = REG_FIELD(SX1301_MISC_CFG1, 4, 5), + [F_FRAME_SYNCH_PEAK1_POS] = REG_FIELD(SX1301_FRAME_SYNCH, 0, 3), + [F_FRAME_SYNCH_PEAK2_POS] = REG_FIELD(SX1301_FRAME_SYNCH, 4, 7), + + [F_MBWSSF_FRAME_SYNCH_PEAK1_POS] = REG_FIELD(SX1301_BHSYNCPOS, 0, 3), + [F_MBWSSF_FRAME_SYNCH_PEAK2_POS] = REG_FIELD(SX1301_BHSYNCPOS, 4, 7), + + [F_ADJUST_MODEM_START_OFFSET_RDX4L] = + REG_FIELD(SX1301_MODEM_START_RDX4L, 0, 7), // 12 bits + [F_ADJUST_MODEM_START_OFFSET_RDX4H] = + REG_FIELD(SX1301_MODEM_START_RDX4H, 0, 3), + [F_ADJUST_MODEM_START_OFFSET_SF12_RDX4L] = + REG_FIELD(SX1301_MODEM_START_SF12_RDX4L, 0, 7), // 12 bits + [F_ADJUST_MODEM_START_OFFSET_SF12_RDX4H] = + REG_FIELD(SX1301_MODEM_START_SF12_RDX4H, 0, 3), + [F_CORR_MAC_GAIN] = REG_FIELD(SX1301_CORR_CFG, 4, 6), + + [F_FSK_RSSI_LENGTH] = REG_FIELD(SX1301_FSK_CFG1, 3, 5), + [F_FSK_RX_INVERT] = REG_FIELD(SX1301_FSK_CFG1, 6, 6), + [F_FSK_PKT_MODE] = REG_FIELD(SX1301_FSK_CFG1, 7, 7), + + [F_FSK_MODEM_INVERT_IQ] = REG_FIELD(SX1301_IQCFG, 5, 5), + + [F_FSK_CRC_EN] = REG_FIELD(SX1301_FSK_CFG2, 3, 3), + [F_FSK_DCFREE_ENC] = REG_FIELD(SX1301_FSK_CFG2, 4, 5), + [F_FSK_ERROR_OSR_TOL] = REG_FIELD(SX1301_FSK_ERROR_OSR_TOL, 0, 4), + [F_FSK_PKT_LENGTH] = REG_FIELD(SX1301_FSK_PKT_LENGTH, 0, 7), + [F_FSK_PATTERN_TIMEOUT_CFGL] = + REG_FIELD(SX1301_FSK_PATTERN_TIMEOUT_CFGL, 0, 7), // 10 bits + [F_FSK_PATTERN_TIMEOUT_CFGH] = + REG_FIELD(SX1301_FSK_PATTERN_TIMEOUT_CFGH, 0, 1), + + [F_TX_START_DELAYL] = REG_FIELD(SX1301_TX_START_DELAYL, 0, 7), // 16 bit + [F_TX_START_DELAYH] = REG_FIELD(SX1301_TX_START_DELAYH, 0, 7), + + [F_TX_SWAP_IQ] = REG_FIELD(SX1301_TX_CFG2, 7, 7), + [F_TX_FRAME_SYNCH_PEAK1_POS] = REG_FIELD(SX1301_TX_FRAME_SYNCH, 0, 3), + [F_TX_FRAME_SYNCH_PEAK2_POS] = REG_FIELD(SX1301_TX_FRAME_SYNCH, 4, 7), + + [F_FSK_TX_GAUSSIAN_SELECT_BT] = REG_FIELD(SX1301_FSK_TX, 1, 2), }; struct sx130x_tx_header { @@ -263,6 +373,23 @@ static int sx130x_soft_reset(struct sx130x_priv *priv) return 0; } +static int sx130x_fields_patch(struct sx130x_priv *priv) +{ + int i, ret; + + for (i = 0; i < ARRAY_SIZE(sx130x_regmap_fields_patch); i++) { + ret = sx130x_field_force_write(priv, sx130x_regmap_fields_patch[i].field, + sx130x_regmap_fields_patch[i].val); + if (ret) { + dev_err(priv->dev, + "Failed to patch regmap field: %d\n", i); + break; + } + } + + return ret; +} + static int sx130x_agc_ram_read(struct sx130x_priv *priv, u8 addr, unsigned int *val) { int ret; @@ -881,7 +1008,9 @@ static int sx130x_loradev_open(struct net_device *netdev) if (ret) goto err_calibrate; - /* TODO Load constant adjustments, patches */ + ret = sx130x_fields_patch(priv); + if (ret) + return ret; /* TODO Frequency time drift */ diff --git a/drivers/net/lora/sx130x.h b/drivers/net/lora/sx130x.h index 38f1b58b2165..121c8a35b5c3 100644 --- a/drivers/net/lora/sx130x.h +++ b/drivers/net/lora/sx130x.h @@ -29,6 +29,9 @@ #define SX1301_PA_GAIN_OFFSET 6 #define SX1301_DAC_GAIN_OFFSET 4 +/* Calibrated value for 500KHz BW and notch filter disabled */ +#define TX_START_DELAY_DEFAULT 1497 + /* Page independent */ #define SX1301_PAGE 0x00 #define SX1301_VER 0x01 @@ -49,12 +52,39 @@ #define SX1301_PAGE_BASE(n) (SX1301_VIRT_BASE + (SX1301_PAGE_LEN * n)) /* Page 0 */ +#define SX1301_IQCFG (SX1301_PAGE_BASE(0) + 0x21) #define SX1301_CHRS (SX1301_PAGE_BASE(0) + 0x23) +#define SX1301_CORR_CFG (SX1301_PAGE_BASE(0) + 0x4E) +#define SX1301_MODEM_START_RDX4L (SX1301_PAGE_BASE(0) + 0x51) +#define SX1301_MODEM_START_RDX4H (SX1301_PAGE_BASE(0) + 0x52) +#define SX1301_MODEM_START_SF12_RDX4L (SX1301_PAGE_BASE(0) + 0x53) +#define SX1301_MODEM_START_SF12_RDX4H (SX1301_PAGE_BASE(0) + 0x54) +#define SX1301_FRAME_SYNCH (SX1301_PAGE_BASE(0) + 0x5F) +#define SX1301_MISC_CFG1 (SX1301_PAGE_BASE(0) + 0x63) +#define SX1301_GAIN_OFFSET (SX1301_PAGE_BASE(0) + 0x68) #define SX1301_FORCE_CTRL (SX1301_PAGE_BASE(0) + 0x69) #define SX1301_MCU_CTRL (SX1301_PAGE_BASE(0) + 0x6A) +#define SX1301_RSSI_BB_DEFAULT_VALUE (SX1301_PAGE_BASE(0) + 0x6C) +#define SX1301_RSSI_DEC_DEFAULT_VALUE (SX1301_PAGE_BASE(0) + 0x6D) +#define SX1301_RSSI_CHANN_DEFAULT_VALUE (SX1301_PAGE_BASE(0) + 0x6E) +#define SX1301_RSSI_BB_FILTER_ALPHA (SX1301_PAGE_BASE(0) + 0x6F) +#define SX1301_RSSI_DEC_FILTER_ALPHA (SX1301_PAGE_BASE(0) + 0x70) +#define SX1301_RSSI_CHANN_FILTER_ALPHA (SX1301_PAGE_BASE(0) + 0x71) /* Page 1 */ #define SX1301_TX_TRIG (SX1301_PAGE_BASE(1) + 0x21) +#define SX1301_TX_START_DELAYL (SX1301_PAGE_BASE(1) + 0x22) +#define SX1301_TX_START_DELAYH (SX1301_PAGE_BASE(1) + 0x23) +#define SX1301_TX_FRAME_SYNCH (SX1301_PAGE_BASE(1) + 0x24) +#define SX1301_TX_CFG2 (SX1301_PAGE_BASE(1) + 0x2A) +#define SX1301_BHSYNCPOS (SX1301_PAGE_BASE(1) + 0x2E) +#define SX1301_FSK_CFG1 (SX1301_PAGE_BASE(1) + 0x3F) +#define SX1301_FSK_CFG2 (SX1301_PAGE_BASE(1) + 0x40) +#define SX1301_FSK_ERROR_OSR_TOL (SX1301_PAGE_BASE(1) + 0x41) +#define SX1301_FSK_PKT_LENGTH (SX1301_PAGE_BASE(1) + 0x4C) +#define SX1301_FSK_TX (SX1301_PAGE_BASE(1) + 0x4D) +#define SX1301_FSK_PATTERN_TIMEOUT_CFGL (SX1301_PAGE_BASE(1) + 0x53) +#define SX1301_FSK_PATTERN_TIMEOUT_CFGH (SX1301_PAGE_BASE(1) + 0x54) /* Page 2 */ #define SX1301_RADIO_A_SPI_DATA (SX1301_PAGE_BASE(2) + 0x21) @@ -98,6 +128,51 @@ enum sx130x_fields { F_TX_TRIG_IMMEDIATE, F_TX_TRIG_DELAYED, F_TX_TRIG_GPS, + + F_RSSI_BB_FILTER_ALPHA, + F_RSSI_DEC_FILTER_ALPHA, + F_RSSI_CHANN_FILTER_ALPHA, + + F_RSSI_BB_DEFAULT_VALUE, + F_RSSI_DEC_DEFAULT_VALUE, + F_RSSI_CHANN_DEFAULT_VALUE, + + F_DEC_GAIN_OFFSET, + F_CHAN_GAIN_OFFSET, + + F_SNR_AVG_CST, + F_FRAME_SYNCH_PEAK1_POS, + F_FRAME_SYNCH_PEAK2_POS, + + F_MBWSSF_FRAME_SYNCH_PEAK1_POS, + F_MBWSSF_FRAME_SYNCH_PEAK2_POS, + + F_ADJUST_MODEM_START_OFFSET_RDX4L, + F_ADJUST_MODEM_START_OFFSET_RDX4H, + F_ADJUST_MODEM_START_OFFSET_SF12_RDX4L, + F_ADJUST_MODEM_START_OFFSET_SF12_RDX4H, + F_CORR_MAC_GAIN, + + F_FSK_RX_INVERT, + F_FSK_MODEM_INVERT_IQ, + + F_FSK_RSSI_LENGTH, + F_FSK_PKT_MODE, + F_FSK_CRC_EN, + F_FSK_DCFREE_ENC, + F_FSK_ERROR_OSR_TOL, + F_FSK_PKT_LENGTH, + F_FSK_PATTERN_TIMEOUT_CFGL, + F_FSK_PATTERN_TIMEOUT_CFGH, + + F_TX_START_DELAYL, + F_TX_START_DELAYH, + + F_TX_SWAP_IQ, + F_TX_FRAME_SYNCH_PEAK1_POS, + F_TX_FRAME_SYNCH_PEAK2_POS, + + F_FSK_TX_GAUSSIAN_SELECT_BT, }; struct regmap *sx130x_get_regmap(struct device *dev);