2
* Radio tuning for Maxim max2820 on RTL8180
4
* Copyright 2007 Andrea Merello <andreamrl@tiscali.it>
6
* Code from the BSD driver and the rtl8181 project have been
7
* very useful to understand certain things
9
* I want to thanks the Authors of such projects and the Ndiswrapper
12
* A special Big Thanks also is for all people who donated me cards,
13
* making possible the creation of the original rtl8180 driver
14
* from which this code is derived!
16
* This program is free software; you can redistribute it and/or modify
17
* it under the terms of the GNU General Public License version 2 as
18
* published by the Free Software Foundation.
21
#include <linux/init.h>
22
#include <linux/pci.h>
23
#include <linux/delay.h>
24
#include <net/mac80211.h>
27
#include "rtl8180_max2820.h"
29
static const u32 max2820_chan[] = {
46
static void write_max2820(struct ieee80211_hw *dev, u8 addr, u32 data)
48
struct rtl8180_priv *priv = dev->priv;
51
phy_config = 0x90 + (data & 0xf);
55
phy_config += (data >> 4) & 0xff;
57
rtl818x_iowrite32(priv,
58
(__le32 __iomem *) &priv->map->RFPinsOutput, phy_config);
63
static void max2820_write_phy_antenna(struct ieee80211_hw *dev, short chan)
65
struct rtl8180_priv *priv = dev->priv;
69
if (priv->rfparam & RF_PARAM_ANTBDEFAULT)
72
ant |= BB_ANTATTEN_CHAN14;
74
rtl8180_write_phy(dev, 0x10, ant);
77
static void max2820_rf_set_channel(struct ieee80211_hw *dev,
78
struct ieee80211_conf *conf)
80
struct rtl8180_priv *priv = dev->priv;
82
ieee80211_frequency_to_channel(conf->channel->center_freq) : 1;
83
unsigned int chan_idx = channel - 1;
84
u32 txpw = priv->channels[chan_idx].hw_value & 0xFF;
85
u32 chan = max2820_chan[chan_idx];
87
/* While philips SA2400 drive the PA bias from
88
* sa2400, for MAXIM we do this directly from BB */
89
rtl8180_write_phy(dev, 3, txpw);
91
max2820_write_phy_antenna(dev, channel);
92
write_max2820(dev, 3, chan);
95
static void max2820_rf_stop(struct ieee80211_hw *dev)
97
rtl8180_write_phy(dev, 3, 0x8);
98
write_max2820(dev, 1, 0);
102
static void max2820_rf_init(struct ieee80211_hw *dev)
104
struct rtl8180_priv *priv = dev->priv;
106
/* MAXIM from netbsd driver */
107
write_max2820(dev, 0, 0x007); /* test mode as indicated in datasheet */
108
write_max2820(dev, 1, 0x01e); /* enable register */
109
write_max2820(dev, 2, 0x001); /* synt register */
111
max2820_rf_set_channel(dev, NULL);
113
write_max2820(dev, 4, 0x313); /* rx register */
115
/* PA is driven directly by the BB, we keep the MAXIM bias
116
* at the highest value in case that setting it to lower
117
* values may introduce some further attenuation somewhere..
119
write_max2820(dev, 5, 0x00f);
121
/* baseband configuration */
122
rtl8180_write_phy(dev, 0, 0x88); /* sys1 */
123
rtl8180_write_phy(dev, 3, 0x08); /* txagc */
124
rtl8180_write_phy(dev, 4, 0xf8); /* lnadet */
125
rtl8180_write_phy(dev, 5, 0x90); /* ifagcinit */
126
rtl8180_write_phy(dev, 6, 0x1a); /* ifagclimit */
127
rtl8180_write_phy(dev, 7, 0x64); /* ifagcdet */
129
max2820_write_phy_antenna(dev, 1);
131
rtl8180_write_phy(dev, 0x11, 0x88); /* trl */
133
if (rtl818x_ioread8(priv, &priv->map->CONFIG2) &
134
RTL818X_CONFIG2_ANTENNA_DIV)
135
rtl8180_write_phy(dev, 0x12, 0xc7);
137
rtl8180_write_phy(dev, 0x12, 0x47);
139
rtl8180_write_phy(dev, 0x13, 0x9b);
141
rtl8180_write_phy(dev, 0x19, 0x0); /* CHESTLIM */
142
rtl8180_write_phy(dev, 0x1a, 0x9f); /* CHSQLIM */
144
max2820_rf_set_channel(dev, NULL);
147
const struct rtl818x_rf_ops max2820_rf_ops = {
149
.init = max2820_rf_init,
150
.stop = max2820_rf_stop,
151
.set_chan = max2820_rf_set_channel