main.c 28.4 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;
H
Holger Schurig 已提交
641
	wake_up_interruptible(&priv->waitq);
642
out:
643
	spin_unlock_irqrestore(&priv->driver_lock, flags);
644
	lbs_deb_leave(LBS_DEB_CMD);
H
Holger Schurig 已提交
645 646
}

647
/**
648 649 650 651
 * 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
652 653 654 655 656 657 658 659 660 661 662
 */
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 &&
663 664 665 666
		    (!priv->wakeup_dev_required) &&
		    (priv->connect_status != LBS_CONNECTED)) {
			struct cmd_header cmd;

667
			lbs_deb_main("Entering auto deep sleep mode...\n");
668 669 670 671
			memset(&cmd, 0, sizeof(cmd));
			cmd.size = cpu_to_le16(sizeof(cmd));
			lbs_cmd_async(priv, CMD_802_11_DEEP_SLEEP, &cmd,
					sizeof(cmd));
672 673 674 675 676 677 678 679 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
		}
	}
	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;
}

705
static int lbs_init_adapter(struct lbs_private *priv)
706
{
K
Kiran Divekar 已提交
707
	int ret;
H
Holger Schurig 已提交
708

709 710
	lbs_deb_enter(LBS_DEB_MAIN);

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

713
	priv->connect_status = LBS_DISCONNECTED;
714
	priv->channel = DEFAULT_AD_HOC_CHANNEL;
715
	priv->mac_control = CMD_ACT_MAC_RX_ON | CMD_ACT_MAC_TX_ON;
716
	priv->radio_on = 1;
717 718
	priv->psmode = LBS802_11POWERMODECAM;
	priv->psstate = PS_STATE_FULL_POWER;
719 720
	priv->is_deep_sleep = 0;
	priv->is_auto_deep_sleep_enabled = 0;
721
	priv->deep_sleep_required = 0;
722 723
	priv->wakeup_dev_required = 0;
	init_waitqueue_head(&priv->ds_awake_q);
724
	init_waitqueue_head(&priv->scan_q);
725
	priv->authtype_auto = 1;
726 727 728
	priv->is_host_sleep_configured = 0;
	priv->is_host_sleep_activated = 0;
	init_waitqueue_head(&priv->host_sleep_q);
729
	mutex_init(&priv->lock);
H
Holger Schurig 已提交
730

H
Holger Schurig 已提交
731
	setup_timer(&priv->command_timer, lbs_cmd_timeout_handler,
732
		(unsigned long)priv);
733 734
	setup_timer(&priv->auto_deepsleep_timer, auto_deepsleep_timer_fn,
			(unsigned long)priv);
H
Holger Schurig 已提交
735

736 737
	INIT_LIST_HEAD(&priv->cmdfreeq);
	INIT_LIST_HEAD(&priv->cmdpendingq);
H
Holger Schurig 已提交
738

739
	spin_lock_init(&priv->driver_lock);
H
Holger Schurig 已提交
740

741
	/* Allocate the command buffers */
742
	if (lbs_allocate_cmd_buffer(priv)) {
743
		pr_err("Out of memory allocating command buffers\n");
744 745 746 747 748 749 750
		ret = -ENOMEM;
		goto out;
	}
	priv->resp_idx = 0;
	priv->resp_len[0] = priv->resp_len[1] = 0;

	/* Create the event FIFO */
S
Stefani Seibold 已提交
751
	ret = kfifo_alloc(&priv->event_fifo, sizeof(u32) * 16, GFP_KERNEL);
752
	if (ret) {
753
		pr_err("Out of memory allocating event FIFO buffer\n");
754
		goto out;
755
	}
H
Holger Schurig 已提交
756

757
out:
758 759
	lbs_deb_leave_args(LBS_DEB_MAIN, "ret %d", ret);

760 761
	return ret;
}
H
Holger Schurig 已提交
762

763
static void lbs_free_adapter(struct lbs_private *priv)
764
{
765
	lbs_deb_enter(LBS_DEB_MAIN);
H
Holger Schurig 已提交
766

767
	lbs_free_cmd_buffer(priv);
768
	kfifo_free(&priv->event_fifo);
769
	del_timer(&priv->command_timer);
770
	del_timer(&priv->auto_deepsleep_timer);
771 772

	lbs_deb_leave(LBS_DEB_MAIN);
H
Holger Schurig 已提交
773 774
}

775 776 777 778 779 780 781 782 783 784
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,
};

785
/**
786
 * lbs_add_card - adds the card. It will probe the
787
 * card, allocate the lbs_priv and initialize the device.
788
 *
789 790 791
 * @card:	A pointer to card
 * @dmdev:	A pointer to &struct device
 * returns:	A pointer to &struct lbs_private structure
792
 */
793
struct lbs_private *lbs_add_card(void *card, struct device *dmdev)
794
{
795 796
	struct net_device *dev;
	struct wireless_dev *wdev;
797
	struct lbs_private *priv = NULL;
798

799
	lbs_deb_enter(LBS_DEB_MAIN);
800 801

	/* Allocate an Ethernet device and register it */
802 803
	wdev = lbs_cfg_alloc(dmdev);
	if (IS_ERR(wdev)) {
804
		pr_err("cfg80211 init failed\n");
805
		goto done;
806
	}
K
Kiran Divekar 已提交
807

808 809 810
	wdev->iftype = NL80211_IFTYPE_STATION;
	priv = wdev_priv(wdev);
	priv->wdev = wdev;
811

812
	if (lbs_init_adapter(priv)) {
813
		pr_err("failed to initialize adapter structure\n");
814 815 816 817 818 819 820
		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;
821 822
	}

823 824 825 826
	dev->ieee80211_ptr = wdev;
	dev->ml_priv = priv;
	SET_NETDEV_DEV(dev, dmdev);
	wdev->netdev = dev;
827
	priv->dev = dev;
828

829
 	dev->netdev_ops = &lbs_netdev_ops;
830
	dev->watchdog_timeo = 5 * HZ;
831
	dev->ethtool_ops = &lbs_ethtool_ops;
832 833
	dev->flags |= IFF_BROADCAST | IFF_MULTICAST;

834
	priv->card = card;
835

836
	strcpy(dev->name, "wlan%d");
837 838 839

	lbs_deb_thread("Starting main thread...\n");
	init_waitqueue_head(&priv->waitq);
840
	priv->main_thread = kthread_run(lbs_thread, dev, "lbs_main");
841 842
	if (IS_ERR(priv->main_thread)) {
		lbs_deb_thread("Error creating main thread.\n");
843
		goto err_ndev;
844 845
	}

846
	priv->work_thread = create_singlethread_workqueue("lbs_worker");
847
	INIT_WORK(&priv->mcast_work, lbs_set_mcast_worker);
848

849
	priv->wol_criteria = EHS_REMOVE_WAKEUP;
850
	priv->wol_gpio = 0xff;
851
	priv->wol_gap = 20;
852
	priv->ehs_remove_supported = true;
853

854 855
	goto done;

856
 err_ndev:
857
	free_netdev(dev);
858 859 860 861 862 863 864

 err_adapter:
	lbs_free_adapter(priv);

 err_wdev:
	lbs_cfg_free(priv);

865
	priv = NULL;
866

867
done:
868
	lbs_deb_leave_args(LBS_DEB_MAIN, "priv %p", priv);
869 870
	return priv;
}
871
EXPORT_SYMBOL_GPL(lbs_add_card);
872

873

874
void lbs_remove_card(struct lbs_private *priv)
875
{
876
	struct net_device *dev = priv->dev;
877 878

	lbs_deb_enter(LBS_DEB_MAIN);
879

880
	lbs_remove_mesh(priv);
K
Kiran Divekar 已提交
881
	lbs_scan_deinit(priv);
882

883
	dev = priv->dev;
884

885
	cancel_work_sync(&priv->mcast_work);
886 887 888 889 890

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

894 895
	if (priv->psmode == LBS802_11POWERMODEMAX_PSP) {
		priv->psmode = LBS802_11POWERMODECAM;
896
		lbs_set_ps_mode(priv, PS_MODE_ACTION_EXIT_PS, true);
897 898
	}

899 900 901 902 903
	if (priv->is_deep_sleep) {
		priv->is_deep_sleep = 0;
		wake_up_interruptible(&priv->ds_awake_q);
	}

904 905 906 907
	priv->is_host_sleep_configured = 0;
	priv->is_host_sleep_activated = 0;
	wake_up_interruptible(&priv->host_sleep_q);

908
	/* Stop the thread servicing the interrupts */
909
	priv->surpriseremoved = 1;
910 911
	kthread_stop(priv->main_thread);

912
	lbs_free_adapter(priv);
913
	lbs_cfg_free(priv);
914 915 916 917
	free_netdev(dev);

	lbs_deb_leave(LBS_DEB_MAIN);
}
918
EXPORT_SYMBOL_GPL(lbs_remove_card);
919 920


K
Kiran Divekar 已提交
921
int lbs_rtap_supported(struct lbs_private *priv)
H
Holger Schurig 已提交
922 923 924 925 926 927 928 929 930 931
{
	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));
}


932
int lbs_start_card(struct lbs_private *priv)
933 934 935 936 937 938 939
{
	struct net_device *dev = priv->dev;
	int ret = -1;

	lbs_deb_enter(LBS_DEB_MAIN);

	/* poke the firmware */
940
	ret = lbs_setup_firmware(priv);
941 942 943
	if (ret)
		goto done;

944
	if (lbs_cfg_register(priv)) {
945
		pr_err("cannot register device\n");
946
		goto done;
947
	}
948 949 950

	lbs_update_channel(priv);

951 952 953 954
	if (!lbs_disablemesh)
		lbs_init_mesh(priv);
	else
		pr_info("%s: mesh disabled\n", dev->name);
H
Holger Schurig 已提交
955

956
	lbs_debugfs_init_one(priv, dev);
957

958
	netdev_info(dev, "Marvell WLAN 802.11 adapter\n");
959

960
	ret = 0;
961

962
done:
963 964 965
	lbs_deb_leave_args(LBS_DEB_MAIN, "ret %d", ret);
	return ret;
}
966
EXPORT_SYMBOL_GPL(lbs_start_card);
967 968


969
void lbs_stop_card(struct lbs_private *priv)
970
{
971
	struct net_device *dev;
972 973 974 975 976
	struct cmd_ctrl_node *cmdnode;
	unsigned long flags;

	lbs_deb_enter(LBS_DEB_MAIN);

977 978
	if (!priv)
		goto out;
979
	dev = priv->dev;
980

981 982
	netif_stop_queue(dev);
	netif_carrier_off(dev);
983

984
	lbs_debugfs_remove_one(priv);
H
Holger Schurig 已提交
985 986
	lbs_deinit_mesh(priv);

987
	/* Delete the timeout of the currently processing command */
988
	del_timer_sync(&priv->command_timer);
989
	del_timer_sync(&priv->auto_deepsleep_timer);
990 991

	/* Flush pending command nodes */
992
	spin_lock_irqsave(&priv->driver_lock, flags);
993
	lbs_deb_main("clearing pending commands\n");
994
	list_for_each_entry(cmdnode, &priv->cmdpendingq, list) {
995
		cmdnode->result = -ENOENT;
996 997 998
		cmdnode->cmdwaitqwoken = 1;
		wake_up_interruptible(&cmdnode->cmdwait_q);
	}
999 1000 1001 1002 1003 1004 1005 1006 1007

	/* 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;
		wake_up_interruptible(&priv->cur_cmd->cmdwait_q);
	}
	lbs_deb_main("done clearing commands\n");
1008
	spin_unlock_irqrestore(&priv->driver_lock, flags);
1009 1010 1011

	unregister_netdev(dev);

1012
out:
1013
	lbs_deb_leave(LBS_DEB_MAIN);
1014
}
1015
EXPORT_SYMBOL_GPL(lbs_stop_card);
1016

1017

1018 1019 1020 1021 1022 1023 1024 1025 1026 1027
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;

1028
	kfifo_in(&priv->event_fifo, (unsigned char *) &event, sizeof(u32));
1029 1030 1031 1032 1033 1034 1035 1036 1037

	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)
1038
{
1039
	lbs_deb_enter(LBS_DEB_THREAD);
1040

1041
	if (priv->psstate == PS_STATE_SLEEP)
1042
		priv->psstate = PS_STATE_AWAKE;
1043 1044 1045 1046 1047

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

1048
	wake_up_interruptible(&priv->waitq);
1049

1050
	lbs_deb_leave(LBS_DEB_THREAD);
1051
}
1052
EXPORT_SYMBOL_GPL(lbs_notify_command_response);
1053

1054
/**
1055
 *  lbs_get_firmware - Retrieves two-stage firmware
1056
 *
1057 1058 1059 1060 1061 1062 1063 1064 1065
 *  @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
1066
 *
1067
 *  returns:		0 on success, non-zero on failure
1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084
 */
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) {
1085 1086
			dev_err(dev, "couldn't find helper firmware %s\n",
				user_helper);
1087 1088 1089 1090 1091 1092
			goto fail;
		}
	}
	if (user_mainfw) {
		ret = request_firmware(mainfw, user_mainfw, dev);
		if (ret) {
1093 1094
			dev_err(dev, "couldn't find main firmware %s\n",
				user_mainfw);
1095 1096 1097 1098 1099 1100 1101 1102 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
			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);

1159
static int __init lbs_init_module(void)
1160
{
1161
	lbs_deb_enter(LBS_DEB_MAIN);
1162 1163 1164
	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));
1165
	confirm_sleep.action = cpu_to_le16(PS_MODE_ACTION_SLEEP_CONFIRMED);
1166
	lbs_debugfs_init();
1167 1168
	lbs_deb_leave(LBS_DEB_MAIN);
	return 0;
1169 1170
}

1171
static void __exit lbs_exit_module(void)
1172
{
1173
	lbs_deb_enter(LBS_DEB_MAIN);
1174
	lbs_debugfs_remove();
1175
	lbs_deb_leave(LBS_DEB_MAIN);
1176 1177
}

1178 1179
module_init(lbs_init_module);
module_exit(lbs_exit_module);
1180

1181
MODULE_DESCRIPTION("Libertas WLAN Driver Library");
1182 1183
MODULE_AUTHOR("Marvell International Ltd.");
MODULE_LICENSE("GPL");