if (priv->adapter->psstate != PS_STATE_FULL_POWER)
                return -1;
 
+       if (priv->mesh_dev && !priv->mesh_autostart_enabled) {
+               /* Mesh autostart must be activated while sleeping
+                * On resume it will go back to the current state
+                */
+               struct cmd_ds_mesh_access mesh_access;
+               memset(&mesh_access, 0, sizeof(mesh_access));
+               mesh_access.data[0] = cpu_to_le32(1);
+               libertas_prepare_and_send_command(priv,
+                               CMD_MESH_ACCESS,
+                               CMD_ACT_MESH_SET_AUTOSTART_ENABLED,
+                               CMD_OPTION_WAITFORRSP, 0, (void *)&mesh_access);
+       }
+
        netif_device_detach(cardp->eth_dev);
        netif_device_detach(priv->mesh_dev);
 
        netif_device_attach(cardp->eth_dev);
        netif_device_attach(priv->mesh_dev);
 
+       if (priv->mesh_dev && !priv->mesh_autostart_enabled) {
+               /* Mesh autostart was activated while sleeping
+                * Disable it if appropriate
+                */
+               struct cmd_ds_mesh_access mesh_access;
+               memset(&mesh_access, 0, sizeof(mesh_access));
+               mesh_access.data[0] = cpu_to_le32(0);
+               libertas_prepare_and_send_command(priv,
+                               CMD_MESH_ACCESS,
+                               CMD_ACT_MESH_SET_AUTOSTART_ENABLED,
+                               CMD_OPTION_WAITFORRSP, 0, (void *)&mesh_access);
+       }
+
        lbs_deb_leave(LBS_DEB_USB);
        return 0;
 }
 
 {
        struct cmd_ds_mesh_access mesh_access;
        uint32_t datum;
+       wlan_private * priv = (to_net_dev(dev))->priv;
+       int ret;
 
        memset(&mesh_access, 0, sizeof(mesh_access));
        sscanf(buf, "%d", &datum);
        mesh_access.data[0] = cpu_to_le32(datum);
 
-       libertas_prepare_and_send_command((to_net_dev(dev))->priv,
+       ret = libertas_prepare_and_send_command(priv,
                        CMD_MESH_ACCESS,
                        CMD_ACT_MESH_SET_AUTOSTART_ENABLED,
                        CMD_OPTION_WAITFORRSP, 0, (void *)&mesh_access);
+       if (ret == 0)
+               priv->mesh_autostart_enabled = datum ? 1 : 0;
+
        return strlen(buf);
 }
 
 {
        int ret = -1;
        wlan_adapter *adapter = priv->adapter;
+       struct cmd_ds_mesh_access mesh_access;
 
        lbs_deb_enter(LBS_DEB_FW);
 
                goto done;
        }
 
+       /* Disable mesh autostart */
+       if (priv->mesh_dev) {
+               memset(&mesh_access, 0, sizeof(mesh_access));
+               mesh_access.data[0] = cpu_to_le32(0);
+               ret = libertas_prepare_and_send_command(priv,
+                               CMD_MESH_ACCESS,
+                               CMD_ACT_MESH_SET_AUTOSTART_ENABLED,
+                               CMD_OPTION_WAITFORRSP, 0, (void *)&mesh_access);
+               if (ret) {
+                       ret = -1;
+                       goto done;
+               }
+               priv->mesh_autostart_enabled = 0;
+       }
+
        ret = 0;
 done:
        lbs_deb_leave_args(LBS_DEB_FW, "ret %d", ret);