1605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu/* 2605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu * Radio tuning for RTL8225 on RTL8187 3605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu * 4605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu * Copyright 2007 Michael Wu <flamingice@sourmilk.net> 5605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu * Copyright 2007 Andrea Merello <andreamrl@tiscali.it> 6605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu * 7605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu * Based on the r8187 driver, which is: 8605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu * Copyright 2005 Andrea Merello <andreamrl@tiscali.it>, et al. 9605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu * 100aec00ae1c39b0adaa6e958a4e0119cfc12d884bJohn W. Linville * Magic delays, register offsets, and phy value tables below are 110aec00ae1c39b0adaa6e958a4e0119cfc12d884bJohn W. Linville * taken from the original r8187 driver sources. Thanks to Realtek 120aec00ae1c39b0adaa6e958a4e0119cfc12d884bJohn W. Linville * for their support! 13605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu * 14605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu * This program is free software; you can redistribute it and/or modify 15605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu * it under the terms of the GNU General Public License version 2 as 16605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu * published by the Free Software Foundation. 17605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu */ 18605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 19605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu#include <linux/init.h> 20605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu#include <linux/usb.h> 21605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu#include <net/mac80211.h> 22605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 23605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu#include "rtl8187.h" 243cfeb0c33f5cbcc6dde371392877ef3101b8f805John W. Linville#include "rtl8225.h" 25605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 26605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wustatic void rtl8225_write_bitbang(struct ieee80211_hw *dev, u8 addr, u16 data) 27605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu{ 28605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu struct rtl8187_priv *priv = dev->priv; 29605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu u16 reg80, reg84, reg82; 30605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu u32 bangdata; 31605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu int i; 32605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 33605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu bangdata = (data << 4) | (addr & 0xf); 34605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 35605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu reg80 = rtl818x_ioread16(priv, &priv->map->RFPinsOutput) & 0xfff3; 36605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu reg82 = rtl818x_ioread16(priv, &priv->map->RFPinsEnable); 37605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 38605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite16(priv, &priv->map->RFPinsEnable, reg82 | 0x7); 39605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 40605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu reg84 = rtl818x_ioread16(priv, &priv->map->RFPinsSelect); 41605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite16(priv, &priv->map->RFPinsSelect, reg84 | 0x7); 42605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu udelay(10); 43605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 44605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, reg80 | (1 << 2)); 45605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu udelay(2); 46605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, reg80); 47605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu udelay(10); 48605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 49605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu for (i = 15; i >= 0; i--) { 50605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu u16 reg = reg80 | (bangdata & (1 << i)) >> i; 51605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 52605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu if (i & 1) 53605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, reg); 54605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 55605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, reg | (1 << 1)); 56605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, reg | (1 << 1)); 57605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 58605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu if (!(i & 1)) 59605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, reg); 60605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu } 61605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 62605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, reg80 | (1 << 2)); 63605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu udelay(10); 64605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 65605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, reg80 | (1 << 2)); 66605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite16(priv, &priv->map->RFPinsSelect, reg84); 67605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu} 68605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 69899413de1a6c9f999f677526df5205a9a70dcd93Michael Wustatic void rtl8225_write_8051(struct ieee80211_hw *dev, u8 addr, __le16 data) 70605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu{ 71605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu struct rtl8187_priv *priv = dev->priv; 72605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu u16 reg80, reg82, reg84; 73605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 74605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu reg80 = rtl818x_ioread16(priv, &priv->map->RFPinsOutput); 75605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu reg82 = rtl818x_ioread16(priv, &priv->map->RFPinsEnable); 76605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu reg84 = rtl818x_ioread16(priv, &priv->map->RFPinsSelect); 77605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 78605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu reg80 &= ~(0x3 << 2); 79605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu reg84 &= ~0xF; 80605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 81605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite16(priv, &priv->map->RFPinsEnable, reg82 | 0x0007); 82605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite16(priv, &priv->map->RFPinsSelect, reg84 | 0x0007); 83605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu udelay(10); 84605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 85605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, reg80 | (1 << 2)); 86605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu udelay(2); 87605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 88605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, reg80); 89605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu udelay(10); 90605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 919be6f0d40d9191e6fe7e45551c7d1c1614472b53John W. Linville mutex_lock(&priv->io_mutex); 929be6f0d40d9191e6fe7e45551c7d1c1614472b53John W. Linville 939be6f0d40d9191e6fe7e45551c7d1c1614472b53John W. Linville priv->io_dmabuf->bits16 = data; 94605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu usb_control_msg(priv->udev, usb_sndctrlpipe(priv->udev, 0), 95605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu RTL8187_REQ_SET_REG, RTL8187_REQT_WRITE, 969be6f0d40d9191e6fe7e45551c7d1c1614472b53John W. Linville addr, 0x8225, &priv->io_dmabuf->bits16, sizeof(data), 979be6f0d40d9191e6fe7e45551c7d1c1614472b53John W. Linville HZ / 2); 989be6f0d40d9191e6fe7e45551c7d1c1614472b53John W. Linville 999be6f0d40d9191e6fe7e45551c7d1c1614472b53John W. Linville mutex_unlock(&priv->io_mutex); 100605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 101605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, reg80 | (1 << 2)); 102605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu udelay(10); 103605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 104605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, reg80 | (1 << 2)); 105605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite16(priv, &priv->map->RFPinsSelect, reg84); 106605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu} 107605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 108f653211197f3841f383fa9757ef8ce182c6cf627Michael Wustatic void rtl8225_write(struct ieee80211_hw *dev, u8 addr, u16 data) 109605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu{ 110605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu struct rtl8187_priv *priv = dev->priv; 111605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 112605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu if (priv->asic_rev) 113899413de1a6c9f999f677526df5205a9a70dcd93Michael Wu rtl8225_write_8051(dev, addr, cpu_to_le16(data)); 114605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu else 115605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write_bitbang(dev, addr, data); 116605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu} 117605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 118f653211197f3841f383fa9757ef8ce182c6cf627Michael Wustatic u16 rtl8225_read(struct ieee80211_hw *dev, u8 addr) 119605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu{ 120605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu struct rtl8187_priv *priv = dev->priv; 121605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu u16 reg80, reg82, reg84, out; 122605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu int i; 123605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 124605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu reg80 = rtl818x_ioread16(priv, &priv->map->RFPinsOutput); 125605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu reg82 = rtl818x_ioread16(priv, &priv->map->RFPinsEnable); 126605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu reg84 = rtl818x_ioread16(priv, &priv->map->RFPinsSelect); 127605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 128605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu reg80 &= ~0xF; 129605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 130605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite16(priv, &priv->map->RFPinsEnable, reg82 | 0x000F); 131605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite16(priv, &priv->map->RFPinsSelect, reg84 | 0x000F); 132605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 133605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, reg80 | (1 << 2)); 134605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu udelay(4); 135605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, reg80); 136605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu udelay(5); 137605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 138605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu for (i = 4; i >= 0; i--) { 139605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu u16 reg = reg80 | ((addr >> i) & 1); 140605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 141605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu if (!(i & 1)) { 142605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, reg); 143605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu udelay(1); 144605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu } 145605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 146605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, 147605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu reg | (1 << 1)); 148605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu udelay(2); 149605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, 150605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu reg | (1 << 1)); 151605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu udelay(2); 152605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 153605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu if (i & 1) { 154605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, reg); 155605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu udelay(1); 156605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu } 157605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu } 158605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 159605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, 160605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu reg80 | (1 << 3) | (1 << 1)); 161605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu udelay(2); 162605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, 163605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu reg80 | (1 << 3)); 164605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu udelay(2); 165605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, 166605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu reg80 | (1 << 3)); 167605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu udelay(2); 168605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 169605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu out = 0; 170605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu for (i = 11; i >= 0; i--) { 171605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, 172605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu reg80 | (1 << 3)); 173605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu udelay(1); 174605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, 175605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu reg80 | (1 << 3) | (1 << 1)); 176605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu udelay(2); 177605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, 178605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu reg80 | (1 << 3) | (1 << 1)); 179605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu udelay(2); 180605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, 181605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu reg80 | (1 << 3) | (1 << 1)); 182605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu udelay(2); 183605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 184605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu if (rtl818x_ioread16(priv, &priv->map->RFPinsInput) & (1 << 1)) 185605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu out |= 1 << i; 186605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 187605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, 188605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu reg80 | (1 << 3)); 189605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu udelay(2); 190605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu } 191605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 192605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, 193605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu reg80 | (1 << 3) | (1 << 2)); 194605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu udelay(2); 195605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 196605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite16(priv, &priv->map->RFPinsEnable, reg82); 197605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite16(priv, &priv->map->RFPinsSelect, reg84); 198605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, 0x03A0); 199605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 200605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu return out; 201605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu} 202605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 203605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wustatic const u16 rtl8225bcd_rxgain[] = { 204605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0408, 0x0409, 205605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x040a, 0x040b, 0x0502, 0x0503, 0x0504, 0x0505, 0x0540, 0x0541, 206605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x0542, 0x0543, 0x0544, 0x0545, 0x0580, 0x0581, 0x0582, 0x0583, 207605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x0584, 0x0585, 0x0588, 0x0589, 0x058a, 0x058b, 0x0643, 0x0644, 208605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x0645, 0x0680, 0x0681, 0x0682, 0x0683, 0x0684, 0x0685, 0x0688, 209605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x0689, 0x068a, 0x068b, 0x068c, 0x0742, 0x0743, 0x0744, 0x0745, 210605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x0780, 0x0781, 0x0782, 0x0783, 0x0784, 0x0785, 0x0788, 0x0789, 211605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x078a, 0x078b, 0x078c, 0x078d, 0x0790, 0x0791, 0x0792, 0x0793, 212605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x0794, 0x0795, 0x0798, 0x0799, 0x079a, 0x079b, 0x079c, 0x079d, 213605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x07a0, 0x07a1, 0x07a2, 0x07a3, 0x07a4, 0x07a5, 0x07a8, 0x07a9, 214605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x07aa, 0x07ab, 0x07ac, 0x07ad, 0x07b0, 0x07b1, 0x07b2, 0x07b3, 215605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x07b4, 0x07b5, 0x07b8, 0x07b9, 0x07ba, 0x07bb, 0x07bb 216605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu}; 217605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 218605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wustatic const u8 rtl8225_agc[] = { 219605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 220605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x9d, 0x9c, 0x9b, 0x9a, 0x99, 0x98, 0x97, 0x96, 221605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x95, 0x94, 0x93, 0x92, 0x91, 0x90, 0x8f, 0x8e, 222605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x8d, 0x8c, 0x8b, 0x8a, 0x89, 0x88, 0x87, 0x86, 223605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x85, 0x84, 0x83, 0x82, 0x81, 0x80, 0x3f, 0x3e, 224605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x3d, 0x3c, 0x3b, 0x3a, 0x39, 0x38, 0x37, 0x36, 225605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x35, 0x34, 0x33, 0x32, 0x31, 0x30, 0x2f, 0x2e, 226605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x2d, 0x2c, 0x2b, 0x2a, 0x29, 0x28, 0x27, 0x26, 227605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x25, 0x24, 0x23, 0x22, 0x21, 0x20, 0x1f, 0x1e, 228605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x1d, 0x1c, 0x1b, 0x1a, 0x19, 0x18, 0x17, 0x16, 229605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0f, 0x0e, 230605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 231605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x05, 0x04, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 232605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 233605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 234605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 235605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu}; 236605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 237605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wustatic const u8 rtl8225_gain[] = { 238605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x23, 0x88, 0x7c, 0xa5, /* -82dBm */ 239605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x23, 0x88, 0x7c, 0xb5, /* -82dBm */ 240605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x23, 0x88, 0x7c, 0xc5, /* -82dBm */ 241605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x33, 0x80, 0x79, 0xc5, /* -78dBm */ 242605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x43, 0x78, 0x76, 0xc5, /* -74dBm */ 243605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x53, 0x60, 0x73, 0xc5, /* -70dBm */ 244605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x63, 0x58, 0x70, 0xc5, /* -66dBm */ 245605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu}; 246605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 247605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wustatic const u8 rtl8225_threshold[] = { 248605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x8d, 0x8d, 0x8d, 0x8d, 0x9d, 0xad, 0xbd 249605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu}; 250605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 251605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wustatic const u8 rtl8225_tx_gain_cck_ofdm[] = { 252605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x02, 0x06, 0x0e, 0x1e, 0x3e, 0x7e 253605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu}; 254605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 255605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wustatic const u8 rtl8225_tx_power_cck[] = { 256605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02, 257605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02, 258605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02, 259605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02, 260605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03, 261605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03 262605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu}; 263605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 264605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wustatic const u8 rtl8225_tx_power_cck_ch14[] = { 265605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00, 266605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00, 267605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00, 268605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00, 269605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00, 270605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00 271605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu}; 272605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 273605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wustatic const u8 rtl8225_tx_power_ofdm[] = { 274605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x80, 0x90, 0xa2, 0xb5, 0xcb, 0xe4 275605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu}; 276605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 277605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wustatic const u32 rtl8225_chan[] = { 278605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x085c, 0x08dc, 0x095c, 0x09dc, 0x0a5c, 0x0adc, 0x0b5c, 279605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x0bdc, 0x0c5c, 0x0cdc, 0x0d5c, 0x0ddc, 0x0e5c, 0x0f72 280605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu}; 281605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 282605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wustatic void rtl8225_rf_set_tx_power(struct ieee80211_hw *dev, int channel) 283605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu{ 284605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu struct rtl8187_priv *priv = dev->priv; 285605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu u8 cck_power, ofdm_power; 286605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu const u8 *tmp; 287605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu u32 reg; 288605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu int i; 289605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 2908318d78a44d49ac1edf2bdec7299de3617c4232eJohannes Berg cck_power = priv->channels[channel - 1].hw_value & 0xF; 2918318d78a44d49ac1edf2bdec7299de3617c4232eJohannes Berg ofdm_power = priv->channels[channel - 1].hw_value >> 4; 292605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 293605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu cck_power = min(cck_power, (u8)11); 294eb83bbf57429ab80f49b413e3e44d3b19c3fdc5aLarry Finger if (ofdm_power > (u8)15) 295eb83bbf57429ab80f49b413e3e44d3b19c3fdc5aLarry Finger ofdm_power = 25; 296eb83bbf57429ab80f49b413e3e44d3b19c3fdc5aLarry Finger else 297eb83bbf57429ab80f49b413e3e44d3b19c3fdc5aLarry Finger ofdm_power += 10; 298605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 299605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite8(priv, &priv->map->TX_GAIN_CCK, 300605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_tx_gain_cck_ofdm[cck_power / 6] >> 1); 301605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 302605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu if (channel == 14) 303605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu tmp = &rtl8225_tx_power_cck_ch14[(cck_power % 6) * 8]; 304605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu else 305605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu tmp = &rtl8225_tx_power_cck[(cck_power % 6) * 8]; 306605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 307605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu for (i = 0; i < 8; i++) 308605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write_phy_cck(dev, 0x44 + i, *tmp++); 309605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 310605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu msleep(1); // FIXME: optional? 311605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 312605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu /* anaparam2 on */ 313605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_CONFIG); 314605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu reg = rtl818x_ioread8(priv, &priv->map->CONFIG3); 315e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung rtl818x_iowrite8(priv, &priv->map->CONFIG3, 316e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung reg | RTL818X_CONFIG3_ANAPARAM_WRITE); 3174ece16a1cf9d36fee6d3ccb2c933296cf660e44dHerton Ronaldo Krzesinski rtl818x_iowrite32(priv, &priv->map->ANAPARAM2, 3184ece16a1cf9d36fee6d3ccb2c933296cf660e44dHerton Ronaldo Krzesinski RTL8187_RTL8225_ANAPARAM2_ON); 319e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung rtl818x_iowrite8(priv, &priv->map->CONFIG3, 320e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung reg & ~RTL818X_CONFIG3_ANAPARAM_WRITE); 321605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_NORMAL); 322605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 323605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write_phy_ofdm(dev, 2, 0x42); 324605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write_phy_ofdm(dev, 6, 0x00); 325605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write_phy_ofdm(dev, 8, 0x00); 326605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 327605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite8(priv, &priv->map->TX_GAIN_OFDM, 328605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_tx_gain_cck_ofdm[ofdm_power / 6] >> 1); 329605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 330605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu tmp = &rtl8225_tx_power_ofdm[ofdm_power % 6]; 331605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 332605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write_phy_ofdm(dev, 5, *tmp); 333605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write_phy_ofdm(dev, 7, *tmp); 334605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 335605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu msleep(1); 336605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu} 337605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 338f653211197f3841f383fa9757ef8ce182c6cf627Michael Wustatic void rtl8225_rf_init(struct ieee80211_hw *dev) 339605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu{ 340605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu struct rtl8187_priv *priv = dev->priv; 341605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu int i; 342605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 343946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0x0, 0x067); 344946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0x1, 0xFE0); 345946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0x2, 0x44D); 346946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0x3, 0x441); 347946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0x4, 0x486); 348946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0x5, 0xBC0); 349946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0x6, 0xAE6); 350946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0x7, 0x82A); 351946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0x8, 0x01F); 352946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0x9, 0x334); 353946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0xA, 0xFD4); 354946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0xB, 0x391); 355946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0xC, 0x050); 356946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0xD, 0x6DB); 357946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0xE, 0x029); 358605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write(dev, 0xF, 0x914); msleep(100); 359605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 360605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write(dev, 0x2, 0xC4D); msleep(200); 361605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write(dev, 0x2, 0x44D); msleep(200); 362605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 363605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu if (!(rtl8225_read(dev, 6) & (1 << 7))) { 364605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write(dev, 0x02, 0x0c4d); 365605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu msleep(200); 366605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write(dev, 0x02, 0x044d); 367605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu msleep(100); 368605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu if (!(rtl8225_read(dev, 6) & (1 << 7))) 3695db5584441c2dceb75696fb31a44ac7b9b925359Joe Perches wiphy_warn(dev->wiphy, "RF Calibration Failed! %x\n", 370c96c31e499b70964cfc88744046c998bb710e4b8Joe Perches rtl8225_read(dev, 6)); 371605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu } 372605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 373605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write(dev, 0x0, 0x127); 374605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 375605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu for (i = 0; i < ARRAY_SIZE(rtl8225bcd_rxgain); i++) { 376605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write(dev, 0x1, i + 1); 377605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write(dev, 0x2, rtl8225bcd_rxgain[i]); 378605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu } 379605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 380605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write(dev, 0x0, 0x027); 381605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write(dev, 0x0, 0x22F); 382605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 383605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu for (i = 0; i < ARRAY_SIZE(rtl8225_agc); i++) { 384605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write_phy_ofdm(dev, 0xB, rtl8225_agc[i]); 385605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write_phy_ofdm(dev, 0xA, 0x80 + i); 386605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu } 387605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 388605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu msleep(1); 389605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 39035cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x00, 0x01); 39135cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x01, 0x02); 39235cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x02, 0x42); 39335cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x03, 0x00); 39435cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x04, 0x00); 39535cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x05, 0x00); 39635cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x06, 0x40); 39735cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x07, 0x00); 39835cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x08, 0x40); 39935cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x09, 0xfe); 40035cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x0a, 0x09); 40135cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x0b, 0x80); 40235cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x0c, 0x01); 40335cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x0e, 0xd3); 40435cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x0f, 0x38); 40535cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x10, 0x84); 40635cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x11, 0x06); 40735cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x12, 0x20); 40835cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x13, 0x20); 40935cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x14, 0x00); 41035cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x15, 0x40); 41135cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x16, 0x00); 41235cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x17, 0x40); 41335cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x18, 0xef); 41435cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x19, 0x19); 41535cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x1a, 0x20); 41635cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x1b, 0x76); 41735cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x1c, 0x04); 41835cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x1e, 0x95); 41935cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x1f, 0x75); 42035cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x20, 0x1f); 42135cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x21, 0x27); 42235cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x22, 0x16); 42335cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x24, 0x46); 42435cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x25, 0x20); 42535cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x26, 0x90); 42635cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x27, 0x88); 427605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 428605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write_phy_ofdm(dev, 0x0d, rtl8225_gain[2 * 4]); 429605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write_phy_ofdm(dev, 0x1b, rtl8225_gain[2 * 4 + 2]); 430605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write_phy_ofdm(dev, 0x1d, rtl8225_gain[2 * 4 + 3]); 431605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write_phy_ofdm(dev, 0x23, rtl8225_gain[2 * 4 + 1]); 432605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 433a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger rtl8225_write_phy_cck(dev, 0x00, 0x98); 434a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger rtl8225_write_phy_cck(dev, 0x03, 0x20); 435a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger rtl8225_write_phy_cck(dev, 0x04, 0x7e); 436a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger rtl8225_write_phy_cck(dev, 0x05, 0x12); 437a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger rtl8225_write_phy_cck(dev, 0x06, 0xfc); 438a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger rtl8225_write_phy_cck(dev, 0x07, 0x78); 439a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger rtl8225_write_phy_cck(dev, 0x08, 0x2e); 440a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger rtl8225_write_phy_cck(dev, 0x10, 0x9b); 441a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger rtl8225_write_phy_cck(dev, 0x11, 0x88); 442a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger rtl8225_write_phy_cck(dev, 0x12, 0x47); 443605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write_phy_cck(dev, 0x13, 0xd0); 444605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write_phy_cck(dev, 0x19, 0x00); 445605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write_phy_cck(dev, 0x1a, 0xa0); 446605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write_phy_cck(dev, 0x1b, 0x08); 447605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write_phy_cck(dev, 0x40, 0x86); 448a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger rtl8225_write_phy_cck(dev, 0x41, 0x8d); 449a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger rtl8225_write_phy_cck(dev, 0x42, 0x15); 450a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger rtl8225_write_phy_cck(dev, 0x43, 0x18); 451a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger rtl8225_write_phy_cck(dev, 0x44, 0x1f); 452a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger rtl8225_write_phy_cck(dev, 0x45, 0x1e); 453a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger rtl8225_write_phy_cck(dev, 0x46, 0x1a); 454a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger rtl8225_write_phy_cck(dev, 0x47, 0x15); 455a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger rtl8225_write_phy_cck(dev, 0x48, 0x10); 456a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger rtl8225_write_phy_cck(dev, 0x49, 0x0a); 457a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger rtl8225_write_phy_cck(dev, 0x4a, 0x05); 458a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger rtl8225_write_phy_cck(dev, 0x4b, 0x02); 459a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger rtl8225_write_phy_cck(dev, 0x4c, 0x05); 460605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 461605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite8(priv, &priv->map->TESTR, 0x0D); 462605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 463605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_rf_set_tx_power(dev, 1); 464605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 465605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu /* RX antenna default to A */ 466a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger rtl8225_write_phy_cck(dev, 0x10, 0x9b); /* B: 0xDB */ 46735cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x26, 0x90); /* B: 0x10 */ 468605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 469605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite8(priv, &priv->map->TX_ANTENNA, 0x03); /* B: 0x00 */ 470605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu msleep(1); 471605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite32(priv, (__le32 *)0xFF94, 0x3dc00002); 472605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 473605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu /* set sensitivity */ 474605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write(dev, 0x0c, 0x50); 475605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write_phy_ofdm(dev, 0x0d, rtl8225_gain[2 * 4]); 476605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write_phy_ofdm(dev, 0x1b, rtl8225_gain[2 * 4 + 2]); 477605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write_phy_ofdm(dev, 0x1d, rtl8225_gain[2 * 4 + 3]); 478605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write_phy_ofdm(dev, 0x23, rtl8225_gain[2 * 4 + 1]); 479605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write_phy_cck(dev, 0x41, rtl8225_threshold[2]); 480605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu} 481605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 482e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leungstatic const u8 rtl8225z2_agc[] = { 483e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung 0x5e, 0x5e, 0x5e, 0x5e, 0x5d, 0x5b, 0x59, 0x57, 0x55, 0x53, 0x51, 0x4f, 484e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung 0x4d, 0x4b, 0x49, 0x47, 0x45, 0x43, 0x41, 0x3f, 0x3d, 0x3b, 0x39, 0x37, 485e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung 0x35, 0x33, 0x31, 0x2f, 0x2d, 0x2b, 0x29, 0x27, 0x25, 0x23, 0x21, 0x1f, 486e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung 0x1d, 0x1b, 0x19, 0x17, 0x15, 0x13, 0x11, 0x0f, 0x0d, 0x0b, 0x09, 0x07, 487e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung 0x05, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 488e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung 0x01, 0x01, 0x01, 0x01, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 489e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung 0x19, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x26, 0x27, 0x27, 0x28, 490e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung 0x28, 0x29, 0x2a, 0x2a, 0x2a, 0x2b, 0x2b, 0x2b, 0x2c, 0x2c, 0x2c, 0x2d, 491e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung 0x2d, 0x2d, 0x2d, 0x2e, 0x2e, 0x2e, 0x2e, 0x2f, 0x2f, 0x2f, 0x30, 0x30, 492e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 493e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31 494e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung}; 495e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leungstatic const u8 rtl8225z2_ofdm[] = { 496e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung 0x10, 0x0d, 0x01, 0x00, 0x14, 0xfb, 0xfb, 0x60, 497e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung 0x00, 0x60, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 498e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0xa8, 0x26, 499e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung 0x32, 0x33, 0x07, 0xa5, 0x6f, 0x55, 0xc8, 0xb3, 500e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung 0x0a, 0xe1, 0x2C, 0x8a, 0x86, 0x83, 0x34, 0x0f, 501e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung 0x4f, 0x24, 0x6f, 0xc2, 0x6b, 0x40, 0x80, 0x00, 502e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung 0xc0, 0xc1, 0x58, 0xf1, 0x00, 0xe4, 0x90, 0x3e, 503e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung 0x6d, 0x3c, 0xfb, 0x07 504e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung}; 505e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung 506605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wustatic const u8 rtl8225z2_tx_power_cck_ch14[] = { 507e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung 0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00, 508e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung 0x30, 0x2f, 0x29, 0x15, 0x00, 0x00, 0x00, 0x00, 509e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung 0x30, 0x2f, 0x29, 0x15, 0x00, 0x00, 0x00, 0x00, 510e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung 0x30, 0x2f, 0x29, 0x15, 0x00, 0x00, 0x00, 0x00 511605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu}; 512605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 513605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wustatic const u8 rtl8225z2_tx_power_cck[] = { 514e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung 0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04, 515e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung 0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03, 516e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung 0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03, 517e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung 0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03 518605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu}; 519605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 520605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wustatic const u8 rtl8225z2_tx_power_ofdm[] = { 521605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x42, 0x00, 0x40, 0x00, 0x40 522605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu}; 523605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 524605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wustatic const u8 rtl8225z2_tx_gain_cck_ofdm[] = { 525605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 526605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 527605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 528605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 529605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 530605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23 531605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu}; 532605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 533605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wustatic void rtl8225z2_rf_set_tx_power(struct ieee80211_hw *dev, int channel) 534605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu{ 535605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu struct rtl8187_priv *priv = dev->priv; 536605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu u8 cck_power, ofdm_power; 537605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu const u8 *tmp; 538605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu u32 reg; 539605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu int i; 540605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 5418318d78a44d49ac1edf2bdec7299de3617c4232eJohannes Berg cck_power = priv->channels[channel - 1].hw_value & 0xF; 5428318d78a44d49ac1edf2bdec7299de3617c4232eJohannes Berg ofdm_power = priv->channels[channel - 1].hw_value >> 4; 543605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 544605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu cck_power = min(cck_power, (u8)15); 545605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu cck_power += priv->txpwr_base & 0xF; 546605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu cck_power = min(cck_power, (u8)35); 547605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 548eb83bbf57429ab80f49b413e3e44d3b19c3fdc5aLarry Finger if (ofdm_power > (u8)15) 549eb83bbf57429ab80f49b413e3e44d3b19c3fdc5aLarry Finger ofdm_power = 25; 550eb83bbf57429ab80f49b413e3e44d3b19c3fdc5aLarry Finger else 551eb83bbf57429ab80f49b413e3e44d3b19c3fdc5aLarry Finger ofdm_power += 10; 552605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu ofdm_power += priv->txpwr_base >> 4; 553605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu ofdm_power = min(ofdm_power, (u8)35); 554605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 555605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu if (channel == 14) 556605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu tmp = rtl8225z2_tx_power_cck_ch14; 557605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu else 558605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu tmp = rtl8225z2_tx_power_cck; 559605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 560605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu for (i = 0; i < 8; i++) 561605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write_phy_cck(dev, 0x44 + i, *tmp++); 562605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 563605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite8(priv, &priv->map->TX_GAIN_CCK, 564605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225z2_tx_gain_cck_ofdm[cck_power]); 565605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu msleep(1); 566605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 567605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu /* anaparam2 on */ 568605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_CONFIG); 569605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu reg = rtl818x_ioread8(priv, &priv->map->CONFIG3); 570e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung rtl818x_iowrite8(priv, &priv->map->CONFIG3, 571e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung reg | RTL818X_CONFIG3_ANAPARAM_WRITE); 5724ece16a1cf9d36fee6d3ccb2c933296cf660e44dHerton Ronaldo Krzesinski rtl818x_iowrite32(priv, &priv->map->ANAPARAM2, 5734ece16a1cf9d36fee6d3ccb2c933296cf660e44dHerton Ronaldo Krzesinski RTL8187_RTL8225_ANAPARAM2_ON); 574e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung rtl818x_iowrite8(priv, &priv->map->CONFIG3, 575e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung reg & ~RTL818X_CONFIG3_ANAPARAM_WRITE); 576605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_NORMAL); 577605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 578605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write_phy_ofdm(dev, 2, 0x42); 579605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write_phy_ofdm(dev, 5, 0x00); 580605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write_phy_ofdm(dev, 6, 0x40); 581605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write_phy_ofdm(dev, 7, 0x00); 582605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write_phy_ofdm(dev, 8, 0x40); 583605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 584605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite8(priv, &priv->map->TX_GAIN_OFDM, 585605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225z2_tx_gain_cck_ofdm[ofdm_power]); 586605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu msleep(1); 587605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu} 588605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 589e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leungstatic void rtl8225z2_b_rf_set_tx_power(struct ieee80211_hw *dev, int channel) 590e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung{ 591e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung struct rtl8187_priv *priv = dev->priv; 592e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung u8 cck_power, ofdm_power; 593e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung const u8 *tmp; 594e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung int i; 595e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung 596e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung cck_power = priv->channels[channel - 1].hw_value & 0xF; 597e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung ofdm_power = priv->channels[channel - 1].hw_value >> 4; 598e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung 599e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung if (cck_power > 15) 600e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung cck_power = (priv->hw_rev == RTL8187BvB) ? 15 : 22; 601e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung else 602e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung cck_power += (priv->hw_rev == RTL8187BvB) ? 0 : 7; 603e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung cck_power += priv->txpwr_base & 0xF; 604e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung cck_power = min(cck_power, (u8)35); 605e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung 606e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung if (ofdm_power > 15) 607e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung ofdm_power = (priv->hw_rev == RTL8187BvB) ? 17 : 25; 608e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung else 609e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung ofdm_power += (priv->hw_rev == RTL8187BvB) ? 2 : 10; 610e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung ofdm_power += (priv->txpwr_base >> 4) & 0xF; 611e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung ofdm_power = min(ofdm_power, (u8)35); 612e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung 613e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung if (channel == 14) 614e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung tmp = rtl8225z2_tx_power_cck_ch14; 615e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung else 616e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung tmp = rtl8225z2_tx_power_cck; 617e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung 618e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung if (priv->hw_rev == RTL8187BvB) { 619e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung if (cck_power <= 6) 620e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung ; /* do nothing */ 621e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung else if (cck_power <= 11) 622e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung tmp += 8; 623e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung else 624e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung tmp += 16; 625e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung } else { 626e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung if (cck_power <= 5) 627e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung ; /* do nothing */ 628e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung else if (cck_power <= 11) 629e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung tmp += 8; 630e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung else if (cck_power <= 17) 631e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung tmp += 16; 632e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung else 633e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung tmp += 24; 634e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung } 635e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung 636e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung for (i = 0; i < 8; i++) 637e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung rtl8225_write_phy_cck(dev, 0x44 + i, *tmp++); 638e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung 639e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung rtl818x_iowrite8(priv, &priv->map->TX_GAIN_CCK, 640c4832467a5c8c2ae96d6dad882be4d4ab9eefad7Larry Finger rtl8225z2_tx_gain_cck_ofdm[cck_power] << 1); 641e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung msleep(1); 642e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung 643e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung rtl818x_iowrite8(priv, &priv->map->TX_GAIN_OFDM, 644e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung rtl8225z2_tx_gain_cck_ofdm[ofdm_power] << 1); 645e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung if (priv->hw_rev == RTL8187BvB) { 646e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung if (ofdm_power <= 11) { 647e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung rtl8225_write_phy_ofdm(dev, 0x87, 0x60); 648e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung rtl8225_write_phy_ofdm(dev, 0x89, 0x60); 649e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung } else { 650e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung rtl8225_write_phy_ofdm(dev, 0x87, 0x5c); 651e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung rtl8225_write_phy_ofdm(dev, 0x89, 0x5c); 652e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung } 653e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung } else { 654e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung if (ofdm_power <= 11) { 655e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung rtl8225_write_phy_ofdm(dev, 0x87, 0x5c); 656e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung rtl8225_write_phy_ofdm(dev, 0x89, 0x5c); 657e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung } else if (ofdm_power <= 17) { 658e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung rtl8225_write_phy_ofdm(dev, 0x87, 0x54); 659e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung rtl8225_write_phy_ofdm(dev, 0x89, 0x54); 660e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung } else { 661e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung rtl8225_write_phy_ofdm(dev, 0x87, 0x50); 662e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung rtl8225_write_phy_ofdm(dev, 0x89, 0x50); 663e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung } 664e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung } 665e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung msleep(1); 666e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung} 667e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung 668605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wustatic const u16 rtl8225z2_rxgain[] = { 669605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0408, 0x0409, 670605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x040a, 0x040b, 0x0502, 0x0503, 0x0504, 0x0505, 0x0540, 0x0541, 671605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x0542, 0x0543, 0x0544, 0x0545, 0x0580, 0x0581, 0x0582, 0x0583, 672605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x0584, 0x0585, 0x0588, 0x0589, 0x058a, 0x058b, 0x0643, 0x0644, 673605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x0645, 0x0680, 0x0681, 0x0682, 0x0683, 0x0684, 0x0685, 0x0688, 674605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x0689, 0x068a, 0x068b, 0x068c, 0x0742, 0x0743, 0x0744, 0x0745, 675605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x0780, 0x0781, 0x0782, 0x0783, 0x0784, 0x0785, 0x0788, 0x0789, 676605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x078a, 0x078b, 0x078c, 0x078d, 0x0790, 0x0791, 0x0792, 0x0793, 677605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x0794, 0x0795, 0x0798, 0x0799, 0x079a, 0x079b, 0x079c, 0x079d, 678605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x07a0, 0x07a1, 0x07a2, 0x07a3, 0x07a4, 0x07a5, 0x07a8, 0x07a9, 679605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03b2, 0x03b3, 680605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x03b4, 0x03b5, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bb 681605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu}; 682605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 683605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wustatic const u8 rtl8225z2_gain_bg[] = { 684605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x23, 0x15, 0xa5, /* -82-1dBm */ 685605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x23, 0x15, 0xb5, /* -82-2dBm */ 686605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x23, 0x15, 0xc5, /* -82-3dBm */ 687605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x33, 0x15, 0xc5, /* -78dBm */ 688605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x43, 0x15, 0xc5, /* -74dBm */ 689605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x53, 0x15, 0xc5, /* -70dBm */ 690605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 0x63, 0x15, 0xc5 /* -66dBm */ 691605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu}; 692605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 693f653211197f3841f383fa9757ef8ce182c6cf627Michael Wustatic void rtl8225z2_rf_init(struct ieee80211_hw *dev) 694605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu{ 695605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu struct rtl8187_priv *priv = dev->priv; 696605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu int i; 697605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 698946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0x0, 0x2BF); 699946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0x1, 0xEE0); 700946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0x2, 0x44D); 701946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0x3, 0x441); 702946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0x4, 0x8C3); 703946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0x5, 0xC72); 704946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0x6, 0x0E6); 705946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0x7, 0x82A); 706946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0x8, 0x03F); 707946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0x9, 0x335); 708946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0xa, 0x9D4); 709946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0xb, 0x7BB); 710946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0xc, 0x850); 711946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0xd, 0xCDF); 712946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0xe, 0x02B); 713946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0xf, 0x114); 714946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger msleep(100); 715605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 716605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write(dev, 0x0, 0x1B7); 717605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 718605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu for (i = 0; i < ARRAY_SIZE(rtl8225z2_rxgain); i++) { 719605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write(dev, 0x1, i + 1); 720605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write(dev, 0x2, rtl8225z2_rxgain[i]); 721605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu } 722605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 723605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write(dev, 0x3, 0x080); 724605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write(dev, 0x5, 0x004); 725605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write(dev, 0x0, 0x0B7); 726605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write(dev, 0x2, 0xc4D); 727605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 728605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu msleep(200); 729605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write(dev, 0x2, 0x44D); 730605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu msleep(100); 731605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 732605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu if (!(rtl8225_read(dev, 6) & (1 << 7))) { 733605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write(dev, 0x02, 0x0C4D); 734605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu msleep(200); 735605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write(dev, 0x02, 0x044D); 736605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu msleep(100); 737605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu if (!(rtl8225_read(dev, 6) & (1 << 7))) 7385db5584441c2dceb75696fb31a44ac7b9b925359Joe Perches wiphy_warn(dev->wiphy, "RF Calibration Failed! %x\n", 739c96c31e499b70964cfc88744046c998bb710e4b8Joe Perches rtl8225_read(dev, 6)); 740605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu } 741605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 742605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu msleep(200); 743605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 744605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write(dev, 0x0, 0x2BF); 745605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 746605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu for (i = 0; i < ARRAY_SIZE(rtl8225_agc); i++) { 747605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write_phy_ofdm(dev, 0xB, rtl8225_agc[i]); 748605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write_phy_ofdm(dev, 0xA, 0x80 + i); 749605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu } 750605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 751605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu msleep(1); 752605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 75335cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x00, 0x01); 75435cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x01, 0x02); 75535cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x02, 0x42); 75635cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x03, 0x00); 75735cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x04, 0x00); 75835cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x05, 0x00); 75935cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x06, 0x40); 76035cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x07, 0x00); 76135cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x08, 0x40); 76235cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x09, 0xfe); 76335cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x0a, 0x08); 76435cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x0b, 0x80); 76535cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x0c, 0x01); 766605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write_phy_ofdm(dev, 0x0d, 0x43); 76735cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x0e, 0xd3); 76835cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x0f, 0x38); 76935cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x10, 0x84); 77035cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x11, 0x07); 77135cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x12, 0x20); 77235cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x13, 0x20); 77335cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x14, 0x00); 77435cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x15, 0x40); 77535cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x16, 0x00); 77635cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x17, 0x40); 77735cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x18, 0xef); 77835cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x19, 0x19); 77935cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x1a, 0x20); 78035cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x1b, 0x15); 78135cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x1c, 0x04); 78235cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x1d, 0xc5); 78335cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x1e, 0x95); 78435cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x1f, 0x75); 78535cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x20, 0x1f); 78635cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x21, 0x17); 78735cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x22, 0x16); 78835cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x23, 0x80); 78935cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x24, 0x46); 79035cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x25, 0x00); 79135cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x26, 0x90); 79235cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x27, 0x88); 793605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 794605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write_phy_ofdm(dev, 0x0b, rtl8225z2_gain_bg[4 * 3]); 795605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write_phy_ofdm(dev, 0x1b, rtl8225z2_gain_bg[4 * 3 + 1]); 796605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write_phy_ofdm(dev, 0x1d, rtl8225z2_gain_bg[4 * 3 + 2]); 797605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write_phy_ofdm(dev, 0x21, 0x37); 798605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 799a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger rtl8225_write_phy_cck(dev, 0x00, 0x98); 800a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger rtl8225_write_phy_cck(dev, 0x03, 0x20); 801a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger rtl8225_write_phy_cck(dev, 0x04, 0x7e); 802a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger rtl8225_write_phy_cck(dev, 0x05, 0x12); 803a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger rtl8225_write_phy_cck(dev, 0x06, 0xfc); 804a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger rtl8225_write_phy_cck(dev, 0x07, 0x78); 805a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger rtl8225_write_phy_cck(dev, 0x08, 0x2e); 806a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger rtl8225_write_phy_cck(dev, 0x10, 0x9b); 807a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger rtl8225_write_phy_cck(dev, 0x11, 0x88); 808a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger rtl8225_write_phy_cck(dev, 0x12, 0x47); 809605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write_phy_cck(dev, 0x13, 0xd0); 810605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write_phy_cck(dev, 0x19, 0x00); 811605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write_phy_cck(dev, 0x1a, 0xa0); 812605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write_phy_cck(dev, 0x1b, 0x08); 813605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225_write_phy_cck(dev, 0x40, 0x86); 814a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger rtl8225_write_phy_cck(dev, 0x41, 0x8d); 815a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger rtl8225_write_phy_cck(dev, 0x42, 0x15); 816a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger rtl8225_write_phy_cck(dev, 0x43, 0x18); 817a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger rtl8225_write_phy_cck(dev, 0x44, 0x36); 818a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger rtl8225_write_phy_cck(dev, 0x45, 0x35); 819a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger rtl8225_write_phy_cck(dev, 0x46, 0x2e); 820a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger rtl8225_write_phy_cck(dev, 0x47, 0x25); 821a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger rtl8225_write_phy_cck(dev, 0x48, 0x1c); 822a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger rtl8225_write_phy_cck(dev, 0x49, 0x12); 823a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger rtl8225_write_phy_cck(dev, 0x4a, 0x09); 824a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger rtl8225_write_phy_cck(dev, 0x4b, 0x04); 825a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger rtl8225_write_phy_cck(dev, 0x4c, 0x05); 826605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 827605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite8(priv, (u8 *)0xFF5B, 0x0D); msleep(1); 828605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 829605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl8225z2_rf_set_tx_power(dev, 1); 830605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 831605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu /* RX antenna default to A */ 832a3d67bc2e9e25f09151971192946fe3b68543649Larry Finger rtl8225_write_phy_cck(dev, 0x10, 0x9b); /* B: 0xDB */ 83335cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x26, 0x90); /* B: 0x10 */ 834605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 835605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite8(priv, &priv->map->TX_ANTENNA, 0x03); /* B: 0x00 */ 836605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu msleep(1); 837605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu rtl818x_iowrite32(priv, (__le32 *)0xFF94, 0x3dc00002); 838605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu} 839605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 840e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leungstatic void rtl8225z2_b_rf_init(struct ieee80211_hw *dev) 841e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung{ 842e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung struct rtl8187_priv *priv = dev->priv; 843e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung int i; 844e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung 845946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0x0, 0x0B7); 846946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0x1, 0xEE0); 847946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0x2, 0x44D); 848946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0x3, 0x441); 849946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0x4, 0x8C3); 850946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0x5, 0xC72); 851946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0x6, 0x0E6); 852946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0x7, 0x82A); 853946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0x8, 0x03F); 854946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0x9, 0x335); 855946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0xa, 0x9D4); 856946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0xb, 0x7BB); 857946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0xc, 0x850); 858946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0xd, 0xCDF); 859946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0xe, 0x02B); 860946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0xf, 0x114); 861946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger 862946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0x0, 0x1B7); 863e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung 864e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung for (i = 0; i < ARRAY_SIZE(rtl8225z2_rxgain); i++) { 865946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0x1, i + 1); 866946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0x2, rtl8225z2_rxgain[i]); 867e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung } 868e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung 869946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0x3, 0x080); 870946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0x5, 0x004); 871946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0x0, 0x0B7); 872e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung 873946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0x2, 0xC4D); 874e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung 875946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0x2, 0x44D); 876946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0x0, 0x2BF); 877e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung 878e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung rtl818x_iowrite8(priv, &priv->map->TX_GAIN_CCK, 0x03); 879e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung rtl818x_iowrite8(priv, &priv->map->TX_GAIN_OFDM, 0x07); 880e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung rtl818x_iowrite8(priv, &priv->map->TX_ANTENNA, 0x03); 881e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung 882e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung rtl8225_write_phy_ofdm(dev, 0x80, 0x12); 883e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung for (i = 0; i < ARRAY_SIZE(rtl8225z2_agc); i++) { 884e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung rtl8225_write_phy_ofdm(dev, 0xF, rtl8225z2_agc[i]); 885e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung rtl8225_write_phy_ofdm(dev, 0xE, 0x80 + i); 886e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung rtl8225_write_phy_ofdm(dev, 0xE, 0); 887e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung } 888e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung rtl8225_write_phy_ofdm(dev, 0x80, 0x10); 889e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung 890e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung for (i = 0; i < ARRAY_SIZE(rtl8225z2_ofdm); i++) 891e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung rtl8225_write_phy_ofdm(dev, i, rtl8225z2_ofdm[i]); 892e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung 89335cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x97, 0x46); 89435cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0xa4, 0xb6); 89535cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_ofdm(dev, 0x85, 0xfc); 89635cc988a5620cea03fd97e96c530e1f259ef913bLarry Finger rtl8225_write_phy_cck(dev, 0xc1, 0x88); 897e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung} 898e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung 899f653211197f3841f383fa9757ef8ce182c6cf627Michael Wustatic void rtl8225_rf_stop(struct ieee80211_hw *dev) 900605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu{ 901946d1c22644a5de07efc1c847fb64bb0cf8f82f2Larry Finger rtl8225_write(dev, 0x4, 0x1f); 902605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu} 903605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 904f653211197f3841f383fa9757ef8ce182c6cf627Michael Wustatic void rtl8225_rf_set_channel(struct ieee80211_hw *dev, 905f653211197f3841f383fa9757ef8ce182c6cf627Michael Wu struct ieee80211_conf *conf) 906605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu{ 907605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu struct rtl8187_priv *priv = dev->priv; 9088318d78a44d49ac1edf2bdec7299de3617c4232eJohannes Berg int chan = ieee80211_frequency_to_channel(conf->channel->center_freq); 909605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 910f653211197f3841f383fa9757ef8ce182c6cf627Michael Wu if (priv->rf->init == rtl8225_rf_init) 9118318d78a44d49ac1edf2bdec7299de3617c4232eJohannes Berg rtl8225_rf_set_tx_power(dev, chan); 912e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung else if (priv->rf->init == rtl8225z2_rf_init) 9138318d78a44d49ac1edf2bdec7299de3617c4232eJohannes Berg rtl8225z2_rf_set_tx_power(dev, chan); 914e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung else 915e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung rtl8225z2_b_rf_set_tx_power(dev, chan); 916605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu 9178318d78a44d49ac1edf2bdec7299de3617c4232eJohannes Berg rtl8225_write(dev, 0x7, rtl8225_chan[chan - 1]); 918605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu msleep(10); 919605bebe23bf6ac66c0a717e663a7baa2f981294dMichael Wu} 920f653211197f3841f383fa9757ef8ce182c6cf627Michael Wu 921f653211197f3841f383fa9757ef8ce182c6cf627Michael Wustatic const struct rtl818x_rf_ops rtl8225_ops = { 922f653211197f3841f383fa9757ef8ce182c6cf627Michael Wu .name = "rtl8225", 923f653211197f3841f383fa9757ef8ce182c6cf627Michael Wu .init = rtl8225_rf_init, 924f653211197f3841f383fa9757ef8ce182c6cf627Michael Wu .stop = rtl8225_rf_stop, 925f653211197f3841f383fa9757ef8ce182c6cf627Michael Wu .set_chan = rtl8225_rf_set_channel 926f653211197f3841f383fa9757ef8ce182c6cf627Michael Wu}; 927f653211197f3841f383fa9757ef8ce182c6cf627Michael Wu 928f653211197f3841f383fa9757ef8ce182c6cf627Michael Wustatic const struct rtl818x_rf_ops rtl8225z2_ops = { 929f653211197f3841f383fa9757ef8ce182c6cf627Michael Wu .name = "rtl8225z2", 930f653211197f3841f383fa9757ef8ce182c6cf627Michael Wu .init = rtl8225z2_rf_init, 931f653211197f3841f383fa9757ef8ce182c6cf627Michael Wu .stop = rtl8225_rf_stop, 932f653211197f3841f383fa9757ef8ce182c6cf627Michael Wu .set_chan = rtl8225_rf_set_channel 933f653211197f3841f383fa9757ef8ce182c6cf627Michael Wu}; 934f653211197f3841f383fa9757ef8ce182c6cf627Michael Wu 935e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leungstatic const struct rtl818x_rf_ops rtl8225z2_b_ops = { 936e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung .name = "rtl8225z2", 937e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung .init = rtl8225z2_b_rf_init, 938e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung .stop = rtl8225_rf_stop, 939e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung .set_chan = rtl8225_rf_set_channel 940e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung}; 941e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung 942f653211197f3841f383fa9757ef8ce182c6cf627Michael Wuconst struct rtl818x_rf_ops * rtl8187_detect_rf(struct ieee80211_hw *dev) 943f653211197f3841f383fa9757ef8ce182c6cf627Michael Wu{ 944f653211197f3841f383fa9757ef8ce182c6cf627Michael Wu u16 reg8, reg9; 945e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung struct rtl8187_priv *priv = dev->priv; 946f653211197f3841f383fa9757ef8ce182c6cf627Michael Wu 947e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung if (!priv->is_rtl8187b) { 948e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung rtl8225_write(dev, 0, 0x1B7); 949f653211197f3841f383fa9757ef8ce182c6cf627Michael Wu 950e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung reg8 = rtl8225_read(dev, 8); 951e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung reg9 = rtl8225_read(dev, 9); 952f653211197f3841f383fa9757ef8ce182c6cf627Michael Wu 953e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung rtl8225_write(dev, 0, 0x0B7); 954f653211197f3841f383fa9757ef8ce182c6cf627Michael Wu 955e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung if (reg8 != 0x588 || reg9 != 0x700) 956e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung return &rtl8225_ops; 957f653211197f3841f383fa9757ef8ce182c6cf627Michael Wu 958e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung return &rtl8225z2_ops; 959e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung } else 960e7d414ff21a7e0b00295e838c004ff1de5fba6ceHin-Tak Leung return &rtl8225z2_b_ops; 961f653211197f3841f383fa9757ef8ce182c6cf627Michael Wu} 962