int wl12xx_allocate_link(struct wl1271 *wl, struct wl12xx_vif *wlvif, u8 *hlid) { unsigned long flags; u8 link = find_first_zero_bit(wl->links_map, WL12XX_MAX_LINKS); if (link >= WL12XX_MAX_LINKS) return -EBUSY; wl->session_ids[link] = wlcore_get_new_session_id(wl, link); /* these bits are used by op_tx */ spin_lock_irqsave(&wl->wl_lock, flags); __set_bit(link, wl->links_map); __set_bit(link, wlvif->links_map); spin_unlock_irqrestore(&wl->wl_lock, flags); /* take the last "freed packets" value from the current FW status */ wl->links[link].prev_freed_pkts = wl->fw_status_2->counters.tx_lnk_free_pkts[link]; wl->links[link].wlvif = wlvif; *hlid = link; return 0; }
int wl12xx_allocate_link(struct wl1271 *wl, struct wl12xx_vif *wlvif, u8 *hlid) { unsigned long flags; u8 link = find_first_zero_bit(wl->links_map, wl->num_links); if (link >= wl->num_links) return -EBUSY; wl->session_ids[link] = wlcore_get_new_session_id(wl, link); /* these bits are used by op_tx */ spin_lock_irqsave(&wl->wl_lock, flags); __set_bit(link, wl->links_map); __set_bit(link, wlvif->links_map); spin_unlock_irqrestore(&wl->wl_lock, flags); /* * take the last "freed packets" value from the current FW status. * on recovery, we might not have fw_status yet, and * tx_lnk_free_pkts will be NULL. check for it. */ if (wl->fw_status->counters.tx_lnk_free_pkts) wl->links[link].prev_freed_pkts = wl->fw_status->counters.tx_lnk_free_pkts[link]; wl->links[link].wlvif = wlvif; /* * Take saved value for total freed packets from wlvif, in case this is * recovery/resume */ if (wlvif->bss_type != BSS_TYPE_AP_BSS) wl->links[link].total_freed_pkts = wlvif->total_freed_pkts; *hlid = link; wl->active_link_count++; return 0; }