You plugged in the HP printer and the queue just sits there
You connect your HP LaserJet via USB and Fedora detects the device. The system tray shows a printer icon, but every job you send turns gray and stays in the queue forever. Or you add the office network printer and CUPS lists it as a generic PCL device. The output is gibberish, or the printer beeps an error code. The hardware is fine. The cable is fine. The driver stack is missing the translation layer. HPLIP provides that layer.
How HPLIP fits into the Fedora print stack
CUPS is the print spooler. It manages the queue, handles user permissions, and talks to the kernel. CUPS does not know how to speak HP's proprietary protocols. It needs a backend to translate your document into the printer's language and to handle device-specific features like ink level reporting, duplex control, and firmware loading.
HPLIP installs a CUPS backend named hp. When you configure a printer with HPLIP, CUPS calls this backend. The backend queries the device via USB or IPP, determines the exact model, and returns a device URI like hp:/usb/HP_LaserJet_M404n?serial=.... This URI tells CUPS to route all jobs through the HPLIP backend. If you use a raw socket:// URI, CUPS bypasses HPLIP and sends raw data. This works for some network printers that accept standard PCL or PostScript, but you lose ink monitoring, maintenance commands, and automatic firmware updates.
Many HP printers ship with incomplete firmware in their flash memory. The driver must upload a firmware blob every time the printer powers on. HPLIP stores these blobs in /usr/share/hplip/data/firmware/. If the blob is missing, the printer will not initialize. The setup wizard downloads the blob from HP's servers. This requires an internet connection. Air-gapped systems need manual firmware transfer.
HPLIP also generates a PPD file that describes the printer's capabilities to the desktop environment. This file enables the print dialog to show tray selection, quality settings, and color profiles. Without the correct PPD, the print dialog offers only generic options.
Run hp-check before you blame the hardware. The diagnostic report tells you exactly which dependency is missing.
Install and configure HPLIP
Fedora ships HPLIP in the main repository. You do not need RPM Fusion or third-party sources. The hplip package provides the backend, the command-line tools, and the firmware loader. The hplip-gui package adds the graphical toolbox for ink monitoring and maintenance cycles. Install both if you are on a desktop system.
Here is how to install the core drivers and the optional GUI tools.
sudo dnf install hplip hplip-gui # Core backend plus graphical management tools
After installation, run the setup wizard. This tool detects USB and network printers, configures the device URI, downloads missing firmware, and generates the PPD. It handles the entire configuration flow.
Here is how to launch the interactive setup wizard.
hp-setup # Detects printers and configures CUPS with the correct backend
The wizard presents a menu. Choose the connection type. For USB printers, select the USB option and the wizard probes the bus. For network printers, select the network option. The wizard scans for devices via SNMP or mDNS. If you have multiple printers, select the correct serial number. The wizard then asks for a printer name and location. These strings appear in the CUPS queue and the print dialog.
If the wizard reports a missing firmware file, it prompts you to download it. Accept the prompt. The wizard fetches the blob and installs it. If you are behind a proxy, set the http_proxy environment variable before running hp-setup.
Here is how to ensure the CUPS service is running and the firewall allows printer traffic.
sudo systemctl enable --now cups # Start the spooler immediately and enable it on boot
sudo firewall-cmd --permanent --add-service=printer # Open port 631 for IPP and network discovery
sudo firewall-cmd --reload # Apply firewall changes to the runtime configuration
Reload the firewall after every rule change. Runtime and persistent config diverge otherwise.
Verify the printer works
Once hp-setup completes, CUPS has a new queue. Verify the queue is active and the default destination is set correctly.
Here is how to list printers and send a test page.
lpstat -p -d # Show all printers and the default destination
lp -d HP_LaserJet_Pro /usr/share/cups/data/testprint # Send a standard test page to the queue
The lpstat command lists printers with their state. Look for accepting jobs and enabled. If the printer shows paused, resume it with cupsenable <printer_name>. The test page command sends a small PDF to the queue. If the printer outputs a clean page, the driver stack is working.
Check the job status with lpq. The queue should show the job moving from queued to processing to completed. If the job stalls, check the CUPS error log.
Here is how to inspect recent CUPS logs for job failures.
journalctl -xeu cups # Show CUPS logs with explanatory context and jump to the end
The journalctl output shows why a job failed. Common messages include Filter failed, Device URI invalid, or Firmware load error. Read the error before guessing. The log points to the root cause.
Common errors and how to fix them
SELinux denies HPLIP access
HPLIP works with default SELinux policies. If you see denials in the audit log, the boolean hplip_can_connect might be disabled. This boolean controls whether HPLIP can access network resources and device files.
Here is how to check and fix SELinux booleans for HPLIP.
getsebool hplip_can_connect # Check if the boolean is enabled
sudo setsebool -P hplip_can_connect 1 # Enable the boolean permanently
SELinux denials show up in journalctl -t setroubleshoot with a one-line summary. Read the summary. It tells you which boolean to set. Do not disable SELinux. Fix the policy.
USB permission errors
If hp-setup cannot detect a USB printer, the user might lack permission to access the device node. HPLIP uses udev rules to set permissions. Ensure the udev rules are loaded.
Here is how to reload udev rules and restore device contexts.
sudo udevadm control --reload-rules # Reload udev rules from disk
sudo udevadm trigger # Re-evaluate existing devices against the new rules
sudo restorecon -R /dev/bus/usb # Restore default SELinux contexts on USB devices
The restorecon command fixes context drift. If a device node has the wrong context, HPLIP cannot read it. Restoring the context resolves the denial.
Firmware installation fails
Older HP models require firmware blobs. If the download fails, the printer will not initialize. The error message in hp-setup mentions a missing firmware file. Check your internet connection. If you are on a restricted network, download the firmware manually from the HPLIP download page and place it in /usr/share/hplip/data/firmware/.
Here is how to check for dependency issues and missing components.
hp-check -t # Generate a detailed diagnostic report and check dependencies
The hp-check tool scans for missing libraries, incorrect permissions, and configuration errors. It outputs a report with a URL. Paste the URL into a browser to view the formatted report. The report highlights issues in red. Fix the listed items and run hp-check again.
Network printer discovery fails
If hp-setup does not find a network printer, the firewall might be blocking SNMP or mDNS traffic. Ensure the printer service is open. Also check that the printer is on the same subnet. Some enterprise networks isolate devices. In that case, use the IP address directly in hp-setup.
Here is how to add a network printer manually by IP address.
hp-setup -i # Launch interactive setup for manual configuration
In interactive mode, select the network option and choose "Enter IP address". Type the printer's IP. The wizard probes the device and configures the URI. This bypasses discovery protocols and works on segmented networks.
Check journalctl -xeu cups if the queue stalls. The spooler logs the exact reason a job failed.
Choose the right tool for your setup
Use hplip when you need full support for HP LaserJet, OfficeJet, and InkTank models. Use hplip-gui when you want to monitor ink levels and run maintenance cycles from a desktop interface. Use cups-browsed when you need to auto-discover printers on a local network via mDNS or SNMP. Use the generic PCL driver when your HP printer supports standard PCL6 and you want to avoid vendor-specific dependencies. Use ipp-usb when you are running a minimal server and only need basic printing without ink monitoring.
Trust the package manager. Manual file edits drift, snapshots stay.