Arbeitsnotizen zu: Debian und Marvell 88SE9215

RAID bus controller: Marvell Technology Group Ltd. 88SE9215

Kommentieren Nov 27 2022 .txt, .json, .md

Debian (zu diesem Zeitpunkt stable und sid) erkennt folgende Hardware nicht:

03:00.0 RAID bus controller [0104]: Marvell Technology Group Ltd. 
        88SE9215 PCIe 2.0 x1 4-port SATA 6 Gb/s Controller
        [1b4b:9215] (rev 01)

Die Informationen aus Hardware for Linux besagen das es mit dem ahci Treiber funktionieren soll. Es wird aber in lspci -kk nicht mit ausgegeben.

03:00.0 RAID bus controller: Marvell Technology Group Ltd. 
        88SE9215 PCIe 2.0 x1 4-port SATA 6 Gb/s Controller (rev 01)
        Subsystem: Dawicontrol GmbH 88SE9215 PCIe 2.0 x1 4-port SATA 6 Gb/s Controller

Nach ein wenig Suche findet man so etwas:

/bin/echo 1b4b 9215 > /sys/bus/pci/drivers/ahci/new_id

Und schon wird die Karte mit dem entsprechenden Kernelmodul erkannt und die an diese Karte angehängten Speichermedien werden aufgelistet zb. mit blkid.

Nun ist das keine dauerhafte Lösung und ich war nicht in der Lage diesen Befehl irgendwie zu automatisieren. Selbst wenn, müsste das zu einem Zeitpunkt passieren der es ermöglicht diese Speichermedien über die /etc/fstab einzubinden und ganz normal zu verwenden.

Mit Hilfe stößt man auf das hier: https://github.com/torvalds/linux/blob/e08466a7c00733a501d3c5328d29ec974478d717/drivers/ata/ahci.c#L558-L587. Es muss als einfach nur eine Anpassung an dem ahci Kernel Modul erfolgen und gut ist.

Dazu muss man unter Debian eher ungewohnt doch einen Kernel patchen und booten. Ich bin dabei so vorgegangen einen Patch zu erstellen mit dem ich die original Sourcen anpasse. Diesen Patch kann man nun jederzeit bei neuen Kernel sourcen verwenden

Kernel sourcen beziehen

apt build-dep linux
apt install linux-source
cd /usr/src/
tar xaf linux-source-6.0.tar.xz

Kopie der ahci.c Datei anlegen:

mkdir -p linux-source-6.0-custom/drivers/ata/
cp linux-source-6.0/drivers/ata/ahci.c linux-source-6.0-custom/drivers/ata/

Diese Datei nun öffnen nano -w linux-source-6.0-custom/drivers/ata/ahci.c und nach Marvell suchen. Vergleich dazu die original Quellen. Die folgenden zwei Zeilen einfügen.

{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9215),        /* 88se9215 */
.driver_data = board_ahci_yes_fbs },

Für die Erstellung eines Patches

diff -rupN linux-source-6.0/drivers/ata/ahci.c linux-source-6.0-custom/drivers/ata/ahci.c > marvel-88se9215.patch

Aktuelle Kernel config kopieren

cp /boot/config-6.0.0-3-amd64 linux-source-6.0/.config

In das aktuelle Kernel Quell Verzeichnis wechseln cd linux-source-6.0/ und dort aus der .config den Eintrag CONFIG_SYSTEM_TRUSTED_KEYS= entfernen.

Den erstellten Patch anwenden patch -p1 < ../marvel-88se9215.patch und nun den Kernel bauen

make olddefconffig
make -j3 deb-pkg LOCALVERSION=-marvell

Der Wert zu LOCALVERSION=- bestimmt auch einen teil des Kernelnamens

In cd /usr/src wechseln und daraus die neuen .deb Paket installieren. Die -dbg Paket braucht man nicht.

dpkg -i linux-headers-6.0.8-marvell_6.0.8-marvell-1_amd64.deb linux-image-6.0.8-marvell_6.0.8-marvell-1_amd64.deb
linux-libc-dev_6.0.8-marvell-1_amd64.deb

Neustart und der neue Kernel mit dem angepassten Namen sollte über uname -a erkenntlich sein. Ebenso die Speichermedien über den Marvell Controller.

Damit man nun bei einem apt upgrade nicht ausversehen sich einen neuen Kernel einbaut kann hiermit apt-mark hold linux-image-amd64 auf Wartestellung gesetzt werden.

Hier der Patch:

--- linux-source-6.0/drivers/ata/ahci.c 2022-11-10 18:17:40.000000000 +0100
+++ linux-source-6.0-custom/drivers/ata/ahci.c  2022-11-13 12:02:38.511802110 +0100
@@ -581,6 +581,8 @@ static const struct pci_device_id ahci_p
          .driver_data = board_ahci_yes_fbs },
        { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x91a3),
          .driver_data = board_ahci_yes_fbs },
+       { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9215),        /* 88se9215 */
+         .driver_data = board_ahci_yes_fbs },
        { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9230),
          .driver_data = board_ahci_yes_fbs },
        { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9235),