diff --git a/maintainers/maintainer-list.nix b/maintainers/maintainer-list.nix index cdf361cb60d8..d45dd9ccbd20 100644 --- a/maintainers/maintainer-list.nix +++ b/maintainers/maintainer-list.nix @@ -9168,6 +9168,11 @@ githubId = 115218; name = "Felix Richter"; }; + MakiseKurisu = { + github = "MakiseKurisu"; + githubId = 2321672; + name = "Makise Kurisu"; + }; malbarbo = { email = "malbarbo@gmail.com"; github = "malbarbo"; diff --git a/pkgs/os-specific/linux/ch9344/default.nix b/pkgs/os-specific/linux/ch9344/default.nix new file mode 100644 index 000000000000..25d7ecf02552 --- /dev/null +++ b/pkgs/os-specific/linux/ch9344/default.nix @@ -0,0 +1,48 @@ +{ stdenv, lib, fetchzip, kernel }: + +stdenv.mkDerivation rec { + pname = "ch9344"; + version = "1.9"; + + src = fetchzip { + name = "CH9344SER_LINUX.zip"; + url = "https://www.wch.cn/downloads/file/386.html#CH9344SER_LINUX.zip"; + hash = "sha256-g55ftAfjKKlUFzGhI1a/O7Eqbz6rkGf1vWuEJjBZxBE="; + }; + + patches = lib.optionals (lib.versionAtLeast kernel.modDirVersion "6.1") [ + # https://github.com/torvalds/linux/commit/a8c11c1520347be74b02312d10ef686b01b525f1 + ./fix-incompatible-pointer-types.patch + ]; + + sourceRoot = "${src.name}/driver"; + hardeningDisable = [ "pic" ]; + nativeBuildInputs = kernel.moduleBuildDependencies; + + preBuild = '' + substituteInPlace Makefile --replace "KERNELDIR :=" "KERNELDIR ?=" + ''; + + makeFlags = [ + "KERNELDIR=${kernel.dev}/lib/modules/${kernel.modDirVersion}/build" + ]; + + installPhase = '' + runHook preInstall + install -D ch9344.ko $out/lib/modules/${kernel.modDirVersion}/usb/serial/ch9344.ko + runHook postInstall + ''; + + meta = with lib; { + homepage = "http://www.wch-ic.com/"; + downloadPage = "https://www.wch.cn/downloads/CH9344SER_LINUX_ZIP.html"; + description = "WCH CH9344/CH348 UART driver"; + longDescription = '' + A kernel module for WinChipHead CH9344/CH348 USB To Multi Serial Ports controller. + ''; + # Archive contains no license. + license = licenses.unfree; + platforms = platforms.linux; + maintainers = with maintainers; [ MakiseKurisu ]; + }; +} diff --git a/pkgs/os-specific/linux/ch9344/fix-incompatible-pointer-types.patch b/pkgs/os-specific/linux/ch9344/fix-incompatible-pointer-types.patch new file mode 100644 index 000000000000..31088538733e --- /dev/null +++ b/pkgs/os-specific/linux/ch9344/fix-incompatible-pointer-types.patch @@ -0,0 +1,22 @@ +diff --git a/ch9344.c b/ch9344.c +index 1e37293..a16af82 100644 +--- a/ch9344.c ++++ b/ch9344.c +@@ -79,7 +79,7 @@ static DEFINE_IDR(ch9344_minors); + static DEFINE_MUTEX(ch9344_minors_lock); + + static void ch9344_tty_set_termios(struct tty_struct *tty, +- struct ktermios *termios_old); ++ const struct ktermios *termios_old); + + static int ch9344_get_portnum(int index); + +@@ -1597,7 +1597,7 @@ u8 cal_recv_tmt(__le32 bd) + } + + static void ch9344_tty_set_termios(struct tty_struct *tty, +- struct ktermios *termios_old) ++ const struct ktermios *termios_old) + { + struct ch9344 *ch9344 = tty->driver_data; + struct ktermios *termios = &tty->termios; diff --git a/pkgs/top-level/linux-kernels.nix b/pkgs/top-level/linux-kernels.nix index 14767d88c1f3..a0b0f2d00ad0 100644 --- a/pkgs/top-level/linux-kernels.nix +++ b/pkgs/top-level/linux-kernels.nix @@ -308,6 +308,8 @@ in { bbswitch = callPackage ../os-specific/linux/bbswitch {}; + ch9344 = callPackage ../os-specific/linux/ch9344 { }; + chipsec = callPackage ../tools/security/chipsec { inherit kernel; withDriver = true;