2011-04-26 15:25:29 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								/*
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								 * This file contains the handling of command
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								 * responses as well as events generated by firmware.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								 */
							 | 
						
					
						
							
								
									
										
										
										
											2011-05-02 16:49:14 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2011-06-06 10:43:46 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								#include <linux/hardirq.h>
							 | 
						
					
						
							
								
									
										
											 
										 
										
											
												include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h
percpu.h is included by sched.h and module.h and thus ends up being
included when building most .c files.  percpu.h includes slab.h which
in turn includes gfp.h making everything defined by the two files
universally available and complicating inclusion dependencies.
percpu.h -> slab.h dependency is about to be removed.  Prepare for
this change by updating users of gfp and slab facilities include those
headers directly instead of assuming availability.  As this conversion
needs to touch large number of source files, the following script is
used as the basis of conversion.
  http://userweb.kernel.org/~tj/misc/slabh-sweep.py
The script does the followings.
* Scan files for gfp and slab usages and update includes such that
  only the necessary includes are there.  ie. if only gfp is used,
  gfp.h, if slab is used, slab.h.
* When the script inserts a new include, it looks at the include
  blocks and try to put the new include such that its order conforms
  to its surrounding.  It's put in the include block which contains
  core kernel includes, in the same order that the rest are ordered -
  alphabetical, Christmas tree, rev-Xmas-tree or at the end if there
  doesn't seem to be any matching order.
* If the script can't find a place to put a new include (mostly
  because the file doesn't have fitting include block), it prints out
  an error message indicating which .h file needs to be added to the
  file.
The conversion was done in the following steps.
1. The initial automatic conversion of all .c files updated slightly
   over 4000 files, deleting around 700 includes and adding ~480 gfp.h
   and ~3000 slab.h inclusions.  The script emitted errors for ~400
   files.
2. Each error was manually checked.  Some didn't need the inclusion,
   some needed manual addition while adding it to implementation .h or
   embedding .c file was more appropriate for others.  This step added
   inclusions to around 150 files.
3. The script was run again and the output was compared to the edits
   from #2 to make sure no file was left behind.
4. Several build tests were done and a couple of problems were fixed.
   e.g. lib/decompress_*.c used malloc/free() wrappers around slab
   APIs requiring slab.h to be added manually.
5. The script was run on all .h files but without automatically
   editing them as sprinkling gfp.h and slab.h inclusions around .h
   files could easily lead to inclusion dependency hell.  Most gfp.h
   inclusion directives were ignored as stuff from gfp.h was usually
   wildly available and often used in preprocessor macros.  Each
   slab.h inclusion directive was examined and added manually as
   necessary.
6. percpu.h was updated not to include slab.h.
7. Build test were done on the following configurations and failures
   were fixed.  CONFIG_GCOV_KERNEL was turned off for all tests (as my
   distributed build env didn't work with gcov compiles) and a few
   more options had to be turned off depending on archs to make things
   build (like ipr on powerpc/64 which failed due to missing writeq).
   * x86 and x86_64 UP and SMP allmodconfig and a custom test config.
   * powerpc and powerpc64 SMP allmodconfig
   * sparc and sparc64 SMP allmodconfig
   * ia64 SMP allmodconfig
   * s390 SMP allmodconfig
   * alpha SMP allmodconfig
   * um on x86_64 SMP allmodconfig
8. percpu.h modifications were reverted so that it could be applied as
   a separate patch and serve as bisection point.
Given the fact that I had only a couple of failures from tests on step
6, I'm fairly confident about the coverage of this conversion patch.
If there is a breakage, it's likely to be something in one of the arch
headers which should be easily discoverable easily on most builds of
the specific arch.
Signed-off-by: Tejun Heo <tj@kernel.org>
Guess-its-ok-by: Christoph Lameter <cl@linux-foundation.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Lee Schermerhorn <Lee.Schermerhorn@hp.com>
											
										 
										
											2010-03-24 17:04:11 +09:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								#include <linux/slab.h>
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								#include <linux/delay.h>
							 | 
						
					
						
							
								
									
										
										
										
											2009-10-12 05:27:48 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								#include <linux/sched.h>
							 | 
						
					
						
							
								
									
										
										
										
											2009-05-27 14:03:09 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								#include <asm/unaligned.h>
							 | 
						
					
						
							
								
									
										
										
										
											2010-06-14 22:01:26 +05:30
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								#include <net/cfg80211.h>
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2010-06-14 22:01:26 +05:30
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								#include "cfg.h"
							 | 
						
					
						
							
								
									
										
										
										
											2010-05-19 03:24:38 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								#include "cmd.h"
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								/**
							 | 
						
					
						
							
								
									
										
										
										
											2011-04-26 15:25:29 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								 * lbs_mac_event_disconnected - handles disconnect event. It
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								 * reports disconnect to upper layer, clean tx/rx packets,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								 * reset link state etc.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								 *
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								 * @priv:	A pointer to struct lbs_private structure
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								 *
							 | 
						
					
						
							
								
									
										
										
										
											2011-04-26 15:25:29 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								 * returns:	n/a
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								 */
							 | 
						
					
						
							
								
									
										
										
										
											2007-11-23 15:43:44 +01:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								void lbs_mac_event_disconnected(struct lbs_private *priv)
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								{
							 | 
						
					
						
							
								
									
										
										
										
											2007-12-08 20:04:36 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									if (priv->connect_status != LBS_CONNECTED)
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
										return;
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2007-11-28 14:05:02 +01:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									lbs_deb_enter(LBS_DEB_ASSOC);
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
									/*
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
									 * Cisco AP sends EAP failure and de-auth in less than 0.5 ms.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
									 * It causes problem in the Supplicant
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
									 */
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
									msleep_interruptible(1000);
							 | 
						
					
						
							
								
									
										
										
										
											2010-06-04 23:20:37 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
									if (priv->wdev->iftype == NL80211_IFTYPE_STATION)
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
										lbs_send_disconnect_notification(priv);
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
									/* report disconnect to upper layer */
							 | 
						
					
						
							
								
									
										
										
										
											2007-05-25 13:05:16 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									netif_stop_queue(priv->dev);
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
									netif_carrier_off(priv->dev);
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2007-12-12 00:41:51 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									/* Free Tx and Rx packets */
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
									kfree_skb(priv->currenttxskb);
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
									priv->currenttxskb = NULL;
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
									priv->tx_pending_len = 0;
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2007-12-08 20:04:36 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									priv->connect_status = LBS_DISCONNECTED;
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2007-12-08 20:04:36 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									if (priv->psstate != PS_STATE_FULL_POWER) {
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
										/* make firmware to exit PS mode */
							 | 
						
					
						
							
								
									
										
										
										
											2007-08-02 11:54:10 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										lbs_deb_cmd("disconnected, so exit PS mode\n");
							 | 
						
					
						
							
								
									
										
										
										
											2010-07-27 13:08:08 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										lbs_set_ps_mode(priv, PS_MODE_ACTION_EXIT_PS, false);
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
									}
							 | 
						
					
						
							
								
									
										
										
										
											2008-01-28 17:25:53 +01:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									lbs_deb_leave(LBS_DEB_ASSOC);
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								}
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2008-04-01 14:50:43 +02:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								int lbs_process_command_response(struct lbs_private *priv, u8 *data, u32 len)
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								{
							 | 
						
					
						
							
								
									
										
										
										
											2007-12-11 23:42:49 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									uint16_t respcmd, curcmd;
							 | 
						
					
						
							
								
									
										
										
										
											2007-12-11 13:49:39 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									struct cmd_header *resp;
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
									int ret = 0;
							 | 
						
					
						
							
								
									
										
										
										
											2007-12-11 23:42:49 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									unsigned long flags;
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
									uint16_t result;
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2007-08-02 11:54:10 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									lbs_deb_enter(LBS_DEB_HOST);
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2007-12-08 20:04:36 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									mutex_lock(&priv->lock);
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
									spin_lock_irqsave(&priv->driver_lock, flags);
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2007-12-08 20:04:36 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									if (!priv->cur_cmd) {
							 | 
						
					
						
							
								
									
										
										
										
											2007-08-02 11:54:10 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										lbs_deb_host("CMD_RESP: cur_cmd is NULL\n");
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
										ret = -1;
							 | 
						
					
						
							
								
									
										
										
										
											2007-12-08 20:04:36 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										spin_unlock_irqrestore(&priv->driver_lock, flags);
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
										goto done;
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
									}
							 | 
						
					
						
							
								
									
										
										
										
											2007-12-11 23:42:49 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2008-04-01 14:50:43 +02:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									resp = (void *)data;
							 | 
						
					
						
							
								
									
										
										
										
											2008-03-04 18:22:27 +01:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									curcmd = le16_to_cpu(priv->cur_cmd->cmdbuf->command);
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
									respcmd = le16_to_cpu(resp->command);
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
									result = le16_to_cpu(resp->result);
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2008-03-26 10:04:44 +01:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									lbs_deb_cmd("CMD_RESP: response 0x%04x, seq %d, size %d\n",
							 | 
						
					
						
							
								
									
										
										
										
											2008-04-01 14:50:43 +02:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										     respcmd, le16_to_cpu(resp->seqnum), len);
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
									lbs_deb_hex(LBS_DEB_CMD, "CMD_RESP", (void *) resp, len);
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2008-03-03 12:20:12 +01:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									if (resp->seqnum != priv->cur_cmd->cmdbuf->seqnum) {
							 | 
						
					
						
							
								
									
										
										
										
											2011-05-02 16:49:15 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										netdev_info(priv->dev,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
											    "Received CMD_RESP with invalid sequence %d (expected %d)\n",
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
											    le16_to_cpu(resp->seqnum),
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
											    le16_to_cpu(priv->cur_cmd->cmdbuf->seqnum));
							 | 
						
					
						
							
								
									
										
										
										
											2007-12-08 20:04:36 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										spin_unlock_irqrestore(&priv->driver_lock, flags);
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
										ret = -1;
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
										goto done;
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
									}
							 | 
						
					
						
							
								
									
										
										
										
											2007-12-11 23:42:49 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									if (respcmd != CMD_RET(curcmd) &&
							 | 
						
					
						
							
								
									
										
										
										
											2008-03-06 10:30:21 +01:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									    respcmd != CMD_RET_802_11_ASSOCIATE && curcmd != CMD_802_11_ASSOCIATE) {
							 | 
						
					
						
							
								
									
										
										
										
											2011-05-02 16:49:15 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										netdev_info(priv->dev, "Invalid CMD_RESP %x to command %x!\n",
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
											    respcmd, curcmd);
							 | 
						
					
						
							
								
									
										
										
										
											2007-12-11 23:42:49 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										spin_unlock_irqrestore(&priv->driver_lock, flags);
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
										ret = -1;
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
										goto done;
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
									}
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2007-12-17 15:41:30 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									if (resp->result == cpu_to_le16(0x0004)) {
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
										/* 0x0004 means -EAGAIN. Drop the response, let it time out
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
										   and be resubmitted */
							 | 
						
					
						
							
								
									
										
										
										
											2011-05-02 16:49:15 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										netdev_info(priv->dev,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
											    "Firmware returns DEFER to command %x. Will let it time out...\n",
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
											    le16_to_cpu(resp->command));
							 | 
						
					
						
							
								
									
										
										
										
											2007-12-17 15:41:30 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										spin_unlock_irqrestore(&priv->driver_lock, flags);
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
										ret = -1;
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
										goto done;
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
									}
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2007-12-11 23:42:49 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									/* Now we got response from FW, cancel the command timer */
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
									del_timer(&priv->command_timer);
							 | 
						
					
						
							
								
									
										
										
										
											2007-12-15 19:33:43 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									priv->cmd_timed_out = 0;
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2007-08-02 11:53:36 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									if (respcmd == CMD_RET(CMD_802_11_PS_MODE)) {
							 | 
						
					
						
							
								
									
										
										
										
											2007-12-16 23:26:54 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										struct cmd_ds_802_11_ps_mode *psmode = (void *) &resp[1];
							 | 
						
					
						
							
								
									
										
										
										
											2007-05-25 23:36:54 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										u16 action = le16_to_cpu(psmode->action);
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2007-08-02 11:54:10 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										lbs_deb_host(
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
										       "CMD_RESP: PS_MODE cmd reply result 0x%x, action 0x%x\n",
							 | 
						
					
						
							
								
									
										
										
										
											2007-05-25 23:36:54 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										       result, action);
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
										if (result) {
							 | 
						
					
						
							
								
									
										
										
										
											2007-08-02 11:54:10 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
											lbs_deb_host("CMD_RESP: PS command failed with 0x%x\n",
							 | 
						
					
						
							
								
									
										
										
										
											2007-05-25 23:36:54 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
												    result);
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
											/*
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
											 * We should not re-try enter-ps command in
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
											 * ad-hoc mode. It takes place in
							 | 
						
					
						
							
								
									
										
										
										
											2007-11-15 18:05:47 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
											 * lbs_execute_next_command().
							 | 
						
					
						
							
								
									
										
										
										
											2007-05-25 23:36:54 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
											 */
							 | 
						
					
						
							
								
									
										
										
										
											2010-06-14 22:01:26 +05:30
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
											if (priv->wdev->iftype == NL80211_IFTYPE_MONITOR &&
							 | 
						
					
						
							
								
									
										
										
										
											2010-07-27 13:08:08 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
											    action == PS_MODE_ACTION_ENTER_PS)
							 | 
						
					
						
							
								
									
										
										
										
											2007-12-08 20:04:36 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
												priv->psmode = LBS802_11POWERMODECAM;
							 | 
						
					
						
							
								
									
										
										
										
											2010-07-27 13:08:08 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										} else if (action == PS_MODE_ACTION_ENTER_PS) {
							 | 
						
					
						
							
								
									
										
										
										
											2007-12-08 20:04:36 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
											priv->needtowakeup = 0;
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
											priv->psstate = PS_STATE_AWAKE;
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2007-08-02 11:54:10 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
											lbs_deb_host("CMD_RESP: ENTER_PS command response\n");
							 | 
						
					
						
							
								
									
										
										
										
											2007-12-08 20:04:36 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
											if (priv->connect_status != LBS_CONNECTED) {
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
												/*
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
												 * When Deauth Event received before Enter_PS command
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
												 * response, We need to wake up the firmware.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
												 */
							 | 
						
					
						
							
								
									
										
										
										
											2007-08-02 11:54:10 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
												lbs_deb_host(
							 | 
						
					
						
							
								
									
										
										
										
											2007-11-15 18:05:47 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
												       "disconnected, invoking lbs_ps_wakeup\n");
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2007-12-08 20:04:36 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
												spin_unlock_irqrestore(&priv->driver_lock, flags);
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
												mutex_unlock(&priv->lock);
							 | 
						
					
						
							
								
									
										
										
										
											2010-07-27 13:08:08 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
												lbs_set_ps_mode(priv, PS_MODE_ACTION_EXIT_PS,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
														false);
							 | 
						
					
						
							
								
									
										
										
										
											2007-12-08 20:04:36 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
												mutex_lock(&priv->lock);
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
												spin_lock_irqsave(&priv->driver_lock, flags);
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
											}
							 | 
						
					
						
							
								
									
										
										
										
											2010-07-27 13:08:08 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										} else if (action == PS_MODE_ACTION_EXIT_PS) {
							 | 
						
					
						
							
								
									
										
										
										
											2007-12-08 20:04:36 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
											priv->needtowakeup = 0;
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
											priv->psstate = PS_STATE_FULL_POWER;
							 | 
						
					
						
							
								
									
										
										
										
											2007-08-02 11:54:10 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
											lbs_deb_host("CMD_RESP: EXIT_PS command response\n");
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
										} else {
							 | 
						
					
						
							
								
									
										
										
										
											2007-08-02 11:54:10 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
											lbs_deb_host("CMD_RESP: PS action 0x%X\n", action);
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
										}
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2011-07-09 15:41:25 +01:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										__lbs_complete_command(priv, priv->cur_cmd, result);
							 | 
						
					
						
							
								
									
										
										
										
											2007-12-08 20:04:36 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										spin_unlock_irqrestore(&priv->driver_lock, flags);
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
										ret = 0;
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
										goto done;
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
									}
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
									/* If the command is not successful, cleanup and return failure */
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
									if ((result != 0 || !(respcmd & 0x8000))) {
							 | 
						
					
						
							
								
									
										
										
										
											2007-08-02 11:54:10 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										lbs_deb_host("CMD_RESP: error 0x%04x in command reply 0x%04x\n",
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
										       result, respcmd);
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
										/*
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
										 * Handling errors here
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
										 */
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
										switch (respcmd) {
							 | 
						
					
						
							
								
									
										
										
										
											2007-08-02 11:53:36 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										case CMD_RET(CMD_GET_HW_SPEC):
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
										case CMD_RET(CMD_802_11_RESET):
							 | 
						
					
						
							
								
									
										
										
										
											2007-08-02 11:54:10 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
											lbs_deb_host("CMD_RESP: reset failed\n");
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
											break;
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
										}
							 | 
						
					
						
							
								
									
										
										
										
											2011-07-09 15:41:25 +01:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										__lbs_complete_command(priv, priv->cur_cmd, result);
							 | 
						
					
						
							
								
									
										
										
										
											2007-12-08 20:04:36 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										spin_unlock_irqrestore(&priv->driver_lock, flags);
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
										ret = -1;
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
										goto done;
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
									}
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2007-12-08 20:04:36 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									spin_unlock_irqrestore(&priv->driver_lock, flags);
							 | 
						
					
						
							
								
									
										
										
										
											2007-12-07 15:13:05 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2007-12-11 12:33:30 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									if (priv->cur_cmd && priv->cur_cmd->callback) {
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
										ret = priv->cur_cmd->callback(priv, priv->cur_cmd->callback_arg,
							 | 
						
					
						
							
								
									
										
										
										
											2007-12-11 13:49:39 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
												resp);
							 | 
						
					
						
							
								
									
										
										
										
											2010-07-27 13:05:16 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									}
							 | 
						
					
						
							
								
									
										
										
										
											2007-12-07 15:13:05 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2007-12-08 20:04:36 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									spin_lock_irqsave(&priv->driver_lock, flags);
							 | 
						
					
						
							
								
									
										
										
										
											2007-12-07 15:13:05 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2007-12-08 20:04:36 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									if (priv->cur_cmd) {
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
										/* Clean up and Put current command back to cmdfreeq */
							 | 
						
					
						
							
								
									
										
										
										
											2011-07-09 15:41:25 +01:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										__lbs_complete_command(priv, priv->cur_cmd, result);
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
									}
							 | 
						
					
						
							
								
									
										
										
										
											2007-12-08 20:04:36 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									spin_unlock_irqrestore(&priv->driver_lock, flags);
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								done:
							 | 
						
					
						
							
								
									
										
										
										
											2007-12-08 20:04:36 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									mutex_unlock(&priv->lock);
							 | 
						
					
						
							
								
									
										
										
										
											2007-08-02 11:54:10 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									lbs_deb_leave_args(LBS_DEB_HOST, "ret %d", ret);
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
									return ret;
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								}
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2008-04-01 14:50:43 +02:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								int lbs_process_event(struct lbs_private *priv, u32 event)
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								{
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
									int ret = 0;
							 | 
						
					
						
							
								
									
										
										
										
											2010-05-19 03:24:38 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									struct cmd_header cmd;
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2007-08-02 13:14:07 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									lbs_deb_enter(LBS_DEB_CMD);
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2008-04-01 14:50:43 +02:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									switch (event) {
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
									case MACREG_INT_CODE_LINK_SENSED:
							 | 
						
					
						
							
								
									
										
										
										
											2008-03-19 14:25:18 +01:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										lbs_deb_cmd("EVENT: link sensed\n");
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
										break;
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
									case MACREG_INT_CODE_DEAUTHENTICATED:
							 | 
						
					
						
							
								
									
										
										
										
											2007-08-02 11:54:10 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										lbs_deb_cmd("EVENT: deauthenticated\n");
							 | 
						
					
						
							
								
									
										
										
										
											2007-11-15 18:05:47 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										lbs_mac_event_disconnected(priv);
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
										break;
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
									case MACREG_INT_CODE_DISASSOCIATED:
							 | 
						
					
						
							
								
									
										
										
										
											2007-08-02 11:54:10 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										lbs_deb_cmd("EVENT: disassociated\n");
							 | 
						
					
						
							
								
									
										
										
										
											2007-11-15 18:05:47 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										lbs_mac_event_disconnected(priv);
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
										break;
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2007-11-28 09:15:11 +01:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									case MACREG_INT_CODE_LINK_LOST_NO_SCAN:
							 | 
						
					
						
							
								
									
										
										
										
											2007-08-02 11:54:10 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										lbs_deb_cmd("EVENT: link lost\n");
							 | 
						
					
						
							
								
									
										
										
										
											2007-11-15 18:05:47 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										lbs_mac_event_disconnected(priv);
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
										break;
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
									case MACREG_INT_CODE_PS_SLEEP:
							 | 
						
					
						
							
								
									
										
										
										
											2008-03-19 14:25:18 +01:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										lbs_deb_cmd("EVENT: ps sleep\n");
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
										/* handle unexpected PS SLEEP event */
							 | 
						
					
						
							
								
									
										
										
										
											2007-12-08 20:04:36 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										if (priv->psstate == PS_STATE_FULL_POWER) {
							 | 
						
					
						
							
								
									
										
										
										
											2007-05-25 11:27:16 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
											lbs_deb_cmd(
							 | 
						
					
						
							
								
									
										
										
										
											2013-12-09 00:22:53 +09:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
											       "EVENT: in FULL POWER mode, ignoring PS_SLEEP\n");
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
											break;
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
										}
							 | 
						
					
						
							
								
									
										
										
										
											2007-12-08 20:04:36 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										priv->psstate = PS_STATE_PRE_SLEEP;
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2008-03-19 14:25:18 +01:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										lbs_ps_confirm_sleep(priv);
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
										break;
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2007-12-17 13:26:42 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									case MACREG_INT_CODE_HOST_AWAKE:
							 | 
						
					
						
							
								
									
										
										
										
											2008-03-19 14:25:18 +01:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										lbs_deb_cmd("EVENT: host awake\n");
							 | 
						
					
						
							
								
									
										
										
										
											2009-09-30 20:04:38 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										if (priv->reset_deep_sleep_wakeup)
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
											priv->reset_deep_sleep_wakeup(priv);
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
										priv->is_deep_sleep = 0;
							 | 
						
					
						
							
								
									
										
										
										
											2010-05-19 03:24:38 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										lbs_cmd_async(priv, CMD_802_11_WAKEUP_CONFIRM, &cmd,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
												sizeof(cmd));
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
										priv->is_host_sleep_activated = 0;
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
										wake_up_interruptible(&priv->host_sleep_q);
							 | 
						
					
						
							
								
									
										
										
										
											2007-12-17 13:26:42 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										break;
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2009-09-30 20:04:38 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									case MACREG_INT_CODE_DEEP_SLEEP_AWAKE:
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
										if (priv->reset_deep_sleep_wakeup)
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
											priv->reset_deep_sleep_wakeup(priv);
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
										lbs_deb_cmd("EVENT: ds awake\n");
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
										priv->is_deep_sleep = 0;
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
										priv->wakeup_dev_required = 0;
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
										wake_up_interruptible(&priv->ds_awake_q);
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
										break;
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
									case MACREG_INT_CODE_PS_AWAKE:
							 | 
						
					
						
							
								
									
										
										
										
											2008-03-19 14:25:18 +01:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										lbs_deb_cmd("EVENT: ps awake\n");
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
										/* handle unexpected PS AWAKE event */
							 | 
						
					
						
							
								
									
										
										
										
											2007-12-08 20:04:36 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										if (priv->psstate == PS_STATE_FULL_POWER) {
							 | 
						
					
						
							
								
									
										
										
										
											2007-05-25 11:27:16 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
											lbs_deb_cmd(
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
											       "EVENT: In FULL POWER mode - ignore PS AWAKE\n");
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
											break;
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
										}
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2007-12-08 20:04:36 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										priv->psstate = PS_STATE_AWAKE;
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2007-12-08 20:04:36 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										if (priv->needtowakeup) {
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
											/*
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
											 * wait for the command processing to finish
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
											 * before resuming sending
							 | 
						
					
						
							
								
									
										
										
										
											2007-12-08 20:04:36 +00:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
											 * priv->needtowakeup will be set to FALSE
							 | 
						
					
						
							
								
									
										
										
										
											2007-11-15 18:05:47 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
											 * in lbs_ps_wakeup()
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
											 */
							 | 
						
					
						
							
								
									
										
										
										
											2007-08-02 11:54:10 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
											lbs_deb_cmd("waking up ...\n");
							 | 
						
					
						
							
								
									
										
										
										
											2010-07-27 13:08:08 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
											lbs_set_ps_mode(priv, PS_MODE_ACTION_EXIT_PS, false);
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
										}
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
										break;
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
									case MACREG_INT_CODE_MIC_ERR_UNICAST:
							 | 
						
					
						
							
								
									
										
										
										
											2007-05-25 11:27:16 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										lbs_deb_cmd("EVENT: UNICAST MIC ERROR\n");
							 | 
						
					
						
							
								
									
										
										
										
											2009-10-22 15:30:57 +02:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										lbs_send_mic_failureevent(priv, event);
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
										break;
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
									case MACREG_INT_CODE_MIC_ERR_MULTICAST:
							 | 
						
					
						
							
								
									
										
										
										
											2007-05-25 11:27:16 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										lbs_deb_cmd("EVENT: MULTICAST MIC ERROR\n");
							 | 
						
					
						
							
								
									
										
										
										
											2009-10-22 15:30:57 +02:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										lbs_send_mic_failureevent(priv, event);
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
										break;
							 | 
						
					
						
							
								
									
										
										
										
											2008-03-19 14:25:18 +01:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
									case MACREG_INT_CODE_MIB_CHANGED:
							 | 
						
					
						
							
								
									
										
										
										
											2008-03-19 14:25:18 +01:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										lbs_deb_cmd("EVENT: MIB CHANGED\n");
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
										break;
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
									case MACREG_INT_CODE_INIT_DONE:
							 | 
						
					
						
							
								
									
										
										
										
											2008-03-19 14:25:18 +01:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										lbs_deb_cmd("EVENT: INIT DONE\n");
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
										break;
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
									case MACREG_INT_CODE_ADHOC_BCN_LOST:
							 | 
						
					
						
							
								
									
										
										
										
											2007-08-02 11:54:10 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										lbs_deb_cmd("EVENT: ADHOC beacon lost\n");
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
										break;
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
									case MACREG_INT_CODE_RSSI_LOW:
							 | 
						
					
						
							
								
									
										
										
										
											2011-05-02 16:49:15 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										netdev_alert(priv->dev, "EVENT: rssi low\n");
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
										break;
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
									case MACREG_INT_CODE_SNR_LOW:
							 | 
						
					
						
							
								
									
										
										
										
											2011-05-02 16:49:15 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										netdev_alert(priv->dev, "EVENT: snr low\n");
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
										break;
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
									case MACREG_INT_CODE_MAX_FAIL:
							 | 
						
					
						
							
								
									
										
										
										
											2011-05-02 16:49:15 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										netdev_alert(priv->dev, "EVENT: max fail\n");
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
										break;
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
									case MACREG_INT_CODE_RSSI_HIGH:
							 | 
						
					
						
							
								
									
										
										
										
											2011-05-02 16:49:15 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										netdev_alert(priv->dev, "EVENT: rssi high\n");
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
										break;
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
									case MACREG_INT_CODE_SNR_HIGH:
							 | 
						
					
						
							
								
									
										
										
										
											2011-05-02 16:49:15 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										netdev_alert(priv->dev, "EVENT: snr high\n");
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
										break;
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2007-05-25 23:12:19 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									case MACREG_INT_CODE_MESH_AUTO_STARTED:
							 | 
						
					
						
							
								
									
										
										
										
											2009-12-02 15:25:57 +01:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										/* Ignore spurious autostart events */
							 | 
						
					
						
							
								
									
										
										
										
											2011-05-02 16:49:15 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										netdev_info(priv->dev, "EVENT: MESH_AUTO_STARTED (ignoring)\n");
							 | 
						
					
						
							
								
									
										
										
										
											2007-05-25 23:12:19 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										break;
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
									default:
							 | 
						
					
						
							
								
									
										
										
										
											2011-05-02 16:49:15 -07:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										netdev_alert(priv->dev, "EVENT: unknown event id %d\n", event);
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
										break;
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
									}
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2007-08-02 13:14:07 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									lbs_deb_leave_args(LBS_DEB_CMD, "ret %d", ret);
							 | 
						
					
						
							
								
									
										
										
										
											2007-02-10 12:25:27 -02:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
									return ret;
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								}
							 |