#!/bin/sh
#
# Copyright (c) 2018-2021, The Linux Foundation. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#     * Redistributions of source code must retain the above copyright
#       notice, this list of conditions and the following disclaimer.
#     * Redistributions in binary form must reproduce the above copyright
#       notice, this list of conditions and the following disclaimer in the
#       documentation and/or other materials provided with the distribution.
#     * Neither the name of The Linux Foundation nor the names of its
#       contributors may be used to endorse or promote products derived from
#       this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE DISCLAIMED.  IN NO
# EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

echo "Switching to composition Recovery" > /dev/kmsg


ql_run_configfs() {
    usb_vid=0x2C7C
    usb_pid=0x0122
    manu_string="Quectel"
    prod_string="5G Module"
    func_str="gser.0,gser.1,cser.dun.0,cser.dun.2,ffs.adb"
    USBDIR="/tmp/usb"

    echo start > /tmp/usb_bind_in_progress
    
    cd /sys/kernel/config/usb_gadget/g1
    rm os_desc/c* 2> /dev/null
    rm configs/c*/f* 2> /dev/null
    rm -rf configs/c.2 configs/c.3 2> /dev/null

	ql_usbcfg -d$USBDIR

    if [ -f $USBDIR/quec_usb_vid ]
    then 
        usb_vid=`cat $USBDIR/quec_usb_vid`
    fi
    if [ -f $USBDIR/quec_usb_pid ]
    then 
        usb_pid=`cat $USBDIR/quec_usb_pid`
    fi
    echo $usb_vid > idVendor
    echo $usb_pid > idProduct

    echo "SER" > configs/c.1/strings/0x409/configuration

    if [ -f $USBDIR/quec_manufeature ]
    then 
        manu_string=`cat $USBDIR/quec_manufeature`
    fi
    echo $manu_string > strings/0x409/manufacturer

    if [ -f $USBDIR/quec_product ]
    then 
        prod_string=`cat $USBDIR/quec_product`
    fi
    echo $prod_string > strings/0x409/product

    grep "gsi.rndis"  $USBDIR/quec_usb_func

    if [ $? == 0 ]; then
        ln -s functions/gser.0 configs/c.1/f2
        ln -s functions/gser.1 configs/c.1/f3
        ln -s functions/cser.dun.0 configs/c.1/f4
        ln -s functions/cser.dun.2 configs/c.1/f5
	grep "ffs.adb" $USBDIR/quec_usb_func
        if [ $? == 0 ];then
            ln -s functions/ffs.adb.0 configs/c.1/f7
        fi
    else
        ln -s functions/gser.0 configs/c.1/f0
        ln -s functions/gser.1 configs/c.1/f1
        ln -s functions/cser.dun.0 configs/c.1/f2
        ln -s functions/cser.dun.2 configs/c.1/f3
	grep "ffs.adb" $USBDIR/quec_usb_func
        if [ $? == 0 ];then
            ln -s functions/ffs.adb.0 configs/c.1/f5
        fi
    fi

    echo 0xA0 > configs/c.1/bmAttributes
    rm -f /tmp/usb_bind_in_progress
    echo "binding UDC with Gadget..." $1
    echo $1 > UDC
    cd /
}

udcname=`ls -1 /sys/class/udc | head -n 1`
ql_run_configfs $udcname
