struct antsel_info *brcms_c_antsel_attach(struct brcms_c_info *wlc) { struct antsel_info *asi; struct si_pub *sih = wlc->hw->sih; asi = kzalloc(sizeof(struct antsel_info), GFP_ATOMIC); if (!asi) return NULL; asi->wlc = wlc; asi->pub = wlc->pub; asi->antsel_type = ANTSEL_NA; asi->antsel_avail = false; asi->antsel_antswitch = (u8) getintvar(sih, BRCMS_SROM_ANTSWITCH); if ((asi->pub->sromrev >= 4) && (asi->antsel_antswitch != 0)) { switch (asi->antsel_antswitch) { case ANTSWITCH_TYPE_1: case ANTSWITCH_TYPE_2: case ANTSWITCH_TYPE_3: /* 4321/2 board with 2x3 switch logic */ asi->antsel_type = ANTSEL_2x3; /* Antenna selection availability */ if (((u16) getintvar(sih, BRCMS_SROM_AA2G) == 7) || ((u16) getintvar(sih, BRCMS_SROM_AA5G) == 7)) { asi->antsel_avail = true; } else if ( (u16) getintvar(sih, BRCMS_SROM_AA2G) == 3 || (u16) getintvar(sih, BRCMS_SROM_AA5G) == 3) { asi->antsel_avail = false; } else { asi->antsel_avail = false; wiphy_err(wlc->wiphy, "antsel_attach: 2o3 " "board cfg invalid\n"); } break; default: break; } } else if ((asi->pub->sromrev == 4) && ((u16) getintvar(sih, BRCMS_SROM_AA2G) == 7) && ((u16) getintvar(sih, BRCMS_SROM_AA5G) == 0)) { /* hack to match old 4321CB2 cards with 2of3 antenna switch */ asi->antsel_type = ANTSEL_2x3; asi->antsel_avail = true; } else if (asi->pub->boardflags2 & BFL2_2X4_DIV) { asi->antsel_type = ANTSEL_2x4; asi->antsel_avail = true; } /* Set the antenna selection type for the low driver */ brcms_b_antsel_type_set(wlc->hw, asi->antsel_type); /* Init (auto/manual) antenna selection */ brcms_c_antsel_init_cfg(asi, &asi->antcfg_11n, true); brcms_c_antsel_init_cfg(asi, &asi->antcfg_cur, true); return asi; }
struct antsel_info *brcms_c_antsel_attach(struct brcms_c_info *wlc) { struct antsel_info *asi; struct ssb_sprom *sprom = &wlc->hw->d11core->bus->sprom; asi = kzalloc(sizeof(struct antsel_info), GFP_ATOMIC); if (!asi) return NULL; asi->wlc = wlc; asi->pub = wlc->pub; asi->antsel_type = ANTSEL_NA; asi->antsel_avail = false; asi->antsel_antswitch = sprom->antswitch; if ((asi->pub->sromrev >= 4) && (asi->antsel_antswitch != 0)) { switch (asi->antsel_antswitch) { case ANTSWITCH_TYPE_1: case ANTSWITCH_TYPE_2: case ANTSWITCH_TYPE_3: /* 4321/2 board with 2x3 switch logic */ asi->antsel_type = ANTSEL_2x3; /* Antenna selection availability */ if ((sprom->ant_available_bg == 7) || (sprom->ant_available_a == 7)) { asi->antsel_avail = true; } else if ( sprom->ant_available_bg == 3 || sprom->ant_available_a == 3) { asi->antsel_avail = false; } else { asi->antsel_avail = false; brcms_err(wlc->hw->d11core, "antsel_attach: 2o3 " "board cfg invalid\n"); } break; default: break; } } else if ((asi->pub->sromrev == 4) && (sprom->ant_available_bg == 7) && (sprom->ant_available_a == 0)) { /* hack to match old 4321CB2 cards with 2of3 antenna switch */ asi->antsel_type = ANTSEL_2x3; asi->antsel_avail = true; } else if (asi->pub->boardflags2 & BFL2_2X4_DIV) { asi->antsel_type = ANTSEL_2x4; asi->antsel_avail = true; } /* Set the antenna selection type for the low driver */ brcms_b_antsel_type_set(wlc->hw, asi->antsel_type); /* Init (auto/manual) antenna selection */ brcms_c_antsel_init_cfg(asi, &asi->antcfg_11n, true); brcms_c_antsel_init_cfg(asi, &asi->antcfg_cur, true); return asi; }