u8 r3;
        u8 r4;
        u8 r77;
+       u8 temp;
 
        rt73usb_bbp_read(rt2x00dev, 3, &r3);
        rt73usb_bbp_read(rt2x00dev, 4, &r4);
 
        rt2x00_set_field8(&r3, BBP_R3_SMART_MODE, 0);
 
-       /*
-        * Configure the TX antenna.
-        */
-       switch (ant->tx) {
-       case ANTENNA_A:
-               rt2x00_set_field8(&r77, BBP_R77_TX_ANTENNA, 0);
-               break;
-       case ANTENNA_SW_DIVERSITY:
-       case ANTENNA_HW_DIVERSITY:
-               /*
-                * NOTE: We should never come here because rt2x00lib is
-                * supposed to catch this and send us the correct antenna
-                * explicitely. However we are nog going to bug about this.
-                * Instead, just default to antenna B.
-                */
-       case ANTENNA_B:
-               rt2x00_set_field8(&r77, BBP_R77_TX_ANTENNA, 3);
-               break;
-       }
-
        /*
         * Configure the RX antenna.
         */
        switch (ant->rx) {
        case ANTENNA_HW_DIVERSITY:
-               rt2x00_set_field8(&r4, BBP_R4_RX_ANTENNA, 2);
-               rt2x00_set_field8(&r4, BBP_R4_RX_FRAME_END,
-                                 (rt2x00dev->curr_hwmode != HWMODE_A));
+               rt2x00_set_field8(&r4, BBP_R4_RX_ANTENNA_CONTROL, 2);
+               temp = !test_bit(CONFIG_FRAME_TYPE, &rt2x00dev->flags)
+                      && (rt2x00dev->curr_hwmode != HWMODE_A);
+               rt2x00_set_field8(&r4, BBP_R4_RX_FRAME_END, temp);
                break;
        case ANTENNA_A:
-               rt2x00_set_field8(&r4, BBP_R4_RX_ANTENNA, 1);
+               rt2x00_set_field8(&r4, BBP_R4_RX_ANTENNA_CONTROL, 1);
                rt2x00_set_field8(&r4, BBP_R4_RX_FRAME_END, 0);
+               if (rt2x00dev->curr_hwmode == HWMODE_A)
+                       rt2x00_set_field8(&r77, BBP_R77_RX_ANTENNA, 0);
+               else
+                       rt2x00_set_field8(&r77, BBP_R77_RX_ANTENNA, 3);
                break;
        case ANTENNA_SW_DIVERSITY:
                /*
                 * Instead, just default to antenna B.
                 */
        case ANTENNA_B:
-               rt2x00_set_field8(&r4, BBP_R4_RX_ANTENNA, 1);
+               rt2x00_set_field8(&r4, BBP_R4_RX_ANTENNA_CONTROL, 1);
                rt2x00_set_field8(&r4, BBP_R4_RX_FRAME_END, 0);
+               if (rt2x00dev->curr_hwmode == HWMODE_A)
+                       rt2x00_set_field8(&r77, BBP_R77_RX_ANTENNA, 3);
+               else
+                       rt2x00_set_field8(&r77, BBP_R77_RX_ANTENNA, 0);
                break;
        }
 
        rt2x00_set_field8(&r4, BBP_R4_RX_FRAME_END,
                          !test_bit(CONFIG_FRAME_TYPE, &rt2x00dev->flags));
 
-       /*
-        * Configure the TX antenna.
-        */
-       switch (ant->tx) {
-       case ANTENNA_A:
-               rt2x00_set_field8(&r77, BBP_R77_TX_ANTENNA, 0);
-               break;
-       case ANTENNA_SW_DIVERSITY:
-       case ANTENNA_HW_DIVERSITY:
-               /*
-                * NOTE: We should never come here because rt2x00lib is
-                * supposed to catch this and send us the correct antenna
-                * explicitely. However we are nog going to bug about this.
-                * Instead, just default to antenna B.
-                */
-       case ANTENNA_B:
-               rt2x00_set_field8(&r77, BBP_R77_TX_ANTENNA, 3);
-               break;
-       }
-
        /*
         * Configure the RX antenna.
         */
        switch (ant->rx) {
        case ANTENNA_HW_DIVERSITY:
-               rt2x00_set_field8(&r4, BBP_R4_RX_ANTENNA, 2);
+               rt2x00_set_field8(&r4, BBP_R4_RX_ANTENNA_CONTROL, 2);
                break;
        case ANTENNA_A:
-               rt2x00_set_field8(&r4, BBP_R4_RX_ANTENNA, 1);
+               rt2x00_set_field8(&r77, BBP_R77_RX_ANTENNA, 3);
+               rt2x00_set_field8(&r4, BBP_R4_RX_ANTENNA_CONTROL, 1);
                break;
        case ANTENNA_SW_DIVERSITY:
                /*
                 * Instead, just default to antenna B.
                 */
        case ANTENNA_B:
-               rt2x00_set_field8(&r4, BBP_R4_RX_ANTENNA, 1);
+               rt2x00_set_field8(&r77, BBP_R77_RX_ANTENNA, 0);
+               rt2x00_set_field8(&r4, BBP_R4_RX_ANTENNA_CONTROL, 1);
                break;
        }
 
        unsigned int i;
        u32 reg;
 
-       rt73usb_register_read(rt2x00dev, PHY_CSR0, ®);
-
        if (rt2x00dev->curr_hwmode == HWMODE_A) {
                sel = antenna_sel_a;
                lna = test_bit(CONFIG_EXTERNAL_LNA_A, &rt2x00dev->flags);
                lna = test_bit(CONFIG_EXTERNAL_LNA_BG, &rt2x00dev->flags);
        }
 
+       for (i = 0; i < ARRAY_SIZE(antenna_sel_a); i++)
+               rt73usb_bbp_write(rt2x00dev, sel[i].word, sel[i].value[lna]);
+
+       rt73usb_register_read(rt2x00dev, PHY_CSR0, ®);
+
        rt2x00_set_field32(®, PHY_CSR0_PA_PE_BG,
                           (rt2x00dev->curr_hwmode == HWMODE_B ||
                            rt2x00dev->curr_hwmode == HWMODE_G));
        rt2x00_set_field32(®, PHY_CSR0_PA_PE_A,
                           (rt2x00dev->curr_hwmode == HWMODE_A));
 
-       for (i = 0; i < ARRAY_SIZE(antenna_sel_a); i++)
-               rt73usb_bbp_write(rt2x00dev, sel[i].word, sel[i].value[lna]);
-
        rt73usb_register_write(rt2x00dev, PHY_CSR0, reg);
 
        if (rt2x00_rf(&rt2x00dev->chip, RF5226) ||