All of lore.kernel.org
 help / color / mirror / Atom feed
From: Bob Copeland <me@bobcopeland.com>
To: ath5k-devel@lists.ath5k.org, linux-wireless@vger.kernel.org,
	linville@tuxdriver.com, jirislaby@gmail.com, mcgrof@gmail.com,
	nbd@openwrt.org
Subject: Re: [PATCH 5/5] ath5k: Update reset code
Date: Sat, 31 Jan 2009 12:08:02 -0500	[thread overview]
Message-ID: <20090131170802.GA16826@hash.localnet> (raw)
In-Reply-To: <20090131023147.GE3342@makis>

On Sat, Jan 31, 2009 at 04:31:47AM +0200, Nick Kossifidis wrote:
>  * Update reset and sync with HALs
>  * Clean up eeprom settings and tweaking of initvals and put them on separate functions
>  * Set/Restore 32KHz ref clk operation
>  * Add some more documentation
>  TODO: Spur mitigation, tpc, half/quarter rate, compression etc

Awesome work!  I just double checked it, I have some minor comments,
on the whole looks very good.

>  Signed-Off-by: Nick Kossifidis <mickflemm@gmail.com>

Should be "Signed-off-by:" (lowercase O) according to checkpatch.

> [...]
> +bool ath5k_eeprom_is_hb63(struct ath5k_hw *ah)
> +{
> +	u16 data;
> +
> +	ath5k_hw_eeprom_read(ah, AR5K_EEPROM_IS_HB63, &data);
> +
> +	if ((ah->ah_mac_version == (AR5K_SREV_AR2425 >> 4) && data))

Don't think it makes a difference, but judging from the double parens,
I think you meant:

> +	if ((ah->ah_mac_version == (AR5K_SREV_AR2425 >> 4)) && data)

Do we need to check for eeprom version 5.4 or better?  HAL does. 

> [...]
> @@ -2156,7 +2157,8 @@
>  #define	AR5K_PHY_ANT_CTL_TXRX_EN	0x00000001	/* Enable TX/RX (?) */
>  #define	AR5K_PHY_ANT_CTL_SECTORED_ANT	0x00000004	/* Sectored Antenna */
>  #define	AR5K_PHY_ANT_CTL_HITUNE5	0x00000008	/* Hitune5 (?) */
> -#define	AR5K_PHY_ANT_CTL_SWTABLE_IDLE	0x00000010	/* Switch table idle (?) */
> +#define	AR5K_PHY_ANT_CTL_SWTABLE_IDLE	0x000003f9	/* Switch table idle (?) */
> +#define	AR5K_PHY_ANT_CTL_SWTABLE_IDLE_S	4

That doesn't look right.. should be 3f0?  (still probably works, I guess).

> -#define	AR5K_PHY_OFDM_SELFCORR_CYPWR_THR1_S	0
> +#define	AR5K_PHY_OFDM_SELFCORR_CYPWR_THR1_S	1

Heh, we should write a little tool to check the shifts and masks :)

> - * Write the OFDM timings for the AR5212 upon reset. This is a helper for
> - * ath5k_hw_reset(). This seems to tune the PLL a specified frequency
> - * depending on the bandwidth of the channel.
> + * Write the delta slope coefficient (used on pilot tracking ?) for OFDM
> + * operration on the AR5212 upon reset. This is a helper for ath5k_hw_reset().

operation

>   *
> + * Since delta slope is floating point we split it on it's exponent and

its

> + * mantissa and provide these values on hw.
> + *
> + * For more infos i think this pattent is related

patent

> @@ -53,13 +57,20 @@ static inline int ath5k_hw_write_ofdm_timings(struct ath5k_hw *ah,
>  		!(channel->hw_value & CHANNEL_OFDM))
>  		BUG();
>  
> -	/* Seems there are two PLLs, one for baseband sampling and one
> -	 * for tuning. Tuning basebands are 40 MHz or 80MHz when in
> -	 * turbo. */
> -	clock = channel->hw_value & CHANNEL_TURBO ? 80 : 40;
> +	/* Get coefficient
> +	 * ALGO: coef = (5 * clock * carrier_freq) / 2)
> +	 * we scale coef by shifting clock value by 24 for
> +	 * better precision since we use integers */
> +	/* TODO: Half/quarter rate */
> +	clock = channel->hw_value & CHANNEL_TURBO ?
> +				ath5k_hw_htoclock(1, true) :
> +				ath5k_hw_htoclock(1, false);
> +


Could be: 

    clock = ath5k_hw_htoclock(1, channel->hw_value & CHANNEL_TURBO);

>  	coef_scaled = ((5 * (clock << 24)) / 2) /
>  	channel->center_freq;
>  
> +	/* Get exponent
> +	 * ALGO: coe_exp = 14 - highest set bit position */
>  	for (coef_exp = 31; coef_exp > 0; coef_exp--)
>  		if ((coef_scaled >> coef_exp) & 0x1)
>  			break;

I know this is existing code, but we could use something like
get_bitmask_order() here or fls() instead of the open-coded loop.  
For some other patch.

>  /*
> + * If there is an external 32KHz crystal available, use it
> + * as ref. clock instead of 32/40MHz clock and baseband clocks
> + * to save power durring sleep or restore normal 32/40MHz

during

> + * operation.
> + *
> + * XXX: When operating on 32KHz certain PHY registers (27 - 31,
> + * 	123 - 127) require delay on access.
> + */
> +void ath5k_hw_set_sleep_clock(struct ath5k_hw *ah, bool enable)

ACK

> +static bool ath5k_hw_chan_has_spur_noise(struct ath5k_hw *ah,
> +				struct ieee80211_channel *channel)
> +{

ACK

> +	/* Set DAC/ADC delays */
> +	if (ah->ah_version == AR5K_AR5212) {
> +		if (ah->ah_mac_version == (AR5K_SREV_AR2417 >> 4))
> +			data = AR5K_PHY_SCAL_32MHZ_2417;
> +		else if (ath5k_eeprom_is_hb63(ah))
> +			data = AR5K_PHY_SCAL_32MHZ_HB63;
> +		else
> +			data = AR5K_PHY_SCAL_32MHZ;
> +		ath5k_hw_reg_write(ah, data, AR5K_PHY_SCAL);
> +		data = 0;

why data = 0; ?

> +	}
> +
> +	/* Set fast ADC */
> +	if ((ah->ah_radio == AR5K_RF5413) ||
> +	(ah->ah_mac_version == (AR5K_SREV_AR2417 >> 4))) {
> +		data = 1;
> +
> +		if (channel->center_freq == 2462 ||
> +		channel->center_freq == 2467)
> +			data = 0;
> +
> +		if (ath5k_hw_reg_read(ah, AR5K_PHY_FAST_ADC) != data)
> +				ath5k_hw_reg_write(ah, data,
> +						AR5K_PHY_FAST_ADC);
> +		data = 0;

ditto

> +	}
> +
> +	/* Fix for first revision of the RF5112 RF chipset */
> +	if (ah->ah_radio >= AR5K_RF5112 &&
> +			ah->ah_radio_5ghz_revision <
> +			AR5K_SREV_RAD_5112A) {
> +		ath5k_hw_reg_write(ah, AR5K_PHY_CCKTXCTL_WORLD,
> +				AR5K_PHY_CCKTXCTL);
> +		if (channel->hw_value & CHANNEL_5GHZ)
> +			data = 0xffb81020;
> +		else
> +			data = 0xffb80d20;
> +		ath5k_hw_reg_write(ah, data, AR5K_PHY_FRAME_CTL);
> +		data = 0;

ditto

> +	}
> +
> +	if (ah->ah_mac_srev < AR5K_SREV_AR5211) {
> +		/* 5311 has different tx/rx latency masks
> +		 * from 5211, since we deal 5311 the same
> +		 * as 5211 when setting initvals, shift
> +		 * values here to their proper locations */
> +		data = ath5k_hw_reg_read(ah, AR5K_USEC_5211);
> +		ath5k_hw_reg_write(ah, data & (AR5K_USEC_1 |
> +				AR5K_USEC_32 |
> +				AR5K_USEC_TX_LATENCY_5211 |
> +				AR5K_REG_SM(29,
> +				AR5K_USEC_RX_LATENCY_5210)),
> +				AR5K_USEC_5211);
> +		/* Clear QCU/DCU clock gating register */
> +		ath5k_hw_reg_write(ah, 0, AR5K_QCUDCU_CLKGT);
> +		/* Set DAC/ADC delays */
> +		ath5k_hw_reg_write(ah, 0x08, AR5K_PHY_SCAL);
> +		/* Enable PCU FIFO corruption ECO */
> +		AR5K_REG_ENABLE_BITS(ah, AR5K_DIAG_SW_5211,
> +					AR5K_DIAG_SW_ECO_ENABLE);
> +		data = 0;

ditto

> +	}
> +
> +	return;

No need for return.

> +}
> +
> +static void ath5k_hw_commit_eeprom_settings(struct ath5k_hw *ah,
> +		struct ieee80211_channel *channel, u8 *ant, u8 ee_mode)
> +{
> +	struct ath5k_eeprom_info *ee = &ah->ah_capabilities.cap_eeprom;
> +	int16_t cck_ofdm_pwr_delta = 0;

I don't think you need to assign it, unless gcc is particularly dumb.

> +
> +	/* Set CCK to OFDM power delta */
> +	if (ah->ah_phy_revision > AR5K_SREV_PHY_5212A) {
> +		/* Adjust power delta for channel 14 */
> +		if (channel->center_freq == 2484)
> +			cck_ofdm_pwr_delta =
> +				((ee->ee_cck_ofdm_power_delta -
> +				ee->ee_scaled_cck_delta) * 2) / 10;
> +		else
> +			cck_ofdm_pwr_delta =
> +				ee->ee_cck_ofdm_power_delta;

missing * 2 / 10 here?

> +
> +		if (channel->hw_value == CHANNEL_G)
> +			ath5k_hw_reg_write(ah,
> +			AR5K_REG_SM((ee->ee_cck_ofdm_power_delta * -1),
> [...]
> +		AR5K_REG_WRITE_BITS(ah, AR5K_PHY_GAIN,
> +				AR5K_PHY_GAIN_TXRX_ATTEN,
> +				ee->ee_atn_tx_rx[ee_mode]);
> +
> +		/* ADC/PGA dezired size */

desired

> [...]
> +
> +	/* Thres64 (ANI) */

Thresh62 ?

> +	AR5K_REG_WRITE_BITS(ah, AR5K_PHY_NF,
> +			AR5K_PHY_NF_THRESH62,
> +			ee->ee_thr_62[ee_mode]);
> +

> +	/* I/Q correction
> +	 * TODO: Per channel i/q infos ? */
> +	AR5K_REG_ENABLE_BITS(ah, AR5K_PHY_IQ,
> +		AR5K_PHY_IQ_CORR_ENABLE |
> +		(ee->ee_i_cal[ee_mode] << AR5K_PHY_IQ_CORR_Q_I_COFF_S) |
> +		ee->ee_q_cal[ee_mode]);
> +
> +	/* Heavy clipping -disable for now */
> +	if (ah->ah_ee_version >= AR5K_EEPROM_VERSION_5_1)
> +		ath5k_hw_reg_write(ah, 0, AR5K_PHY_HEAVY_CLIP_ENABLE);
> +
> +	return;

No need for return.

> +}

My eyes got tired, so I skipped a lot :)

> +
> +	/* QoS NOACK Policy */
> +	if (ah->ah_version == AR5K_AR5212) {
> +		ath5k_hw_reg_write(ah,
> +			AR5K_REG_SM(2, AR5K_QOS_NOACK_2BIT_VALUES) |
> +			AR5K_REG_SM(5, AR5K_QOS_NOACK_BIT_OFFSET)  |
> +			AR5K_REG_SM(0, AR5K_QOS_NOACK_BYTE_OFFSET),

AR5K_QOS_NOACK_BYTE_OFFSET_S is also wrong, should be 7.

> +			AR5K_QOS_NOACK);
> +	}
> +

Thanks!
-- 
Bob Copeland %% www.bobcopeland.com


  reply	other threads:[~2009-01-31 17:08 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-01-31  2:31 [PATCH 5/5] ath5k: Update reset code Nick Kossifidis
2009-01-31 17:08 ` Bob Copeland [this message]
2009-01-31 18:48   ` [ath5k-devel] " Nick Kossifidis
2009-01-31 18:56     ` Felix Fietkau
2009-01-31 20:50       ` Nick Kossifidis
2009-01-31 21:45         ` Felix Fietkau
2009-01-31 22:38     ` Bob Copeland
2009-01-31 22:58       ` Nick Kossifidis
2009-02-01  4:41         ` Bob Copeland
2009-02-01  3:50       ` Nick Kossifidis
2009-02-01  4:05         ` Felix Fietkau
2009-02-01  4:50           ` Nick Kossifidis
2009-02-01  5:07             ` Felix Fietkau
2009-02-01  5:14               ` Nick Kossifidis
2009-02-03 16:24 ` Bob Copeland
2009-02-03 16:28   ` [ath5k-devel] " Nick Kossifidis
2009-02-04  4:52     ` Bob Copeland
2009-02-04  5:14       ` Nick Kossifidis
2009-02-04  6:58         ` Nick Kossifidis
2009-02-04 21:57 ` Nick Kossifidis
2009-02-05 15:51   ` Bob Copeland
2009-02-05 15:59     ` [ath5k-devel] " Maxim Levitsky
2009-02-05 21:06     ` Nick Kossifidis
2009-02-06  3:52       ` Bob Copeland
2009-02-07  5:03       ` Bob Copeland
2009-02-07  5:20         ` Nick Kossifidis
2009-02-07 14:39           ` Bob Copeland
2009-02-07 16:13             ` Nick Kossifidis
2009-02-08 17:56               ` John W. Linville
2009-02-08 18:01                 ` Nick Kossifidis
2009-02-05 23:28     ` Nick Kossifidis
2009-02-06  3:50       ` Bob Copeland

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20090131170802.GA16826@hash.localnet \
    --to=me@bobcopeland.com \
    --cc=ath5k-devel@lists.ath5k.org \
    --cc=jirislaby@gmail.com \
    --cc=linux-wireless@vger.kernel.org \
    --cc=linville@tuxdriver.com \
    --cc=mcgrof@gmail.com \
    --cc=nbd@openwrt.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.