Release of pcmciautils-011 (2005-12-06)
Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
diff --git a/Makefile b/Makefile
index 1dd5a5c..705ada7 100644
--- a/Makefile
+++ b/Makefile
@@ -31,7 +31,7 @@
# Set this to true if you want to use 'udev' instead of 'hotplug'
# to invoke the necessary pcmciautils commands.
-UDEV = false
+UDEV = true
# Set the following to `true' to log the debug
# and make a unstripped, unoptimized binary.
@@ -44,7 +44,7 @@
CBDUMP = cbdump
CISDUMP = dump_cis
-VERSION = 010
+VERSION = 011
#INSTALL_DIR = /usr/local/sbin
RELEASE_NAME = pcmciautils-$(VERSION)
@@ -57,6 +57,7 @@
exec_prefix = ${prefix}
etcdir = ${prefix}/etc
sbindir = ${exec_prefix}/sbin
+mandir = ${prefix}/usr/share/man
srcdir = .
INSTALL = /usr/bin/install -c
@@ -169,12 +170,12 @@
UNINSTALL_TARGETS = uninstall-udev
endif
+
+
# if STARTUP is disabled, we can skip a few things
ifeq ($(strip $(STARTUP)),false)
- UDEV_RULES = udev/60-pcmcia.rules.static
PCMCIA_SOCKET_STARTUP_BUILD =
else
- UDEV_RULES = udev/60-pcmcia.rules
PCMCIA_SOCKET_STARTUP_BUILD = $(PCMCIA_SOCKET_STARTUP)
INSTALL_TARGETS += install-config install-socket-tools
UNINSTALL_TARGETS += uninstall-socket-tools
@@ -184,8 +185,15 @@
endif
endif
+#udev rules collection
+UDEV_RULES_FILE = udev/60-pcmcia.rules
+UDEV_RULES = udev/rules-start udev/rules-modprobe udev/rules-base
+ifneq ($(strip $(STARTUP)),false)
+ UDEV_RULES += udev/rules-nonstaticsocket
+endif
-all: ccdv $(PCCARDCTL) $(PCMCIA_CHECK_BROKEN_CIS) $(PCMCIA_SOCKET_STARTUP_BUILD)
+
+all: ccdv $(PCCARDCTL) $(PCMCIA_CHECK_BROKEN_CIS) $(PCMCIA_SOCKET_STARTUP_BUILD) udevrules
ccdv:
@echo "Building ccdv"
@@ -199,7 +207,6 @@
mv y.tab.c $*.c
mv y.tab.h $*.h
-
$(PCCARDCTL): $(LIBC) src/$(PCCARDCTL).o $(OBJS) $(HEADERS)
$(QUIET) $(LD) $(LDFLAGS) -o $@ $(CRT0) src/$(PCCARDCTL).o $(LIB_OBJS) $(ARCH_LIB_OBJS)
$(QUIET) $(STRIPCMD) $@
@@ -214,7 +221,7 @@
yacc_config.o lex_config.o: %.o: %.c
$(CC) -c -MD -O -pipe $(CPPFLAGS) $<
-
+
debugtools: ccdv $(CBDUMP) $(CISDUMP)
$(CBDUMP): $(LIBC) debug/cbdump.o
@@ -225,12 +232,16 @@
$(QUIET) $(LD) $(LDFLAGS) -o $@ $(CRT0) debug/$(CISDUMP).o src/read-cis.o debug/parse_cis.o $(LIB_OBJS) $(ARCH_LIB_OBJS)
$(QUIET) $(STRIPCMD) $@
+udevrules:
+ cat $(UDEV_RULES) > $(UDEV_RULES_FILE)
+
clean:
-find . \( -not -type d \) -and \( -name '*~' -o -name '*.[oas]' \) -type f -print \
| xargs rm -f
-rm -f $(PCCARDCTL) $(PCMCIA_CHECK_BROKEN_CIS) $(PCMCIA_SOCKET_STARTUP)
-rm -f $(CBDUMP) $(CISDUMP)
-rm -f src/yacc_config.c src/yacc_config.d src/lex_config.c src/lex_config.d src/yacc_config.h
+ -rm -f udev/60-pcmcia.rules
-rm -f build/ccdv
install-hotplug:
@@ -239,19 +250,19 @@
$(INSTALL_PROGRAM) -D hotplug/pcmcia.rc $(DESTDIR)$(hotplugdir)/pcmcia.rc
uninstall-hotplug:
- - rm -f $(hotplugdir)/pcmcia.agent $(hotplugdir)/pcmcia.rc
+ - rm -f $(DESTDIR)$(hotplugdir)/pcmcia.agent $(DESTDIR)$(hotplugdir)/pcmcia.rc
install-socket-hotplug:
$(INSTALL_PROGRAM) -D hotplug/pcmcia_socket.agent $(DESTDIR)$(hotplugdir)/pcmcia_socket.agent
$(INSTALL_PROGRAM) -D hotplug/pcmcia_socket.rc $(DESTDIR)$(hotplugdir)/pcmcia_socket.rc
uninstall-socket-hotplug:
- - rm -f $(hotplugdir)/pcmcia_socket.agent $(hotplugdir)/pcmcia_socket.rc
+ - rm -f $(DESTDIR)$(hotplugdir)/pcmcia_socket.agent $(DESTDIR)$(hotplugdir)/pcmcia_socket.rc
install-socket-tools:
$(INSTALL_PROGRAM) -D $(PCMCIA_SOCKET_STARTUP) $(DESTDIR)$(sbindir)/$(PCMCIA_SOCKET_STARTUP)
uninstall-socket-tools:
- - rm -f $(sbindir)/$(PCMCIA_SOCKET_STARTUP)
+ - rm -f $(DESTDIR)$(sbindir)/$(PCMCIA_SOCKET_STARTUP)
install-tools:
$(INSTALL) -d $(DESTDIR)$(sbindir)
@@ -260,22 +271,29 @@
uninstall-tools:
- - rm -f $(sbindir)/$(PCCARDCTL)
- - rm -f $(sbindir)/$(PCMCIA_CHECK_BROKEN_CIS)
+ - rm -f $(DESTDIR)$(sbindir)/$(PCCARDCTL)
+ - rm -f $(DESTDIR)$(sbindir)/$(PCMCIA_CHECK_BROKEN_CIS)
install-config:
$(INSTALL) -d $(DESTDIR)$(pcmciaconfdir)
$(INSTALL_DATA) -D config/config.opts $(DESTDIR)$(pcmciaconfdir)/config.opts
uninstall-config:
-# - rm -f $(pcmciaconfdir)/config.opts
+# - rm -f $(DESTDIR)$(pcmciaconfdir)/config.opts
install-udev:
- $(INSTALL_DATA) -D $(UDEV_RULES) $(DESTDIR)$(udevrulesdir)/60-pcmcia.rules
-
+ $(INSTALL_DATA) -D $(UDEV_RULES_FILE) $(DESTDIR)$(udevrulesdir)/60-pcmcia.rules
+
uninstall-udev:
- - rm -f $(udevrulesdir)/60-pcmcia.rules
+ - rm -f $(DESTDIR)$(udevrulesdir)/60-pcmcia.rules
-install: install-tools $(INSTALL_TARGETS)
+install-man:
+ $(INSTALL_DATA) -D man/man8/pccardctl.8 $(DESTDIR)$(mandir)/man8/pccardctl.8
-uninstall: uninstall-tools $(UNINSTALL_TARGETS)
+uninstall-man:
+ - rm $(DESTDIR)$(mandir)/man8/pccardctl.8
+
+
+install: install-tools install-man $(INSTALL_TARGETS)
+
+uninstall: uninstall-tools uninstall-man $(UNINSTALL_TARGETS)
diff --git a/debug/dump_cis.c b/debug/dump_cis.c
index c5cdc51..05ad314 100644
--- a/debug/dump_cis.c
+++ b/debug/dump_cis.c
@@ -942,15 +942,13 @@
print_tuple(&tuple);
ret = pccard_parse_tuple(&tuple, &parse);
- if (ret) {
+ if (ret)
printf("invalid tuple\n");
- continue;
+ else {
+ print_parse(&tuple, &parse);
+ printf("\n");
}
- print_parse(&tuple, &parse);
-
- printf("\n");
-
ret = pcmcia_get_next_tuple(BIND_FN_ALL, &tuple);
if (ret)
break;
diff --git a/doc/cardmgr-to-pcmciautils.txt b/doc/cardmgr-to-pcmciautils.txt
new file mode 100644
index 0000000..8ff970a
--- /dev/null
+++ b/doc/cardmgr-to-pcmciautils.txt
@@ -0,0 +1,158 @@
+PCMCIA: cardmgr to pcmciautils HowTo
+====================================
+
+written by Daniel Ritz <daniel.ritz@gmx.ch>
+
+This howto describes in short how to change your system to work with the new
+pcmciautils instead of the old cardmgr.
+
+Prerequisites
+-------------
+
+- kernel 2.6.13-rc1 and newer
+- pcmciautils, preferably 010 or newer
+- you read the mini-howto.txt
+
+
+Introduction
+------------
+
+Kernels since 2.6.13-rc1 do not require the cardmgr daemon anymore. In those
+newer kernel the pcmcia bus acts almost as any other bus with full /sbin/hotplug
+support. Old style cardmgr setups should still work if the kernel is configured
+correctly. But be aware that the ioctl for PCMCIA will be removed in the near
+future.
+
+The change to be /sbin/hotplug capable means that the normal /etc/init.d/pcmcia
+script is not required any more and in fact only hurts as it starts cardmgr. To
+use the new pcmciautils it is a requirement that cardmgr is not started.
+
+
+The STARTUP option
+------------------
+
+When reading the pcmciautils howto you see that STARTUP option mentioned. What
+does it do again? It controls the setup of a dynamic resource database needed
+for some sockets. The resource database tells the PCMCIA layer what IO port and
+what IO memory are usable for PCMCIA cards. In case the database is dynamic, it
+needs to be setup before any cards can be used. The /etc/pcmcia/config.opts
+file contains the neccessary configuration.
+In old setups it is cardmgr that parses that file and tells the kernel what
+resources to use. In case of pcmciautils it's the pcmcia-socket-startup tool
+which is built and installed when the STARTUP option is set. The tool itself
+is run from the hotplug script pcmcia_socket.agent whenever a new socket is
+registered with the pcmcia module. This means that pcmcia-socket-startup does
+not need to be run manually.
+
+
+Compiling and installing pcmciautils
+------------------------------------
+
+You should have read the pcmciautils howto already. Again in short:
+- make a backup copy of your /etc/pcmcia/config.opts
+- determine whether you need UDEV set or not. if unsure: don't set it
+- determine whether you need STARTUP set or not
+- make
+- make install (as root)
+- put your original /etc/pcmcia/config.opts back to where it was
+
+
+Stop cardmgr from starting
+--------------------------
+
+We don't want cardmgr. For setups with a PCI PCMCIA/Cardbus controller the
+easiest thing to do is to make sure /etc/init.d/pcmcia does nothing.
+Either make sure it does not start up, or (if you want to use older kernels
+as well) add the following snippet to the beginning of /etc/init.d/pcmcia
+(after the #!/bin/sh line of course):
+
+
+ KVERREL=`uname -r`
+ KVER=${KVERREL%-*}
+ KVER_MAJOR=${KVER%.*}
+ KVER_MINOR=${KVER##*.}
+
+ if [ "$KVER_MAJOR" == "2.6" ]; then
+ # kernel 2.6.13-rc1 and higher have pcmcia via /sbin/hotplug
+ if [ $KVER_MINOR -ge 13 ]; then
+ # uncomment the following line if the driver for your
+ # controller is not auto-loaded. or if you want to be
+ # able to say /etc/init.d/pcmcia stop
+ #/etc/init.d/pcmcia-new $1
+ exit 0
+ fi
+ fi
+
+this will make sure the init script does nothing for newer kernel and works
+normally on older kernels.
+
+if you have a socket controller where the module cannot be loaded automatically
+by hotplug, uncomment the line in the above code snipped and make sure you have
+the /etc/init.d/pcmcia-new script around which should look like this:
+
+ #!/bin/sh
+
+ # set this to the driver to use, one of:
+ # yenta_socket, i82365, i82092, pd6792, tcic, etc.
+ DRIVER=yenta_socket
+ DRIVER_OPTS=
+
+ case "$1" in
+ start)
+ modprobe $DRIVER $DRIVER_OPTS > /dev/null 2>&1
+ modprobe pcmcia > /dev/null 2>&1 # just in case it's not auto-loaded
+ ;;
+
+ stop)
+ pccardctl eject
+ MODULES=`lsmod | grep "pcmcia " | awk '{print $4}' | tr , ' '`
+ for i in $MODULES ; do
+ rmmod $i > /dev/null 2>&1
+ done
+ rmmod pcmcia > /dev/null 2>&1
+ rmmod $DRIVER > /dev/null 2>&1
+ rmmod rsrc_nonstatic > /dev/null 2>&1
+ rmmod pcmcia_core > /dev/null 2>&1
+ ;;
+ esac
+
+( you can find this script in doc/pcmcia-new.sh )
+
+make sure you set the DRIVER (and maybe DRIVER_OPTS) variable to the right
+socket driver. If yenta_socket doesn't work look up the config file from your
+distro. look at the PCIC variable and PCIC_OPTS.
+ - Red Hat (and Conectiva, Mandriva, etc.) have it in /etc/sysconfig/pcmcia
+ - Debian (and probably Ubuntu) has it in /etc/pcmcia.conf
+ - Others: sorry, don't know
+If you don't know where to find it, you should look at the init script. Maybe it's
+even in there directly.
+
+The file system right for the script should be right as well:
+ chmod 755 /etc/init.d/pcmcia-new
+
+
+Auto-load pcmcia module
+-----------------------
+
+To have support for 16-bit cards you need the pcmcia module loaded. Since the
+other modules do not depend on this one it is not loaded automatically. To
+make sure the pcmcia module is loaded right after pcmcia_core, add the following
+line to /etc/modprobe.conf
+ install pcmcia_core /sbin/modprobe --ignore-install pcmcia_core; /sbin/modprobe pcmcia
+
+
+Hotplug
+-------
+
+Make sure hotplug works correctly. Most distros have a /etc/init.d/hotplug script
+which should be loaded at boot time. For most laptops the the socket driver is
+yenta_socket. If it is not loaded after boot it means that hotplug is not working
+correctly. Reasons for the driver not loaded include the /etc/hotplub/blacklist
+file or some other list that prevents the driver being loaded.
+eg. Conectiva Linux 10 does not load PCI modules per default, but only modules
+that are listed in /etc/hotplug/pci.whitelist.
+
+If your socket driver can be loaded via hotplug (PCI socket or detected by PnP or
+whatever) and everything is ok, yenta_socket (or another socket driver), pcmcia,
+pcmcia_core and rsrc_nonstatic (not for all socket drivers) should be loaded after
+booting. Modules for inserted pcmcia cards should be loaded as well.
diff --git a/doc/mini-howto.txt b/doc/mini-howto.txt
new file mode 100644
index 0000000..78d8d2b
--- /dev/null
+++ b/doc/mini-howto.txt
@@ -0,0 +1,205 @@
+Linux Kernel 2.6 PCMCIA - mini-HOWTO
+====================================
+
+ Last update: 08 November 2005.
+
+Table of contents:
+
+ * [1]Introduction
+ * [2]Setup
+ + [3]Determine the socket driver to use
+ + [4]Resource database
+ + [5]Dependencies
+ + [6]Install pcmciautils
+ + [7]The difficult cases: CIS overrides
+ * [8]Usage
+
+
+1. Introduction
+---------------
+
+ So, you'd like to get PCMCIA working on Linux kernel 2.6.13-rc1 or
+ later? This short document intends to help you doing so; for
+ additional questions please search the web, especially the help forums
+ of your distribution, or ask on the [9]Linux-PCMCIA mailinglist. Also,
+ the help texts in the Linux kernel configuration for the PCMCIA
+ subsystem might point you into the correct direction -- so please read
+ them.
+
+
+2. Setup
+--------
+
+ Fortunately, several distributions have already included up-to-date
+ pcmciautils and PCMCIA support into their products. Therefore, you may
+ be able to rely on your distribution to set up the system correctly.
+
+ 2.1. Determine the socket driver to use
+ ---------------------------------------
+
+ At first, you need to determine which PCMCIA socket driver you need to
+ use. On most modern notebooks, this is yenta-socket. Else, check the
+ kernel configuration menu for the appropriate driver.
+
+ Then, make sure it is either built into the kernel, or it is loaded
+ during bootup. Previously, this was oftern handled by the pcmcia-cs
+ startup script. As you won't use this package any longer, you can't
+ rely on it any more to load the socket driver!
+
+ 2.2. Resource database?
+ -----------------------
+
+ Then, you need to find out whether you need a resource database. This
+ contains the ioport and iomem region which PCMCIA cards may use.
+ Fortunately, less and less systems require setting such a database up.
+
+ 2.2.1. The lucky ones
+ ---------------------
+
+ Sockets which are governed by these drivers do not need a resource
+ database:
+ * hd64465
+ * Au1x00
+ * SA1100
+ * SA1111
+ * PXA2xx
+ * M32R_PCC
+ * M32R_CFC
+ * VRC4171
+ * VRC4173
+
+ 2.2.2. The unlucky ones
+ -----------------------
+
+ These sockets always need a resource database:
+ * i82365
+ * tcic
+
+ 2.2.3. The complicated ones
+ ---------------------------
+
+ For the remaining socket drivers,
+ * yenta-socket
+ * pd6729
+ * i82092
+
+ you need to investigate a bit further. However, if you think that this
+ is too complicated for you, just try it out without a resource
+ database. If it doesn't work, you can still add the resource database
+ later on.
+
+ First you need to know if the system is of the x86 or x86_64
+ architecture. If you don't know what this means, check wheter you have
+ an apple printed on the backside of your notebook -- then the answer
+ is no, else it is most probably yes.
+
+
+ 2.2.3.1. x86 and x86_64 architectures
+ -------------------------------------
+
+ Now you need to determine the PCI bus the device is on: search for the
+ device using the lspci command. Then you'll see a number like
+ 0000:02:03.0 in front of the device. If the second "block" (which is
+ 02 in this example), is zero, you need a resource database, if it is
+ not zero, you do not need it.
+
+ 2.2.3.2. other architectures
+ ----------------------------
+
+ On other architectures (including ppc and ppc64) you do not need a
+ resource database for such sockets.
+
+ 2.3. Dependencies
+ -----------------
+
+ To use any of the PCMCIAutils tools, you need sysfsutils 1.3.0 or
+ newer. However, if you do not need a resource database, you do not run
+ a modular kernel and you are lucky, you might not need any userspace
+ tools at all.
+
+ If you use a modular kernel, you also need module-init-tools 3.2-pre4
+ or later.
+
+ In addition, you either need the basic hotplug scripts installed, or a
+ working udev environment.
+
+
+ 2.4. Installing pcmciautils
+ ---------------------------
+
+ Get the latest revision of pcmciautils. Then, you need to configure
+ it. Therefore, open the file "Makefile" with an editor of your choice,
+ and modify it accordingly:
+
+ If you do not need a resource database, modify the line which starts
+ with STARTUP to read
+
+ STARTUP = false
+
+ If you want to use udev instead of hotplug to manage the activation of
+ pcmciautils, modify the line which starts with UDEV to read
+
+ UDEV = true
+
+ Issue the famous make command next. Then, if you already had PCMCIA
+ running well, make a backup copy of /etc/pcmcia/config.opts. Then
+ issue make install.
+
+ If you need a resource database, you should use the version of
+ /etc/pcmcia/config.opts you had up and running before (so restore the
+ backup copy you just made). Else you can try to use the version which
+ is distributed within pcmciautils and installed by default; however
+ you might need to modify it for the specific needs of the
+ architecture, socket and system you are using.
+
+
+ 2.5. The difficult cases: CIS overrides
+ ---------------------------------------
+
+ If the PCMCIA card you use needs a "CIS" override (sort of a
+ "firmware" override) to work correctly, get the proper file out of
+ [10]pcmcia-cs or from other sources, rename it from ".dat" to ".cis"
+ and store it into /lib/firmware/.
+
+
+3. Usage
+--------
+
+ 3.1. devices
+ ------------
+
+ Plug the cards in, watch them appear in /sys/bus/pcmcia/devices/, use
+ them. Don't forget to unmount block devices before ejecting a PCMCIA
+ card!
+
+ If you relied on the startup scripts in /etc/pcmcia/*, you should
+ switch to the generic hotplug scripts in one of its variants (hotplug,
+ hotplug-ng, and so on) or to udev rules. Most distributions already
+ include this capability; if not, you might need to adapt them slightly
+ depending on your distribution and configuration. Also check the udev
+ documentation, for example if you want to name interfaces differently
+ from the kernel's default setting.
+
+ 3.2. pccardctl (replaces cardctl)
+ ---------------------------------
+
+ And what about the command cardctl you might be used to? It is
+ replaced by several new ways to achieve the same aims; if you want to
+ update pccardctl to handle them all, please send patches to the
+ [11]Linux-PCMCIA mailinglist.
+
+ cardctl info pccardctl info
+ cardctl ident pccardctl ident
+ cardctl insert pccardctl insert
+ cardctl eject pccardctl eject
+ cardctl suspend pccardctl suspend [>=2.6.15]
+ cardctl resume pccardctl resume [>=2.6.15]
+ cardctl suspend echo -n "3" > /sys/class/pcmcia_socket/pcmcia_socket*/d
+ evice/power/state
+ cardctl resume echo -n "0" > /sys/class/pcmcia_socket/pcmcia_socket*/d
+ evice/power/state
+ cardctl status cat /sys/class/pcmcia/pcmcia_socket/*/*
+ cardctl config cat /sys/bus/pcmcia/devices/*/*
+ cardctl scheme -- not implemented, as incompatible to cardbus. Use
+ other utilities (udev, nameif, ...) to achieve
+ the same aims --
diff --git a/doc/pcmcia-new.sh b/doc/pcmcia-new.sh
new file mode 100644
index 0000000..5195989
--- /dev/null
+++ b/doc/pcmcia-new.sh
@@ -0,0 +1,36 @@
+#!/bin/sh
+#
+# this is an examle of the /etc/init.d/pcmcia-new init script as described in
+# cardmgr-to-pcmciautils.txt
+#
+
+#
+# set this to the driver to use, one of:
+# yenta_socket, i82365, i82092, pd6792, tcic, etc.
+#
+DRIVER=yenta_socket
+DRIVER_OPTS=
+
+# in case modprobe and rmmod are not in PATH: set MODUTILS_PATH to the right
+# path an uncomment the following two lines:
+#MODUTILS_PATH=
+#export PATH=$MODUTILS_PATH:$PATH
+
+case "$1" in
+ start)
+ modprobe $DRIVER $DRIVER_OPTS > /dev/null 2>&1
+ modprobe pcmcia > /dev/null 2>&1 # just in case it's not auto-loaded
+ ;;
+
+ stop)
+ pccardctl eject
+ MODULES=`lsmod | grep "pcmcia " | awk '{print $4}' | tr , ' '`
+ for i in $MODULES ; do
+ rmmod $i > /dev/null 2>&1
+ done
+ rmmod pcmcia > /dev/null 2>&1
+ rmmod $DRIVER > /dev/null 2>&1
+ rmmod rsrc_nonstatic > /dev/null 2>&1
+ rmmod pcmcia_core > /dev/null 2>&1
+ ;;
+esac
diff --git a/hotplug/pcmcia.rc b/hotplug/pcmcia.rc
index 19f15fe..6b240ab 100755
--- a/hotplug/pcmcia.rc
+++ b/hotplug/pcmcia.rc
@@ -22,7 +22,7 @@
continue;
fi;
MODALIAS=$(cat $PCMCIA_DEVICE/modalias)
- debug_mesg $MODALIAS $PCMICA_DEVICE
+ debug_mesg $MODALIAS $PCMCIA_DEVICE
if [ -z $MODALIAS ]; then
continue;
fi;
diff --git a/man/man8/pccardctl.8 b/man/man8/pccardctl.8
new file mode 100644
index 0000000..6c1ff4a
--- /dev/null
+++ b/man/man8/pccardctl.8
@@ -0,0 +1,66 @@
+.\" Copyright (C) 1998 David A. Hinds -- dahinds@users.sourceforge.net
+.\" Copyright (C) 2005 by Daniel Ritz <daniel.ritz@gmx.ch>
+.\"
+.TH PCCARDCTL 8 "2005/10/22" "pcmciautils"
+.SH NAME
+pccardctl \- PCMCIA card control utility
+
+.SH SYNOPSIS
+\fBpccardctl\fR [\fB-V\fR] \fIcommand\fR [\fIsocket\fR]
+.br
+
+.SH DESCRIPTION
+\fBpccardctl\fR is used to monitor and control the state of PCMCIA
+sockets. If a socket number is specified, the command will be applied
+to just one socket; otherwise, all sockets will be affected.
+.PP
+If \fBpccardctl\fR is executed by root, all commands are available. If
+it is executed by an unpriviledged user, only the informational
+commands are accessible.
+.PP
+
+.SH COMMANDS
+.TP \w'abcd'u
+.B status
+Display the current socket status flags. \-\-not yet implemented
+.TP
+.B config
+Display the socket configuration, including power settings, interrupt
+and I/O window settings, and configuration registers.
+\-\-not yet implemented
+.TP
+.B ident
+Display card identification information, including product
+identification strings, manufacturer ID codes, and function ID codes.
+Not yet implemented for cardbus cards. Use lspci instead.
+.TP
+.B info
+Much like the \fBident\fR command, but its output is formatted as a
+series of Bourne-stype shell variable definitions for use in scripts.
+Not yet implemented for cardbus cards.
+.TP
+.B suspend
+Shut down and then disable power for a socket.
+.TP
+.B resume
+Restore power to a socket, and re-configure for use.
+.TP
+.TP
+.B eject
+Notify all client drivers that this card will be ejected, then cut
+power to the socket.
+.TP
+.B insert
+Notify all client drivers that this card has just been inserted.
+
+.SH OPTIONS
+.TP
+.B \-V
+Show version information and exit.
+
+.SH AUTHOR
+Daniel Ritz \- daniel.ritz@gmx.ch
+.br
+based upon the original cardctl man page by
+.br
+David Hinds \- dahinds@users.sourceforge.net
diff --git a/src/pccardctl.c b/src/pccardctl.c
index 5bef5d2..6f4e06a 100644
--- a/src/pccardctl.c
+++ b/src/pccardctl.c
@@ -41,7 +41,7 @@
if (!attr)
return -ENODEV;
- ret = sysfs_write_attribute(attr, power ? "3" : "0", 1);
+ ret = sysfs_write_attribute(attr, power ? "2" : "0", 1);
sysfs_close_attribute(attr);
diff --git a/udev/60-pcmcia.rules b/udev/60-pcmcia.rules
deleted file mode 100644
index 79909ed..0000000
--- a/udev/60-pcmcia.rules
+++ /dev/null
@@ -1,27 +0,0 @@
-# PCMCIA devices:
-#
-# modprobe $modalias loads all possibly appropriate modules
-ACTION=="add", SUBSYSTEM=="pcmcia", MODALIAS=="*", \
- RUN+="/sbin/modprobe $modalias"
-
-# Very few CIS firmware entries (which we use for matching)
-# are so broken that we need to read out random bytes of it
-# instead of the manufactor, card or product ID. Then the
-# matching is done in userspace.
-ACTION=="add", SUBSYSTEM=="pcmcia", MODALIAS=="*", \
- RUN+="/sbin/pcmcia-check-broken-cis"
-
-# However, the "weak" matching by func_id is only allowed _after_ modprobe
-# returns, so that "strong" matches have a higher priority.
-ACTION=="add", SUBSYSTEM=="pcmcia", MODALIAS=="*", \
- RUN+="/bin/sh -c 'echo 1 > /sys/$DEVPATH/allow_func_id_match'"
-
-
-# PCMCIA sockets:
-#
-# modprobe the pcmcia bus module so that 16-bit PCMCIA devices work
-SUBSYSTEM="pcmcia_socket" RUN+="/sbin/modprobe pcmcia"
-
-# if this is a PCMCIA socket which needs a resource database,
-# pcmcia-socket-startup sets it up
-SUBSYSTEM="pcmcia_socket" RUN+="/sbin/pcmcia-socket-startup"
diff --git a/udev/60-pcmcia.rules.static b/udev/60-pcmcia.rules.static
deleted file mode 100644
index 23ef3e3..0000000
--- a/udev/60-pcmcia.rules.static
+++ /dev/null
@@ -1,27 +0,0 @@
-# PCMCIA devices:
-#
-# modprobe $modalias loads all possibly appropriate modules
-ACTION=="add", SUBSYSTEM=="pcmcia", MODALIAS=="*", \
- RUN+="/sbin/modprobe $modalias"
-
-# Very few CIS firmware entries (which we use for matching)
-# are so broken that we need to read out random bytes of it
-# instead of the manufactor, card or product ID. Then the
-# matching is done in userspace.
-ACTION=="add", SUBSYSTEM=="pcmcia", MODALIAS=="*", \
- RUN+="/sbin/pcmcia-check-broken-cis"
-
-# However, the "weak" matching by func_id is only allowed _after_ modprobe
-# returns, so that "strong" matches have a higher priority.
-ACTION=="add", SUBSYSTEM=="pcmcia", MODALIAS=="*", \
- RUN+="/bin/sh -c 'echo 1 > /sys/$DEVPATH/allow_func_id_match'"
-
-
-# PCMCIA sockets:
-#
-# modprobe the pcmcia bus module so that 16-bit PCMCIA devices work
-SUBSYSTEM="pcmcia_socket" RUN+="/sbin/modprobe pcmcia"
-
-# if this is a PCMCIA socket which needs a resource database,
-# pcmcia-socket-startup sets it up
-#SUBSYSTEM="pcmcia_socket" RUN+="/sbin/pcmcia-socket-startup"
diff --git a/udev/rules-base b/udev/rules-base
new file mode 100644
index 0000000..c6d14de
--- /dev/null
+++ b/udev/rules-base
@@ -0,0 +1,18 @@
+
+# Very few CIS firmware entries (which we use for matching)
+# are so broken that we need to read out random bytes of it
+# instead of the manufactor, card or product ID. Then the
+# matching is done in userspace.
+ACTION=="add", SUBSYSTEM=="pcmcia", MODALIAS=="?*", \
+ RUN+="/sbin/pcmcia-check-broken-cis"
+
+# However, the "weak" matching by func_id is only allowed _after_ modprobe
+# returns, so that "strong" matches have a higher priority.
+ACTION=="add", SUBSYSTEM=="pcmcia", MODALIAS=="?*", \
+ RUN+="/bin/sh -c 'echo 1 > /sys/$devpath/allow_func_id_match'"
+
+# PCMCIA sockets:
+#
+# modprobe the pcmcia bus module so that 16-bit PCMCIA devices work
+ACTION=="add", SUBSYSTEM=="pcmcia_socket", \
+ RUN+="/sbin/modprobe pcmcia"
diff --git a/udev/rules-modprobe b/udev/rules-modprobe
new file mode 100644
index 0000000..ea1f44a
--- /dev/null
+++ b/udev/rules-modprobe
@@ -0,0 +1,3 @@
+# modprobe $modalias loads all possibly appropriate modules
+ACTION=="add", SUBSYSTEM=="pcmcia", MODALIAS=="?*", \
+ RUN+="/sbin/modprobe $modalias"
diff --git a/udev/rules-nonstaticsocket b/udev/rules-nonstaticsocket
new file mode 100644
index 0000000..23b599e
--- /dev/null
+++ b/udev/rules-nonstaticsocket
@@ -0,0 +1,5 @@
+
+# if this is a PCMCIA socket which needs a resource database,
+# pcmcia-socket-startup sets it up
+ACTION=="add", SUBSYSTEM=="pcmcia_socket", \
+ RUN+="/sbin/pcmcia-socket-startup"
diff --git a/udev/rules-start b/udev/rules-start
new file mode 100644
index 0000000..790902b
--- /dev/null
+++ b/udev/rules-start
@@ -0,0 +1,2 @@
+# PCMCIA devices:
+#