Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp7024876imu; Wed, 14 Nov 2018 10:28:53 -0800 (PST) X-Google-Smtp-Source: AJdET5cjiuTUPQJdMYLwB8yLaIusi+4ZZov5Iu6sYYGvKcuUcnE9cM+T6L0TFWVhX9zMlIUIKO0a X-Received: by 2002:a17:902:2ac3:: with SMTP id j61mr2979504plb.185.1542220133429; Wed, 14 Nov 2018 10:28:53 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1542220133; cv=none; d=google.com; s=arc-20160816; b=PiTlFIsfQr53/3/usS1SfmZKCHCcET22x3pVjS4UkUen64wB7uBajwUIyqeT+m4KjO xYi8j7Gft1fLqoPtdhuw7FREjFOtLhBFGlHBAY5dkVhTH7I08bmqaGb6aEB4jQxVUB71 uN6NxvxgPTsqr6D9bJgZ6nZV350FVQbAzR86WeciJ0NBLeU4A2YaLoS5qYaErZmYRBp4 5oMzZ7dXDzp4xdGaOtNSjUzIIW/hBx2J3LE2TTqaW6mk11h0vmDaBTCC6deLuqYDer4c wk5G2giqsP8Y/jNSN7nRnbefiblcNnS1IAiuCzoYKKhlfTcb6ek3/+qF6tlnu1eEa1iL qw/w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=i/g8+jXWXfIHkyYACkXk91TLfoe8hqEpg5LDhfWJCpI=; b=YdM6Kiy0Sl9nnrs3wh+9TTADri0M7pgM0BNN13KWeroIuc2TPOkCCUAQHvY4hhor33 qv8sjfagu/b/JnvytmNBMLZu+M4lhkVR85QdPNUKaVCFLLZcvEcMDZMuO4Rp9qQQPkph xyn0BqQuIwwSO56SuLEAQyhAWvgjLVfRTrN62xDMxy7u7kbdj9a3T2FduV25oQ6zL3ZN pVqvj3YCpRVkJkh3PjgWNaVKNKxWFKpZZOv4Jr7IOYPJKu8mfkrNhyuj8C6/uApxVKtM nhjrx8fDcD7auZTlPEnEcMY8vsN4bcDfW1d41e9CBN/IWdazI29WIHFYUvK9unOk1+H/ 4YcQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@plaes.org header.s=mail header.b=NTOzwpe0; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id u8-v6si25227143plh.188.2018.11.14.10.28.37; Wed, 14 Nov 2018 10:28:53 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=fail header.i=@plaes.org header.s=mail header.b=NTOzwpe0; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387464AbeKOEc0 (ORCPT + 99 others); Wed, 14 Nov 2018 23:32:26 -0500 Received: from plaes.org ([188.166.43.21]:55094 "EHLO plaes.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727251AbeKOEcU (ORCPT ); Wed, 14 Nov 2018 23:32:20 -0500 Received: from localhost (85.253.196.132.cable.starman.ee [85.253.196.132]) by plaes.org (Postfix) with ESMTPSA id 56919411A6; Wed, 14 Nov 2018 18:27:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=plaes.org; s=mail; t=1542220079; bh=B/jyuicOIk7tR8SVv/9EF4aCgRenP3/wU9EFFtAaUSk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=NTOzwpe0ttzGz8XRg5Rlo2btWkqGedVs+N2zj5HqwRPRHr1UOCTHZ5NzkERzsCgQK nppANLM5kNTcv7+qJdEAmKGqTFfiMI9GW9OBVlN4vUJomfMbm+3+JfyuupdXHEPfNq 1Ejhd/KHZ6gSfOw1QZM+D/jqYGnmOTMAITIYwKCYn3eNCQm+FhtDTiMeyjpPlQ+bjg hNC2/dIlDlW02uhY4W9Ge1DPkH3w8K/XeQ9YfHJPoIeCgZ40sFgjPaweViM8GqnwFI yYFMo/kbmheo9qSUGBAlVYcKfQMxzXQ2ScXcAfY1KIsp88LUr3Gn7nJX1fhMwLxbmF JFSnocmLb9U9g== From: Priit Laes To: Kees Cook , Jia-Ju Bai , Kalle Valo , Larry Finger , "Gustavo A. R. Silva" , Colin Ian King , Arend van Spriel , Varsha Rao , linux-wireless@vger.kernel.org, b43-dev@lists.infradead.org, linux-kernel@vger.kernel.org Cc: Priit Laes Subject: [PATCH v3 3/3] b43: Use cordic algorithm from kernel library Date: Wed, 14 Nov 2018 20:27:52 +0200 Message-Id: X-Mailer: git-send-email 2.19.1 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Kernel library has a common cordic algorithm which is identical to internally implementatd one, so use it and drop the duplicate implementation. Signed-off-by: Priit Laes --- drivers/net/wireless/broadcom/b43/Kconfig | 1 +- drivers/net/wireless/broadcom/b43/phy_common.c | 47 +------------------- drivers/net/wireless/broadcom/b43/phy_common.h | 9 +---- drivers/net/wireless/broadcom/b43/phy_lp.c | 13 ++--- drivers/net/wireless/broadcom/b43/phy_n.c | 13 ++--- 5 files changed, 15 insertions(+), 68 deletions(-) diff --git a/drivers/net/wireless/broadcom/b43/Kconfig b/drivers/net/wireless/broadcom/b43/Kconfig index fba8560..3e41457 100644 --- a/drivers/net/wireless/broadcom/b43/Kconfig +++ b/drivers/net/wireless/broadcom/b43/Kconfig @@ -4,6 +4,7 @@ config B43 select BCMA if B43_BCMA select SSB if B43_SSB select FW_LOADER + select CORDIC ---help--- b43 is a driver for the Broadcom 43xx series wireless devices. diff --git a/drivers/net/wireless/broadcom/b43/phy_common.c b/drivers/net/wireless/broadcom/b43/phy_common.c index 85f2ca9..98c4fa5 100644 --- a/drivers/net/wireless/broadcom/b43/phy_common.c +++ b/drivers/net/wireless/broadcom/b43/phy_common.c @@ -604,50 +604,3 @@ void b43_phy_force_clock(struct b43_wldev *dev, bool force) #endif } } - -/* http://bcm-v4.sipsolutions.net/802.11/PHY/Cordic */ -struct b43_c32 b43_cordic(int theta) -{ - static const u32 arctg[] = { - 2949120, 1740967, 919879, 466945, 234379, 117304, - 58666, 29335, 14668, 7334, 3667, 1833, - 917, 458, 229, 115, 57, 29, - }; - u8 i; - s32 tmp; - s8 signx = 1; - u32 angle = 0; - struct b43_c32 ret = { .i = 39797, .q = 0, }; - - while (theta > (180 << 16)) - theta -= (360 << 16); - while (theta < -(180 << 16)) - theta += (360 << 16); - - if (theta > (90 << 16)) { - theta -= (180 << 16); - signx = -1; - } else if (theta < -(90 << 16)) { - theta += (180 << 16); - signx = -1; - } - - for (i = 0; i <= 17; i++) { - if (theta > angle) { - tmp = ret.i - (ret.q >> i); - ret.q += ret.i >> i; - ret.i = tmp; - angle += arctg[i]; - } else { - tmp = ret.i + (ret.q >> i); - ret.q -= ret.i >> i; - ret.i = tmp; - angle -= arctg[i]; - } - } - - ret.i *= signx; - ret.q *= signx; - - return ret; -} diff --git a/drivers/net/wireless/broadcom/b43/phy_common.h b/drivers/net/wireless/broadcom/b43/phy_common.h index 57a1ad8..4213cac 100644 --- a/drivers/net/wireless/broadcom/b43/phy_common.h +++ b/drivers/net/wireless/broadcom/b43/phy_common.h @@ -7,13 +7,6 @@ struct b43_wldev; -/* Complex number using 2 32-bit signed integers */ -struct b43_c32 { s32 i, q; }; - -#define CORDIC_CONVERT(value) (((value) >= 0) ? \ - ((((value) >> 15) + 1) >> 1) : \ - -((((-(value)) >> 15) + 1) >> 1)) - /* PHY register routing bits */ #define B43_PHYROUTE 0x0C00 /* PHY register routing bits mask */ #define B43_PHYROUTE_BASE 0x0000 /* Base registers */ @@ -450,6 +443,4 @@ bool b43_is_40mhz(struct b43_wldev *dev); void b43_phy_force_clock(struct b43_wldev *dev, bool force); -struct b43_c32 b43_cordic(int theta); - #endif /* LINUX_B43_PHY_COMMON_H_ */ diff --git a/drivers/net/wireless/broadcom/b43/phy_lp.c b/drivers/net/wireless/broadcom/b43/phy_lp.c index 6922cbb..1718e3b 100644 --- a/drivers/net/wireless/broadcom/b43/phy_lp.c +++ b/drivers/net/wireless/broadcom/b43/phy_lp.c @@ -23,6 +23,7 @@ */ +#include #include #include "b43.h" @@ -1780,9 +1781,9 @@ static void lpphy_start_tx_tone(struct b43_wldev *dev, s32 freq, u16 max) { struct b43_phy_lp *lpphy = dev->phy.lp; u16 buf[64]; - int i, samples = 0, angle = 0; + int i, samples = 0, theta = 0; int rotation = (((36 * freq) / 20) << 16) / 100; - struct b43_c32 sample; + struct cordic_iq sample; lpphy->tx_tone_freq = freq; @@ -1798,10 +1799,10 @@ static void lpphy_start_tx_tone(struct b43_wldev *dev, s32 freq, u16 max) } for (i = 0; i < samples; i++) { - sample = b43_cordic(angle); - angle += rotation; - buf[i] = CORDIC_CONVERT((sample.i * max) & 0xFF) << 8; - buf[i] |= CORDIC_CONVERT((sample.q * max) & 0xFF); + sample = cordic_calc_iq(theta); + theta += rotation; + buf[i] = CORDIC_FLOAT((sample.i * max) & 0xFF) << 8; + buf[i] |= CORDIC_FLOAT((sample.q * max) & 0xFF); } b43_lptab_write_bulk(dev, B43_LPTAB16(5, 0), samples, buf); diff --git a/drivers/net/wireless/broadcom/b43/phy_n.c b/drivers/net/wireless/broadcom/b43/phy_n.c index 44ab080..1f9378a 100644 --- a/drivers/net/wireless/broadcom/b43/phy_n.c +++ b/drivers/net/wireless/broadcom/b43/phy_n.c @@ -23,6 +23,7 @@ */ +#include #include #include #include @@ -1513,7 +1514,7 @@ static void b43_radio_init2055(struct b43_wldev *dev) /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/LoadSampleTable */ static int b43_nphy_load_samples(struct b43_wldev *dev, - struct b43_c32 *samples, u16 len) { + struct cordic_iq *samples, u16 len) { struct b43_phy_n *nphy = dev->phy.n; u16 i; u32 *data; @@ -1544,7 +1545,7 @@ static u16 b43_nphy_gen_load_samples(struct b43_wldev *dev, u32 freq, u16 max, { int i; u16 bw, len, rot, angle; - struct b43_c32 *samples; + struct cordic_iq *samples; bw = b43_is_40mhz(dev) ? 40 : 20; len = bw << 3; @@ -1561,7 +1562,7 @@ static u16 b43_nphy_gen_load_samples(struct b43_wldev *dev, u32 freq, u16 max, len = bw << 1; } - samples = kcalloc(len, sizeof(struct b43_c32), GFP_KERNEL); + samples = kcalloc(len, sizeof(struct cordic_iq), GFP_KERNEL); if (!samples) { b43err(dev->wl, "allocation for samples generation failed\n"); return 0; @@ -1570,10 +1571,10 @@ static u16 b43_nphy_gen_load_samples(struct b43_wldev *dev, u32 freq, u16 max, angle = 0; for (i = 0; i < len; i++) { - samples[i] = b43_cordic(angle); + samples[i] = cordic_calc_iq(angle); angle += rot; - samples[i].q = CORDIC_CONVERT(samples[i].q * max); - samples[i].i = CORDIC_CONVERT(samples[i].i * max); + samples[i].q = CORDIC_FLOAT(samples[i].q * max); + samples[i].i = CORDIC_FLOAT(samples[i].i * max); } i = b43_nphy_load_samples(dev, samples, len); -- git-series 0.9.1