Starexe
📖 Tutorial

Bringing the XMM6260 Modem to Mainline Linux: A Step‑by‑Step Developer’s Guide

Last updated: 2026-05-21 07:33:54 Intermediate
Complete guide
Follow along with this comprehensive guide

Overview

In 2026, after years of dormancy, the Infineon/Intel XMM6260 modem may finally receive mainline Linux kernel support. This modem, once used in early smartphones and embedded devices, has been largely abandoned by upstream Linux developers—despite being acquired by Intel (2011) and later Apple (2019). The effort to bring it back into the fold involves patching drivers, fixing legacy hardware abstractions, and navigating the kernel community’s rigorous review process. This guide walks you through the entire journey, from understanding the modem’s architecture to submitting your first patch set.

Bringing the XMM6260 Modem to Mainline Linux: A Step‑by‑Step Developer’s Guide

Prerequisites

Before diving in, ensure you have:

  • Linux kernel source tree (preferably a recent mainline clone from git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git)
  • GCC and cross‑compilation tools (for ARM if targeting embedded boards that used the XMM6260)
  • Hardware with an XMM6260 modem (e.g., old Nokia N9, Samsung Galaxy S II variants, or Intel dev boards)
  • Familiarity with USB subsystem – the XMM6260 appears as a USB composite device (CDC ACM + mass storage + audio)
  • Knowledge of kernel coding style and the common mistakes section before you start

Step‑by‑Step Instructions

1. Analyse the Existing Out‑of‑Tree Drivers

Start by locating historical driver repositories. The original Intel mobile driver (often named ximodem or cdc_xmm6260) was never merged into mainline. You can find remnants in:

  • Old Android kernel trees (e.g., CyanogenMod for Galaxy S II)
  • Intel’s own linux-intel branches on GitHub
  • The linux-omap mailing list archives (the modem was often paired with OMAP processors)

Extract the core driver (usually a USB serial or CDC ACM driver) and note its dependencies: usb_serial, usbnet, and sometimes a custom acm layer for AT commands.

2. Reverse‑Engineer the USB Interface

Use lsusb -v on a live system with the modem attached to capture descriptors. Look for:

  • Vendor ID (0x8087 for Intel) and Product ID (0x07da for XMM6260)
  • Interface class codes – expect a combination ofCommunications Device Class (CDC) andVendor‑specific
  • Endpoints: bulk IN/OUT for data, interrupt for modem status

Record the exact descriptor sequence. This will dictate how you write the probe() function.

3. Write a Clean‑Room Driver from Scratch

Avoid copying code directly from out‑of‑tree sources without re‑licensing. Instead, implement a new driver based on the Linux USB subsystem’s templates. Start with:

#include <linux/module.h>
#include <linux/usb.h>

static const struct usb_device_id xmm6260_table[] = {
    { USB_DEVICE(0x8087, 0x07da) },
    { } /* Terminating entry */
};
MODULE_DEVICE_TABLE(usb, xmm6260_table);

static int xmm6260_probe(struct usb_interface *intf,
                         const struct usb_device_id *id) {
    // Allocate private data, register net/char device
    return 0;
}

static void xmm6260_disconnect(struct usb_interface *intf) {
    // Cleanup
}

static struct usb_driver xmm6260_driver = {
    .name = "xmm6260",
    .probe = xmm6260_probe,
    .disconnect = xmm6260_disconnect,
    .id_table = xmm6260_table,
};
module_usb_driver(xmm6260_driver);
MODULE_LICENSE("GPL");

Extend this skeleton to bind to all the modem’s interfaces (typically 3–4).

4. Implement AT Command Handling

The XMM6260 exposes a serial channel for AT commands. Use the USB serial core (drivers/usb/serial/generic.c) to register a custom line discipline. Example excerpt:

static struct usb_serial_driver xmm6260_serial_device = {
    .driver = {
        .owner = THIS_MODULE,
        .name = "xmm6260_serial",
    },
    .description = "XMM6260 modem serial",
    .id_table = xmm6260_id_table,
    .num_ports = 1,
    .probe = xmm6260_serial_probe,
};

Test basic AT commands (AT, AT+CGMI, AT+CPIN?) before building control channels (PPP, QMI).

5. Handle Power Management and GPIO

The modem requires precise power sequencing: reset via GPIO, enable via regulator, and sleep state coordination. Document these in Device Tree bindings. Example snippet for a platform device:

modem: modem {
    compatible = "intel,xmm6260";
    reg = <0x20>; /* I2C address for power control GPIO extender */
    reset-gpios = <&gpio3 5 GPIO_ACTIVE_LOW>;
    vcc-supply = <&vmmc>;
    #address-cells = <1>;
    #size-cells = <0>;
};

Submit a Device Tree binding document (Documentation/devicetree/bindings/net/intel,xmm6260.yaml).

6. Prepare Patches and Submit to Linux Kernel Mailing List (LKML)

Follow the kernel submission guidelines:

  • Create a patch series: 1) Device Tree binding, 2) USB driver core, 3) Serial/network interface, 4) Power management.
  • Use git format-patch and git send-email.
  • Include a cover letter explaining the hardware and your testing results.
  • Add yourself as maintainer in MAINTAINERS if you plan long‑term care.

Linus Torvalds’ tree merge window for 2026 is early January; aim for submission in late 2025.

Common Mistakes

  • Ignoring the USB HID descriptor – The XMM6260 sometimes presents as a composite HID device; failing to handle it can break enumeration.
  • Using outdated kernel APIs – e.g., usb_fill_bulk_urb with deprecated flags. Check include/linux/usb.h for modern equivalents.
  • Forgetting to submit a Signed‑off‑by line – Each patch must have a valid sign‑off per the Developer’s Certificate of Origin.
  • Not testing with real hardware – Emulators are insufficient; the modem has subtle timing quirks only visible on actual silicon.

Summary

Bringing the XMM6260 modem to mainline Linux requires reconstructing a USB/ serial driver, defining power management in Device Tree, and navigating the kernel community’s review process. By following this guide—starting with hardware analysis, writing a clean driver, and submitting well‑structured patches—you can help revive a piece of mobile history for Linux in 2026.