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

7
#include <linux/moduleparam.h>
8 9 10 11
#include <linux/delay.h>
#include <linux/etherdevice.h>
#include <linux/netdevice.h>
#include <linux/if_arp.h>
12
#include <linux/kthread.h>
13
#include <linux/kfifo.h>
14
#include <linux/stddef.h>
J
Johannes Berg 已提交
15
#include <linux/ieee80211.h>
16
#include <net/iw_handler.h>
17
#include <net/cfg80211.h>
18 19 20 21 22

#include "host.h"
#include "decl.h"
#include "dev.h"
#include "wext.h"
23
#include "cfg.h"
24
#include "debugfs.h"
25
#include "scan.h"
26
#include "assoc.h"
27
#include "cmd.h"
28

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

36 37

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


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


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

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

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

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

97

98 99
static int lbs_add_rtap(struct lbs_private *priv);
static void lbs_remove_rtap(struct lbs_private *priv);
100

101 102 103 104

/**
 * Get function for sysfs attribute rtap
 */
105
static ssize_t lbs_rtap_get(struct device *dev,
106 107
		struct device_attribute *attr, char * buf)
{
108
	struct lbs_private *priv = to_net_dev(dev)->ml_priv;
109
	return snprintf(buf, 5, "0x%X\n", priv->monitormode);
110 111 112 113 114
}

/**
 *  Set function for sysfs attribute rtap
 */
115
static ssize_t lbs_rtap_set(struct device *dev,
116 117 118
		struct device_attribute *attr, const char * buf, size_t count)
{
	int monitor_mode;
119
	struct lbs_private *priv = to_net_dev(dev)->ml_priv;
120 121

	sscanf(buf, "%x", &monitor_mode);
122 123
	if (monitor_mode) {
		if (priv->monitormode == monitor_mode)
124
			return strlen(buf);
125
		if (!priv->monitormode) {
126 127
			if (priv->infra_open || priv->mesh_open)
				return -EBUSY;
128
			if (priv->mode == IW_MODE_INFRA)
129 130 131
				lbs_cmd_80211_deauthenticate(priv,
							     priv->curbssparams.bssid,
							     WLAN_REASON_DEAUTH_LEAVING);
132
			else if (priv->mode == IW_MODE_ADHOC)
133
				lbs_adhoc_stop(priv);
134
			lbs_add_rtap(priv);
135
		}
136
		priv->monitormode = monitor_mode;
137
	} else {
138
		if (!priv->monitormode)
139
			return strlen(buf);
140
		priv->monitormode = 0;
141
		lbs_remove_rtap(priv);
D
David Woodhouse 已提交
142

143 144 145
		if (priv->currenttxskb) {
			dev_kfree_skb_any(priv->currenttxskb);
			priv->currenttxskb = NULL;
D
David Woodhouse 已提交
146 147 148 149
		}

		/* Wake queues, command thread, etc. */
		lbs_host_to_card_done(priv);
150 151
	}

152
	lbs_prepare_and_send_command(priv,
153
			CMD_802_11_MONITOR_MODE, CMD_ACT_SET,
154
			CMD_OPTION_WAITFORRSP, 0, &priv->monitormode);
155 156 157 158
	return strlen(buf);
}

/**
159 160
 * lbs_rtap attribute to be exported per ethX interface
 * through sysfs (/sys/class/net/ethX/lbs_rtap)
161
 */
162 163 164
static DEVICE_ATTR(lbs_rtap, 0644, lbs_rtap_get, lbs_rtap_set );

/**
165
 *  @brief This function opens the ethX interface
166 167
 *
 *  @param dev     A pointer to net_device structure
168
 *  @return 	   0 or -EBUSY if monitor mode active
169
 */
170
static int lbs_dev_open(struct net_device *dev)
171
{
172
	struct lbs_private *priv = dev->ml_priv;
173
	int ret = 0;
174

175 176
	lbs_deb_enter(LBS_DEB_NET);

177
	spin_lock_irq(&priv->driver_lock);
178

179
	if (priv->monitormode) {
180 181 182
		ret = -EBUSY;
		goto out;
	}
183

184
	priv->infra_open = 1;
185

186 187 188 189
	if (priv->connect_status == LBS_CONNECTED)
		netif_carrier_on(dev);
	else
		netif_carrier_off(dev);
190

191 192 193
	if (!priv->tx_pending_len)
		netif_wake_queue(dev);
 out:
194

195
	spin_unlock_irq(&priv->driver_lock);
196
	lbs_deb_leave_args(LBS_DEB_NET, "ret %d", ret);
197
	return ret;
198 199 200 201 202 203 204 205
}

/**
 *  @brief This function closes the ethX interface
 *
 *  @param dev     A pointer to net_device structure
 *  @return 	   0
 */
206
static int lbs_eth_stop(struct net_device *dev)
207
{
208
	struct lbs_private *priv = dev->ml_priv;
209

210
	lbs_deb_enter(LBS_DEB_NET);
211

212
	spin_lock_irq(&priv->driver_lock);
213
	priv->infra_open = 0;
214 215
	netif_stop_queue(dev);
	spin_unlock_irq(&priv->driver_lock);
216

217 218
	schedule_work(&priv->mcast_work);

219
	lbs_deb_leave(LBS_DEB_NET);
220
	return 0;
221 222
}

223
static void lbs_tx_timeout(struct net_device *dev)
224
{
225
	struct lbs_private *priv = dev->ml_priv;
226

227
	lbs_deb_enter(LBS_DEB_TX);
228

229
	lbs_pr_err("tx watch dog timeout\n");
230 231 232

	dev->trans_start = jiffies;

233 234 235
	if (priv->currenttxskb)
		lbs_send_tx_feedback(priv, 0);

236 237 238
	/* XX: Shouldn't we also call into the hw-specific driver
	   to kick it somehow? */
	lbs_host_to_card_done(priv);
239

240 241 242 243 244 245 246
	/* More often than not, this actually happens because the
	   firmware has crapped itself -- rather than just a very
	   busy medium. So send a harmless command, and if/when
	   _that_ times out, we'll kick it in the head. */
	lbs_prepare_and_send_command(priv, CMD_802_11_RSSI, 0,
				     0, 0, NULL);

247
	lbs_deb_leave(LBS_DEB_TX);
248 249
}

250 251
void lbs_host_to_card_done(struct lbs_private *priv)
{
252 253
	unsigned long flags;

254 255
	lbs_deb_enter(LBS_DEB_THREAD);

256
	spin_lock_irqsave(&priv->driver_lock, flags);
257 258 259 260

	priv->dnld_sent = DNLD_RES_RECEIVED;

	/* Wake main thread if commands are pending */
261 262 263 264
	if (!priv->cur_cmd || priv->tx_pending_len > 0) {
		if (!priv->wakeup_dev_required)
			wake_up_interruptible(&priv->waitq);
	}
265

266
	spin_unlock_irqrestore(&priv->driver_lock, flags);
267
	lbs_deb_leave(LBS_DEB_THREAD);
268 269 270
}
EXPORT_SYMBOL_GPL(lbs_host_to_card_done);

271
int lbs_set_mac_address(struct net_device *dev, void *addr)
272 273
{
	int ret = 0;
274
	struct lbs_private *priv = dev->ml_priv;
275
	struct sockaddr *phwaddr = addr;
276
	struct cmd_ds_802_11_mac_address cmd;
277

278
	lbs_deb_enter(LBS_DEB_NET);
279

280
	/* In case it was called from the mesh device */
281
	dev = priv->dev;
282

283 284 285
	cmd.hdr.size = cpu_to_le16(sizeof(cmd));
	cmd.action = cpu_to_le16(CMD_ACT_SET);
	memcpy(cmd.macadd, phwaddr->sa_data, ETH_ALEN);
286

287
	ret = lbs_cmd_with_response(priv, CMD_802_11_MAC_ADDRESS, &cmd);
288
	if (ret) {
289
		lbs_deb_net("set MAC address failed\n");
290 291 292
		goto done;
	}

293 294
	memcpy(priv->current_addr, phwaddr->sa_data, ETH_ALEN);
	memcpy(dev->dev_addr, phwaddr->sa_data, ETH_ALEN);
295
	if (priv->mesh_dev)
296
		memcpy(priv->mesh_dev->dev_addr, phwaddr->sa_data, ETH_ALEN);
297 298

done:
299
	lbs_deb_leave_args(LBS_DEB_NET, "ret %d", ret);
300 301 302
	return ret;
}

303 304 305

static inline int mac_in_list(unsigned char *list, int list_len,
			      unsigned char *mac)
306
{
307 308 309 310 311 312 313 314 315
	while (list_len) {
		if (!memcmp(list, mac, ETH_ALEN))
			return 1;
		list += ETH_ALEN;
		list_len--;
	}
	return 0;
}

316

317 318 319 320 321 322 323 324 325
static int lbs_add_mcast_addrs(struct cmd_ds_mac_multicast_adr *cmd,
			       struct net_device *dev, int nr_addrs)
{
	int i = nr_addrs;
	struct dev_mc_list *mc_list;

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

326
	netif_addr_lock_bh(dev);
327 328
	for (mc_list = dev->mc_list; mc_list; mc_list = mc_list->next) {
		if (mac_in_list(cmd->maclist, nr_addrs, mc_list->dmi_addr)) {
J
Johannes Berg 已提交
329 330
			lbs_deb_net("mcast address %s:%pM skipped\n", dev->name,
				    mc_list->dmi_addr);
331 332
			continue;
		}
333

334 335 336
		if (i == MRVDRV_MAX_MULTICAST_LIST_SIZE)
			break;
		memcpy(&cmd->maclist[6*i], mc_list->dmi_addr, ETH_ALEN);
J
Johannes Berg 已提交
337 338
		lbs_deb_net("mcast address %s:%pM added to filter\n", dev->name,
			    mc_list->dmi_addr);
339
		i++;
340
	}
341
	netif_addr_unlock_bh(dev);
342 343 344
	if (mc_list)
		return -EOVERFLOW;

345 346 347
	return i;
}

348
static void lbs_set_mcast_worker(struct work_struct *work)
349
{
350 351 352 353 354
	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;
355

356
	lbs_deb_enter(LBS_DEB_NET);
357

358 359 360 361 362 363 364 365 366 367 368 369 370 371 372
	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;
373 374
	}

375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398
	/* 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:
399 400
	if (priv->mac_control != old_mac_control)
		lbs_set_mac_control(priv);
401

402
	lbs_deb_leave(LBS_DEB_NET);
403 404
}

405
void lbs_set_multicast_list(struct net_device *dev)
406
{
407
	struct lbs_private *priv = dev->ml_priv;
408 409 410 411

	schedule_work(&priv->mcast_work);
}

412
/**
413
 *  @brief This function handles the major jobs in the LBS driver.
414 415
 *  It handles all events generated by firmware, RX data received
 *  from firmware and TX data sent from kernel.
416
 *
417
 *  @param data    A pointer to lbs_thread structure
418 419
 *  @return 	   0
 */
420
static int lbs_thread(void *data)
421
{
422
	struct net_device *dev = data;
423
	struct lbs_private *priv = dev->ml_priv;
424 425
	wait_queue_t wait;

426
	lbs_deb_enter(LBS_DEB_THREAD);
427 428 429 430

	init_waitqueue_entry(&wait, current);

	for (;;) {
431
		int shouldsleep;
432
		u8 resp_idx;
433

434 435
		lbs_deb_thread("1: currenttxskb %p, dnld_sent %d\n",
				priv->currenttxskb, priv->dnld_sent);
436

437
		add_wait_queue(&priv->waitq, &wait);
438
		set_current_state(TASK_INTERRUPTIBLE);
439
		spin_lock_irq(&priv->driver_lock);
440

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

		if (shouldsleep) {
468
			lbs_deb_thread("sleeping, connect_status %d, "
469
				"psmode %d, psstate %d\n",
470 471
				priv->connect_status,
				priv->psmode, priv->psstate);
472
			spin_unlock_irq(&priv->driver_lock);
473 474
			schedule();
		} else
475
			spin_unlock_irq(&priv->driver_lock);
476

477 478
		lbs_deb_thread("2: currenttxskb %p, dnld_send %d\n",
			       priv->currenttxskb, priv->dnld_sent);
479 480

		set_current_state(TASK_RUNNING);
481
		remove_wait_queue(&priv->waitq, &wait);
482

483 484
		lbs_deb_thread("3: currenttxskb %p, dnld_sent %d\n",
			       priv->currenttxskb, priv->dnld_sent);
485

486
		if (kthread_should_stop()) {
487
			lbs_deb_thread("break from main thread\n");
488 489 490
			break;
		}

491 492 493 494
		if (priv->surpriseremoved) {
			lbs_deb_thread("adapter removed; waiting to die...\n");
			continue;
		}
495

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

499
		/* Process any pending command response */
500
		spin_lock_irq(&priv->driver_lock);
501 502
		resp_idx = priv->resp_idx;
		if (priv->resp_len[resp_idx]) {
503
			spin_unlock_irq(&priv->driver_lock);
504 505 506
			lbs_process_command_response(priv,
				priv->resp_buf[resp_idx],
				priv->resp_len[resp_idx]);
507
			spin_lock_irq(&priv->driver_lock);
508
			priv->resp_len[resp_idx] = 0;
509
		}
510
		spin_unlock_irq(&priv->driver_lock);
511

512 513
		/* Process hardware events, e.g. card removed, link lost */
		spin_lock_irq(&priv->driver_lock);
S
Stefani Seibold 已提交
514
		while (kfifo_len(&priv->event_fifo)) {
515
			u32 event;
S
Stefani Seibold 已提交
516
			kfifo_get(&priv->event_fifo, (unsigned char *) &event,
517 518 519 520 521 522 523 524 525 526 527 528 529 530 531
				sizeof(event));
			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;
		}

532
		/* command timeout stuff */
533 534 535
		if (priv->cmd_timed_out && priv->cur_cmd) {
			struct cmd_ctrl_node *cmdnode = priv->cur_cmd;

536 537 538 539
			if (++priv->nr_retries > 3) {
				lbs_pr_info("Excessive timeouts submitting "
					"command 0x%04x\n",
					le16_to_cpu(cmdnode->cmdbuf->command));
540 541
				lbs_complete_command(priv, cmdnode, -ETIMEDOUT);
				priv->nr_retries = 0;
542
				if (priv->reset_card)
543
					priv->reset_card(priv);
544 545
			} else {
				priv->cur_cmd = NULL;
546
				priv->dnld_sent = DNLD_RES_RECEIVED;
547 548 549 550
				lbs_pr_info("requeueing command 0x%04x due "
					"to timeout (#%d)\n",
					le16_to_cpu(cmdnode->cmdbuf->command),
					priv->nr_retries);
551 552 553 554 555 556 557 558

				/* Stick it back at the _top_ of the pending queue
				   for immediate resubmission */
				list_add(&cmdnode->list, &priv->cmdpendingq);
			}
		}
		priv->cmd_timed_out = 0;

559 560


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

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

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

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

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

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

		/* Wake-up command waiters which can't sleep in
601
		 * lbs_prepare_and_send_command
602
		 */
603 604
		if (!list_empty(&priv->cmdpendingq))
			wake_up_all(&priv->cmd_pending);
605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626

		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 &&
				    priv->mesh_connect_status == LBS_CONNECTED)
					netif_wake_queue(priv->mesh_dev);
			}
		}
		spin_unlock_irq(&priv->driver_lock);
627 628
	}

629
	del_timer(&priv->command_timer);
630
	del_timer(&priv->auto_deepsleep_timer);
631
	wake_up_all(&priv->cmd_pending);
632

633
	lbs_deb_leave(LBS_DEB_THREAD);
634 635 636
	return 0;
}

637 638 639
static int lbs_suspend_callback(struct lbs_private *priv, unsigned long dummy,
				struct cmd_header *cmd)
{
640
	lbs_deb_enter(LBS_DEB_FW);
641 642 643 644 645 646

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

	priv->fw_ready = 0;
647
	lbs_deb_leave(LBS_DEB_FW);
648 649 650 651 652 653 654 655
	return 0;
}

int lbs_suspend(struct lbs_private *priv)
{
	struct cmd_header cmd;
	int ret;

656 657
	lbs_deb_enter(LBS_DEB_FW);

658 659 660 661 662
	if (priv->wol_criteria == 0xffffffff) {
		lbs_pr_info("Suspend attempt without configuring wake params!\n");
		return -EINVAL;
	}

663
	memset(&cmd, 0, sizeof(cmd));
664

665 666 667 668 669
	ret = __lbs_cmd(priv, CMD_802_11_HOST_SLEEP_ACTIVATE, &cmd,
			sizeof(cmd), lbs_suspend_callback, 0);
	if (ret)
		lbs_pr_info("HOST_SLEEP_ACTIVATE failed: %d\n", ret);

670
	lbs_deb_leave_args(LBS_DEB_FW, "ret %d", ret);
671 672 673 674
	return ret;
}
EXPORT_SYMBOL_GPL(lbs_suspend);

675
void lbs_resume(struct lbs_private *priv)
676
{
677 678
	lbs_deb_enter(LBS_DEB_FW);

679 680 681 682 683 684 685 686 687 688 689
	priv->fw_ready = 1;

	/* Firmware doesn't seem to give us RX packets any more
	   until we send it some command. Might as well update */
	lbs_prepare_and_send_command(priv, CMD_802_11_RSSI, 0,
				     0, 0, NULL);

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

690
	lbs_deb_leave(LBS_DEB_FW);
691 692 693
}
EXPORT_SYMBOL_GPL(lbs_resume);

H
Holger Schurig 已提交
694
/**
695 696
 * @brief This function gets the HW spec from the firmware and sets
 *        some basic parameters.
H
Holger Schurig 已提交
697
 *
698
 *  @param priv    A pointer to struct lbs_private structure
H
Holger Schurig 已提交
699 700
 *  @return 	   0 or -1
 */
701
static int lbs_setup_firmware(struct lbs_private *priv)
H
Holger Schurig 已提交
702 703
{
	int ret = -1;
704
	s16 curlevel = 0, minlevel = 0, maxlevel = 0;
H
Holger Schurig 已提交
705 706 707

	lbs_deb_enter(LBS_DEB_FW);

708
	/* Read MAC address from firmware */
709
	memset(priv->current_addr, 0xff, ETH_ALEN);
710
	ret = lbs_update_hw_spec(priv);
711
	if (ret)
H
Holger Schurig 已提交
712 713
		goto done;

714 715 716 717 718 719 720 721
	/* 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;
	}

722
	lbs_set_mac_control(priv);
H
Holger Schurig 已提交
723 724 725 726 727 728 729 730 731 732 733
done:
	lbs_deb_leave_args(LBS_DEB_FW, "ret %d", ret);
	return ret;
}

/**
 *  This function handles the timeout of command sending.
 *  It will re-send the same command again.
 */
static void command_timer_fn(unsigned long data)
{
734
	struct lbs_private *priv = (struct lbs_private *)data;
H
Holger Schurig 已提交
735 736
	unsigned long flags;

737
	lbs_deb_enter(LBS_DEB_CMD);
738
	spin_lock_irqsave(&priv->driver_lock, flags);
H
Holger Schurig 已提交
739

740
	if (!priv->cur_cmd)
741
		goto out;
H
Holger Schurig 已提交
742

743 744
	lbs_pr_info("command 0x%04x timed out\n",
		le16_to_cpu(priv->cur_cmd->cmdbuf->command));
H
Holger Schurig 已提交
745

746
	priv->cmd_timed_out = 1;
H
Holger Schurig 已提交
747
	wake_up_interruptible(&priv->waitq);
748
out:
749
	spin_unlock_irqrestore(&priv->driver_lock, flags);
750
	lbs_deb_leave(LBS_DEB_CMD);
H
Holger Schurig 已提交
751 752
}

753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773
/**
 *  This function put the device back to deep sleep mode when timer expires
 *  and no activity (command, event, data etc.) is detected.
 */
static void auto_deepsleep_timer_fn(unsigned long data)
{
	struct lbs_private *priv = (struct lbs_private *)data;
	int ret;

	lbs_deb_enter(LBS_DEB_CMD);

	if (priv->is_activity_detected) {
		priv->is_activity_detected = 0;
	} else {
		if (priv->is_auto_deep_sleep_enabled &&
				(!priv->wakeup_dev_required) &&
				(priv->connect_status != LBS_CONNECTED)) {
			lbs_deb_main("Entering auto deep sleep mode...\n");
			ret = lbs_prepare_and_send_command(priv,
					CMD_802_11_DEEP_SLEEP, 0,
					0, 0, NULL);
774 775
			if (ret)
				lbs_pr_err("Enter Deep Sleep command failed\n");
776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808
		}
	}
	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;
}

809 810 811 812 813 814 815 816 817 818 819 820
static void lbs_sync_channel_worker(struct work_struct *work)
{
	struct lbs_private *priv = container_of(work, struct lbs_private,
		sync_channel);

	lbs_deb_enter(LBS_DEB_MAIN);
	if (lbs_update_channel(priv))
		lbs_pr_info("Channel synchronization failed.");
	lbs_deb_leave(LBS_DEB_MAIN);
}


821
static int lbs_init_adapter(struct lbs_private *priv)
822
{
H
Holger Schurig 已提交
823
	size_t bufsize;
824
	int i, ret = 0;
H
Holger Schurig 已提交
825

826 827
	lbs_deb_enter(LBS_DEB_MAIN);

H
Holger Schurig 已提交
828 829
	/* Allocate buffer to store the BSSID list */
	bufsize = MAX_NETWORK_COUNT * sizeof(struct bss_descriptor);
830 831
	priv->networks = kzalloc(bufsize, GFP_KERNEL);
	if (!priv->networks) {
H
Holger Schurig 已提交
832
		lbs_pr_err("Out of memory allocating beacons\n");
833 834
		ret = -1;
		goto out;
H
Holger Schurig 已提交
835 836
	}

837
	/* Initialize scan result lists */
838 839
	INIT_LIST_HEAD(&priv->network_free_list);
	INIT_LIST_HEAD(&priv->network_list);
840
	for (i = 0; i < MAX_NETWORK_COUNT; i++) {
841 842
		list_add_tail(&priv->networks[i].list,
			      &priv->network_free_list);
843
	}
H
Holger Schurig 已提交
844

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

847 848 849 850
	priv->connect_status = LBS_DISCONNECTED;
	priv->mesh_connect_status = LBS_DISCONNECTED;
	priv->secinfo.auth_mode = IW_AUTH_ALG_OPEN_SYSTEM;
	priv->mode = IW_MODE_INFRA;
851
	priv->channel = DEFAULT_AD_HOC_CHANNEL;
852
	priv->mac_control = CMD_ACT_MAC_RX_ON | CMD_ACT_MAC_TX_ON;
853
	priv->radio_on = 1;
854
	priv->enablehwauto = 1;
855 856 857
	priv->capability = WLAN_CAPABILITY_SHORT_PREAMBLE;
	priv->psmode = LBS802_11POWERMODECAM;
	priv->psstate = PS_STATE_FULL_POWER;
858 859 860 861
	priv->is_deep_sleep = 0;
	priv->is_auto_deep_sleep_enabled = 0;
	priv->wakeup_dev_required = 0;
	init_waitqueue_head(&priv->ds_awake_q);
H
Holger Schurig 已提交
862

863
	mutex_init(&priv->lock);
H
Holger Schurig 已提交
864

865
	setup_timer(&priv->command_timer, command_timer_fn,
866
		(unsigned long)priv);
867 868
	setup_timer(&priv->auto_deepsleep_timer, auto_deepsleep_timer_fn,
			(unsigned long)priv);
H
Holger Schurig 已提交
869

870 871
	INIT_LIST_HEAD(&priv->cmdfreeq);
	INIT_LIST_HEAD(&priv->cmdpendingq);
H
Holger Schurig 已提交
872

873 874
	spin_lock_init(&priv->driver_lock);
	init_waitqueue_head(&priv->cmd_pending);
H
Holger Schurig 已提交
875

876
	/* Allocate the command buffers */
877
	if (lbs_allocate_cmd_buffer(priv)) {
878
		lbs_pr_err("Out of memory allocating command buffers\n");
879 880 881 882 883 884 885
		ret = -ENOMEM;
		goto out;
	}
	priv->resp_idx = 0;
	priv->resp_len[0] = priv->resp_len[1] = 0;

	/* Create the event FIFO */
S
Stefani Seibold 已提交
886
	ret = kfifo_alloc(&priv->event_fifo, sizeof(u32) * 16, GFP_KERNEL);
887
	if (ret) {
888 889
		lbs_pr_err("Out of memory allocating event FIFO buffer\n");
		goto out;
890
	}
H
Holger Schurig 已提交
891

892
out:
893 894
	lbs_deb_leave_args(LBS_DEB_MAIN, "ret %d", ret);

895 896
	return ret;
}
H
Holger Schurig 已提交
897

898
static void lbs_free_adapter(struct lbs_private *priv)
899
{
900
	lbs_deb_enter(LBS_DEB_MAIN);
H
Holger Schurig 已提交
901

902
	lbs_free_cmd_buffer(priv);
903
	kfifo_free(&priv->event_fifo);
904
	del_timer(&priv->command_timer);
905
	del_timer(&priv->auto_deepsleep_timer);
906 907
	kfree(priv->networks);
	priv->networks = NULL;
908 909

	lbs_deb_leave(LBS_DEB_MAIN);
H
Holger Schurig 已提交
910 911
}

912 913 914 915 916 917 918 919 920 921 922
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_tx_timeout 	= lbs_tx_timeout,
	.ndo_set_multicast_list = lbs_set_multicast_list,
	.ndo_change_mtu		= eth_change_mtu,
	.ndo_validate_addr	= eth_validate_addr,
};

923 924
/**
 * @brief This function adds the card. it will probe the
925
 * card, allocate the lbs_priv and initialize the device.
926 927
 *
 *  @param card    A pointer to card
928
 *  @return 	   A pointer to struct lbs_private structure
929
 */
930
struct lbs_private *lbs_add_card(void *card, struct device *dmdev)
931
{
932 933
	struct net_device *dev;
	struct wireless_dev *wdev;
934
	struct lbs_private *priv = NULL;
935

936
	lbs_deb_enter(LBS_DEB_MAIN);
937 938

	/* Allocate an Ethernet device and register it */
939 940 941
	wdev = lbs_cfg_alloc(dmdev);
	if (IS_ERR(wdev)) {
		lbs_pr_err("cfg80211 init failed\n");
942
		goto done;
943
	}
944 945 946 947
	/* TODO? */
	wdev->iftype = NL80211_IFTYPE_STATION;
	priv = wdev_priv(wdev);
	priv->wdev = wdev;
948

949
	if (lbs_init_adapter(priv)) {
950
		lbs_pr_err("failed to initialize adapter structure.\n");
951 952 953 954 955 956 957 958
		goto err_wdev;
	}

	//TODO? dev = alloc_netdev_mq(0, "wlan%d", ether_setup, IWM_TX_QUEUES);
	dev = alloc_netdev(0, "wlan%d", ether_setup);
	if (!dev) {
		dev_err(dmdev, "no memory for network device instance\n");
		goto err_adapter;
959 960
	}

961 962 963 964
	dev->ieee80211_ptr = wdev;
	dev->ml_priv = priv;
	SET_NETDEV_DEV(dev, dmdev);
	wdev->netdev = dev;
965
	priv->dev = dev;
966

967
 	dev->netdev_ops = &lbs_netdev_ops;
968
	dev->watchdog_timeo = 5 * HZ;
969
	dev->ethtool_ops = &lbs_ethtool_ops;
970
#ifdef	WIRELESS_EXT
971
	dev->wireless_handlers = &lbs_handler_def;
972 973 974
#endif
	dev->flags |= IFF_BROADCAST | IFF_MULTICAST;

975 976 977 978 979 980 981

	// TODO: kzalloc + iwm_init_default_profile(iwm, iwm->umac_profile); ??


	priv->card = card;
	priv->infra_open = 0;

982

983
	priv->rtap_net_dev = NULL;
984
	strcpy(dev->name, "wlan%d");
985 986 987

	lbs_deb_thread("Starting main thread...\n");
	init_waitqueue_head(&priv->waitq);
988
	priv->main_thread = kthread_run(lbs_thread, dev, "lbs_main");
989 990
	if (IS_ERR(priv->main_thread)) {
		lbs_deb_thread("Error creating main thread.\n");
991
		goto err_ndev;
992 993
	}

994 995 996
	priv->work_thread = create_singlethread_workqueue("lbs_worker");
	INIT_DELAYED_WORK(&priv->assoc_work, lbs_association_worker);
	INIT_DELAYED_WORK(&priv->scan_work, lbs_scan_worker);
997
	INIT_WORK(&priv->mcast_work, lbs_set_mcast_worker);
998
	INIT_WORK(&priv->sync_channel, lbs_sync_channel_worker);
999

1000
	priv->mesh_open = 0;
1001 1002 1003
	sprintf(priv->mesh_ssid, "mesh");
	priv->mesh_ssid_len = 4;

1004 1005 1006
	priv->wol_criteria = 0xffffffff;
	priv->wol_gpio = 0xff;

1007 1008
	goto done;

1009
 err_ndev:
1010
	free_netdev(dev);
1011 1012 1013 1014 1015 1016 1017

 err_adapter:
	lbs_free_adapter(priv);

 err_wdev:
	lbs_cfg_free(priv);

1018
	priv = NULL;
1019

1020
done:
1021
	lbs_deb_leave_args(LBS_DEB_MAIN, "priv %p", priv);
1022 1023
	return priv;
}
1024
EXPORT_SYMBOL_GPL(lbs_add_card);
1025

1026

1027
void lbs_remove_card(struct lbs_private *priv)
1028
{
1029
	struct net_device *dev = priv->dev;
1030 1031

	lbs_deb_enter(LBS_DEB_MAIN);
1032

1033
	lbs_remove_mesh(priv);
1034
	lbs_remove_rtap(priv);
1035

1036
	dev = priv->dev;
1037

1038 1039
	cancel_delayed_work_sync(&priv->scan_work);
	cancel_delayed_work_sync(&priv->assoc_work);
1040
	cancel_work_sync(&priv->mcast_work);
1041 1042 1043 1044 1045

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

1049 1050
	if (priv->psmode == LBS802_11POWERMODEMAX_PSP) {
		priv->psmode = LBS802_11POWERMODECAM;
1051
		lbs_ps_wakeup(priv, CMD_OPTION_WAITFORRSP);
1052 1053
	}

1054
	lbs_send_disconnect_notification(priv);
1055

1056 1057 1058 1059 1060
	if (priv->is_deep_sleep) {
		priv->is_deep_sleep = 0;
		wake_up_interruptible(&priv->ds_awake_q);
	}

1061
	/* Stop the thread servicing the interrupts */
1062
	priv->surpriseremoved = 1;
1063 1064
	kthread_stop(priv->main_thread);

1065
	lbs_free_adapter(priv);
1066
	lbs_cfg_free(priv);
1067 1068 1069 1070 1071 1072

	priv->dev = NULL;
	free_netdev(dev);

	lbs_deb_leave(LBS_DEB_MAIN);
}
1073
EXPORT_SYMBOL_GPL(lbs_remove_card);
1074 1075


1076
int lbs_start_card(struct lbs_private *priv)
1077 1078 1079 1080 1081 1082 1083
{
	struct net_device *dev = priv->dev;
	int ret = -1;

	lbs_deb_enter(LBS_DEB_MAIN);

	/* poke the firmware */
1084
	ret = lbs_setup_firmware(priv);
1085 1086 1087
	if (ret)
		goto done;

1088 1089
	if (lbs_cfg_register(priv)) {
		lbs_pr_err("cannot register device\n");
1090
		goto done;
1091
	}
1092 1093 1094

	lbs_update_channel(priv);

1095 1096 1097 1098
	/*
	 * While rtap isn't related to mesh, only mesh-enabled
	 * firmware implements the rtap functionality via
	 * CMD_802_11_MONITOR_MODE.
1099
	 */
1100
	if (lbs_init_mesh(priv)) {
1101 1102
		if (device_create_file(&dev->dev, &dev_attr_lbs_rtap))
			lbs_pr_err("cannot register lbs_rtap attribute\n");
1103
	}
1104

1105
	lbs_debugfs_init_one(priv, dev);
1106

1107 1108
	lbs_pr_info("%s: Marvell WLAN 802.11 adapter\n", dev->name);

1109
	ret = 0;
1110

1111
done:
1112 1113 1114
	lbs_deb_leave_args(LBS_DEB_MAIN, "ret %d", ret);
	return ret;
}
1115
EXPORT_SYMBOL_GPL(lbs_start_card);
1116 1117


1118
void lbs_stop_card(struct lbs_private *priv)
1119
{
1120
	struct net_device *dev;
1121 1122 1123 1124 1125
	struct cmd_ctrl_node *cmdnode;
	unsigned long flags;

	lbs_deb_enter(LBS_DEB_MAIN);

1126 1127
	if (!priv)
		goto out;
1128
	dev = priv->dev;
1129

1130 1131
	netif_stop_queue(dev);
	netif_carrier_off(dev);
1132

1133
	lbs_debugfs_remove_one(priv);
1134
	if (lbs_deinit_mesh(priv))
1135
		device_remove_file(&dev->dev, &dev_attr_lbs_rtap);
1136

1137
	/* Delete the timeout of the currently processing command */
1138
	del_timer_sync(&priv->command_timer);
1139
	del_timer_sync(&priv->auto_deepsleep_timer);
1140 1141

	/* Flush pending command nodes */
1142
	spin_lock_irqsave(&priv->driver_lock, flags);
1143
	lbs_deb_main("clearing pending commands\n");
1144
	list_for_each_entry(cmdnode, &priv->cmdpendingq, list) {
1145
		cmdnode->result = -ENOENT;
1146 1147 1148
		cmdnode->cmdwaitqwoken = 1;
		wake_up_interruptible(&cmdnode->cmdwait_q);
	}
1149 1150 1151 1152 1153 1154 1155 1156 1157

	/* 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");
1158
	spin_unlock_irqrestore(&priv->driver_lock, flags);
1159 1160 1161

	unregister_netdev(dev);

1162
out:
1163
	lbs_deb_leave(LBS_DEB_MAIN);
1164
}
1165
EXPORT_SYMBOL_GPL(lbs_stop_card);
1166

1167

1168 1169 1170 1171 1172 1173 1174 1175 1176 1177
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;

S
Stefani Seibold 已提交
1178
	kfifo_put(&priv->event_fifo, (unsigned char *) &event, sizeof(u32));
1179 1180 1181 1182 1183 1184 1185 1186 1187

	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)
1188
{
1189
	lbs_deb_enter(LBS_DEB_THREAD);
1190

1191
	if (priv->psstate == PS_STATE_SLEEP)
1192
		priv->psstate = PS_STATE_AWAKE;
1193 1194 1195 1196 1197

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

1198
	wake_up_interruptible(&priv->waitq);
1199

1200
	lbs_deb_leave(LBS_DEB_THREAD);
1201
}
1202
EXPORT_SYMBOL_GPL(lbs_notify_command_response);
1203

1204
static int __init lbs_init_module(void)
1205
{
1206
	lbs_deb_enter(LBS_DEB_MAIN);
1207 1208 1209 1210
	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));
	confirm_sleep.action = cpu_to_le16(CMD_SUBCMD_SLEEP_CONFIRMED);
1211
	lbs_debugfs_init();
1212 1213
	lbs_deb_leave(LBS_DEB_MAIN);
	return 0;
1214 1215
}

1216
static void __exit lbs_exit_module(void)
1217
{
1218
	lbs_deb_enter(LBS_DEB_MAIN);
1219
	lbs_debugfs_remove();
1220
	lbs_deb_leave(LBS_DEB_MAIN);
1221 1222
}

1223 1224 1225 1226
/*
 * rtap interface support fuctions
 */

1227
static int lbs_rtap_open(struct net_device *dev)
1228
{
1229
	/* Yes, _stop_ the queue. Because we don't support injection */
1230 1231 1232 1233 1234
	lbs_deb_enter(LBS_DEB_MAIN);
	netif_carrier_off(dev);
	netif_stop_queue(dev);
	lbs_deb_leave(LBS_DEB_LEAVE);
	return 0;
1235 1236
}

1237
static int lbs_rtap_stop(struct net_device *dev)
1238
{
1239 1240 1241
	lbs_deb_enter(LBS_DEB_MAIN);
	lbs_deb_leave(LBS_DEB_MAIN);
	return 0;
1242 1243
}

1244 1245
static netdev_tx_t lbs_rtap_hard_start_xmit(struct sk_buff *skb,
					    struct net_device *dev)
1246
{
1247 1248
	netif_stop_queue(dev);
	return NETDEV_TX_BUSY;
1249 1250
}

1251
static void lbs_remove_rtap(struct lbs_private *priv)
1252
{
1253
	lbs_deb_enter(LBS_DEB_MAIN);
1254
	if (priv->rtap_net_dev == NULL)
1255
		goto out;
1256
	unregister_netdev(priv->rtap_net_dev);
1257
	free_netdev(priv->rtap_net_dev);
1258
	priv->rtap_net_dev = NULL;
1259
out:
1260
	lbs_deb_leave(LBS_DEB_MAIN);
1261 1262
}

1263 1264 1265 1266 1267 1268
static const struct net_device_ops rtap_netdev_ops = {
	.ndo_open = lbs_rtap_open,
	.ndo_stop = lbs_rtap_stop,
	.ndo_start_xmit = lbs_rtap_hard_start_xmit,
};

1269
static int lbs_add_rtap(struct lbs_private *priv)
1270
{
1271
	int ret = 0;
1272
	struct net_device *rtap_dev;
1273

1274 1275 1276 1277 1278
	lbs_deb_enter(LBS_DEB_MAIN);
	if (priv->rtap_net_dev) {
		ret = -EPERM;
		goto out;
	}
1279

1280
	rtap_dev = alloc_netdev(0, "rtap%d", ether_setup);
1281 1282 1283 1284
	if (rtap_dev == NULL) {
		ret = -ENOMEM;
		goto out;
	}
1285

1286
	memcpy(rtap_dev->dev_addr, priv->current_addr, ETH_ALEN);
1287
	rtap_dev->type = ARPHRD_IEEE80211_RADIOTAP;
1288
	rtap_dev->netdev_ops = &rtap_netdev_ops;
1289
	rtap_dev->ml_priv = priv;
1290
	SET_NETDEV_DEV(rtap_dev, priv->dev->dev.parent);
1291

1292 1293
	ret = register_netdev(rtap_dev);
	if (ret) {
1294
		free_netdev(rtap_dev);
1295
		goto out;
1296
	}
1297
	priv->rtap_net_dev = rtap_dev;
1298

1299 1300 1301
out:
	lbs_deb_leave_args(LBS_DEB_MAIN, "ret %d", ret);
	return ret;
1302 1303
}

1304 1305
module_init(lbs_init_module);
module_exit(lbs_exit_module);
1306

1307
MODULE_DESCRIPTION("Libertas WLAN Driver Library");
1308 1309
MODULE_AUTHOR("Marvell International Ltd.");
MODULE_LICENSE("GPL");