drivers/net/wireless/realtek/rtl818x/rtl8180/rtl8225se.c

Source file repositories/reference/linux-study-clean/drivers/net/wireless/realtek/rtl818x/rtl8180/rtl8225se.c

File Facts

System
Linux kernel
Corpus path
drivers/net/wireless/realtek/rtl818x/rtl8180/rtl8225se.c
Extension
.c
Size
13847 bytes
Lines
431
Domain
Driver Families
Bucket
drivers/net
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

if (write) {
			if (len == 16) {
				rtl818x_iowrite16(priv, SW_3W_DB0,
				  *(u16 *)data);
			} else if (len == 64) {
				rtl818x_iowrite32(priv, SW_3W_DB0_4,
				  *((u32 *)data));
				rtl818x_iowrite32(priv, SW_3W_DB1_4,
				  *((u32 *)(data + 4)));
			} else
				wiphy_err(dev->wiphy, PFX
					"Unimplemented length\n");
		} else {
			rtl818x_iowrite16(priv, SW_3W_DB0, *(u16 *)data);
		}
		if (write)
			tmp = 2;
		else
			tmp = 1;
		rtl818x_iowrite8(priv, SW_3W_CMD1, tmp);
		for (i = 0; i < 5; i++) {
			tmp = rtl818x_ioread8(priv, SW_3W_CMD1);
			if (!(tmp & 0x3))
				break;
			udelay(10);
		}
		rtl818x_iowrite8(priv, SW_3W_CMD1, 0);
		if (!write) {
			*((u16 *)data) = rtl818x_ioread16(priv, SI_DATA_REG);
			*((u16 *)data) &= 0x0FFF;
		}
	} while (0);
}

static u32 rtl8187se_rf_readreg(struct ieee80211_hw *dev, u8 addr)
{
	u32 dataread = addr & 0x0F;
	rtl8187se_three_wire_io(dev, (u8 *)&dataread, 16, 0);
	return dataread;
}

static void rtl8187se_rf_writereg(struct ieee80211_hw *dev, u8 addr, u32 data)
{
	u32 outdata = (data << 4) | (u32)(addr & 0x0F);
	rtl8187se_three_wire_io(dev, (u8 *)&outdata, 16, 1);
}


static void rtl8225se_write_zebra_agc(struct ieee80211_hw *dev)
{
	int i;

	for (i = 0; i < 128; i++) {
		rtl8225se_write_phy_ofdm(dev, 0xF, ZEBRA_AGC[i]);
		rtl8225se_write_phy_ofdm(dev, 0xE, i+0x80);
		rtl8225se_write_phy_ofdm(dev, 0xE, 0);
	}
}

static void rtl8187se_write_ofdm_config(struct ieee80211_hw *dev)
{
	/* write OFDM_CONFIG table */
	int i;

	for (i = 0; i < 60; i++)
		rtl8225se_write_phy_ofdm(dev, i, OFDM_CONFIG[i]);

}

static void rtl8225sez2_rf_set_tx_power(struct ieee80211_hw *dev, int channel)
{
	struct rtl8180_priv *priv = dev->priv;
	u8 cck_power, ofdm_power;

	cck_power = priv->channels[channel - 1].hw_value & 0xFF;
	if (cck_power > 35)
		cck_power = 35;
	rtl818x_iowrite8(priv, &priv->map->TX_GAIN_CCK,
			 cck_ofdm_gain_settings[cck_power]);

	usleep_range(1000, 5000);
	ofdm_power = priv->channels[channel - 1].hw_value >> 8;
	if (ofdm_power > 35)
		ofdm_power = 35;

	rtl818x_iowrite8(priv, &priv->map->TX_GAIN_OFDM,
			 cck_ofdm_gain_settings[ofdm_power]);
	if (ofdm_power < 12) {
		rtl8225se_write_phy_ofdm(dev, 7, 0x5C);
		rtl8225se_write_phy_ofdm(dev, 9, 0x5C);

Annotation

Implementation Notes