diff mbox series

[OpenWrt-Devel,RFC] ath9k: enable hardware random number generator.

Message ID 20200127181946.11978-1-rsalvaterra@gmail.com
State Changes Requested
Delegated to: Petr Štetiar
Headers show
Series [OpenWrt-Devel,RFC] ath9k: enable hardware random number generator. | expand

Commit Message

Rui Salvaterra Jan. 27, 2020, 6:19 p.m. UTC
The ath9k driver is able to leverage the PHY ADC in order to provide a
generic hardware random number generator to the kernel, filling up the
entropy pool as required. Expose this feature in the build system and
remove the old entropy patch, which only obtains entropy from the ADC
once, when the ath9k driver is initialised.

Signed-off-by: Rui Salvaterra <rsalvaterra@gmail.com>
---
 config/Config-kernel.in                       |   4 +
 package/kernel/mac80211/ath.mk                |   7 +
 .../ath/543-ath9k_entropy_from_adc.patch      | 186 ------------------
 3 files changed, 11 insertions(+), 186 deletions(-)
 delete mode 100644 package/kernel/mac80211/patches/ath/543-ath9k_entropy_from_adc.patch

Comments

Petr Štetiar March 1, 2020, 1:06 p.m. UTC | #1
Rui Salvaterra <rsalvaterra@gmail.com> [2020-01-27 18:19:46]:

Hi,

> The ath9k driver is able to leverage the PHY ADC in order to provide a
> generic hardware random number generator to the kernel, filling up the
> entropy pool as required. Expose this feature in the build system and
> remove the old entropy patch, which only obtains entropy from the ADC
> once, when the ath9k driver is initialised.

why is this RFC, are there any gotchas?

BTW that `enable` in commit subject is probably misleading, because you're
just improving the support for hwrng, you're not enabling anything.

-- ynezz
Rui Salvaterra March 1, 2020, 1:34 p.m. UTC | #2
Hi, Petr! Writing from my phone, pardon the terseness (and HTML crap).

A domingo, 1/03/2020, 13:06, Petr Štetiar <ynezz@true.cz> escreveu:

> Rui Salvaterra <rsalvaterra@gmail.com> [2020-01-27 18:19:46]:
>
> why is this RFC, are there any gotchas?
>

This has only been thoroughly tested on AR9003 and AR9002 hardware. I just
received an AR5008 card to test, but I'm on holidays at the moment, so I'll
only test it after Tuesday.

BTW that `enable` in commit subject is probably misleading, because you're
> just improving the support for hwrng, you're not enabling anything.
>

I'm enabling kthread-based entropy collection on AR5008+ hardware, which
hasn't been enabled before (only AR9003 was supported). Does it make sense
this way?

Thanks,
Rui
Rui Salvaterra March 1, 2020, 1:39 p.m. UTC | #3
Ah, silly me, you're absolutely right. This is just half the patch, and
it's perfectly fine the way it is, so I'm not enabling anything new, just
exposing the existing kconfig. Please ignore my previous email.

Thanks,
Rui

A domingo, 1/03/2020, 13:34, Rui Salvaterra <rsalvaterra@gmail.com>
escreveu:

> Hi, Petr! Writing from my phone, pardon the terseness (and HTML crap).
>
> A domingo, 1/03/2020, 13:06, Petr Štetiar <ynezz@true.cz> escreveu:
>
>> Rui Salvaterra <rsalvaterra@gmail.com> [2020-01-27 18:19:46]:
>>
>> why is this RFC, are there any gotchas?
>>
>
> This has only been thoroughly tested on AR9003 and AR9002 hardware. I just
> received an AR5008 card to test, but I'm on holidays at the moment, so I'll
> only test it after Tuesday.
>
> BTW that `enable` in commit subject is probably misleading, because you're
>> just improving the support for hwrng, you're not enabling anything.
>>
>
> I'm enabling kthread-based entropy collection on AR5008+ hardware, which
> hasn't been enabled before (only AR9003 was supported). Does it make sense
> this way?
>
> Thanks,
> Rui
>
Petr Štetiar March 1, 2020, 1:47 p.m. UTC | #4
Rui Salvaterra <rsalvaterra@gmail.com> [2020-03-01 13:39:37]:

> Ah, silly me, you're absolutely right. This is just half the patch, and
> it's perfectly fine the way it is, so I'm not enabling anything new, just
> exposing the existing kconfig. Please ignore my previous email.

Well, I've re-read it again.

Your commit description forget to mention, that you're actually removing ADC
based RNG feeding for ar5k, which is missing in that upstream rng.c.

So commit subject and commit description needs some work. You should consider
as well Felix's remark and if I were your, I would simply handle this via
upstream, once upstreamed, simply backported it to OpenWrt.

-- ynezz
Rui Salvaterra March 1, 2020, 1:59 p.m. UTC | #5
Hi again, Petr.

A domingo, 1/03/2020, 13:47, Petr Štetiar <ynezz@true.cz> escreveu:

> Rui Salvaterra <rsalvaterra@gmail.com> [2020-03-01 13:39:37]:
>
> > Ah, silly me, you're absolutely right. This is just half the patch, and
> > it's perfectly fine the way it is, so I'm not enabling anything new, just
> > exposing the existing kconfig. Please ignore my previous email.
>
> Well, I've re-read it again.
>
> Your commit description forget to mention, that you're actually removing
> ADC
> based RNG feeding for ar5k, which is missing in that upstream rng.c.
>

Yes, I don't want to regress that, of course.

So commit subject and commit description needs some work. You should
> consider
> as well Felix's remark and if I were your, I would simply handle this via
> upstream, once upstreamed, simply backported it to OpenWrt.
>

That's my preferred course of action too, upstream first. As for Felix's
concerns, I'm very thoroughly testing on all the hardware I can get my
hands on. I'm worried the most about AR5008, which is the earliest one, but
now I have a card to test it.

Thanks,
Rui
diff mbox series

Patch

diff --git a/config/Config-kernel.in b/config/Config-kernel.in
index 20930326ca..2f4cda4275 100644
--- a/config/Config-kernel.in
+++ b/config/Config-kernel.in
@@ -220,6 +220,10 @@  config KERNEL_AIO
 	bool "Compile the kernel with asynchronous IO support"
 	default y if !SMALL_FLASH
 
+config KERNEL_HW_RANDOM
+	bool "Compile the kernel with support for hardware random number generators"
+	default n
+
 config KERNEL_FHANDLE
 	bool "Compile the kernel with support for fhandle syscalls"
 	default y if !SMALL_FLASH
diff --git a/package/kernel/mac80211/ath.mk b/package/kernel/mac80211/ath.mk
index 788131b751..56859cd3c1 100644
--- a/package/kernel/mac80211/ath.mk
+++ b/package/kernel/mac80211/ath.mk
@@ -8,6 +8,7 @@  PKG_CONFIG_DEPENDS += \
 	CONFIG_PACKAGE_ATH_SPECTRAL \
 	CONFIG_PACKAGE_ATH_DYNACK \
 	CONFIG_ATH9K_SUPPORT_PCOEM \
+	CONFIG_ATH9K_HWRNG \
 	CONFIG_ATH9K_TX99 \
 	CONFIG_ATH10K_LEDS \
 	CONFIG_ATH10K_THERMAL \
@@ -45,6 +46,7 @@  config-$(CONFIG_TARGET_ipq40xx) += ATH10K_AHB
 config-$(CONFIG_PCI) += ATH9K_PCI
 config-$(CONFIG_ATH_USER_REGD) += ATH_USER_REGD
 config-$(CONFIG_ATH9K_SUPPORT_PCOEM) += ATH9K_PCOEM
+config-$(CONFIG_ATH9K_HWRNG) += ATH9K_HWRNG
 config-$(CONFIG_ATH9K_TX99) += ATH9K_TX99
 config-$(CONFIG_ATH9K_UBNTHSR) += ATH9K_UBNTHSR
 config-$(CONFIG_ATH10K_LEDS) += ATH10K_LEDS
@@ -211,6 +213,11 @@  define KernelPackage/ath9k/config
 		bool "Support chips used in PC OEM cards"
 		depends on PACKAGE_kmod-ath9k
 
+	config ATH9K_HWRNG
+		bool "Random number generator support"
+		depends on PACKAGE_kmod-ath9k
+		select KERNEL_HW_RANDOM
+
        config ATH9K_TX99
                bool "Enable TX99 support (WARNING: testing only, breaks normal operation!)"
                depends on PACKAGE_kmod-ath9k
diff --git a/package/kernel/mac80211/patches/ath/543-ath9k_entropy_from_adc.patch b/package/kernel/mac80211/patches/ath/543-ath9k_entropy_from_adc.patch
deleted file mode 100644
index 64bd6cacfd..0000000000
--- a/package/kernel/mac80211/patches/ath/543-ath9k_entropy_from_adc.patch
+++ /dev/null
@@ -1,186 +0,0 @@ 
---- a/drivers/net/wireless/ath/ath9k/hw.h
-+++ b/drivers/net/wireless/ath/ath9k/hw.h
-@@ -722,6 +722,7 @@ struct ath_spec_scan {
-  * @config_pci_powersave:
-  * @calibrate: periodic calibration for NF, ANI, IQ, ADC gain, ADC-DC
-  *
-+ * @get_adc_entropy: get entropy from the raw ADC I/Q output
-  * @spectral_scan_config: set parameters for spectral scan and enable/disable it
-  * @spectral_scan_trigger: trigger a spectral scan run
-  * @spectral_scan_wait: wait for a spectral scan run to finish
-@@ -744,6 +745,7 @@ struct ath_hw_ops {
- 			struct ath_hw_antcomb_conf *antconf);
- 	void (*antdiv_comb_conf_set)(struct ath_hw *ah,
- 			struct ath_hw_antcomb_conf *antconf);
-+	void (*get_adc_entropy)(struct ath_hw *ah, u8 *buf, size_t len);
- 	void (*spectral_scan_config)(struct ath_hw *ah,
- 				     struct ath_spec_scan *param);
- 	void (*spectral_scan_trigger)(struct ath_hw *ah);
---- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c
-+++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c
-@@ -1927,6 +1927,26 @@ void ar9003_hw_init_rate_txpower(struct
- 	}
- }
- 
-+static void ar9003_hw_get_adc_entropy(struct ath_hw *ah, u8 *buf, size_t len)
-+{
-+	int i, j;
-+
-+	REG_RMW_FIELD(ah, AR_PHY_TEST, AR_PHY_TEST_BBB_OBS_SEL, 1);
-+	REG_CLR_BIT(ah, AR_PHY_TEST, AR_PHY_TEST_RX_OBS_SEL_BIT5);
-+	REG_RMW_FIELD(ah, AR_PHY_TEST_CTL_STATUS, AR_PHY_TEST_CTL_RX_OBS_SEL, 0);
-+
-+	memset(buf, 0, len);
-+	for (i = 0; i < len; i++) {
-+		for (j = 0; j < 4; j++) {
-+			u32 regval = REG_READ(ah, AR_PHY_TST_ADC);
-+
-+			buf[i] <<= 2;
-+			buf[i] |= (regval & 1) | ((regval & BIT(10)) >> 9);
-+			udelay(1);
-+		}
-+	}
-+}
-+
- void ar9003_hw_attach_phy_ops(struct ath_hw *ah)
- {
- 	struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah);
-@@ -1963,6 +1983,7 @@ void ar9003_hw_attach_phy_ops(struct ath
- 	priv_ops->set_radar_params = ar9003_hw_set_radar_params;
- 	priv_ops->fast_chan_change = ar9003_hw_fast_chan_change;
- 
-+	ops->get_adc_entropy = ar9003_hw_get_adc_entropy;
- 	ops->antdiv_comb_conf_get = ar9003_hw_antdiv_comb_conf_get;
- 	ops->antdiv_comb_conf_set = ar9003_hw_antdiv_comb_conf_set;
- 	ops->spectral_scan_config = ar9003_hw_spectral_scan_config;
---- a/drivers/net/wireless/ath/ath9k/init.c
-+++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -819,7 +819,8 @@ static void ath9k_init_txpower_limits(st
- 	if (ah->caps.hw_caps & ATH9K_HW_CAP_5GHZ)
- 		ath9k_init_band_txpower(sc, NL80211_BAND_5GHZ);
- 
--	ah->curchan = curchan;
-+	if (curchan)
-+		ah->curchan = curchan;
- }
- 
- static const struct ieee80211_iface_limit if_limits[] = {
-@@ -1015,6 +1016,18 @@ static void ath9k_set_hw_capab(struct at
- 	wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_AIRTIME_FAIRNESS);
- }
- 
-+static void ath_get_initial_entropy(struct ath_softc *sc)
-+{
-+	struct ath_hw *ah = sc->sc_ah;
-+	char buf[256];
-+
-+	/* reuse last channel initialized by the tx power test */
-+	ath9k_hw_reset(ah, ah->curchan, NULL, false);
-+
-+	ath9k_hw_get_adc_entropy(ah, buf, sizeof(buf));
-+	add_device_randomness(buf, sizeof(buf));
-+}
-+
- int ath9k_init_device(u16 devid, struct ath_softc *sc,
- 		    const struct ath_bus_ops *bus_ops)
- {
-@@ -1060,6 +1073,8 @@ int ath9k_init_device(u16 devid, struct
- 		ARRAY_SIZE(ath9k_tpt_blink));
- #endif
- 
-+	ath_get_initial_entropy(sc);
-+
- 	/* Register with mac80211 */
- 	error = ieee80211_register_hw(hw);
- 	if (error)
---- a/drivers/net/wireless/ath/ath9k/hw-ops.h
-+++ b/drivers/net/wireless/ath/ath9k/hw-ops.h
-@@ -100,6 +100,12 @@ static inline void ath9k_hw_tx99_set_txp
- 		ath9k_hw_ops(ah)->tx99_set_txpower(ah, power);
- }
- 
-+static inline void ath9k_hw_get_adc_entropy(struct ath_hw *ah,
-+		u8 *buf, size_t len)
-+{
-+	ath9k_hw_ops(ah)->get_adc_entropy(ah, buf, len);
-+}
-+
- #ifdef CPTCFG_ATH9K_BTCOEX_SUPPORT
- 
- static inline void ath9k_hw_set_bt_ant_diversity(struct ath_hw *ah, bool enable)
---- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c
-+++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c
-@@ -1320,9 +1320,30 @@ void ar5008_hw_init_rate_txpower(struct
- 	}
- }
- 
-+static void ar5008_hw_get_adc_entropy(struct ath_hw *ah, u8 *buf, size_t len)
-+{
-+	int i, j;
-+
-+	REG_RMW_FIELD(ah, AR_PHY_TEST, AR_PHY_TEST_BBB_OBS_SEL, 1);
-+	REG_CLR_BIT(ah, AR_PHY_TEST, AR_PHY_TEST_RX_OBS_SEL_BIT5);
-+	REG_RMW_FIELD(ah, AR_PHY_TEST2, AR_PHY_TEST2_RX_OBS_SEL, 0);
-+
-+	memset(buf, 0, len);
-+	for (i = 0; i < len; i++) {
-+		for (j = 0; j < 4; j++) {
-+			u32 regval = REG_READ(ah, AR_PHY_TST_ADC);
-+
-+			buf[i] <<= 2;
-+			buf[i] |= (regval & 1) | ((regval & BIT(9)) >> 8);
-+			udelay(1);
-+		}
-+	}
-+}
-+
- int ar5008_hw_attach_phy_ops(struct ath_hw *ah)
- {
- 	struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah);
-+	struct ath_hw_ops *ops = ath9k_hw_ops(ah);
- 	static const u32 ar5416_cca_regs[6] = {
- 		AR_PHY_CCA,
- 		AR_PHY_CH1_CCA,
-@@ -1337,6 +1358,8 @@ int ar5008_hw_attach_phy_ops(struct ath_
- 	if (ret)
- 	    return ret;
- 
-+	ops->get_adc_entropy = ar5008_hw_get_adc_entropy;
-+
- 	priv_ops->rf_set_freq = ar5008_hw_set_channel;
- 	priv_ops->spur_mitigate_freq = ar5008_hw_spur_mitigate;
- 
---- a/drivers/net/wireless/ath/ath9k/ar9002_phy.h
-+++ b/drivers/net/wireless/ath/ath9k/ar9002_phy.h
-@@ -20,6 +20,12 @@
- #define PHY_AGC_CLR             0x10000000
- #define RFSILENT_BB             0x00002000
- 
-+#define AR_PHY_TEST_BBB_OBS_SEL       0x780000
-+#define AR_PHY_TEST_BBB_OBS_SEL_S     19
-+
-+#define AR_PHY_TEST_RX_OBS_SEL_BIT5_S 23
-+#define AR_PHY_TEST_RX_OBS_SEL_BIT5   (1 << AR_PHY_TEST_RX_OBS_SEL_BIT5_S)
-+
- #define AR_PHY_TURBO                0x9804
- #define AR_PHY_FC_TURBO_MODE        0x00000001
- #define AR_PHY_FC_TURBO_SHORT       0x00000002
-@@ -36,6 +42,9 @@
- 
- #define AR_PHY_TEST2			0x9808
- 
-+#define AR_PHY_TEST2_RX_OBS_SEL        0x3C00
-+#define AR_PHY_TEST2_RX_OBS_SEL_S      10
-+
- #define AR_PHY_TIMING2           0x9810
- #define AR_PHY_TIMING3           0x9814
- #define AR_PHY_TIMING3_DSC_MAN   0xFFFE0000
-@@ -393,6 +402,8 @@
- #define AR_PHY_RFBUS_GRANT       0x9C20
- #define AR_PHY_RFBUS_GRANT_EN    0x00000001
- 
-+#define AR_PHY_TST_ADC      0x9C24
-+
- #define AR_PHY_CHAN_INFO_GAIN_DIFF             0x9CF4
- #define AR_PHY_CHAN_INFO_GAIN_DIFF_UPPER_LIMIT 320
-