int wl1271_cmd_join(struct wl1271 *wl, u8 bss_type, u8 dtim_interval, u16 beacon_interval, u8 wait) { static bool do_cal = true; unsigned long timeout; struct wl1271_cmd_join *join; int ret, i; u8 *bssid; if (do_cal) { ret = wl1271_cmd_cal(wl); if (ret < 0) wl1271_warning("couldn't calibrate"); else do_cal = false; } join = kzalloc(sizeof(*join), GFP_KERNEL); if (!join) { ret = -ENOMEM; goto out; } wl1271_debug(DEBUG_CMD, "cmd join"); bssid = (u8 *) &join->bssid_lsb; for (i = 0; i < ETH_ALEN; i++) bssid[i] = wl->bssid[ETH_ALEN - i - 1]; join->rx_config_options = wl->rx_config; join->rx_filter_options = wl->rx_filter; join->basic_rate_set = RATE_MASK_1MBPS | RATE_MASK_2MBPS | RATE_MASK_5_5MBPS | RATE_MASK_11MBPS; join->beacon_interval = beacon_interval; join->dtim_interval = dtim_interval; join->bss_type = bss_type; join->channel = wl->channel; join->ssid_len = wl->ssid_len; memcpy(join->ssid, wl->ssid, wl->ssid_len); join->ctrl = WL1271_JOIN_CMD_CTRL_TX_FLUSH; wl->session_counter++; if (wl->session_counter >= SESSION_COUNTER_MAX) wl->session_counter = 0; join->ctrl |= wl->session_counter << WL1271_JOIN_CMD_TX_SESSION_OFFSET; ret = wl1271_cmd_send(wl, CMD_START_JOIN, join, sizeof(*join)); if (ret < 0) { wl1271_error("failed to initiate cmd join"); goto out_free; } timeout = msecs_to_jiffies(JOIN_TIMEOUT); if (wait) msleep(10); out_free: kfree(join); out: return ret; }
int wl1271_cmd_join(struct wl1271 *wl, u8 bss_type, u8 dtim_interval, u16 beacon_interval, u8 wait) { static bool do_cal = true; unsigned long timeout; struct wl1271_cmd_join *join; int ret, i; u8 *bssid; /* FIXME: remove when we get calibration from the factory */ if (do_cal) { ret = wl1271_cmd_cal(wl); if (ret < 0) wl1271_warning("couldn't calibrate"); else do_cal = false; } join = kzalloc(sizeof(*join), GFP_KERNEL); if (!join) { ret = -ENOMEM; goto out; } wl1271_debug(DEBUG_CMD, "cmd join"); /* Reverse order BSSID */ bssid = (u8 *) &join->bssid_lsb; for (i = 0; i < ETH_ALEN; i++) bssid[i] = wl->bssid[ETH_ALEN - i - 1]; join->rx_config_options = wl->rx_config; join->rx_filter_options = wl->rx_filter; join->basic_rate_set = RATE_MASK_1MBPS | RATE_MASK_2MBPS | RATE_MASK_5_5MBPS | RATE_MASK_11MBPS; join->beacon_interval = beacon_interval; join->dtim_interval = dtim_interval; join->bss_type = bss_type; join->channel = wl->channel; join->ssid_len = wl->ssid_len; memcpy(join->ssid, wl->ssid, wl->ssid_len); join->ctrl = WL1271_JOIN_CMD_CTRL_TX_FLUSH; /* increment the session counter */ wl->session_counter++; if (wl->session_counter >= SESSION_COUNTER_MAX) wl->session_counter = 0; join->ctrl |= wl->session_counter << WL1271_JOIN_CMD_TX_SESSION_OFFSET; ret = wl1271_cmd_send(wl, CMD_START_JOIN, join, sizeof(*join)); if (ret < 0) { wl1271_error("failed to initiate cmd join"); goto out_free; } timeout = msecs_to_jiffies(JOIN_TIMEOUT); /* * ugly hack: we should wait for JOIN_EVENT_COMPLETE_ID but to * simplify locking we just sleep instead, for now */ if (wait) msleep(10); out_free: kfree(join); out: return ret; }