PCMCIA HOWTO: laptop expansion, Thunderbolt and power management today
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
| Interface | Bus underneath | Linux today |
|---|---|---|
| PC Card (16-bit PCMCIA) | ISA-like | Still in the kernel (CONFIG_PCMCIA); fewer card drivers each year |
| CardBus (32-bit PC Card) | PCI | Still in the kernel; cards appear as PCI devices |
| ExpressCard | PCI Express or USB 2.0 | No special subsystem: cards are ordinary PCIe or USB devices |
| Thunderbolt 3/4, USB4 | PCIe, DisplayPort and USB tunneled over USB-C | Kernel 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:
- IOMMU DMA protection. On newer systems, the firmware and kernel use the IOMMU so a device can only reach memory its driver gave it. The kernel reports this as
iommu_dma_protection= 1, and then the security levels below matter much less. - Security levels, set in the firmware:
none(connect everything),user(ask the user),secure(ask, plus a key challenge),dponly(DisplayPort and USB only),usbonlyandnopcie.
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
- drivers/pcmcia/Kconfig (PC Card and CardBus support), Linux kernel
- pccardctl(8) and lspcmcia, Debian 13
- USB4 and Thunderbolt, Linux kernel admin guide
- boltctl(1), Debian 13 (bolt 0.9.8)
- fwupdmgr(1), Debian 13
- powerprofilesctl(1), Debian 13
- TLP home page and news
- TLP FAQ: power-profiles-daemon
- TLP installation on Debian
- TLP installation on Fedora
- Tuned as the default power profile management daemon (Fedora 41 change), Fedora Project
- tlp in Debian 13 and tlp in Ubuntu
- tlpctl, TLP documentation
- tlp-stat, TLP documentation
- TLP configuration files
- TLP battery care settings
- upower(1), Debian 13
- System sleep states, Linux kernel admin guide
- Linux PCMCIA HOWTO (classic), Linux Documentation Project