* 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;
 
 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);
 
                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);
+}
+
 
        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);
 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);
 
                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;
 }
 
        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;
 }