static int wl1251_op_add_interface(struct ieee80211_hw *hw, struct ieee80211_if_init_conf *conf) { struct wl1251 *wl = hw->priv; int ret = 0; wl1251_debug(DEBUG_MAC80211, "mac80211 add interface type %d mac %pM", conf->type, conf->mac_addr); mutex_lock(&wl->mutex); switch (conf->type) { case NL80211_IFTYPE_STATION: wl->bss_type = BSS_TYPE_STA_BSS; break; case NL80211_IFTYPE_ADHOC: wl->bss_type = BSS_TYPE_IBSS; break; default: ret = -EOPNOTSUPP; goto out; } if (memcmp(wl->mac_addr, conf->mac_addr, ETH_ALEN)) { memcpy(wl->mac_addr, conf->mac_addr, ETH_ALEN); SET_IEEE80211_PERM_ADDR(wl->hw, wl->mac_addr); ret = wl1251_acx_station_id(wl); if (ret < 0) goto out; } out: mutex_unlock(&wl->mutex); return ret; }
static int wl1251_op_start(struct ieee80211_hw *hw) { struct wl1251 *wl = hw->priv; struct wiphy *wiphy = hw->wiphy; int ret = 0; wl1251_debug(DEBUG_MAC80211, "mac80211 start"); mutex_lock(&wl->mutex); if (wl->state != WL1251_STATE_OFF) { wl1251_error("cannot start because not in off state: %d", wl->state); ret = -EBUSY; goto out; } ret = wl1251_chip_wakeup(wl); if (ret < 0) goto out; ret = wl1251_boot(wl); if (ret < 0) goto out; ret = wl1251_hw_init(wl); if (ret < 0) goto out; ret = wl1251_acx_station_id(wl); if (ret < 0) goto out; wl->state = WL1251_STATE_ON; wl1251_info("firmware booted (%s)", wl->fw_ver); /* update hw/fw version info in wiphy struct */ wiphy->hw_version = wl->chip_id; strncpy(wiphy->fw_version, wl->fw_ver, sizeof(wiphy->fw_version)); out: if (ret < 0) wl1251_power_off(wl); mutex_unlock(&wl->mutex); return ret; }
static int wl1251_op_add_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif) { struct wl1251 *wl = hw->priv; int ret = 0; vif->driver_flags |= IEEE80211_VIF_BEACON_FILTER | IEEE80211_VIF_SUPPORTS_UAPSD | IEEE80211_VIF_SUPPORTS_CQM_RSSI; wl1251_debug(DEBUG_MAC80211, "mac80211 add interface type %d mac %pM", vif->type, vif->addr); mutex_lock(&wl->mutex); if (wl->vif) { ret = -EBUSY; goto out; } wl->vif = vif; switch (vif->type) { case NL80211_IFTYPE_STATION: wl->bss_type = BSS_TYPE_STA_BSS; break; case NL80211_IFTYPE_ADHOC: wl->bss_type = BSS_TYPE_IBSS; break; default: ret = -EOPNOTSUPP; goto out; } if (!ether_addr_equal_unaligned(wl->mac_addr, vif->addr)) { memcpy(wl->mac_addr, vif->addr, ETH_ALEN); SET_IEEE80211_PERM_ADDR(wl->hw, wl->mac_addr); ret = wl1251_acx_station_id(wl); if (ret < 0) goto out; } out: mutex_unlock(&wl->mutex); return ret; }