#!/bin/bash
# Kvaser CAN driver                     
# usbcanII - start/stop usbcanII  and create/delete device files
#
#                 Copyright 2012 by Kvaser AB, Mlndal, Sweden
#                         http://www.kvaser.com
# 
#  This software is dual licensed under the following two licenses:
#  BSD-new and GPLv2. You may use either one. See the included
#  COPYING file for details.
# 
#  License: BSD-new
#  ===============================================================================
#  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 <organization> 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 BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
#  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
#  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
#  DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> 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.
# 
# 
#  License: GPLv2
#  ===============================================================================
#  This program is free software; you can redistribute it and/or
#  modify it under the terms of the GNU General Public License
#  as published by the Free Software Foundation; either version 2
#  of the License, or (at your option) any later version.
# 
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
# 
#  You should have received a copy of the GNU General Public License
#  along with this program; if not, write to the Free Software
#  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
# 
#  ---------------------------------------------------------------------------
#

LOG=/usr/bin/logger
AWK=/bin/awk
GREP=/bin/grep
MKNOD=/bin/mknod
MODPROBE=/sbin/modprobe
SLEEP=/bin/sleep

MODULE=usbcanII


#     
# test kernel version
#     
kernel_ver=`uname -r | $AWK -F . '{print $2}'` 

case $kernel_ver in
   "6") kv_module_install=modprobe
        ;;
   *)   kv_module_install=insmod
        ;;
esac

# Current hotplug loads module file automatically
# /sbin/$kv_module_install ${MODULE} || exit 1

#
# Install 
#
$LOG -t $0 "Kvaser USB hotplug script"

# Add ${MODULE} module
if test $ACTION = 'add'
then
    $SLEEP 2 # Sleep a second or two to be sure that module init is executed
    if  [ -e /proc/${MODULE} ] 
    then 
	nrchan=`cat /proc/${MODULE} | $GREP 'total channels' | cut -d' ' -f 3`
	major=`cat /proc/devices | $GREP ${MODULE} | cut -d' ' -f 1`
        for (( n=0 ; $n<${nrchan}; n++ )) ; do
         p=`expr 2 + $nrchan - $n`
 	 minor=`cat /proc/${MODULE} | $GREP 'minor numbers' | cut -d' ' -f $p`
	 $LOG -t $0 $major, $minor, $nrchan, $n, $p
	 if [ ! -c /dev/${MODULE}$minor ] ; then 
	     $LOG -t $0 "${MODULE} device with minor $minor inserted"
	     $MKNOD /dev/${MODULE}$minor c $major $minor
	     #if test -z $REMOVER ; then exit 0 ; fi
             # The file $REMOVER (is unique for each usb device)
             # is called by the HOTPLUG system on removal
             # We have to write the uninstall script to it
	     # When all devices are inserted at the same time, e.g. at start up
	     # racing may happen, which means that device files
             # can not be removed until the last device is removed and the 
             # module is removed.
	     # Try to remove the ${MODULE} module, if successful remove all ${MODULE} device files.
	     echo "#!/bin/sh" >$REMOVER
	     echo "$MODPROBE -r ${MODULE}" >>$REMOVER
	     echo "$SLEEP 1" >>$REMOVER
	     echo "if [ ! -e /proc/${MODULE} ] ; then rm -f /dev/${MODULE}* && $LOG -t $0 "Module ${MODULE}  with minor device files removed" ; fi" >>$REMOVER
	     chmod +x $REMOVER
#	     exit 0
	 fi
	done
    fi
fi

# Handle remove in another way just in case.
if test $ACTION = 'remove' 
then
    # When all devices are inserted at the same time, e.g. at start up
    # racing may happen, which means that device files
    # can not be removed until the last device is removed and the 
    # module is removed.
    # Try to remove the ${MODULE} module, if successful remove all ${MODULE} device files.
    $MODPROBE -r ${MODULE}
    if [ ! -e /proc/${MODULE} ] ; then rm -f /dev/${MODULE}* && $LOG -t $0 "Module ${MODULE} with minor $minor removed" ; fi
    exit 0
fi
exit 0
