return booted;
 }
 
+static bool wl12xx_dev_role_started(struct wl12xx_vif *wlvif)
+{
+       return wlvif->dev_hlid != WL12XX_INVALID_LINK_ID;
+}
+
 static int wl1271_op_add_interface(struct ieee80211_hw *hw,
                                   struct ieee80211_vif *vif)
 {
        wlvif->rate_set = wlvif->basic_rate_set;
 }
 
-static bool wl12xx_is_roc(struct wl1271 *wl)
-{
-       u8 role_id;
-
-       role_id = find_first_bit(wl->roc_map, WL12XX_MAX_ROLES);
-       if (role_id >= WL12XX_MAX_ROLES)
-               return false;
-
-       return true;
-}
-
 static int wl1271_sta_handle_idle(struct wl1271 *wl, struct wl12xx_vif *wlvif,
                                  bool idle)
 {
 
        if (idle) {
                /* no need to croc if we weren't busy (e.g. during boot) */
-               if (wl12xx_is_roc(wl)) {
+               if (wl12xx_dev_role_started(wlvif)) {
                        ret = wl12xx_stop_dev(wl, wlvif);
                        if (ret < 0)
                                goto out;
 
                        if (test_bit(WLVIF_FLAG_STA_ASSOCIATED,
                                     &wlvif->flags)) {
-                               if (wl12xx_is_roc(wl)) {
+                               if (wl12xx_dev_role_started(wlvif)) {
                                        /* roaming */
                                        ret = wl12xx_croc(wl,
                                                          wlvif->dev_role_id);
                                 * not idle. otherwise, CROC will be called
                                 * anyway.
                                 */
-                               if (wl12xx_is_roc(wl) &&
+                               if (wl12xx_dev_role_started(wlvif) &&
                                    !(conf->flags & IEEE80211_CONF_IDLE)) {
                                        ret = wl12xx_stop_dev(wl, wlvif);
                                        if (ret < 0)
        if (ret < 0)
                goto out;
 
+       if (test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags) &&
+           test_bit(wlvif->role_id, wl->roc_map)) {
+               /* don't allow scanning right now */
+               ret = -EBUSY;
+               goto out_sleep;
+       }
+
        /* cancel ROC before scanning */
-       if (wl12xx_is_roc(wl)) {
-               if (test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags)) {
-                       /* don't allow scanning right now */
-                       ret = -EBUSY;
-                       goto out_sleep;
-               }
+       if (wl12xx_dev_role_started(wlvif))
                wl12xx_stop_dev(wl, wlvif);
-       }
 
        ret = wl1271_scan(hw->priv, vif, ssid, len, req);
 out_sleep:
                }
                /*
                 * stop device role if started (we might already be in
-                * STA role). TODO: make it better.
+                * STA/IBSS role).
                 */
-               if (wlvif->dev_role_id != WL12XX_INVALID_ROLE_ID) {
+               if (wl12xx_dev_role_started(wlvif)) {
                        ret = wl12xx_stop_dev(wl, wlvif);
                        if (ret < 0)
                                goto out;