|
@@ -31,6 +31,48 @@
|
|
|
* Radio 2064.
|
|
|
**************************************************/
|
|
|
|
|
|
+static void b43_radio_2064_channel_setup(struct b43_wldev *dev)
|
|
|
+{
|
|
|
+ u16 save[2];
|
|
|
+
|
|
|
+ b43_radio_set(dev, 0x09d, 0x4);
|
|
|
+ b43_radio_write(dev, 0x09e, 0xf);
|
|
|
+
|
|
|
+ b43_radio_write(dev, 0x02a, 0xb);
|
|
|
+ b43_radio_maskset(dev, 0x030, ~0x3, 0xa);
|
|
|
+ b43_radio_maskset(dev, 0x091, ~0x3, 0);
|
|
|
+ b43_radio_maskset(dev, 0x038, ~0xf, 0x7);
|
|
|
+ b43_radio_maskset(dev, 0x030, ~0xc, 0x8);
|
|
|
+ b43_radio_maskset(dev, 0x05e, ~0xf, 0x8);
|
|
|
+ b43_radio_maskset(dev, 0x05e, ~0xf0, 0x80);
|
|
|
+ b43_radio_write(dev, 0x06c, 0x80);
|
|
|
+
|
|
|
+ save[0] = b43_radio_read(dev, 0x044);
|
|
|
+ save[1] = b43_radio_read(dev, 0x12b);
|
|
|
+
|
|
|
+ b43_radio_set(dev, 0x044, 0x7);
|
|
|
+ b43_radio_set(dev, 0x12b, 0xe);
|
|
|
+
|
|
|
+ /* TODO */
|
|
|
+
|
|
|
+ b43_radio_write(dev, 0x040, 0xfb);
|
|
|
+
|
|
|
+ b43_radio_write(dev, 0x041, 0x9a);
|
|
|
+ b43_radio_write(dev, 0x042, 0xa3);
|
|
|
+ b43_radio_write(dev, 0x043, 0x0c);
|
|
|
+
|
|
|
+ /* TODO */
|
|
|
+
|
|
|
+ b43_radio_set(dev, 0x044, 0x0c);
|
|
|
+ udelay(1);
|
|
|
+
|
|
|
+ b43_radio_write(dev, 0x044, save[0]);
|
|
|
+ b43_radio_write(dev, 0x12b, save[1]);
|
|
|
+
|
|
|
+ b43_radio_write(dev, 0x038, 0x0);
|
|
|
+ b43_radio_write(dev, 0x091, 0x7);
|
|
|
+}
|
|
|
+
|
|
|
static void b43_radio_2064_init(struct b43_wldev *dev)
|
|
|
{
|
|
|
b43_radio_write(dev, 0x09c, 0x0020);
|
|
@@ -171,6 +213,32 @@ static void b43_phy_lcn_pre_radio_init(struct b43_wldev *dev)
|
|
|
/* TODO: more ops */
|
|
|
}
|
|
|
|
|
|
+/**************************************************
|
|
|
+ * Channel switching ops.
|
|
|
+ **************************************************/
|
|
|
+
|
|
|
+static int b43_phy_lcn_set_channel(struct b43_wldev *dev,
|
|
|
+ struct ieee80211_channel *channel,
|
|
|
+ enum nl80211_channel_type channel_type)
|
|
|
+{
|
|
|
+ /* TODO: PLL and PHY ops */
|
|
|
+
|
|
|
+ b43_phy_set(dev, 0x44a, 0x44);
|
|
|
+ b43_phy_write(dev, 0x44a, 0x80);
|
|
|
+
|
|
|
+ b43_phy_set(dev, 0x44a, 0x44);
|
|
|
+ b43_phy_write(dev, 0x44a, 0x80);
|
|
|
+
|
|
|
+ b43_radio_2064_channel_setup(dev);
|
|
|
+ mdelay(1);
|
|
|
+
|
|
|
+ b43_phy_lcn_afe_set_unset(dev);
|
|
|
+
|
|
|
+ /* TODO */
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
/**************************************************
|
|
|
* Basic PHY ops.
|
|
|
**************************************************/
|
|
@@ -265,6 +333,22 @@ static void b43_phy_lcn_op_switch_analog(struct b43_wldev *dev, bool on)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static int b43_phy_lcn_op_switch_channel(struct b43_wldev *dev,
|
|
|
+ unsigned int new_channel)
|
|
|
+{
|
|
|
+ struct ieee80211_channel *channel = dev->wl->hw->conf.channel;
|
|
|
+ enum nl80211_channel_type channel_type = dev->wl->hw->conf.channel_type;
|
|
|
+
|
|
|
+ if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ) {
|
|
|
+ if ((new_channel < 1) || (new_channel > 14))
|
|
|
+ return -EINVAL;
|
|
|
+ } else {
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
+ return b43_phy_lcn_set_channel(dev, channel, channel_type);
|
|
|
+}
|
|
|
+
|
|
|
static unsigned int b43_phy_lcn_op_get_default_chan(struct b43_wldev *dev)
|
|
|
{
|
|
|
if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ)
|
|
@@ -338,9 +422,7 @@ const struct b43_phy_operations b43_phyops_lcn = {
|
|
|
.radio_write = b43_phy_lcn_op_radio_write,
|
|
|
.software_rfkill = b43_phy_lcn_op_software_rfkill,
|
|
|
.switch_analog = b43_phy_lcn_op_switch_analog,
|
|
|
- /*
|
|
|
.switch_channel = b43_phy_lcn_op_switch_channel,
|
|
|
- */
|
|
|
.get_default_chan = b43_phy_lcn_op_get_default_chan,
|
|
|
.recalc_txpower = b43_phy_lcn_op_recalc_txpower,
|
|
|
.adjust_txpower = b43_phy_lcn_op_adjust_txpower,
|