iPXE
Defines | Functions | Variables
rtl8180_max2820.c File Reference
#include <unistd.h>
#include <ipxe/pci.h>
#include <ipxe/net80211.h>
#include "rtl818x.h"

Go to the source code of this file.

Defines

#define MAXIM_ANTENNA   0xb3

Functions

 FILE_LICENCE (GPL2_ONLY)
static void write_max2820 (struct net80211_device *dev, u8 addr, u32 data)
static void max2820_write_phy_antenna (struct net80211_device *dev, short chan)
static void max2820_rf_set_channel (struct net80211_device *dev, struct net80211_channel *channelp)
static void max2820_rf_stop (struct net80211_device *dev)
static void max2820_rf_init (struct net80211_device *dev)

Variables

static const u32 max2820_chan []
struct rtl818x_rf_ops
max2820_rf_ops 
__rtl818x_rf_driver

Define Documentation

#define MAXIM_ANTENNA   0xb3

Definition at line 31 of file rtl8180_max2820.c.

Referenced by max2820_write_phy_antenna().


Function Documentation

FILE_LICENCE ( GPL2_ONLY  )
static void write_max2820 ( struct net80211_device dev,
u8  addr,
u32  data 
) [static]

Definition at line 50 of file rtl8180_max2820.c.

References addr, rtl818x_priv::map, mdelay(), priv, net80211_device::priv, rtl818x_csr::RFPinsEnable, rtl818x_csr::RFPinsOutput, and rtl818x_iowrite16().

Referenced by max2820_rf_init(), max2820_rf_set_channel(), and max2820_rf_stop().

{
        struct rtl818x_priv *priv = dev->priv;
        u32 phy_config;

        phy_config = 0x90 + (data & 0xf);
        phy_config <<= 16;
        phy_config += addr;
        phy_config <<= 8;
        phy_config += (data >> 4) & 0xff;

        /* This was originally a 32-bit write to a typecast
           RFPinsOutput, but gcc complained about aliasing rules. -JBO */
        rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, phy_config & 0xffff);
        rtl818x_iowrite16(priv, &priv->map->RFPinsEnable, phy_config >> 16);

        mdelay(1);
}
static void max2820_write_phy_antenna ( struct net80211_device dev,
short  chan 
) [static]
static void max2820_rf_set_channel ( struct net80211_device dev,
struct net80211_channel channelp 
) [static]

Definition at line 83 of file rtl8180_max2820.c.

References channel, net80211_channel::channel_nr, max2820_chan, max2820_write_phy_antenna(), priv, net80211_device::priv, rtl818x_write_phy(), rtl818x_priv::txpower, and write_max2820().

Referenced by max2820_rf_init().

{
        struct rtl818x_priv *priv = dev->priv;
        int channel = channelp->channel_nr;
        unsigned int chan_idx = channel - 1;
        u32 txpw = priv->txpower[chan_idx] & 0xFF;
        u32 chan = max2820_chan[chan_idx];

        /* While philips SA2400 drive the PA bias from
         * sa2400, for MAXIM we do this directly from BB */
        rtl818x_write_phy(dev, 3, txpw);

        max2820_write_phy_antenna(dev, channel);
        write_max2820(dev, 3, chan);
}
static void max2820_rf_stop ( struct net80211_device dev) [static]

Definition at line 100 of file rtl8180_max2820.c.

References rtl818x_write_phy(), and write_max2820().

{
        rtl818x_write_phy(dev, 3, 0x8);
        write_max2820(dev, 1, 0);
}
static void max2820_rf_init ( struct net80211_device dev) [static]

Definition at line 107 of file rtl8180_max2820.c.

References rtl818x_csr::CONFIG2, rtl818x_priv::map, max2820_rf_set_channel(), max2820_write_phy_antenna(), NULL, priv, net80211_device::priv, RTL818X_CONFIG2_ANTENNA_DIV, rtl818x_ioread8(), rtl818x_write_phy(), and write_max2820().

{
        struct rtl818x_priv *priv = dev->priv;

        /* MAXIM from netbsd driver */
        write_max2820(dev, 0, 0x007); /* test mode as indicated in datasheet */
        write_max2820(dev, 1, 0x01e); /* enable register */
        write_max2820(dev, 2, 0x001); /* synt register */

        max2820_rf_set_channel(dev, NULL);

        write_max2820(dev, 4, 0x313); /* rx register */

        /* PA is driven directly by the BB, we keep the MAXIM bias
         * at the highest value in case that setting it to lower
         * values may introduce some further attenuation somewhere..
         */
        write_max2820(dev, 5, 0x00f);

        /* baseband configuration */
        rtl818x_write_phy(dev, 0, 0x88); /* sys1       */
        rtl818x_write_phy(dev, 3, 0x08); /* txagc      */
        rtl818x_write_phy(dev, 4, 0xf8); /* lnadet     */
        rtl818x_write_phy(dev, 5, 0x90); /* ifagcinit  */
        rtl818x_write_phy(dev, 6, 0x1a); /* ifagclimit */
        rtl818x_write_phy(dev, 7, 0x64); /* ifagcdet   */

        max2820_write_phy_antenna(dev, 1);

        rtl818x_write_phy(dev, 0x11, 0x88); /* trl */

        if (rtl818x_ioread8(priv, &priv->map->CONFIG2) &
            RTL818X_CONFIG2_ANTENNA_DIV)
                rtl818x_write_phy(dev, 0x12, 0xc7);
        else
                rtl818x_write_phy(dev, 0x12, 0x47);

        rtl818x_write_phy(dev, 0x13, 0x9b);

        rtl818x_write_phy(dev, 0x19, 0x0);  /* CHESTLIM */
        rtl818x_write_phy(dev, 0x1a, 0x9f); /* CHSQLIM  */

        max2820_rf_set_channel(dev, NULL);
}

Variable Documentation

const u32 max2820_chan[] [static]
Initial value:
 {
        12, 
        17,
        22,
        27,
        32,
        37,
        42,
        47,
        52,
        57,
        62,
        67,
        72,
        84, 
}

Definition at line 33 of file rtl8180_max2820.c.

Referenced by max2820_rf_set_channel().

struct rtl818x_rf_ops max2820_rf_ops __rtl818x_rf_driver
Initial value:
 {
        .name           = "Maxim max2820",
        .id             = 4,
        .init           = max2820_rf_init,
        .stop           = max2820_rf_stop,
        .set_chan       = max2820_rf_set_channel
}

Definition at line 152 of file rtl8180_max2820.c.