main.c 28.6 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/moduleparam.h>
10 11 12 13
#include <linux/delay.h>
#include <linux/etherdevice.h>
#include <linux/netdevice.h>
#include <linux/if_arp.h>
14
#include <linux/kthread.h>
15
#include <linux/kfifo.h>
16
#include <linux/slab.h>
17
#include <net/cfg80211.h>
18 19 20 21

#include "host.h"
#include "decl.h"
#include "dev.h"
22
#include "cfg.h"
23
#include "debugfs.h"
24
#include "cmd.h"
25

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

33 34

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

39 40 41 42
unsigned int lbs_disablemesh;
EXPORT_SYMBOL_GPL(lbs_disablemesh);
module_param_named(libertas_disablemesh, lbs_disablemesh, int, 0644);

43

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


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

57
/*
58 59 60
 * 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.
61
 */
62 63 64 65
static u8 fw_data_rates[MAX_RATES] =
    { 0x02, 0x04, 0x0B, 0x16, 0x00, 0x0C, 0x12,
      0x18, 0x24, 0x30, 0x48, 0x60, 0x6C, 0x00
};
66 67

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

/**
81
 *  lbs_data_rate_to_fw_index - use rate to get the index
82
 *
83 84
 *  @rate:	data rate
 *  returns:	index or 0
85
 */
86
u8 lbs_data_rate_to_fw_index(u32 rate)
87 88 89 90 91 92 93 94 95 96 97 98
{
	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;
}
99

100

101
/**
102
 *  lbs_dev_open - open the ethX interface
103
 *
104 105
 *  @dev:	A pointer to &net_device structure
 *  returns:	0 or -EBUSY if monitor mode active
106
 */
107
static int lbs_dev_open(struct net_device *dev)
108
{
109
	struct lbs_private *priv = dev->ml_priv;
110
	int ret = 0;
111

112 113
	lbs_deb_enter(LBS_DEB_NET);

114
	spin_lock_irq(&priv->driver_lock);
115
	priv->stopping = false;
116

117 118 119 120
	if (priv->connect_status == LBS_CONNECTED)
		netif_carrier_on(dev);
	else
		netif_carrier_off(dev);
121

122 123
	if (!priv->tx_pending_len)
		netif_wake_queue(dev);
124

125
	spin_unlock_irq(&priv->driver_lock);
126
	lbs_deb_leave_args(LBS_DEB_NET, "ret %d", ret);
127
	return ret;
128 129 130
}

/**
131
 *  lbs_eth_stop - close the ethX interface
132
 *
133 134
 *  @dev:	A pointer to &net_device structure
 *  returns:	0
135
 */
136
static int lbs_eth_stop(struct net_device *dev)
137
{
138
	struct lbs_private *priv = dev->ml_priv;
139

140
	lbs_deb_enter(LBS_DEB_NET);
141

142
	spin_lock_irq(&priv->driver_lock);
143
	priv->stopping = true;
144 145
	netif_stop_queue(dev);
	spin_unlock_irq(&priv->driver_lock);
146

147
	schedule_work(&priv->mcast_work);
148 149 150 151 152
	cancel_delayed_work_sync(&priv->scan_work);
	if (priv->scan_req) {
		cfg80211_scan_done(priv->scan_req, false);
		priv->scan_req = NULL;
	}
153

154
	lbs_deb_leave(LBS_DEB_NET);
155
	return 0;
156 157
}

158 159
void lbs_host_to_card_done(struct lbs_private *priv)
{
160 161
	unsigned long flags;

162 163
	lbs_deb_enter(LBS_DEB_THREAD);

164
	spin_lock_irqsave(&priv->driver_lock, flags);
165 166 167 168

	priv->dnld_sent = DNLD_RES_RECEIVED;

	/* Wake main thread if commands are pending */
169 170 171 172
	if (!priv->cur_cmd || priv->tx_pending_len > 0) {
		if (!priv->wakeup_dev_required)
			wake_up_interruptible(&priv->waitq);
	}
173

174
	spin_unlock_irqrestore(&priv->driver_lock, flags);
175
	lbs_deb_leave(LBS_DEB_THREAD);
176 177 178
}
EXPORT_SYMBOL_GPL(lbs_host_to_card_done);

179
int lbs_set_mac_address(struct net_device *dev, void *addr)
180 181
{
	int ret = 0;
182
	struct lbs_private *priv = dev->ml_priv;
183
	struct sockaddr *phwaddr = addr;
184
	struct cmd_ds_802_11_mac_address cmd;
185

186
	lbs_deb_enter(LBS_DEB_NET);
187

188
	/* In case it was called from the mesh device */
189
	dev = priv->dev;
190

191 192 193
	cmd.hdr.size = cpu_to_le16(sizeof(cmd));
	cmd.action = cpu_to_le16(CMD_ACT_SET);
	memcpy(cmd.macadd, phwaddr->sa_data, ETH_ALEN);
194

195
	ret = lbs_cmd_with_response(priv, CMD_802_11_MAC_ADDRESS, &cmd);
196
	if (ret) {
197
		lbs_deb_net("set MAC address failed\n");
198 199 200
		goto done;
	}

201 202
	memcpy(priv->current_addr, phwaddr->sa_data, ETH_ALEN);
	memcpy(dev->dev_addr, phwaddr->sa_data, ETH_ALEN);
203
	if (priv->mesh_dev)
204
		memcpy(priv->mesh_dev->dev_addr, phwaddr->sa_data, ETH_ALEN);
205 206

done:
207
	lbs_deb_leave_args(LBS_DEB_NET, "ret %d", ret);
208 209 210
	return ret;
}

211 212 213

static inline int mac_in_list(unsigned char *list, int list_len,
			      unsigned char *mac)
214
{
215 216 217 218 219 220 221 222 223
	while (list_len) {
		if (!memcmp(list, mac, ETH_ALEN))
			return 1;
		list += ETH_ALEN;
		list_len--;
	}
	return 0;
}

224

225 226 227 228
static int lbs_add_mcast_addrs(struct cmd_ds_mac_multicast_adr *cmd,
			       struct net_device *dev, int nr_addrs)
{
	int i = nr_addrs;
229
	struct netdev_hw_addr *ha;
230
	int cnt;
231 232 233 234

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

235
	netif_addr_lock_bh(dev);
236
	cnt = netdev_mc_count(dev);
237 238
	netdev_for_each_mc_addr(ha, dev) {
		if (mac_in_list(cmd->maclist, nr_addrs, ha->addr)) {
J
Johannes Berg 已提交
239
			lbs_deb_net("mcast address %s:%pM skipped\n", dev->name,
240
				    ha->addr);
241
			cnt--;
242 243
			continue;
		}
244

245 246
		if (i == MRVDRV_MAX_MULTICAST_LIST_SIZE)
			break;
247
		memcpy(&cmd->maclist[6*i], ha->addr, ETH_ALEN);
J
Johannes Berg 已提交
248
		lbs_deb_net("mcast address %s:%pM added to filter\n", dev->name,
249
			    ha->addr);
250
		i++;
251
		cnt--;
252
	}
253
	netif_addr_unlock_bh(dev);
254
	if (cnt)
255 256
		return -EOVERFLOW;

257 258 259
	return i;
}

260
static void lbs_set_mcast_worker(struct work_struct *work)
261
{
262 263 264 265 266
	struct lbs_private *priv = container_of(work, struct lbs_private, mcast_work);
	struct cmd_ds_mac_multicast_adr mcast_cmd;
	int dev_flags;
	int nr_addrs;
	int old_mac_control = priv->mac_control;
267

268
	lbs_deb_enter(LBS_DEB_NET);
269

270 271 272 273 274 275 276 277 278 279 280 281 282 283 284
	dev_flags = priv->dev->flags;
	if (priv->mesh_dev)
		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;
285 286
	}

287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310
	/* 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:
311 312
	if (priv->mac_control != old_mac_control)
		lbs_set_mac_control(priv);
313

314
	lbs_deb_leave(LBS_DEB_NET);
315 316
}

317
void lbs_set_multicast_list(struct net_device *dev)
318
{
319
	struct lbs_private *priv = dev->ml_priv;
320 321 322 323

	schedule_work(&priv->mcast_work);
}

324
/**
325
 *  lbs_thread - handles the major jobs in the LBS driver.
326 327
 *  It handles all events generated by firmware, RX data received
 *  from firmware and TX data sent from kernel.
328
 *
329 330
 *  @data:	A pointer to &lbs_thread structure
 *  returns:	0
331
 */
332
static int lbs_thread(void *data)
333
{
334
	struct net_device *dev = data;
335
	struct lbs_private *priv = dev->ml_priv;
336 337
	wait_queue_t wait;

338
	lbs_deb_enter(LBS_DEB_THREAD);
339 340 341 342

	init_waitqueue_entry(&wait, current);

	for (;;) {
343
		int shouldsleep;
344
		u8 resp_idx;
345

346 347
		lbs_deb_thread("1: currenttxskb %p, dnld_sent %d\n",
				priv->currenttxskb, priv->dnld_sent);
348

349
		add_wait_queue(&priv->waitq, &wait);
350
		set_current_state(TASK_INTERRUPTIBLE);
351
		spin_lock_irq(&priv->driver_lock);
352

353
		if (kthread_should_stop())
354
			shouldsleep = 0;	/* Bye */
355 356
		else if (priv->surpriseremoved)
			shouldsleep = 1;	/* We need to wait until we're _told_ to die */
357 358
		else if (priv->psstate == PS_STATE_SLEEP)
			shouldsleep = 1;	/* Sleep mode. Nothing we can do till it wakes */
359 360
		else if (priv->cmd_timed_out)
			shouldsleep = 0;	/* Command timed out. Recover */
361 362
		else if (!priv->fw_ready)
			shouldsleep = 1;	/* Firmware not ready. We're waiting for it */
363 364
		else if (priv->dnld_sent)
			shouldsleep = 1;	/* Something is en route to the device already */
365 366
		else if (priv->tx_pending_len > 0)
			shouldsleep = 0;	/* We've a packet to send */
367 368
		else if (priv->resp_len[priv->resp_idx])
			shouldsleep = 0;	/* We have a command response */
369 370
		else if (priv->cur_cmd)
			shouldsleep = 1;	/* Can't send a command; one already running */
371 372
		else if (!list_empty(&priv->cmdpendingq) &&
					!(priv->wakeup_dev_required))
373
			shouldsleep = 0;	/* We have a command to send */
S
Stefani Seibold 已提交
374
		else if (kfifo_len(&priv->event_fifo))
375
			shouldsleep = 0;	/* We have an event to process */
376 377 378 379
		else
			shouldsleep = 1;	/* No command */

		if (shouldsleep) {
380
			lbs_deb_thread("sleeping, connect_status %d, "
381
				"psmode %d, psstate %d\n",
382 383
				priv->connect_status,
				priv->psmode, priv->psstate);
384
			spin_unlock_irq(&priv->driver_lock);
385 386
			schedule();
		} else
387
			spin_unlock_irq(&priv->driver_lock);
388

389 390
		lbs_deb_thread("2: currenttxskb %p, dnld_send %d\n",
			       priv->currenttxskb, priv->dnld_sent);
391 392

		set_current_state(TASK_RUNNING);
393
		remove_wait_queue(&priv->waitq, &wait);
394

395 396
		lbs_deb_thread("3: currenttxskb %p, dnld_sent %d\n",
			       priv->currenttxskb, priv->dnld_sent);
397

398
		if (kthread_should_stop()) {
399
			lbs_deb_thread("break from main thread\n");
400 401 402
			break;
		}

403 404 405 406
		if (priv->surpriseremoved) {
			lbs_deb_thread("adapter removed; waiting to die...\n");
			continue;
		}
407

408 409
		lbs_deb_thread("4: currenttxskb %p, dnld_sent %d\n",
		       priv->currenttxskb, priv->dnld_sent);
410

411
		/* Process any pending command response */
412
		spin_lock_irq(&priv->driver_lock);
413 414
		resp_idx = priv->resp_idx;
		if (priv->resp_len[resp_idx]) {
415
			spin_unlock_irq(&priv->driver_lock);
416 417 418
			lbs_process_command_response(priv,
				priv->resp_buf[resp_idx],
				priv->resp_len[resp_idx]);
419
			spin_lock_irq(&priv->driver_lock);
420
			priv->resp_len[resp_idx] = 0;
421
		}
422
		spin_unlock_irq(&priv->driver_lock);
423

424 425
		/* Process hardware events, e.g. card removed, link lost */
		spin_lock_irq(&priv->driver_lock);
S
Stefani Seibold 已提交
426
		while (kfifo_len(&priv->event_fifo)) {
427
			u32 event;
428

S
Stefani Seibold 已提交
429 430 431 432
			if (kfifo_out(&priv->event_fifo,
				(unsigned char *) &event, sizeof(event)) !=
				sizeof(event))
					break;
433 434 435 436 437 438 439 440 441 442 443 444 445 446
			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;
		}

447
		/* command timeout stuff */
448 449 450
		if (priv->cmd_timed_out && priv->cur_cmd) {
			struct cmd_ctrl_node *cmdnode = priv->cur_cmd;

451 452
			netdev_info(dev, "Timeout submitting command 0x%04x\n",
				    le16_to_cpu(cmdnode->cmdbuf->command));
H
Holger Schurig 已提交
453 454 455
			lbs_complete_command(priv, cmdnode, -ETIMEDOUT);
			if (priv->reset_card)
				priv->reset_card(priv);
456 457 458
		}
		priv->cmd_timed_out = 0;

459 460 461
		if (!priv->fw_ready)
			continue;

462
		/* Check if we need to confirm Sleep Request received previously */
463 464 465
		if (priv->psstate == PS_STATE_PRE_SLEEP &&
		    !priv->dnld_sent && !priv->cur_cmd) {
			if (priv->connect_status == LBS_CONNECTED) {
466 467 468 469
				lbs_deb_thread("pre-sleep, currenttxskb %p, "
					"dnld_sent %d, cur_cmd %p\n",
					priv->currenttxskb, priv->dnld_sent,
					priv->cur_cmd);
470

471
				lbs_ps_confirm_sleep(priv);
472 473 474 475 476 477
			} else {
				/* workaround for firmware sending
				 * deauth/linkloss event immediately
				 * after sleep request; remove this
				 * after firmware fixes it
				 */
478
				priv->psstate = PS_STATE_AWAKE;
479 480
				netdev_alert(dev,
					     "ignore PS_SleepConfirm in non-connected state\n");
481 482 483 484 485 486
			}
		}

		/* The PS state is changed during processing of Sleep Request
		 * event above
		 */
487 488
		if ((priv->psstate == PS_STATE_SLEEP) ||
		    (priv->psstate == PS_STATE_PRE_SLEEP))
489 490
			continue;

491 492 493
		if (priv->is_deep_sleep)
			continue;

494
		/* Execute the next command */
495
		if (!priv->dnld_sent && !priv->cur_cmd)
496
			lbs_execute_next_command(priv);
497

498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513
		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;
			}
			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 &&
514
				    lbs_mesh_connected(priv))
515 516 517 518
					netif_wake_queue(priv->mesh_dev);
			}
		}
		spin_unlock_irq(&priv->driver_lock);
519 520
	}

521
	del_timer(&priv->command_timer);
522
	del_timer(&priv->auto_deepsleep_timer);
523

524
	lbs_deb_leave(LBS_DEB_THREAD);
525 526 527
	return 0;
}

528
/**
529 530
 * lbs_setup_firmware - gets the HW spec from the firmware and sets
 *        some basic parameters
531
 *
532 533
 *  @priv:	A pointer to &struct lbs_private structure
 *  returns:	0 or -1
534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564
 */
static int lbs_setup_firmware(struct lbs_private *priv)
{
	int ret = -1;
	s16 curlevel = 0, minlevel = 0, maxlevel = 0;

	lbs_deb_enter(LBS_DEB_FW);

	/* Read MAC address from firmware */
	memset(priv->current_addr, 0xff, ETH_ALEN);
	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);

	lbs_set_mac_control(priv);
done:
	lbs_deb_leave_args(LBS_DEB_FW, "ret %d", ret);
	return ret;
}

565 566 567 568
int lbs_suspend(struct lbs_private *priv)
{
	int ret;

569 570
	lbs_deb_enter(LBS_DEB_FW);

571 572 573
	if (priv->is_deep_sleep) {
		ret = lbs_set_deep_sleep(priv, 0);
		if (ret) {
574 575
			netdev_err(priv->dev,
				   "deep sleep cancellation failed: %d\n", ret);
576 577 578
			return ret;
		}
		priv->deep_sleep_required = 1;
579 580
	}

581
	ret = lbs_set_host_sleep(priv, 1);
582

583 584 585
	netif_device_detach(priv->dev);
	if (priv->mesh_dev)
		netif_device_detach(priv->mesh_dev);
586

587
	lbs_deb_leave_args(LBS_DEB_FW, "ret %d", ret);
588 589 590 591
	return ret;
}
EXPORT_SYMBOL_GPL(lbs_suspend);

592
int lbs_resume(struct lbs_private *priv)
593
{
594
	int ret;
595

596
	lbs_deb_enter(LBS_DEB_FW);
597

598
	ret = lbs_set_host_sleep(priv, 0);
599 600 601 602 603

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

604 605 606 607
	if (priv->deep_sleep_required) {
		priv->deep_sleep_required = 0;
		ret = lbs_set_deep_sleep(priv, 1);
		if (ret)
608 609
			netdev_err(priv->dev,
				   "deep sleep activation failed: %d\n", ret);
610 611
	}

612 613
	if (priv->setup_fw_on_resume)
		ret = lbs_setup_firmware(priv);
614

H
Holger Schurig 已提交
615 616 617
	lbs_deb_leave_args(LBS_DEB_FW, "ret %d", ret);
	return ret;
}
618
EXPORT_SYMBOL_GPL(lbs_resume);
H
Holger Schurig 已提交
619 620

/**
621 622 623 624
 * 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 已提交
625
 */
H
Holger Schurig 已提交
626
static void lbs_cmd_timeout_handler(unsigned long data)
H
Holger Schurig 已提交
627
{
628
	struct lbs_private *priv = (struct lbs_private *)data;
H
Holger Schurig 已提交
629 630
	unsigned long flags;

631
	lbs_deb_enter(LBS_DEB_CMD);
632
	spin_lock_irqsave(&priv->driver_lock, flags);
H
Holger Schurig 已提交
633

634
	if (!priv->cur_cmd)
635
		goto out;
H
Holger Schurig 已提交
636

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

640
	priv->cmd_timed_out = 1;
641 642 643 644 645 646 647 648

	/*
	 * 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;

H
Holger Schurig 已提交
649
	wake_up_interruptible(&priv->waitq);
650
out:
651
	spin_unlock_irqrestore(&priv->driver_lock, flags);
652
	lbs_deb_leave(LBS_DEB_CMD);
H
Holger Schurig 已提交
653 654
}

655
/**
656 657 658 659
 * 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
660 661 662 663 664 665 666 667 668 669 670
 */
static void auto_deepsleep_timer_fn(unsigned long data)
{
	struct lbs_private *priv = (struct lbs_private *)data;

	lbs_deb_enter(LBS_DEB_CMD);

	if (priv->is_activity_detected) {
		priv->is_activity_detected = 0;
	} else {
		if (priv->is_auto_deep_sleep_enabled &&
671 672 673 674
		    (!priv->wakeup_dev_required) &&
		    (priv->connect_status != LBS_CONNECTED)) {
			struct cmd_header cmd;

675
			lbs_deb_main("Entering auto deep sleep mode...\n");
676 677 678 679
			memset(&cmd, 0, sizeof(cmd));
			cmd.size = cpu_to_le16(sizeof(cmd));
			lbs_cmd_async(priv, CMD_802_11_DEEP_SLEEP, &cmd,
					sizeof(cmd));
680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712
		}
	}
	mod_timer(&priv->auto_deepsleep_timer , jiffies +
				(priv->auto_deep_sleep_timeout * HZ)/1000);
	lbs_deb_leave(LBS_DEB_CMD);
}

int lbs_enter_auto_deep_sleep(struct lbs_private *priv)
{
	lbs_deb_enter(LBS_DEB_SDIO);

	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);

	lbs_deb_leave(LBS_DEB_SDIO);
	return 0;
}

int lbs_exit_auto_deep_sleep(struct lbs_private *priv)
{
	lbs_deb_enter(LBS_DEB_SDIO);

	priv->is_auto_deep_sleep_enabled = 0;
	priv->auto_deep_sleep_timeout = 0;
	del_timer(&priv->auto_deepsleep_timer);

	lbs_deb_leave(LBS_DEB_SDIO);
	return 0;
}

713
static int lbs_init_adapter(struct lbs_private *priv)
714
{
K
Kiran Divekar 已提交
715
	int ret;
H
Holger Schurig 已提交
716

717 718
	lbs_deb_enter(LBS_DEB_MAIN);

719
	memset(priv->current_addr, 0xff, ETH_ALEN);
H
Holger Schurig 已提交
720

721
	priv->connect_status = LBS_DISCONNECTED;
722
	priv->channel = DEFAULT_AD_HOC_CHANNEL;
723
	priv->mac_control = CMD_ACT_MAC_RX_ON | CMD_ACT_MAC_TX_ON;
724
	priv->radio_on = 1;
725 726
	priv->psmode = LBS802_11POWERMODECAM;
	priv->psstate = PS_STATE_FULL_POWER;
727 728
	priv->is_deep_sleep = 0;
	priv->is_auto_deep_sleep_enabled = 0;
729
	priv->deep_sleep_required = 0;
730 731
	priv->wakeup_dev_required = 0;
	init_waitqueue_head(&priv->ds_awake_q);
732
	init_waitqueue_head(&priv->scan_q);
733
	priv->authtype_auto = 1;
734 735 736
	priv->is_host_sleep_configured = 0;
	priv->is_host_sleep_activated = 0;
	init_waitqueue_head(&priv->host_sleep_q);
737
	mutex_init(&priv->lock);
H
Holger Schurig 已提交
738

H
Holger Schurig 已提交
739
	setup_timer(&priv->command_timer, lbs_cmd_timeout_handler,
740
		(unsigned long)priv);
741 742
	setup_timer(&priv->auto_deepsleep_timer, auto_deepsleep_timer_fn,
			(unsigned long)priv);
H
Holger Schurig 已提交
743

744 745
	INIT_LIST_HEAD(&priv->cmdfreeq);
	INIT_LIST_HEAD(&priv->cmdpendingq);
H
Holger Schurig 已提交
746

747
	spin_lock_init(&priv->driver_lock);
H
Holger Schurig 已提交
748

749
	/* Allocate the command buffers */
750
	if (lbs_allocate_cmd_buffer(priv)) {
751
		pr_err("Out of memory allocating command buffers\n");
752 753 754 755 756 757 758
		ret = -ENOMEM;
		goto out;
	}
	priv->resp_idx = 0;
	priv->resp_len[0] = priv->resp_len[1] = 0;

	/* Create the event FIFO */
S
Stefani Seibold 已提交
759
	ret = kfifo_alloc(&priv->event_fifo, sizeof(u32) * 16, GFP_KERNEL);
760
	if (ret) {
761
		pr_err("Out of memory allocating event FIFO buffer\n");
762
		goto out;
763
	}
H
Holger Schurig 已提交
764

765
out:
766 767
	lbs_deb_leave_args(LBS_DEB_MAIN, "ret %d", ret);

768 769
	return ret;
}
H
Holger Schurig 已提交
770

771
static void lbs_free_adapter(struct lbs_private *priv)
772
{
773
	lbs_deb_enter(LBS_DEB_MAIN);
H
Holger Schurig 已提交
774

775
	lbs_free_cmd_buffer(priv);
776
	kfifo_free(&priv->event_fifo);
777
	del_timer(&priv->command_timer);
778
	del_timer(&priv->auto_deepsleep_timer);
779 780

	lbs_deb_leave(LBS_DEB_MAIN);
H
Holger Schurig 已提交
781 782
}

783 784 785 786 787 788 789 790 791 792
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,
	.ndo_set_multicast_list = lbs_set_multicast_list,
	.ndo_change_mtu		= eth_change_mtu,
	.ndo_validate_addr	= eth_validate_addr,
};

793
/**
794
 * lbs_add_card - adds the card. It will probe the
795
 * card, allocate the lbs_priv and initialize the device.
796
 *
797 798 799
 * @card:	A pointer to card
 * @dmdev:	A pointer to &struct device
 * returns:	A pointer to &struct lbs_private structure
800
 */
801
struct lbs_private *lbs_add_card(void *card, struct device *dmdev)
802
{
803 804
	struct net_device *dev;
	struct wireless_dev *wdev;
805
	struct lbs_private *priv = NULL;
806

807
	lbs_deb_enter(LBS_DEB_MAIN);
808 809

	/* Allocate an Ethernet device and register it */
810 811
	wdev = lbs_cfg_alloc(dmdev);
	if (IS_ERR(wdev)) {
812
		pr_err("cfg80211 init failed\n");
813
		goto done;
814
	}
K
Kiran Divekar 已提交
815

816 817 818
	wdev->iftype = NL80211_IFTYPE_STATION;
	priv = wdev_priv(wdev);
	priv->wdev = wdev;
819

820
	if (lbs_init_adapter(priv)) {
821
		pr_err("failed to initialize adapter structure\n");
822 823 824 825 826 827 828
		goto err_wdev;
	}

	dev = alloc_netdev(0, "wlan%d", ether_setup);
	if (!dev) {
		dev_err(dmdev, "no memory for network device instance\n");
		goto err_adapter;
829 830
	}

831 832 833 834
	dev->ieee80211_ptr = wdev;
	dev->ml_priv = priv;
	SET_NETDEV_DEV(dev, dmdev);
	wdev->netdev = dev;
835
	priv->dev = dev;
836

837
 	dev->netdev_ops = &lbs_netdev_ops;
838
	dev->watchdog_timeo = 5 * HZ;
839
	dev->ethtool_ops = &lbs_ethtool_ops;
840 841
	dev->flags |= IFF_BROADCAST | IFF_MULTICAST;

842
	priv->card = card;
843

844
	strcpy(dev->name, "wlan%d");
845 846 847

	lbs_deb_thread("Starting main thread...\n");
	init_waitqueue_head(&priv->waitq);
848
	priv->main_thread = kthread_run(lbs_thread, dev, "lbs_main");
849 850
	if (IS_ERR(priv->main_thread)) {
		lbs_deb_thread("Error creating main thread.\n");
851
		goto err_ndev;
852 853
	}

854
	priv->work_thread = create_singlethread_workqueue("lbs_worker");
855
	INIT_WORK(&priv->mcast_work, lbs_set_mcast_worker);
856

857
	priv->wol_criteria = EHS_REMOVE_WAKEUP;
858
	priv->wol_gpio = 0xff;
859
	priv->wol_gap = 20;
860
	priv->ehs_remove_supported = true;
861

862 863
	goto done;

864
 err_ndev:
865
	free_netdev(dev);
866 867 868 869 870 871 872

 err_adapter:
	lbs_free_adapter(priv);

 err_wdev:
	lbs_cfg_free(priv);

873
	priv = NULL;
874

875
done:
876
	lbs_deb_leave_args(LBS_DEB_MAIN, "priv %p", priv);
877 878
	return priv;
}
879
EXPORT_SYMBOL_GPL(lbs_add_card);
880

881

882
void lbs_remove_card(struct lbs_private *priv)
883
{
884
	struct net_device *dev = priv->dev;
885 886

	lbs_deb_enter(LBS_DEB_MAIN);
887

888
	lbs_remove_mesh(priv);
K
Kiran Divekar 已提交
889
	lbs_scan_deinit(priv);
890

891
	dev = priv->dev;
892

893
	cancel_work_sync(&priv->mcast_work);
894 895 896 897 898

	/* 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");
899
	destroy_workqueue(priv->work_thread);
900
	lbs_deb_main("done destroying worker thread\n");
901

902 903
	if (priv->psmode == LBS802_11POWERMODEMAX_PSP) {
		priv->psmode = LBS802_11POWERMODECAM;
904
		lbs_set_ps_mode(priv, PS_MODE_ACTION_EXIT_PS, true);
905 906
	}

907 908 909 910 911
	if (priv->is_deep_sleep) {
		priv->is_deep_sleep = 0;
		wake_up_interruptible(&priv->ds_awake_q);
	}

912 913 914 915
	priv->is_host_sleep_configured = 0;
	priv->is_host_sleep_activated = 0;
	wake_up_interruptible(&priv->host_sleep_q);

916
	/* Stop the thread servicing the interrupts */
917
	priv->surpriseremoved = 1;
918 919
	kthread_stop(priv->main_thread);

920
	lbs_free_adapter(priv);
921
	lbs_cfg_free(priv);
922 923 924 925
	free_netdev(dev);

	lbs_deb_leave(LBS_DEB_MAIN);
}
926
EXPORT_SYMBOL_GPL(lbs_remove_card);
927 928


K
Kiran Divekar 已提交
929
int lbs_rtap_supported(struct lbs_private *priv)
H
Holger Schurig 已提交
930 931 932 933 934 935 936 937 938 939
{
	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));
}


940
int lbs_start_card(struct lbs_private *priv)
941 942 943 944 945 946 947
{
	struct net_device *dev = priv->dev;
	int ret = -1;

	lbs_deb_enter(LBS_DEB_MAIN);

	/* poke the firmware */
948
	ret = lbs_setup_firmware(priv);
949 950 951
	if (ret)
		goto done;

952
	if (lbs_cfg_register(priv)) {
953
		pr_err("cannot register device\n");
954
		goto done;
955
	}
956 957 958

	lbs_update_channel(priv);

959 960 961 962
	if (!lbs_disablemesh)
		lbs_init_mesh(priv);
	else
		pr_info("%s: mesh disabled\n", dev->name);
H
Holger Schurig 已提交
963

964
	lbs_debugfs_init_one(priv, dev);
965

966
	netdev_info(dev, "Marvell WLAN 802.11 adapter\n");
967

968
	ret = 0;
969

970
done:
971 972 973
	lbs_deb_leave_args(LBS_DEB_MAIN, "ret %d", ret);
	return ret;
}
974
EXPORT_SYMBOL_GPL(lbs_start_card);
975 976


977
void lbs_stop_card(struct lbs_private *priv)
978
{
979
	struct net_device *dev;
980 981 982 983 984
	struct cmd_ctrl_node *cmdnode;
	unsigned long flags;

	lbs_deb_enter(LBS_DEB_MAIN);

985 986
	if (!priv)
		goto out;
987
	dev = priv->dev;
988

989 990
	netif_stop_queue(dev);
	netif_carrier_off(dev);
991

992
	lbs_debugfs_remove_one(priv);
H
Holger Schurig 已提交
993 994
	lbs_deinit_mesh(priv);

995
	/* Delete the timeout of the currently processing command */
996
	del_timer_sync(&priv->command_timer);
997
	del_timer_sync(&priv->auto_deepsleep_timer);
998 999

	/* Flush pending command nodes */
1000
	spin_lock_irqsave(&priv->driver_lock, flags);
1001
	lbs_deb_main("clearing pending commands\n");
1002
	list_for_each_entry(cmdnode, &priv->cmdpendingq, list) {
1003
		cmdnode->result = -ENOENT;
1004
		cmdnode->cmdwaitqwoken = 1;
1005
		wake_up(&cmdnode->cmdwait_q);
1006
	}
1007 1008 1009 1010 1011 1012

	/* Flush the command the card is currently processing */
	if (priv->cur_cmd) {
		lbs_deb_main("clearing current command\n");
		priv->cur_cmd->result = -ENOENT;
		priv->cur_cmd->cmdwaitqwoken = 1;
1013
		wake_up(&priv->cur_cmd->cmdwait_q);
1014 1015
	}
	lbs_deb_main("done clearing commands\n");
1016
	spin_unlock_irqrestore(&priv->driver_lock, flags);
1017 1018 1019

	unregister_netdev(dev);

1020
out:
1021
	lbs_deb_leave(LBS_DEB_MAIN);
1022
}
1023
EXPORT_SYMBOL_GPL(lbs_stop_card);
1024

1025

1026 1027 1028 1029 1030 1031 1032 1033 1034 1035
void lbs_queue_event(struct lbs_private *priv, u32 event)
{
	unsigned long flags;

	lbs_deb_enter(LBS_DEB_THREAD);
	spin_lock_irqsave(&priv->driver_lock, flags);

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

1036
	kfifo_in(&priv->event_fifo, (unsigned char *) &event, sizeof(u32));
1037 1038 1039 1040 1041 1042 1043 1044 1045

	wake_up_interruptible(&priv->waitq);

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

void lbs_notify_command_response(struct lbs_private *priv, u8 resp_idx)
1046
{
1047
	lbs_deb_enter(LBS_DEB_THREAD);
1048

1049
	if (priv->psstate == PS_STATE_SLEEP)
1050
		priv->psstate = PS_STATE_AWAKE;
1051 1052 1053 1054 1055

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

1056
	wake_up_interruptible(&priv->waitq);
1057

1058
	lbs_deb_leave(LBS_DEB_THREAD);
1059
}
1060
EXPORT_SYMBOL_GPL(lbs_notify_command_response);
1061

1062
/**
1063
 *  lbs_get_firmware - Retrieves two-stage firmware
1064
 *
1065 1066 1067 1068 1069 1070 1071 1072 1073
 *  @dev:     	A pointer to &device structure
 *  @user_helper: User-defined helper firmware file
 *  @user_mainfw: User-defined main firmware file
 *  @card_model: Bus-specific card model ID used to filter firmware table
 *		elements
 *  @fw_table:	Table of firmware file names and device model numbers
 *		terminated by an entry with a NULL helper name
 *  @helper:	On success, the helper firmware; caller must free
 *  @mainfw:	On success, the main firmware; caller must free
1074
 *
1075
 *  returns:		0 on success, non-zero on failure
1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092
 */
int lbs_get_firmware(struct device *dev, const char *user_helper,
			const char *user_mainfw, u32 card_model,
			const struct lbs_fw_table *fw_table,
			const struct firmware **helper,
			const struct firmware **mainfw)
{
	const struct lbs_fw_table *iter;
	int ret;

	BUG_ON(helper == NULL);
	BUG_ON(mainfw == NULL);

	/* Try user-specified firmware first */
	if (user_helper) {
		ret = request_firmware(helper, user_helper, dev);
		if (ret) {
1093 1094
			dev_err(dev, "couldn't find helper firmware %s\n",
				user_helper);
1095 1096 1097 1098 1099 1100
			goto fail;
		}
	}
	if (user_mainfw) {
		ret = request_firmware(mainfw, user_mainfw, dev);
		if (ret) {
1101 1102
			dev_err(dev, "couldn't find main firmware %s\n",
				user_mainfw);
1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166
			goto fail;
		}
	}

	if (*helper && *mainfw)
		return 0;

	/* Otherwise search for firmware to use.  If neither the helper or
	 * the main firmware were specified by the user, then we need to
	 * make sure that found helper & main are from the same entry in
	 * fw_table.
	 */
	iter = fw_table;
	while (iter && iter->helper) {
		if (iter->model != card_model)
			goto next;

		if (*helper == NULL) {
			ret = request_firmware(helper, iter->helper, dev);
			if (ret)
				goto next;

			/* If the device has one-stage firmware (ie cf8305) and
			 * we've got it then we don't need to bother with the
			 * main firmware.
			 */
			if (iter->fwname == NULL)
				return 0;
		}

		if (*mainfw == NULL) {
			ret = request_firmware(mainfw, iter->fwname, dev);
			if (ret && !user_helper) {
				/* Clear the helper if it wasn't user-specified
				 * and the main firmware load failed, to ensure
				 * we don't have mismatched firmware pairs.
				 */
				release_firmware(*helper);
				*helper = NULL;
			}
		}

		if (*helper && *mainfw)
			return 0;

  next:
		iter++;
	}

  fail:
	/* Failed */
	if (*helper) {
		release_firmware(*helper);
		*helper = NULL;
	}
	if (*mainfw) {
		release_firmware(*mainfw);
		*mainfw = NULL;
	}

	return -ENOENT;
}
EXPORT_SYMBOL_GPL(lbs_get_firmware);

1167
static int __init lbs_init_module(void)
1168
{
1169
	lbs_deb_enter(LBS_DEB_MAIN);
1170 1171 1172
	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));
1173
	confirm_sleep.action = cpu_to_le16(PS_MODE_ACTION_SLEEP_CONFIRMED);
1174
	lbs_debugfs_init();
1175 1176
	lbs_deb_leave(LBS_DEB_MAIN);
	return 0;
1177 1178
}

1179
static void __exit lbs_exit_module(void)
1180
{
1181
	lbs_deb_enter(LBS_DEB_MAIN);
1182
	lbs_debugfs_remove();
1183
	lbs_deb_leave(LBS_DEB_MAIN);
1184 1185
}

1186 1187
module_init(lbs_init_module);
module_exit(lbs_exit_module);
1188

1189
MODULE_DESCRIPTION("Libertas WLAN Driver Library");
1190 1191
MODULE_AUTHOR("Marvell International Ltd.");
MODULE_LICENSE("GPL");