cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

ps3_gelic_wireless.c (69049B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 *  PS3 gelic network driver.
      4 *
      5 * Copyright (C) 2007 Sony Computer Entertainment Inc.
      6 * Copyright 2007 Sony Corporation
      7 */
      8#undef DEBUG
      9
     10#include <linux/kernel.h>
     11#include <linux/module.h>
     12#include <linux/slab.h>
     13
     14#include <linux/etherdevice.h>
     15#include <linux/ethtool.h>
     16#include <linux/if_vlan.h>
     17
     18#include <linux/in.h>
     19#include <linux/ip.h>
     20#include <linux/tcp.h>
     21#include <linux/wireless.h>
     22#include <linux/ieee80211.h>
     23#include <linux/if_arp.h>
     24#include <linux/ctype.h>
     25#include <linux/string.h>
     26#include <net/iw_handler.h>
     27
     28#include <linux/dma-mapping.h>
     29#include <net/checksum.h>
     30#include <asm/firmware.h>
     31#include <asm/ps3.h>
     32#include <asm/lv1call.h>
     33
     34#include "ps3_gelic_net.h"
     35#include "ps3_gelic_wireless.h"
     36
     37
     38static int gelic_wl_start_scan(struct gelic_wl_info *wl, int always_scan,
     39			       u8 *essid, size_t essid_len);
     40static int gelic_wl_try_associate(struct net_device *netdev);
     41
     42/*
     43 * tables
     44 */
     45
     46/* 802.11b/g channel to freq in MHz */
     47static const int channel_freq[] = {
     48	2412, 2417, 2422, 2427, 2432,
     49	2437, 2442, 2447, 2452, 2457,
     50	2462, 2467, 2472, 2484
     51};
     52#define NUM_CHANNELS ARRAY_SIZE(channel_freq)
     53
     54/* in bps */
     55static const int bitrate_list[] = {
     56	  1000000,
     57	  2000000,
     58	  5500000,
     59	 11000000,
     60	  6000000,
     61	  9000000,
     62	 12000000,
     63	 18000000,
     64	 24000000,
     65	 36000000,
     66	 48000000,
     67	 54000000
     68};
     69#define NUM_BITRATES ARRAY_SIZE(bitrate_list)
     70
     71/*
     72 * wpa2 support requires the hypervisor version 2.0 or later
     73 */
     74static inline int wpa2_capable(void)
     75{
     76	return 0 <= ps3_compare_firmware_version(2, 0, 0);
     77}
     78
     79static inline int precise_ie(void)
     80{
     81	return 0 <= ps3_compare_firmware_version(2, 2, 0);
     82}
     83/*
     84 * post_eurus_cmd helpers
     85 */
     86struct eurus_cmd_arg_info {
     87	int pre_arg; /* command requires arg1, arg2 at POST COMMAND */
     88	int post_arg; /* command requires arg1, arg2 at GET_RESULT */
     89};
     90
     91static const struct eurus_cmd_arg_info cmd_info[GELIC_EURUS_CMD_MAX_INDEX] = {
     92	[GELIC_EURUS_CMD_SET_COMMON_CFG] = { .pre_arg = 1},
     93	[GELIC_EURUS_CMD_SET_WEP_CFG]    = { .pre_arg = 1},
     94	[GELIC_EURUS_CMD_SET_WPA_CFG]    = { .pre_arg = 1},
     95	[GELIC_EURUS_CMD_GET_COMMON_CFG] = { .post_arg = 1},
     96	[GELIC_EURUS_CMD_GET_WEP_CFG]    = { .post_arg = 1},
     97	[GELIC_EURUS_CMD_GET_WPA_CFG]    = { .post_arg = 1},
     98	[GELIC_EURUS_CMD_GET_RSSI_CFG]   = { .post_arg = 1},
     99	[GELIC_EURUS_CMD_START_SCAN]     = { .pre_arg = 1},
    100	[GELIC_EURUS_CMD_GET_SCAN]       = { .post_arg = 1},
    101};
    102
    103#ifdef DEBUG
    104static const char *cmdstr(enum gelic_eurus_command ix)
    105{
    106	switch (ix) {
    107	case GELIC_EURUS_CMD_ASSOC:
    108		return "ASSOC";
    109	case GELIC_EURUS_CMD_DISASSOC:
    110		return "DISASSOC";
    111	case GELIC_EURUS_CMD_START_SCAN:
    112		return "SCAN";
    113	case GELIC_EURUS_CMD_GET_SCAN:
    114		return "GET SCAN";
    115	case GELIC_EURUS_CMD_SET_COMMON_CFG:
    116		return "SET_COMMON_CFG";
    117	case GELIC_EURUS_CMD_GET_COMMON_CFG:
    118		return "GET_COMMON_CFG";
    119	case GELIC_EURUS_CMD_SET_WEP_CFG:
    120		return "SET_WEP_CFG";
    121	case GELIC_EURUS_CMD_GET_WEP_CFG:
    122		return "GET_WEP_CFG";
    123	case GELIC_EURUS_CMD_SET_WPA_CFG:
    124		return "SET_WPA_CFG";
    125	case GELIC_EURUS_CMD_GET_WPA_CFG:
    126		return "GET_WPA_CFG";
    127	case GELIC_EURUS_CMD_GET_RSSI_CFG:
    128		return "GET_RSSI";
    129	default:
    130		break;
    131	}
    132	return "";
    133};
    134#else
    135static inline const char *cmdstr(enum gelic_eurus_command ix)
    136{
    137	return "";
    138}
    139#endif
    140
    141/* synchronously do eurus commands */
    142static void gelic_eurus_sync_cmd_worker(struct work_struct *work)
    143{
    144	struct gelic_eurus_cmd *cmd;
    145	struct gelic_card *card;
    146	struct gelic_wl_info *wl;
    147
    148	u64 arg1, arg2;
    149
    150	pr_debug("%s: <-\n", __func__);
    151	cmd = container_of(work, struct gelic_eurus_cmd, work);
    152	BUG_ON(cmd_info[cmd->cmd].pre_arg &&
    153	       cmd_info[cmd->cmd].post_arg);
    154	wl = cmd->wl;
    155	card = port_to_card(wl_port(wl));
    156
    157	if (cmd_info[cmd->cmd].pre_arg) {
    158		arg1 = (cmd->buffer) ?
    159			ps3_mm_phys_to_lpar(__pa(cmd->buffer)) :
    160			0;
    161		arg2 = cmd->buf_size;
    162	} else {
    163		arg1 = 0;
    164		arg2 = 0;
    165	}
    166	init_completion(&wl->cmd_done_intr);
    167	pr_debug("%s: cmd='%s' start\n", __func__, cmdstr(cmd->cmd));
    168	cmd->status = lv1_net_control(bus_id(card), dev_id(card),
    169				      GELIC_LV1_POST_WLAN_CMD,
    170				      cmd->cmd, arg1, arg2,
    171				      &cmd->tag, &cmd->size);
    172	if (cmd->status) {
    173		complete(&cmd->done);
    174		pr_info("%s: cmd issue failed\n", __func__);
    175		return;
    176	}
    177
    178	wait_for_completion(&wl->cmd_done_intr);
    179
    180	if (cmd_info[cmd->cmd].post_arg) {
    181		arg1 = ps3_mm_phys_to_lpar(__pa(cmd->buffer));
    182		arg2 = cmd->buf_size;
    183	} else {
    184		arg1 = 0;
    185		arg2 = 0;
    186	}
    187
    188	cmd->status = lv1_net_control(bus_id(card), dev_id(card),
    189				      GELIC_LV1_GET_WLAN_CMD_RESULT,
    190				      cmd->tag, arg1, arg2,
    191				      &cmd->cmd_status, &cmd->size);
    192#ifdef DEBUG
    193	if (cmd->status || cmd->cmd_status) {
    194	pr_debug("%s: cmd done tag=%#lx arg1=%#lx, arg2=%#lx\n", __func__,
    195		 cmd->tag, arg1, arg2);
    196	pr_debug("%s: cmd done status=%#x cmd_status=%#lx size=%#lx\n",
    197		 __func__, cmd->status, cmd->cmd_status, cmd->size);
    198	}
    199#endif
    200	complete(&cmd->done);
    201	pr_debug("%s: cmd='%s' done\n", __func__, cmdstr(cmd->cmd));
    202}
    203
    204static struct gelic_eurus_cmd *gelic_eurus_sync_cmd(struct gelic_wl_info *wl,
    205						    unsigned int eurus_cmd,
    206						    void *buffer,
    207						    unsigned int buf_size)
    208{
    209	struct gelic_eurus_cmd *cmd;
    210
    211	/* allocate cmd */
    212	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
    213	if (!cmd)
    214		return NULL;
    215
    216	/* initialize members */
    217	cmd->cmd = eurus_cmd;
    218	cmd->buffer = buffer;
    219	cmd->buf_size = buf_size;
    220	cmd->wl = wl;
    221	INIT_WORK(&cmd->work, gelic_eurus_sync_cmd_worker);
    222	init_completion(&cmd->done);
    223	queue_work(wl->eurus_cmd_queue, &cmd->work);
    224
    225	/* wait for command completion */
    226	wait_for_completion(&cmd->done);
    227
    228	return cmd;
    229}
    230
    231static u32 gelic_wl_get_link(struct net_device *netdev)
    232{
    233	struct gelic_wl_info *wl = port_wl(netdev_port(netdev));
    234	u32 ret;
    235
    236	pr_debug("%s: <-\n", __func__);
    237	mutex_lock(&wl->assoc_stat_lock);
    238	if (wl->assoc_stat == GELIC_WL_ASSOC_STAT_ASSOCIATED)
    239		ret = 1;
    240	else
    241		ret = 0;
    242	mutex_unlock(&wl->assoc_stat_lock);
    243	pr_debug("%s: ->\n", __func__);
    244	return ret;
    245}
    246
    247static void gelic_wl_send_iwap_event(struct gelic_wl_info *wl, u8 *bssid)
    248{
    249	union iwreq_data data;
    250
    251	memset(&data, 0, sizeof(data));
    252	if (bssid)
    253		memcpy(data.ap_addr.sa_data, bssid, ETH_ALEN);
    254	data.ap_addr.sa_family = ARPHRD_ETHER;
    255	wireless_send_event(port_to_netdev(wl_port(wl)), SIOCGIWAP,
    256			    &data, NULL);
    257}
    258
    259/*
    260 * wireless extension handlers and helpers
    261 */
    262
    263/* SIOGIWNAME */
    264static int gelic_wl_get_name(struct net_device *dev,
    265			     struct iw_request_info *info,
    266			     union iwreq_data *iwreq, char *extra)
    267{
    268	strcpy(iwreq->name, "IEEE 802.11bg");
    269	return 0;
    270}
    271
    272static void gelic_wl_get_ch_info(struct gelic_wl_info *wl)
    273{
    274	struct gelic_card *card = port_to_card(wl_port(wl));
    275	u64 ch_info_raw, tmp;
    276	int status;
    277
    278	if (!test_and_set_bit(GELIC_WL_STAT_CH_INFO, &wl->stat)) {
    279		status = lv1_net_control(bus_id(card), dev_id(card),
    280					 GELIC_LV1_GET_CHANNEL, 0, 0, 0,
    281					 &ch_info_raw,
    282					 &tmp);
    283		/* some fw versions may return error */
    284		if (status) {
    285			if (status != LV1_NO_ENTRY)
    286				pr_info("%s: available ch unknown\n", __func__);
    287			wl->ch_info = 0x07ff;/* 11 ch */
    288		} else
    289			/* 16 bits of MSB has available channels */
    290			wl->ch_info = ch_info_raw >> 48;
    291	}
    292}
    293
    294/* SIOGIWRANGE */
    295static int gelic_wl_get_range(struct net_device *netdev,
    296			      struct iw_request_info *info,
    297			      union iwreq_data *iwreq, char *extra)
    298{
    299	struct iw_point *point = &iwreq->data;
    300	struct iw_range *range = (struct iw_range *)extra;
    301	struct gelic_wl_info *wl = port_wl(netdev_port(netdev));
    302	unsigned int i, chs;
    303
    304	pr_debug("%s: <-\n", __func__);
    305	point->length = sizeof(struct iw_range);
    306	memset(range, 0, sizeof(struct iw_range));
    307
    308	range->we_version_compiled = WIRELESS_EXT;
    309	range->we_version_source = 22;
    310
    311	/* available channels and frequencies */
    312	gelic_wl_get_ch_info(wl);
    313
    314	for (i = 0, chs = 0;
    315	     i < NUM_CHANNELS && chs < IW_MAX_FREQUENCIES; i++)
    316		if (wl->ch_info & (1 << i)) {
    317			range->freq[chs].i = i + 1;
    318			range->freq[chs].m = channel_freq[i];
    319			range->freq[chs].e = 6;
    320			chs++;
    321		}
    322	range->num_frequency = chs;
    323	range->old_num_frequency = chs;
    324	range->num_channels = chs;
    325	range->old_num_channels = chs;
    326
    327	/* bitrates */
    328	for (i = 0; i < NUM_BITRATES; i++)
    329		range->bitrate[i] = bitrate_list[i];
    330	range->num_bitrates = i;
    331
    332	/* signal levels */
    333	range->max_qual.qual = 100; /* relative value */
    334	range->max_qual.level = 100;
    335	range->avg_qual.qual = 50;
    336	range->avg_qual.level = 50;
    337	range->sensitivity = 0;
    338
    339	/* Event capability */
    340	IW_EVENT_CAPA_SET_KERNEL(range->event_capa);
    341	IW_EVENT_CAPA_SET(range->event_capa, SIOCGIWAP);
    342	IW_EVENT_CAPA_SET(range->event_capa, SIOCGIWSCAN);
    343
    344	/* encryption capability */
    345	range->enc_capa = IW_ENC_CAPA_WPA |
    346		IW_ENC_CAPA_CIPHER_TKIP | IW_ENC_CAPA_CIPHER_CCMP |
    347		IW_ENC_CAPA_4WAY_HANDSHAKE;
    348	if (wpa2_capable())
    349		range->enc_capa |= IW_ENC_CAPA_WPA2;
    350	range->encoding_size[0] = 5;	/* 40bit WEP */
    351	range->encoding_size[1] = 13;	/* 104bit WEP */
    352	range->encoding_size[2] = 32;	/* WPA-PSK */
    353	range->num_encoding_sizes = 3;
    354	range->max_encoding_tokens = GELIC_WEP_KEYS;
    355
    356	/* scan capability */
    357	range->scan_capa = IW_SCAN_CAPA_ESSID;
    358
    359	pr_debug("%s: ->\n", __func__);
    360	return 0;
    361
    362}
    363
    364/* SIOC{G,S}IWSCAN */
    365static int gelic_wl_set_scan(struct net_device *netdev,
    366			   struct iw_request_info *info,
    367			   union iwreq_data *wrqu, char *extra)
    368{
    369	struct gelic_wl_info *wl = port_wl(netdev_priv(netdev));
    370	struct iw_scan_req *req;
    371	u8 *essid = NULL;
    372	size_t essid_len = 0;
    373
    374	if (wrqu->data.length == sizeof(struct iw_scan_req) &&
    375	    wrqu->data.flags & IW_SCAN_THIS_ESSID) {
    376		req = (struct iw_scan_req*)extra;
    377		essid = req->essid;
    378		essid_len = req->essid_len;
    379		pr_debug("%s: ESSID scan =%s\n", __func__, essid);
    380	}
    381	return gelic_wl_start_scan(wl, 1, essid, essid_len);
    382}
    383
    384#define OUI_LEN 3
    385static const u8 rsn_oui[OUI_LEN] = { 0x00, 0x0f, 0xac };
    386static const u8 wpa_oui[OUI_LEN] = { 0x00, 0x50, 0xf2 };
    387
    388/*
    389 * synthesize WPA/RSN IE data
    390 * See WiFi WPA specification and IEEE 802.11-2007 7.3.2.25
    391 * for the format
    392 */
    393static size_t gelic_wl_synthesize_ie(u8 *buf,
    394				     struct gelic_eurus_scan_info *scan)
    395{
    396
    397	const u8 *oui_header;
    398	u8 *start = buf;
    399	int rsn;
    400	int ccmp;
    401
    402	pr_debug("%s: <- sec=%16x\n", __func__, scan->security);
    403	switch (be16_to_cpu(scan->security) & GELIC_EURUS_SCAN_SEC_MASK) {
    404	case GELIC_EURUS_SCAN_SEC_WPA:
    405		rsn = 0;
    406		break;
    407	case GELIC_EURUS_SCAN_SEC_WPA2:
    408		rsn = 1;
    409		break;
    410	default:
    411		/* WEP or none.  No IE returned */
    412		return 0;
    413	}
    414
    415	switch (be16_to_cpu(scan->security) & GELIC_EURUS_SCAN_SEC_WPA_MASK) {
    416	case GELIC_EURUS_SCAN_SEC_WPA_TKIP:
    417		ccmp = 0;
    418		break;
    419	case GELIC_EURUS_SCAN_SEC_WPA_AES:
    420		ccmp = 1;
    421		break;
    422	default:
    423		if (rsn) {
    424			ccmp = 1;
    425			pr_info("%s: no cipher info. defaulted to CCMP\n",
    426				__func__);
    427		} else {
    428			ccmp = 0;
    429			pr_info("%s: no cipher info. defaulted to TKIP\n",
    430				__func__);
    431		}
    432	}
    433
    434	if (rsn)
    435		oui_header = rsn_oui;
    436	else
    437		oui_header = wpa_oui;
    438
    439	/* element id */
    440	if (rsn)
    441		*buf++ = WLAN_EID_RSN;
    442	else
    443		*buf++ = WLAN_EID_VENDOR_SPECIFIC;
    444
    445	/* length filed; set later */
    446	buf++;
    447
    448	/* wpa special header */
    449	if (!rsn) {
    450		memcpy(buf, wpa_oui, OUI_LEN);
    451		buf += OUI_LEN;
    452		*buf++ = 0x01;
    453	}
    454
    455	/* version */
    456	*buf++ = 0x01; /* version 1.0 */
    457	*buf++ = 0x00;
    458
    459	/* group cipher */
    460	memcpy(buf, oui_header, OUI_LEN);
    461	buf += OUI_LEN;
    462
    463	if (ccmp)
    464		*buf++ = 0x04; /* CCMP */
    465	else
    466		*buf++ = 0x02; /* TKIP */
    467
    468	/* pairwise key count always 1 */
    469	*buf++ = 0x01;
    470	*buf++ = 0x00;
    471
    472	/* pairwise key suit */
    473	memcpy(buf, oui_header, OUI_LEN);
    474	buf += OUI_LEN;
    475	if (ccmp)
    476		*buf++ = 0x04; /* CCMP */
    477	else
    478		*buf++ = 0x02; /* TKIP */
    479
    480	/* AKM count is 1 */
    481	*buf++ = 0x01;
    482	*buf++ = 0x00;
    483
    484	/* AKM suite is assumed as PSK*/
    485	memcpy(buf, oui_header, OUI_LEN);
    486	buf += OUI_LEN;
    487	*buf++ = 0x02; /* PSK */
    488
    489	/* RSN capabilities is 0 */
    490	*buf++ = 0x00;
    491	*buf++ = 0x00;
    492
    493	/* set length field */
    494	start[1] = (buf - start - 2);
    495
    496	pr_debug("%s: ->\n", __func__);
    497	return buf - start;
    498}
    499
    500struct ie_item {
    501	u8 *data;
    502	u8 len;
    503};
    504
    505struct ie_info {
    506	struct ie_item wpa;
    507	struct ie_item rsn;
    508};
    509
    510static void gelic_wl_parse_ie(u8 *data, size_t len,
    511			      struct ie_info *ie_info)
    512{
    513	size_t data_left = len;
    514	u8 *pos = data;
    515	u8 item_len;
    516	u8 item_id;
    517
    518	pr_debug("%s: data=%p len=%ld\n", __func__,
    519		 data, len);
    520	memset(ie_info, 0, sizeof(struct ie_info));
    521
    522	while (2 <= data_left) {
    523		item_id = *pos++;
    524		item_len = *pos++;
    525		data_left -= 2;
    526
    527		if (data_left < item_len)
    528			break;
    529
    530		switch (item_id) {
    531		case WLAN_EID_VENDOR_SPECIFIC:
    532			if ((OUI_LEN + 1 <= item_len) &&
    533			    !memcmp(pos, wpa_oui, OUI_LEN) &&
    534			    pos[OUI_LEN] == 0x01) {
    535				ie_info->wpa.data = pos - 2;
    536				ie_info->wpa.len = item_len + 2;
    537			}
    538			break;
    539		case WLAN_EID_RSN:
    540			ie_info->rsn.data = pos - 2;
    541			/* length includes the header */
    542			ie_info->rsn.len = item_len + 2;
    543			break;
    544		default:
    545			pr_debug("%s: ignore %#x,%d\n", __func__,
    546				 item_id, item_len);
    547			break;
    548		}
    549		pos += item_len;
    550		data_left -= item_len;
    551	}
    552	pr_debug("%s: wpa=%p,%d wpa2=%p,%d\n", __func__,
    553		 ie_info->wpa.data, ie_info->wpa.len,
    554		 ie_info->rsn.data, ie_info->rsn.len);
    555}
    556
    557
    558/*
    559 * translate the scan informations from hypervisor to a
    560 * independent format
    561 */
    562static char *gelic_wl_translate_scan(struct net_device *netdev,
    563				     struct iw_request_info *info,
    564				     char *ev,
    565				     char *stop,
    566				     struct gelic_wl_scan_info *network)
    567{
    568	struct iw_event iwe;
    569	struct gelic_eurus_scan_info *scan = network->hwinfo;
    570	char *tmp;
    571	u8 rate;
    572	unsigned int i, j, len;
    573	u8 buf[64]; /* arbitrary size large enough */
    574
    575	pr_debug("%s: <-\n", __func__);
    576
    577	/* first entry should be AP's mac address */
    578	iwe.cmd = SIOCGIWAP;
    579	iwe.u.ap_addr.sa_family = ARPHRD_ETHER;
    580	memcpy(iwe.u.ap_addr.sa_data, &scan->bssid[2], ETH_ALEN);
    581	ev = iwe_stream_add_event(info, ev, stop, &iwe, IW_EV_ADDR_LEN);
    582
    583	/* ESSID */
    584	iwe.cmd = SIOCGIWESSID;
    585	iwe.u.data.flags = 1;
    586	iwe.u.data.length = strnlen(scan->essid, 32);
    587	ev = iwe_stream_add_point(info, ev, stop, &iwe, scan->essid);
    588
    589	/* FREQUENCY */
    590	iwe.cmd = SIOCGIWFREQ;
    591	iwe.u.freq.m = be16_to_cpu(scan->channel);
    592	iwe.u.freq.e = 0; /* table value in MHz */
    593	iwe.u.freq.i = 0;
    594	ev = iwe_stream_add_event(info, ev, stop, &iwe, IW_EV_FREQ_LEN);
    595
    596	/* RATES */
    597	iwe.cmd = SIOCGIWRATE;
    598	iwe.u.bitrate.fixed = iwe.u.bitrate.disabled = 0;
    599	/* to stuff multiple values in one event */
    600	tmp = ev + iwe_stream_lcp_len(info);
    601	/* put them in ascendant order (older is first) */
    602	i = 0;
    603	j = 0;
    604	pr_debug("%s: rates=%d rate=%d\n", __func__,
    605		 network->rate_len, network->rate_ext_len);
    606	while (i < network->rate_len) {
    607		if (j < network->rate_ext_len &&
    608		    ((scan->ext_rate[j] & 0x7f) < (scan->rate[i] & 0x7f)))
    609		    rate = scan->ext_rate[j++] & 0x7f;
    610		else
    611		    rate = scan->rate[i++] & 0x7f;
    612		iwe.u.bitrate.value = rate * 500000; /* 500kbps unit */
    613		tmp = iwe_stream_add_value(info, ev, tmp, stop, &iwe,
    614					   IW_EV_PARAM_LEN);
    615	}
    616	while (j < network->rate_ext_len) {
    617		iwe.u.bitrate.value = (scan->ext_rate[j++] & 0x7f) * 500000;
    618		tmp = iwe_stream_add_value(info, ev, tmp, stop, &iwe,
    619					   IW_EV_PARAM_LEN);
    620	}
    621	/* Check if we added any rate */
    622	if (iwe_stream_lcp_len(info) < (tmp - ev))
    623		ev = tmp;
    624
    625	/* ENCODE */
    626	iwe.cmd = SIOCGIWENCODE;
    627	if (be16_to_cpu(scan->capability) & WLAN_CAPABILITY_PRIVACY)
    628		iwe.u.data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY;
    629	else
    630		iwe.u.data.flags = IW_ENCODE_DISABLED;
    631	iwe.u.data.length = 0;
    632	ev = iwe_stream_add_point(info, ev, stop, &iwe, scan->essid);
    633
    634	/* MODE */
    635	iwe.cmd = SIOCGIWMODE;
    636	if (be16_to_cpu(scan->capability) &
    637	    (WLAN_CAPABILITY_ESS | WLAN_CAPABILITY_IBSS)) {
    638		if (be16_to_cpu(scan->capability) & WLAN_CAPABILITY_ESS)
    639			iwe.u.mode = IW_MODE_MASTER;
    640		else
    641			iwe.u.mode = IW_MODE_ADHOC;
    642		ev = iwe_stream_add_event(info, ev, stop, &iwe, IW_EV_UINT_LEN);
    643	}
    644
    645	/* QUAL */
    646	iwe.cmd = IWEVQUAL;
    647	iwe.u.qual.updated  = IW_QUAL_ALL_UPDATED |
    648			IW_QUAL_QUAL_INVALID | IW_QUAL_NOISE_INVALID;
    649	iwe.u.qual.level = be16_to_cpu(scan->rssi);
    650	iwe.u.qual.qual = be16_to_cpu(scan->rssi);
    651	iwe.u.qual.noise = 0;
    652	ev  = iwe_stream_add_event(info, ev, stop, &iwe, IW_EV_QUAL_LEN);
    653
    654	/* RSN */
    655	memset(&iwe, 0, sizeof(iwe));
    656	if (be16_to_cpu(scan->size) <= sizeof(*scan)) {
    657		/* If wpa[2] capable station, synthesize IE and put it */
    658		len = gelic_wl_synthesize_ie(buf, scan);
    659		if (len) {
    660			iwe.cmd = IWEVGENIE;
    661			iwe.u.data.length = len;
    662			ev = iwe_stream_add_point(info, ev, stop, &iwe, buf);
    663		}
    664	} else {
    665		/* this scan info has IE data */
    666		struct ie_info ie_info;
    667		size_t data_len;
    668
    669		data_len = be16_to_cpu(scan->size) - sizeof(*scan);
    670
    671		gelic_wl_parse_ie(scan->elements, data_len, &ie_info);
    672
    673		if (ie_info.wpa.len && (ie_info.wpa.len <= sizeof(buf))) {
    674			memcpy(buf, ie_info.wpa.data, ie_info.wpa.len);
    675			iwe.cmd = IWEVGENIE;
    676			iwe.u.data.length = ie_info.wpa.len;
    677			ev = iwe_stream_add_point(info, ev, stop, &iwe, buf);
    678		}
    679
    680		if (ie_info.rsn.len && (ie_info.rsn.len <= sizeof(buf))) {
    681			memset(&iwe, 0, sizeof(iwe));
    682			memcpy(buf, ie_info.rsn.data, ie_info.rsn.len);
    683			iwe.cmd = IWEVGENIE;
    684			iwe.u.data.length = ie_info.rsn.len;
    685			ev = iwe_stream_add_point(info, ev, stop, &iwe, buf);
    686		}
    687	}
    688
    689	pr_debug("%s: ->\n", __func__);
    690	return ev;
    691}
    692
    693
    694static int gelic_wl_get_scan(struct net_device *netdev,
    695			     struct iw_request_info *info,
    696			     union iwreq_data *wrqu, char *extra)
    697{
    698	struct gelic_wl_info *wl = port_wl(netdev_priv(netdev));
    699	struct gelic_wl_scan_info *scan_info;
    700	char *ev = extra;
    701	char *stop = ev + wrqu->data.length;
    702	int ret = 0;
    703	unsigned long this_time = jiffies;
    704
    705	pr_debug("%s: <-\n", __func__);
    706	if (mutex_lock_interruptible(&wl->scan_lock))
    707		return -EAGAIN;
    708
    709	switch (wl->scan_stat) {
    710	case GELIC_WL_SCAN_STAT_SCANNING:
    711		/* If a scan in progress, caller should call me again */
    712		ret = -EAGAIN;
    713		goto out;
    714	case GELIC_WL_SCAN_STAT_INIT:
    715		/* last scan request failed or never issued */
    716		ret = -ENODEV;
    717		goto out;
    718	case GELIC_WL_SCAN_STAT_GOT_LIST:
    719		/* ok, use current list */
    720		break;
    721	}
    722
    723	list_for_each_entry(scan_info, &wl->network_list, list) {
    724		if (wl->scan_age == 0 ||
    725		    time_after(scan_info->last_scanned + wl->scan_age,
    726			       this_time))
    727			ev = gelic_wl_translate_scan(netdev, info,
    728						     ev, stop,
    729						     scan_info);
    730		else
    731			pr_debug("%s:entry too old\n", __func__);
    732
    733		if (stop - ev <= IW_EV_ADDR_LEN) {
    734			ret = -E2BIG;
    735			goto out;
    736		}
    737	}
    738
    739	wrqu->data.length = ev - extra;
    740	wrqu->data.flags = 0;
    741out:
    742	mutex_unlock(&wl->scan_lock);
    743	pr_debug("%s: -> %d %d\n", __func__, ret, wrqu->data.length);
    744	return ret;
    745}
    746
    747#ifdef DEBUG
    748static void scan_list_dump(struct gelic_wl_info *wl)
    749{
    750	struct gelic_wl_scan_info *scan_info;
    751	int i;
    752
    753	i = 0;
    754	list_for_each_entry(scan_info, &wl->network_list, list) {
    755		pr_debug("%s: item %d\n", __func__, i++);
    756		pr_debug("valid=%d eurusindex=%d last=%lx\n",
    757			 scan_info->valid, scan_info->eurus_index,
    758			 scan_info->last_scanned);
    759		pr_debug("r_len=%d r_ext_len=%d essid_len=%d\n",
    760			 scan_info->rate_len, scan_info->rate_ext_len,
    761			 scan_info->essid_len);
    762		/* -- */
    763		pr_debug("bssid=%pM\n", &scan_info->hwinfo->bssid[2]);
    764		pr_debug("essid=%s\n", scan_info->hwinfo->essid);
    765	}
    766}
    767#endif
    768
    769static int gelic_wl_set_auth(struct net_device *netdev,
    770			     struct iw_request_info *info,
    771			     union iwreq_data *data, char *extra)
    772{
    773	struct iw_param *param = &data->param;
    774	struct gelic_wl_info *wl = port_wl(netdev_port(netdev));
    775	unsigned long irqflag;
    776	int ret = 0;
    777
    778	pr_debug("%s: <- %d\n", __func__, param->flags & IW_AUTH_INDEX);
    779	spin_lock_irqsave(&wl->lock, irqflag);
    780	switch (param->flags & IW_AUTH_INDEX) {
    781	case IW_AUTH_WPA_VERSION:
    782		if (param->value & IW_AUTH_WPA_VERSION_DISABLED) {
    783			pr_debug("%s: NO WPA selected\n", __func__);
    784			wl->wpa_level = GELIC_WL_WPA_LEVEL_NONE;
    785			wl->group_cipher_method = GELIC_WL_CIPHER_WEP;
    786			wl->pairwise_cipher_method = GELIC_WL_CIPHER_WEP;
    787		}
    788		if (param->value & IW_AUTH_WPA_VERSION_WPA) {
    789			pr_debug("%s: WPA version 1 selected\n", __func__);
    790			wl->wpa_level = GELIC_WL_WPA_LEVEL_WPA;
    791			wl->group_cipher_method = GELIC_WL_CIPHER_TKIP;
    792			wl->pairwise_cipher_method = GELIC_WL_CIPHER_TKIP;
    793			wl->auth_method = GELIC_EURUS_AUTH_OPEN;
    794		}
    795		if (param->value & IW_AUTH_WPA_VERSION_WPA2) {
    796			/*
    797			 * As the hypervisor may not tell the cipher
    798			 * information of the AP if it is WPA2,
    799			 * you will not decide suitable cipher from
    800			 * its beacon.
    801			 * You should have knowledge about the AP's
    802			 * cipher information in other method prior to
    803			 * the association.
    804			 */
    805			if (!precise_ie())
    806				pr_info("%s: WPA2 may not work\n", __func__);
    807			if (wpa2_capable()) {
    808				wl->wpa_level = GELIC_WL_WPA_LEVEL_WPA2;
    809				wl->group_cipher_method = GELIC_WL_CIPHER_AES;
    810				wl->pairwise_cipher_method =
    811					GELIC_WL_CIPHER_AES;
    812				wl->auth_method = GELIC_EURUS_AUTH_OPEN;
    813			} else
    814				ret = -EINVAL;
    815		}
    816		break;
    817
    818	case IW_AUTH_CIPHER_PAIRWISE:
    819		if (param->value &
    820		    (IW_AUTH_CIPHER_WEP104 | IW_AUTH_CIPHER_WEP40)) {
    821			pr_debug("%s: WEP selected\n", __func__);
    822			wl->pairwise_cipher_method = GELIC_WL_CIPHER_WEP;
    823		}
    824		if (param->value & IW_AUTH_CIPHER_TKIP) {
    825			pr_debug("%s: TKIP selected\n", __func__);
    826			wl->pairwise_cipher_method = GELIC_WL_CIPHER_TKIP;
    827		}
    828		if (param->value & IW_AUTH_CIPHER_CCMP) {
    829			pr_debug("%s: CCMP selected\n", __func__);
    830			wl->pairwise_cipher_method = GELIC_WL_CIPHER_AES;
    831		}
    832		if (param->value & IW_AUTH_CIPHER_NONE) {
    833			pr_debug("%s: no auth selected\n", __func__);
    834			wl->pairwise_cipher_method = GELIC_WL_CIPHER_NONE;
    835		}
    836		break;
    837	case IW_AUTH_CIPHER_GROUP:
    838		if (param->value &
    839		    (IW_AUTH_CIPHER_WEP104 | IW_AUTH_CIPHER_WEP40)) {
    840			pr_debug("%s: WEP selected\n", __func__);
    841			wl->group_cipher_method = GELIC_WL_CIPHER_WEP;
    842		}
    843		if (param->value & IW_AUTH_CIPHER_TKIP) {
    844			pr_debug("%s: TKIP selected\n", __func__);
    845			wl->group_cipher_method = GELIC_WL_CIPHER_TKIP;
    846		}
    847		if (param->value & IW_AUTH_CIPHER_CCMP) {
    848			pr_debug("%s: CCMP selected\n", __func__);
    849			wl->group_cipher_method = GELIC_WL_CIPHER_AES;
    850		}
    851		if (param->value & IW_AUTH_CIPHER_NONE) {
    852			pr_debug("%s: no auth selected\n", __func__);
    853			wl->group_cipher_method = GELIC_WL_CIPHER_NONE;
    854		}
    855		break;
    856	case IW_AUTH_80211_AUTH_ALG:
    857		if (param->value & IW_AUTH_ALG_SHARED_KEY) {
    858			pr_debug("%s: shared key specified\n", __func__);
    859			wl->auth_method = GELIC_EURUS_AUTH_SHARED;
    860		} else if (param->value & IW_AUTH_ALG_OPEN_SYSTEM) {
    861			pr_debug("%s: open system specified\n", __func__);
    862			wl->auth_method = GELIC_EURUS_AUTH_OPEN;
    863		} else
    864			ret = -EINVAL;
    865		break;
    866
    867	case IW_AUTH_WPA_ENABLED:
    868		if (param->value) {
    869			pr_debug("%s: WPA enabled\n", __func__);
    870			wl->wpa_level = GELIC_WL_WPA_LEVEL_WPA;
    871		} else {
    872			pr_debug("%s: WPA disabled\n", __func__);
    873			wl->wpa_level = GELIC_WL_WPA_LEVEL_NONE;
    874		}
    875		break;
    876
    877	case IW_AUTH_KEY_MGMT:
    878		if (param->value & IW_AUTH_KEY_MGMT_PSK)
    879			break;
    880		fallthrough;
    881	default:
    882		ret = -EOPNOTSUPP;
    883		break;
    884	}
    885
    886	if (!ret)
    887		set_bit(GELIC_WL_STAT_CONFIGURED, &wl->stat);
    888
    889	spin_unlock_irqrestore(&wl->lock, irqflag);
    890	pr_debug("%s: -> %d\n", __func__, ret);
    891	return ret;
    892}
    893
    894static int gelic_wl_get_auth(struct net_device *netdev,
    895			     struct iw_request_info *info,
    896			     union iwreq_data *iwreq, char *extra)
    897{
    898	struct iw_param *param = &iwreq->param;
    899	struct gelic_wl_info *wl = port_wl(netdev_port(netdev));
    900	unsigned long irqflag;
    901	int ret = 0;
    902
    903	pr_debug("%s: <- %d\n", __func__, param->flags & IW_AUTH_INDEX);
    904	spin_lock_irqsave(&wl->lock, irqflag);
    905	switch (param->flags & IW_AUTH_INDEX) {
    906	case IW_AUTH_WPA_VERSION:
    907		switch (wl->wpa_level) {
    908		case GELIC_WL_WPA_LEVEL_WPA:
    909			param->value |= IW_AUTH_WPA_VERSION_WPA;
    910			break;
    911		case GELIC_WL_WPA_LEVEL_WPA2:
    912			param->value |= IW_AUTH_WPA_VERSION_WPA2;
    913			break;
    914		default:
    915			param->value |= IW_AUTH_WPA_VERSION_DISABLED;
    916		}
    917		break;
    918
    919	case IW_AUTH_80211_AUTH_ALG:
    920		if (wl->auth_method == GELIC_EURUS_AUTH_SHARED)
    921			param->value = IW_AUTH_ALG_SHARED_KEY;
    922		else if (wl->auth_method == GELIC_EURUS_AUTH_OPEN)
    923			param->value = IW_AUTH_ALG_OPEN_SYSTEM;
    924		break;
    925
    926	case IW_AUTH_WPA_ENABLED:
    927		switch (wl->wpa_level) {
    928		case GELIC_WL_WPA_LEVEL_WPA:
    929		case GELIC_WL_WPA_LEVEL_WPA2:
    930			param->value = 1;
    931			break;
    932		default:
    933			param->value = 0;
    934			break;
    935		}
    936		break;
    937	default:
    938		ret = -EOPNOTSUPP;
    939	}
    940
    941	spin_unlock_irqrestore(&wl->lock, irqflag);
    942	pr_debug("%s: -> %d\n", __func__, ret);
    943	return ret;
    944}
    945
    946/* SIOC{S,G}IWESSID */
    947static int gelic_wl_set_essid(struct net_device *netdev,
    948			      struct iw_request_info *info,
    949			      union iwreq_data *data, char *extra)
    950{
    951	struct gelic_wl_info *wl = port_wl(netdev_priv(netdev));
    952	unsigned long irqflag;
    953
    954	pr_debug("%s: <- l=%d f=%d\n", __func__,
    955		 data->essid.length, data->essid.flags);
    956	if (IW_ESSID_MAX_SIZE < data->essid.length)
    957		return -EINVAL;
    958
    959	spin_lock_irqsave(&wl->lock, irqflag);
    960	if (data->essid.flags) {
    961		wl->essid_len = data->essid.length;
    962		memcpy(wl->essid, extra, wl->essid_len);
    963		pr_debug("%s: essid = '%s'\n", __func__, extra);
    964		set_bit(GELIC_WL_STAT_ESSID_SET, &wl->stat);
    965	} else {
    966		pr_debug("%s: ESSID any\n", __func__);
    967		clear_bit(GELIC_WL_STAT_ESSID_SET, &wl->stat);
    968	}
    969	set_bit(GELIC_WL_STAT_CONFIGURED, &wl->stat);
    970	spin_unlock_irqrestore(&wl->lock, irqflag);
    971
    972
    973	gelic_wl_try_associate(netdev); /* FIXME */
    974	pr_debug("%s: ->\n", __func__);
    975	return 0;
    976}
    977
    978static int gelic_wl_get_essid(struct net_device *netdev,
    979			      struct iw_request_info *info,
    980			      union iwreq_data *data, char *extra)
    981{
    982	struct gelic_wl_info *wl = port_wl(netdev_priv(netdev));
    983	unsigned long irqflag;
    984
    985	pr_debug("%s: <-\n", __func__);
    986	mutex_lock(&wl->assoc_stat_lock);
    987	spin_lock_irqsave(&wl->lock, irqflag);
    988	if (test_bit(GELIC_WL_STAT_ESSID_SET, &wl->stat) ||
    989	    wl->assoc_stat == GELIC_WL_ASSOC_STAT_ASSOCIATED) {
    990		memcpy(extra, wl->essid, wl->essid_len);
    991		data->essid.length = wl->essid_len;
    992		data->essid.flags = 1;
    993	} else
    994		data->essid.flags = 0;
    995
    996	mutex_unlock(&wl->assoc_stat_lock);
    997	spin_unlock_irqrestore(&wl->lock, irqflag);
    998	pr_debug("%s: -> len=%d\n", __func__, data->essid.length);
    999
   1000	return 0;
   1001}
   1002
   1003/* SIO{S,G}IWENCODE */
   1004static int gelic_wl_set_encode(struct net_device *netdev,
   1005			       struct iw_request_info *info,
   1006			       union iwreq_data *data, char *extra)
   1007{
   1008	struct gelic_wl_info *wl = port_wl(netdev_priv(netdev));
   1009	struct iw_point *enc = &data->encoding;
   1010	__u16 flags;
   1011	unsigned long irqflag;
   1012	int key_index, index_specified;
   1013	int ret = 0;
   1014
   1015	pr_debug("%s: <-\n", __func__);
   1016	flags = enc->flags & IW_ENCODE_FLAGS;
   1017	key_index = enc->flags & IW_ENCODE_INDEX;
   1018
   1019	pr_debug("%s: key_index = %d\n", __func__, key_index);
   1020	pr_debug("%s: key_len = %d\n", __func__, enc->length);
   1021	pr_debug("%s: flag=%x\n", __func__, enc->flags & IW_ENCODE_FLAGS);
   1022
   1023	if (GELIC_WEP_KEYS < key_index)
   1024		return -EINVAL;
   1025
   1026	spin_lock_irqsave(&wl->lock, irqflag);
   1027	if (key_index) {
   1028		index_specified = 1;
   1029		key_index--;
   1030	} else {
   1031		index_specified = 0;
   1032		key_index = wl->current_key;
   1033	}
   1034
   1035	if (flags & IW_ENCODE_NOKEY) {
   1036		/* if just IW_ENCODE_NOKEY, change current key index */
   1037		if (!flags && index_specified) {
   1038			wl->current_key = key_index;
   1039			goto done;
   1040		}
   1041
   1042		if (flags & IW_ENCODE_DISABLED) {
   1043			if (!index_specified) {
   1044				/* disable encryption */
   1045				wl->group_cipher_method = GELIC_WL_CIPHER_NONE;
   1046				wl->pairwise_cipher_method =
   1047					GELIC_WL_CIPHER_NONE;
   1048				/* invalidate all key */
   1049				wl->key_enabled = 0;
   1050			} else
   1051				clear_bit(key_index, &wl->key_enabled);
   1052		}
   1053
   1054		if (flags & IW_ENCODE_OPEN)
   1055			wl->auth_method = GELIC_EURUS_AUTH_OPEN;
   1056		if (flags & IW_ENCODE_RESTRICTED) {
   1057			pr_info("%s: shared key mode enabled\n", __func__);
   1058			wl->auth_method = GELIC_EURUS_AUTH_SHARED;
   1059		}
   1060	} else {
   1061		if (IW_ENCODING_TOKEN_MAX < enc->length) {
   1062			ret = -EINVAL;
   1063			goto done;
   1064		}
   1065		wl->key_len[key_index] = enc->length;
   1066		memcpy(wl->key[key_index], extra, enc->length);
   1067		set_bit(key_index, &wl->key_enabled);
   1068		wl->pairwise_cipher_method = GELIC_WL_CIPHER_WEP;
   1069		wl->group_cipher_method = GELIC_WL_CIPHER_WEP;
   1070	}
   1071	set_bit(GELIC_WL_STAT_CONFIGURED, &wl->stat);
   1072done:
   1073	spin_unlock_irqrestore(&wl->lock, irqflag);
   1074	pr_debug("%s: ->\n", __func__);
   1075	return ret;
   1076}
   1077
   1078static int gelic_wl_get_encode(struct net_device *netdev,
   1079			       struct iw_request_info *info,
   1080			       union iwreq_data *data, char *extra)
   1081{
   1082	struct gelic_wl_info *wl = port_wl(netdev_priv(netdev));
   1083	struct iw_point *enc = &data->encoding;
   1084	unsigned long irqflag;
   1085	unsigned int key_index;
   1086	int ret = 0;
   1087
   1088	pr_debug("%s: <-\n", __func__);
   1089	key_index = enc->flags & IW_ENCODE_INDEX;
   1090	pr_debug("%s: flag=%#x point=%p len=%d extra=%p\n", __func__,
   1091		 enc->flags, enc->pointer, enc->length, extra);
   1092	if (GELIC_WEP_KEYS < key_index)
   1093		return -EINVAL;
   1094
   1095	spin_lock_irqsave(&wl->lock, irqflag);
   1096	if (key_index)
   1097		key_index--;
   1098	else
   1099		key_index = wl->current_key;
   1100
   1101	if (wl->group_cipher_method == GELIC_WL_CIPHER_WEP) {
   1102		switch (wl->auth_method) {
   1103		case GELIC_EURUS_AUTH_OPEN:
   1104			enc->flags = IW_ENCODE_OPEN;
   1105			break;
   1106		case GELIC_EURUS_AUTH_SHARED:
   1107			enc->flags = IW_ENCODE_RESTRICTED;
   1108			break;
   1109		}
   1110	} else
   1111		enc->flags = IW_ENCODE_DISABLED;
   1112
   1113	if (test_bit(key_index, &wl->key_enabled)) {
   1114		if (enc->length < wl->key_len[key_index]) {
   1115			ret = -EINVAL;
   1116			goto done;
   1117		}
   1118		enc->length = wl->key_len[key_index];
   1119		memcpy(extra, wl->key[key_index], wl->key_len[key_index]);
   1120	} else {
   1121		enc->length = 0;
   1122		enc->flags |= IW_ENCODE_NOKEY;
   1123	}
   1124	enc->flags |= key_index + 1;
   1125	pr_debug("%s: -> flag=%x len=%d\n", __func__,
   1126		 enc->flags, enc->length);
   1127
   1128done:
   1129	spin_unlock_irqrestore(&wl->lock, irqflag);
   1130	return ret;
   1131}
   1132
   1133/* SIOC{S,G}IWAP */
   1134static int gelic_wl_set_ap(struct net_device *netdev,
   1135			   struct iw_request_info *info,
   1136			   union iwreq_data *data, char *extra)
   1137{
   1138	struct gelic_wl_info *wl = port_wl(netdev_priv(netdev));
   1139	unsigned long irqflag;
   1140
   1141	pr_debug("%s: <-\n", __func__);
   1142	if (data->ap_addr.sa_family != ARPHRD_ETHER)
   1143		return -EINVAL;
   1144
   1145	spin_lock_irqsave(&wl->lock, irqflag);
   1146	if (is_valid_ether_addr(data->ap_addr.sa_data)) {
   1147		memcpy(wl->bssid, data->ap_addr.sa_data,
   1148		       ETH_ALEN);
   1149		set_bit(GELIC_WL_STAT_BSSID_SET, &wl->stat);
   1150		set_bit(GELIC_WL_STAT_CONFIGURED, &wl->stat);
   1151		pr_debug("%s: bss=%pM\n", __func__, wl->bssid);
   1152	} else {
   1153		pr_debug("%s: clear bssid\n", __func__);
   1154		clear_bit(GELIC_WL_STAT_BSSID_SET, &wl->stat);
   1155		eth_zero_addr(wl->bssid);
   1156	}
   1157	spin_unlock_irqrestore(&wl->lock, irqflag);
   1158	pr_debug("%s: ->\n", __func__);
   1159	return 0;
   1160}
   1161
   1162static int gelic_wl_get_ap(struct net_device *netdev,
   1163			   struct iw_request_info *info,
   1164			   union iwreq_data *data, char *extra)
   1165{
   1166	struct gelic_wl_info *wl = port_wl(netdev_priv(netdev));
   1167	unsigned long irqflag;
   1168
   1169	pr_debug("%s: <-\n", __func__);
   1170	mutex_lock(&wl->assoc_stat_lock);
   1171	spin_lock_irqsave(&wl->lock, irqflag);
   1172	if (wl->assoc_stat == GELIC_WL_ASSOC_STAT_ASSOCIATED) {
   1173		data->ap_addr.sa_family = ARPHRD_ETHER;
   1174		memcpy(data->ap_addr.sa_data, wl->active_bssid,
   1175		       ETH_ALEN);
   1176	} else
   1177		eth_zero_addr(data->ap_addr.sa_data);
   1178
   1179	spin_unlock_irqrestore(&wl->lock, irqflag);
   1180	mutex_unlock(&wl->assoc_stat_lock);
   1181	pr_debug("%s: ->\n", __func__);
   1182	return 0;
   1183}
   1184
   1185/* SIOC{S,G}IWENCODEEXT */
   1186static int gelic_wl_set_encodeext(struct net_device *netdev,
   1187				  struct iw_request_info *info,
   1188				  union iwreq_data *data, char *extra)
   1189{
   1190	struct gelic_wl_info *wl = port_wl(netdev_priv(netdev));
   1191	struct iw_point *enc = &data->encoding;
   1192	struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;
   1193	__u16 alg;
   1194	__u16 flags;
   1195	unsigned long irqflag;
   1196	int key_index;
   1197	int ret = 0;
   1198
   1199	pr_debug("%s: <-\n", __func__);
   1200	flags = enc->flags & IW_ENCODE_FLAGS;
   1201	alg = ext->alg;
   1202	key_index = enc->flags & IW_ENCODE_INDEX;
   1203
   1204	pr_debug("%s: key_index = %d\n", __func__, key_index);
   1205	pr_debug("%s: key_len = %d\n", __func__, enc->length);
   1206	pr_debug("%s: flag=%x\n", __func__, enc->flags & IW_ENCODE_FLAGS);
   1207	pr_debug("%s: ext_flag=%x\n", __func__, ext->ext_flags);
   1208	pr_debug("%s: ext_key_len=%x\n", __func__, ext->key_len);
   1209
   1210	if (GELIC_WEP_KEYS < key_index)
   1211		return -EINVAL;
   1212
   1213	spin_lock_irqsave(&wl->lock, irqflag);
   1214	if (key_index)
   1215		key_index--;
   1216	else
   1217		key_index = wl->current_key;
   1218
   1219	if (!enc->length && (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY)) {
   1220		/* reques to change default key index */
   1221		pr_debug("%s: request to change default key to %d\n",
   1222			 __func__, key_index);
   1223		wl->current_key = key_index;
   1224		goto done;
   1225	}
   1226
   1227	if (alg == IW_ENCODE_ALG_NONE || (flags & IW_ENCODE_DISABLED)) {
   1228		pr_debug("%s: alg disabled\n", __func__);
   1229		wl->wpa_level = GELIC_WL_WPA_LEVEL_NONE;
   1230		wl->group_cipher_method = GELIC_WL_CIPHER_NONE;
   1231		wl->pairwise_cipher_method = GELIC_WL_CIPHER_NONE;
   1232		wl->auth_method = GELIC_EURUS_AUTH_OPEN; /* should be open */
   1233	} else if (alg == IW_ENCODE_ALG_WEP) {
   1234		pr_debug("%s: WEP requested\n", __func__);
   1235		if (flags & IW_ENCODE_OPEN) {
   1236			pr_debug("%s: open key mode\n", __func__);
   1237			wl->auth_method = GELIC_EURUS_AUTH_OPEN;
   1238		}
   1239		if (flags & IW_ENCODE_RESTRICTED) {
   1240			pr_debug("%s: shared key mode\n", __func__);
   1241			wl->auth_method = GELIC_EURUS_AUTH_SHARED;
   1242		}
   1243		if (IW_ENCODING_TOKEN_MAX < ext->key_len) {
   1244			pr_info("%s: key is too long %d\n", __func__,
   1245				ext->key_len);
   1246			ret = -EINVAL;
   1247			goto done;
   1248		}
   1249		/* OK, update the key */
   1250		wl->key_len[key_index] = ext->key_len;
   1251		memset(wl->key[key_index], 0, IW_ENCODING_TOKEN_MAX);
   1252		memcpy(wl->key[key_index], ext->key, ext->key_len);
   1253		set_bit(key_index, &wl->key_enabled);
   1254		/* remember wep info changed */
   1255		set_bit(GELIC_WL_STAT_CONFIGURED, &wl->stat);
   1256	} else if (alg == IW_ENCODE_ALG_PMK) {
   1257		if (ext->key_len != WPA_PSK_LEN) {
   1258			pr_err("%s: PSK length wrong %d\n", __func__,
   1259			       ext->key_len);
   1260			ret = -EINVAL;
   1261			goto done;
   1262		}
   1263		memset(wl->psk, 0, sizeof(wl->psk));
   1264		memcpy(wl->psk, ext->key, ext->key_len);
   1265		wl->psk_len = ext->key_len;
   1266		wl->psk_type = GELIC_EURUS_WPA_PSK_BIN;
   1267		/* remember PSK configured */
   1268		set_bit(GELIC_WL_STAT_WPA_PSK_SET, &wl->stat);
   1269	}
   1270done:
   1271	spin_unlock_irqrestore(&wl->lock, irqflag);
   1272	pr_debug("%s: ->\n", __func__);
   1273	return ret;
   1274}
   1275
   1276static int gelic_wl_get_encodeext(struct net_device *netdev,
   1277				  struct iw_request_info *info,
   1278				  union iwreq_data *data, char *extra)
   1279{
   1280	struct gelic_wl_info *wl = port_wl(netdev_priv(netdev));
   1281	struct iw_point *enc = &data->encoding;
   1282	struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;
   1283	unsigned long irqflag;
   1284	int key_index;
   1285	int ret = 0;
   1286	int max_key_len;
   1287
   1288	pr_debug("%s: <-\n", __func__);
   1289
   1290	max_key_len = enc->length - sizeof(struct iw_encode_ext);
   1291	if (max_key_len < 0)
   1292		return -EINVAL;
   1293	key_index = enc->flags & IW_ENCODE_INDEX;
   1294
   1295	pr_debug("%s: key_index = %d\n", __func__, key_index);
   1296	pr_debug("%s: key_len = %d\n", __func__, enc->length);
   1297	pr_debug("%s: flag=%x\n", __func__, enc->flags & IW_ENCODE_FLAGS);
   1298
   1299	if (GELIC_WEP_KEYS < key_index)
   1300		return -EINVAL;
   1301
   1302	spin_lock_irqsave(&wl->lock, irqflag);
   1303	if (key_index)
   1304		key_index--;
   1305	else
   1306		key_index = wl->current_key;
   1307
   1308	memset(ext, 0, sizeof(struct iw_encode_ext));
   1309	switch (wl->group_cipher_method) {
   1310	case GELIC_WL_CIPHER_WEP:
   1311		ext->alg = IW_ENCODE_ALG_WEP;
   1312		enc->flags |= IW_ENCODE_ENABLED;
   1313		break;
   1314	case GELIC_WL_CIPHER_TKIP:
   1315		ext->alg = IW_ENCODE_ALG_TKIP;
   1316		enc->flags |= IW_ENCODE_ENABLED;
   1317		break;
   1318	case GELIC_WL_CIPHER_AES:
   1319		ext->alg = IW_ENCODE_ALG_CCMP;
   1320		enc->flags |= IW_ENCODE_ENABLED;
   1321		break;
   1322	case GELIC_WL_CIPHER_NONE:
   1323	default:
   1324		ext->alg = IW_ENCODE_ALG_NONE;
   1325		enc->flags |= IW_ENCODE_NOKEY;
   1326		break;
   1327	}
   1328
   1329	if (!(enc->flags & IW_ENCODE_NOKEY)) {
   1330		if (max_key_len < wl->key_len[key_index]) {
   1331			ret = -E2BIG;
   1332			goto out;
   1333		}
   1334		if (test_bit(key_index, &wl->key_enabled))
   1335			memcpy(ext->key, wl->key[key_index],
   1336			       wl->key_len[key_index]);
   1337		else
   1338			pr_debug("%s: disabled key requested ix=%d\n",
   1339				 __func__, key_index);
   1340	}
   1341out:
   1342	spin_unlock_irqrestore(&wl->lock, irqflag);
   1343	pr_debug("%s: ->\n", __func__);
   1344	return ret;
   1345}
   1346/* SIOC{S,G}IWMODE */
   1347static int gelic_wl_set_mode(struct net_device *netdev,
   1348			     struct iw_request_info *info,
   1349			     union iwreq_data *data, char *extra)
   1350{
   1351	__u32 mode = data->mode;
   1352	int ret;
   1353
   1354	pr_debug("%s: <-\n", __func__);
   1355	if (mode == IW_MODE_INFRA)
   1356		ret = 0;
   1357	else
   1358		ret = -EOPNOTSUPP;
   1359	pr_debug("%s: -> %d\n", __func__, ret);
   1360	return ret;
   1361}
   1362
   1363static int gelic_wl_get_mode(struct net_device *netdev,
   1364			     struct iw_request_info *info,
   1365			     union iwreq_data *data, char *extra)
   1366{
   1367	__u32 *mode = &data->mode;
   1368	pr_debug("%s: <-\n", __func__);
   1369	*mode = IW_MODE_INFRA;
   1370	pr_debug("%s: ->\n", __func__);
   1371	return 0;
   1372}
   1373
   1374/* SIOCGIWNICKN */
   1375static int gelic_wl_get_nick(struct net_device *net_dev,
   1376				  struct iw_request_info *info,
   1377				  union iwreq_data *data, char *extra)
   1378{
   1379	strcpy(extra, "gelic_wl");
   1380	data->data.length = strlen(extra);
   1381	data->data.flags = 1;
   1382	return 0;
   1383}
   1384
   1385
   1386/* --- */
   1387
   1388static struct iw_statistics *gelic_wl_get_wireless_stats(
   1389	struct net_device *netdev)
   1390{
   1391
   1392	struct gelic_wl_info *wl = port_wl(netdev_priv(netdev));
   1393	struct gelic_eurus_cmd *cmd;
   1394	struct iw_statistics *is;
   1395	struct gelic_eurus_rssi_info *rssi;
   1396	void *buf;
   1397
   1398	pr_debug("%s: <-\n", __func__);
   1399
   1400	buf = (void *)__get_free_page(GFP_KERNEL);
   1401	if (!buf)
   1402		return NULL;
   1403
   1404	is = &wl->iwstat;
   1405	memset(is, 0, sizeof(*is));
   1406	cmd = gelic_eurus_sync_cmd(wl, GELIC_EURUS_CMD_GET_RSSI_CFG,
   1407				   buf, sizeof(*rssi));
   1408	if (cmd && !cmd->status && !cmd->cmd_status) {
   1409		rssi = buf;
   1410		is->qual.level = be16_to_cpu(rssi->rssi);
   1411		is->qual.updated = IW_QUAL_LEVEL_UPDATED |
   1412			IW_QUAL_QUAL_INVALID | IW_QUAL_NOISE_INVALID;
   1413	} else
   1414		/* not associated */
   1415		is->qual.updated = IW_QUAL_ALL_INVALID;
   1416
   1417	kfree(cmd);
   1418	free_page((unsigned long)buf);
   1419	pr_debug("%s: ->\n", __func__);
   1420	return is;
   1421}
   1422
   1423/*
   1424 *  scanning helpers
   1425 */
   1426static int gelic_wl_start_scan(struct gelic_wl_info *wl, int always_scan,
   1427			       u8 *essid, size_t essid_len)
   1428{
   1429	struct gelic_eurus_cmd *cmd;
   1430	int ret = 0;
   1431	void *buf = NULL;
   1432	size_t len;
   1433
   1434	pr_debug("%s: <- always=%d\n", __func__, always_scan);
   1435	if (mutex_lock_interruptible(&wl->scan_lock))
   1436		return -ERESTARTSYS;
   1437
   1438	/*
   1439	 * If already a scan in progress, do not trigger more
   1440	 */
   1441	if (wl->scan_stat == GELIC_WL_SCAN_STAT_SCANNING) {
   1442		pr_debug("%s: scanning now\n", __func__);
   1443		goto out;
   1444	}
   1445
   1446	init_completion(&wl->scan_done);
   1447	/*
   1448	 * If we have already a bss list, don't try to get new
   1449	 * unless we are doing an ESSID scan
   1450	 */
   1451	if ((!essid_len && !always_scan)
   1452	    && wl->scan_stat == GELIC_WL_SCAN_STAT_GOT_LIST) {
   1453		pr_debug("%s: already has the list\n", __func__);
   1454		complete(&wl->scan_done);
   1455		goto out;
   1456	}
   1457
   1458	/* ESSID scan ? */
   1459	if (essid_len && essid) {
   1460		buf = (void *)__get_free_page(GFP_KERNEL);
   1461		if (!buf) {
   1462			ret = -ENOMEM;
   1463			goto out;
   1464		}
   1465		len = IW_ESSID_MAX_SIZE; /* hypervisor always requires 32 */
   1466		memset(buf, 0, len);
   1467		memcpy(buf, essid, essid_len);
   1468		pr_debug("%s: essid scan='%s'\n", __func__, (char *)buf);
   1469	} else
   1470		len = 0;
   1471
   1472	/*
   1473	 * issue start scan request
   1474	 */
   1475	wl->scan_stat = GELIC_WL_SCAN_STAT_SCANNING;
   1476	cmd = gelic_eurus_sync_cmd(wl, GELIC_EURUS_CMD_START_SCAN,
   1477				   buf, len);
   1478	if (!cmd || cmd->status || cmd->cmd_status) {
   1479		wl->scan_stat = GELIC_WL_SCAN_STAT_INIT;
   1480		complete(&wl->scan_done);
   1481		ret = -ENOMEM;
   1482		goto out;
   1483	}
   1484	kfree(cmd);
   1485out:
   1486	free_page((unsigned long)buf);
   1487	mutex_unlock(&wl->scan_lock);
   1488	pr_debug("%s: ->\n", __func__);
   1489	return ret;
   1490}
   1491
   1492/*
   1493 * retrieve scan result from the chip (hypervisor)
   1494 * this function is invoked by schedule work.
   1495 */
   1496static void gelic_wl_scan_complete_event(struct gelic_wl_info *wl)
   1497{
   1498	struct gelic_eurus_cmd *cmd = NULL;
   1499	struct gelic_wl_scan_info *target, *tmp;
   1500	struct gelic_wl_scan_info *oldest = NULL;
   1501	struct gelic_eurus_scan_info *scan_info;
   1502	unsigned int scan_info_size;
   1503	union iwreq_data data;
   1504	unsigned long this_time = jiffies;
   1505	unsigned int data_len, i, found, r;
   1506	void *buf;
   1507
   1508	pr_debug("%s:start\n", __func__);
   1509	mutex_lock(&wl->scan_lock);
   1510
   1511	buf = (void *)__get_free_page(GFP_KERNEL);
   1512	if (!buf) {
   1513		pr_info("%s: scan buffer alloc failed\n", __func__);
   1514		goto out;
   1515	}
   1516
   1517	if (wl->scan_stat != GELIC_WL_SCAN_STAT_SCANNING) {
   1518		/*
   1519		 * stop() may be called while scanning, ignore result
   1520		 */
   1521		pr_debug("%s: scan complete when stat != scanning(%d)\n",
   1522			 __func__, wl->scan_stat);
   1523		goto out;
   1524	}
   1525
   1526	cmd = gelic_eurus_sync_cmd(wl, GELIC_EURUS_CMD_GET_SCAN,
   1527				   buf, PAGE_SIZE);
   1528	if (!cmd || cmd->status || cmd->cmd_status) {
   1529		wl->scan_stat = GELIC_WL_SCAN_STAT_INIT;
   1530		pr_info("%s:cmd failed\n", __func__);
   1531		kfree(cmd);
   1532		goto out;
   1533	}
   1534	data_len = cmd->size;
   1535	pr_debug("%s: data_len = %d\n", __func__, data_len);
   1536	kfree(cmd);
   1537
   1538	/* OK, bss list retrieved */
   1539	wl->scan_stat = GELIC_WL_SCAN_STAT_GOT_LIST;
   1540
   1541	/* mark all entries are old */
   1542	list_for_each_entry_safe(target, tmp, &wl->network_list, list) {
   1543		target->valid = 0;
   1544		/* expire too old entries */
   1545		if (time_before(target->last_scanned + wl->scan_age,
   1546				this_time)) {
   1547			kfree(target->hwinfo);
   1548			target->hwinfo = NULL;
   1549			list_move_tail(&target->list, &wl->network_free_list);
   1550		}
   1551	}
   1552
   1553	/* put them in the network_list */
   1554	for (i = 0, scan_info_size = 0, scan_info = buf;
   1555	     scan_info_size < data_len;
   1556	     i++, scan_info_size += be16_to_cpu(scan_info->size),
   1557	     scan_info = (void *)scan_info + be16_to_cpu(scan_info->size)) {
   1558		pr_debug("%s:size=%d bssid=%pM scan_info=%p\n", __func__,
   1559			 be16_to_cpu(scan_info->size),
   1560			 &scan_info->bssid[2], scan_info);
   1561
   1562		/*
   1563		 * The wireless firmware may return invalid channel 0 and/or
   1564		 * invalid rate if the AP emits zero length SSID ie. As this
   1565		 * scan information is useless, ignore it
   1566		 */
   1567		if (!be16_to_cpu(scan_info->channel) || !scan_info->rate[0]) {
   1568			pr_debug("%s: invalid scan info\n", __func__);
   1569			continue;
   1570		}
   1571
   1572		found = 0;
   1573		oldest = NULL;
   1574		list_for_each_entry(target, &wl->network_list, list) {
   1575			if (ether_addr_equal(&target->hwinfo->bssid[2],
   1576					     &scan_info->bssid[2])) {
   1577				found = 1;
   1578				pr_debug("%s: same BBS found scanned list\n",
   1579					 __func__);
   1580				break;
   1581			}
   1582			if (!oldest ||
   1583			    (target->last_scanned < oldest->last_scanned))
   1584				oldest = target;
   1585		}
   1586
   1587		if (!found) {
   1588			/* not found in the list */
   1589			if (list_empty(&wl->network_free_list)) {
   1590				/* expire oldest */
   1591				target = oldest;
   1592			} else {
   1593				target = list_entry(wl->network_free_list.next,
   1594						    struct gelic_wl_scan_info,
   1595						    list);
   1596			}
   1597		}
   1598
   1599		/* update the item */
   1600		target->last_scanned = this_time;
   1601		target->valid = 1;
   1602		target->eurus_index = i;
   1603		kfree(target->hwinfo);
   1604		target->hwinfo = kmemdup(scan_info,
   1605					 be16_to_cpu(scan_info->size),
   1606					 GFP_KERNEL);
   1607		if (!target->hwinfo)
   1608			continue;
   1609
   1610		/* copy hw scan info */
   1611		target->essid_len = strnlen(scan_info->essid,
   1612					    sizeof(scan_info->essid));
   1613		target->rate_len = 0;
   1614		for (r = 0; r < 12; r++)
   1615			if (scan_info->rate[r])
   1616				target->rate_len++;
   1617		if (8 < target->rate_len)
   1618			pr_info("%s: AP returns %d rates\n", __func__,
   1619				target->rate_len);
   1620		target->rate_ext_len = 0;
   1621		for (r = 0; r < 16; r++)
   1622			if (scan_info->ext_rate[r])
   1623				target->rate_ext_len++;
   1624		list_move_tail(&target->list, &wl->network_list);
   1625	}
   1626	memset(&data, 0, sizeof(data));
   1627	wireless_send_event(port_to_netdev(wl_port(wl)), SIOCGIWSCAN, &data,
   1628			    NULL);
   1629out:
   1630	free_page((unsigned long)buf);
   1631	complete(&wl->scan_done);
   1632	mutex_unlock(&wl->scan_lock);
   1633	pr_debug("%s:end\n", __func__);
   1634}
   1635
   1636/*
   1637 * Select an appropriate bss from current scan list regarding
   1638 * current settings from userspace.
   1639 * The caller must hold wl->scan_lock,
   1640 * and on the state of wl->scan_state == GELIC_WL_SCAN_GOT_LIST
   1641 */
   1642static void update_best(struct gelic_wl_scan_info **best,
   1643			struct gelic_wl_scan_info *candid,
   1644			int *best_weight,
   1645			int *weight)
   1646{
   1647	if (*best_weight < ++(*weight)) {
   1648		*best_weight = *weight;
   1649		*best = candid;
   1650	}
   1651}
   1652
   1653static
   1654struct gelic_wl_scan_info *gelic_wl_find_best_bss(struct gelic_wl_info *wl)
   1655{
   1656	struct gelic_wl_scan_info *scan_info;
   1657	struct gelic_wl_scan_info *best_bss;
   1658	int weight, best_weight;
   1659	u16 security;
   1660
   1661	pr_debug("%s: <-\n", __func__);
   1662
   1663	best_bss = NULL;
   1664	best_weight = 0;
   1665
   1666	list_for_each_entry(scan_info, &wl->network_list, list) {
   1667		pr_debug("%s: station %p\n", __func__, scan_info);
   1668
   1669		if (!scan_info->valid) {
   1670			pr_debug("%s: station invalid\n", __func__);
   1671			continue;
   1672		}
   1673
   1674		/* If bss specified, check it only */
   1675		if (test_bit(GELIC_WL_STAT_BSSID_SET, &wl->stat)) {
   1676			if (ether_addr_equal(&scan_info->hwinfo->bssid[2],
   1677					     wl->bssid)) {
   1678				best_bss = scan_info;
   1679				pr_debug("%s: bssid matched\n", __func__);
   1680				break;
   1681			} else {
   1682				pr_debug("%s: bssid unmatched\n", __func__);
   1683				continue;
   1684			}
   1685		}
   1686
   1687		weight = 0;
   1688
   1689		/* security */
   1690		security = be16_to_cpu(scan_info->hwinfo->security) &
   1691			GELIC_EURUS_SCAN_SEC_MASK;
   1692		if (wl->wpa_level == GELIC_WL_WPA_LEVEL_WPA2) {
   1693			if (security == GELIC_EURUS_SCAN_SEC_WPA2)
   1694				update_best(&best_bss, scan_info,
   1695					    &best_weight, &weight);
   1696			else
   1697				continue;
   1698		} else if (wl->wpa_level == GELIC_WL_WPA_LEVEL_WPA) {
   1699			if (security == GELIC_EURUS_SCAN_SEC_WPA)
   1700				update_best(&best_bss, scan_info,
   1701					    &best_weight, &weight);
   1702			else
   1703				continue;
   1704		} else if (wl->wpa_level == GELIC_WL_WPA_LEVEL_NONE &&
   1705			   wl->group_cipher_method == GELIC_WL_CIPHER_WEP) {
   1706			if (security == GELIC_EURUS_SCAN_SEC_WEP)
   1707				update_best(&best_bss, scan_info,
   1708					    &best_weight, &weight);
   1709			else
   1710				continue;
   1711		}
   1712
   1713		/* If ESSID is set, check it */
   1714		if (test_bit(GELIC_WL_STAT_ESSID_SET, &wl->stat)) {
   1715			if ((scan_info->essid_len == wl->essid_len) &&
   1716			    !strncmp(wl->essid,
   1717				     scan_info->hwinfo->essid,
   1718				     scan_info->essid_len))
   1719				update_best(&best_bss, scan_info,
   1720					    &best_weight, &weight);
   1721			else
   1722				continue;
   1723		}
   1724	}
   1725
   1726#ifdef DEBUG
   1727	pr_debug("%s: -> bss=%p\n", __func__, best_bss);
   1728	if (best_bss) {
   1729		pr_debug("%s:addr=%pM\n", __func__,
   1730			 &best_bss->hwinfo->bssid[2]);
   1731	}
   1732#endif
   1733	return best_bss;
   1734}
   1735
   1736/*
   1737 * Setup WEP configuration to the chip
   1738 * The caller must hold wl->scan_lock,
   1739 * and on the state of wl->scan_state == GELIC_WL_SCAN_GOT_LIST
   1740 */
   1741static int gelic_wl_do_wep_setup(struct gelic_wl_info *wl)
   1742{
   1743	unsigned int i;
   1744	struct gelic_eurus_wep_cfg *wep;
   1745	struct gelic_eurus_cmd *cmd;
   1746	int wep104 = 0;
   1747	int have_key = 0;
   1748	int ret = 0;
   1749
   1750	pr_debug("%s: <-\n", __func__);
   1751	/* we can assume no one should uses the buffer */
   1752	wep = (struct gelic_eurus_wep_cfg *)__get_free_page(GFP_KERNEL);
   1753	if (!wep)
   1754		return -ENOMEM;
   1755
   1756	memset(wep, 0, sizeof(*wep));
   1757
   1758	if (wl->group_cipher_method == GELIC_WL_CIPHER_WEP) {
   1759		pr_debug("%s: WEP mode\n", __func__);
   1760		for (i = 0; i < GELIC_WEP_KEYS; i++) {
   1761			if (!test_bit(i, &wl->key_enabled))
   1762				continue;
   1763
   1764			pr_debug("%s: key#%d enabled\n", __func__, i);
   1765			have_key = 1;
   1766			if (wl->key_len[i] == 13)
   1767				wep104 = 1;
   1768			else if (wl->key_len[i] != 5) {
   1769				pr_info("%s: wrong wep key[%d]=%d\n",
   1770					__func__, i, wl->key_len[i]);
   1771				ret = -EINVAL;
   1772				goto out;
   1773			}
   1774			memcpy(wep->key[i], wl->key[i], wl->key_len[i]);
   1775		}
   1776
   1777		if (!have_key) {
   1778			pr_info("%s: all wep key disabled\n", __func__);
   1779			ret = -EINVAL;
   1780			goto out;
   1781		}
   1782
   1783		if (wep104) {
   1784			pr_debug("%s: 104bit key\n", __func__);
   1785			wep->security = cpu_to_be16(GELIC_EURUS_WEP_SEC_104BIT);
   1786		} else {
   1787			pr_debug("%s: 40bit key\n", __func__);
   1788			wep->security = cpu_to_be16(GELIC_EURUS_WEP_SEC_40BIT);
   1789		}
   1790	} else {
   1791		pr_debug("%s: NO encryption\n", __func__);
   1792		wep->security = cpu_to_be16(GELIC_EURUS_WEP_SEC_NONE);
   1793	}
   1794
   1795	/* issue wep setup */
   1796	cmd = gelic_eurus_sync_cmd(wl, GELIC_EURUS_CMD_SET_WEP_CFG,
   1797				   wep, sizeof(*wep));
   1798	if (!cmd)
   1799		ret = -ENOMEM;
   1800	else if (cmd->status || cmd->cmd_status)
   1801		ret = -ENXIO;
   1802
   1803	kfree(cmd);
   1804out:
   1805	free_page((unsigned long)wep);
   1806	pr_debug("%s: ->\n", __func__);
   1807	return ret;
   1808}
   1809
   1810#ifdef DEBUG
   1811static const char *wpasecstr(enum gelic_eurus_wpa_security sec)
   1812{
   1813	switch (sec) {
   1814	case GELIC_EURUS_WPA_SEC_NONE:
   1815		return "NONE";
   1816	case GELIC_EURUS_WPA_SEC_WPA_TKIP_TKIP:
   1817		return "WPA_TKIP_TKIP";
   1818	case GELIC_EURUS_WPA_SEC_WPA_TKIP_AES:
   1819		return "WPA_TKIP_AES";
   1820	case GELIC_EURUS_WPA_SEC_WPA_AES_AES:
   1821		return "WPA_AES_AES";
   1822	case GELIC_EURUS_WPA_SEC_WPA2_TKIP_TKIP:
   1823		return "WPA2_TKIP_TKIP";
   1824	case GELIC_EURUS_WPA_SEC_WPA2_TKIP_AES:
   1825		return "WPA2_TKIP_AES";
   1826	case GELIC_EURUS_WPA_SEC_WPA2_AES_AES:
   1827		return "WPA2_AES_AES";
   1828	}
   1829	return "";
   1830};
   1831#endif
   1832
   1833static int gelic_wl_do_wpa_setup(struct gelic_wl_info *wl)
   1834{
   1835	struct gelic_eurus_wpa_cfg *wpa;
   1836	struct gelic_eurus_cmd *cmd;
   1837	u16 security;
   1838	int ret = 0;
   1839
   1840	pr_debug("%s: <-\n", __func__);
   1841	/* we can assume no one should uses the buffer */
   1842	wpa = (struct gelic_eurus_wpa_cfg *)__get_free_page(GFP_KERNEL);
   1843	if (!wpa)
   1844		return -ENOMEM;
   1845
   1846	memset(wpa, 0, sizeof(*wpa));
   1847
   1848	if (!test_bit(GELIC_WL_STAT_WPA_PSK_SET, &wl->stat))
   1849		pr_info("%s: PSK not configured yet\n", __func__);
   1850
   1851	/* copy key */
   1852	memcpy(wpa->psk, wl->psk, wl->psk_len);
   1853
   1854	/* set security level */
   1855	if (wl->wpa_level == GELIC_WL_WPA_LEVEL_WPA2) {
   1856		if (wl->group_cipher_method == GELIC_WL_CIPHER_AES) {
   1857			security = GELIC_EURUS_WPA_SEC_WPA2_AES_AES;
   1858		} else {
   1859			if (wl->pairwise_cipher_method == GELIC_WL_CIPHER_AES &&
   1860			    precise_ie())
   1861				security = GELIC_EURUS_WPA_SEC_WPA2_TKIP_AES;
   1862			else
   1863				security = GELIC_EURUS_WPA_SEC_WPA2_TKIP_TKIP;
   1864		}
   1865	} else {
   1866		if (wl->group_cipher_method == GELIC_WL_CIPHER_AES) {
   1867			security = GELIC_EURUS_WPA_SEC_WPA_AES_AES;
   1868		} else {
   1869			if (wl->pairwise_cipher_method == GELIC_WL_CIPHER_AES &&
   1870			    precise_ie())
   1871				security = GELIC_EURUS_WPA_SEC_WPA_TKIP_AES;
   1872			else
   1873				security = GELIC_EURUS_WPA_SEC_WPA_TKIP_TKIP;
   1874		}
   1875	}
   1876	wpa->security = cpu_to_be16(security);
   1877
   1878	/* PSK type */
   1879	wpa->psk_type = cpu_to_be16(wl->psk_type);
   1880#ifdef DEBUG
   1881	pr_debug("%s: sec=%s psktype=%s\n", __func__,
   1882		 wpasecstr(wpa->security),
   1883		 (wpa->psk_type == GELIC_EURUS_WPA_PSK_BIN) ?
   1884		 "BIN" : "passphrase");
   1885#if 0
   1886	/*
   1887	 * don't enable here if you plan to submit
   1888	 * the debug log because this dumps your precious
   1889	 * passphrase/key.
   1890	 */
   1891	pr_debug("%s: psk=%s\n", __func__,
   1892		 (wpa->psk_type == GELIC_EURUS_WPA_PSK_BIN) ?
   1893		 "N/A" : wpa->psk);
   1894#endif
   1895#endif
   1896	/* issue wpa setup */
   1897	cmd = gelic_eurus_sync_cmd(wl, GELIC_EURUS_CMD_SET_WPA_CFG,
   1898				   wpa, sizeof(*wpa));
   1899	if (!cmd)
   1900		ret = -ENOMEM;
   1901	else if (cmd->status || cmd->cmd_status)
   1902		ret = -ENXIO;
   1903	kfree(cmd);
   1904	free_page((unsigned long)wpa);
   1905	pr_debug("%s: --> %d\n", __func__, ret);
   1906	return ret;
   1907}
   1908
   1909/*
   1910 * Start association. caller must hold assoc_stat_lock
   1911 */
   1912static int gelic_wl_associate_bss(struct gelic_wl_info *wl,
   1913				  struct gelic_wl_scan_info *bss)
   1914{
   1915	struct gelic_eurus_cmd *cmd;
   1916	struct gelic_eurus_common_cfg *common;
   1917	int ret = 0;
   1918	unsigned long rc;
   1919
   1920	pr_debug("%s: <-\n", __func__);
   1921
   1922	/* do common config */
   1923	common = (struct gelic_eurus_common_cfg *)__get_free_page(GFP_KERNEL);
   1924	if (!common)
   1925		return -ENOMEM;
   1926
   1927	memset(common, 0, sizeof(*common));
   1928	common->bss_type = cpu_to_be16(GELIC_EURUS_BSS_INFRA);
   1929	common->op_mode = cpu_to_be16(GELIC_EURUS_OPMODE_11BG);
   1930
   1931	common->scan_index = cpu_to_be16(bss->eurus_index);
   1932	switch (wl->auth_method) {
   1933	case GELIC_EURUS_AUTH_OPEN:
   1934		common->auth_method = cpu_to_be16(GELIC_EURUS_AUTH_OPEN);
   1935		break;
   1936	case GELIC_EURUS_AUTH_SHARED:
   1937		common->auth_method = cpu_to_be16(GELIC_EURUS_AUTH_SHARED);
   1938		break;
   1939	}
   1940
   1941#ifdef DEBUG
   1942	scan_list_dump(wl);
   1943#endif
   1944	pr_debug("%s: common cfg index=%d bsstype=%d auth=%d\n", __func__,
   1945		 be16_to_cpu(common->scan_index),
   1946		 be16_to_cpu(common->bss_type),
   1947		 be16_to_cpu(common->auth_method));
   1948
   1949	cmd = gelic_eurus_sync_cmd(wl, GELIC_EURUS_CMD_SET_COMMON_CFG,
   1950				   common, sizeof(*common));
   1951	if (!cmd || cmd->status || cmd->cmd_status) {
   1952		ret = -ENOMEM;
   1953		kfree(cmd);
   1954		goto out;
   1955	}
   1956	kfree(cmd);
   1957
   1958	/* WEP/WPA */
   1959	switch (wl->wpa_level) {
   1960	case GELIC_WL_WPA_LEVEL_NONE:
   1961		/* If WEP or no security, setup WEP config */
   1962		ret = gelic_wl_do_wep_setup(wl);
   1963		break;
   1964	case GELIC_WL_WPA_LEVEL_WPA:
   1965	case GELIC_WL_WPA_LEVEL_WPA2:
   1966		ret = gelic_wl_do_wpa_setup(wl);
   1967		break;
   1968	}
   1969
   1970	if (ret) {
   1971		pr_debug("%s: WEP/WPA setup failed %d\n", __func__,
   1972			 ret);
   1973		ret = -EPERM;
   1974		gelic_wl_send_iwap_event(wl, NULL);
   1975		goto out;
   1976	}
   1977
   1978	/* start association */
   1979	init_completion(&wl->assoc_done);
   1980	wl->assoc_stat = GELIC_WL_ASSOC_STAT_ASSOCIATING;
   1981	cmd = gelic_eurus_sync_cmd(wl, GELIC_EURUS_CMD_ASSOC,
   1982				   NULL, 0);
   1983	if (!cmd || cmd->status || cmd->cmd_status) {
   1984		pr_debug("%s: assoc request failed\n", __func__);
   1985		wl->assoc_stat = GELIC_WL_ASSOC_STAT_DISCONN;
   1986		kfree(cmd);
   1987		ret = -ENOMEM;
   1988		gelic_wl_send_iwap_event(wl, NULL);
   1989		goto out;
   1990	}
   1991	kfree(cmd);
   1992
   1993	/* wait for connected event */
   1994	rc = wait_for_completion_timeout(&wl->assoc_done, HZ * 4);/*FIXME*/
   1995
   1996	if (!rc) {
   1997		/* timeouted.  Maybe key or cyrpt mode is wrong */
   1998		pr_info("%s: connect timeout\n", __func__);
   1999		cmd = gelic_eurus_sync_cmd(wl, GELIC_EURUS_CMD_DISASSOC,
   2000					   NULL, 0);
   2001		kfree(cmd);
   2002		wl->assoc_stat = GELIC_WL_ASSOC_STAT_DISCONN;
   2003		gelic_wl_send_iwap_event(wl, NULL);
   2004		ret = -ENXIO;
   2005	} else {
   2006		wl->assoc_stat = GELIC_WL_ASSOC_STAT_ASSOCIATED;
   2007		/* copy bssid */
   2008		memcpy(wl->active_bssid, &bss->hwinfo->bssid[2], ETH_ALEN);
   2009
   2010		/* send connect event */
   2011		gelic_wl_send_iwap_event(wl, wl->active_bssid);
   2012		pr_info("%s: connected\n", __func__);
   2013	}
   2014out:
   2015	free_page((unsigned long)common);
   2016	pr_debug("%s: ->\n", __func__);
   2017	return ret;
   2018}
   2019
   2020/*
   2021 * connected event
   2022 */
   2023static void gelic_wl_connected_event(struct gelic_wl_info *wl,
   2024				     u64 event)
   2025{
   2026	u64 desired_event = 0;
   2027
   2028	switch (wl->wpa_level) {
   2029	case GELIC_WL_WPA_LEVEL_NONE:
   2030		desired_event = GELIC_LV1_WL_EVENT_CONNECTED;
   2031		break;
   2032	case GELIC_WL_WPA_LEVEL_WPA:
   2033	case GELIC_WL_WPA_LEVEL_WPA2:
   2034		desired_event = GELIC_LV1_WL_EVENT_WPA_CONNECTED;
   2035		break;
   2036	}
   2037
   2038	if (desired_event == event) {
   2039		pr_debug("%s: completed\n", __func__);
   2040		complete(&wl->assoc_done);
   2041		netif_carrier_on(port_to_netdev(wl_port(wl)));
   2042	} else
   2043		pr_debug("%s: event %#llx under wpa\n",
   2044				 __func__, event);
   2045}
   2046
   2047/*
   2048 * disconnect event
   2049 */
   2050static void gelic_wl_disconnect_event(struct gelic_wl_info *wl,
   2051				      u64 event)
   2052{
   2053	struct gelic_eurus_cmd *cmd;
   2054	int lock;
   2055
   2056	/*
   2057	 * If we fall here in the middle of association,
   2058	 * associate_bss() should be waiting for complation of
   2059	 * wl->assoc_done.
   2060	 * As it waits with timeout, just leave assoc_done
   2061	 * uncompleted, then it terminates with timeout
   2062	 */
   2063	if (!mutex_trylock(&wl->assoc_stat_lock)) {
   2064		pr_debug("%s: already locked\n", __func__);
   2065		lock = 0;
   2066	} else {
   2067		pr_debug("%s: obtain lock\n", __func__);
   2068		lock = 1;
   2069	}
   2070
   2071	cmd = gelic_eurus_sync_cmd(wl, GELIC_EURUS_CMD_DISASSOC, NULL, 0);
   2072	kfree(cmd);
   2073
   2074	/* send disconnected event to the supplicant */
   2075	if (wl->assoc_stat == GELIC_WL_ASSOC_STAT_ASSOCIATED)
   2076		gelic_wl_send_iwap_event(wl, NULL);
   2077
   2078	wl->assoc_stat = GELIC_WL_ASSOC_STAT_DISCONN;
   2079	netif_carrier_off(port_to_netdev(wl_port(wl)));
   2080
   2081	if (lock)
   2082		mutex_unlock(&wl->assoc_stat_lock);
   2083}
   2084/*
   2085 * event worker
   2086 */
   2087#ifdef DEBUG
   2088static const char *eventstr(enum gelic_lv1_wl_event event)
   2089{
   2090	static char buf[32];
   2091	char *ret;
   2092	if (event & GELIC_LV1_WL_EVENT_DEVICE_READY)
   2093		ret = "EURUS_READY";
   2094	else if (event & GELIC_LV1_WL_EVENT_SCAN_COMPLETED)
   2095		ret = "SCAN_COMPLETED";
   2096	else if (event & GELIC_LV1_WL_EVENT_DEAUTH)
   2097		ret = "DEAUTH";
   2098	else if (event & GELIC_LV1_WL_EVENT_BEACON_LOST)
   2099		ret = "BEACON_LOST";
   2100	else if (event & GELIC_LV1_WL_EVENT_CONNECTED)
   2101		ret = "CONNECTED";
   2102	else if (event & GELIC_LV1_WL_EVENT_WPA_CONNECTED)
   2103		ret = "WPA_CONNECTED";
   2104	else if (event & GELIC_LV1_WL_EVENT_WPA_ERROR)
   2105		ret = "WPA_ERROR";
   2106	else {
   2107		sprintf(buf, "Unknown(%#x)", event);
   2108		ret = buf;
   2109	}
   2110	return ret;
   2111}
   2112#else
   2113static const char *eventstr(enum gelic_lv1_wl_event event)
   2114{
   2115	return NULL;
   2116}
   2117#endif
   2118static void gelic_wl_event_worker(struct work_struct *work)
   2119{
   2120	struct gelic_wl_info *wl;
   2121	struct gelic_port *port;
   2122	u64 event, tmp;
   2123	int status;
   2124
   2125	pr_debug("%s:start\n", __func__);
   2126	wl = container_of(work, struct gelic_wl_info, event_work.work);
   2127	port = wl_port(wl);
   2128	while (1) {
   2129		status = lv1_net_control(bus_id(port->card), dev_id(port->card),
   2130					 GELIC_LV1_GET_WLAN_EVENT, 0, 0, 0,
   2131					 &event, &tmp);
   2132		if (status) {
   2133			if (status != LV1_NO_ENTRY)
   2134				pr_debug("%s:wlan event failed %d\n",
   2135					 __func__, status);
   2136			/* got all events */
   2137			pr_debug("%s:end\n", __func__);
   2138			return;
   2139		}
   2140		pr_debug("%s: event=%s\n", __func__, eventstr(event));
   2141		switch (event) {
   2142		case GELIC_LV1_WL_EVENT_SCAN_COMPLETED:
   2143			gelic_wl_scan_complete_event(wl);
   2144			break;
   2145		case GELIC_LV1_WL_EVENT_BEACON_LOST:
   2146		case GELIC_LV1_WL_EVENT_DEAUTH:
   2147			gelic_wl_disconnect_event(wl, event);
   2148			break;
   2149		case GELIC_LV1_WL_EVENT_CONNECTED:
   2150		case GELIC_LV1_WL_EVENT_WPA_CONNECTED:
   2151			gelic_wl_connected_event(wl, event);
   2152			break;
   2153		default:
   2154			break;
   2155		}
   2156	} /* while */
   2157}
   2158/*
   2159 * association worker
   2160 */
   2161static void gelic_wl_assoc_worker(struct work_struct *work)
   2162{
   2163	struct gelic_wl_info *wl;
   2164
   2165	struct gelic_wl_scan_info *best_bss;
   2166	int ret;
   2167	unsigned long irqflag;
   2168	u8 *essid;
   2169	size_t essid_len;
   2170
   2171	wl = container_of(work, struct gelic_wl_info, assoc_work.work);
   2172
   2173	mutex_lock(&wl->assoc_stat_lock);
   2174
   2175	if (wl->assoc_stat != GELIC_WL_ASSOC_STAT_DISCONN)
   2176		goto out;
   2177
   2178	spin_lock_irqsave(&wl->lock, irqflag);
   2179	if (test_bit(GELIC_WL_STAT_ESSID_SET, &wl->stat)) {
   2180		pr_debug("%s: assoc ESSID configured %s\n", __func__,
   2181			 wl->essid);
   2182		essid = wl->essid;
   2183		essid_len = wl->essid_len;
   2184	} else {
   2185		essid = NULL;
   2186		essid_len = 0;
   2187	}
   2188	spin_unlock_irqrestore(&wl->lock, irqflag);
   2189
   2190	ret = gelic_wl_start_scan(wl, 0, essid, essid_len);
   2191	if (ret == -ERESTARTSYS) {
   2192		pr_debug("%s: scan start failed association\n", __func__);
   2193		schedule_delayed_work(&wl->assoc_work, HZ/10); /*FIXME*/
   2194		goto out;
   2195	} else if (ret) {
   2196		pr_info("%s: scan prerequisite failed\n", __func__);
   2197		goto out;
   2198	}
   2199
   2200	/*
   2201	 * Wait for bss scan completion
   2202	 * If we have scan list already, gelic_wl_start_scan()
   2203	 * returns OK and raises the complete.  Thus,
   2204	 * it's ok to wait unconditionally here
   2205	 */
   2206	wait_for_completion(&wl->scan_done);
   2207
   2208	pr_debug("%s: scan done\n", __func__);
   2209	mutex_lock(&wl->scan_lock);
   2210	if (wl->scan_stat != GELIC_WL_SCAN_STAT_GOT_LIST) {
   2211		gelic_wl_send_iwap_event(wl, NULL);
   2212		pr_info("%s: no scan list. association failed\n", __func__);
   2213		goto scan_lock_out;
   2214	}
   2215
   2216	/* find best matching bss */
   2217	best_bss = gelic_wl_find_best_bss(wl);
   2218	if (!best_bss) {
   2219		gelic_wl_send_iwap_event(wl, NULL);
   2220		pr_info("%s: no bss matched. association failed\n", __func__);
   2221		goto scan_lock_out;
   2222	}
   2223
   2224	/* ok, do association */
   2225	ret = gelic_wl_associate_bss(wl, best_bss);
   2226	if (ret)
   2227		pr_info("%s: association failed %d\n", __func__, ret);
   2228scan_lock_out:
   2229	mutex_unlock(&wl->scan_lock);
   2230out:
   2231	mutex_unlock(&wl->assoc_stat_lock);
   2232}
   2233/*
   2234 * Interrupt handler
   2235 * Called from the ethernet interrupt handler
   2236 * Processes wireless specific virtual interrupts only
   2237 */
   2238void gelic_wl_interrupt(struct net_device *netdev, u64 status)
   2239{
   2240	struct gelic_wl_info *wl = port_wl(netdev_priv(netdev));
   2241
   2242	if (status & GELIC_CARD_WLAN_COMMAND_COMPLETED) {
   2243		pr_debug("%s:cmd complete\n", __func__);
   2244		complete(&wl->cmd_done_intr);
   2245	}
   2246
   2247	if (status & GELIC_CARD_WLAN_EVENT_RECEIVED) {
   2248		pr_debug("%s:event received\n", __func__);
   2249		queue_delayed_work(wl->event_queue, &wl->event_work, 0);
   2250	}
   2251}
   2252
   2253/*
   2254 * driver helpers
   2255 */
   2256static const iw_handler gelic_wl_wext_handler[] =
   2257{
   2258	IW_HANDLER(SIOCGIWNAME, gelic_wl_get_name),
   2259	IW_HANDLER(SIOCGIWRANGE, gelic_wl_get_range),
   2260	IW_HANDLER(SIOCSIWSCAN, gelic_wl_set_scan),
   2261	IW_HANDLER(SIOCGIWSCAN, gelic_wl_get_scan),
   2262	IW_HANDLER(SIOCSIWAUTH, gelic_wl_set_auth),
   2263	IW_HANDLER(SIOCGIWAUTH, gelic_wl_get_auth),
   2264	IW_HANDLER(SIOCSIWESSID, gelic_wl_set_essid),
   2265	IW_HANDLER(SIOCGIWESSID, gelic_wl_get_essid),
   2266	IW_HANDLER(SIOCSIWENCODE, gelic_wl_set_encode),
   2267	IW_HANDLER(SIOCGIWENCODE, gelic_wl_get_encode),
   2268	IW_HANDLER(SIOCSIWAP, gelic_wl_set_ap),
   2269	IW_HANDLER(SIOCGIWAP, gelic_wl_get_ap),
   2270	IW_HANDLER(SIOCSIWENCODEEXT, gelic_wl_set_encodeext),
   2271	IW_HANDLER(SIOCGIWENCODEEXT, gelic_wl_get_encodeext),
   2272	IW_HANDLER(SIOCSIWMODE, gelic_wl_set_mode),
   2273	IW_HANDLER(SIOCGIWMODE, gelic_wl_get_mode),
   2274	IW_HANDLER(SIOCGIWNICKN, gelic_wl_get_nick),
   2275};
   2276
   2277static const struct iw_handler_def gelic_wl_wext_handler_def = {
   2278	.num_standard		= ARRAY_SIZE(gelic_wl_wext_handler),
   2279	.standard		= gelic_wl_wext_handler,
   2280	.get_wireless_stats	= gelic_wl_get_wireless_stats,
   2281};
   2282
   2283static struct net_device *gelic_wl_alloc(struct gelic_card *card)
   2284{
   2285	struct net_device *netdev;
   2286	struct gelic_port *port;
   2287	struct gelic_wl_info *wl;
   2288	unsigned int i;
   2289
   2290	pr_debug("%s:start\n", __func__);
   2291	netdev = alloc_etherdev(sizeof(struct gelic_port) +
   2292				sizeof(struct gelic_wl_info));
   2293	pr_debug("%s: netdev =%p card=%p\n", __func__, netdev, card);
   2294	if (!netdev)
   2295		return NULL;
   2296
   2297	strcpy(netdev->name, "wlan%d");
   2298
   2299	port = netdev_priv(netdev);
   2300	port->netdev = netdev;
   2301	port->card = card;
   2302	port->type = GELIC_PORT_WIRELESS;
   2303
   2304	wl = port_wl(port);
   2305	pr_debug("%s: wl=%p port=%p\n", __func__, wl, port);
   2306
   2307	/* allocate scan list */
   2308	wl->networks = kcalloc(GELIC_WL_BSS_MAX_ENT,
   2309			       sizeof(struct gelic_wl_scan_info),
   2310			       GFP_KERNEL);
   2311
   2312	if (!wl->networks)
   2313		goto fail_bss;
   2314
   2315	wl->eurus_cmd_queue = create_singlethread_workqueue("gelic_cmd");
   2316	if (!wl->eurus_cmd_queue)
   2317		goto fail_cmd_workqueue;
   2318
   2319	wl->event_queue = create_singlethread_workqueue("gelic_event");
   2320	if (!wl->event_queue)
   2321		goto fail_event_workqueue;
   2322
   2323	INIT_LIST_HEAD(&wl->network_free_list);
   2324	INIT_LIST_HEAD(&wl->network_list);
   2325	for (i = 0; i < GELIC_WL_BSS_MAX_ENT; i++)
   2326		list_add_tail(&wl->networks[i].list,
   2327			      &wl->network_free_list);
   2328	init_completion(&wl->cmd_done_intr);
   2329
   2330	INIT_DELAYED_WORK(&wl->event_work, gelic_wl_event_worker);
   2331	INIT_DELAYED_WORK(&wl->assoc_work, gelic_wl_assoc_worker);
   2332	mutex_init(&wl->scan_lock);
   2333	mutex_init(&wl->assoc_stat_lock);
   2334
   2335	init_completion(&wl->scan_done);
   2336	/* for the case that no scan request is issued and stop() is called */
   2337	complete(&wl->scan_done);
   2338
   2339	spin_lock_init(&wl->lock);
   2340
   2341	wl->scan_age = 5*HZ; /* FIXME */
   2342
   2343	/* buffer for receiving scanned list etc */
   2344	BUILD_BUG_ON(PAGE_SIZE <
   2345		     sizeof(struct gelic_eurus_scan_info) *
   2346		     GELIC_EURUS_MAX_SCAN);
   2347	pr_debug("%s:end\n", __func__);
   2348	return netdev;
   2349
   2350fail_event_workqueue:
   2351	destroy_workqueue(wl->eurus_cmd_queue);
   2352fail_cmd_workqueue:
   2353	kfree(wl->networks);
   2354fail_bss:
   2355	free_netdev(netdev);
   2356	pr_debug("%s:end error\n", __func__);
   2357	return NULL;
   2358
   2359}
   2360
   2361static void gelic_wl_free(struct gelic_wl_info *wl)
   2362{
   2363	struct gelic_wl_scan_info *scan_info;
   2364	unsigned int i;
   2365
   2366	pr_debug("%s: <-\n", __func__);
   2367
   2368	pr_debug("%s: destroy queues\n", __func__);
   2369	destroy_workqueue(wl->eurus_cmd_queue);
   2370	destroy_workqueue(wl->event_queue);
   2371
   2372	scan_info = wl->networks;
   2373	for (i = 0; i < GELIC_WL_BSS_MAX_ENT; i++, scan_info++)
   2374		kfree(scan_info->hwinfo);
   2375	kfree(wl->networks);
   2376
   2377	free_netdev(port_to_netdev(wl_port(wl)));
   2378
   2379	pr_debug("%s: ->\n", __func__);
   2380}
   2381
   2382static int gelic_wl_try_associate(struct net_device *netdev)
   2383{
   2384	struct gelic_wl_info *wl = port_wl(netdev_priv(netdev));
   2385	int ret = -1;
   2386	unsigned int i;
   2387
   2388	pr_debug("%s: <-\n", __func__);
   2389
   2390	/* check constraits for start association */
   2391	/* for no access restriction AP */
   2392	if (wl->group_cipher_method == GELIC_WL_CIPHER_NONE) {
   2393		if (test_bit(GELIC_WL_STAT_CONFIGURED,
   2394			     &wl->stat))
   2395			goto do_associate;
   2396		else {
   2397			pr_debug("%s: no wep, not configured\n", __func__);
   2398			return ret;
   2399		}
   2400	}
   2401
   2402	/* for WEP, one of four keys should be set */
   2403	if (wl->group_cipher_method == GELIC_WL_CIPHER_WEP) {
   2404		/* one of keys set */
   2405		for (i = 0; i < GELIC_WEP_KEYS; i++) {
   2406			if (test_bit(i, &wl->key_enabled))
   2407			    goto do_associate;
   2408		}
   2409		pr_debug("%s: WEP, but no key specified\n", __func__);
   2410		return ret;
   2411	}
   2412
   2413	/* for WPA[2], psk should be set */
   2414	if ((wl->group_cipher_method == GELIC_WL_CIPHER_TKIP) ||
   2415	    (wl->group_cipher_method == GELIC_WL_CIPHER_AES)) {
   2416		if (test_bit(GELIC_WL_STAT_WPA_PSK_SET,
   2417			     &wl->stat))
   2418			goto do_associate;
   2419		else {
   2420			pr_debug("%s: AES/TKIP, but PSK not configured\n",
   2421				 __func__);
   2422			return ret;
   2423		}
   2424	}
   2425
   2426do_associate:
   2427	ret = schedule_delayed_work(&wl->assoc_work, 0);
   2428	pr_debug("%s: start association work %d\n", __func__, ret);
   2429	return ret;
   2430}
   2431
   2432/*
   2433 * netdev handlers
   2434 */
   2435static int gelic_wl_open(struct net_device *netdev)
   2436{
   2437	struct gelic_card *card = netdev_card(netdev);
   2438
   2439	pr_debug("%s:->%p\n", __func__, netdev);
   2440
   2441	gelic_card_up(card);
   2442
   2443	/* try to associate */
   2444	gelic_wl_try_associate(netdev);
   2445
   2446	netif_start_queue(netdev);
   2447
   2448	pr_debug("%s:<-\n", __func__);
   2449	return 0;
   2450}
   2451
   2452/*
   2453 * reset state machine
   2454 */
   2455static int gelic_wl_reset_state(struct gelic_wl_info *wl)
   2456{
   2457	struct gelic_wl_scan_info *target;
   2458	struct gelic_wl_scan_info *tmp;
   2459
   2460	/* empty scan list */
   2461	list_for_each_entry_safe(target, tmp, &wl->network_list, list) {
   2462		list_move_tail(&target->list, &wl->network_free_list);
   2463	}
   2464	wl->scan_stat = GELIC_WL_SCAN_STAT_INIT;
   2465
   2466	/* clear configuration */
   2467	wl->auth_method = GELIC_EURUS_AUTH_OPEN;
   2468	wl->group_cipher_method = GELIC_WL_CIPHER_NONE;
   2469	wl->pairwise_cipher_method = GELIC_WL_CIPHER_NONE;
   2470	wl->wpa_level = GELIC_WL_WPA_LEVEL_NONE;
   2471
   2472	wl->key_enabled = 0;
   2473	wl->current_key = 0;
   2474
   2475	wl->psk_type = GELIC_EURUS_WPA_PSK_PASSPHRASE;
   2476	wl->psk_len = 0;
   2477
   2478	wl->essid_len = 0;
   2479	memset(wl->essid, 0, sizeof(wl->essid));
   2480	memset(wl->bssid, 0, sizeof(wl->bssid));
   2481	memset(wl->active_bssid, 0, sizeof(wl->active_bssid));
   2482
   2483	wl->assoc_stat = GELIC_WL_ASSOC_STAT_DISCONN;
   2484
   2485	memset(&wl->iwstat, 0, sizeof(wl->iwstat));
   2486	/* all status bit clear */
   2487	wl->stat = 0;
   2488	return 0;
   2489}
   2490
   2491/*
   2492 * Tell eurus to terminate association
   2493 */
   2494static void gelic_wl_disconnect(struct net_device *netdev)
   2495{
   2496	struct gelic_port *port = netdev_priv(netdev);
   2497	struct gelic_wl_info *wl = port_wl(port);
   2498	struct gelic_eurus_cmd *cmd;
   2499
   2500	/*
   2501	 * If scann process is running on chip,
   2502	 * further requests will be rejected
   2503	 */
   2504	if (wl->scan_stat == GELIC_WL_SCAN_STAT_SCANNING)
   2505		wait_for_completion_timeout(&wl->scan_done, HZ);
   2506
   2507	cmd = gelic_eurus_sync_cmd(wl, GELIC_EURUS_CMD_DISASSOC, NULL, 0);
   2508	kfree(cmd);
   2509	gelic_wl_send_iwap_event(wl, NULL);
   2510};
   2511
   2512static int gelic_wl_stop(struct net_device *netdev)
   2513{
   2514	struct gelic_port *port = netdev_priv(netdev);
   2515	struct gelic_wl_info *wl = port_wl(port);
   2516	struct gelic_card *card = netdev_card(netdev);
   2517
   2518	pr_debug("%s:<-\n", __func__);
   2519
   2520	/*
   2521	 * Cancel pending association work.
   2522	 * event work can run after netdev down
   2523	 */
   2524	cancel_delayed_work(&wl->assoc_work);
   2525
   2526	if (wl->assoc_stat == GELIC_WL_ASSOC_STAT_ASSOCIATED)
   2527		gelic_wl_disconnect(netdev);
   2528
   2529	/* reset our state machine */
   2530	gelic_wl_reset_state(wl);
   2531
   2532	netif_stop_queue(netdev);
   2533
   2534	gelic_card_down(card);
   2535
   2536	pr_debug("%s:->\n", __func__);
   2537	return 0;
   2538}
   2539
   2540/* -- */
   2541
   2542static const struct net_device_ops gelic_wl_netdevice_ops = {
   2543	.ndo_open = gelic_wl_open,
   2544	.ndo_stop = gelic_wl_stop,
   2545	.ndo_start_xmit = gelic_net_xmit,
   2546	.ndo_set_rx_mode = gelic_net_set_multi,
   2547	.ndo_tx_timeout = gelic_net_tx_timeout,
   2548	.ndo_set_mac_address = eth_mac_addr,
   2549	.ndo_validate_addr = eth_validate_addr,
   2550#ifdef CONFIG_NET_POLL_CONTROLLER
   2551	.ndo_poll_controller = gelic_net_poll_controller,
   2552#endif
   2553};
   2554
   2555static const struct ethtool_ops gelic_wl_ethtool_ops = {
   2556	.get_drvinfo	= gelic_net_get_drvinfo,
   2557	.get_link	= gelic_wl_get_link,
   2558};
   2559
   2560static void gelic_wl_setup_netdev_ops(struct net_device *netdev)
   2561{
   2562	struct gelic_wl_info *wl;
   2563	wl = port_wl(netdev_priv(netdev));
   2564	BUG_ON(!wl);
   2565	netdev->watchdog_timeo = GELIC_NET_WATCHDOG_TIMEOUT;
   2566
   2567	netdev->ethtool_ops = &gelic_wl_ethtool_ops;
   2568	netdev->netdev_ops = &gelic_wl_netdevice_ops;
   2569	netdev->wireless_data = &wl->wireless_data;
   2570	netdev->wireless_handlers = &gelic_wl_wext_handler_def;
   2571}
   2572
   2573/*
   2574 * driver probe/remove
   2575 */
   2576int gelic_wl_driver_probe(struct gelic_card *card)
   2577{
   2578	int ret;
   2579	struct net_device *netdev;
   2580
   2581	pr_debug("%s:start\n", __func__);
   2582
   2583	if (ps3_compare_firmware_version(1, 6, 0) < 0)
   2584		return 0;
   2585	if (!card->vlan[GELIC_PORT_WIRELESS].tx)
   2586		return 0;
   2587
   2588	/* alloc netdevice for wireless */
   2589	netdev = gelic_wl_alloc(card);
   2590	if (!netdev)
   2591		return -ENOMEM;
   2592
   2593	/* setup net_device structure */
   2594	SET_NETDEV_DEV(netdev, &card->dev->core);
   2595	gelic_wl_setup_netdev_ops(netdev);
   2596
   2597	/* setup some of net_device and register it */
   2598	ret = gelic_net_setup_netdev(netdev, card);
   2599	if (ret)
   2600		goto fail_setup;
   2601	card->netdev[GELIC_PORT_WIRELESS] = netdev;
   2602
   2603	/* add enable wireless interrupt */
   2604	card->irq_mask |= GELIC_CARD_WLAN_EVENT_RECEIVED |
   2605		GELIC_CARD_WLAN_COMMAND_COMPLETED;
   2606	/* to allow wireless commands while both interfaces are down */
   2607	gelic_card_set_irq_mask(card, GELIC_CARD_WLAN_EVENT_RECEIVED |
   2608				GELIC_CARD_WLAN_COMMAND_COMPLETED);
   2609	pr_debug("%s:end\n", __func__);
   2610	return 0;
   2611
   2612fail_setup:
   2613	gelic_wl_free(port_wl(netdev_port(netdev)));
   2614
   2615	return ret;
   2616}
   2617
   2618int gelic_wl_driver_remove(struct gelic_card *card)
   2619{
   2620	struct gelic_wl_info *wl;
   2621	struct net_device *netdev;
   2622
   2623	pr_debug("%s:start\n", __func__);
   2624
   2625	if (ps3_compare_firmware_version(1, 6, 0) < 0)
   2626		return 0;
   2627	if (!card->vlan[GELIC_PORT_WIRELESS].tx)
   2628		return 0;
   2629
   2630	netdev = card->netdev[GELIC_PORT_WIRELESS];
   2631	wl = port_wl(netdev_priv(netdev));
   2632
   2633	/* if the interface was not up, but associated */
   2634	if (wl->assoc_stat == GELIC_WL_ASSOC_STAT_ASSOCIATED)
   2635		gelic_wl_disconnect(netdev);
   2636
   2637	complete(&wl->cmd_done_intr);
   2638
   2639	/* cancel all work queue */
   2640	cancel_delayed_work(&wl->assoc_work);
   2641	cancel_delayed_work(&wl->event_work);
   2642	flush_workqueue(wl->eurus_cmd_queue);
   2643	flush_workqueue(wl->event_queue);
   2644
   2645	unregister_netdev(netdev);
   2646
   2647	/* disable wireless interrupt */
   2648	pr_debug("%s: disable intr\n", __func__);
   2649	card->irq_mask &= ~(GELIC_CARD_WLAN_EVENT_RECEIVED |
   2650			    GELIC_CARD_WLAN_COMMAND_COMPLETED);
   2651	/* free bss list, netdev*/
   2652	gelic_wl_free(wl);
   2653	pr_debug("%s:end\n", __func__);
   2654	return 0;
   2655}