struct list_head list;
        struct list_head hidden_list;
        struct list_head nontrans_list;
+       struct cfg80211_bss *transmitted_bss;
        struct rb_node rbn;
        u64 ts_boottime;
        unsigned long ts;
 static inline void cfg80211_hold_bss(struct cfg80211_internal_bss *bss)
 {
        atomic_inc(&bss->hold);
+       if (bss->transmitted_bss) {
+               bss = container_of(bss->transmitted_bss,
+                                  struct cfg80211_internal_bss, pub);
+               atomic_inc(&bss->hold);
+       }
 }
 
 static inline void cfg80211_unhold_bss(struct cfg80211_internal_bss *bss)
 {
        int r = atomic_dec_return(&bss->hold);
        WARN_ON(r < 0);
+       if (bss->transmitted_bss) {
+               bss = container_of(bss->transmitted_bss,
+                                  struct cfg80211_internal_bss, pub);
+               r = atomic_dec_return(&bss->hold);
+               WARN_ON(r < 0);
+       }
 }
 
 
 
                                   pub);
                bss->refcount++;
        }
+       if (bss->transmitted_bss) {
+               bss = container_of(bss->transmitted_bss,
+                                  struct cfg80211_internal_bss,
+                                  pub);
+               bss->refcount++;
+       }
 }
 
 static inline void bss_ref_put(struct cfg80211_registered_device *rdev,
                if (hbss->refcount == 0)
                        bss_free(hbss);
        }
+
+       if (bss->transmitted_bss) {
+               struct cfg80211_internal_bss *tbss;
+
+               tbss = container_of(bss->transmitted_bss,
+                                   struct cfg80211_internal_bss,
+                                   pub);
+               tbss->refcount--;
+               if (tbss->refcount == 0)
+                       bss_free(tbss);
+       }
+
        bss->refcount--;
        if (bss->refcount == 0)
                bss_free(bss);
 static struct cfg80211_internal_bss *
 cfg80211_bss_update(struct cfg80211_registered_device *rdev,
                    struct cfg80211_internal_bss *tmp,
+                   struct cfg80211_bss *trans_bss,
                    bool signal_valid)
 {
        struct cfg80211_internal_bss *found = NULL;
                        goto drop;
                }
 
+               /* This must be before the call to bss_ref_get */
+               if (trans_bss) {
+                       struct cfg80211_internal_bss *pbss =
+                               container_of(trans_bss,
+                                            struct cfg80211_internal_bss,
+                                            pub);
+
+                       new->transmitted_bss = trans_bss;
+                       bss_ref_get(rdev, pbss);
+               }
+
                list_add_tail(&new->list, &rdev->bss_list);
                rdev->bss_entries++;
                rb_insert_bss(rdev, new);
 
        signal_valid = abs(data->chan->center_freq - channel->center_freq) <=
                wiphy->max_adj_channel_rssi_comp;
-       res = cfg80211_bss_update(wiphy_to_rdev(wiphy), &tmp, signal_valid);
+       res = cfg80211_bss_update(wiphy_to_rdev(wiphy), &tmp, trans_bss,
+                                 signal_valid);
        if (!res)
                return NULL;
 
 
        signal_valid = abs(data->chan->center_freq - channel->center_freq) <=
                wiphy->max_adj_channel_rssi_comp;
-       res = cfg80211_bss_update(wiphy_to_rdev(wiphy), &tmp, signal_valid);
+       res = cfg80211_bss_update(wiphy_to_rdev(wiphy), &tmp, trans_bss,
+                                 signal_valid);
        if (!res)
                return NULL;