Upstream/technology: Follow external rfkill events and act accordingly 96/5796/3
authorJukka Rissanen <jukka.rissanen@linux.intel.com>
Mon, 15 Jul 2013 14:25:46 +0000 (17:25 +0300)
committerZhang zhengguang <zhengguang.zhang@intel.com>
Fri, 9 Aug 2013 02:38:05 +0000 (10:38 +0800)
Fix bug: CM-645
Fix bug: TIVI-1044

Upstream commit id: 48dbff35d34257dc7055a35aae2a19ed0a06825b

src/technology.c

index d8f23c1..3b8f6a8 100644 (file)
@@ -1726,14 +1726,35 @@ int __connman_technology_update_rfkill(unsigned int index,
                return 0;
 
        /*
-        * Depending on softblocked state we unblock/block according to
-        * persistent state.
+        * State diagram how to set the block status from individual
+        * technology status fields:
+        *
+        *   enabled  |  softblocked  |  offline  |    is
+        *            |               |           |  blocked
+        * -----------+---------------+-----------+----------
+        *     no     |      no       |    no     |   yes
+        *     yes    |      no       |    no     |   no
+        *     no     |      yes      |    no     |   yes
+        *     yes    |      yes      |    no     |   yes
+        *     no     |      no       |    yes    |   yes
+        *     yes    |      no       |    yes    |   no
+        *     no     |      yes      |    yes    |   yes
+        *     yes    |      yes      |    yes    |   yes
+        *
+        * The enabled is controlled by dbus API (typically
+        * from UI). softblocked is set either by dbus API or by
+        * external event. Offline (flight mode) is set via dbus
+        * API.
         */
-       if (technology->softblocked == TRUE &&
-                               technology->enable_persistent == TRUE)
+
+       DBG("type %d enabled %d soft %d hard %d blocked %d",
+               type, technology->enabled,
+               technology->softblocked, technology->hardblocked,
+               !(technology->enabled && !technology->softblocked));
+
+       if (technology->enabled && !technology->softblocked)
                return __connman_rfkill_block(type, FALSE);
-       else if (technology->softblocked == FALSE &&
-                               technology->enable_persistent == FALSE)
+       else
                return __connman_rfkill_block(type, TRUE);
 
        return 0;