b43: enable radio 0x2057 rev 9 (AKA BCM43228) support
authorRafał Miłecki <zajec5@gmail.com>
Tue, 8 Jul 2014 13:11:10 +0000 (15:11 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 15 Jul 2014 19:51:41 +0000 (15:51 -0400)
Support for N-PHY rev 8 with 0x2057 rev 5 is almost ready, but we still
need to figure out how to handle rev 9 first.

Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/b43/main.c

index 8dd69a3ae7ac7988b269c37098e6b196d18efbdb..ad335307a3d455aaca5e61b2d45567b77e0bd6b2 100644 (file)
@@ -210,6 +210,9 @@ static struct ieee80211_channel b43_2ghz_chantable[] = {
        CHAN2G(13, 2472, 0),
        CHAN2G(14, 2484, 0),
 };
+
+/* No support for the last 3 channels (12, 13, 14) */
+#define b43_2ghz_chantable_limited_size                11
 #undef CHAN2G
 
 #define CHAN4G(_channel, _flags) {                             \
@@ -335,6 +338,14 @@ static struct ieee80211_supported_band b43_band_2GHz = {
        .n_bitrates     = b43_g_ratetable_size,
 };
 
+static struct ieee80211_supported_band b43_band_2ghz_limited = {
+       .band           = IEEE80211_BAND_2GHZ,
+       .channels       = b43_2ghz_chantable,
+       .n_channels     = b43_2ghz_chantable_limited_size,
+       .bitrates       = b43_g_ratetable,
+       .n_bitrates     = b43_g_ratetable_size,
+};
+
 static void b43_wireless_core_exit(struct b43_wldev *dev);
 static int b43_wireless_core_init(struct b43_wldev *dev);
 static struct b43_wldev * b43_wireless_core_stop(struct b43_wldev *dev);
@@ -4459,7 +4470,10 @@ static int b43_phy_versioning(struct b43_wldev *dev)
                        unsupported = 1;
                break;
        case B43_PHYTYPE_N:
-               if (radio_ver != 0x2055 && radio_ver != 0x2056)
+               if (radio_ver != 0x2055 && radio_ver != 0x2056 &&
+                   radio_ver != 0x2057)
+                       unsupported = 1;
+               if (radio_ver == 0x2057 && !(radio_rev == 9))
                        unsupported = 1;
                break;
        case B43_PHYTYPE_LP:
@@ -5095,9 +5109,15 @@ static int b43_setup_bands(struct b43_wldev *dev,
                           bool have_2ghz_phy, bool have_5ghz_phy)
 {
        struct ieee80211_hw *hw = dev->wl->hw;
+       struct b43_phy *phy = &dev->phy;
+       bool limited_2g;
+
+       /* We don't support all 2 GHz channels on some devices */
+       limited_2g = phy->radio_ver == 0x2057 && phy->radio_rev == 9;
 
        if (have_2ghz_phy)
-               hw->wiphy->bands[IEEE80211_BAND_2GHZ] = &b43_band_2GHz;
+               hw->wiphy->bands[IEEE80211_BAND_2GHZ] = limited_2g ?
+                       &b43_band_2ghz_limited : &b43_band_2GHz;
        if (dev->phy.type == B43_PHYTYPE_N) {
                if (have_5ghz_phy)
                        hw->wiphy->bands[IEEE80211_BAND_5GHZ] = &b43_band_5GHz_nphy;