home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / boot / i386 / root / etc / sysconfig / hardware / scripts / functions.pcmcia next >
Text File  |  2006-11-29  |  4KB  |  133 lines

  1.  
  2. if [ -r /dev/shm/nopcmcia ] ; then
  3.     mesg "Won't initialize pcmcia due to boot parameter" \
  4.          "`cat /dev/shm/nopcmcia`"
  5.     exit 0
  6. fi
  7.  
  8. FIRMWARE_DIRS="/lib/firmware /usr/local/lib/firmware /usr/lib/hotplug/firmware"
  9. FIRMWARE_DIRS="$FIRMWARE_DIRS /etc/pcmcia/cis"
  10.  
  11. test -r /etc/sysconfig/pcmcia && . /etc/sysconfig/pcmcia
  12.  
  13. # Overwrite this function to avoid useless getcfg call.
  14. # This may be removed if we restrict getcfg calls or remove them completely.
  15. get_config_getcfg() {
  16.     get_config_fast
  17. }
  18.  
  19. get_pcmcia_information() {
  20.     undo_shopt="`shopt -p nullglob`"
  21.     shopt -s nullglob
  22.     local DP CONFNAMES CONFFILES CONFIGS MATCH MATCHINDEX
  23.  
  24.     # get sysfs path to the socket and socket number
  25.     if [ -z "$SOCKET_NO" ] ; then
  26.         for SOCKETPATH in $SYSFS/class/pcmcia_socket/* ""; do
  27.             DP="`cd -P $SOCKETPATH/device/$HWD_BUSID 2>/dev/null \
  28.                  && pwd`"
  29.             test "$DP" == "$HWD_DEVICEPATH" || continue
  30.             SOCKET_NO=${SOCKETPATH##*/pcmcia_socket}
  31.             break
  32.         done
  33.     else
  34.         SOCKETPATH=$SYSFS/class/pcmcia_socket/pcmcia_socket${SOCKET_NO}
  35.     fi
  36.  
  37.     # get all available device information
  38.     MANF_ID="`cat $HWD_DEVICEPATH/manf_id 2>/dev/null`"
  39.     CARD_ID="`cat $HWD_DEVICEPATH/card_id 2>/dev/null`"
  40.     FUNC_ID="`cat $HWD_DEVICEPATH/func_id 2>/dev/null`"
  41.     PROD_ID1="`cat $HWD_DEVICEPATH/prod_id1 2>/dev/null`"
  42.     PROD_ID2="`cat $HWD_DEVICEPATH/prod_id2 2>/dev/null`"
  43.     PROD_ID3="`cat $HWD_DEVICEPATH/prod_id3 2>/dev/null`"
  44.     PROD_ID4="`cat $HWD_DEVICEPATH/prod_id4 2>/dev/null`"
  45.     PROD_ID1="${PROD_ID1//\//_}"
  46.     PROD_ID2="${PROD_ID2//\//_}"
  47.     PROD_ID3="${PROD_ID3//\//_}"
  48.     PROD_ID4="${PROD_ID4//\//_}"
  49.     FUNCTION="`cat $HWD_DEVICEPATH/function 2>/dev/null`"
  50.  
  51.     # create all possible configuration names
  52.     CONFNAMES[0]="bus-$HWD_BUSID"
  53.     CONFNAMES[1]="bus-${HWD_BUSID%.*}"
  54.     CONFNAMES[2]="vpid-$MANF_ID-$CARD_ID"
  55.     CONFNAMES[3]="vpid-$MANF_ID"
  56.     CONFNAMES[4]="name-$PROD_ID1-$PROD_ID2-$PROD_ID3-$PROD_ID4"
  57.     CONFNAMES[5]="name-$PROD_ID1-$PROD_ID2-$PROD_ID3"
  58.     CONFNAMES[6]="name-$PROD_ID1-$PROD_ID2"
  59.     CONFNAMES[7]="name-$PROD_ID1"
  60.     CONFNAMES[8]="func-$FUNC_ID"
  61.  
  62.     # Look for a configuration file
  63.     CONFFILES=(hwcfg-pcmcia-*)
  64.     for i in ${!CONFFILES[@]} ; do
  65.         CONFIGS[$i]=${CONFFILES[$i]#hwcfg-pcmcia-}
  66.     done
  67.     unset MATCH
  68.     for i in ${!CONFIGS[@]}; do
  69.         for k in ${!CONFNAMES[@]}; do
  70.             debug_mesg "${CONFIGS[$i]} <---> ${CONFNAMES[$k]}"
  71.             test "${CONFIGS[$i]}" != "${CONFNAMES[$k]}" && continue
  72.             MATCH[$k]="${CONFIGS[$i]}"
  73.             break
  74.         done
  75.     done
  76.     MATCHINDEX=(${!MATCH[@]})
  77.     HWD_CONFIG="${MATCHINDEX:+pcmcia-${MATCH[$MATCHINDEX]}}"
  78.  
  79.     $undo_shopt
  80. }
  81.  
  82. post_init_pcmcia() {
  83.  
  84.     local SOCKETCISFILE MESSAGE
  85.  
  86.     # If there is no driver bound to the device we may check if CIS is
  87.     # broken or apply a CIS specified in the hardware configuration file.
  88.     if [ "$PCMCIA_LOAD_CIS" == yes -a ! -h $HWD_DEVICEPATH/driver ]; then
  89.         info_mesg "Trying to load CIS for card in socket '$SOCKET_NO'"
  90.         : ${CISFILE:=`pcmcia-check-broken-cis $SOCKET_NO`}
  91.         for DIR in $FIRMWARE_DIRS; do
  92.             if [ -z "$CISFILE" ] ; then
  93.                 err_mesg "No CIS filename given"
  94.                 break
  95.             fi
  96.             SOCKETCISFILE="$SOCKETPATH/cis"
  97.             if [ ! -w "$SOCKETCISFILE" ] ; then
  98.                 err_mesg "'$SOCKETCISFILE' not writable"
  99.                 break
  100.             fi
  101.             MESSAGE="Did not find '$CISFILE' in any of these"
  102.             MESSAGE="$MESSAGE dirs: $FIRMWARE_DIRS"
  103.             test -r "$DIR/$CISFILE" || continue
  104.             cat "$DIR/$CISFILE" > "$SOCKETCISFILE"
  105.             MESSAGE="Loaded '$DIR/$CISFILE'"
  106.             break
  107.         done
  108.         if [ -n "$MESSAGE" ] ; then
  109.             err_mesg "$MESSAGE"
  110.         fi
  111.     fi
  112.  
  113.     # If there is still no driver bound to the device we may allow a match
  114.     # solely based on the "function ID" field
  115.     if [    "$PCMCIA_ALLOW_FUNC_MATCH" == yes \
  116.          -a ! -h $HWD_DEVICEPATH/driver ]; then
  117.         if [ -w $HWD_DEVICEPATH/allow_func_id_match ]; then
  118.             info_mesg "Allowing func_id based device matching"
  119.             echo -n "42" > $HWD_DEVICEPATH/allow_func_id_match
  120.         else
  121.             err_mesg "Cannot allow func_id based device matching"
  122.         fi
  123.         # Maybe we have to bind the device manually to the driver?
  124.     fi
  125. }
  126.  
  127. show_pcmcia_information() {
  128.     for var in ${!SOCKET*} ${!DEVICE_NO*} ${!MANF_ID*} ${!CARD_ID*} \
  129.                ${!PROD_ID*} ${!FUNC_ID*} ${!FUNCTION*} ${!CISF*}; do
  130.         info_mesg ${var}=${!var}
  131.     done
  132. }
  133.