aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rtl8187_rtl8225.c
diff options
context:
space:
mode:
authorMichael Wu <flamingice@sourmilk.net>2007-10-14 14:43:16 -0400
committerDavid S. Miller <davem@davemloft.net>2008-01-28 18:09:35 -0500
commitf653211197f3841f383fa9757ef8ce182c6cf627 (patch)
treeba56e1fa09924d1ffab4f825044175291786b58e /drivers/net/wireless/rtl8187_rtl8225.c
parentfa1c114fdaa605496045e56c42d0c8aa4c139e57 (diff)
Add rtl8180 wireless driver
This patch adds a mac80211 based wireless driver for the rtl8180 and rtl8185 PCI wireless cards. Also included are some rtl8187 changes required due to the relationship between that driver and this one. Michael Wu is primarily responsible for the initial driver and rtl8185 support. Andreas Merello provided the additional rtl8180 support. Thanks to Jukka Ruohonen for the donating a rtl8185 card! It was very helpful for the rtl8225z2 code. The Signed-off-by information below is collected from the individual patches submitted to wireless-2.6 before merging this driver upstream. Signed-off-by: Andrea Merello <andreamrl@tiscali.it> Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: Pavel Roskin <proski@gnu.org> Signed-off-by: Michael Wu <flamingice@sourmilk.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/rtl8187_rtl8225.c')
-rw-r--r--drivers/net/wireless/rtl8187_rtl8225.c52
1 files changed, 42 insertions, 10 deletions
diff --git a/drivers/net/wireless/rtl8187_rtl8225.c b/drivers/net/wireless/rtl8187_rtl8225.c
index efc41207780e..b713de17ba0a 100644
--- a/drivers/net/wireless/rtl8187_rtl8225.c
+++ b/drivers/net/wireless/rtl8187_rtl8225.c
@@ -101,7 +101,7 @@ static void rtl8225_write_8051(struct ieee80211_hw *dev, u8 addr, __le16 data)
101 msleep(2); 101 msleep(2);
102} 102}
103 103
104void rtl8225_write(struct ieee80211_hw *dev, u8 addr, u16 data) 104static void rtl8225_write(struct ieee80211_hw *dev, u8 addr, u16 data)
105{ 105{
106 struct rtl8187_priv *priv = dev->priv; 106 struct rtl8187_priv *priv = dev->priv;
107 107
@@ -111,7 +111,7 @@ void rtl8225_write(struct ieee80211_hw *dev, u8 addr, u16 data)
111 rtl8225_write_bitbang(dev, addr, data); 111 rtl8225_write_bitbang(dev, addr, data);
112} 112}
113 113
114u16 rtl8225_read(struct ieee80211_hw *dev, u8 addr) 114static u16 rtl8225_read(struct ieee80211_hw *dev, u8 addr)
115{ 115{
116 struct rtl8187_priv *priv = dev->priv; 116 struct rtl8187_priv *priv = dev->priv;
117 u16 reg80, reg82, reg84, out; 117 u16 reg80, reg82, reg84, out;
@@ -325,7 +325,7 @@ static void rtl8225_rf_set_tx_power(struct ieee80211_hw *dev, int channel)
325 msleep(1); 325 msleep(1);
326} 326}
327 327
328void rtl8225_rf_init(struct ieee80211_hw *dev) 328static void rtl8225_rf_init(struct ieee80211_hw *dev)
329{ 329{
330 struct rtl8187_priv *priv = dev->priv; 330 struct rtl8187_priv *priv = dev->priv;
331 int i; 331 int i;
@@ -567,7 +567,7 @@ static const u8 rtl8225z2_gain_bg[] = {
567 0x63, 0x15, 0xc5 /* -66dBm */ 567 0x63, 0x15, 0xc5 /* -66dBm */
568}; 568};
569 569
570void rtl8225z2_rf_init(struct ieee80211_hw *dev) 570static void rtl8225z2_rf_init(struct ieee80211_hw *dev)
571{ 571{
572 struct rtl8187_priv *priv = dev->priv; 572 struct rtl8187_priv *priv = dev->priv;
573 int i; 573 int i;
@@ -715,7 +715,7 @@ void rtl8225z2_rf_init(struct ieee80211_hw *dev)
715 rtl818x_iowrite32(priv, (__le32 *)0xFF94, 0x3dc00002); 715 rtl818x_iowrite32(priv, (__le32 *)0xFF94, 0x3dc00002);
716} 716}
717 717
718void rtl8225_rf_stop(struct ieee80211_hw *dev) 718static void rtl8225_rf_stop(struct ieee80211_hw *dev)
719{ 719{
720 u8 reg; 720 u8 reg;
721 struct rtl8187_priv *priv = dev->priv; 721 struct rtl8187_priv *priv = dev->priv;
@@ -731,15 +731,47 @@ void rtl8225_rf_stop(struct ieee80211_hw *dev)
731 rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_NORMAL); 731 rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_NORMAL);
732} 732}
733 733
734void rtl8225_rf_set_channel(struct ieee80211_hw *dev, int channel) 734static void rtl8225_rf_set_channel(struct ieee80211_hw *dev,
735 struct ieee80211_conf *conf)
735{ 736{
736 struct rtl8187_priv *priv = dev->priv; 737 struct rtl8187_priv *priv = dev->priv;
737 738
738 if (priv->rf_init == rtl8225_rf_init) 739 if (priv->rf->init == rtl8225_rf_init)
739 rtl8225_rf_set_tx_power(dev, channel); 740 rtl8225_rf_set_tx_power(dev, conf->channel);
740 else 741 else
741 rtl8225z2_rf_set_tx_power(dev, channel); 742 rtl8225z2_rf_set_tx_power(dev, conf->channel);
742 743
743 rtl8225_write(dev, 0x7, rtl8225_chan[channel - 1]); 744 rtl8225_write(dev, 0x7, rtl8225_chan[conf->channel - 1]);
744 msleep(10); 745 msleep(10);
745} 746}
747
748static const struct rtl818x_rf_ops rtl8225_ops = {
749 .name = "rtl8225",
750 .init = rtl8225_rf_init,
751 .stop = rtl8225_rf_stop,
752 .set_chan = rtl8225_rf_set_channel
753};
754
755static const struct rtl818x_rf_ops rtl8225z2_ops = {
756 .name = "rtl8225z2",
757 .init = rtl8225z2_rf_init,
758 .stop = rtl8225_rf_stop,
759 .set_chan = rtl8225_rf_set_channel
760};
761
762const struct rtl818x_rf_ops * rtl8187_detect_rf(struct ieee80211_hw *dev)
763{
764 u16 reg8, reg9;
765
766 rtl8225_write(dev, 0, 0x1B7);
767
768 reg8 = rtl8225_read(dev, 8);
769 reg9 = rtl8225_read(dev, 9);
770
771 rtl8225_write(dev, 0, 0x0B7);
772
773 if (reg8 != 0x588 || reg9 != 0x700)
774 return &rtl8225_ops;
775
776 return &rtl8225z2_ops;
777}