main.c 28.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/moduleparam.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
 *  lbs_dev_open - open the ethX interface
105
 *
106 107
 *  @dev:	A pointer to &net_device structure
 *  returns:	0 or -EBUSY if monitor mode active
108
 */
109
static int lbs_dev_open(struct net_device *dev)
110
{
111
	struct lbs_private *priv = dev->ml_priv;
112
	int ret = 0;
113

114 115
	lbs_deb_enter(LBS_DEB_NET);

116
	spin_lock_irq(&priv->driver_lock);
117
	priv->stopping = false;
118

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

124 125
	if (!priv->tx_pending_len)
		netif_wake_queue(dev);
126

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

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

142
	lbs_deb_enter(LBS_DEB_NET);
143

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

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

156
	lbs_deb_leave(LBS_DEB_NET);
157
	return 0;
158 159
}

160 161
void lbs_host_to_card_done(struct lbs_private *priv)
{
162 163
	unsigned long flags;

164 165
	lbs_deb_enter(LBS_DEB_THREAD);

166
	spin_lock_irqsave(&priv->driver_lock, flags);
167 168 169 170

	priv->dnld_sent = DNLD_RES_RECEIVED;

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

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

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

188
	lbs_deb_enter(LBS_DEB_NET);
189

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

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

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

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

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

213 214 215

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

226

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

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

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

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

259 260 261
	return i;
}

262
static void lbs_set_mcast_worker(struct work_struct *work)
263
{
264 265 266 267 268
	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;
269

270
	lbs_deb_enter(LBS_DEB_NET);
271

272 273 274 275 276 277 278 279 280 281 282 283 284 285 286
	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;
287 288
	}

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

316
	lbs_deb_leave(LBS_DEB_NET);
317 318
}

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

	schedule_work(&priv->mcast_work);
}

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

340
	lbs_deb_enter(LBS_DEB_THREAD);
341 342 343 344

	init_waitqueue_entry(&wait, current);

	for (;;) {
345
		int shouldsleep;
346
		u8 resp_idx;
347

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

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

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

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

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

		set_current_state(TASK_RUNNING);
395
		remove_wait_queue(&priv->waitq, &wait);
396

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

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

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

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

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

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

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

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

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

461 462 463
		if (!priv->fw_ready)
			continue;

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

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

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

493 494 495
		if (priv->is_deep_sleep)
			continue;

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

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

523
	del_timer(&priv->command_timer);
524
	del_timer(&priv->auto_deepsleep_timer);
525

526
	lbs_deb_leave(LBS_DEB_THREAD);
527 528 529
	return 0;
}

530
/**
531 532
 * lbs_setup_firmware - gets the HW spec from the firmware and sets
 *        some basic parameters
533
 *
534 535
 *  @priv:	A pointer to &struct lbs_private structure
 *  returns:	0 or -1
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 565 566
 */
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;
}

567 568 569 570
int lbs_suspend(struct lbs_private *priv)
{
	int ret;

571 572
	lbs_deb_enter(LBS_DEB_FW);

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

583
	ret = lbs_set_host_sleep(priv, 1);
584

585 586 587
	netif_device_detach(priv->dev);
	if (priv->mesh_dev)
		netif_device_detach(priv->mesh_dev);
588

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

594
int lbs_resume(struct lbs_private *priv)
595
{
596
	int ret;
597

598
	lbs_deb_enter(LBS_DEB_FW);
599

600
	ret = lbs_set_host_sleep(priv, 0);
601 602 603 604 605

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

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

614 615
	if (priv->setup_fw_on_resume)
		ret = lbs_setup_firmware(priv);
616

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

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

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

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

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

642
	priv->cmd_timed_out = 1;
643 644 645 646 647 648 649 650

	/*
	 * 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 已提交
651
	wake_up_interruptible(&priv->waitq);
652
out:
653
	spin_unlock_irqrestore(&priv->driver_lock, flags);
654
	lbs_deb_leave(LBS_DEB_CMD);
H
Holger Schurig 已提交
655 656
}

657
/**
658 659 660 661
 * 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
662 663 664 665 666 667 668 669 670 671 672
 */
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 &&
673 674 675 676
		    (!priv->wakeup_dev_required) &&
		    (priv->connect_status != LBS_CONNECTED)) {
			struct cmd_header cmd;

677
			lbs_deb_main("Entering auto deep sleep mode...\n");
678 679 680 681
			memset(&cmd, 0, sizeof(cmd));
			cmd.size = cpu_to_le16(sizeof(cmd));
			lbs_cmd_async(priv, CMD_802_11_DEEP_SLEEP, &cmd,
					sizeof(cmd));
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 713 714
		}
	}
	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;
}

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

719 720
	lbs_deb_enter(LBS_DEB_MAIN);

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

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

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

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

749
	spin_lock_init(&priv->driver_lock);
H
Holger Schurig 已提交
750

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

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

767
out:
768 769
	lbs_deb_leave_args(LBS_DEB_MAIN, "ret %d", ret);

770 771
	return ret;
}
H
Holger Schurig 已提交
772

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

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

	lbs_deb_leave(LBS_DEB_MAIN);
H
Holger Schurig 已提交
783 784
}

785 786 787 788 789 790 791 792 793 794
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,
};

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

809
	lbs_deb_enter(LBS_DEB_MAIN);
810 811

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

818 819 820
	wdev->iftype = NL80211_IFTYPE_STATION;
	priv = wdev_priv(wdev);
	priv->wdev = wdev;
821

822
	if (lbs_init_adapter(priv)) {
823
		pr_err("failed to initialize adapter structure\n");
824 825 826 827 828 829 830
		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;
831 832
	}

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

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

844
	priv->card = card;
845

846
	strcpy(dev->name, "wlan%d");
847 848 849

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

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

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

864 865
	goto done;

866
 err_ndev:
867
	free_netdev(dev);
868 869 870 871 872 873 874

 err_adapter:
	lbs_free_adapter(priv);

 err_wdev:
	lbs_cfg_free(priv);

875
	priv = NULL;
876

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

883

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

	lbs_deb_enter(LBS_DEB_MAIN);
889

890
	lbs_remove_mesh(priv);
K
Kiran Divekar 已提交
891
	lbs_scan_deinit(priv);
892

893
	dev = priv->dev;
894

895
	cancel_work_sync(&priv->mcast_work);
896 897 898 899 900

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

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

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

914 915 916 917
	priv->is_host_sleep_configured = 0;
	priv->is_host_sleep_activated = 0;
	wake_up_interruptible(&priv->host_sleep_q);

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

922
	lbs_free_adapter(priv);
923
	lbs_cfg_free(priv);
924 925 926 927
	free_netdev(dev);

	lbs_deb_leave(LBS_DEB_MAIN);
}
928
EXPORT_SYMBOL_GPL(lbs_remove_card);
929 930


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


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

	lbs_deb_enter(LBS_DEB_MAIN);

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

954 955 956 957 958
	if (!lbs_disablemesh)
		lbs_init_mesh(priv);
	else
		pr_info("%s: mesh disabled\n", dev->name);

959
	if (lbs_cfg_register(priv)) {
960
		pr_err("cannot register device\n");
961
		goto done;
962
	}
963

964 965
	if (lbs_mesh_activated(priv))
		lbs_start_mesh(priv);
966

967
	lbs_update_channel(priv);
H
Holger Schurig 已提交
968

969
	lbs_debugfs_init_one(priv, dev);
970

971
	netdev_info(dev, "Marvell WLAN 802.11 adapter\n");
972

973
	ret = 0;
974

975
done:
976 977 978
	lbs_deb_leave_args(LBS_DEB_MAIN, "ret %d", ret);
	return ret;
}
979
EXPORT_SYMBOL_GPL(lbs_start_card);
980 981


982
void lbs_stop_card(struct lbs_private *priv)
983
{
984
	struct net_device *dev;
985 986 987 988 989
	struct cmd_ctrl_node *cmdnode;
	unsigned long flags;

	lbs_deb_enter(LBS_DEB_MAIN);

990 991
	if (!priv)
		goto out;
992
	dev = priv->dev;
993

994 995
	netif_stop_queue(dev);
	netif_carrier_off(dev);
996

997
	lbs_debugfs_remove_one(priv);
H
Holger Schurig 已提交
998 999
	lbs_deinit_mesh(priv);

1000
	/* Delete the timeout of the currently processing command */
1001
	del_timer_sync(&priv->command_timer);
1002
	del_timer_sync(&priv->auto_deepsleep_timer);
1003 1004

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

	/* 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;
1018
		wake_up(&priv->cur_cmd->cmdwait_q);
1019 1020
	}
	lbs_deb_main("done clearing commands\n");
1021
	spin_unlock_irqrestore(&priv->driver_lock, flags);
1022 1023 1024

	unregister_netdev(dev);

1025
out:
1026
	lbs_deb_leave(LBS_DEB_MAIN);
1027
}
1028
EXPORT_SYMBOL_GPL(lbs_stop_card);
1029

1030

1031 1032 1033 1034 1035 1036 1037 1038 1039 1040
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;

1041
	kfifo_in(&priv->event_fifo, (unsigned char *) &event, sizeof(u32));
1042 1043 1044 1045 1046 1047 1048 1049 1050

	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)
1051
{
1052
	lbs_deb_enter(LBS_DEB_THREAD);
1053

1054
	if (priv->psstate == PS_STATE_SLEEP)
1055
		priv->psstate = PS_STATE_AWAKE;
1056 1057 1058 1059 1060

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

1061
	wake_up_interruptible(&priv->waitq);
1062

1063
	lbs_deb_leave(LBS_DEB_THREAD);
1064
}
1065
EXPORT_SYMBOL_GPL(lbs_notify_command_response);
1066

1067
/**
1068
 *  lbs_get_firmware - Retrieves two-stage firmware
1069
 *
1070 1071 1072 1073 1074 1075 1076 1077 1078
 *  @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
1079
 *
1080
 *  returns:		0 on success, non-zero on failure
1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097
 */
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) {
1098 1099
			dev_err(dev, "couldn't find helper firmware %s\n",
				user_helper);
1100 1101 1102 1103 1104 1105
			goto fail;
		}
	}
	if (user_mainfw) {
		ret = request_firmware(mainfw, user_mainfw, dev);
		if (ret) {
1106 1107
			dev_err(dev, "couldn't find main firmware %s\n",
				user_mainfw);
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 1167 1168 1169 1170 1171
			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);

1172
static int __init lbs_init_module(void)
1173
{
1174
	lbs_deb_enter(LBS_DEB_MAIN);
1175 1176 1177
	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));
1178
	confirm_sleep.action = cpu_to_le16(PS_MODE_ACTION_SLEEP_CONFIRMED);
1179
	lbs_debugfs_init();
1180 1181
	lbs_deb_leave(LBS_DEB_MAIN);
	return 0;
1182 1183
}

1184
static void __exit lbs_exit_module(void)
1185
{
1186
	lbs_deb_enter(LBS_DEB_MAIN);
1187
	lbs_debugfs_remove();
1188
	lbs_deb_leave(LBS_DEB_MAIN);
1189 1190
}

1191 1192
module_init(lbs_init_module);
module_exit(lbs_exit_module);
1193

1194
MODULE_DESCRIPTION("Libertas WLAN Driver Library");
1195 1196
MODULE_AUTHOR("Marvell International Ltd.");
MODULE_LICENSE("GPL");