main.c 27.7 KB
Newer Older
1 2 3 4 5
/*
 * This file contains the major functions in WLAN
 * driver. It includes init, exit, open, close and main
 * thread etc..
 */
6

7 8
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

9
#include <linux/module.h>
10 11
#include <linux/delay.h>
#include <linux/etherdevice.h>
12
#include <linux/hardirq.h>
13 14
#include <linux/netdevice.h>
#include <linux/if_arp.h>
15
#include <linux/kthread.h>
16
#include <linux/kfifo.h>
17
#include <linux/slab.h>
18
#include <net/cfg80211.h>
19 20 21 22

#include "host.h"
#include "decl.h"
#include "dev.h"
23
#include "cfg.h"
24
#include "debugfs.h"
25
#include "cmd.h"
26
#include "mesh.h"
27

28
#define DRIVER_RELEASE_VERSION "323.p0"
29
const char lbs_driver_version[] = "COMM-USB8388-" DRIVER_RELEASE_VERSION
30 31 32 33 34
#ifdef  DEBUG
    "-dbg"
#endif
    "";

35 36

/* Module parameters */
37 38 39
unsigned int lbs_debug;
EXPORT_SYMBOL_GPL(lbs_debug);
module_param_named(libertas_debug, lbs_debug, int, 0644);
40

41 42 43 44
unsigned int lbs_disablemesh;
EXPORT_SYMBOL_GPL(lbs_disablemesh);
module_param_named(libertas_disablemesh, lbs_disablemesh, int, 0644);

45

46 47 48 49
/*
 * This global structure is used to send the confirm_sleep command as
 * fast as possible down to the firmware.
 */
50 51 52
struct cmd_confirm_sleep confirm_sleep;


53
/*
54
 * the table to keep region code
55
 */
56
u16 lbs_region_code_to_index[MRVDRV_MAX_REGION_CODE] =
57
    { 0x10, 0x20, 0x30, 0x31, 0x32, 0x40 };
58

59
/*
60 61 62
 * FW rate table.  FW refers to rates by their index in this table, not by the
 * rate value itself.  Values of 0x00 are
 * reserved positions.
63
 */
64 65 66 67
static u8 fw_data_rates[MAX_RATES] =
    { 0x02, 0x04, 0x0B, 0x16, 0x00, 0x0C, 0x12,
      0x18, 0x24, 0x30, 0x48, 0x60, 0x6C, 0x00
};
68 69

/**
70
 *  lbs_fw_index_to_data_rate - use index to get the data rate
71
 *
72 73
 *  @idx:	The index of data rate
 *  returns:	data rate or 0
74
 */
75
u32 lbs_fw_index_to_data_rate(u8 idx)
76 77 78 79 80 81 82
{
	if (idx >= sizeof(fw_data_rates))
		idx = 0;
	return fw_data_rates[idx];
}

/**
83
 *  lbs_data_rate_to_fw_index - use rate to get the index
84
 *
85 86
 *  @rate:	data rate
 *  returns:	index or 0
87
 */
88
u8 lbs_data_rate_to_fw_index(u32 rate)
89 90 91 92 93 94 95 96 97 98 99 100
{
	u8 i;

	if (!rate)
		return 0;

	for (i = 0; i < sizeof(fw_data_rates); i++) {
		if (rate == fw_data_rates[i])
			return i;
	}
	return 0;
}
101

102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
int lbs_set_iface_type(struct lbs_private *priv, enum nl80211_iftype type)
{
	int ret = 0;

	switch (type) {
	case NL80211_IFTYPE_MONITOR:
		ret = lbs_set_monitor_mode(priv, 1);
		break;
	case NL80211_IFTYPE_STATION:
		if (priv->wdev->iftype == NL80211_IFTYPE_MONITOR)
			ret = lbs_set_monitor_mode(priv, 0);
		if (!ret)
			ret = lbs_set_snmp_mib(priv, SNMP_MIB_OID_BSS_TYPE, 1);
		break;
	case NL80211_IFTYPE_ADHOC:
		if (priv->wdev->iftype == NL80211_IFTYPE_MONITOR)
			ret = lbs_set_monitor_mode(priv, 0);
		if (!ret)
			ret = lbs_set_snmp_mib(priv, SNMP_MIB_OID_BSS_TYPE, 2);
		break;
	default:
		ret = -ENOTSUPP;
	}
	return ret;
}

128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
int lbs_start_iface(struct lbs_private *priv)
{
	struct cmd_ds_802_11_mac_address cmd;
	int ret;

	if (priv->power_restore) {
		ret = priv->power_restore(priv);
		if (ret)
			return ret;
	}

	cmd.hdr.size = cpu_to_le16(sizeof(cmd));
	cmd.action = cpu_to_le16(CMD_ACT_SET);
	memcpy(cmd.macadd, priv->current_addr, ETH_ALEN);

	ret = lbs_cmd_with_response(priv, CMD_802_11_MAC_ADDRESS, &cmd);
	if (ret) {
		lbs_deb_net("set MAC address failed\n");
		goto err;
	}

149 150 151 152 153 154
	ret = lbs_set_iface_type(priv, priv->wdev->iftype);
	if (ret) {
		lbs_deb_net("set iface type failed\n");
		goto err;
	}

155 156 157 158 159 160
	ret = lbs_set_11d_domain_info(priv);
	if (ret) {
		lbs_deb_net("set 11d domain info failed\n");
		goto err;
	}

161 162 163 164 165 166 167 168 169 170
	lbs_update_channel(priv);

	priv->iface_running = true;
	return 0;

err:
	if (priv->power_save)
		priv->power_save(priv);
	return ret;
}
171

172
/**
173
 *  lbs_dev_open - open the ethX interface
174
 *
175 176
 *  @dev:	A pointer to &net_device structure
 *  returns:	0 or -EBUSY if monitor mode active
177
 */
178
static int lbs_dev_open(struct net_device *dev)
179
{
180
	struct lbs_private *priv = dev->ml_priv;
181
	int ret = 0;
182

183 184 185 186 187
	if (!priv->iface_running) {
		ret = lbs_start_iface(priv);
		if (ret)
			goto out;
	}
188

189
	spin_lock_irq(&priv->driver_lock);
190

191
	netif_carrier_off(dev);
192

193 194
	if (!priv->tx_pending_len)
		netif_wake_queue(dev);
195

196
	spin_unlock_irq(&priv->driver_lock);
197 198

out:
199
	return ret;
200 201
}

202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224
static bool lbs_command_queue_empty(struct lbs_private *priv)
{
	unsigned long flags;
	bool ret;
	spin_lock_irqsave(&priv->driver_lock, flags);
	ret = priv->cur_cmd == NULL && list_empty(&priv->cmdpendingq);
	spin_unlock_irqrestore(&priv->driver_lock, flags);
	return ret;
}

int lbs_stop_iface(struct lbs_private *priv)
{
	unsigned long flags;
	int ret = 0;

	spin_lock_irqsave(&priv->driver_lock, flags);
	priv->iface_running = false;
	kfree_skb(priv->currenttxskb);
	priv->currenttxskb = NULL;
	priv->tx_pending_len = 0;
	spin_unlock_irqrestore(&priv->driver_lock, flags);

	cancel_work_sync(&priv->mcast_work);
225
	del_timer_sync(&priv->tx_lockup_timer);
226 227 228 229 230 231 232 233 234 235 236 237

	/* Disable command processing, and wait for all commands to complete */
	lbs_deb_main("waiting for commands to complete\n");
	wait_event(priv->waitq, lbs_command_queue_empty(priv));
	lbs_deb_main("all commands completed\n");

	if (priv->power_save)
		ret = priv->power_save(priv);

	return ret;
}

238
/**
239
 *  lbs_eth_stop - close the ethX interface
240
 *
241 242
 *  @dev:	A pointer to &net_device structure
 *  returns:	0
243
 */
244
static int lbs_eth_stop(struct net_device *dev)
245
{
246
	struct lbs_private *priv = dev->ml_priv;
247

248 249 250
	if (priv->connect_status == LBS_CONNECTED)
		lbs_disconnect(priv, WLAN_REASON_DEAUTH_LEAVING);

251
	spin_lock_irq(&priv->driver_lock);
252 253
	netif_stop_queue(dev);
	spin_unlock_irq(&priv->driver_lock);
254

255
	lbs_update_mcast(priv);
256
	cancel_delayed_work_sync(&priv->scan_work);
257 258
	if (priv->scan_req)
		lbs_scan_done(priv);
259

260 261 262 263 264
	netif_carrier_off(priv->dev);

	if (!lbs_iface_active(priv))
		lbs_stop_iface(priv);

265
	return 0;
266 267
}

268 269
void lbs_host_to_card_done(struct lbs_private *priv)
{
270 271 272
	unsigned long flags;

	spin_lock_irqsave(&priv->driver_lock, flags);
273
	del_timer(&priv->tx_lockup_timer);
274 275 276 277

	priv->dnld_sent = DNLD_RES_RECEIVED;

	/* Wake main thread if commands are pending */
278 279
	if (!priv->cur_cmd || priv->tx_pending_len > 0) {
		if (!priv->wakeup_dev_required)
280
			wake_up(&priv->waitq);
281
	}
282

283
	spin_unlock_irqrestore(&priv->driver_lock, flags);
284 285 286
}
EXPORT_SYMBOL_GPL(lbs_host_to_card_done);

287
int lbs_set_mac_address(struct net_device *dev, void *addr)
288 289
{
	int ret = 0;
290
	struct lbs_private *priv = dev->ml_priv;
291 292
	struct sockaddr *phwaddr = addr;

293 294 295 296 297 298 299
	/*
	 * Can only set MAC address when all interfaces are down, to be written
	 * to the hardware when one of them is brought up.
	 */
	if (lbs_iface_active(priv))
		return -EBUSY;

300
	/* In case it was called from the mesh device */
301
	dev = priv->dev;
302

303 304
	memcpy(priv->current_addr, phwaddr->sa_data, ETH_ALEN);
	memcpy(dev->dev_addr, phwaddr->sa_data, ETH_ALEN);
305
	if (priv->mesh_dev)
306
		memcpy(priv->mesh_dev->dev_addr, phwaddr->sa_data, ETH_ALEN);
307 308 309 310

	return ret;
}

311 312 313

static inline int mac_in_list(unsigned char *list, int list_len,
			      unsigned char *mac)
314
{
315 316 317 318 319 320 321 322 323
	while (list_len) {
		if (!memcmp(list, mac, ETH_ALEN))
			return 1;
		list += ETH_ALEN;
		list_len--;
	}
	return 0;
}

324

325 326 327 328
static int lbs_add_mcast_addrs(struct cmd_ds_mac_multicast_adr *cmd,
			       struct net_device *dev, int nr_addrs)
{
	int i = nr_addrs;
329
	struct netdev_hw_addr *ha;
330
	int cnt;
331 332 333 334

	if ((dev->flags & (IFF_UP|IFF_MULTICAST)) != (IFF_UP|IFF_MULTICAST))
		return nr_addrs;

335
	netif_addr_lock_bh(dev);
336
	cnt = netdev_mc_count(dev);
337 338
	netdev_for_each_mc_addr(ha, dev) {
		if (mac_in_list(cmd->maclist, nr_addrs, ha->addr)) {
J
Johannes Berg 已提交
339
			lbs_deb_net("mcast address %s:%pM skipped\n", dev->name,
340
				    ha->addr);
341
			cnt--;
342 343
			continue;
		}
344

345 346
		if (i == MRVDRV_MAX_MULTICAST_LIST_SIZE)
			break;
347
		memcpy(&cmd->maclist[6*i], ha->addr, ETH_ALEN);
J
Johannes Berg 已提交
348
		lbs_deb_net("mcast address %s:%pM added to filter\n", dev->name,
349
			    ha->addr);
350
		i++;
351
		cnt--;
352
	}
353
	netif_addr_unlock_bh(dev);
354
	if (cnt)
355 356
		return -EOVERFLOW;

357 358 359
	return i;
}

360
void lbs_update_mcast(struct lbs_private *priv)
361
{
362
	struct cmd_ds_mac_multicast_adr mcast_cmd;
363
	int dev_flags = 0;
364 365
	int nr_addrs;
	int old_mac_control = priv->mac_control;
366

367 368 369
	if (netif_running(priv->dev))
		dev_flags |= priv->dev->flags;
	if (priv->mesh_dev && netif_running(priv->mesh_dev))
370 371 372 373 374 375 376 377 378 379 380 381 382
		dev_flags |= priv->mesh_dev->flags;

	if (dev_flags & IFF_PROMISC) {
		priv->mac_control |= CMD_ACT_MAC_PROMISCUOUS_ENABLE;
		priv->mac_control &= ~(CMD_ACT_MAC_ALL_MULTICAST_ENABLE |
				       CMD_ACT_MAC_MULTICAST_ENABLE);
		goto out_set_mac_control;
	} else if (dev_flags & IFF_ALLMULTI) {
	do_allmulti:
		priv->mac_control |= CMD_ACT_MAC_ALL_MULTICAST_ENABLE;
		priv->mac_control &= ~(CMD_ACT_MAC_PROMISCUOUS_ENABLE |
				       CMD_ACT_MAC_MULTICAST_ENABLE);
		goto out_set_mac_control;
383 384
	}

385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408
	/* Once for priv->dev, again for priv->mesh_dev if it exists */
	nr_addrs = lbs_add_mcast_addrs(&mcast_cmd, priv->dev, 0);
	if (nr_addrs >= 0 && priv->mesh_dev)
		nr_addrs = lbs_add_mcast_addrs(&mcast_cmd, priv->mesh_dev, nr_addrs);
	if (nr_addrs < 0)
		goto do_allmulti;

	if (nr_addrs) {
		int size = offsetof(struct cmd_ds_mac_multicast_adr,
				    maclist[6*nr_addrs]);

		mcast_cmd.action = cpu_to_le16(CMD_ACT_SET);
		mcast_cmd.hdr.size = cpu_to_le16(size);
		mcast_cmd.nr_of_adrs = cpu_to_le16(nr_addrs);

		lbs_cmd_async(priv, CMD_MAC_MULTICAST_ADR, &mcast_cmd.hdr, size);

		priv->mac_control |= CMD_ACT_MAC_MULTICAST_ENABLE;
	} else
		priv->mac_control &= ~CMD_ACT_MAC_MULTICAST_ENABLE;

	priv->mac_control &= ~(CMD_ACT_MAC_PROMISCUOUS_ENABLE |
			       CMD_ACT_MAC_ALL_MULTICAST_ENABLE);
 out_set_mac_control:
409 410
	if (priv->mac_control != old_mac_control)
		lbs_set_mac_control(priv);
411 412
}

413 414 415 416 417 418
static void lbs_set_mcast_worker(struct work_struct *work)
{
	struct lbs_private *priv = container_of(work, struct lbs_private, mcast_work);
	lbs_update_mcast(priv);
}

419
void lbs_set_multicast_list(struct net_device *dev)
420
{
421
	struct lbs_private *priv = dev->ml_priv;
422 423 424 425

	schedule_work(&priv->mcast_work);
}

426
/**
427
 *  lbs_thread - handles the major jobs in the LBS driver.
428 429
 *  It handles all events generated by firmware, RX data received
 *  from firmware and TX data sent from kernel.
430
 *
431 432
 *  @data:	A pointer to &lbs_thread structure
 *  returns:	0
433
 */
434
static int lbs_thread(void *data)
435
{
436
	struct net_device *dev = data;
437
	struct lbs_private *priv = dev->ml_priv;
438 439 440 441 442
	wait_queue_t wait;

	init_waitqueue_entry(&wait, current);

	for (;;) {
443
		int shouldsleep;
444
		u8 resp_idx;
445

446 447
		lbs_deb_thread("1: currenttxskb %p, dnld_sent %d\n",
				priv->currenttxskb, priv->dnld_sent);
448

449
		add_wait_queue(&priv->waitq, &wait);
450
		set_current_state(TASK_INTERRUPTIBLE);
451
		spin_lock_irq(&priv->driver_lock);
452

453
		if (kthread_should_stop())
454
			shouldsleep = 0;	/* Bye */
455 456
		else if (priv->surpriseremoved)
			shouldsleep = 1;	/* We need to wait until we're _told_ to die */
457 458
		else if (priv->psstate == PS_STATE_SLEEP)
			shouldsleep = 1;	/* Sleep mode. Nothing we can do till it wakes */
459 460
		else if (priv->cmd_timed_out)
			shouldsleep = 0;	/* Command timed out. Recover */
461 462
		else if (!priv->fw_ready)
			shouldsleep = 1;	/* Firmware not ready. We're waiting for it */
463 464
		else if (priv->dnld_sent)
			shouldsleep = 1;	/* Something is en route to the device already */
465 466
		else if (priv->tx_pending_len > 0)
			shouldsleep = 0;	/* We've a packet to send */
467 468
		else if (priv->resp_len[priv->resp_idx])
			shouldsleep = 0;	/* We have a command response */
469 470
		else if (priv->cur_cmd)
			shouldsleep = 1;	/* Can't send a command; one already running */
471 472
		else if (!list_empty(&priv->cmdpendingq) &&
					!(priv->wakeup_dev_required))
473
			shouldsleep = 0;	/* We have a command to send */
S
Stefani Seibold 已提交
474
		else if (kfifo_len(&priv->event_fifo))
475
			shouldsleep = 0;	/* We have an event to process */
476 477 478 479
		else
			shouldsleep = 1;	/* No command */

		if (shouldsleep) {
480
			lbs_deb_thread("sleeping, connect_status %d, "
481
				"psmode %d, psstate %d\n",
482 483
				priv->connect_status,
				priv->psmode, priv->psstate);
484
			spin_unlock_irq(&priv->driver_lock);
485 486
			schedule();
		} else
487
			spin_unlock_irq(&priv->driver_lock);
488

489 490
		lbs_deb_thread("2: currenttxskb %p, dnld_send %d\n",
			       priv->currenttxskb, priv->dnld_sent);
491 492

		set_current_state(TASK_RUNNING);
493
		remove_wait_queue(&priv->waitq, &wait);
494

495 496
		lbs_deb_thread("3: currenttxskb %p, dnld_sent %d\n",
			       priv->currenttxskb, priv->dnld_sent);
497

498
		if (kthread_should_stop()) {
499
			lbs_deb_thread("break from main thread\n");
500 501 502
			break;
		}

503 504 505 506
		if (priv->surpriseremoved) {
			lbs_deb_thread("adapter removed; waiting to die...\n");
			continue;
		}
507

508 509
		lbs_deb_thread("4: currenttxskb %p, dnld_sent %d\n",
		       priv->currenttxskb, priv->dnld_sent);
510

511
		/* Process any pending command response */
512
		spin_lock_irq(&priv->driver_lock);
513 514
		resp_idx = priv->resp_idx;
		if (priv->resp_len[resp_idx]) {
515
			spin_unlock_irq(&priv->driver_lock);
516 517 518
			lbs_process_command_response(priv,
				priv->resp_buf[resp_idx],
				priv->resp_len[resp_idx]);
519
			spin_lock_irq(&priv->driver_lock);
520
			priv->resp_len[resp_idx] = 0;
521
		}
522
		spin_unlock_irq(&priv->driver_lock);
523

524 525
		/* Process hardware events, e.g. card removed, link lost */
		spin_lock_irq(&priv->driver_lock);
S
Stefani Seibold 已提交
526
		while (kfifo_len(&priv->event_fifo)) {
527
			u32 event;
528

S
Stefani Seibold 已提交
529 530 531 532
			if (kfifo_out(&priv->event_fifo,
				(unsigned char *) &event, sizeof(event)) !=
				sizeof(event))
					break;
533 534 535 536 537 538 539 540 541 542 543 544 545 546
			spin_unlock_irq(&priv->driver_lock);
			lbs_process_event(priv, event);
			spin_lock_irq(&priv->driver_lock);
		}
		spin_unlock_irq(&priv->driver_lock);

		if (priv->wakeup_dev_required) {
			lbs_deb_thread("Waking up device...\n");
			/* Wake up device */
			if (priv->exit_deep_sleep(priv))
				lbs_deb_thread("Wakeup device failed\n");
			continue;
		}

547
		/* command timeout stuff */
548 549 550
		if (priv->cmd_timed_out && priv->cur_cmd) {
			struct cmd_ctrl_node *cmdnode = priv->cur_cmd;

551 552
			netdev_info(dev, "Timeout submitting command 0x%04x\n",
				    le16_to_cpu(cmdnode->cmdbuf->command));
H
Holger Schurig 已提交
553
			lbs_complete_command(priv, cmdnode, -ETIMEDOUT);
554 555 556 557

			/* Reset card, but only when it isn't in the process
			 * of being shutdown anyway. */
			if (!dev->dismantle && priv->reset_card)
H
Holger Schurig 已提交
558
				priv->reset_card(priv);
559 560 561
		}
		priv->cmd_timed_out = 0;

562 563 564
		if (!priv->fw_ready)
			continue;

565
		/* Check if we need to confirm Sleep Request received previously */
566 567 568
		if (priv->psstate == PS_STATE_PRE_SLEEP &&
		    !priv->dnld_sent && !priv->cur_cmd) {
			if (priv->connect_status == LBS_CONNECTED) {
569 570 571 572
				lbs_deb_thread("pre-sleep, currenttxskb %p, "
					"dnld_sent %d, cur_cmd %p\n",
					priv->currenttxskb, priv->dnld_sent,
					priv->cur_cmd);
573

574
				lbs_ps_confirm_sleep(priv);
575 576 577 578 579 580
			} else {
				/* workaround for firmware sending
				 * deauth/linkloss event immediately
				 * after sleep request; remove this
				 * after firmware fixes it
				 */
581
				priv->psstate = PS_STATE_AWAKE;
582 583
				netdev_alert(dev,
					     "ignore PS_SleepConfirm in non-connected state\n");
584 585 586 587 588 589
			}
		}

		/* The PS state is changed during processing of Sleep Request
		 * event above
		 */
590 591
		if ((priv->psstate == PS_STATE_SLEEP) ||
		    (priv->psstate == PS_STATE_PRE_SLEEP))
592 593
			continue;

594 595 596
		if (priv->is_deep_sleep)
			continue;

597
		/* Execute the next command */
598
		if (!priv->dnld_sent && !priv->cur_cmd)
599
			lbs_execute_next_command(priv);
600

601 602 603 604 605 606 607 608
		spin_lock_irq(&priv->driver_lock);
		if (!priv->dnld_sent && priv->tx_pending_len > 0) {
			int ret = priv->hw_host_to_card(priv, MVMS_DAT,
							priv->tx_pending_buf,
							priv->tx_pending_len);
			if (ret) {
				lbs_deb_tx("host_to_card failed %d\n", ret);
				priv->dnld_sent = DNLD_RES_RECEIVED;
609 610 611
			} else {
				mod_timer(&priv->tx_lockup_timer,
					  jiffies + (HZ * 5));
612 613 614 615 616 617 618 619
			}
			priv->tx_pending_len = 0;
			if (!priv->currenttxskb) {
				/* We can wake the queues immediately if we aren't
				   waiting for TX feedback */
				if (priv->connect_status == LBS_CONNECTED)
					netif_wake_queue(priv->dev);
				if (priv->mesh_dev &&
620
				    netif_running(priv->mesh_dev))
621 622 623 624
					netif_wake_queue(priv->mesh_dev);
			}
		}
		spin_unlock_irq(&priv->driver_lock);
625 626
	}

627
	del_timer(&priv->command_timer);
628
	del_timer(&priv->tx_lockup_timer);
629
	del_timer(&priv->auto_deepsleep_timer);
630 631 632 633

	return 0;
}

634
/**
635 636
 * lbs_setup_firmware - gets the HW spec from the firmware and sets
 *        some basic parameters
637
 *
638 639
 *  @priv:	A pointer to &struct lbs_private structure
 *  returns:	0 or -1
640 641 642 643 644 645 646
 */
static int lbs_setup_firmware(struct lbs_private *priv)
{
	int ret = -1;
	s16 curlevel = 0, minlevel = 0, maxlevel = 0;

	/* Read MAC address from firmware */
647
	eth_broadcast_addr(priv->current_addr);
648 649 650 651 652 653 654 655 656 657 658 659 660 661
	ret = lbs_update_hw_spec(priv);
	if (ret)
		goto done;

	/* Read power levels if available */
	ret = lbs_get_tx_power(priv, &curlevel, &minlevel, &maxlevel);
	if (ret == 0) {
		priv->txpower_cur = curlevel;
		priv->txpower_min = minlevel;
		priv->txpower_max = maxlevel;
	}

	/* Send cmd to FW to enable 11D function */
	ret = lbs_set_snmp_mib(priv, SNMP_MIB_OID_11D_ENABLE, 1);
662 663
	if (ret)
		goto done;
664

665
	ret = lbs_set_mac_control_sync(priv);
666 667 668 669
done:
	return ret;
}

670 671 672 673
int lbs_suspend(struct lbs_private *priv)
{
	int ret;

674 675 676
	if (priv->is_deep_sleep) {
		ret = lbs_set_deep_sleep(priv, 0);
		if (ret) {
677 678
			netdev_err(priv->dev,
				   "deep sleep cancellation failed: %d\n", ret);
679 680 681
			return ret;
		}
		priv->deep_sleep_required = 1;
682 683
	}

684
	ret = lbs_set_host_sleep(priv, 1);
685

686 687 688
	netif_device_detach(priv->dev);
	if (priv->mesh_dev)
		netif_device_detach(priv->mesh_dev);
689 690 691 692 693

	return ret;
}
EXPORT_SYMBOL_GPL(lbs_suspend);

694
int lbs_resume(struct lbs_private *priv)
695
{
696
	int ret;
697

698
	ret = lbs_set_host_sleep(priv, 0);
699 700 701 702 703

	netif_device_attach(priv->dev);
	if (priv->mesh_dev)
		netif_device_attach(priv->mesh_dev);

704 705 706 707
	if (priv->deep_sleep_required) {
		priv->deep_sleep_required = 0;
		ret = lbs_set_deep_sleep(priv, 1);
		if (ret)
708 709
			netdev_err(priv->dev,
				   "deep sleep activation failed: %d\n", ret);
710 711
	}

712 713
	if (priv->setup_fw_on_resume)
		ret = lbs_setup_firmware(priv);
714

H
Holger Schurig 已提交
715 716
	return ret;
}
717
EXPORT_SYMBOL_GPL(lbs_resume);
H
Holger Schurig 已提交
718 719

/**
720 721 722 723
 * lbs_cmd_timeout_handler - handles the timeout of command sending.
 * It will re-send the same command again.
 *
 * @data: &struct lbs_private pointer
H
Holger Schurig 已提交
724
 */
H
Holger Schurig 已提交
725
static void lbs_cmd_timeout_handler(unsigned long data)
H
Holger Schurig 已提交
726
{
727
	struct lbs_private *priv = (struct lbs_private *)data;
H
Holger Schurig 已提交
728 729
	unsigned long flags;

730
	spin_lock_irqsave(&priv->driver_lock, flags);
H
Holger Schurig 已提交
731

732
	if (!priv->cur_cmd)
733
		goto out;
H
Holger Schurig 已提交
734

735 736
	netdev_info(priv->dev, "command 0x%04x timed out\n",
		    le16_to_cpu(priv->cur_cmd->cmdbuf->command));
H
Holger Schurig 已提交
737

738
	priv->cmd_timed_out = 1;
739 740 741 742 743 744 745 746

	/*
	 * If the device didn't even acknowledge the command, reset the state
	 * so that we don't block all future commands due to this one timeout.
	 */
	if (priv->dnld_sent == DNLD_CMD_SENT)
		priv->dnld_sent = DNLD_RES_RECEIVED;

747
	wake_up(&priv->waitq);
748
out:
749
	spin_unlock_irqrestore(&priv->driver_lock, flags);
H
Holger Schurig 已提交
750 751
}

752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775
/**
 * lbs_tx_lockup_handler - handles the timeout of the passing of TX frames
 * to the hardware. This is known to frequently happen with SD8686 when
 * waking up after a Wake-on-WLAN-triggered resume.
 *
 * @data: &struct lbs_private pointer
 */
static void lbs_tx_lockup_handler(unsigned long data)
{
	struct lbs_private *priv = (struct lbs_private *)data;
	unsigned long flags;

	spin_lock_irqsave(&priv->driver_lock, flags);

	netdev_info(priv->dev, "TX lockup detected\n");
	if (priv->reset_card)
		priv->reset_card(priv);

	priv->dnld_sent = DNLD_RES_RECEIVED;
	wake_up_interruptible(&priv->waitq);

	spin_unlock_irqrestore(&priv->driver_lock, flags);
}

776
/**
777 778 779 780
 * auto_deepsleep_timer_fn - put the device back to deep sleep mode when
 * timer expires and no activity (command, event, data etc.) is detected.
 * @data:	&struct lbs_private pointer
 * returns:	N/A
781 782 783 784 785 786 787 788 789
 */
static void auto_deepsleep_timer_fn(unsigned long data)
{
	struct lbs_private *priv = (struct lbs_private *)data;

	if (priv->is_activity_detected) {
		priv->is_activity_detected = 0;
	} else {
		if (priv->is_auto_deep_sleep_enabled &&
790 791 792 793
		    (!priv->wakeup_dev_required) &&
		    (priv->connect_status != LBS_CONNECTED)) {
			struct cmd_header cmd;

794
			lbs_deb_main("Entering auto deep sleep mode...\n");
795 796 797 798
			memset(&cmd, 0, sizeof(cmd));
			cmd.size = cpu_to_le16(sizeof(cmd));
			lbs_cmd_async(priv, CMD_802_11_DEEP_SLEEP, &cmd,
					sizeof(cmd));
799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824
		}
	}
	mod_timer(&priv->auto_deepsleep_timer , jiffies +
				(priv->auto_deep_sleep_timeout * HZ)/1000);
}

int lbs_enter_auto_deep_sleep(struct lbs_private *priv)
{
	priv->is_auto_deep_sleep_enabled = 1;
	if (priv->is_deep_sleep)
		priv->wakeup_dev_required = 1;
	mod_timer(&priv->auto_deepsleep_timer ,
			jiffies + (priv->auto_deep_sleep_timeout * HZ)/1000);

	return 0;
}

int lbs_exit_auto_deep_sleep(struct lbs_private *priv)
{
	priv->is_auto_deep_sleep_enabled = 0;
	priv->auto_deep_sleep_timeout = 0;
	del_timer(&priv->auto_deepsleep_timer);

	return 0;
}

825
static int lbs_init_adapter(struct lbs_private *priv)
826
{
K
Kiran Divekar 已提交
827
	int ret;
H
Holger Schurig 已提交
828

829
	eth_broadcast_addr(priv->current_addr);
H
Holger Schurig 已提交
830

831
	priv->connect_status = LBS_DISCONNECTED;
832
	priv->channel = DEFAULT_AD_HOC_CHANNEL;
833
	priv->mac_control = CMD_ACT_MAC_RX_ON | CMD_ACT_MAC_TX_ON;
834
	priv->radio_on = 1;
835 836
	priv->psmode = LBS802_11POWERMODECAM;
	priv->psstate = PS_STATE_FULL_POWER;
837 838
	priv->is_deep_sleep = 0;
	priv->is_auto_deep_sleep_enabled = 0;
839
	priv->deep_sleep_required = 0;
840 841
	priv->wakeup_dev_required = 0;
	init_waitqueue_head(&priv->ds_awake_q);
842
	init_waitqueue_head(&priv->scan_q);
843
	priv->authtype_auto = 1;
844 845 846
	priv->is_host_sleep_configured = 0;
	priv->is_host_sleep_activated = 0;
	init_waitqueue_head(&priv->host_sleep_q);
847
	init_waitqueue_head(&priv->fw_waitq);
848
	mutex_init(&priv->lock);
H
Holger Schurig 已提交
849

H
Holger Schurig 已提交
850
	setup_timer(&priv->command_timer, lbs_cmd_timeout_handler,
851
		(unsigned long)priv);
852 853
	setup_timer(&priv->tx_lockup_timer, lbs_tx_lockup_handler,
		(unsigned long)priv);
854 855
	setup_timer(&priv->auto_deepsleep_timer, auto_deepsleep_timer_fn,
			(unsigned long)priv);
H
Holger Schurig 已提交
856

857 858
	INIT_LIST_HEAD(&priv->cmdfreeq);
	INIT_LIST_HEAD(&priv->cmdpendingq);
H
Holger Schurig 已提交
859

860
	spin_lock_init(&priv->driver_lock);
H
Holger Schurig 已提交
861

862
	/* Allocate the command buffers */
863
	if (lbs_allocate_cmd_buffer(priv)) {
864
		pr_err("Out of memory allocating command buffers\n");
865 866 867 868 869 870 871
		ret = -ENOMEM;
		goto out;
	}
	priv->resp_idx = 0;
	priv->resp_len[0] = priv->resp_len[1] = 0;

	/* Create the event FIFO */
S
Stefani Seibold 已提交
872
	ret = kfifo_alloc(&priv->event_fifo, sizeof(u32) * 16, GFP_KERNEL);
873
	if (ret) {
874
		pr_err("Out of memory allocating event FIFO buffer\n");
875
		goto out;
876
	}
H
Holger Schurig 已提交
877

878 879 880
out:
	return ret;
}
H
Holger Schurig 已提交
881

882
static void lbs_free_adapter(struct lbs_private *priv)
883
{
884
	lbs_free_cmd_buffer(priv);
885
	kfifo_free(&priv->event_fifo);
886
	del_timer(&priv->command_timer);
887
	del_timer(&priv->tx_lockup_timer);
888
	del_timer(&priv->auto_deepsleep_timer);
H
Holger Schurig 已提交
889 890
}

891 892 893 894 895
static const struct net_device_ops lbs_netdev_ops = {
	.ndo_open 		= lbs_dev_open,
	.ndo_stop		= lbs_eth_stop,
	.ndo_start_xmit		= lbs_hard_start_xmit,
	.ndo_set_mac_address	= lbs_set_mac_address,
896
	.ndo_set_rx_mode	= lbs_set_multicast_list,
897 898 899
	.ndo_validate_addr	= eth_validate_addr,
};

900
/**
901
 * lbs_add_card - adds the card. It will probe the
902
 * card, allocate the lbs_priv and initialize the device.
903
 *
904 905 906
 * @card:	A pointer to card
 * @dmdev:	A pointer to &struct device
 * returns:	A pointer to &struct lbs_private structure
907
 */
908
struct lbs_private *lbs_add_card(void *card, struct device *dmdev)
909
{
910 911
	struct net_device *dev;
	struct wireless_dev *wdev;
912
	struct lbs_private *priv = NULL;
913 914

	/* Allocate an Ethernet device and register it */
915 916
	wdev = lbs_cfg_alloc(dmdev);
	if (IS_ERR(wdev)) {
917
		pr_err("cfg80211 init failed\n");
918
		goto done;
919
	}
K
Kiran Divekar 已提交
920

921 922 923
	wdev->iftype = NL80211_IFTYPE_STATION;
	priv = wdev_priv(wdev);
	priv->wdev = wdev;
924

925
	if (lbs_init_adapter(priv)) {
926
		pr_err("failed to initialize adapter structure\n");
927 928 929
		goto err_wdev;
	}

930
	dev = alloc_netdev(0, "wlan%d", NET_NAME_UNKNOWN, ether_setup);
931 932 933
	if (!dev) {
		dev_err(dmdev, "no memory for network device instance\n");
		goto err_adapter;
934 935
	}

936 937 938 939
	dev->ieee80211_ptr = wdev;
	dev->ml_priv = priv;
	SET_NETDEV_DEV(dev, dmdev);
	wdev->netdev = dev;
940
	priv->dev = dev;
941

942
 	dev->netdev_ops = &lbs_netdev_ops;
943
	dev->watchdog_timeo = 5 * HZ;
944
	dev->ethtool_ops = &lbs_ethtool_ops;
945 946
	dev->flags |= IFF_BROADCAST | IFF_MULTICAST;

947
	priv->card = card;
948

949
	strcpy(dev->name, "wlan%d");
950 951 952

	lbs_deb_thread("Starting main thread...\n");
	init_waitqueue_head(&priv->waitq);
953
	priv->main_thread = kthread_run(lbs_thread, dev, "lbs_main");
954 955
	if (IS_ERR(priv->main_thread)) {
		lbs_deb_thread("Error creating main thread.\n");
956
		goto err_ndev;
957 958
	}

959
	priv->work_thread = create_singlethread_workqueue("lbs_worker");
960
	INIT_WORK(&priv->mcast_work, lbs_set_mcast_worker);
961

962
	priv->wol_criteria = EHS_REMOVE_WAKEUP;
963
	priv->wol_gpio = 0xff;
964
	priv->wol_gap = 20;
965
	priv->ehs_remove_supported = true;
966

967 968
	goto done;

969
 err_ndev:
970
	free_netdev(dev);
971 972 973 974 975 976 977

 err_adapter:
	lbs_free_adapter(priv);

 err_wdev:
	lbs_cfg_free(priv);

978
	priv = NULL;
979

980 981 982
done:
	return priv;
}
983
EXPORT_SYMBOL_GPL(lbs_add_card);
984

985

986
void lbs_remove_card(struct lbs_private *priv)
987
{
988
	struct net_device *dev = priv->dev;
989

990
	lbs_remove_mesh(priv);
D
Daniel Drake 已提交
991 992 993

	if (priv->wiphy_registered)
		lbs_scan_deinit(priv);
994

995 996
	lbs_wait_for_firmware_load(priv);

997 998 999 1000
	/* worker thread destruction blocks on the in-flight command which
	 * should have been cleared already in lbs_stop_card().
	 */
	lbs_deb_main("destroying worker thread\n");
1001
	destroy_workqueue(priv->work_thread);
1002
	lbs_deb_main("done destroying worker thread\n");
1003

1004 1005
	if (priv->psmode == LBS802_11POWERMODEMAX_PSP) {
		priv->psmode = LBS802_11POWERMODECAM;
1006 1007 1008 1009 1010 1011
		/* no need to wakeup if already woken up,
		 * on suspend, this exit ps command is not processed
		 * the driver hangs
		 */
		if (priv->psstate != PS_STATE_FULL_POWER)
			lbs_set_ps_mode(priv, PS_MODE_ACTION_EXIT_PS, true);
1012 1013
	}

1014 1015 1016 1017 1018
	if (priv->is_deep_sleep) {
		priv->is_deep_sleep = 0;
		wake_up_interruptible(&priv->ds_awake_q);
	}

1019 1020 1021 1022
	priv->is_host_sleep_configured = 0;
	priv->is_host_sleep_activated = 0;
	wake_up_interruptible(&priv->host_sleep_q);

1023
	/* Stop the thread servicing the interrupts */
1024
	priv->surpriseremoved = 1;
1025 1026
	kthread_stop(priv->main_thread);

1027
	lbs_free_adapter(priv);
1028
	lbs_cfg_free(priv);
1029 1030
	free_netdev(dev);
}
1031
EXPORT_SYMBOL_GPL(lbs_remove_card);
1032 1033


K
Kiran Divekar 已提交
1034
int lbs_rtap_supported(struct lbs_private *priv)
H
Holger Schurig 已提交
1035 1036 1037 1038 1039 1040 1041 1042 1043 1044
{
	if (MRVL_FW_MAJOR_REV(priv->fwrelease) == MRVL_FW_V5)
		return 1;

	/* newer firmware use a capability mask */
	return ((MRVL_FW_MAJOR_REV(priv->fwrelease) >= MRVL_FW_V10) &&
		(priv->fwcapinfo & MESH_CAPINFO_ENABLE_MASK));
}


1045
int lbs_start_card(struct lbs_private *priv)
1046 1047 1048 1049 1050
{
	struct net_device *dev = priv->dev;
	int ret = -1;

	/* poke the firmware */
1051
	ret = lbs_setup_firmware(priv);
1052 1053 1054
	if (ret)
		goto done;

1055 1056 1057 1058 1059
	if (!lbs_disablemesh)
		lbs_init_mesh(priv);
	else
		pr_info("%s: mesh disabled\n", dev->name);

1060 1061
	ret = lbs_cfg_register(priv);
	if (ret) {
1062
		pr_err("cannot register device\n");
1063
		goto done;
1064
	}
1065

1066 1067
	if (lbs_mesh_activated(priv))
		lbs_start_mesh(priv);
H
Holger Schurig 已提交
1068

1069
	lbs_debugfs_init_one(priv, dev);
1070

1071
	netdev_info(dev, "Marvell WLAN 802.11 adapter\n");
1072

1073
	ret = 0;
1074

1075
done:
1076 1077
	return ret;
}
1078
EXPORT_SYMBOL_GPL(lbs_start_card);
1079 1080


1081
void lbs_stop_card(struct lbs_private *priv)
1082
{
1083
	struct net_device *dev;
1084

1085
	if (!priv)
1086
		return;
1087
	dev = priv->dev;
1088

D
Daniel Drake 已提交
1089 1090 1091
	/* If the netdev isn't registered, it means that lbs_start_card() was
	 * never called so we have nothing to do here. */
	if (dev->reg_state != NETREG_REGISTERED)
1092
		return;
D
Daniel Drake 已提交
1093

1094 1095
	netif_stop_queue(dev);
	netif_carrier_off(dev);
1096

1097
	lbs_debugfs_remove_one(priv);
H
Holger Schurig 已提交
1098
	lbs_deinit_mesh(priv);
1099
	unregister_netdev(dev);
1100
}
1101
EXPORT_SYMBOL_GPL(lbs_stop_card);
1102

1103

1104 1105 1106 1107 1108 1109 1110 1111 1112
void lbs_queue_event(struct lbs_private *priv, u32 event)
{
	unsigned long flags;

	spin_lock_irqsave(&priv->driver_lock, flags);

	if (priv->psstate == PS_STATE_SLEEP)
		priv->psstate = PS_STATE_AWAKE;

1113
	kfifo_in(&priv->event_fifo, (unsigned char *) &event, sizeof(u32));
1114

1115
	wake_up(&priv->waitq);
1116 1117 1118 1119 1120 1121

	spin_unlock_irqrestore(&priv->driver_lock, flags);
}
EXPORT_SYMBOL_GPL(lbs_queue_event);

void lbs_notify_command_response(struct lbs_private *priv, u8 resp_idx)
1122
{
1123
	if (priv->psstate == PS_STATE_SLEEP)
1124
		priv->psstate = PS_STATE_AWAKE;
1125 1126 1127 1128 1129

	/* Swap buffers by flipping the response index */
	BUG_ON(resp_idx > 1);
	priv->resp_idx = resp_idx;

1130
	wake_up(&priv->waitq);
1131
}
1132
EXPORT_SYMBOL_GPL(lbs_notify_command_response);
1133

1134
static int __init lbs_init_module(void)
1135
{
1136 1137 1138
	memset(&confirm_sleep, 0, sizeof(confirm_sleep));
	confirm_sleep.hdr.command = cpu_to_le16(CMD_802_11_PS_MODE);
	confirm_sleep.hdr.size = cpu_to_le16(sizeof(confirm_sleep));
1139
	confirm_sleep.action = cpu_to_le16(PS_MODE_ACTION_SLEEP_CONFIRMED);
1140
	lbs_debugfs_init();
1141

1142
	return 0;
1143 1144
}

1145
static void __exit lbs_exit_module(void)
1146
{
1147
	lbs_debugfs_remove();
1148 1149
}

1150 1151
module_init(lbs_init_module);
module_exit(lbs_exit_module);
1152

1153
MODULE_DESCRIPTION("Libertas WLAN Driver Library");
1154 1155
MODULE_AUTHOR("Marvell International Ltd.");
MODULE_LICENSE("GPL");