/* * Initial AR9462 / (WB222) bluetooth coexistence settings, * just for experimentation. * * Return 0 for OK; errno for error. */ static int ath_btcoex_cfg_wb222(struct ath_softc *sc) { HAL_BT_COEX_INFO btinfo; HAL_BT_COEX_CONFIG btconfig; struct ath_hal *ah = sc->sc_ah; if (! ath_hal_btcoex_supported(ah)) return (EINVAL); bzero(&btinfo, sizeof(btinfo)); bzero(&btconfig, sizeof(btconfig)); device_printf(sc->sc_dev, "Enabling WB222 BTCOEX\n"); btinfo.bt_module = HAL_BT_MODULE_JANUS; /* XXX not used? */ btinfo.bt_coex_config = HAL_BT_COEX_CFG_MCI; /* * MCI uses a completely different interface to speak * to the bluetooth module - it's a command based * thing over a serial line, rather than * state pins to/from the bluetooth module. * * So, the GPIO configuration, polarity, etc * doesn't matter on MCI devices; it's just * completely ignored by the HAL. */ btinfo.bt_gpio_bt_active = 4; btinfo.bt_gpio_bt_priority = 8; btinfo.bt_gpio_wlan_active = 5; btinfo.bt_active_polarity = 1; /* XXX not used */ btinfo.bt_single_ant = 0; /* 2 antenna on WB222 */ btinfo.bt_isolation = 0; /* in dB, not used */ ath_hal_btcoex_set_info(ah, &btinfo); btconfig.bt_time_extend = 0; btconfig.bt_txstate_extend = 1; /* true */ btconfig.bt_txframe_extend = 1; /* true */ btconfig.bt_mode = HAL_BT_COEX_MODE_SLOTTED; btconfig.bt_quiet_collision = 1; /* true */ btconfig.bt_rxclear_polarity = 1; /* true */ btconfig.bt_priority_time = 2; btconfig.bt_first_slot_time = 5; btconfig.bt_hold_rxclear = 1; /* true */ ath_hal_btcoex_set_config(ah, &btconfig); /* * Enable antenna diversity. */ ath_hal_btcoex_set_parameter(ah, HAL_BT_COEX_ANTENNA_DIVERSITY, 1); return (0); }
/* * Initial AR9485 / (WB225) bluetooth coexistence settings, * just for experimentation. * * Return 0 for OK; errno for error. */ static int ath_btcoex_cfg_wb225(struct ath_softc *sc) { HAL_BT_COEX_INFO btinfo; HAL_BT_COEX_CONFIG btconfig; struct ath_hal *ah = sc->sc_ah; if (! ath_hal_btcoex_supported(ah)) return (EINVAL); bzero(&btinfo, sizeof(btinfo)); bzero(&btconfig, sizeof(btconfig)); device_printf(sc->sc_dev, "Enabling WB225 BTCOEX\n"); btinfo.bt_module = HAL_BT_MODULE_JANUS; /* XXX not used? */ btinfo.bt_coex_config = HAL_BT_COEX_CFG_3WIRE; /* * These are the three GPIO pins hooked up between the AR9485 and * the bluetooth module. */ btinfo.bt_gpio_bt_active = 4; btinfo.bt_gpio_bt_priority = 8; btinfo.bt_gpio_wlan_active = 5; btinfo.bt_active_polarity = 1; /* XXX not used */ btinfo.bt_single_ant = 1; /* 1 antenna on ar9285 ? */ btinfo.bt_isolation = 0; /* in dB, not used */ ath_hal_btcoex_set_info(ah, &btinfo); btconfig.bt_time_extend = 0; btconfig.bt_txstate_extend = 1; /* true */ btconfig.bt_txframe_extend = 1; /* true */ btconfig.bt_mode = HAL_BT_COEX_MODE_SLOTTED; btconfig.bt_quiet_collision = 1; /* true */ btconfig.bt_rxclear_polarity = 1; /* true */ btconfig.bt_priority_time = 2; btconfig.bt_first_slot_time = 5; btconfig.bt_hold_rxclear = 1; /* true */ ath_hal_btcoex_set_config(ah, &btconfig); /* * Enable antenna diversity. */ ath_hal_btcoex_set_parameter(ah, HAL_BT_COEX_ANTENNA_DIVERSITY, 1); return (0); }
/* * Attach btcoex to the given interface */ int ath_btcoex_attach(struct ath_softc *sc) { int ret; struct ath_hal *ah = sc->sc_ah; const char *profname; /* * No chipset bluetooth coexistence? Then do nothing. */ if (! ath_hal_btcoex_supported(ah)) return (0); /* * Look at the hints to determine which bluetooth * profile to configure. */ ret = resource_string_value(device_get_name(sc->sc_dev), device_get_unit(sc->sc_dev), "btcoex_profile", &profname); if (ret != 0) { /* nothing to do */ return (0); } if (strncmp(profname, "wb195", 5) == 0) { ret = ath_btcoex_cfg_wb195(sc); } else if (strncmp(profname, "wb222", 5) == 0) { ret = ath_btcoex_cfg_wb222(sc); } else if (strncmp(profname, "wb225", 5) == 0) { ret = ath_btcoex_cfg_wb225(sc); } else { return (0); } /* * Propagate up failure from the actual attach phase. */ if (ret != 0) return (ret); return (0); }