[PATCH] zd1211rw: Make CCK gain patching conditional on RF type
authorDaniel Drake <dsd@gentoo.org>
Thu, 24 May 2007 00:07:15 +0000 (01:07 +0100)
committerJeff Garzik <jeff@garzik.org>
Mon, 9 Jul 2007 02:16:37 +0000 (22:16 -0400)
The vendor driver code suggests that CR47 patching happens on every channel
change for every RF (depending on bit 8 in POD).

Due to a bug in their driver (upper bits of RF_Mode get zeroed out, then
are examined for 1s when setting some other flags), this isn't actually
what happens, and their generic CCK patching routine never takes effect.

Some of their RF configurations do include explicit (duplicated) code
for CR47 patching though. This patch makes zd1211rw match that
behaviour.

Signed-off-by: Daniel Drake <dsd@gentoo.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/zd1211rw/zd_chip.c
drivers/net/wireless/zd1211rw/zd_rf.h
drivers/net/wireless/zd1211rw/zd_rf_al2230.c
drivers/net/wireless/zd1211rw/zd_rf_al7230b.c

index 4a2ceb93aaad3e369755aa6ee34915abedf68d47..5b624bfc01a6037b7f76c04eba638b666038987f 100644 (file)
@@ -1286,7 +1286,7 @@ static int patch_cck_gain(struct zd_chip *chip)
        int r;
        u32 value;
 
-       if (!chip->patch_cck_gain)
+       if (!chip->patch_cck_gain || !zd_rf_should_patch_cck_gain(&chip->rf))
                return 0;
 
        ZD_ASSERT(mutex_is_locked(&chip->mutex));
index 6dced2ae5a11ae16876a73fc514a8218b3b5e7f3..c6dfd8227f6e78b5bc76e118668a2adefd389050 100644 (file)
@@ -52,6 +52,12 @@ struct zd_rf {
         * defaults to 1 (yes) */
        u8 update_channel_int:1;
 
+       /* whether CR47 should be patched from the EEPROM, if the appropriate
+        * flag is set in the POD. The vendor driver suggests that this should
+        * be done for all RF's, but a bug in their code prevents but their
+        * HW_OverWritePhyRegFromE2P() routine from ever taking effect. */
+       u8 patch_cck_gain:1;
+
        /* private RF driver data */
        void *priv;
 
@@ -84,6 +90,14 @@ static inline int zd_rf_should_update_pwr_int(struct zd_rf *rf)
        return rf->update_channel_int;
 }
 
+static inline int zd_rf_should_patch_cck_gain(struct zd_rf *rf)
+{
+       return rf->patch_cck_gain;
+}
+
+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);
index 511392acfedf3f179359c840fb01b87e114f3124..e7a4ecf7b6e21483d7b4916f6c7f1c3983cd75a5 100644 (file)
@@ -432,5 +432,6 @@ int zd_rf_init_al2230(struct zd_rf *rf)
                rf->switch_radio_on = zd1211_al2230_switch_radio_on;
        }
        rf->patch_6m_band_edge = zd_rf_generic_patch_6m;
+       rf->patch_cck_gain = 1;
        return 0;
 }
index 5e5e9ddc6a7467501fe6bc891df6b3980dbb2a8b..f4e8b6ada854c54644b4ccfea7061a6ab1162c26 100644 (file)
@@ -483,6 +483,7 @@ int zd_rf_init_al7230b(struct zd_rf *rf)
                rf->switch_radio_on = zd1211_al7230b_switch_radio_on;
                rf->set_channel = zd1211_al7230b_set_channel;
                rf->patch_6m_band_edge = zd_rf_generic_patch_6m;
+               rf->patch_cck_gain = 1;
        }
 
        rf->switch_radio_off = al7230b_switch_radio_off;