#
# Copyright 2014 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

import init.shamu.usb.rc
import init.shamu.power.rc
import init.shamu.diag.rc

on early-init
    mkdir /firmware 0771 system system
    symlink /data/tombstones /tombstones
    mount debugfs debugfs /sys/kernel/debug
    chown system system /sys/kernel/debug/kgsl/proc

on init
    # See storage config details at http://source.android.com/tech/storage/
    mkdir /mnt/shell/emulated 0700 shell shell
    mkdir /storage/emulated 0555 root root

    mkdir /oem 0550 root root

    # Set permissions for persist partition
    mkdir /persist 0771 system system

    export EXTERNAL_STORAGE /storage/emulated/legacy
    export EMULATED_STORAGE_SOURCE /mnt/shell/emulated
    export EMULATED_STORAGE_TARGET /storage/emulated

    # Support legacy paths
    symlink /storage/emulated/legacy /sdcard
    symlink /storage/emulated/legacy /mnt/sdcard
    symlink /storage/emulated/legacy /storage/sdcard0
    symlink /mnt/shell/emulated/0 /storage/emulated/legacy

on fs
    mount_all fstab.shamu
    setprop ro.crypto.fuse_sdcard true

    # Keeping following partitions outside fstab file. As user may not have
    # these partition flashed on the device. Failure to mount any partition in fstab file
    # results in failure to launch late-start class.

    wait /dev/block/platform/msm_sdcc.1/by-name/persist
    mount ext4 /dev/block/platform/msm_sdcc.1/by-name/persist /persist nosuid nodev barrier=1
    restorecon_recursive /persist
    mkdir /persist/data 0700 system system
    mkdir /persist/data/sfs 0700 system system
    mkdir /persist/data/tz 0700 system system
    mkdir /persist/public 0755 system radio
    mkdir /persist/public/hiddenmenu 0775 system radio
    mkdir /persist/public/hiddenmenu/data 0775 system radio

    wait /dev/block/platform/msm_sdcc.1/by-name/oem
    mount ext4 /dev/block/platform/msm_sdcc.1/by-name/oem /oem ro nosuid nodev context=u:object_r:oemfs:s0

    mkdir /fsg 0755 root root
    mount ext4 /dev/block/platform/msm_sdcc.1/by-name/mdm1m9kefs3 /fsg ro nosuid nodev barrier=0 context=u:object_r:fsg_file:s0

    # Enable rmnet data and aggregation
    setprop persist.rmnet.mux enabled
    setprop persist.rmnet.data.enable true
    setprop persist.data.wda.enable true
    setprop persist.data.df.agg.dl_pkt 10
    setprop persist.data.df.agg.dl_size 4096

on post-fs-data
    mkdir /data/tombstones 0771 system system
    mkdir /tombstones/modem 0771 system system
    mkdir /tombstones/lpass 0771 system system
    mkdir /tombstones/wcnss 0771 system system
    mkdir /tombstones/dsps 0771 system system

    # SENSORS
    #Create directory used by sensor subsystem(dsps)
    mkdir /data/system/sensors
    chmod 0775 /data/system/sensors

    # AKM setting data
    mkdir /data/misc/sensors
    chmod 0775 /data/misc/sensors

    mkdir /persist/sensors
    chmod 0775 /persist/sensors

    mkdir /persist/mdm 0770 radio radio

    #Subsystem RAM-dumps
    mkdir /data/ss-ram-dumps 0750 radio log
    mkdir /data/ss-ram-dumps/bp-dumps 0750 radio log

    # rild files
    mkdir /data/misc/audio_cutback 0770 radio audio

on early-boot
    # set RLIMIT_MEMLOCK to 64MB
    setrlimit 8 67108864 67108864
    # Allow subsystem (modem etc) debugging
    write /sys/module/subsystem_restart/parameters/enable_debug ${persist.sys.ssr.enable_debug}
    write /sys/kernel/boot_adsp/boot 1

    # Subsytem Restart
    #venus
    write /sys/bus/msm_subsys/devices/subsys0/restart_level "related"
    write /sys/bus/msm_subsys/devices/subsys0/recovery_policy "skip_restart"
    #adsp
    write /sys/bus/msm_subsys/devices/subsys1/restart_level "related"
    write /sys/bus/msm_subsys/devices/subsys1/recovery_policy "skip_restart"
    #vpu
    write /sys/bus/msm_subsys/devices/subsys2/restart_level "related"
    write /sys/bus/msm_subsys/devices/subsys2/recovery_policy "skip_restart"
    #esoc0 (mdm)
    write /sys/bus/msm_subsys/devices/subsys3/restart_level "related"
    write /sys/bus/msm_subsys/devices/subsys3/recovery_policy "skip_restart"

on boot
    insmod /system/lib/modules/adsprpc.ko
    insmod /system/lib/modules/mhi.ko
    chown bluetooth net_bt_stack /sys/module/bluetooth_power/parameters/power
    chown bluetooth net_bt_stack /sys/class/rfkill/rfkill0/type
    chown bluetooth net_bt_stack /sys/class/rfkill/rfkill0/state
    chown bluetooth net_bt_stack /proc/bluetooth/sleep/proto
    chown bluetooth net_bt_stack /proc/bluetooth/sleep/lpm
    chown bluetooth net_bt_stack /proc/bluetooth/sleep/btwrite
    chown bluetooth net_bt_stack /sys/module/hci_uart/parameters/ath_lpm
    chown bluetooth net_bt_stack /sys/module/hci_uart/parameters/ath_btwrite
    chown system system /sys/module/sco/parameters/disable_esco
    chown bluetooth net_bt_stack /sys/module/hci_smd/parameters/hcismd_set
    chmod 0660 /sys/module/bluetooth_power/parameters/power
    chmod 0660 /sys/module/hci_smd/parameters/hcismd_set
    chmod 0660 /sys/class/rfkill/rfkill0/state
    chmod 0660 /proc/bluetooth/sleep/proto
    chown bluetooth net_bt_stack /dev/ttyHS0
    chmod 0660 /sys/module/hci_uart/parameters/ath_lpm
    chmod 0660 /sys/module/hci_uart/parameters/ath_btwrite
    chmod 0660 /dev/ttyHS0
    chown bluetooth net_bt_stack /sys/devices/platform/msm_serial_hs.0/clock
    chmod 0660 /sys/devices/platform/msm_serial_hs.0/clock

    chmod 0660 /dev/ttyHS2
    chown bluetooth net_bt_stack /dev/ttyHS2

    #Create QMUX deamon socket area
    mkdir /dev/socket/qmux_radio 0770 radio radio
    chmod 2770 /dev/socket/qmux_radio
    mkdir /dev/socket/qmux_audio 0770 media audio
    chmod 2770 /dev/socket/qmux_audio
    mkdir /dev/socket/qmux_bluetooth 0770 bluetooth bluetooth
    chmod 2770 /dev/socket/qmux_bluetooth
    mkdir /dev/socket/qmux_gps 0770 gps gps
    chmod 2770 /dev/socket/qmux_gps

    mkdir /dev/socket/mpdecision 2775 root system
    chmod 2775 /dev/socket/mpdecision

    setprop wifi.interface wlan0

    #readable symlinks for video nodes
    mkdir /dev/video
    symlink /dev/video32 /dev/video/venus_dec
    symlink /dev/video33 /dev/video/venus_enc

    setprop ro.telephony.call_ring.multiple false

    chown system system /sys/bus/i2c/devices/1-004a/tsp

    chmod 0444 /sys/devices/platform/msm_hsusb/gadget/usb_state

    # Allow QMUX daemon to assign port open wait time
    chown radio radio /sys/devices/virtual/hsicctl/hsicctl0/modem_wait

    #port-bridge
    chmod 0660 /dev/smd0
    chown system system /dev/smd0

    #BT DUN port-bridge
    chmod 0660 /dev/smd7
    chown bluetooth net_bt_stack /dev/smd7

    #For bridgemgr daemon to inform the USB driver of the correct transport
    chown radio radio /sys/class/android_usb/f_rmnet_smd_sdio/transport

#   Assign TCP buffer thresholds to be ceiling value of technology maximums
#   Increased technology maximums should be reflected here.
    write /proc/sys/net/core/rmem_max  8388608
    write /proc/sys/net/core/wmem_max  8388608

    #To allow interfaces to get v6 address when tethering is enabled
    write /proc/sys/net/ipv6/conf/rmnet0/accept_ra 2
    write /proc/sys/net/ipv6/conf/rmnet1/accept_ra 2
    write /proc/sys/net/ipv6/conf/rmnet2/accept_ra 2
    write /proc/sys/net/ipv6/conf/rmnet3/accept_ra 2
    write /proc/sys/net/ipv6/conf/rmnet4/accept_ra 2
    write /proc/sys/net/ipv6/conf/rmnet5/accept_ra 2
    write /proc/sys/net/ipv6/conf/rmnet6/accept_ra 2
    write /proc/sys/net/ipv6/conf/rmnet7/accept_ra 2
    write /proc/sys/net/ipv6/conf/rmnet_sdio0/accept_ra 2
    write /proc/sys/net/ipv6/conf/rmnet_sdio1/accept_ra 2
    write /proc/sys/net/ipv6/conf/rmnet_sdio2/accept_ra 2
    write /proc/sys/net/ipv6/conf/rmnet_sdio3/accept_ra 2
    write /proc/sys/net/ipv6/conf/rmnet_sdio4/accept_ra 2
    write /proc/sys/net/ipv6/conf/rmnet_sdio5/accept_ra 2
    write /proc/sys/net/ipv6/conf/rmnet_sdio6/accept_ra 2
    write /proc/sys/net/ipv6/conf/rmnet_sdio7/accept_ra 2
    write /proc/sys/net/ipv6/conf/rmnet_usb0/accept_ra 2
    write /proc/sys/net/ipv6/conf/rmnet_usb1/accept_ra 2
    write /proc/sys/net/ipv6/conf/rmnet_usb2/accept_ra 2
    write /proc/sys/net/ipv6/conf/rmnet_usb3/accept_ra 2

    # To prevent out of order acknowledgements from making
    # connection tracking to treat them as not belonging to
    # the connection they belong to.
    # Otherwise, a weird issue happens in which some long
    # connections on high-throughput links get dropped when
    # an ack packet comes out of order
    write /proc/sys/net/netfilter/nf_conntrack_tcp_be_liberal 1

    # Set the console loglevel to < KERN_INFO
    # Set the default message loglevel to KERN_INFO
    # write /proc/sys/kernel/printk "6 6 1 7"

    write /sys/bus/platform/drivers/xhci_msm_hsic/unbind msm_hsic_host
    write /sys/module/rmnet_usb/parameters/mux_enabled 1
    write /sys/module/rmnet_usb/parameters/no_fwd_rmnet_links 8
    write /sys/module/rmnet_usb/parameters/no_rmnet_insts_per_dev 17
    write /sys/module/rmnet_usb/parameters/rmnet_data_init 1
    chown radio radio /sys/devices/virtual/hsicctl/hsicctl0/modem_wait

    # Audio DSP permissions
    chown media media /dev/ttyHS3
    chown media media /sys/devices/c55_ctrl/gpio_ap_int/edge
    chown media media /sys/devices/c55_ctrl/gpio_ap_int/value
    chown media media /sys/devices/c55_ctrl/gpio_c55_int/value
    chown media media /sys/devices/c55_ctrl/gpio_core/value
    chown media media /sys/devices/c55_ctrl/gpio_reset/value

# subsystem ramdump collection
on property:persist.sys.qc.sub.rdump.on=*
    write /sys/module/subsystem_restart/parameters/enable_ramdumps ${persist.sys.qc.sub.rdump.on}

# permissions for CapSense firmware update
    chown radio radio /sys/devices/cycapsense_prog.1/cycapsense_fw
    chmod 0220 /sys/devices/cycapsense_prog.1/cycapsense_fw

# msm specific files that need to be created on /data
on post-fs-data
    # we will remap this as /mnt/sdcard with the sdcard fuse tool
    mkdir /data/media 0770 media_rw media_rw
    chown media_rw media_rw /data/media

    mkdir /data/misc/bluetooth 0770 bluetooth bluetooth

    # Create the directories used by the Wireless subsystem
    mkdir /data/misc/wifi 0770 wifi wifi
    mkdir /data/misc/wifi/sockets 0770 wifi wifi
    mkdir /data/misc/wifi/wpa_supplicant 0770 wifi wifi
    mkdir /data/misc/dhcp 0770 dhcp dhcp
    chown dhcp dhcp /data/misc/dhcp

    # Create the directories used by CnE subsystem
    mkdir /data/connectivity 0771 system system
    chown system system /data/connectivity

    mkdir /data/connectivity/nsrm 0771 system system
    chown system system /data/connectivity/nsrm

    # Create directory used by audio subsystem
    mkdir /data/misc/audio 0770 audio audio

    # Mounting of persist is moved to 'on emmc-fs' and 'on fs' sections
    # We chown/chmod /persist again so because mount is run as root + defaults
    chown system system /persist
    chmod 0771 /persist
    chmod 0664 /sys/devices/platform/msm_sdcc.1/polling
    chmod 0664 /sys/devices/platform/msm_sdcc.2/polling
    chmod 0664 /sys/devices/platform/msm_sdcc.3/polling
    chmod 0664 /sys/devices/platform/msm_sdcc.4/polling

    # Chown polling nodes as needed from UI running on system server
    chown system system /sys/devices/platform/msm_sdcc.1/polling
    chown system system /sys/devices/platform/msm_sdcc.2/polling
    chown system system /sys/devices/platform/msm_sdcc.3/polling
    chown system system /sys/devices/platform/msm_sdcc.4/polling

    #Create the symlink to qcn wpa_supplicant folder for ar6000 wpa_supplicant
    mkdir /data/system 0775 system system
    #symlink /data/misc/wifi/wpa_supplicant /data/system/wpa_supplicant

    #Create directories for Location services
    mkdir /data/misc/location 0770 gps gps
    mkdir /data/misc/location/mq 0770 gps gps
    mkdir /data/misc/location/xtwifi 0770 gps gps
    mkdir /data/misc/location/quipc 0770 gps system
    mkdir /data/misc/location/gsiff 0770 gps gps

    #Create directory from IMS services
    mkdir /data/shared 0755
    chown system system /data/shared

    #Create directory for FOTA
    mkdir /data/fota 0771
    chown system system /data/fota

    #Create directory for hostapd
    mkdir /data/hostapd 0770 system wifi

    # Create /data/time folder for time-services
    mkdir /data/time/ 0700 system system

    mkdir /data/audio/ 0770 media audio

    setprop vold.post_fs_data_done 1

    #Create a folder for SRS to be able to create a usercfg file
    mkdir /data/data/media 0770 media media

    # NFC local data and nfcee xml storage
    mkdir /data/nfc 0770 nfc nfc
    mkdir /data/nfc/param 0770 nfc nfc

    # Audio DSP permissions
    mkdir /data/adspd 0770 media media
    mkdir /data/adspd/1 0770 media media

on property:init.svc.wpa_supplicant=stopped
    stop dhcpcd

on property:bluetooth.isEnabled=true
    start btwlancoex
    write /sys/class/bluetooth/hci0/idle_timeout 7000

on property:ro.bluetooth.ftm_enabled=true
    start ftmd

on property:persist.env.fastdorm.enabled=true
    setprop persist.radio.data_no_toggle 1

service irsc_util /system/bin/irsc_util "/etc/sec_config"
    class main
    user root
    oneshot

service mdm_helper /system/bin/mdm_helper
    user root
    group root system radio
    class core
    onrestart setprop ro.service.mdm_helper_restarted "true"

service tcmd /system/bin/tcmd_mini
    class core
    user radio
    group radio net_raw net_admin
    disabled

service bridgemgrd /system/bin/bridgemgrd
    class late_start
    user radio
    group radio

# QMUX must be in multiple groups to support external process connections
service qmuxd /system/bin/qmuxd
    class main
    user root
    group radio audio bluetooth gps

service netmgrd /system/bin/netmgrd
    class main
    group radio

service sensors /system/bin/sensors.qcom
    class core
    user root
    group root

on property:ro.use_data_netmgrd=false
    # netmgr not supported on specific target
    stop netmgrd

# Adjust socket buffer to enlarge TCP receive window for high bandwidth
# but only if ro.data.large_tcp_window_size property is set.
on property:ro.data.large_tcp_window_size=true
    write /proc/sys/net/ipv4/tcp_adv_win_scale  2

service p2p_supplicant /system/bin/wpa_supplicant \
    -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \
    -I/system/etc/wifi/p2p_supplicant_overlay.conf  \
    -puse_p2p_group_interface=1p2p_device=1 \
    -m/data/misc/wifi/p2p_supplicant.conf \
    -e/data/misc/wifi/entropy.bin -g@android:wpa_wlan0
#   we will start as root and wpa_supplicant will switch to user wifi
#   after setting up the capabilities required for WEXT
#   user wifi
#   group wifi inet keystore
    class main
    socket wpa_wlan0 dgram 660 wifi wifi
    disabled
    oneshot

service wpa_supplicant /system/bin/wpa_supplicant \
    -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \
    -I/system/etc/wifi/wpa_supplicant_overlay.conf \
    -e/data/misc/wifi/entropy.bin -g@android:wpa_wlan0
    #   we will start as root and wpa_supplicant will switch to user wifi
    #   after setting up the capabilities required for WEXT
    #   user wifi
    #   group wifi inet keystore
    class main
    socket wpa_wlan0 dgram 660 wifi wifi
    disabled
    oneshot

service dhcpcd_wlan0 /system/bin/dhcpcd -ABKLG
    class late_start
    disabled
    oneshot

service dhcpcd_p2p /system/bin/dhcpcd -ABKLG
    class late_start
    disabled
    oneshot

service iprenew_wlan0 /system/bin/dhcpcd -n
    class late_start
    disabled
    oneshot

service iprenew_p2p /system/bin/dhcpcd -n
    class late_start
    disabled
    oneshot

service dhcpcd_bt-pan /system/bin/dhcpcd -BKLG
    class late_start
    disabled
    oneshot

service iprenew_bt-pan /system/bin/dhcpcd -n
    class late_start
    disabled
    oneshot

service dhcpcd_bnep0 /system/bin/dhcpcd -BKLG
    disabled
    oneshot

service dhcpcd_bnep1 /system/bin/dhcpcd -BKLG
    disabled
    oneshot

service dhcpcd_bnep2 /system/bin/dhcpcd -BKLG
    disabled
    oneshot

service dhcpcd_bnep3 /system/bin/dhcpcd -BKLG
    disabled
    oneshot

service dhcpcd_bnep4 /system/bin/dhcpcd -BKLG
    disabled
    oneshot

service dhcpcd_eth0 /system/bin/dhcpcd -aABDKL
    class late_start
    disabled
    oneshot

service iprenew_eth0 /system/bin/dhcpcd -n
    class late_start
    disabled
    oneshot

service adspd /system/bin/adspd /dev/ttyHS3
   class late_start
   socket adspdsock stream 0660 media media
   user media
   group media input

#start GNSS/Sensor interface daemon
service gsiff_daemon /system/vendor/bin/gsiff_daemon
    class late_start
    user gps
    group gps net_raw

on property:sys.boot_completed=1
    start qcom-post-boot

on property:ro.debuggable=1
    start ss_ramdump

on property:ro.data.large_tcp_window_size=true
    # Adjust socket buffer to enlarge TCP receive window for high bandwidth (e.g. DO-RevB)
    write /proc/sys/net/ipv4/tcp_adv_win_scale  2

# virtual sdcard daemon running as media_rw (1023)
service sdcard /system/bin/sdcard -u 1023 -g 1023 -l /data/media /mnt/shell/emulated
    class late_start

on charger
    write /sys/class/leds/lcd-backlight/brightness 100
    mount ext4 /dev/block/platform/msm_sdcc.1/by-name/system /system ro barrier=1
    start thermal-engine

service charger /charger
    class charger
    group log
    seclabel u:r:healthd:s0

# Allow usb charging to be disabled peristently
on property:persist.usb.chgdisabled=1
    write /sys/class/power_supply/battery/charging_enabled 0

on property:persist.usb.chgdisabled=0
    write /sys/class/power_supply/battery/charging_enabled 1

service qseecomd /system/bin/qseecomd
   class core
   user root
   group root

service mpdecision /system/bin/mpdecision --avg_comp
   class main
   user root
   disabled

service ss_ramdump /system/bin/subsystem_ramdump
    class main
    user root
    group root
    disabled

service thermal-engine /system/bin/thermal-engine
   class main
   user root
   group root

service time_daemon /system/bin/time_daemon
   class late_start
   user root
   group root

on property:init.svc.bootanim=stopped
    start usf-post-boot

service qcamerasvr /system/bin/mm-qcamera-daemon
    class late_start
    user camera
    group camera system inet input graphics

service bdAddrLoader /system/bin/bdAddrLoader -p ro.boot.btmacaddr -s -x
    class main
    user bluetooth
    group system bluetooth
    oneshot

on property:vold.decrypt=trigger_reset_main
    stop gnss-svcd

# When QCA1530 is known not to present
on property:persist.qca1530=no
   stop gnss-svcd
   stop gnss-detect
   write /sys/kernel/qca1530/chip_state 0

on property:init.svc.surfaceflinger=stopped
    stop ppd

service mmi-touch-sh /system/bin/sh /init.mmi.touch.sh atmel
    class main
    user root
    oneshot

# bugreport is triggered by holding down volume down, volume up and power
service bugreport /system/bin/dumpstate -d -p -B \
        -o /data/data/com.android.shell/files/bugreports/bugreport
    class main
    disabled
    oneshot
    keycodes 114 115 116

service mdm_helper_proxy /system/bin/mdm_helper_proxy
    class core
    user system
    group system
    disabled

# Stop mdm_helper_proxy in case of shutdown
on property:sys.shutdown.requested=*
    stop mdm_helper_proxy

# Start mdm_helper_proxy after RIL.
on property:ro.mdm_helper_proxy_req=true
    start mdm_helper_proxy

on property:init.svc.ril-daemon=running
    setprop ro.mdm_helper_proxy_req true
