Lines Matching refs:wl

38 static int gelic_wl_start_scan(struct gelic_wl_info *wl, int always_scan,
146 struct gelic_wl_info *wl; in gelic_eurus_sync_cmd_worker() local
154 wl = cmd->wl; in gelic_eurus_sync_cmd_worker()
155 card = port_to_card(wl_port(wl)); in gelic_eurus_sync_cmd_worker()
166 init_completion(&wl->cmd_done_intr); in gelic_eurus_sync_cmd_worker()
178 wait_for_completion(&wl->cmd_done_intr); in gelic_eurus_sync_cmd_worker()
204 static struct gelic_eurus_cmd *gelic_eurus_sync_cmd(struct gelic_wl_info *wl, in gelic_eurus_sync_cmd() argument
220 cmd->wl = wl; in gelic_eurus_sync_cmd()
223 queue_work(wl->eurus_cmd_queue, &cmd->work); in gelic_eurus_sync_cmd()
233 struct gelic_wl_info *wl = port_wl(netdev_port(netdev)); in gelic_wl_get_link() local
237 mutex_lock(&wl->assoc_stat_lock); in gelic_wl_get_link()
238 if (wl->assoc_stat == GELIC_WL_ASSOC_STAT_ASSOCIATED) in gelic_wl_get_link()
242 mutex_unlock(&wl->assoc_stat_lock); in gelic_wl_get_link()
247 static void gelic_wl_send_iwap_event(struct gelic_wl_info *wl, u8 *bssid) in gelic_wl_send_iwap_event() argument
255 wireless_send_event(port_to_netdev(wl_port(wl)), SIOCGIWAP, in gelic_wl_send_iwap_event()
272 static void gelic_wl_get_ch_info(struct gelic_wl_info *wl) in gelic_wl_get_ch_info() argument
274 struct gelic_card *card = port_to_card(wl_port(wl)); in gelic_wl_get_ch_info()
278 if (!test_and_set_bit(GELIC_WL_STAT_CH_INFO, &wl->stat)) { in gelic_wl_get_ch_info()
287 wl->ch_info = 0x07ff;/* 11 ch */ in gelic_wl_get_ch_info()
290 wl->ch_info = ch_info_raw >> 48; in gelic_wl_get_ch_info()
301 struct gelic_wl_info *wl = port_wl(netdev_port(netdev)); in gelic_wl_get_range() local
312 gelic_wl_get_ch_info(wl); in gelic_wl_get_range()
316 if (wl->ch_info & (1 << i)) { in gelic_wl_get_range()
369 struct gelic_wl_info *wl = port_wl(netdev_priv(netdev)); in gelic_wl_set_scan() local
381 return gelic_wl_start_scan(wl, 1, essid, essid_len); in gelic_wl_set_scan()
698 struct gelic_wl_info *wl = port_wl(netdev_priv(netdev)); in gelic_wl_get_scan() local
706 if (mutex_lock_interruptible(&wl->scan_lock)) in gelic_wl_get_scan()
709 switch (wl->scan_stat) { in gelic_wl_get_scan()
723 list_for_each_entry(scan_info, &wl->network_list, list) { in gelic_wl_get_scan()
724 if (wl->scan_age == 0 || in gelic_wl_get_scan()
725 time_after(scan_info->last_scanned + wl->scan_age, in gelic_wl_get_scan()
742 mutex_unlock(&wl->scan_lock); in gelic_wl_get_scan()
748 static void scan_list_dump(struct gelic_wl_info *wl) in scan_list_dump() argument
754 list_for_each_entry(scan_info, &wl->network_list, list) { in scan_list_dump()
774 struct gelic_wl_info *wl = port_wl(netdev_port(netdev)); in gelic_wl_set_auth() local
779 spin_lock_irqsave(&wl->lock, irqflag); in gelic_wl_set_auth()
784 wl->wpa_level = GELIC_WL_WPA_LEVEL_NONE; in gelic_wl_set_auth()
785 wl->group_cipher_method = GELIC_WL_CIPHER_WEP; in gelic_wl_set_auth()
786 wl->pairwise_cipher_method = GELIC_WL_CIPHER_WEP; in gelic_wl_set_auth()
790 wl->wpa_level = GELIC_WL_WPA_LEVEL_WPA; in gelic_wl_set_auth()
791 wl->group_cipher_method = GELIC_WL_CIPHER_TKIP; in gelic_wl_set_auth()
792 wl->pairwise_cipher_method = GELIC_WL_CIPHER_TKIP; in gelic_wl_set_auth()
793 wl->auth_method = GELIC_EURUS_AUTH_OPEN; in gelic_wl_set_auth()
808 wl->wpa_level = GELIC_WL_WPA_LEVEL_WPA2; in gelic_wl_set_auth()
809 wl->group_cipher_method = GELIC_WL_CIPHER_AES; in gelic_wl_set_auth()
810 wl->pairwise_cipher_method = in gelic_wl_set_auth()
812 wl->auth_method = GELIC_EURUS_AUTH_OPEN; in gelic_wl_set_auth()
822 wl->pairwise_cipher_method = GELIC_WL_CIPHER_WEP; in gelic_wl_set_auth()
826 wl->pairwise_cipher_method = GELIC_WL_CIPHER_TKIP; in gelic_wl_set_auth()
830 wl->pairwise_cipher_method = GELIC_WL_CIPHER_AES; in gelic_wl_set_auth()
834 wl->pairwise_cipher_method = GELIC_WL_CIPHER_NONE; in gelic_wl_set_auth()
841 wl->group_cipher_method = GELIC_WL_CIPHER_WEP; in gelic_wl_set_auth()
845 wl->group_cipher_method = GELIC_WL_CIPHER_TKIP; in gelic_wl_set_auth()
849 wl->group_cipher_method = GELIC_WL_CIPHER_AES; in gelic_wl_set_auth()
853 wl->group_cipher_method = GELIC_WL_CIPHER_NONE; in gelic_wl_set_auth()
859 wl->auth_method = GELIC_EURUS_AUTH_SHARED; in gelic_wl_set_auth()
862 wl->auth_method = GELIC_EURUS_AUTH_OPEN; in gelic_wl_set_auth()
870 wl->wpa_level = GELIC_WL_WPA_LEVEL_WPA; in gelic_wl_set_auth()
873 wl->wpa_level = GELIC_WL_WPA_LEVEL_NONE; in gelic_wl_set_auth()
887 set_bit(GELIC_WL_STAT_CONFIGURED, &wl->stat); in gelic_wl_set_auth()
889 spin_unlock_irqrestore(&wl->lock, irqflag); in gelic_wl_set_auth()
899 struct gelic_wl_info *wl = port_wl(netdev_port(netdev)); in gelic_wl_get_auth() local
904 spin_lock_irqsave(&wl->lock, irqflag); in gelic_wl_get_auth()
907 switch (wl->wpa_level) { in gelic_wl_get_auth()
920 if (wl->auth_method == GELIC_EURUS_AUTH_SHARED) in gelic_wl_get_auth()
922 else if (wl->auth_method == GELIC_EURUS_AUTH_OPEN) in gelic_wl_get_auth()
927 switch (wl->wpa_level) { in gelic_wl_get_auth()
941 spin_unlock_irqrestore(&wl->lock, irqflag); in gelic_wl_get_auth()
951 struct gelic_wl_info *wl = port_wl(netdev_priv(netdev)); in gelic_wl_set_essid() local
959 spin_lock_irqsave(&wl->lock, irqflag); in gelic_wl_set_essid()
961 wl->essid_len = data->essid.length; in gelic_wl_set_essid()
962 memcpy(wl->essid, extra, wl->essid_len); in gelic_wl_set_essid()
964 set_bit(GELIC_WL_STAT_ESSID_SET, &wl->stat); in gelic_wl_set_essid()
967 clear_bit(GELIC_WL_STAT_ESSID_SET, &wl->stat); in gelic_wl_set_essid()
969 set_bit(GELIC_WL_STAT_CONFIGURED, &wl->stat); in gelic_wl_set_essid()
970 spin_unlock_irqrestore(&wl->lock, irqflag); in gelic_wl_set_essid()
982 struct gelic_wl_info *wl = port_wl(netdev_priv(netdev)); in gelic_wl_get_essid() local
986 mutex_lock(&wl->assoc_stat_lock); in gelic_wl_get_essid()
987 spin_lock_irqsave(&wl->lock, irqflag); in gelic_wl_get_essid()
988 if (test_bit(GELIC_WL_STAT_ESSID_SET, &wl->stat) || in gelic_wl_get_essid()
989 wl->assoc_stat == GELIC_WL_ASSOC_STAT_ASSOCIATED) { in gelic_wl_get_essid()
990 memcpy(extra, wl->essid, wl->essid_len); in gelic_wl_get_essid()
991 data->essid.length = wl->essid_len; in gelic_wl_get_essid()
996 mutex_unlock(&wl->assoc_stat_lock); in gelic_wl_get_essid()
997 spin_unlock_irqrestore(&wl->lock, irqflag); in gelic_wl_get_essid()
1008 struct gelic_wl_info *wl = port_wl(netdev_priv(netdev)); in gelic_wl_set_encode() local
1026 spin_lock_irqsave(&wl->lock, irqflag); in gelic_wl_set_encode()
1032 key_index = wl->current_key; in gelic_wl_set_encode()
1038 wl->current_key = key_index; in gelic_wl_set_encode()
1045 wl->group_cipher_method = GELIC_WL_CIPHER_NONE; in gelic_wl_set_encode()
1046 wl->pairwise_cipher_method = in gelic_wl_set_encode()
1049 wl->key_enabled = 0; in gelic_wl_set_encode()
1051 clear_bit(key_index, &wl->key_enabled); in gelic_wl_set_encode()
1055 wl->auth_method = GELIC_EURUS_AUTH_OPEN; in gelic_wl_set_encode()
1058 wl->auth_method = GELIC_EURUS_AUTH_SHARED; in gelic_wl_set_encode()
1065 wl->key_len[key_index] = enc->length; in gelic_wl_set_encode()
1066 memcpy(wl->key[key_index], extra, enc->length); in gelic_wl_set_encode()
1067 set_bit(key_index, &wl->key_enabled); in gelic_wl_set_encode()
1068 wl->pairwise_cipher_method = GELIC_WL_CIPHER_WEP; in gelic_wl_set_encode()
1069 wl->group_cipher_method = GELIC_WL_CIPHER_WEP; in gelic_wl_set_encode()
1071 set_bit(GELIC_WL_STAT_CONFIGURED, &wl->stat); in gelic_wl_set_encode()
1073 spin_unlock_irqrestore(&wl->lock, irqflag); in gelic_wl_set_encode()
1082 struct gelic_wl_info *wl = port_wl(netdev_priv(netdev)); in gelic_wl_get_encode() local
1095 spin_lock_irqsave(&wl->lock, irqflag); in gelic_wl_get_encode()
1099 key_index = wl->current_key; in gelic_wl_get_encode()
1101 if (wl->group_cipher_method == GELIC_WL_CIPHER_WEP) { in gelic_wl_get_encode()
1102 switch (wl->auth_method) { in gelic_wl_get_encode()
1113 if (test_bit(key_index, &wl->key_enabled)) { in gelic_wl_get_encode()
1114 if (enc->length < wl->key_len[key_index]) { in gelic_wl_get_encode()
1118 enc->length = wl->key_len[key_index]; in gelic_wl_get_encode()
1119 memcpy(extra, wl->key[key_index], wl->key_len[key_index]); in gelic_wl_get_encode()
1129 spin_unlock_irqrestore(&wl->lock, irqflag); in gelic_wl_get_encode()
1138 struct gelic_wl_info *wl = port_wl(netdev_priv(netdev)); in gelic_wl_set_ap() local
1145 spin_lock_irqsave(&wl->lock, irqflag); in gelic_wl_set_ap()
1147 memcpy(wl->bssid, data->ap_addr.sa_data, in gelic_wl_set_ap()
1149 set_bit(GELIC_WL_STAT_BSSID_SET, &wl->stat); in gelic_wl_set_ap()
1150 set_bit(GELIC_WL_STAT_CONFIGURED, &wl->stat); in gelic_wl_set_ap()
1151 pr_debug("%s: bss=%pM\n", __func__, wl->bssid); in gelic_wl_set_ap()
1154 clear_bit(GELIC_WL_STAT_BSSID_SET, &wl->stat); in gelic_wl_set_ap()
1155 eth_zero_addr(wl->bssid); in gelic_wl_set_ap()
1157 spin_unlock_irqrestore(&wl->lock, irqflag); in gelic_wl_set_ap()
1166 struct gelic_wl_info *wl = port_wl(netdev_priv(netdev)); in gelic_wl_get_ap() local
1170 mutex_lock(&wl->assoc_stat_lock); in gelic_wl_get_ap()
1171 spin_lock_irqsave(&wl->lock, irqflag); in gelic_wl_get_ap()
1172 if (wl->assoc_stat == GELIC_WL_ASSOC_STAT_ASSOCIATED) { in gelic_wl_get_ap()
1174 memcpy(data->ap_addr.sa_data, wl->active_bssid, in gelic_wl_get_ap()
1179 spin_unlock_irqrestore(&wl->lock, irqflag); in gelic_wl_get_ap()
1180 mutex_unlock(&wl->assoc_stat_lock); in gelic_wl_get_ap()
1190 struct gelic_wl_info *wl = port_wl(netdev_priv(netdev)); in gelic_wl_set_encodeext() local
1213 spin_lock_irqsave(&wl->lock, irqflag); in gelic_wl_set_encodeext()
1217 key_index = wl->current_key; in gelic_wl_set_encodeext()
1223 wl->current_key = key_index; in gelic_wl_set_encodeext()
1229 wl->wpa_level = GELIC_WL_WPA_LEVEL_NONE; in gelic_wl_set_encodeext()
1230 wl->group_cipher_method = GELIC_WL_CIPHER_NONE; in gelic_wl_set_encodeext()
1231 wl->pairwise_cipher_method = GELIC_WL_CIPHER_NONE; in gelic_wl_set_encodeext()
1232 wl->auth_method = GELIC_EURUS_AUTH_OPEN; /* should be open */ in gelic_wl_set_encodeext()
1237 wl->auth_method = GELIC_EURUS_AUTH_OPEN; in gelic_wl_set_encodeext()
1241 wl->auth_method = GELIC_EURUS_AUTH_SHARED; in gelic_wl_set_encodeext()
1250 wl->key_len[key_index] = ext->key_len; in gelic_wl_set_encodeext()
1251 memset(wl->key[key_index], 0, IW_ENCODING_TOKEN_MAX); in gelic_wl_set_encodeext()
1252 memcpy(wl->key[key_index], ext->key, ext->key_len); in gelic_wl_set_encodeext()
1253 set_bit(key_index, &wl->key_enabled); in gelic_wl_set_encodeext()
1255 set_bit(GELIC_WL_STAT_CONFIGURED, &wl->stat); in gelic_wl_set_encodeext()
1263 memset(wl->psk, 0, sizeof(wl->psk)); in gelic_wl_set_encodeext()
1264 memcpy(wl->psk, ext->key, ext->key_len); in gelic_wl_set_encodeext()
1265 wl->psk_len = ext->key_len; in gelic_wl_set_encodeext()
1266 wl->psk_type = GELIC_EURUS_WPA_PSK_BIN; in gelic_wl_set_encodeext()
1268 set_bit(GELIC_WL_STAT_WPA_PSK_SET, &wl->stat); in gelic_wl_set_encodeext()
1271 spin_unlock_irqrestore(&wl->lock, irqflag); in gelic_wl_set_encodeext()
1280 struct gelic_wl_info *wl = port_wl(netdev_priv(netdev)); in gelic_wl_get_encodeext() local
1302 spin_lock_irqsave(&wl->lock, irqflag); in gelic_wl_get_encodeext()
1306 key_index = wl->current_key; in gelic_wl_get_encodeext()
1309 switch (wl->group_cipher_method) { in gelic_wl_get_encodeext()
1330 if (max_key_len < wl->key_len[key_index]) { in gelic_wl_get_encodeext()
1334 if (test_bit(key_index, &wl->key_enabled)) in gelic_wl_get_encodeext()
1335 memcpy(ext->key, wl->key[key_index], in gelic_wl_get_encodeext()
1336 wl->key_len[key_index]); in gelic_wl_get_encodeext()
1342 spin_unlock_irqrestore(&wl->lock, irqflag); in gelic_wl_get_encodeext()
1392 struct gelic_wl_info *wl = port_wl(netdev_priv(netdev)); in gelic_wl_get_wireless_stats() local
1404 is = &wl->iwstat; in gelic_wl_get_wireless_stats()
1406 cmd = gelic_eurus_sync_cmd(wl, GELIC_EURUS_CMD_GET_RSSI_CFG, in gelic_wl_get_wireless_stats()
1426 static int gelic_wl_start_scan(struct gelic_wl_info *wl, int always_scan, in gelic_wl_start_scan() argument
1435 if (mutex_lock_interruptible(&wl->scan_lock)) in gelic_wl_start_scan()
1441 if (wl->scan_stat == GELIC_WL_SCAN_STAT_SCANNING) { in gelic_wl_start_scan()
1446 init_completion(&wl->scan_done); in gelic_wl_start_scan()
1452 && wl->scan_stat == GELIC_WL_SCAN_STAT_GOT_LIST) { in gelic_wl_start_scan()
1454 complete(&wl->scan_done); in gelic_wl_start_scan()
1475 wl->scan_stat = GELIC_WL_SCAN_STAT_SCANNING; in gelic_wl_start_scan()
1476 cmd = gelic_eurus_sync_cmd(wl, GELIC_EURUS_CMD_START_SCAN, in gelic_wl_start_scan()
1479 wl->scan_stat = GELIC_WL_SCAN_STAT_INIT; in gelic_wl_start_scan()
1480 complete(&wl->scan_done); in gelic_wl_start_scan()
1487 mutex_unlock(&wl->scan_lock); in gelic_wl_start_scan()
1496 static void gelic_wl_scan_complete_event(struct gelic_wl_info *wl) in gelic_wl_scan_complete_event() argument
1509 mutex_lock(&wl->scan_lock); in gelic_wl_scan_complete_event()
1517 if (wl->scan_stat != GELIC_WL_SCAN_STAT_SCANNING) { in gelic_wl_scan_complete_event()
1522 __func__, wl->scan_stat); in gelic_wl_scan_complete_event()
1526 cmd = gelic_eurus_sync_cmd(wl, GELIC_EURUS_CMD_GET_SCAN, in gelic_wl_scan_complete_event()
1529 wl->scan_stat = GELIC_WL_SCAN_STAT_INIT; in gelic_wl_scan_complete_event()
1539 wl->scan_stat = GELIC_WL_SCAN_STAT_GOT_LIST; in gelic_wl_scan_complete_event()
1542 list_for_each_entry_safe(target, tmp, &wl->network_list, list) { in gelic_wl_scan_complete_event()
1545 if (time_before(target->last_scanned + wl->scan_age, in gelic_wl_scan_complete_event()
1549 list_move_tail(&target->list, &wl->network_free_list); in gelic_wl_scan_complete_event()
1574 list_for_each_entry(target, &wl->network_list, list) { in gelic_wl_scan_complete_event()
1589 if (list_empty(&wl->network_free_list)) { in gelic_wl_scan_complete_event()
1593 target = list_entry(wl->network_free_list.next, in gelic_wl_scan_complete_event()
1624 list_move_tail(&target->list, &wl->network_list); in gelic_wl_scan_complete_event()
1627 wireless_send_event(port_to_netdev(wl_port(wl)), SIOCGIWSCAN, &data, in gelic_wl_scan_complete_event()
1631 complete(&wl->scan_done); in gelic_wl_scan_complete_event()
1632 mutex_unlock(&wl->scan_lock); in gelic_wl_scan_complete_event()
1654 struct gelic_wl_scan_info *gelic_wl_find_best_bss(struct gelic_wl_info *wl) in gelic_wl_find_best_bss() argument
1666 list_for_each_entry(scan_info, &wl->network_list, list) { in gelic_wl_find_best_bss()
1675 if (test_bit(GELIC_WL_STAT_BSSID_SET, &wl->stat)) { in gelic_wl_find_best_bss()
1677 wl->bssid)) { in gelic_wl_find_best_bss()
1692 if (wl->wpa_level == GELIC_WL_WPA_LEVEL_WPA2) { in gelic_wl_find_best_bss()
1698 } else if (wl->wpa_level == GELIC_WL_WPA_LEVEL_WPA) { in gelic_wl_find_best_bss()
1704 } else if (wl->wpa_level == GELIC_WL_WPA_LEVEL_NONE && in gelic_wl_find_best_bss()
1705 wl->group_cipher_method == GELIC_WL_CIPHER_WEP) { in gelic_wl_find_best_bss()
1714 if (test_bit(GELIC_WL_STAT_ESSID_SET, &wl->stat)) { in gelic_wl_find_best_bss()
1715 if ((scan_info->essid_len == wl->essid_len) && in gelic_wl_find_best_bss()
1716 !strncmp(wl->essid, in gelic_wl_find_best_bss()
1741 static int gelic_wl_do_wep_setup(struct gelic_wl_info *wl) in gelic_wl_do_wep_setup() argument
1758 if (wl->group_cipher_method == GELIC_WL_CIPHER_WEP) { in gelic_wl_do_wep_setup()
1761 if (!test_bit(i, &wl->key_enabled)) in gelic_wl_do_wep_setup()
1766 if (wl->key_len[i] == 13) in gelic_wl_do_wep_setup()
1768 else if (wl->key_len[i] != 5) { in gelic_wl_do_wep_setup()
1770 __func__, i, wl->key_len[i]); in gelic_wl_do_wep_setup()
1774 memcpy(wep->key[i], wl->key[i], wl->key_len[i]); in gelic_wl_do_wep_setup()
1796 cmd = gelic_eurus_sync_cmd(wl, GELIC_EURUS_CMD_SET_WEP_CFG, in gelic_wl_do_wep_setup()
1833 static int gelic_wl_do_wpa_setup(struct gelic_wl_info *wl) in gelic_wl_do_wpa_setup() argument
1848 if (!test_bit(GELIC_WL_STAT_WPA_PSK_SET, &wl->stat)) in gelic_wl_do_wpa_setup()
1852 memcpy(wpa->psk, wl->psk, wl->psk_len); in gelic_wl_do_wpa_setup()
1855 if (wl->wpa_level == GELIC_WL_WPA_LEVEL_WPA2) { in gelic_wl_do_wpa_setup()
1856 if (wl->group_cipher_method == GELIC_WL_CIPHER_AES) { in gelic_wl_do_wpa_setup()
1859 if (wl->pairwise_cipher_method == GELIC_WL_CIPHER_AES && in gelic_wl_do_wpa_setup()
1866 if (wl->group_cipher_method == GELIC_WL_CIPHER_AES) { in gelic_wl_do_wpa_setup()
1869 if (wl->pairwise_cipher_method == GELIC_WL_CIPHER_AES && in gelic_wl_do_wpa_setup()
1879 wpa->psk_type = cpu_to_be16(wl->psk_type); in gelic_wl_do_wpa_setup()
1897 cmd = gelic_eurus_sync_cmd(wl, GELIC_EURUS_CMD_SET_WPA_CFG, in gelic_wl_do_wpa_setup()
1912 static int gelic_wl_associate_bss(struct gelic_wl_info *wl, in gelic_wl_associate_bss() argument
1932 switch (wl->auth_method) { in gelic_wl_associate_bss()
1942 scan_list_dump(wl); in gelic_wl_associate_bss()
1949 cmd = gelic_eurus_sync_cmd(wl, GELIC_EURUS_CMD_SET_COMMON_CFG, in gelic_wl_associate_bss()
1959 switch (wl->wpa_level) { in gelic_wl_associate_bss()
1962 ret = gelic_wl_do_wep_setup(wl); in gelic_wl_associate_bss()
1966 ret = gelic_wl_do_wpa_setup(wl); in gelic_wl_associate_bss()
1974 gelic_wl_send_iwap_event(wl, NULL); in gelic_wl_associate_bss()
1979 init_completion(&wl->assoc_done); in gelic_wl_associate_bss()
1980 wl->assoc_stat = GELIC_WL_ASSOC_STAT_ASSOCIATING; in gelic_wl_associate_bss()
1981 cmd = gelic_eurus_sync_cmd(wl, GELIC_EURUS_CMD_ASSOC, in gelic_wl_associate_bss()
1985 wl->assoc_stat = GELIC_WL_ASSOC_STAT_DISCONN; in gelic_wl_associate_bss()
1988 gelic_wl_send_iwap_event(wl, NULL); in gelic_wl_associate_bss()
1994 rc = wait_for_completion_timeout(&wl->assoc_done, HZ * 4);/*FIXME*/ in gelic_wl_associate_bss()
1999 cmd = gelic_eurus_sync_cmd(wl, GELIC_EURUS_CMD_DISASSOC, in gelic_wl_associate_bss()
2002 wl->assoc_stat = GELIC_WL_ASSOC_STAT_DISCONN; in gelic_wl_associate_bss()
2003 gelic_wl_send_iwap_event(wl, NULL); in gelic_wl_associate_bss()
2006 wl->assoc_stat = GELIC_WL_ASSOC_STAT_ASSOCIATED; in gelic_wl_associate_bss()
2008 memcpy(wl->active_bssid, &bss->hwinfo->bssid[2], ETH_ALEN); in gelic_wl_associate_bss()
2011 gelic_wl_send_iwap_event(wl, wl->active_bssid); in gelic_wl_associate_bss()
2023 static void gelic_wl_connected_event(struct gelic_wl_info *wl, in gelic_wl_connected_event() argument
2028 switch (wl->wpa_level) { in gelic_wl_connected_event()
2040 complete(&wl->assoc_done); in gelic_wl_connected_event()
2041 netif_carrier_on(port_to_netdev(wl_port(wl))); in gelic_wl_connected_event()
2050 static void gelic_wl_disconnect_event(struct gelic_wl_info *wl, in gelic_wl_disconnect_event() argument
2063 if (!mutex_trylock(&wl->assoc_stat_lock)) { in gelic_wl_disconnect_event()
2071 cmd = gelic_eurus_sync_cmd(wl, GELIC_EURUS_CMD_DISASSOC, NULL, 0); in gelic_wl_disconnect_event()
2075 if (wl->assoc_stat == GELIC_WL_ASSOC_STAT_ASSOCIATED) in gelic_wl_disconnect_event()
2076 gelic_wl_send_iwap_event(wl, NULL); in gelic_wl_disconnect_event()
2078 wl->assoc_stat = GELIC_WL_ASSOC_STAT_DISCONN; in gelic_wl_disconnect_event()
2079 netif_carrier_off(port_to_netdev(wl_port(wl))); in gelic_wl_disconnect_event()
2082 mutex_unlock(&wl->assoc_stat_lock); in gelic_wl_disconnect_event()
2120 struct gelic_wl_info *wl; in gelic_wl_event_worker() local
2126 wl = container_of(work, struct gelic_wl_info, event_work.work); in gelic_wl_event_worker()
2127 port = wl_port(wl); in gelic_wl_event_worker()
2143 gelic_wl_scan_complete_event(wl); in gelic_wl_event_worker()
2147 gelic_wl_disconnect_event(wl, event); in gelic_wl_event_worker()
2151 gelic_wl_connected_event(wl, event); in gelic_wl_event_worker()
2163 struct gelic_wl_info *wl; in gelic_wl_assoc_worker() local
2171 wl = container_of(work, struct gelic_wl_info, assoc_work.work); in gelic_wl_assoc_worker()
2173 mutex_lock(&wl->assoc_stat_lock); in gelic_wl_assoc_worker()
2175 if (wl->assoc_stat != GELIC_WL_ASSOC_STAT_DISCONN) in gelic_wl_assoc_worker()
2178 spin_lock_irqsave(&wl->lock, irqflag); in gelic_wl_assoc_worker()
2179 if (test_bit(GELIC_WL_STAT_ESSID_SET, &wl->stat)) { in gelic_wl_assoc_worker()
2181 wl->essid); in gelic_wl_assoc_worker()
2182 essid = wl->essid; in gelic_wl_assoc_worker()
2183 essid_len = wl->essid_len; in gelic_wl_assoc_worker()
2188 spin_unlock_irqrestore(&wl->lock, irqflag); in gelic_wl_assoc_worker()
2190 ret = gelic_wl_start_scan(wl, 0, essid, essid_len); in gelic_wl_assoc_worker()
2193 schedule_delayed_work(&wl->assoc_work, HZ/10); /*FIXME*/ in gelic_wl_assoc_worker()
2206 wait_for_completion(&wl->scan_done); in gelic_wl_assoc_worker()
2209 mutex_lock(&wl->scan_lock); in gelic_wl_assoc_worker()
2210 if (wl->scan_stat != GELIC_WL_SCAN_STAT_GOT_LIST) { in gelic_wl_assoc_worker()
2211 gelic_wl_send_iwap_event(wl, NULL); in gelic_wl_assoc_worker()
2217 best_bss = gelic_wl_find_best_bss(wl); in gelic_wl_assoc_worker()
2219 gelic_wl_send_iwap_event(wl, NULL); in gelic_wl_assoc_worker()
2225 ret = gelic_wl_associate_bss(wl, best_bss); in gelic_wl_assoc_worker()
2229 mutex_unlock(&wl->scan_lock); in gelic_wl_assoc_worker()
2231 mutex_unlock(&wl->assoc_stat_lock); in gelic_wl_assoc_worker()
2240 struct gelic_wl_info *wl = port_wl(netdev_priv(netdev)); in gelic_wl_interrupt() local
2244 complete(&wl->cmd_done_intr); in gelic_wl_interrupt()
2249 queue_delayed_work(wl->event_queue, &wl->event_work, 0); in gelic_wl_interrupt()
2287 struct gelic_wl_info *wl; in gelic_wl_alloc() local
2304 wl = port_wl(port); in gelic_wl_alloc()
2305 pr_debug("%s: wl=%p port=%p\n", __func__, wl, port); in gelic_wl_alloc()
2308 wl->networks = kcalloc(GELIC_WL_BSS_MAX_ENT, in gelic_wl_alloc()
2312 if (!wl->networks) in gelic_wl_alloc()
2315 wl->eurus_cmd_queue = create_singlethread_workqueue("gelic_cmd"); in gelic_wl_alloc()
2316 if (!wl->eurus_cmd_queue) in gelic_wl_alloc()
2319 wl->event_queue = create_singlethread_workqueue("gelic_event"); in gelic_wl_alloc()
2320 if (!wl->event_queue) in gelic_wl_alloc()
2323 INIT_LIST_HEAD(&wl->network_free_list); in gelic_wl_alloc()
2324 INIT_LIST_HEAD(&wl->network_list); in gelic_wl_alloc()
2326 list_add_tail(&wl->networks[i].list, in gelic_wl_alloc()
2327 &wl->network_free_list); in gelic_wl_alloc()
2328 init_completion(&wl->cmd_done_intr); in gelic_wl_alloc()
2330 INIT_DELAYED_WORK(&wl->event_work, gelic_wl_event_worker); in gelic_wl_alloc()
2331 INIT_DELAYED_WORK(&wl->assoc_work, gelic_wl_assoc_worker); in gelic_wl_alloc()
2332 mutex_init(&wl->scan_lock); in gelic_wl_alloc()
2333 mutex_init(&wl->assoc_stat_lock); in gelic_wl_alloc()
2335 init_completion(&wl->scan_done); in gelic_wl_alloc()
2337 complete(&wl->scan_done); in gelic_wl_alloc()
2339 spin_lock_init(&wl->lock); in gelic_wl_alloc()
2341 wl->scan_age = 5*HZ; /* FIXME */ in gelic_wl_alloc()
2351 destroy_workqueue(wl->eurus_cmd_queue); in gelic_wl_alloc()
2353 kfree(wl->networks); in gelic_wl_alloc()
2361 static void gelic_wl_free(struct gelic_wl_info *wl) in gelic_wl_free() argument
2369 destroy_workqueue(wl->eurus_cmd_queue); in gelic_wl_free()
2370 destroy_workqueue(wl->event_queue); in gelic_wl_free()
2372 scan_info = wl->networks; in gelic_wl_free()
2375 kfree(wl->networks); in gelic_wl_free()
2377 free_netdev(port_to_netdev(wl_port(wl))); in gelic_wl_free()
2384 struct gelic_wl_info *wl = port_wl(netdev_priv(netdev)); in gelic_wl_try_associate() local
2392 if (wl->group_cipher_method == GELIC_WL_CIPHER_NONE) { in gelic_wl_try_associate()
2394 &wl->stat)) in gelic_wl_try_associate()
2403 if (wl->group_cipher_method == GELIC_WL_CIPHER_WEP) { in gelic_wl_try_associate()
2406 if (test_bit(i, &wl->key_enabled)) in gelic_wl_try_associate()
2414 if ((wl->group_cipher_method == GELIC_WL_CIPHER_TKIP) || in gelic_wl_try_associate()
2415 (wl->group_cipher_method == GELIC_WL_CIPHER_AES)) { in gelic_wl_try_associate()
2417 &wl->stat)) in gelic_wl_try_associate()
2427 ret = schedule_delayed_work(&wl->assoc_work, 0); in gelic_wl_try_associate()
2455 static int gelic_wl_reset_state(struct gelic_wl_info *wl) in gelic_wl_reset_state() argument
2461 list_for_each_entry_safe(target, tmp, &wl->network_list, list) { in gelic_wl_reset_state()
2462 list_move_tail(&target->list, &wl->network_free_list); in gelic_wl_reset_state()
2464 wl->scan_stat = GELIC_WL_SCAN_STAT_INIT; in gelic_wl_reset_state()
2467 wl->auth_method = GELIC_EURUS_AUTH_OPEN; in gelic_wl_reset_state()
2468 wl->group_cipher_method = GELIC_WL_CIPHER_NONE; in gelic_wl_reset_state()
2469 wl->pairwise_cipher_method = GELIC_WL_CIPHER_NONE; in gelic_wl_reset_state()
2470 wl->wpa_level = GELIC_WL_WPA_LEVEL_NONE; in gelic_wl_reset_state()
2472 wl->key_enabled = 0; in gelic_wl_reset_state()
2473 wl->current_key = 0; in gelic_wl_reset_state()
2475 wl->psk_type = GELIC_EURUS_WPA_PSK_PASSPHRASE; in gelic_wl_reset_state()
2476 wl->psk_len = 0; in gelic_wl_reset_state()
2478 wl->essid_len = 0; in gelic_wl_reset_state()
2479 memset(wl->essid, 0, sizeof(wl->essid)); in gelic_wl_reset_state()
2480 memset(wl->bssid, 0, sizeof(wl->bssid)); in gelic_wl_reset_state()
2481 memset(wl->active_bssid, 0, sizeof(wl->active_bssid)); in gelic_wl_reset_state()
2483 wl->assoc_stat = GELIC_WL_ASSOC_STAT_DISCONN; in gelic_wl_reset_state()
2485 memset(&wl->iwstat, 0, sizeof(wl->iwstat)); in gelic_wl_reset_state()
2487 wl->stat = 0; in gelic_wl_reset_state()
2497 struct gelic_wl_info *wl = port_wl(port); in gelic_wl_disconnect() local
2504 if (wl->scan_stat == GELIC_WL_SCAN_STAT_SCANNING) in gelic_wl_disconnect()
2505 wait_for_completion_timeout(&wl->scan_done, HZ); in gelic_wl_disconnect()
2507 cmd = gelic_eurus_sync_cmd(wl, GELIC_EURUS_CMD_DISASSOC, NULL, 0); in gelic_wl_disconnect()
2509 gelic_wl_send_iwap_event(wl, NULL); in gelic_wl_disconnect()
2515 struct gelic_wl_info *wl = port_wl(port); in gelic_wl_stop() local
2524 cancel_delayed_work(&wl->assoc_work); in gelic_wl_stop()
2526 if (wl->assoc_stat == GELIC_WL_ASSOC_STAT_ASSOCIATED) in gelic_wl_stop()
2530 gelic_wl_reset_state(wl); in gelic_wl_stop()
2562 struct gelic_wl_info *wl; in gelic_wl_setup_netdev_ops() local
2563 wl = port_wl(netdev_priv(netdev)); in gelic_wl_setup_netdev_ops()
2564 BUG_ON(!wl); in gelic_wl_setup_netdev_ops()
2569 netdev->wireless_data = &wl->wireless_data; in gelic_wl_setup_netdev_ops()
2620 struct gelic_wl_info *wl; in gelic_wl_driver_remove() local
2631 wl = port_wl(netdev_priv(netdev)); in gelic_wl_driver_remove()
2634 if (wl->assoc_stat == GELIC_WL_ASSOC_STAT_ASSOCIATED) in gelic_wl_driver_remove()
2637 complete(&wl->cmd_done_intr); in gelic_wl_driver_remove()
2640 cancel_delayed_work(&wl->assoc_work); in gelic_wl_driver_remove()
2641 cancel_delayed_work(&wl->event_work); in gelic_wl_driver_remove()
2642 flush_workqueue(wl->eurus_cmd_queue); in gelic_wl_driver_remove()
2643 flush_workqueue(wl->event_queue); in gelic_wl_driver_remove()
2652 gelic_wl_free(wl); in gelic_wl_driver_remove()