summaryrefslogtreecommitdiff
path: root/init.pciback
blob: db0d79de882ace557930315fa1bfe9637e1e6384 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#!/bin/bash
#
# Copyright (c) 2014 SUSE GmbH Nuernberg, Germany.  All rights reserved.
#
# /etc/init.d/pciback
#
### BEGIN INIT INFO
# Provides:          pciback
# Required-Start:    $syslog $network
# Should-Start:      $null
# Required-Stop:     $syslog $network
# Should-Stop:       $null
# Default-Start:     3 5
# Default-Stop:      0 1 2 6
# Description:       bind PCI devices to pciback
### END INIT INFO

. /etc/rc.status
. /etc/sysconfig/pciback

rc_reset

load_pciback() {
  if ! lsmod | grep -qi "pciback"
  then
    echo "Loading pciback ..."
    modprobe pciback
  fi
}

unload_pciback() {
  if lsmod | grep -qi "pciback"
  then
    echo "Unloading pciback ..."
    modprobe -r pciback
  fi
}

bind_dev_to_pciback() {
  for DEVICE in ${XEN_PCI_HIDE_LIST}
  do
    local DRV=`echo ${DEVICE} | /usr/bin/cut -d "," -f 1`
    local PCIID=`echo ${DEVICE} | /usr/bin/cut -d "," -f 2`

    if ! ls /sys/bus/pci/drivers/pciback/${PCIID} > /dev/null 2>&1
    then
      echo "Binding ${PCIID} ..."
      if ls /sys/bus/pci/drivers/${DRV}/${PCIID} > /dev/null 2>&1
      then
        echo -n ${PCIID} > /sys/bus/pci/drivers/${DRV}/unbind
      fi
      echo -n ${PCIID} > /sys/bus/pci/drivers/pciback/new_slot
      echo -n ${PCIID} > /sys/bus/pci/drivers/pciback/bind
    fi
  done
}

unbind_dev_from_pciback() {
  for DEVICE in ${XEN_PCI_HIDE_LIST}
  do
    local DRV=`echo ${DEVICE} | /usr/bin/cut -d "," -f 1`
    local PCIID=`echo ${DEVICE} | /usr/bin/cut -d "," -f 2`

    if ls /sys/bus/pci/drivers/pciback/${PCIID} > /dev/null
    then
      echo "Unbinding ${PCIID} ..."
      echo -n ${PCIID} > /sys/bus/pci/drivers/pciback/unbind
    fi
  done
}

test "uname -r" | grep xen && exit 0

case $1 in
  start)
    echo "Starting pciback ..."
    echo 
    load_pciback
    bind_dev_to_pciback

    rc_status -v -r
  ;;
  stop)
    echo "Stopping pciback ..."
    echo 
    unbind_dev_from_pciback
    unload_pciback

    rc_status -v
  ;;
  reload|restart)
    echo "Stopping pciback ..."
    echo 
    unbind_dev_from_pciback
    unload_pciback
    echo "Starting pciback ..."
    echo 
    load_pciback
    bind_dev_to_pciback
  ;;
  status)
    if lsmod | grep -qi pciback
    then
      echo
      echo "pciback:  loaded"
      echo
      echo "Currently bound devices ..."
      echo "-----------------------------"
      ls /sys/bus/pci/drivers/pciback | grep ^0000
      echo
    else
      echo "pciback:  not loaded"
    fi
  ;;
  *)
    echo "Usage: $0 [start|stop|restart|reload|status]"
    exit 1
  ;;
esac