Skip to content

Commit

Permalink
[PATCH] zd1211rw: rework band edge patching
Browse files Browse the repository at this point in the history
This change allows RF drivers to provide their own 6M band edge patching
implementation, while providing a generic implementation shared by most
currently supported RF's.

The upcoming ZD1211B/AL7230B code will use this to define its own
patching function, which is different from the other RF configurations.

Signed-off-by: Daniel Drake <dsd@gentoo.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Daniel Drake authored and Jeff Garzik committed Apr 28, 2007
1 parent dc536a7 commit 72018b2
Show file tree
Hide file tree
Showing 6 changed files with 33 additions and 11 deletions.
16 changes: 12 additions & 4 deletions drivers/net/wireless/zd1211rw/zd_chip.c
Original file line number Diff line number Diff line change
Expand Up @@ -615,16 +615,24 @@ static int patch_cr157(struct zd_chip *chip)
* Vendor driver says: for FCC regulation, enabled per HWFeature 6M band edge
* bit (for AL2230, AL2230S)
*/
static int patch_6m_band_edge(struct zd_chip *chip, int channel)
static int patch_6m_band_edge(struct zd_chip *chip, u8 channel)
{
ZD_ASSERT(mutex_is_locked(&chip->mutex));
if (!chip->patch_6m_band_edge)
return 0;

return zd_rf_patch_6m_band_edge(&chip->rf, channel);
}

/* Generic implementation of 6M band edge patching, used by most RFs via
* zd_rf_generic_patch_6m() */
int zd_chip_generic_patch_6m_band(struct zd_chip *chip, int channel)
{
struct zd_ioreq16 ioreqs[] = {
{ CR128, 0x14 }, { CR129, 0x12 }, { CR130, 0x10 },
{ CR47, 0x1e },
};

if (!chip->patch_6m_band_edge || !chip->rf.patch_6m_band_edge)
return 0;

/* FIXME: Channel 11 is not the edge for all regulatory domains. */
if (channel == 1 || channel == 11)
ioreqs[0].value = 0x12;
Expand Down
1 change: 1 addition & 0 deletions drivers/net/wireless/zd1211rw/zd_chip.h
Original file line number Diff line number Diff line change
Expand Up @@ -833,6 +833,7 @@ int zd_chip_enable_rx(struct zd_chip *chip);
void zd_chip_disable_rx(struct zd_chip *chip);
int zd_chip_enable_hwint(struct zd_chip *chip);
int zd_chip_disable_hwint(struct zd_chip *chip);
int zd_chip_generic_patch_6m_band(struct zd_chip *chip, int channel);

int zd_chip_set_rts_cts_rate_locked(struct zd_chip *chip,
u8 rts_rate, int preamble);
Expand Down
14 changes: 14 additions & 0 deletions drivers/net/wireless/zd1211rw/zd_rf.c
Original file line number Diff line number Diff line change
Expand Up @@ -154,3 +154,17 @@ int zd_switch_radio_off(struct zd_rf *rf)
r = t;
return r;
}

int zd_rf_patch_6m_band_edge(struct zd_rf *rf, u8 channel)
{
if (!rf->patch_6m_band_edge)
return 0;

return rf->patch_6m_band_edge(rf, channel);
}

int zd_rf_generic_patch_6m(struct zd_rf *rf, u8 channel)
{
return zd_chip_generic_patch_6m_band(zd_rf_to_chip(rf), channel);
}

9 changes: 4 additions & 5 deletions drivers/net/wireless/zd1211rw/zd_rf.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,17 +47,13 @@ struct zd_rf {
u8 type;

u8 channel;
/*
* Whether this RF should patch the 6M band edge
* (assuming E2P_POD agrees)
*/
u8 patch_6m_band_edge:1;

/* RF-specific functions */
int (*init_hw)(struct zd_rf *rf);
int (*set_channel)(struct zd_rf *rf, u8 channel);
int (*switch_radio_on)(struct zd_rf *rf);
int (*switch_radio_off)(struct zd_rf *rf);
int (*patch_6m_band_edge)(struct zd_rf *rf, u8 channel);
};

const char *zd_rf_name(u8 type);
Expand All @@ -72,6 +68,9 @@ int zd_rf_set_channel(struct zd_rf *rf, u8 channel);
int zd_switch_radio_on(struct zd_rf *rf);
int zd_switch_radio_off(struct zd_rf *rf);

int zd_rf_patch_6m_band_edge(struct zd_rf *rf, u8 channel);
int zd_rf_generic_patch_6m(struct zd_rf *rf, u8 channel);

/* Functions for individual RF chips */

int zd_rf_init_rf2959(struct zd_rf *rf);
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/wireless/zd1211rw/zd_rf_al2230.c
Original file line number Diff line number Diff line change
Expand Up @@ -431,6 +431,6 @@ int zd_rf_init_al2230(struct zd_rf *rf)
rf->set_channel = zd1211_al2230_set_channel;
rf->switch_radio_on = zd1211_al2230_switch_radio_on;
}
rf->patch_6m_band_edge = 1;
rf->patch_6m_band_edge = zd_rf_generic_patch_6m;
return 0;
}
2 changes: 1 addition & 1 deletion drivers/net/wireless/zd1211rw/zd_rf_al7230b.c
Original file line number Diff line number Diff line change
Expand Up @@ -269,6 +269,6 @@ int zd_rf_init_al7230b(struct zd_rf *rf)
rf->set_channel = al7230b_set_channel;
rf->switch_radio_on = al7230b_switch_radio_on;
rf->switch_radio_off = al7230b_switch_radio_off;
rf->patch_6m_band_edge = 1;
rf->patch_6m_band_edge = zd_rf_generic_patch_6m;
return 0;
}

0 comments on commit 72018b2

Please sign in to comment.