PCMCIA(5)

NAME
/etc/pcmcia/config - PCMCIA card configuration database

DESCRIPTION
The PCMCIA card configuration file is read by cardmgr(8) at startup time. It defines what resources are available for use by Card Services, describes how to load and initialize device drivers, and describes specific PCMCIA cards.

Resource descriptions
There are three kinds of resource entries: "include", "exclude", and "reserve". "Including" a resource enables Card Services to allocate that resource for client drivers. Part of a resource that is under Card Services control can be "excluded" if a specific device in the system uses that resource. And, a resource can be "reserved", so that it will only be assigned to a client if that client specifically asks for that resource, or no other suitable resources are available.

There are three resource types: ports, memory, and irq's. By default, Card Services assumes that it can use any interrupt that is not bound by another device driver. However, it makes no assumptions about port and address ranges, because many Linux drivers do not register their resource usage. So, port and memory ranges must be explicitly made available for use by PCMCIA devices.

So, here is a portion of a config file:

    include port 0x300-0x3ff, memory 0xd0000-0xdffff
    reserve irq 3
    exclude irq 4, port 0x3f8-0x3ff

This says that Card Services can reserve ports in the range 0x300 to 0x3ff, and memory in the range 0xd0000 to 0xdffff. It should not use irq 4 or ports 0x3f8-0x3ff (even if they seem to be available). And irq 3 should only be allocated if a client specifically asks for it.

Card Services will never reserve resources actually reserved by another device driver. The "include/exclude/reserve" mechanism just provides a way of controlling what resources it will try to use, to accomodate devices that are not registered with the Linux resource manager. In particular, the serial port driver does not register its resources, so if you have built-in serial ports, it is necessary to put explicit "exclude" directives in your config file to prevent Card Services from allocating these resources for PCMCIA serial devices.

Device driver descriptions
All Card Services client drivers are identified by a 16-character tag. "Device" entries in the config file describe client drivers. The only required field is the device tag. Additional fields can specify kernel modules that need to be loaded to make the device available, and system commands to be executed to enable and disable instances of a device. When an instance of a driver is assigned to a socket, it gives cardmgr a device name by which this device will be known by the system (for example, eth0 for a net device, or ttyS1 for a modem). This name will be substituted for "%d%" embedded in the start and stop commands. For example:

    device "de650_cs"
      module "net/8390" opts "ei_debug=4", "de650_cs"
      start "/etc/pcmcia/network %d% start"
      stop  "/etc/pcmcia/network %d% stop"

This says that the "de650_cs" device requires two loadable modules. The first one is located in the "net" module subdirectory and will be loaded with a specific parameter setting. The second module should be in the "pcmcia" module subdirectory. When an appropriate card is inserted and initialized, the "start" command will be executed, after substituting the ethernet interface name for "%d%".

The socket number and major and minor device numbers can also be used to construct start and stop commands. The '%m%' specifier will be replaced by the major number, and the '%n%' specifier will be set to the minor number. For example:

    device "pcmem_cs"
      module "pcmem_cs"
      start "mknod /dev/%d% c %m% %n%"
      stop  "rm /dev/%d%"

In this case, a device file with the appropriate major and minor device numbers will be created on the fly when a card is inserted.

The '%s%' specifier is replaced by the socket number, and '%c%' is replaced by the card's full name. These can be used to construct scripts for distinguishing between several cards of the same type.

Card descriptions
Card declarations map PCMCIA cards to their client drivers. A card declaration consists of a descriptive name, a method for identifying the card when it is inserted, and driver bindings. There are four identification methods: the "version" method matches a card using its VERSION_1 id strings, the "tuple" method matches a card using any string embedded in any arbitrary CIS tuple, the "function" method matches a card using its function ID, and the "anonymous" method matches any card that does not have a CIS. This last method is only intended to be used for old-style Type I memory cards. For example:

    card "Linksys Ethernet Card"
      tuple 0x40, 0x0009, "E-CARD PC Ethernet Card"
      bind "de650_cs"

This card is identified by a string at offset 0x0009 in tuple 0x40, and will be bound to the "de650_cs" driver (which must be already declared in a "driver" declaration).

    card "D-Link DE-650 Ethernet Card"
      version "D-Link", "DE-650", "*", "*"
      bind "de650_cs"

This card will be identified using its VERSION_1 tuple, and will also be bound to the de650_cs driver.

    card "Serial port device"
      function serial_port
      bind "serial_cs"

This binds the serial_cs driver to any card with a CIS function ID of 0x02, which corresponds to a serial port card. The function ID can either be a number, or one of the following predefined functions: "memory_card", "serial_port", "parallel_port", "fixed_disk", "video_adapter", "network_adapter", and "aims_card".

BUGS
"Reserving" resources has not actually been implemented in a useful way for this version of Card Services.

AUTHOR
David Hinds - dhinds@allegro.stanford.edu

SEE ALSO
cardmgr(8).