PCMCIA HOWTO: laptop expansion, Thunderbolt and power management today

Updated November 2026

PCMCIA cards were how laptops gained network ports, modems and storage in the 1990s. That job has passed to USB-C, Thunderbolt and USB4 docks, and the hard problems have moved with it: authorizing devices that get direct memory access, and making the battery last. This page covers the old slots briefly and then the parts you deal with today.

The classic PCMCIA-HOWTO (last revised in 2003), about the pcmcia-cs package and cardmgr, is kept by the Linux Documentation Project at tldp.org. Nothing in it is needed on a current system: card services have been part of the kernel for many years and udev handles card insertion like any other hotplug event.

A short history of laptop slots

Laptop expansion interfaces
InterfaceBus underneathLinux today
PC Card (16-bit PCMCIA)ISA-likeStill in the kernel (CONFIG_PCMCIA); fewer card drivers each year
CardBus (32-bit PC Card)PCIStill in the kernel; cards appear as PCI devices
ExpressCardPCI Express or USB 2.0No special subsystem: cards are ordinary PCIe or USB devices
Thunderbolt 3/4, USB4PCIe, DisplayPort and USB tunneled over USB-CKernel thunderbolt driver plus the bolt daemon

If you still have a PC Card slot

The kernel's PCCARD subsystem handles both 16-bit PCMCIA and 32-bit CardBus cards. CardBus cards show up in lspci; 16-bit cards are listed by the tools in pcmciautils:

sudo apt install pcmciautils       # Debian, Ubuntu
lspcmcia -v                        # same as pccardctl ls
pccardctl ident                    # card identification strings
pccardctl status
sudo pccardctl eject               # tell drivers, then cut power to the socket
sudo pccardctl insert

When a card does not work, check sudo dmesg right after inserting it: a card the kernel cannot match is identified but no driver binds. Some old 16-bit card drivers have been removed from recent kernels, so check with modinfo before you spend time on one. A USB adapter is usually the quicker fix.

ExpressCard

An ExpressCard module is a PCI Express or USB device in a different shape, so the normal drivers apply. Hot insertion of a PCIe ExpressCard is handled by the kernel's PCIe hotplug support; if a card only appears after a reboot, look for pciehp messages in dmesg and check the firmware setup for an option that enables the slot.

Thunderbolt and USB4

Thunderbolt 3 and 4, and USB4 (whose specification is based on the Thunderbolt 3 protocol), carry PCI Express over a USB-C cable. A PCIe device can read and write memory by DMA, so a malicious device plugged into the port could, in principle, read memory. Linux handles this in two ways:

cat /sys/bus/thunderbolt/devices/domain0/security
cat /sys/bus/thunderbolt/devices/domain0/iommu_dma_protection

With level user or secure, a new device arrives with authorized set to 0 and its PCIe functions stay invisible until someone approves it. The bolt daemon and its command-line tool boltctl do this for you; GNOME and KDE show the same as a settings panel.

boltctl list                       # connected and remembered devices
boltctl domains                    # controllers; "+iommu" means DMA protection
boltctl info <uuid>
sudo boltctl enroll --policy auto <uuid>    # authorize now and every time
sudo boltctl authorize <uuid>               # this time only
sudo boltctl forget <uuid>
boltctl monitor                    # watch devices come and go

Without bolt, the kernel interface is a sysfs write: echo 1 | sudo tee /sys/bus/thunderbolt/devices/0-1/authorized.

Docks that half work

If the dock's USB ports and display work but its network port does not, the PCIe part is probably not authorized: run boltctl list. Firmware updates for docks and for the laptop's own Thunderbolt controller come through fwupd and the LVFS, where the vendor publishes them:

fwupdmgr refresh
fwupdmgr get-updates
fwupdmgr update

The kernel documentation warns that a wrong controller image can make the port unusable, so prefer fwupd over manual flashing.

Power management on laptops

The power-mode switch in GNOME and KDE talks to power-profiles-daemon, or to a program offering the same interface: since Fedora 41, Fedora Workstation and the KDE edition use tuned with its tuned-ppd add-on instead. power-profiles-daemon offers three profiles (power-saver, balanced, performance) and changes platform and CPU settings to match. On the command line (powerprofilesctl comes with the power-profiles-daemon package, so on Fedora with tuned-ppd use the desktop switch or tuned-adm):

powerprofilesctl list
powerprofilesctl get
powerprofilesctl set power-saver
powerprofilesctl launch -p performance make -j8   # hold a profile while a command runs

TLP takes a wider approach: it tunes disks, USB autosuspend, PCIe power states, radios and the CPU, switching settings between AC and battery. As of November 2026 the current release is TLP 1.10.2 (July 2026), with 1.11 in beta; distribution packages lag behind (Debian 13 has 1.8.0, Ubuntu 24.04 1.6.1, Ubuntu 26.04 1.8.0, Fedora 44 and 45 1.10). Since 1.9 TLP also has three profiles and an optional tlp-pd daemon that offers the same D-Bus interface as power-profiles-daemon, so the desktop's profile switch keeps working.

Use one, not both. TLP and power-profiles-daemon (or tuned) change the same kernel settings, and running both gives unpredictable results. On Debian, installing TLP removes power-profiles-daemon; on Fedora 44 and later the TLP packages also remove tuned and tuned-ppd. If your distribution's packages do not enforce this, uninstall the other tool yourself, and reinstall it if you remove TLP later.

# Debian 13, Ubuntu 24.04 and 26.04 ship TLP 1.8 or older: no tlp-pd
sudo apt install tlp tlp-rdw
# Debian 13 with TLP 1.10 from trixie-backports (backports enabled first)
sudo apt install -t trixie-backports tlp tlp-pd tlp-rdw
# Fedora 44, 45
sudo dnf install --allowerasing tlp tlp-pd tlp-rdw
sudo systemctl enable --now tlp.service tlp-pd.service   # Fedora; leave out tlp-pd.service without tlp-pd
sudo systemctl mask systemd-rfkill.service systemd-rfkill.socket   # Fedora, per TLP docs

tlp-stat -s                        # is TLP active, which profile, which power source
sudo tlp-stat -b                   # battery data and charge thresholds
tlpctl list                        # profiles (TLP 1.9+ with tlp-pd)
tlpctl power-saver

Battery charge thresholds

Keeping a lithium battery at 100% all day while plugged in wears it faster, and many laptops let the OS cap the charge. TLP sets this in /etc/tlp.conf or, better, in a drop-in file under /etc/tlp.d/ (read in alphabetical order; /etc/tlp.conf is read last and wins):

# /etc/tlp.d/50-battery.conf
START_CHARGE_THRESH_BAT0=75
STOP_CHARGE_THRESH_BAT0=80

Charging then starts below 75% and stops at 80%. Set both values (use 0 for one you do not want) or TLP ignores them. Apply with sudo tlp start and check with sudo tlp-stat -b. Whether this works depends on the laptop vendor and the kernel; TLP's "Battery Care" pages list the details per brand.

Check the battery and suspend mode

upower --enumerate
upower --show-info /org/freedesktop/UPower/devices/battery_BAT0
cat /sys/power/mem_sleep           # e.g. "[s2idle] deep"

The bracketed entry in mem_sleep is the suspend method in use. s2idle (suspend-to-idle) is a software suspend that many current laptops use instead of the older deep suspend-to-RAM. If a laptop drains its battery noticeably while suspended and the firmware offers deep, try it with the kernel parameter mem_sleep_default=deep (see the BootPrompt HOWTO).

Sources