Update On Mon May 19 20:37:16 CEST 2025

This commit is contained in:
github-action[bot]
2025-05-19 20:37:16 +02:00
parent d2ac420305
commit 12fb6c8088
93 changed files with 879 additions and 717 deletions

1
.github/update.log vendored
View File

@@ -1003,3 +1003,4 @@ Update On Thu May 15 20:37:42 CEST 2025
Update On Fri May 16 20:36:33 CEST 2025
Update On Sat May 17 20:35:13 CEST 2025
Update On Sun May 18 20:35:03 CEST 2025
Update On Mon May 19 20:37:08 CEST 2025

View File

@@ -3,6 +3,7 @@ package updater
import (
"archive/tar"
"archive/zip"
"bytes"
"compress/gzip"
"fmt"
"io"
@@ -32,6 +33,17 @@ const (
typeTarGzip
)
func (t compressionType) String() string {
switch t {
case typeZip:
return "zip"
case typeTarGzip:
return "tar.gz"
default:
return "unknown"
}
}
var DefaultUiUpdater = &UIUpdater{}
func NewUiUpdater(externalUI, externalUIURL, externalUIName string) *UIUpdater {
@@ -99,48 +111,35 @@ func detectFileType(data []byte) compressionType {
}
func (u *UIUpdater) downloadUI() error {
err := u.prepareUIPath()
if err != nil {
return fmt.Errorf("prepare UI path failed: %w", err)
}
data, err := downloadForBytes(u.externalUIURL)
if err != nil {
return fmt.Errorf("can't download file: %w", err)
}
fileType := detectFileType(data)
if fileType == typeUnknown {
return fmt.Errorf("unknown or unsupported file type")
tmpDir := C.Path.Resolve("downloadUI.tmp")
defer os.RemoveAll(tmpDir)
extractedFolder, err := extract(data, tmpDir)
if err != nil {
return fmt.Errorf("can't extract compressed file: %w", err)
}
ext := ".zip"
if fileType == typeTarGzip {
ext = ".tgz"
}
saved := path.Join(C.Path.HomeDir(), "download"+ext)
log.Debugln("compression Type: %s", ext)
if err = saveFile(data, saved); err != nil {
return fmt.Errorf("can't save compressed file: %w", err)
}
defer os.Remove(saved)
err = cleanup(u.externalUIPath)
log.Debugln("cleanupFolder: %s", u.externalUIPath)
err = cleanup(u.externalUIPath) // cleanup files in dir don't remove dir itself
if err != nil {
if !os.IsNotExist(err) {
return fmt.Errorf("cleanup exist file error: %w", err)
}
}
extractedFolder, err := extract(saved, C.Path.HomeDir())
err = u.prepareUIPath()
if err != nil {
return fmt.Errorf("can't extract compressed file: %w", err)
return fmt.Errorf("prepare UI path failed: %w", err)
}
err = os.Rename(extractedFolder, u.externalUIPath)
log.Debugln("moveFolder from %s to %s", extractedFolder, u.externalUIPath)
err = moveDir(extractedFolder, u.externalUIPath) // move files from tmp to target
if err != nil {
return fmt.Errorf("rename UI folder failed: %w", err)
return fmt.Errorf("move UI folder failed: %w", err)
}
return nil
}
@@ -155,12 +154,11 @@ func (u *UIUpdater) prepareUIPath() error {
return nil
}
func unzip(src, dest string) (string, error) {
r, err := zip.OpenReader(src)
func unzip(data []byte, dest string) (string, error) {
r, err := zip.NewReader(bytes.NewReader(data), int64(len(data)))
if err != nil {
return "", err
}
defer r.Close()
// check whether or not only exists singleRoot dir
rootDir := ""
@@ -199,17 +197,7 @@ func unzip(src, dest string) (string, error) {
log.Debugln("extractedFolder: %s", extractedFolder)
} else {
log.Debugln("Match the multiRoot")
// or put the files/dirs into new dir
baseName := filepath.Base(src)
baseName = strings.TrimSuffix(baseName, filepath.Ext(baseName))
extractedFolder = filepath.Join(dest, baseName)
for i := 1; ; i++ {
if _, err := os.Stat(extractedFolder); os.IsNotExist(err) {
break
}
extractedFolder = filepath.Join(dest, fmt.Sprintf("%s_%d", baseName, i))
}
extractedFolder = dest
log.Debugln("extractedFolder: %s", extractedFolder)
}
@@ -221,13 +209,17 @@ func unzip(src, dest string) (string, error) {
fpath = filepath.Join(extractedFolder, f.Name)
}
if !strings.HasPrefix(fpath, filepath.Clean(dest)+string(os.PathSeparator)) {
if !inDest(fpath, dest) {
return "", fmt.Errorf("invalid file path: %s", fpath)
}
if f.FileInfo().IsDir() {
info := f.FileInfo()
if info.IsDir() {
os.MkdirAll(fpath, os.ModePerm)
continue
}
if info.Mode()&os.ModeSymlink != 0 {
continue // disallow symlink
}
if err = os.MkdirAll(filepath.Dir(fpath), os.ModePerm); err != nil {
return "", err
}
@@ -249,14 +241,8 @@ func unzip(src, dest string) (string, error) {
return extractedFolder, nil
}
func untgz(src, dest string) (string, error) {
file, err := os.Open(src)
if err != nil {
return "", err
}
defer file.Close()
gzr, err := gzip.NewReader(file)
func untgz(data []byte, dest string) (string, error) {
gzr, err := gzip.NewReader(bytes.NewReader(data))
if err != nil {
return "", err
}
@@ -299,8 +285,7 @@ func untgz(src, dest string) (string, error) {
isSingleRoot = false
}
file.Seek(0, 0)
gzr, _ = gzip.NewReader(file)
_ = gzr.Reset(bytes.NewReader(data))
tr = tar.NewReader(gzr)
var extractedFolder string
@@ -310,17 +295,7 @@ func untgz(src, dest string) (string, error) {
log.Debugln("extractedFolder: %s", extractedFolder)
} else {
log.Debugln("Match the multiRoot")
baseName := filepath.Base(src)
baseName = strings.TrimSuffix(baseName, filepath.Ext(baseName))
baseName = strings.TrimSuffix(baseName, ".tar")
extractedFolder = filepath.Join(dest, baseName)
for i := 1; ; i++ {
if _, err := os.Stat(extractedFolder); os.IsNotExist(err) {
break
}
extractedFolder = filepath.Join(dest, fmt.Sprintf("%s_%d", baseName, i))
}
extractedFolder = dest
log.Debugln("extractedFolder: %s", extractedFolder)
}
@@ -340,7 +315,7 @@ func untgz(src, dest string) (string, error) {
fpath = filepath.Join(extractedFolder, cleanTarPath(header.Name))
}
if !strings.HasPrefix(fpath, filepath.Clean(dest)+string(os.PathSeparator)) {
if !inDest(fpath, dest) {
return "", fmt.Errorf("invalid file path: %s", fpath)
}
@@ -367,16 +342,16 @@ func untgz(src, dest string) (string, error) {
return extractedFolder, nil
}
func extract(src, dest string) (string, error) {
srcLower := strings.ToLower(src)
switch {
case strings.HasSuffix(srcLower, ".tar.gz") ||
strings.HasSuffix(srcLower, ".tgz"):
return untgz(src, dest)
case strings.HasSuffix(srcLower, ".zip"):
return unzip(src, dest)
func extract(data []byte, dest string) (string, error) {
fileType := detectFileType(data)
log.Debugln("compression Type: %s", fileType)
switch fileType {
case typeZip:
return unzip(data, dest)
case typeTarGzip:
return untgz(data, dest)
default:
return "", fmt.Errorf("unsupported file format: %s", src)
return "", fmt.Errorf("unknown or unsupported file type")
}
}
@@ -398,22 +373,40 @@ func cleanTarPath(path string) string {
}
func cleanup(root string) error {
if _, err := os.Stat(root); os.IsNotExist(err) {
return nil
dirEntryList, err := os.ReadDir(root)
if err != nil {
return err
}
return filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
for _, dirEntry := range dirEntryList {
err = os.RemoveAll(filepath.Join(root, dirEntry.Name()))
if err != nil {
return err
}
if info.IsDir() {
if err := os.RemoveAll(path); err != nil {
return err
}
} else {
if err := os.Remove(path); err != nil {
return err
}
}
return nil
})
}
return nil
}
func moveDir(src string, dst string) error {
dirEntryList, err := os.ReadDir(src)
if err != nil {
return err
}
for _, dirEntry := range dirEntryList {
err = os.Rename(filepath.Join(src, dirEntry.Name()), filepath.Join(dst, dirEntry.Name()))
if err != nil {
return err
}
}
return nil
}
func inDest(fpath, dest string) bool {
if rel, err := filepath.Rel(dest, fpath); err == nil {
if filepath.IsLocal(rel) {
return true
}
}
return false
}

View File

@@ -7,6 +7,7 @@ import (
"net"
"net/netip"
"net/url"
"path/filepath"
"strings"
"time"
_ "unsafe"
@@ -759,6 +760,9 @@ func parseController(cfg *RawConfig) (*Controller, error) {
if path := cfg.ExternalUI; path != "" && !C.Path.IsSafePath(path) {
return nil, C.Path.ErrNotSafePath(path)
}
if uiName := cfg.ExternalUIName; uiName != "" && !filepath.IsLocal(uiName) {
return nil, fmt.Errorf("external UI name is not local: %s", uiName)
}
return &Controller{
ExternalController: cfg.ExternalController,
ExternalUI: cfg.ExternalUI,

View File

@@ -2,7 +2,7 @@
"manifest_version": 1,
"latest": {
"mihomo": "v1.19.8",
"mihomo_alpha": "alpha-303f5e3",
"mihomo_alpha": "alpha-d036d98",
"clash_rs": "v0.7.8",
"clash_premium": "2023-09-05-gdcc8d87",
"clash_rs_alpha": "0.7.7-alpha+sha.72871ca"
@@ -69,5 +69,5 @@
"linux-armv7hf": "clash-armv7-unknown-linux-gnueabihf"
}
},
"updated_at": "2025-05-17T22:20:46.645Z"
"updated_at": "2025-05-18T22:20:58.018Z"
}

View File

@@ -69,7 +69,7 @@
"postcss": "^8.5.1",
"prettier": "^3.4.2",
"terser": "^5.37.0",
"vite": "^6.0.11",
"vite": "^6.1.6",
"vite-plugin-compression2": "^1.0.0",
"vue-tsc": "^2.2.0"
},

View File

@@ -98,7 +98,7 @@ importers:
devDependencies:
'@intlify/unplugin-vue-i18n':
specifier: ^6.0.3
version: 6.0.3(@vue/compiler-dom@3.5.13)(eslint@9.19.0)(rollup@4.32.0)(typescript@5.6.3)(vue-i18n@11.1.2(vue@3.5.13(typescript@5.6.3)))(vue@3.5.13(typescript@5.6.3))
version: 6.0.3(@vue/compiler-dom@3.5.13)(eslint@9.19.0)(rollup@4.40.1)(typescript@5.6.3)(vue-i18n@11.1.2(vue@3.5.13(typescript@5.6.3)))(vue@3.5.13(typescript@5.6.3))
'@playwright/test':
specifier: ^1.50.0
version: 1.50.0
@@ -116,10 +116,10 @@ importers:
version: 8.21.0(@typescript-eslint/parser@8.21.0(eslint@9.19.0)(typescript@5.6.3))(eslint@9.19.0)(typescript@5.6.3)
'@vitejs/plugin-legacy':
specifier: ^6.0.0
version: 6.0.0(terser@5.37.0)(vite@6.0.11(@types/node@22.10.10)(terser@5.37.0)(yaml@2.7.0))
version: 6.0.0(terser@5.37.0)(vite@6.1.6(@types/node@22.10.10)(terser@5.37.0)(yaml@2.7.0))
'@vitejs/plugin-vue':
specifier: ^5.0.4
version: 5.2.1(vite@6.0.11(@types/node@22.10.10)(terser@5.37.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.6.3))
version: 5.2.1(vite@6.1.6(@types/node@22.10.10)(terser@5.37.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.6.3))
'@vue/eslint-config-prettier':
specifier: ^10.2.0
version: 10.2.0(eslint@9.19.0)(prettier@3.4.2)
@@ -157,11 +157,11 @@ importers:
specifier: ^5.37.0
version: 5.37.0
vite:
specifier: ^6.0.11
version: 6.0.11(@types/node@22.10.10)(terser@5.37.0)(yaml@2.7.0)
specifier: ^6.1.6
version: 6.1.6(@types/node@22.10.10)(terser@5.37.0)(yaml@2.7.0)
vite-plugin-compression2:
specifier: ^1.0.0
version: 1.3.3(rollup@4.32.0)(vite@6.0.11(@types/node@22.10.10)(terser@5.37.0)(yaml@2.7.0))
version: 1.3.3(rollup@4.40.1)(vite@6.1.6(@types/node@22.10.10)(terser@5.37.0)(yaml@2.7.0))
vue-tsc:
specifier: ^2.2.0
version: 2.2.0(typescript@5.6.3)
@@ -934,22 +934,26 @@ packages:
resolution: {integrity: sha512-nmG512G8QOABsserleechwHGZxzKSAlggGf9hQX0nltvSwyKNVuB/4o6iFeG2OnjXK253r8p8eSDOZf8PgFdWw==}
engines: {node: '>= 16'}
'@intlify/message-compiler@11.0.0-rc.1':
resolution: {integrity: sha512-TGw2uBfuTFTegZf/BHtUQBEKxl7Q/dVGLoqRIdw8lFsp9g/53sYn5iD+0HxIzdYjbWL6BTJMXCPUHp9PxDTRPw==}
engines: {node: '>= 16'}
'@intlify/message-compiler@11.1.2':
resolution: {integrity: sha512-T/xbNDzi+Yv0Qn2Dfz2CWCAJiwNgU5d95EhhAEf4YmOgjCKktpfpiUSmLcBvK1CtLpPQ85AMMQk/2NCcXnNj1g==}
engines: {node: '>= 16'}
'@intlify/shared@11.0.0-rc.1':
resolution: {integrity: sha512-8tR1xe7ZEbkabTuE/tNhzpolygUn9OaYp9yuYAF4MgDNZg06C3Qny80bes2/e9/Wm3aVkPUlCw6WgU7mQd0yEg==}
'@intlify/message-compiler@12.0.0-alpha.2':
resolution: {integrity: sha512-PD9C+oQbb7BF52hec0+vLnScaFkvnfX+R7zSbODYuRo/E2niAtGmHd0wPvEMsDhf9Z9b8f/qyDsVeZnD/ya9Ug==}
engines: {node: '>= 16'}
'@intlify/shared@11.1.2':
resolution: {integrity: sha512-dF2iMMy8P9uKVHV/20LA1ulFLL+MKSbfMiixSmn6fpwqzvix38OIc7ebgnFbBqElvghZCW9ACtzKTGKsTGTWGA==}
engines: {node: '>= 16'}
'@intlify/shared@11.1.3':
resolution: {integrity: sha512-pTFBgqa/99JRA2H1qfyqv97MKWJrYngXBA/I0elZcYxvJgcCw3mApAoPW3mJ7vx3j+Ti0FyKUFZ4hWxdjKaxvA==}
engines: {node: '>= 16'}
'@intlify/shared@12.0.0-alpha.2':
resolution: {integrity: sha512-P2DULVX9nz3y8zKNqLw9Es1aAgQ1JGC+kgpx5q7yLmrnAKkPR5MybQWoEhxanefNJgUY5ehsgo+GKif59SrncA==}
engines: {node: '>= 16'}
'@intlify/unplugin-vue-i18n@6.0.3':
resolution: {integrity: sha512-9ZDjBlhUHtgjRl23TVcgfJttgu8cNepwVhWvOv3mUMRDAhjW0pur1mWKEUKr1I8PNwE4Gvv2IQ1xcl4RL0nG0g==}
engines: {node: '>= 18'}
@@ -1045,98 +1049,103 @@ packages:
rollup:
optional: true
'@rollup/rollup-android-arm-eabi@4.32.0':
resolution: {integrity: sha512-G2fUQQANtBPsNwiVFg4zKiPQyjVKZCUdQUol53R8E71J7AsheRMV/Yv/nB8giOcOVqP7//eB5xPqieBYZe9bGg==}
'@rollup/rollup-android-arm-eabi@4.40.1':
resolution: {integrity: sha512-kxz0YeeCrRUHz3zyqvd7n+TVRlNyTifBsmnmNPtk3hQURUyG9eAB+usz6DAwagMusjx/zb3AjvDUvhFGDAexGw==}
cpu: [arm]
os: [android]
'@rollup/rollup-android-arm64@4.32.0':
resolution: {integrity: sha512-qhFwQ+ljoymC+j5lXRv8DlaJYY/+8vyvYmVx074zrLsu5ZGWYsJNLjPPVJJjhZQpyAKUGPydOq9hRLLNvh1s3A==}
'@rollup/rollup-android-arm64@4.40.1':
resolution: {integrity: sha512-PPkxTOisoNC6TpnDKatjKkjRMsdaWIhyuMkA4UsBXT9WEZY4uHezBTjs6Vl4PbqQQeu6oION1w2voYZv9yquCw==}
cpu: [arm64]
os: [android]
'@rollup/rollup-darwin-arm64@4.32.0':
resolution: {integrity: sha512-44n/X3lAlWsEY6vF8CzgCx+LQaoqWGN7TzUfbJDiTIOjJm4+L2Yq+r5a8ytQRGyPqgJDs3Rgyo8eVL7n9iW6AQ==}
'@rollup/rollup-darwin-arm64@4.40.1':
resolution: {integrity: sha512-VWXGISWFY18v/0JyNUy4A46KCFCb9NVsH+1100XP31lud+TzlezBbz24CYzbnA4x6w4hx+NYCXDfnvDVO6lcAA==}
cpu: [arm64]
os: [darwin]
'@rollup/rollup-darwin-x64@4.32.0':
resolution: {integrity: sha512-F9ct0+ZX5Np6+ZDztxiGCIvlCaW87HBdHcozUfsHnj1WCUTBUubAoanhHUfnUHZABlElyRikI0mgcw/qdEm2VQ==}
'@rollup/rollup-darwin-x64@4.40.1':
resolution: {integrity: sha512-nIwkXafAI1/QCS7pxSpv/ZtFW6TXcNUEHAIA9EIyw5OzxJZQ1YDrX+CL6JAIQgZ33CInl1R6mHet9Y/UZTg2Bw==}
cpu: [x64]
os: [darwin]
'@rollup/rollup-freebsd-arm64@4.32.0':
resolution: {integrity: sha512-JpsGxLBB2EFXBsTLHfkZDsXSpSmKD3VxXCgBQtlPcuAqB8TlqtLcbeMhxXQkCDv1avgwNjF8uEIbq5p+Cee0PA==}
'@rollup/rollup-freebsd-arm64@4.40.1':
resolution: {integrity: sha512-BdrLJ2mHTrIYdaS2I99mriyJfGGenSaP+UwGi1kB9BLOCu9SR8ZpbkmmalKIALnRw24kM7qCN0IOm6L0S44iWw==}
cpu: [arm64]
os: [freebsd]
'@rollup/rollup-freebsd-x64@4.32.0':
resolution: {integrity: sha512-wegiyBT6rawdpvnD9lmbOpx5Sph+yVZKHbhnSP9MqUEDX08G4UzMU+D87jrazGE7lRSyTRs6NEYHtzfkJ3FjjQ==}
'@rollup/rollup-freebsd-x64@4.40.1':
resolution: {integrity: sha512-VXeo/puqvCG8JBPNZXZf5Dqq7BzElNJzHRRw3vjBE27WujdzuOPecDPc/+1DcdcTptNBep3861jNq0mYkT8Z6Q==}
cpu: [x64]
os: [freebsd]
'@rollup/rollup-linux-arm-gnueabihf@4.32.0':
resolution: {integrity: sha512-3pA7xecItbgOs1A5H58dDvOUEboG5UfpTq3WzAdF54acBbUM+olDJAPkgj1GRJ4ZqE12DZ9/hNS2QZk166v92A==}
'@rollup/rollup-linux-arm-gnueabihf@4.40.1':
resolution: {integrity: sha512-ehSKrewwsESPt1TgSE/na9nIhWCosfGSFqv7vwEtjyAqZcvbGIg4JAcV7ZEh2tfj/IlfBeZjgOXm35iOOjadcg==}
cpu: [arm]
os: [linux]
'@rollup/rollup-linux-arm-musleabihf@4.32.0':
resolution: {integrity: sha512-Y7XUZEVISGyge51QbYyYAEHwpGgmRrAxQXO3siyYo2kmaj72USSG8LtlQQgAtlGfxYiOwu+2BdbPjzEpcOpRmQ==}
'@rollup/rollup-linux-arm-musleabihf@4.40.1':
resolution: {integrity: sha512-m39iO/aaurh5FVIu/F4/Zsl8xppd76S4qoID8E+dSRQvTyZTOI2gVk3T4oqzfq1PtcvOfAVlwLMK3KRQMaR8lg==}
cpu: [arm]
os: [linux]
'@rollup/rollup-linux-arm64-gnu@4.32.0':
resolution: {integrity: sha512-r7/OTF5MqeBrZo5omPXcTnjvv1GsrdH8a8RerARvDFiDwFpDVDnJyByYM/nX+mvks8XXsgPUxkwe/ltaX2VH7w==}
'@rollup/rollup-linux-arm64-gnu@4.40.1':
resolution: {integrity: sha512-Y+GHnGaku4aVLSgrT0uWe2o2Rq8te9hi+MwqGF9r9ORgXhmHK5Q71N757u0F8yU1OIwUIFy6YiJtKjtyktk5hg==}
cpu: [arm64]
os: [linux]
'@rollup/rollup-linux-arm64-musl@4.32.0':
resolution: {integrity: sha512-HJbifC9vex9NqnlodV2BHVFNuzKL5OnsV2dvTw6e1dpZKkNjPG6WUq+nhEYV6Hv2Bv++BXkwcyoGlXnPrjAKXw==}
'@rollup/rollup-linux-arm64-musl@4.40.1':
resolution: {integrity: sha512-jEwjn3jCA+tQGswK3aEWcD09/7M5wGwc6+flhva7dsQNRZZTe30vkalgIzV4tjkopsTS9Jd7Y1Bsj6a4lzz8gQ==}
cpu: [arm64]
os: [linux]
'@rollup/rollup-linux-loongarch64-gnu@4.32.0':
resolution: {integrity: sha512-VAEzZTD63YglFlWwRj3taofmkV1V3xhebDXffon7msNz4b14xKsz7utO6F8F4cqt8K/ktTl9rm88yryvDpsfOw==}
'@rollup/rollup-linux-loongarch64-gnu@4.40.1':
resolution: {integrity: sha512-ySyWikVhNzv+BV/IDCsrraOAZ3UaC8SZB67FZlqVwXwnFhPihOso9rPOxzZbjp81suB1O2Topw+6Ug3JNegejQ==}
cpu: [loong64]
os: [linux]
'@rollup/rollup-linux-powerpc64le-gnu@4.32.0':
resolution: {integrity: sha512-Sts5DST1jXAc9YH/iik1C9QRsLcCoOScf3dfbY5i4kH9RJpKxiTBXqm7qU5O6zTXBTEZry69bGszr3SMgYmMcQ==}
'@rollup/rollup-linux-powerpc64le-gnu@4.40.1':
resolution: {integrity: sha512-BvvA64QxZlh7WZWqDPPdt0GH4bznuL6uOO1pmgPnnv86rpUpc8ZxgZwcEgXvo02GRIZX1hQ0j0pAnhwkhwPqWg==}
cpu: [ppc64]
os: [linux]
'@rollup/rollup-linux-riscv64-gnu@4.32.0':
resolution: {integrity: sha512-qhlXeV9AqxIyY9/R1h1hBD6eMvQCO34ZmdYvry/K+/MBs6d1nRFLm6BOiITLVI+nFAAB9kUB6sdJRKyVHXnqZw==}
'@rollup/rollup-linux-riscv64-gnu@4.40.1':
resolution: {integrity: sha512-EQSP+8+1VuSulm9RKSMKitTav89fKbHymTf25n5+Yr6gAPZxYWpj3DzAsQqoaHAk9YX2lwEyAf9S4W8F4l3VBQ==}
cpu: [riscv64]
os: [linux]
'@rollup/rollup-linux-s390x-gnu@4.32.0':
resolution: {integrity: sha512-8ZGN7ExnV0qjXa155Rsfi6H8M4iBBwNLBM9lcVS+4NcSzOFaNqmt7djlox8pN1lWrRPMRRQ8NeDlozIGx3Omsw==}
'@rollup/rollup-linux-riscv64-musl@4.40.1':
resolution: {integrity: sha512-n/vQ4xRZXKuIpqukkMXZt9RWdl+2zgGNx7Uda8NtmLJ06NL8jiHxUawbwC+hdSq1rrw/9CghCpEONor+l1e2gA==}
cpu: [riscv64]
os: [linux]
'@rollup/rollup-linux-s390x-gnu@4.40.1':
resolution: {integrity: sha512-h8d28xzYb98fMQKUz0w2fMc1XuGzLLjdyxVIbhbil4ELfk5/orZlSTpF/xdI9C8K0I8lCkq+1En2RJsawZekkg==}
cpu: [s390x]
os: [linux]
'@rollup/rollup-linux-x64-gnu@4.32.0':
resolution: {integrity: sha512-VDzNHtLLI5s7xd/VubyS10mq6TxvZBp+4NRWoW+Hi3tgV05RtVm4qK99+dClwTN1McA6PHwob6DEJ6PlXbY83A==}
'@rollup/rollup-linux-x64-gnu@4.40.1':
resolution: {integrity: sha512-XiK5z70PEFEFqcNj3/zRSz/qX4bp4QIraTy9QjwJAb/Z8GM7kVUsD0Uk8maIPeTyPCP03ChdI+VVmJriKYbRHQ==}
cpu: [x64]
os: [linux]
'@rollup/rollup-linux-x64-musl@4.32.0':
resolution: {integrity: sha512-qcb9qYDlkxz9DxJo7SDhWxTWV1gFuwznjbTiov289pASxlfGbaOD54mgbs9+z94VwrXtKTu+2RqwlSTbiOqxGg==}
'@rollup/rollup-linux-x64-musl@4.40.1':
resolution: {integrity: sha512-2BRORitq5rQ4Da9blVovzNCMaUlyKrzMSvkVR0D4qPuOy/+pMCrh1d7o01RATwVy+6Fa1WBw+da7QPeLWU/1mQ==}
cpu: [x64]
os: [linux]
'@rollup/rollup-win32-arm64-msvc@4.32.0':
resolution: {integrity: sha512-pFDdotFDMXW2AXVbfdUEfidPAk/OtwE/Hd4eYMTNVVaCQ6Yl8et0meDaKNL63L44Haxv4UExpv9ydSf3aSayDg==}
'@rollup/rollup-win32-arm64-msvc@4.40.1':
resolution: {integrity: sha512-b2bcNm9Kbde03H+q+Jjw9tSfhYkzrDUf2d5MAd1bOJuVplXvFhWz7tRtWvD8/ORZi7qSCy0idW6tf2HgxSXQSg==}
cpu: [arm64]
os: [win32]
'@rollup/rollup-win32-ia32-msvc@4.32.0':
resolution: {integrity: sha512-/TG7WfrCAjeRNDvI4+0AAMoHxea/USWhAzf9PVDFHbcqrQ7hMMKp4jZIy4VEjk72AAfN5k4TiSMRXRKf/0akSw==}
'@rollup/rollup-win32-ia32-msvc@4.40.1':
resolution: {integrity: sha512-DfcogW8N7Zg7llVEfpqWMZcaErKfsj9VvmfSyRjCyo4BI3wPEfrzTtJkZG6gKP/Z92wFm6rz2aDO7/JfiR/whA==}
cpu: [ia32]
os: [win32]
'@rollup/rollup-win32-x64-msvc@4.32.0':
resolution: {integrity: sha512-5hqO5S3PTEO2E5VjCePxv40gIgyS2KvO7E7/vvC/NbIW4SIRamkMr1hqj+5Y67fbBWv/bQLB6KelBQmXlyCjWA==}
'@rollup/rollup-win32-x64-msvc@4.40.1':
resolution: {integrity: sha512-ECyOuDeH3C1I8jH2MK1RtBJW+YPMvSfT0a5NN0nHfQYnDSJ6tUiZH3gzwVP5/Kfh/+Tt7tpWVF9LXNTnhTJ3kA==}
cpu: [x64]
os: [win32]
@@ -1146,6 +1155,9 @@ packages:
'@types/estree@1.0.6':
resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==}
'@types/estree@1.0.7':
resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==}
'@types/json-schema@7.0.15':
resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
@@ -2086,6 +2098,11 @@ packages:
engines: {node: '>=8', npm: '>=5'}
hasBin: true
nanoid@3.3.11:
resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
nanoid@3.3.8:
resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
@@ -2206,6 +2223,10 @@ packages:
resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==}
engines: {node: ^10 || ^12 || >=14}
postcss@8.5.3:
resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==}
engines: {node: ^10 || ^12 || >=14}
prelude-ls@1.2.1:
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
engines: {node: '>= 0.8.0'}
@@ -2298,8 +2319,8 @@ packages:
resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
rollup@4.32.0:
resolution: {integrity: sha512-JmrhfQR31Q4AuNBjjAX4s+a/Pu/Q8Q9iwjWBsjRH1q52SPFE2NqRMK6fUZKKnvKO6id+h7JIRf0oYsph53eATg==}
rollup@4.40.1:
resolution: {integrity: sha512-C5VvvgCCyfyotVITIAv+4efVytl5F7wt+/I2i9q9GZcEXW9BP52YYOXC58igUi+LFZVHukErIIqQSWwv/M3WRw==}
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true
@@ -2540,8 +2561,8 @@ packages:
peerDependencies:
vite: ^2.0.0||^3.0.0||^4.0.0||^5.0.0 ||^6.0.0
vite@6.0.11:
resolution: {integrity: sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==}
vite@6.1.6:
resolution: {integrity: sha512-u+jokLMwHVFUoUkfL+m/1hzucejL2639g9QXcrRdtN3WPHfW7imI83V96Oh1R0xVZqDjvcgp+7S8bSQpdVlmPA==}
engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
hasBin: true
peerDependencies:
@@ -3578,8 +3599,8 @@ snapshots:
'@intlify/bundle-utils@10.0.0(vue-i18n@11.1.2(vue@3.5.13(typescript@5.6.3)))':
dependencies:
'@intlify/message-compiler': 11.0.0-rc.1
'@intlify/shared': 11.0.0-rc.1
'@intlify/message-compiler': 12.0.0-alpha.2
'@intlify/shared': 12.0.0-alpha.2
acorn: 8.14.0
escodegen: 2.1.0
estree-walker: 2.0.2
@@ -3595,27 +3616,29 @@ snapshots:
'@intlify/message-compiler': 11.1.2
'@intlify/shared': 11.1.2
'@intlify/message-compiler@11.0.0-rc.1':
dependencies:
'@intlify/shared': 11.0.0-rc.1
source-map-js: 1.2.1
'@intlify/message-compiler@11.1.2':
dependencies:
'@intlify/shared': 11.1.2
source-map-js: 1.2.1
'@intlify/shared@11.0.0-rc.1': {}
'@intlify/message-compiler@12.0.0-alpha.2':
dependencies:
'@intlify/shared': 12.0.0-alpha.2
source-map-js: 1.2.1
'@intlify/shared@11.1.2': {}
'@intlify/unplugin-vue-i18n@6.0.3(@vue/compiler-dom@3.5.13)(eslint@9.19.0)(rollup@4.32.0)(typescript@5.6.3)(vue-i18n@11.1.2(vue@3.5.13(typescript@5.6.3)))(vue@3.5.13(typescript@5.6.3))':
'@intlify/shared@11.1.3': {}
'@intlify/shared@12.0.0-alpha.2': {}
'@intlify/unplugin-vue-i18n@6.0.3(@vue/compiler-dom@3.5.13)(eslint@9.19.0)(rollup@4.40.1)(typescript@5.6.3)(vue-i18n@11.1.2(vue@3.5.13(typescript@5.6.3)))(vue@3.5.13(typescript@5.6.3))':
dependencies:
'@eslint-community/eslint-utils': 4.4.1(eslint@9.19.0)
'@intlify/bundle-utils': 10.0.0(vue-i18n@11.1.2(vue@3.5.13(typescript@5.6.3)))
'@intlify/shared': 11.1.2
'@intlify/vue-i18n-extensions': 8.0.0(@intlify/shared@11.1.2)(@vue/compiler-dom@3.5.13)(vue-i18n@11.1.2(vue@3.5.13(typescript@5.6.3)))(vue@3.5.13(typescript@5.6.3))
'@rollup/pluginutils': 5.1.4(rollup@4.32.0)
'@intlify/shared': 11.1.3
'@intlify/vue-i18n-extensions': 8.0.0(@intlify/shared@11.1.3)(@vue/compiler-dom@3.5.13)(vue-i18n@11.1.2(vue@3.5.13(typescript@5.6.3)))(vue@3.5.13(typescript@5.6.3))
'@rollup/pluginutils': 5.1.4(rollup@4.40.1)
'@typescript-eslint/scope-manager': 8.21.0
'@typescript-eslint/typescript-estree': 8.21.0(typescript@5.6.3)
debug: 4.4.0
@@ -3636,11 +3659,11 @@ snapshots:
- supports-color
- typescript
'@intlify/vue-i18n-extensions@8.0.0(@intlify/shared@11.1.2)(@vue/compiler-dom@3.5.13)(vue-i18n@11.1.2(vue@3.5.13(typescript@5.6.3)))(vue@3.5.13(typescript@5.6.3))':
'@intlify/vue-i18n-extensions@8.0.0(@intlify/shared@11.1.3)(@vue/compiler-dom@3.5.13)(vue-i18n@11.1.2(vue@3.5.13(typescript@5.6.3)))(vue@3.5.13(typescript@5.6.3))':
dependencies:
'@babel/parser': 7.26.7
optionalDependencies:
'@intlify/shared': 11.1.2
'@intlify/shared': 11.1.3
'@vue/compiler-dom': 3.5.13
vue: 3.5.13(typescript@5.6.3)
vue-i18n: 11.1.2(vue@3.5.13(typescript@5.6.3))
@@ -3691,83 +3714,88 @@ snapshots:
dependencies:
playwright: 1.50.0
'@rollup/pluginutils@5.1.3(rollup@4.32.0)':
'@rollup/pluginutils@5.1.3(rollup@4.40.1)':
dependencies:
'@types/estree': 1.0.6
estree-walker: 2.0.2
picomatch: 4.0.2
optionalDependencies:
rollup: 4.32.0
rollup: 4.40.1
'@rollup/pluginutils@5.1.4(rollup@4.32.0)':
'@rollup/pluginutils@5.1.4(rollup@4.40.1)':
dependencies:
'@types/estree': 1.0.6
estree-walker: 2.0.2
picomatch: 4.0.2
optionalDependencies:
rollup: 4.32.0
rollup: 4.40.1
'@rollup/rollup-android-arm-eabi@4.32.0':
'@rollup/rollup-android-arm-eabi@4.40.1':
optional: true
'@rollup/rollup-android-arm64@4.32.0':
'@rollup/rollup-android-arm64@4.40.1':
optional: true
'@rollup/rollup-darwin-arm64@4.32.0':
'@rollup/rollup-darwin-arm64@4.40.1':
optional: true
'@rollup/rollup-darwin-x64@4.32.0':
'@rollup/rollup-darwin-x64@4.40.1':
optional: true
'@rollup/rollup-freebsd-arm64@4.32.0':
'@rollup/rollup-freebsd-arm64@4.40.1':
optional: true
'@rollup/rollup-freebsd-x64@4.32.0':
'@rollup/rollup-freebsd-x64@4.40.1':
optional: true
'@rollup/rollup-linux-arm-gnueabihf@4.32.0':
'@rollup/rollup-linux-arm-gnueabihf@4.40.1':
optional: true
'@rollup/rollup-linux-arm-musleabihf@4.32.0':
'@rollup/rollup-linux-arm-musleabihf@4.40.1':
optional: true
'@rollup/rollup-linux-arm64-gnu@4.32.0':
'@rollup/rollup-linux-arm64-gnu@4.40.1':
optional: true
'@rollup/rollup-linux-arm64-musl@4.32.0':
'@rollup/rollup-linux-arm64-musl@4.40.1':
optional: true
'@rollup/rollup-linux-loongarch64-gnu@4.32.0':
'@rollup/rollup-linux-loongarch64-gnu@4.40.1':
optional: true
'@rollup/rollup-linux-powerpc64le-gnu@4.32.0':
'@rollup/rollup-linux-powerpc64le-gnu@4.40.1':
optional: true
'@rollup/rollup-linux-riscv64-gnu@4.32.0':
'@rollup/rollup-linux-riscv64-gnu@4.40.1':
optional: true
'@rollup/rollup-linux-s390x-gnu@4.32.0':
'@rollup/rollup-linux-riscv64-musl@4.40.1':
optional: true
'@rollup/rollup-linux-x64-gnu@4.32.0':
'@rollup/rollup-linux-s390x-gnu@4.40.1':
optional: true
'@rollup/rollup-linux-x64-musl@4.32.0':
'@rollup/rollup-linux-x64-gnu@4.40.1':
optional: true
'@rollup/rollup-win32-arm64-msvc@4.32.0':
'@rollup/rollup-linux-x64-musl@4.40.1':
optional: true
'@rollup/rollup-win32-ia32-msvc@4.32.0':
'@rollup/rollup-win32-arm64-msvc@4.40.1':
optional: true
'@rollup/rollup-win32-x64-msvc@4.32.0':
'@rollup/rollup-win32-ia32-msvc@4.40.1':
optional: true
'@rollup/rollup-win32-x64-msvc@4.40.1':
optional: true
'@tsconfig/node22@22.0.0': {}
'@types/estree@1.0.6': {}
'@types/estree@1.0.7': {}
'@types/json-schema@7.0.15': {}
'@types/localforage@0.0.34':
@@ -3885,7 +3913,7 @@ snapshots:
global: 4.4.0
is-function: 1.0.2
'@vitejs/plugin-legacy@6.0.0(terser@5.37.0)(vite@6.0.11(@types/node@22.10.10)(terser@5.37.0)(yaml@2.7.0))':
'@vitejs/plugin-legacy@6.0.0(terser@5.37.0)(vite@6.1.6(@types/node@22.10.10)(terser@5.37.0)(yaml@2.7.0))':
dependencies:
'@babel/core': 7.26.0
'@babel/preset-env': 7.26.0(@babel/core@7.26.0)
@@ -3896,13 +3924,13 @@ snapshots:
regenerator-runtime: 0.14.1
systemjs: 6.15.1
terser: 5.37.0
vite: 6.0.11(@types/node@22.10.10)(terser@5.37.0)(yaml@2.7.0)
vite: 6.1.6(@types/node@22.10.10)(terser@5.37.0)(yaml@2.7.0)
transitivePeerDependencies:
- supports-color
'@vitejs/plugin-vue@5.2.1(vite@6.0.11(@types/node@22.10.10)(terser@5.37.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.6.3))':
'@vitejs/plugin-vue@5.2.1(vite@6.1.6(@types/node@22.10.10)(terser@5.37.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.6.3))':
dependencies:
vite: 6.0.11(@types/node@22.10.10)(terser@5.37.0)(yaml@2.7.0)
vite: 6.1.6(@types/node@22.10.10)(terser@5.37.0)(yaml@2.7.0)
vue: 3.5.13(typescript@5.6.3)
'@volar/language-core@2.4.11':
@@ -3939,7 +3967,7 @@ snapshots:
'@vue/shared': 3.5.13
estree-walker: 2.0.2
magic-string: 0.30.14
postcss: 8.5.1
postcss: 8.5.3
source-map-js: 1.2.1
'@vue/compiler-ssr@3.5.13':
@@ -4805,6 +4833,8 @@ snapshots:
'@babel/runtime': 7.26.7
global: 4.4.0
nanoid@3.3.11: {}
nanoid@3.3.8: {}
natural-compare@1.4.0: {}
@@ -4911,6 +4941,12 @@ snapshots:
picocolors: 1.1.1
source-map-js: 1.2.1
postcss@8.5.3:
dependencies:
nanoid: 3.3.11
picocolors: 1.1.1
source-map-js: 1.2.1
prelude-ls@1.2.1: {}
prettier-linter-helpers@1.0.0:
@@ -4994,29 +5030,30 @@ snapshots:
reusify@1.0.4: {}
rollup@4.32.0:
rollup@4.40.1:
dependencies:
'@types/estree': 1.0.6
'@types/estree': 1.0.7
optionalDependencies:
'@rollup/rollup-android-arm-eabi': 4.32.0
'@rollup/rollup-android-arm64': 4.32.0
'@rollup/rollup-darwin-arm64': 4.32.0
'@rollup/rollup-darwin-x64': 4.32.0
'@rollup/rollup-freebsd-arm64': 4.32.0
'@rollup/rollup-freebsd-x64': 4.32.0
'@rollup/rollup-linux-arm-gnueabihf': 4.32.0
'@rollup/rollup-linux-arm-musleabihf': 4.32.0
'@rollup/rollup-linux-arm64-gnu': 4.32.0
'@rollup/rollup-linux-arm64-musl': 4.32.0
'@rollup/rollup-linux-loongarch64-gnu': 4.32.0
'@rollup/rollup-linux-powerpc64le-gnu': 4.32.0
'@rollup/rollup-linux-riscv64-gnu': 4.32.0
'@rollup/rollup-linux-s390x-gnu': 4.32.0
'@rollup/rollup-linux-x64-gnu': 4.32.0
'@rollup/rollup-linux-x64-musl': 4.32.0
'@rollup/rollup-win32-arm64-msvc': 4.32.0
'@rollup/rollup-win32-ia32-msvc': 4.32.0
'@rollup/rollup-win32-x64-msvc': 4.32.0
'@rollup/rollup-android-arm-eabi': 4.40.1
'@rollup/rollup-android-arm64': 4.40.1
'@rollup/rollup-darwin-arm64': 4.40.1
'@rollup/rollup-darwin-x64': 4.40.1
'@rollup/rollup-freebsd-arm64': 4.40.1
'@rollup/rollup-freebsd-x64': 4.40.1
'@rollup/rollup-linux-arm-gnueabihf': 4.40.1
'@rollup/rollup-linux-arm-musleabihf': 4.40.1
'@rollup/rollup-linux-arm64-gnu': 4.40.1
'@rollup/rollup-linux-arm64-musl': 4.40.1
'@rollup/rollup-linux-loongarch64-gnu': 4.40.1
'@rollup/rollup-linux-powerpc64le-gnu': 4.40.1
'@rollup/rollup-linux-riscv64-gnu': 4.40.1
'@rollup/rollup-linux-riscv64-musl': 4.40.1
'@rollup/rollup-linux-s390x-gnu': 4.40.1
'@rollup/rollup-linux-x64-gnu': 4.40.1
'@rollup/rollup-linux-x64-musl': 4.40.1
'@rollup/rollup-win32-arm64-msvc': 4.40.1
'@rollup/rollup-win32-ia32-msvc': 4.40.1
'@rollup/rollup-win32-x64-msvc': 4.40.1
fsevents: 2.3.3
rrweb-cssom@0.8.0: {}
@@ -5238,19 +5275,19 @@ snapshots:
dependencies:
global: 4.4.0
vite-plugin-compression2@1.3.3(rollup@4.32.0)(vite@6.0.11(@types/node@22.10.10)(terser@5.37.0)(yaml@2.7.0)):
vite-plugin-compression2@1.3.3(rollup@4.40.1)(vite@6.1.6(@types/node@22.10.10)(terser@5.37.0)(yaml@2.7.0)):
dependencies:
'@rollup/pluginutils': 5.1.3(rollup@4.32.0)
'@rollup/pluginutils': 5.1.3(rollup@4.40.1)
tar-mini: 0.2.0
vite: 6.0.11(@types/node@22.10.10)(terser@5.37.0)(yaml@2.7.0)
vite: 6.1.6(@types/node@22.10.10)(terser@5.37.0)(yaml@2.7.0)
transitivePeerDependencies:
- rollup
vite@6.0.11(@types/node@22.10.10)(terser@5.37.0)(yaml@2.7.0):
vite@6.1.6(@types/node@22.10.10)(terser@5.37.0)(yaml@2.7.0):
dependencies:
esbuild: 0.24.2
postcss: 8.5.1
rollup: 4.32.0
postcss: 8.5.3
rollup: 4.40.1
optionalDependencies:
'@types/node': 22.10.10
fsevents: 2.3.3

View File

@@ -1,6 +1,6 @@
module github.com/filebrowser/filebrowser/v2
go 1.23
go 1.23.0
require (
github.com/asdine/storm/v3 v3.2.1
@@ -24,9 +24,9 @@ require (
github.com/stretchr/testify v1.9.0
github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce
go.etcd.io/bbolt v1.3.11
golang.org/x/crypto v0.31.0
golang.org/x/crypto v0.36.0
golang.org/x/image v0.19.0
golang.org/x/text v0.21.0
golang.org/x/text v0.23.0
gopkg.in/natefinch/lumberjack.v2 v2.2.1
gopkg.in/yaml.v2 v2.4.0
)
@@ -64,8 +64,8 @@ require (
github.com/yusufpapurcu/wmi v1.2.4 // indirect
go.uber.org/multierr v1.11.0 // indirect
golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 // indirect
golang.org/x/net v0.33.0 // indirect
golang.org/x/sys v0.28.0 // indirect
golang.org/x/net v0.38.0 // indirect
golang.org/x/sys v0.31.0 // indirect
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect

View File

@@ -174,8 +174,8 @@ go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34=
golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc=
golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 h1:aAcj0Da7eBAtrTp03QXWvm88pSyOt+UgdZw2BFZ+lEw=
golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8/go.mod h1:CQ1k9gNrJ50XIzaKCRR2hssIjF07kZFEiieALBM/ARQ=
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
@@ -190,10 +190,10 @@ golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/
golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20221002022538-bcab6841153b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=
golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=
golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw=
golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -204,14 +204,14 @@ golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220928140112-f11e5e49a4ec/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik=
golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=
golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=

View File

@@ -1,2 +1,2 @@
LINUX_VERSION-6.12 = .28
LINUX_KERNEL_HASH-6.12.28 = e8a099182562aecff781de72ce769461e706d97af42d740dff20eb450dd5771e
LINUX_VERSION-6.12 = .29
LINUX_KERNEL_HASH-6.12.29 = e8b2ec7e2338ccb9c86de7154f6edcaadfce80907493c143e85a82776bb5064d

View File

@@ -2,7 +2,7 @@
+++ b/include/linux/netdevice.h
@@ -2224,12 +2224,8 @@ struct net_device {
#if IS_ENABLED(CONFIG_AX25)
void *ax25_ptr;
struct ax25_dev __rcu *ax25_ptr;
#endif
-#if IS_ENABLED(CONFIG_CFG80211)
struct wireless_dev *ieee80211_ptr;
@@ -93,7 +93,7 @@
error = device_add(dev);
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -1080,6 +1080,8 @@ enum {
@@ -1082,6 +1082,8 @@ enum {
#define PCI_IRQ_MSIX (1 << 2) /* Allow MSI-X interrupts */
#define PCI_IRQ_AFFINITY (1 << 3) /* Auto-assign affinity */
@@ -102,7 +102,7 @@
/* These external functions are only available when PCI support is enabled */
#ifdef CONFIG_PCI
@@ -1645,7 +1647,8 @@ int pci_set_vga_state(struct pci_dev *pd
@@ -1647,7 +1649,8 @@ int pci_set_vga_state(struct pci_dev *pd
*/
#define PCI_IRQ_VIRTUAL (1 << 4)
@@ -112,7 +112,7 @@
#include <linux/dmapool.h>
@@ -1708,7 +1711,7 @@ pci_alloc_irq_vectors_affinity(struct pc
@@ -1710,7 +1713,7 @@ pci_alloc_irq_vectors_affinity(struct pc
unsigned int max_vecs, unsigned int flags,
struct irq_affinity *aff_desc)
{

View File

@@ -59,7 +59,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
#endif
--- a/arch/arm/include/asm/vmlinux.lds.h
+++ b/arch/arm/include/asm/vmlinux.lds.h
@@ -48,7 +48,7 @@
@@ -54,7 +54,7 @@
#define IDMAP_TEXT \
ALIGN_FUNCTION(); \
__idmap_text_start = .; \
@@ -68,7 +68,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
__idmap_text_end = .; \
#define ARM_DISCARD \
@@ -108,12 +108,12 @@
@@ -114,12 +114,12 @@
. = ALIGN(8); \
.ARM.unwind_idx : { \
__start_unwind_idx = .; \
@@ -83,7 +83,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
__stop_unwind_tab = .; \
}
@@ -143,7 +143,7 @@
@@ -149,7 +149,7 @@
\
__stubs_lma = .; \
.stubs ADDR(.vectors) + 0x1000 : AT(__stubs_lma) { \

View File

@@ -1,6 +1,6 @@
--- a/init/Kconfig
+++ b/init/Kconfig
@@ -2043,7 +2043,7 @@ config PADATA
@@ -2051,7 +2051,7 @@ config PADATA
bool
config ASN1

View File

@@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
@@ -1133,6 +1133,10 @@ config MIPS_MSC
@@ -1132,6 +1132,10 @@ config MIPS_MSC
config SYNC_R4K
bool

View File

@@ -1,6 +1,6 @@
--- a/block/blk.h
+++ b/block/blk.h
@@ -564,6 +564,8 @@ void blk_free_ext_minor(unsigned int min
@@ -555,6 +555,8 @@ void blk_free_ext_minor(unsigned int min
#define ADDPART_FLAG_NONE 0
#define ADDPART_FLAG_RAID 1
#define ADDPART_FLAG_WHOLEDISK 2

View File

@@ -22,7 +22,7 @@ Signed-off-by: David Bauer <mail@david-bauer.net>
#include <linux/crc32.h>
#include <linux/if_vlan.h>
#include <linux/uaccess.h>
@@ -7046,6 +7047,22 @@ static void rtl_tally_reset(struct r8152
@@ -7047,6 +7048,22 @@ static void rtl_tally_reset(struct r8152
ocp_write_word(tp, MCU_TYPE_PLA, PLA_RSTTALLY, ocp_data);
}
@@ -45,7 +45,7 @@ Signed-off-by: David Bauer <mail@david-bauer.net>
static void r8152b_init(struct r8152 *tp)
{
u32 ocp_data;
@@ -7087,6 +7104,8 @@ static void r8152b_init(struct r8152 *tp
@@ -7088,6 +7105,8 @@ static void r8152b_init(struct r8152 *tp
ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_USB_CTRL);
ocp_data &= ~(RX_AGG_DISABLE | RX_ZERO_EN);
ocp_write_word(tp, MCU_TYPE_USB, USB_USB_CTRL, ocp_data);
@@ -54,7 +54,7 @@ Signed-off-by: David Bauer <mail@david-bauer.net>
}
static void r8153_init(struct r8152 *tp)
@@ -7227,6 +7246,8 @@ static void r8153_init(struct r8152 *tp)
@@ -7228,6 +7247,8 @@ static void r8153_init(struct r8152 *tp)
tp->coalesce = COALESCE_SLOW;
break;
}
@@ -63,7 +63,7 @@ Signed-off-by: David Bauer <mail@david-bauer.net>
}
static void r8153b_init(struct r8152 *tp)
@@ -7309,6 +7330,8 @@ static void r8153b_init(struct r8152 *tp
@@ -7310,6 +7331,8 @@ static void r8153b_init(struct r8152 *tp
rtl_tally_reset(tp);
tp->coalesce = 15000; /* 15 us */

View File

@@ -78,7 +78,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
netif_napi_del(&bgmac->napi);
--- a/drivers/net/ethernet/broadcom/bgmac.h
+++ b/drivers/net/ethernet/broadcom/bgmac.h
@@ -388,6 +388,7 @@
@@ -387,6 +387,7 @@
#define BGMAC_FEAT_CC4_IF_SW_TYPE_RGMII BIT(18)
#define BGMAC_FEAT_CC7_IF_TYPE_RGMII BIT(19)
#define BGMAC_FEAT_IDM_MASK BIT(20)
@@ -86,7 +86,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
struct bgmac_slot_info {
union {
@@ -495,6 +496,9 @@ struct bgmac {
@@ -494,6 +495,9 @@ struct bgmac {
void (*cmn_maskset32)(struct bgmac *bgmac, u16 offset, u32 mask,
u32 set);
int (*phy_connect)(struct bgmac *bgmac);

View File

@@ -19,7 +19,7 @@
#define QUECTEL_VENDOR_ID 0x2c7c
/* These Quectel products use Quectel's vendor ID */
@@ -1201,6 +1203,11 @@ static const struct usb_device_id option
@@ -1195,6 +1197,11 @@ static const struct usb_device_id option
.driver_info = ZLP },
{ USB_DEVICE(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_BG96),
.driver_info = RSVD(4) },

View File

@@ -13,7 +13,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
--- a/drivers/net/usb/rndis_host.c
+++ b/drivers/net/usb/rndis_host.c
@@ -640,6 +640,16 @@ static const struct driver_info zte_rndi
@@ -630,6 +630,16 @@ static const struct driver_info zte_rndi
.tx_fixup = rndis_tx_fixup,
};
@@ -30,11 +30,10 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
/*-------------------------------------------------------------------------*/
static const struct usb_device_id products [] = {
@@ -675,6 +685,36 @@ static const struct usb_device_id produc
/* RNDIS for tethering */
@@ -666,6 +676,36 @@ static const struct usb_device_id produc
USB_INTERFACE_INFO(USB_CLASS_WIRELESS_CONTROLLER, 1, 3),
.driver_info = (unsigned long) &rndis_info,
+}, {
}, {
+ /* Quectel EG060V rndis device */
+ USB_DEVICE_AND_INTERFACE_INFO(0x2c7c, 0x6004,
+ USB_CLASS_WIRELESS_CONTROLLER, 1, 3),
@@ -64,6 +63,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
+ USB_DEVICE_AND_INTERFACE_INFO(0x2dee, 0x4d49,
+ USB_CLASS_WIRELESS_CONTROLLER, 1, 3),
+ .driver_info = (unsigned long) &asr_rndis_info,
}, {
/* Mobile Broadband Modem, seen in Novatel Verizon USB730L and
* Telit FN990A (RNDIS)
+}, {
/* Novatel Verizon USB730L */
USB_INTERFACE_INFO(USB_CLASS_MISC, 4, 1),
.driver_info = (unsigned long) &rndis_info,

View File

@@ -15,7 +15,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
#include "gpiolib.h"
#include "gpiolib-of.h"
@@ -1187,3 +1189,73 @@ void of_gpiochip_remove(struct gpio_chip
@@ -1189,3 +1191,73 @@ void of_gpiochip_remove(struct gpio_chip
{
of_node_put(dev_of_node(&chip->gpiodev->dev));
}

View File

@@ -319,7 +319,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -4229,6 +4229,8 @@ static __net_initdata struct pernet_oper
@@ -4237,6 +4237,8 @@ static __net_initdata struct pernet_oper
static int __init proto_init(void)
{

View File

@@ -73,7 +73,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
+MODULE_LICENSE("GPL");
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -4419,6 +4419,7 @@ int wake_up_state(struct task_struct *p,
@@ -4422,6 +4422,7 @@ int wake_up_state(struct task_struct *p,
{
return try_to_wake_up(p, state, 0);
}

View File

@@ -1,6 +1,6 @@
--- a/drivers/of/fdt.c
+++ b/drivers/of/fdt.c
@@ -1052,6 +1052,9 @@ int __init early_init_dt_scan_chosen(cha
@@ -1049,6 +1049,9 @@ int __init early_init_dt_scan_chosen(cha
p = of_get_flat_dt_prop(node, "bootargs", &l);
if (p != NULL && l > 0)
strscpy(cmdline, p, min(l, COMMAND_LINE_SIZE));

View File

@@ -123,7 +123,7 @@ Signed-off-by: Zhi Chen <zhichen@codeaurora.org>
depends on NETFILTER_ADVANCED
--- a/net/netfilter/nf_conntrack_core.c
+++ b/net/netfilter/nf_conntrack_core.c
@@ -2750,6 +2750,10 @@ int nf_conntrack_init_net(struct net *ne
@@ -2753,6 +2753,10 @@ int nf_conntrack_init_net(struct net *ne
nf_conntrack_ecache_pernet_init(net);
nf_conntrack_proto_pernet_init(net);

View File

@@ -78,7 +78,7 @@
struct net_bridge_port *p;
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -3579,9 +3579,17 @@ static int xmit_one(struct sk_buff *skb,
@@ -3642,9 +3642,17 @@ static int xmit_one(struct sk_buff *skb,
{
unsigned int len;
int rc;
@@ -97,7 +97,7 @@
len = skb->len;
trace_net_dev_start_xmit(skb, dev);
@@ -5417,6 +5425,11 @@ void netdev_rx_handler_unregister(struct
@@ -5488,6 +5496,11 @@ void netdev_rx_handler_unregister(struct
}
EXPORT_SYMBOL_GPL(netdev_rx_handler_unregister);
@@ -109,7 +109,7 @@
/*
* Limit the use of PFMEMALLOC reserves to those protocols that implement
* the special handling of PFMEMALLOC skbs.
@@ -5465,6 +5478,10 @@ static int __netif_receive_skb_core(stru
@@ -5536,6 +5549,10 @@ static int __netif_receive_skb_core(stru
int ret = NET_RX_DROP;
__be16 type;
@@ -120,7 +120,7 @@
net_timestamp_check(!READ_ONCE(net_hotdata.tstamp_prequeue), skb);
trace_netif_receive_skb(skb);
@@ -5503,6 +5520,15 @@ another_round:
@@ -5574,6 +5591,15 @@ another_round:
goto out;
}

View File

@@ -88,7 +88,7 @@ This reverts commit bffcc6882a1bb2be8c9420184966f4c2c822078e.
genl_info_net_set(&info, net);
--- a/net/openvswitch/conntrack.c
+++ b/net/openvswitch/conntrack.c
@@ -1642,7 +1642,7 @@ static struct sk_buff *
@@ -1637,7 +1637,7 @@ static struct sk_buff *
ovs_ct_limit_cmd_reply_start(struct genl_info *info, u8 cmd,
struct ovs_header **ovs_reply_header)
{
@@ -183,7 +183,7 @@ This reverts commit bffcc6882a1bb2be8c9420184966f4c2c822078e.
if (IS_ERR(dp)) {
err = PTR_ERR(dp);
goto err_unlock_free;
@@ -2248,7 +2245,7 @@ static void ovs_update_headroom(struct d
@@ -2254,7 +2251,7 @@ static void ovs_update_headroom(struct d
static int ovs_vport_cmd_new(struct sk_buff *skb, struct genl_info *info)
{
struct nlattr **a = info->attrs;
@@ -192,7 +192,7 @@ This reverts commit bffcc6882a1bb2be8c9420184966f4c2c822078e.
struct vport_parms parms;
struct sk_buff *reply;
struct vport *vport;
@@ -2350,7 +2347,7 @@ static int ovs_vport_cmd_set(struct sk_b
@@ -2356,7 +2353,7 @@ static int ovs_vport_cmd_set(struct sk_b
return -ENOMEM;
ovs_lock();
@@ -201,7 +201,7 @@ This reverts commit bffcc6882a1bb2be8c9420184966f4c2c822078e.
err = PTR_ERR(vport);
if (IS_ERR(vport))
goto exit_unlock_free;
@@ -2406,7 +2403,7 @@ static int ovs_vport_cmd_del(struct sk_b
@@ -2412,7 +2409,7 @@ static int ovs_vport_cmd_del(struct sk_b
return -ENOMEM;
ovs_lock();
@@ -210,7 +210,7 @@ This reverts commit bffcc6882a1bb2be8c9420184966f4c2c822078e.
err = PTR_ERR(vport);
if (IS_ERR(vport))
goto exit_unlock_free;
@@ -2449,7 +2446,7 @@ exit_unlock_free:
@@ -2455,7 +2452,7 @@ exit_unlock_free:
static int ovs_vport_cmd_get(struct sk_buff *skb, struct genl_info *info)
{
struct nlattr **a = info->attrs;

View File

@@ -44,7 +44,7 @@
#endif /* _LINUX_U64_STATS_SYNC_H */
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -2996,6 +2996,8 @@ int call_netdevice_notifiers(unsigned lo
@@ -3002,6 +3002,8 @@ int call_netdevice_notifiers(unsigned lo
int call_netdevice_notifiers_info(unsigned long val,
struct netdev_notifier_info *info);
@@ -109,7 +109,7 @@
dev_base_seq_inc(dev_net(dev));
}
@@ -758,9 +784,9 @@ EXPORT_SYMBOL_GPL(dev_fill_forward_path)
@@ -788,9 +814,9 @@ struct napi_struct *netdev_napi_by_id(st
* @net: the applicable net namespace
* @name: name to find
*
@@ -122,7 +122,7 @@
* reference counters are not incremented so the caller must be
* careful with locks.
*/
@@ -841,7 +867,8 @@ EXPORT_SYMBOL(netdev_get_by_name);
@@ -871,7 +897,8 @@ EXPORT_SYMBOL(netdev_get_by_name);
* Search for an interface by index. Returns %NULL if the device
* is not found or a pointer to the device. The device has not
* had its reference counter increased so the caller must be careful
@@ -132,7 +132,7 @@
*/
struct net_device *__dev_get_by_index(struct net *net, int ifindex)
@@ -1259,11 +1286,15 @@ rollback:
@@ -1322,11 +1349,15 @@ rollback:
netdev_adjacent_rename_links(dev, oldname);

View File

@@ -11,7 +11,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
--- a/include/linux/compiler.h
+++ b/include/linux/compiler.h
@@ -214,6 +214,8 @@ void ftrace_likely_update(struct ftrace_
@@ -191,6 +191,8 @@ void ftrace_likely_update(struct ftrace_
__v; \
})
@@ -20,7 +20,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
#endif /* __KERNEL__ */
/**
@@ -329,6 +331,4 @@ static inline void *offset_to_ptr(const
@@ -306,6 +308,4 @@ static inline void *offset_to_ptr(const
*/
#define prevent_tail_call_optimization() mb()

View File

@@ -19,7 +19,7 @@ Acked-by: Rob Landley <rob@landley.net>
config CEVT_BCM1480
bool
@@ -2991,6 +2988,18 @@ choice
@@ -2990,6 +2987,18 @@ choice
bool "Extend builtin kernel arguments with bootloader arguments"
endchoice

View File

@@ -22,7 +22,7 @@ Link: https://bugzilla.kernel.org/show_bug.cgi?id=109581
--- a/net/sched/sch_codel.c
+++ b/net/sched/sch_codel.c
@@ -95,8 +95,17 @@ static struct sk_buff *codel_qdisc_deque
@@ -65,8 +65,17 @@ static struct sk_buff *codel_qdisc_deque
&q->stats, qdisc_pkt_len, codel_get_enqueue_time,
drop_func, dequeue_func);

View File

@@ -157,7 +157,7 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
case RTN_THROW:
case RTN_UNREACHABLE:
default:
@@ -4597,6 +4616,17 @@ static int ip6_pkt_prohibit_out(struct n
@@ -4598,6 +4617,17 @@ static int ip6_pkt_prohibit_out(struct n
return ip6_pkt_drop(skb, ICMPV6_ADM_PROHIBITED, IPSTATS_MIB_OUTNOROUTES);
}
@@ -175,7 +175,7 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
/*
* Allocate a dst for local (unicast / anycast) address.
*/
@@ -5088,7 +5118,8 @@ static int rtm_to_fib6_config(struct sk_
@@ -5089,7 +5119,8 @@ static int rtm_to_fib6_config(struct sk_
if (rtm->rtm_type == RTN_UNREACHABLE ||
rtm->rtm_type == RTN_BLACKHOLE ||
rtm->rtm_type == RTN_PROHIBIT ||
@@ -185,7 +185,7 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
cfg->fc_flags |= RTF_REJECT;
if (rtm->rtm_type == RTN_LOCAL)
@@ -6348,6 +6379,8 @@ static int ip6_route_dev_notify(struct n
@@ -6349,6 +6380,8 @@ static int ip6_route_dev_notify(struct n
#ifdef CONFIG_IPV6_MULTIPLE_TABLES
net->ipv6.ip6_prohibit_entry->dst.dev = dev;
net->ipv6.ip6_prohibit_entry->rt6i_idev = in6_dev_get(dev);
@@ -194,7 +194,7 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
net->ipv6.ip6_blk_hole_entry->dst.dev = dev;
net->ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(dev);
#endif
@@ -6359,6 +6392,7 @@ static int ip6_route_dev_notify(struct n
@@ -6360,6 +6393,7 @@ static int ip6_route_dev_notify(struct n
in6_dev_put_clear(&net->ipv6.ip6_null_entry->rt6i_idev);
#ifdef CONFIG_IPV6_MULTIPLE_TABLES
in6_dev_put_clear(&net->ipv6.ip6_prohibit_entry->rt6i_idev);
@@ -202,7 +202,7 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
in6_dev_put_clear(&net->ipv6.ip6_blk_hole_entry->rt6i_idev);
#endif
}
@@ -6554,6 +6588,8 @@ static int __net_init ip6_route_net_init
@@ -6555,6 +6589,8 @@ static int __net_init ip6_route_net_init
#ifdef CONFIG_IPV6_MULTIPLE_TABLES
net->ipv6.fib6_has_custom_rules = false;
@@ -211,7 +211,7 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
net->ipv6.ip6_prohibit_entry = kmemdup(&ip6_prohibit_entry_template,
sizeof(*net->ipv6.ip6_prohibit_entry),
GFP_KERNEL);
@@ -6564,11 +6600,21 @@ static int __net_init ip6_route_net_init
@@ -6565,11 +6601,21 @@ static int __net_init ip6_route_net_init
ip6_template_metrics, true);
INIT_LIST_HEAD(&net->ipv6.ip6_prohibit_entry->dst.rt_uncached);
@@ -234,7 +234,7 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
net->ipv6.ip6_blk_hole_entry->dst.ops = &net->ipv6.ip6_dst_ops;
dst_init_metrics(&net->ipv6.ip6_blk_hole_entry->dst,
ip6_template_metrics, true);
@@ -6595,6 +6641,8 @@ out:
@@ -6596,6 +6642,8 @@ out:
return ret;
#ifdef CONFIG_IPV6_MULTIPLE_TABLES
@@ -243,7 +243,7 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
out_ip6_prohibit_entry:
kfree(net->ipv6.ip6_prohibit_entry);
out_ip6_null_entry:
@@ -6614,6 +6662,7 @@ static void __net_exit ip6_route_net_exi
@@ -6615,6 +6663,7 @@ static void __net_exit ip6_route_net_exi
kfree(net->ipv6.ip6_null_entry);
#ifdef CONFIG_IPV6_MULTIPLE_TABLES
kfree(net->ipv6.ip6_prohibit_entry);
@@ -251,7 +251,7 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
kfree(net->ipv6.ip6_blk_hole_entry);
#endif
dst_entries_destroy(&net->ipv6.ip6_dst_ops);
@@ -6697,6 +6746,9 @@ void __init ip6_route_init_special_entri
@@ -6698,6 +6747,9 @@ void __init ip6_route_init_special_entri
init_net.ipv6.ip6_prohibit_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev);
init_net.ipv6.ip6_blk_hole_entry->dst.dev = init_net.loopback_dev;
init_net.ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev);

View File

@@ -11,7 +11,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
--- a/drivers/net/phy/phy_device.c
+++ b/drivers/net/phy/phy_device.c
@@ -1986,6 +1986,9 @@ void phy_detach(struct phy_device *phyde
@@ -2013,6 +2013,9 @@ void phy_detach(struct phy_device *phyde
if (phydev->devlink)
device_link_del(phydev->devlink);

View File

@@ -17,7 +17,7 @@ Signed-off-by: Tobias Waldekranz <tobias@waldekranz.com>
--- a/drivers/net/dsa/mv88e6xxx/chip.c
+++ b/drivers/net/dsa/mv88e6xxx/chip.c
@@ -7135,6 +7135,7 @@ static int mv88e6xxx_register_switch(str
@@ -7209,6 +7209,7 @@ static int mv88e6xxx_register_switch(str
ds->phylink_mac_ops = &mv88e6xxx_phylink_mac_ops;
ds->ageing_time_min = chip->info->age_time_coeff;
ds->ageing_time_max = chip->info->age_time_coeff * U8_MAX;

View File

@@ -13,7 +13,7 @@ Signed-off-by: Imre Kaloz <kaloz@openwrt.org>
--- a/init/Kconfig
+++ b/init/Kconfig
@@ -1868,6 +1868,15 @@ config ARCH_HAS_MEMBARRIER_CALLBACKS
@@ -1876,6 +1876,15 @@ config ARCH_HAS_MEMBARRIER_CALLBACKS
config ARCH_HAS_MEMBARRIER_SYNC_CORE
bool

View File

@@ -4,11 +4,9 @@ Signed-off-by: Michael Riesch <michael.riesch@wolfvision.net>
drivers/clk/rockchip/clk-rk3568.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/clk/rockchip/clk-rk3568.c b/drivers/clk/rockchip/clk-rk3568.c
index 53d10b1c627b..7d9279291e76 100644
--- a/drivers/clk/rockchip/clk-rk3568.c
+++ b/drivers/clk/rockchip/clk-rk3568.c
@@ -1602,6 +1602,7 @@ static const char *const rk3568_cru_critical_clocks[] __initconst = {
@@ -1602,6 +1602,7 @@ static const char *const rk3568_cru_crit
"pclk_php",
"hclk_usb",
"pclk_usb",
@@ -16,5 +14,3 @@ index 53d10b1c627b..7d9279291e76 100644
"hclk_vo",
};
---

View File

@@ -16,7 +16,7 @@ Signed-off-by: Vinod Koul <vkoul@kernel.org>
--- a/drivers/phy/rockchip/phy-rockchip-usbdp.c
+++ b/drivers/phy/rockchip/phy-rockchip-usbdp.c
@@ -1538,6 +1538,43 @@ static const char * const rk_udphy_rst_l
@@ -1537,6 +1537,43 @@ static const char * const rk_udphy_rst_l
"init", "cmn", "lane", "pcs_apb", "pma_apb"
};
@@ -60,7 +60,7 @@ Signed-off-by: Vinod Koul <vkoul@kernel.org>
static const struct rk_udphy_cfg rk3588_udphy_cfgs = {
.num_phys = 2,
.phy_ids = {
@@ -1585,6 +1622,10 @@ static const struct rk_udphy_cfg rk3588_
@@ -1584,6 +1621,10 @@ static const struct rk_udphy_cfg rk3588_
static const struct of_device_id rk_udphy_dt_match[] = {
{

View File

@@ -18,7 +18,7 @@
rockchip,grf = <&grf>;
--- a/arch/arm64/boot/dts/rockchip/rk356x.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk356x.dtsi
@@ -417,6 +417,12 @@
@@ -422,6 +422,12 @@
status = "disabled";
};

View File

@@ -95,7 +95,7 @@ v1:
struct combphy_reg pipe_clk_25m;
struct combphy_reg pipe_clk_100m;
struct combphy_reg pipe_phymode_sel;
@@ -584,6 +599,266 @@ static const struct rockchip_combphy_cfg
@@ -587,6 +602,266 @@ static const struct rockchip_combphy_cfg
.combphy_cfg = rk3568_combphy_cfg,
};
@@ -362,7 +362,7 @@ v1:
static int rk3588_combphy_cfg(struct rockchip_combphy_priv *priv)
{
const struct rockchip_combphy_grfcfg *cfg = priv->cfg->grfcfg;
@@ -776,6 +1051,10 @@ static const struct of_device_id rockchi
@@ -779,6 +1054,10 @@ static const struct of_device_id rockchi
.data = &rk3568_combphy_cfgs,
},
{

View File

@@ -62,7 +62,7 @@ Change-Id: Ib5bbb81615fe9fab80f26cdd2098cfb56746ca15
#define RK3568_GRF_TSADC_CON 0x0600
#define RK3568_GRF_TSADC_ANA_REG0 (0x10001 << 0)
#define RK3568_GRF_TSADC_ANA_REG1 (0x10001 << 1)
@@ -497,6 +508,45 @@ static const struct tsadc_table rk3399_c
@@ -498,6 +509,45 @@ static const struct tsadc_table rk3399_c
{TSADCV3_DATA_MASK, 125000},
};
@@ -108,7 +108,7 @@ Change-Id: Ib5bbb81615fe9fab80f26cdd2098cfb56746ca15
static const struct tsadc_table rk3568_code_table[] = {
{0, -40000},
{1584, -40000},
@@ -834,6 +884,37 @@ static void rk_tsadcv8_initialize(struct
@@ -835,6 +885,37 @@ static void rk_tsadcv8_initialize(struct
regs + TSADCV2_AUTO_CON);
}
@@ -146,7 +146,7 @@ Change-Id: Ib5bbb81615fe9fab80f26cdd2098cfb56746ca15
static void rk_tsadcv2_irq_ack(void __iomem *regs)
{
u32 val;
@@ -1258,6 +1339,31 @@ static const struct rockchip_tsadc_chip
@@ -1259,6 +1340,31 @@ static const struct rockchip_tsadc_chip
},
};
@@ -178,7 +178,7 @@ Change-Id: Ib5bbb81615fe9fab80f26cdd2098cfb56746ca15
static const struct rockchip_tsadc_chip rk3568_tsadc_data = {
/* cpu, gpu */
.chn_offset = 0,
@@ -1338,6 +1444,10 @@ static const struct of_device_id of_rock
@@ -1339,6 +1445,10 @@ static const struct of_device_id of_rock
.data = (void *)&rk3399_tsadc_data,
},
{

View File

@@ -36,7 +36,7 @@ Signed-off-by: Jianwei Zheng <jianwei.zheng@rock-chips.com>
struct combphy_reg sgmii_mode_set;
struct combphy_reg qsgmii_mode_set;
struct combphy_reg pipe_rxterm_set;
@@ -393,6 +394,120 @@ static int rockchip_combphy_probe(struct
@@ -396,6 +397,120 @@ static int rockchip_combphy_probe(struct
return PTR_ERR_OR_ZERO(phy_provider);
}
@@ -157,7 +157,7 @@ Signed-off-by: Jianwei Zheng <jianwei.zheng@rock-chips.com>
static int rk3568_combphy_cfg(struct rockchip_combphy_priv *priv)
{
const struct rockchip_combphy_grfcfg *cfg = priv->cfg->grfcfg;
@@ -1047,6 +1162,10 @@ static const struct rockchip_combphy_cfg
@@ -1050,6 +1165,10 @@ static const struct rockchip_combphy_cfg
static const struct of_device_id rockchip_combphy_of_match[] = {
{

View File

@@ -1,6 +1,6 @@
--- a/drivers/pci/controller/dwc/pcie-dw-rockchip.c
+++ b/drivers/pci/controller/dwc/pcie-dw-rockchip.c
@@ -521,9 +521,13 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
@@ -521,9 +521,13 @@ static int rockchip_pcie_probe(struct pl
if (ret)
return ret;

View File

@@ -23,9 +23,6 @@ Changes in v2:
1 file changed, 105 insertions(+)
create mode 100644 Documentation/devicetree/bindings/ufs/rockchip,rk3576-ufshc.yaml
diff --git a/Documentation/devicetree/bindings/ufs/rockchip,rk3576-ufshc.yaml b/Documentation/devicetree/bindings/ufs/rockchip,rk3576-ufshc.yaml
new file mode 100644
index 0000000..7d6c038
--- /dev/null
+++ b/Documentation/devicetree/bindings/ufs/rockchip,rk3576-ufshc.yaml
@@ -0,0 +1,105 @@
@@ -134,5 +131,3 @@ index 0000000..7d6c038
+ reset-gpios = <&gpio4 RK_PD0 GPIO_ACTIVE_LOW>;
+ };
+ };
--
2.7.4

View File

@@ -13,8 +13,6 @@ Changes in v2: None
include/soc/rockchip/rockchip_sip.h | 3 +++
1 file changed, 3 insertions(+)
diff --git a/include/soc/rockchip/rockchip_sip.h b/include/soc/rockchip/rockchip_sip.h
index c46a9ae..501ad1f 100644
--- a/include/soc/rockchip/rockchip_sip.h
+++ b/include/soc/rockchip/rockchip_sip.h
@@ -6,6 +6,9 @@
@@ -27,5 +25,3 @@ index c46a9ae..501ad1f 100644
#define ROCKCHIP_SIP_DRAM_FREQ 0x82000008
#define ROCKCHIP_SIP_CONFIG_DRAM_INIT 0x00
#define ROCKCHIP_SIP_CONFIG_DRAM_SET_RATE 0x01
--
2.7.4

View File

@@ -22,11 +22,9 @@ Changes in v2: None
include/linux/pm_domain.h | 7 +++++++
2 files changed, 41 insertions(+)
diff --git a/drivers/pmdomain/core.c b/drivers/pmdomain/core.c
index 5ede0f7..2ccfcb7 100644
--- a/drivers/pmdomain/core.c
+++ b/drivers/pmdomain/core.c
@@ -692,6 +692,36 @@ bool dev_pm_genpd_get_hwmode(struct device *dev)
@@ -697,6 +697,36 @@ bool dev_pm_genpd_get_hwmode(struct devi
}
EXPORT_SYMBOL_GPL(dev_pm_genpd_get_hwmode);
@@ -63,7 +61,7 @@ index 5ede0f7..2ccfcb7 100644
static int _genpd_power_on(struct generic_pm_domain *genpd, bool timed)
{
unsigned int state_idx = genpd->state_idx;
@@ -863,6 +893,10 @@ static int genpd_power_off(struct generic_pm_domain *genpd, bool one_dev_on,
@@ -868,6 +898,10 @@ static int genpd_power_off(struct generi
if (!pm_runtime_suspended(pdd->dev) ||
irq_safe_dev_in_sleep_domain(pdd->dev, genpd))
not_suspended++;
@@ -74,11 +72,9 @@ index 5ede0f7..2ccfcb7 100644
}
if (not_suspended > 1 || (not_suspended == 1 && !one_dev_on))
diff --git a/include/linux/pm_domain.h b/include/linux/pm_domain.h
index b637ec1..30186ad 100644
--- a/include/linux/pm_domain.h
+++ b/include/linux/pm_domain.h
@@ -245,6 +245,7 @@ struct generic_pm_domain_data {
@@ -251,6 +251,7 @@ struct generic_pm_domain_data {
unsigned int default_pstate;
unsigned int rpm_pstate;
bool hw_mode;
@@ -86,7 +82,7 @@ index b637ec1..30186ad 100644
void *data;
};
@@ -277,6 +278,7 @@ ktime_t dev_pm_genpd_get_next_hrtimer(struct device *dev);
@@ -283,6 +284,7 @@ ktime_t dev_pm_genpd_get_next_hrtimer(st
void dev_pm_genpd_synced_poweroff(struct device *dev);
int dev_pm_genpd_set_hwmode(struct device *dev, bool enable);
bool dev_pm_genpd_get_hwmode(struct device *dev);
@@ -94,7 +90,7 @@ index b637ec1..30186ad 100644
extern struct dev_power_governor simple_qos_governor;
extern struct dev_power_governor pm_domain_always_on_gov;
@@ -360,6 +362,11 @@ static inline bool dev_pm_genpd_get_hwmode(struct device *dev)
@@ -366,6 +368,11 @@ static inline bool dev_pm_genpd_get_hwmo
return false;
}
@@ -106,5 +102,3 @@ index b637ec1..30186ad 100644
#define simple_qos_governor (*(struct dev_power_governor *)(NULL))
#define pm_domain_always_on_gov (*(struct dev_power_governor *)(NULL))
#endif
--
2.7.4

View File

@@ -14,8 +14,6 @@ Changes in v2: None
drivers/pmdomain/rockchip/pm-domains.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/drivers/pmdomain/rockchip/pm-domains.c b/drivers/pmdomain/rockchip/pm-domains.c
index cb0f938..49842f1 100644
--- a/drivers/pmdomain/rockchip/pm-domains.c
+++ b/drivers/pmdomain/rockchip/pm-domains.c
@@ -5,6 +5,7 @@
@@ -34,7 +32,7 @@ index cb0f938..49842f1 100644
#include <dt-bindings/power/px30-power.h>
#include <dt-bindings/power/rockchip,rv1126-power.h>
#include <dt-bindings/power/rk3036-power.h>
@@ -540,6 +542,7 @@ static void rockchip_do_pmu_set_power_domain(struct rockchip_pm_domain *pd,
@@ -559,6 +561,7 @@ static void rockchip_do_pmu_set_power_do
struct generic_pm_domain *genpd = &pd->genpd;
u32 pd_pwr_offset = pd->info->pwr_offset;
bool is_on, is_mem_on = false;
@@ -42,7 +40,7 @@ index cb0f938..49842f1 100644
if (pd->info->pwr_mask == 0)
return;
@@ -567,6 +570,11 @@ static void rockchip_do_pmu_set_power_domain(struct rockchip_pm_domain *pd,
@@ -586,6 +589,11 @@ static void rockchip_do_pmu_set_power_do
genpd->name, is_on);
return;
}
@@ -54,5 +52,3 @@ index cb0f938..49842f1 100644
}
static int rockchip_pd_power(struct rockchip_pm_domain *pd, bool power_on)
--
2.7.4

View File

@@ -13,11 +13,9 @@ Changes in v2: None
include/ufs/ufshcd.h | 2 ++
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index 24a32e2..9d1d56d 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -4039,7 +4039,7 @@ static int ufshcd_dme_link_startup(struct ufs_hba *hba)
@@ -4039,7 +4039,7 @@ static int ufshcd_dme_link_startup(struc
*
* Return: 0 on success, non-zero value on failure.
*/
@@ -26,7 +24,7 @@ index 24a32e2..9d1d56d 100644
{
struct uic_command uic_cmd = {
.command = UIC_CMD_DME_RESET,
@@ -4053,6 +4053,7 @@ static int ufshcd_dme_reset(struct ufs_hba *hba)
@@ -4053,6 +4053,7 @@ static int ufshcd_dme_reset(struct ufs_h
return ret;
}
@@ -34,7 +32,7 @@ index 24a32e2..9d1d56d 100644
int ufshcd_dme_configure_adapt(struct ufs_hba *hba,
int agreed_gear,
@@ -4078,7 +4079,7 @@ EXPORT_SYMBOL_GPL(ufshcd_dme_configure_adapt);
@@ -4078,7 +4079,7 @@ EXPORT_SYMBOL_GPL(ufshcd_dme_configure_a
*
* Return: 0 on success, non-zero value on failure.
*/
@@ -43,7 +41,7 @@ index 24a32e2..9d1d56d 100644
{
struct uic_command uic_cmd = {
.command = UIC_CMD_DME_ENABLE,
@@ -4092,6 +4093,7 @@ static int ufshcd_dme_enable(struct ufs_hba *hba)
@@ -4092,6 +4093,7 @@ static int ufshcd_dme_enable(struct ufs_
return ret;
}
@@ -51,11 +49,9 @@ index 24a32e2..9d1d56d 100644
static inline void ufshcd_add_delay_before_dme_cmd(struct ufs_hba *hba)
{
diff --git a/include/ufs/ufshcd.h b/include/ufs/ufshcd.h
index 3f68ae3e4..b9733dc 100644
--- a/include/ufs/ufshcd.h
+++ b/include/ufs/ufshcd.h
@@ -1360,6 +1360,8 @@ extern int ufshcd_system_thaw(struct device *dev);
@@ -1361,6 +1361,8 @@ extern int ufshcd_system_thaw(struct dev
extern int ufshcd_system_restore(struct device *dev);
#endif
@@ -64,5 +60,3 @@ index 3f68ae3e4..b9733dc 100644
extern int ufshcd_dme_configure_adapt(struct ufs_hba *hba,
int agreed_gear,
int adapt_val);
--
2.7.4

View File

@@ -52,8 +52,6 @@ Changes in v2: None
create mode 100644 drivers/ufs/host/ufs-rockchip.c
create mode 100644 drivers/ufs/host/ufs-rockchip.h
diff --git a/drivers/ufs/host/Kconfig b/drivers/ufs/host/Kconfig
index 580c8d0..191fbd7 100644
--- a/drivers/ufs/host/Kconfig
+++ b/drivers/ufs/host/Kconfig
@@ -142,3 +142,15 @@ config SCSI_UFS_SPRD
@@ -72,20 +70,15 @@ index 580c8d0..191fbd7 100644
+
+ Select this if you have UFS controller on Rockchip chipset.
+ If unsure, say N.
diff --git a/drivers/ufs/host/Makefile b/drivers/ufs/host/Makefile
index 4573aea..2f97feb 100644
--- a/drivers/ufs/host/Makefile
+++ b/drivers/ufs/host/Makefile
@@ -10,5 +10,6 @@ obj-$(CONFIG_SCSI_UFSHCD_PLATFORM) += ufshcd-pltfrm.o
@@ -10,5 +10,6 @@ obj-$(CONFIG_SCSI_UFSHCD_PLATFORM) += uf
obj-$(CONFIG_SCSI_UFS_HISI) += ufs-hisi.o
obj-$(CONFIG_SCSI_UFS_MEDIATEK) += ufs-mediatek.o
obj-$(CONFIG_SCSI_UFS_RENESAS) += ufs-renesas.o
+obj-$(CONFIG_SCSI_UFS_ROCKCHIP) += ufs-rockchip.o
obj-$(CONFIG_SCSI_UFS_SPRD) += ufs-sprd.o
obj-$(CONFIG_SCSI_UFS_TI_J721E) += ti-j721e-ufs.o
diff --git a/drivers/ufs/host/ufs-rockchip.c b/drivers/ufs/host/ufs-rockchip.c
new file mode 100644
index 0000000..b087ce0
--- /dev/null
+++ b/drivers/ufs/host/ufs-rockchip.c
@@ -0,0 +1,368 @@
@@ -457,9 +450,6 @@ index 0000000..b087ce0
+
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("Rockchip UFS Host Driver");
diff --git a/drivers/ufs/host/ufs-rockchip.h b/drivers/ufs/host/ufs-rockchip.h
new file mode 100644
index 0000000..768dbe3
--- /dev/null
+++ b/drivers/ufs/host/ufs-rockchip.h
@@ -0,0 +1,48 @@
@@ -511,5 +501,3 @@ index 0000000..768dbe3
+ (reg))
+
+#endif /* _UFS_ROCKCHIP_H_ */
--
2.7.4

View File

@@ -12,8 +12,6 @@ Changes in v2: None
arch/arm64/boot/dts/rockchip/rk3576.dtsi | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)
diff --git a/arch/arm64/boot/dts/rockchip/rk3576.dtsi b/arch/arm64/boot/dts/rockchip/rk3576.dtsi
index 436232f..32beda2 100644
--- a/arch/arm64/boot/dts/rockchip/rk3576.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3576.dtsi
@@ -1110,6 +1110,30 @@
@@ -47,5 +45,3 @@ index 436232f..32beda2 100644
sdmmc: mmc@2a310000 {
compatible = "rockchip,rk3576-dw-mshc";
reg = <0x0 0x2a310000 0x0 0x4000>;
--
2.7.4

View File

@@ -6,11 +6,9 @@ Signed-off-by: Heiko Stuebner <heiko@sntech.de>
drivers/clk/rockchip/clk-rk3576.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/drivers/clk/rockchip/clk-rk3576.c b/drivers/clk/rockchip/clk-rk3576.c
index 595e010341f7..029939a98416 100644
--- a/drivers/clk/rockchip/clk-rk3576.c
+++ b/drivers/clk/rockchip/clk-rk3576.c
@@ -541,6 +541,8 @@ static struct rockchip_clk_branch rk3576_clk_branches[] __initdata = {
@@ -541,6 +541,8 @@ static struct rockchip_clk_branch rk3576
RK3576_CLKGATE_CON(5), 14, GFLAGS),
GATE(CLK_OTPC_AUTO_RD_G, "clk_otpc_auto_rd_g", "xin24m", 0,
RK3576_CLKGATE_CON(5), 15, GFLAGS),
@@ -19,5 +17,3 @@ index 595e010341f7..029939a98416 100644
COMPOSITE(CLK_MIPI_CAMERAOUT_M0, "clk_mipi_cameraout_m0", mux_24m_spll_gpll_cpll_p, 0,
RK3576_CLKSEL_CON(38), 8, 2, MFLAGS, 0, 8, DFLAGS,
RK3576_CLKGATE_CON(6), 3, GFLAGS),
--
2.45.2

View File

@@ -11,8 +11,6 @@ Signed-off-by: Heiko Stuebner <heiko@sntech.de>
drivers/nvmem/rockchip-otp.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/drivers/nvmem/rockchip-otp.c b/drivers/nvmem/rockchip-otp.c
index ebc3f0b24166..3edfbfc2d722 100644
--- a/drivers/nvmem/rockchip-otp.c
+++ b/drivers/nvmem/rockchip-otp.c
@@ -59,7 +59,6 @@
@@ -31,7 +29,7 @@ index ebc3f0b24166..3edfbfc2d722 100644
const char * const *clks;
int num_clks;
nvmem_reg_read_t reg_read;
@@ -196,7 +196,7 @@ static int rk3588_otp_read(void *context, unsigned int offset,
@@ -196,7 +196,7 @@ static int rk3588_otp_read(void *context
addr_start = round_down(offset, RK3588_NBYTES) / RK3588_NBYTES;
addr_end = round_up(offset + bytes, RK3588_NBYTES) / RK3588_NBYTES;
addr_len = addr_end - addr_start;
@@ -40,7 +38,7 @@ index ebc3f0b24166..3edfbfc2d722 100644
buf = kzalloc(array_size(addr_len, RK3588_NBYTES), GFP_KERNEL);
if (!buf)
@@ -280,6 +280,7 @@ static const char * const rk3588_otp_clocks[] = {
@@ -280,6 +280,7 @@ static const char * const rk3588_otp_clo
static const struct rockchip_data rk3588_data = {
.size = 0x400,
@@ -48,5 +46,3 @@ index ebc3f0b24166..3edfbfc2d722 100644
.clks = rk3588_otp_clocks,
.num_clks = ARRAY_SIZE(rk3588_otp_clocks),
.reg_read = rk3588_otp_read,
--
2.45.2

View File

@@ -9,8 +9,6 @@ Signed-off-by: Heiko Stuebner <heiko@sntech.de>
.../bindings/nvmem/rockchip,otp.yaml | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/Documentation/devicetree/bindings/nvmem/rockchip,otp.yaml b/Documentation/devicetree/bindings/nvmem/rockchip,otp.yaml
index a44d44b32809..dae7543a0179 100644
--- a/Documentation/devicetree/bindings/nvmem/rockchip,otp.yaml
+++ b/Documentation/devicetree/bindings/nvmem/rockchip,otp.yaml
@@ -14,6 +14,7 @@ properties:
@@ -21,12 +19,10 @@ index a44d44b32809..dae7543a0179 100644
- rockchip,rk3588-otp
reg:
@@ -68,6 +69,23 @@ allOf:
items:
- const: phy
@@ -70,6 +71,23 @@ allOf:
+ - if:
+ properties:
- if:
properties:
+ compatible:
+ contains:
+ enum:
@@ -42,8 +38,8 @@ index a44d44b32809..dae7543a0179 100644
+ - const: otp
+ - const: apb
+
- if:
properties:
+ - if:
+ properties:
compatible:
--
2.45.2
contains:
enum:

View File

@@ -6,11 +6,9 @@ Signed-off-by: Heiko Stuebner <heiko@sntech.de>
drivers/nvmem/rockchip-otp.c | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/drivers/nvmem/rockchip-otp.c b/drivers/nvmem/rockchip-otp.c
index 3edfbfc2d722..d88f12c53242 100644
--- a/drivers/nvmem/rockchip-otp.c
+++ b/drivers/nvmem/rockchip-otp.c
@@ -274,6 +274,14 @@ static const struct rockchip_data px30_data = {
@@ -274,6 +274,14 @@ static const struct rockchip_data px30_d
.reg_read = px30_otp_read,
};
@@ -25,16 +23,14 @@ index 3edfbfc2d722..d88f12c53242 100644
static const char * const rk3588_otp_clocks[] = {
"otp", "apb_pclk", "phy", "arb",
};
@@ -295,6 +303,10 @@ static const struct of_device_id rockchip_otp_match[] = {
.compatible = "rockchip,rk3308-otp",
@@ -296,6 +304,10 @@ static const struct of_device_id rockchi
.data = &px30_data,
},
+ {
{
+ .compatible = "rockchip,rk3576-otp",
+ .data = &rk3576_data,
+ },
{
+ {
.compatible = "rockchip,rk3588-otp",
.data = &rk3588_data,
--
2.45.2
},

View File

@@ -6,11 +6,9 @@ Signed-off-by: Heiko Stuebner <heiko@sntech.de>
arch/arm64/boot/dts/rockchip/rk3576.dtsi | 39 ++++++++++++++++++++++++
1 file changed, 39 insertions(+)
diff --git a/arch/arm64/boot/dts/rockchip/rk3576.dtsi b/arch/arm64/boot/dts/rockchip/rk3576.dtsi
index 436232ffe4d1..c70c9dcfad82 100644
--- a/arch/arm64/boot/dts/rockchip/rk3576.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3576.dtsi
@@ -1149,6 +1149,45 @@ sdhci: mmc@2a330000 {
@@ -1173,6 +1173,45 @@
status = "disabled";
};
@@ -56,5 +54,3 @@ index 436232ffe4d1..c70c9dcfad82 100644
gic: interrupt-controller@2a701000 {
compatible = "arm,gic-400";
reg = <0x0 0x2a701000 0 0x10000>,
--
2.45.2

View File

@@ -4,8 +4,6 @@ Signed-off-by: Uwe Kleine-König <u.kleine-koenig@baylibre.com>
include/linux/pwm.h | 13 +++++++
2 files changed, 100 insertions(+), 8 deletions(-)
diff --git a/drivers/pwm/core.c b/drivers/pwm/core.c
index 6e752e148b98..b97e2ea0691d 100644
--- a/drivers/pwm/core.c
+++ b/drivers/pwm/core.c
@@ -31,6 +31,24 @@ static DEFINE_MUTEX(pwm_lock);
@@ -33,7 +31,7 @@ index 6e752e148b98..b97e2ea0691d 100644
static void pwm_apply_debug(struct pwm_device *pwm,
const struct pwm_state *state)
{
@@ -220,6 +238,7 @@ static int __pwm_apply(struct pwm_device *pwm, const struct pwm_state *state)
@@ -224,6 +242,7 @@ static int __pwm_apply(struct pwm_device
int pwm_apply_might_sleep(struct pwm_device *pwm, const struct pwm_state *state)
{
int err;
@@ -41,7 +39,7 @@ index 6e752e148b98..b97e2ea0691d 100644
/*
* Some lowlevel driver's implementations of .apply() make use of
@@ -230,7 +249,12 @@ int pwm_apply_might_sleep(struct pwm_device *pwm, const struct pwm_state *state)
@@ -234,7 +253,12 @@ int pwm_apply_might_sleep(struct pwm_dev
*/
might_sleep();
@@ -55,7 +53,7 @@ index 6e752e148b98..b97e2ea0691d 100644
/*
* Catch any drivers that have been marked as atomic but
* that will sleep anyway.
@@ -254,9 +278,16 @@ EXPORT_SYMBOL_GPL(pwm_apply_might_sleep);
@@ -258,9 +282,16 @@ EXPORT_SYMBOL_GPL(pwm_apply_might_sleep)
*/
int pwm_apply_atomic(struct pwm_device *pwm, const struct pwm_state *state)
{
@@ -73,7 +71,7 @@ index 6e752e148b98..b97e2ea0691d 100644
return __pwm_apply(pwm, state);
}
EXPORT_SYMBOL_GPL(pwm_apply_atomic);
@@ -336,6 +367,11 @@ static int pwm_capture(struct pwm_device *pwm, struct pwm_capture *result,
@@ -340,6 +371,11 @@ static int pwm_capture(struct pwm_device
guard(mutex)(&pwm_lock);
@@ -85,7 +83,7 @@ index 6e752e148b98..b97e2ea0691d 100644
return ops->capture(chip, pwm, result, timeout);
}
@@ -368,6 +404,14 @@ static int pwm_device_request(struct pwm_device *pwm, const char *label)
@@ -372,6 +408,14 @@ static int pwm_device_request(struct pwm
if (test_bit(PWMF_REQUESTED, &pwm->flags))
return -EBUSY;
@@ -100,7 +98,7 @@ index 6e752e148b98..b97e2ea0691d 100644
if (!try_module_get(chip->owner))
return -ENODEV;
@@ -396,7 +440,9 @@ static int pwm_device_request(struct pwm_device *pwm, const char *label)
@@ -400,7 +444,9 @@ err_get_device:
*/
struct pwm_state state = { 0, };
@@ -111,7 +109,7 @@ index 6e752e148b98..b97e2ea0691d 100644
trace_pwm_get(pwm, &state, err);
if (!err)
@@ -1020,6 +1066,7 @@ struct pwm_chip *pwmchip_alloc(struct device *parent, unsigned int npwm, size_t
@@ -1024,6 +1070,7 @@ struct pwm_chip *pwmchip_alloc(struct de
chip->npwm = npwm;
chip->uses_pwmchip_alloc = true;
@@ -119,7 +117,7 @@ index 6e752e148b98..b97e2ea0691d 100644
pwmchip_dev = &chip->dev;
device_initialize(pwmchip_dev);
@@ -1125,6 +1172,11 @@ int __pwmchip_add(struct pwm_chip *chip, struct module *owner)
@@ -1129,6 +1176,11 @@ int __pwmchip_add(struct pwm_chip *chip,
chip->owner = owner;
@@ -131,7 +129,7 @@ index 6e752e148b98..b97e2ea0691d 100644
guard(mutex)(&pwm_lock);
ret = idr_alloc(&pwm_chips, chip, 0, 0, GFP_KERNEL);
@@ -1138,6 +1190,9 @@ int __pwmchip_add(struct pwm_chip *chip, struct module *owner)
@@ -1142,6 +1194,9 @@ int __pwmchip_add(struct pwm_chip *chip,
if (IS_ENABLED(CONFIG_OF))
of_pwmchip_add(chip);
@@ -141,7 +139,7 @@ index 6e752e148b98..b97e2ea0691d 100644
ret = device_add(&chip->dev);
if (ret)
goto err_device_add;
@@ -1145,6 +1200,9 @@ int __pwmchip_add(struct pwm_chip *chip, struct module *owner)
@@ -1149,6 +1204,9 @@ int __pwmchip_add(struct pwm_chip *chip,
return 0;
err_device_add:
@@ -151,7 +149,7 @@ index 6e752e148b98..b97e2ea0691d 100644
if (IS_ENABLED(CONFIG_OF))
of_pwmchip_remove(chip);
@@ -1164,11 +1222,27 @@ void pwmchip_remove(struct pwm_chip *chip)
@@ -1168,11 +1226,27 @@ void pwmchip_remove(struct pwm_chip *chi
{
pwmchip_sysfs_unexport(chip);
@@ -182,7 +180,7 @@ index 6e752e148b98..b97e2ea0691d 100644
device_del(&chip->dev);
}
@@ -1538,12 +1612,17 @@ void pwm_put(struct pwm_device *pwm)
@@ -1542,12 +1616,17 @@ void pwm_put(struct pwm_device *pwm)
guard(mutex)(&pwm_lock);
@@ -202,8 +200,6 @@ index 6e752e148b98..b97e2ea0691d 100644
pwm->chip->ops->free(pwm->chip, pwm);
pwm->label = NULL;
diff --git a/include/linux/pwm.h b/include/linux/pwm.h
index 8acd60b53f58..464054a45e57 100644
--- a/include/linux/pwm.h
+++ b/include/linux/pwm.h
@@ -275,6 +275,9 @@ struct pwm_ops {
@@ -233,5 +229,3 @@ index 8acd60b53f58..464054a45e57 100644
struct pwm_device pwms[] __counted_by(npwm);
};
--
2.43.0

View File

@@ -59,11 +59,9 @@ Signed-off-by: Uwe Kleine-König <ukleinek@kernel.org>
include/linux/pwm.h | 36 +++++++
2 files changed, 249 insertions(+), 21 deletions(-)
diff --git a/drivers/pwm/core.c b/drivers/pwm/core.c
index 5a095eb46b544f..bbe7bfdb154927 100644
--- a/drivers/pwm/core.c
+++ b/drivers/pwm/core.c
@@ -49,6 +49,102 @@ static void pwmchip_unlock(struct pwm_chip *chip)
@@ -49,6 +49,102 @@ static void pwmchip_unlock(struct pwm_ch
DEFINE_GUARD(pwmchip, struct pwm_chip *, pwmchip_lock(_T), pwmchip_unlock(_T))
@@ -166,7 +164,7 @@ index 5a095eb46b544f..bbe7bfdb154927 100644
static void pwm_apply_debug(struct pwm_device *pwm,
const struct pwm_state *state)
{
@@ -182,6 +278,7 @@ static bool pwm_state_valid(const struct pwm_state *state)
@@ -186,6 +282,7 @@ static bool pwm_state_valid(const struct
static int __pwm_apply(struct pwm_device *pwm, const struct pwm_state *state)
{
struct pwm_chip *chip;
@@ -174,7 +172,7 @@ index 5a095eb46b544f..bbe7bfdb154927 100644
int err;
if (!pwm || !state)
@@ -205,6 +302,7 @@ static int __pwm_apply(struct pwm_device *pwm, const struct pwm_state *state)
@@ -209,6 +306,7 @@ static int __pwm_apply(struct pwm_device
}
chip = pwm->chip;
@@ -182,7 +180,7 @@ index 5a095eb46b544f..bbe7bfdb154927 100644
if (state->period == pwm->state.period &&
state->duty_cycle == pwm->state.duty_cycle &&
@@ -213,18 +311,69 @@ static int __pwm_apply(struct pwm_device *pwm, const struct pwm_state *state)
@@ -217,18 +315,69 @@ static int __pwm_apply(struct pwm_device
state->usage_power == pwm->state.usage_power)
return 0;
@@ -262,7 +260,7 @@ index 5a095eb46b544f..bbe7bfdb154927 100644
return 0;
}
@@ -292,6 +441,41 @@ int pwm_apply_atomic(struct pwm_device *pwm, const struct pwm_state *state)
@@ -296,6 +445,41 @@ int pwm_apply_atomic(struct pwm_device *
}
EXPORT_SYMBOL_GPL(pwm_apply_atomic);
@@ -304,7 +302,7 @@ index 5a095eb46b544f..bbe7bfdb154927 100644
/**
* pwm_adjust_config() - adjust the current PWM config to the PWM arguments
* @pwm: PWM device
@@ -435,7 +619,7 @@ static int pwm_device_request(struct pwm_device *pwm, const char *label)
@@ -434,7 +618,7 @@ err_get_device:
}
}
@@ -313,7 +311,7 @@ index 5a095eb46b544f..bbe7bfdb154927 100644
/*
* Zero-initialize state because most drivers are unaware of
* .usage_power. The other members of state are supposed to be
@@ -445,11 +629,7 @@ static int pwm_device_request(struct pwm_device *pwm, const char *label)
@@ -444,11 +628,7 @@ err_get_device:
*/
struct pwm_state state = { 0, };
@@ -326,7 +324,7 @@ index 5a095eb46b544f..bbe7bfdb154927 100644
if (!err)
pwm->state = state;
@@ -1136,12 +1316,24 @@ static bool pwm_ops_check(const struct pwm_chip *chip)
@@ -1135,12 +1315,24 @@ static bool pwm_ops_check(const struct p
{
const struct pwm_ops *ops = chip->ops;
@@ -337,10 +335,7 @@ index 5a095eb46b544f..bbe7bfdb154927 100644
+ !ops->round_waveform_fromhw ||
+ !ops->write_waveform)
+ return false;
- if (IS_ENABLED(CONFIG_PWM_DEBUG) && !ops->get_state)
- dev_warn(pwmchip_parent(chip),
- "Please implement the .get_state() callback\n");
+
+ if (WFHWSIZE < ops->sizeof_wfhw) {
+ dev_warn(pwmchip_parent(chip), "WFHWSIZE < %zu\n", ops->sizeof_wfhw);
+ return false;
@@ -348,7 +343,10 @@ index 5a095eb46b544f..bbe7bfdb154927 100644
+ } else {
+ if (!ops->apply)
+ return false;
+
- if (IS_ENABLED(CONFIG_PWM_DEBUG) && !ops->get_state)
- dev_warn(pwmchip_parent(chip),
- "Please implement the .get_state() callback\n");
+ if (IS_ENABLED(CONFIG_PWM_DEBUG) && !ops->get_state)
+ dev_warn(pwmchip_parent(chip),
+ "Please implement the .get_state() callback\n");
@@ -356,8 +354,6 @@ index 5a095eb46b544f..bbe7bfdb154927 100644
return true;
}
diff --git a/include/linux/pwm.h b/include/linux/pwm.h
index 3ea73e075abe87..d8cfe1c9b19d83 100644
--- a/include/linux/pwm.h
+++ b/include/linux/pwm.h
@@ -49,6 +49,31 @@ enum {

View File

@@ -22,11 +22,9 @@ Signed-off-by: Uwe Kleine-König <ukleinek@kernel.org>
include/linux/pwm.h | 6 +-
2 files changed, 266 insertions(+), 1 deletion(-)
diff --git a/drivers/pwm/core.c b/drivers/pwm/core.c
index bbe7bfdb154927..038f17dd275798 100644
--- a/drivers/pwm/core.c
+++ b/drivers/pwm/core.c
@@ -49,6 +49,30 @@ static void pwmchip_unlock(struct pwm_chip *chip)
@@ -49,6 +49,30 @@ static void pwmchip_unlock(struct pwm_ch
DEFINE_GUARD(pwmchip, struct pwm_chip *, pwmchip_lock(_T), pwmchip_unlock(_T))
@@ -57,7 +55,7 @@ index bbe7bfdb154927..038f17dd275798 100644
static void pwm_wf2state(const struct pwm_waveform *wf, struct pwm_state *state)
{
if (wf->period_length_ns) {
@@ -95,6 +119,29 @@ static void pwm_state2wf(const struct pwm_state *state, struct pwm_waveform *wf)
@@ -95,6 +119,29 @@ static void pwm_state2wf(const struct pw
}
}
@@ -87,7 +85,7 @@ index bbe7bfdb154927..038f17dd275798 100644
static bool pwm_check_rounding(const struct pwm_waveform *wf,
const struct pwm_waveform *wf_rounded)
{
@@ -145,6 +192,220 @@ static int __pwm_write_waveform(struct pwm_chip *chip, struct pwm_device *pwm, c
@@ -145,6 +192,220 @@ static int __pwm_write_waveform(struct p
#define WFHWSIZE 20
@@ -308,11 +306,9 @@ index bbe7bfdb154927..038f17dd275798 100644
static void pwm_apply_debug(struct pwm_device *pwm,
const struct pwm_state *state)
{
diff --git a/include/linux/pwm.h b/include/linux/pwm.h
index d8cfe1c9b19d83..c3d9ddeafa65e1 100644
--- a/include/linux/pwm.h
+++ b/include/linux/pwm.h
@@ -358,7 +358,11 @@ static inline void pwmchip_set_drvdata(struct pwm_chip *chip, void *data)
@@ -358,7 +358,11 @@ static inline void pwmchip_set_drvdata(s
}
#if IS_ENABLED(CONFIG_PWM)

View File

@@ -3,11 +3,9 @@ Signed-off-by: Nicolas Frattaroli <nicolas.frattaroli@collabora.com>
Documentation/devicetree/bindings/pinctrl/rockchip,pinctrl.yaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Documentation/devicetree/bindings/pinctrl/rockchip,pinctrl.yaml b/Documentation/devicetree/bindings/pinctrl/rockchip,pinctrl.yaml
index 960758dc417f7405010fab067bfbf6f5c4704179..125af766b99297dc229db158846daea974dda28e 100644
--- a/Documentation/devicetree/bindings/pinctrl/rockchip,pinctrl.yaml
+++ b/Documentation/devicetree/bindings/pinctrl/rockchip,pinctrl.yaml
@@ -135,7 +135,7 @@ additionalProperties:
@@ -133,7 +133,7 @@ additionalProperties:
description:
Pin bank index.
- minimum: 0
@@ -16,6 +14,3 @@ index 960758dc417f7405010fab067bfbf6f5c4704179..125af766b99297dc229db158846daea9
description:
Mux 0 means GPIO and mux 1 to N means
the specific device function.
--
2.49.0

View File

@@ -4,9 +4,6 @@ Signed-off-by: Nicolas Frattaroli <nicolas.frattaroli@collabora.com>
MAINTAINERS | 7 ++
2 files changed, 101 insertions(+)
diff --git a/Documentation/devicetree/bindings/pwm/rockchip,rk3576-pwm.yaml b/Documentation/devicetree/bindings/pwm/rockchip,rk3576-pwm.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..143d4df5df8fa89d508faca5ddf67603fb7cb3f5
--- /dev/null
+++ b/Documentation/devicetree/bindings/pwm/rockchip,rk3576-pwm.yaml
@@ -0,0 +1,94 @@
@@ -104,11 +101,9 @@ index 0000000000000000000000000000000000000000..143d4df5df8fa89d508faca5ddf67603
+ #pwm-cells = <3>;
+ };
+ };
diff --git a/MAINTAINERS b/MAINTAINERS
index 96b82704950184bd71623ff41fc4df31e4c7fe87..407179d2a90dd49800f2bb5770a1280c5afebb5a 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -20885,6 +20885,13 @@ F: Documentation/userspace-api/media/v4l/metafmt-rkisp1.rst
@@ -19952,6 +19952,13 @@ F: Documentation/userspace-api/media/v4l
F: drivers/media/platform/rockchip/rkisp1
F: include/uapi/linux/rkisp1-config.h
@@ -122,6 +117,3 @@ index 96b82704950184bd71623ff41fc4df31e4c7fe87..407179d2a90dd49800f2bb5770a1280c
ROCKCHIP RK3568 RANDOM NUMBER GENERATOR SUPPORT
M: Daniel Golle <daniel@makrotopia.org>
M: Aurelien Jarno <aurelien@aurel32.net>
--
2.49.0

View File

@@ -3,9 +3,6 @@ Signed-off-by: Nicolas Frattaroli <nicolas.frattaroli@collabora.com>
include/soc/rockchip/utils.h | 76 ++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 76 insertions(+)
diff --git a/include/soc/rockchip/utils.h b/include/soc/rockchip/utils.h
new file mode 100644
index 0000000000000000000000000000000000000000..3349069e75ff51ebd7a22089af796feafd227ffb
--- /dev/null
+++ b/include/soc/rockchip/utils.h
@@ -0,0 +1,76 @@
@@ -85,6 +82,3 @@ index 0000000000000000000000000000000000000000..3349069e75ff51ebd7a22089af796fea
+ REG_UPDATE_WE((__val), (__bit), (__bit)))
+
+#endif /* __SOC_ROCKCHIP_UTILS_H__ */
--
2.49.0

View File

@@ -7,11 +7,9 @@ Signed-off-by: Nicolas Frattaroli <nicolas.frattaroli@collabora.com>
include/soc/rockchip/mfpwm.h | 505 +++++++++++++++++++++++++++++++++++
5 files changed, 1129 insertions(+)
diff --git a/MAINTAINERS b/MAINTAINERS
index 407179d2a90dd49800f2bb5770a1280c5afebb5a..e6a9347be1e7889089e1d9e655cb23c2d8399b40 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -20891,6 +20891,8 @@ L: linux-rockchip@lists.infradead.org
@@ -19958,6 +19958,8 @@ L: linux-rockchip@lists.infradead.org
L: linux-pwm@vger.kernel.org
S: Maintained
F: Documentation/devicetree/bindings/pwm/rockchip,rk3576-pwm.yaml
@@ -20,8 +18,6 @@ index 407179d2a90dd49800f2bb5770a1280c5afebb5a..e6a9347be1e7889089e1d9e655cb23c2
ROCKCHIP RK3568 RANDOM NUMBER GENERATOR SUPPORT
M: Daniel Golle <daniel@makrotopia.org>
diff --git a/drivers/soc/rockchip/Kconfig b/drivers/soc/rockchip/Kconfig
index 785f60c6f3ad1a09f517e69a69726a8178bed168..4e1e4926c514a5a2c4d4caf8cf9809a098badc7d 100644
--- a/drivers/soc/rockchip/Kconfig
+++ b/drivers/soc/rockchip/Kconfig
@@ -30,4 +30,17 @@ config ROCKCHIP_DTPM
@@ -42,8 +38,6 @@ index 785f60c6f3ad1a09f517e69a69726a8178bed168..4e1e4926c514a5a2c4d4caf8cf9809a0
+ implemented in their respective subsystems.
+
endif
diff --git a/drivers/soc/rockchip/Makefile b/drivers/soc/rockchip/Makefile
index 23d414433c8c58557effc214337ec8e6ff17a461..ba12dbd01ac794910d9407c268e89071cd2b3139 100644
--- a/drivers/soc/rockchip/Makefile
+++ b/drivers/soc/rockchip/Makefile
@@ -5,3 +5,4 @@
@@ -51,9 +45,6 @@ index 23d414433c8c58557effc214337ec8e6ff17a461..ba12dbd01ac794910d9407c268e89071
obj-$(CONFIG_ROCKCHIP_IODOMAIN) += io-domain.o
obj-$(CONFIG_ROCKCHIP_DTPM) += dtpm.o
+obj-$(CONFIG_ROCKCHIP_MFPWM) += mfpwm.o
diff --git a/drivers/soc/rockchip/mfpwm.c b/drivers/soc/rockchip/mfpwm.c
new file mode 100644
index 0000000000000000000000000000000000000000..9331c530f0581573e2b74f62a6622b8625c5b2c5
--- /dev/null
+++ b/drivers/soc/rockchip/mfpwm.c
@@ -0,0 +1,608 @@
@@ -665,9 +656,6 @@ index 0000000000000000000000000000000000000000..9331c530f0581573e2b74f62a6622b86
+MODULE_AUTHOR("Nicolas Frattaroli <nicolas.frattaroli@collabora.com>");
+MODULE_DESCRIPTION("Rockchip MFPWM Driver");
+MODULE_LICENSE("GPL");
diff --git a/include/soc/rockchip/mfpwm.h b/include/soc/rockchip/mfpwm.h
new file mode 100644
index 0000000000000000000000000000000000000000..345f13f438b57159a15cb2e0ae250800fb96ed43
--- /dev/null
+++ b/include/soc/rockchip/mfpwm.h
@@ -0,0 +1,505 @@
@@ -1176,6 +1164,3 @@ index 0000000000000000000000000000000000000000..345f13f438b57159a15cb2e0ae250800
+void mfpwm_remove_func(struct rockchip_mfpwm_func *pwmf);
+
+#endif /* __SOC_ROCKCHIP_MFPWM_H__ */
--
2.49.0

View File

@@ -6,11 +6,9 @@ Signed-off-by: Nicolas Frattaroli <nicolas.frattaroli@collabora.com>
drivers/pwm/pwm-rockchip-v4.c | 336 ++++++++++++++++++++++++++++++++++++++++++
4 files changed, 351 insertions(+)
diff --git a/MAINTAINERS b/MAINTAINERS
index e6a9347be1e7889089e1d9e655cb23c2d8399b40..3ddd245fd4ad8d9ed2e762910a7a1f6436f93e34 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -20891,6 +20891,7 @@ L: linux-rockchip@lists.infradead.org
@@ -19958,6 +19958,7 @@ L: linux-rockchip@lists.infradead.org
L: linux-pwm@vger.kernel.org
S: Maintained
F: Documentation/devicetree/bindings/pwm/rockchip,rk3576-pwm.yaml
@@ -18,8 +16,6 @@ index e6a9347be1e7889089e1d9e655cb23c2d8399b40..3ddd245fd4ad8d9ed2e762910a7a1f64
F: drivers/soc/rockchip/mfpwm.c
F: include/soc/rockchip/mfpwm.h
diff --git a/drivers/pwm/Kconfig b/drivers/pwm/Kconfig
index 4731d5b90d7edcc61138e4a5bf7e98906953ece4..242039f62ab091cea337bf27ef310bcf696b6ed0 100644
--- a/drivers/pwm/Kconfig
+++ b/drivers/pwm/Kconfig
@@ -540,6 +540,19 @@ config PWM_ROCKCHIP
@@ -42,11 +38,9 @@ index 4731d5b90d7edcc61138e4a5bf7e98906953ece4..242039f62ab091cea337bf27ef310bcf
config PWM_RZ_MTU3
tristate "Renesas RZ/G2L MTU3a PWM Timer support"
depends on RZ_MTU3
diff --git a/drivers/pwm/Makefile b/drivers/pwm/Makefile
index 539e0def3f82fcb866ab83a0346a15f7efdd7127..b5aca7ff58ac83f844581df526624617025291de 100644
--- a/drivers/pwm/Makefile
+++ b/drivers/pwm/Makefile
@@ -49,6 +49,7 @@ obj-$(CONFIG_PWM_RASPBERRYPI_POE) += pwm-raspberrypi-poe.o
@@ -49,6 +49,7 @@ obj-$(CONFIG_PWM_RASPBERRYPI_POE) += pwm
obj-$(CONFIG_PWM_RCAR) += pwm-rcar.o
obj-$(CONFIG_PWM_RENESAS_TPU) += pwm-renesas-tpu.o
obj-$(CONFIG_PWM_ROCKCHIP) += pwm-rockchip.o
@@ -54,9 +48,6 @@ index 539e0def3f82fcb866ab83a0346a15f7efdd7127..b5aca7ff58ac83f844581df526624617
obj-$(CONFIG_PWM_RZ_MTU3) += pwm-rz-mtu3.o
obj-$(CONFIG_PWM_SAMSUNG) += pwm-samsung.o
obj-$(CONFIG_PWM_SIFIVE) += pwm-sifive.o
diff --git a/drivers/pwm/pwm-rockchip-v4.c b/drivers/pwm/pwm-rockchip-v4.c
new file mode 100644
index 0000000000000000000000000000000000000000..980b27454ef9b930bef0496ca528533cf419fa0e
--- /dev/null
+++ b/drivers/pwm/pwm-rockchip-v4.c
@@ -0,0 +1,336 @@
@@ -396,6 +387,3 @@ index 0000000000000000000000000000000000000000..980b27454ef9b930bef0496ca528533c
+MODULE_DESCRIPTION("Rockchip PWMv4 Driver");
+MODULE_LICENSE("GPL");
+MODULE_IMPORT_NS("ROCKCHIP_MFPWM");
--
2.49.0

View File

@@ -6,11 +6,9 @@ Signed-off-by: Nicolas Frattaroli <nicolas.frattaroli@collabora.com>
drivers/counter/rockchip-pwm-capture.c | 341 +++++++++++++++++++++++++++++++++
4 files changed, 356 insertions(+)
diff --git a/MAINTAINERS b/MAINTAINERS
index 3ddd245fd4ad8d9ed2e762910a7a1f6436f93e34..e5d26256d05a04a9642371cf3dbb4dd0c1c34e68 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -20891,6 +20891,7 @@ L: linux-rockchip@lists.infradead.org
@@ -19958,6 +19958,7 @@ L: linux-rockchip@lists.infradead.org
L: linux-pwm@vger.kernel.org
S: Maintained
F: Documentation/devicetree/bindings/pwm/rockchip,rk3576-pwm.yaml
@@ -18,8 +16,6 @@ index 3ddd245fd4ad8d9ed2e762910a7a1f6436f93e34..e5d26256d05a04a9642371cf3dbb4dd0
F: drivers/pwm/pwm-rockchip-v4.c
F: drivers/soc/rockchip/mfpwm.c
F: include/soc/rockchip/mfpwm.h
diff --git a/drivers/counter/Kconfig b/drivers/counter/Kconfig
index d30d22dfe57741b145a45632b6325d5f9680590e..01b4f5c326478c73b518041830ee0d65b37f6833 100644
--- a/drivers/counter/Kconfig
+++ b/drivers/counter/Kconfig
@@ -90,6 +90,19 @@ config MICROCHIP_TCB_CAPTURE
@@ -42,18 +38,13 @@ index d30d22dfe57741b145a45632b6325d5f9680590e..01b4f5c326478c73b518041830ee0d65
config RZ_MTU3_CNT
tristate "Renesas RZ/G2L MTU3a counter driver"
depends on RZ_MTU3
diff --git a/drivers/counter/Makefile b/drivers/counter/Makefile
index fa3c1d08f7068835aa912aa13bc92bcfd44d16fb..2bfcfc2c584bd174a9885064746a98f15b204aec 100644
--- a/drivers/counter/Makefile
+++ b/drivers/counter/Makefile
@@ -17,3 +17,4 @@ obj-$(CONFIG_FTM_QUADDEC) += ftm-quaddec.o
@@ -17,3 +17,4 @@ obj-$(CONFIG_FTM_QUADDEC) += ftm-quaddec
obj-$(CONFIG_MICROCHIP_TCB_CAPTURE) += microchip-tcb-capture.o
obj-$(CONFIG_INTEL_QEP) += intel-qep.o
obj-$(CONFIG_TI_ECAP_CAPTURE) += ti-ecap-capture.o
+obj-$(CONFIG_ROCKCHIP_PWM_CAPTURE) += rockchip-pwm-capture.o
diff --git a/drivers/counter/rockchip-pwm-capture.c b/drivers/counter/rockchip-pwm-capture.c
new file mode 100644
index 0000000000000000000000000000000000000000..b2bfa2c6e04dfa0410fa0d7ef1c395217e4a9db2
--- /dev/null
+++ b/drivers/counter/rockchip-pwm-capture.c
@@ -0,0 +1,341 @@
@@ -398,6 +389,3 @@ index 0000000000000000000000000000000000000000..b2bfa2c6e04dfa0410fa0d7ef1c39521
+MODULE_LICENSE("GPL");
+MODULE_IMPORT_NS("ROCKCHIP_MFPWM");
+MODULE_IMPORT_NS("COUNTER");
--
2.49.0

View File

@@ -1,8 +1,6 @@
diff --git a/drivers/pwm/pwm-rockchip-v4.c b/drivers/pwm/pwm-rockchip-v4.c
index 980b27454..3bc3d4979 100644
--- a/drivers/pwm/pwm-rockchip-v4.c
+++ b/drivers/pwm/pwm-rockchip-v4.c
@@ -292,6 +292,8 @@ static int rockchip_pwm_v4_probe(struct platform_device *pdev)
@@ -292,6 +292,8 @@ static int rockchip_pwm_v4_probe(struct
if (IS_ERR(chip))
return PTR_ERR(chip);

View File

@@ -8,8 +8,6 @@ Changes in v2:
drivers/mmc/host/sdhci-of-dwcmshc.c | 39 +++++++++++++++++++++++++++++++++++++
1 file changed, 39 insertions(+)
diff --git a/drivers/mmc/host/sdhci-of-dwcmshc.c b/drivers/mmc/host/sdhci-of-dwcmshc.c
index 09b9ab15e4995f0bddf57dd309c010c849be40d9..a00aec05eff2da8197cc64690ba9665be756e54a 100644
--- a/drivers/mmc/host/sdhci-of-dwcmshc.c
+++ b/drivers/mmc/host/sdhci-of-dwcmshc.c
@@ -17,6 +17,7 @@
@@ -20,7 +18,7 @@ index 09b9ab15e4995f0bddf57dd309c010c849be40d9..a00aec05eff2da8197cc64690ba9665b
#include <linux/pm_runtime.h>
#include <linux/reset.h>
#include <linux/sizes.h>
@@ -745,6 +746,28 @@ static void dwcmshc_rk35xx_postinit(struct sdhci_host *host, struct dwcmshc_priv
@@ -787,6 +788,28 @@ static void dwcmshc_rk35xx_postinit(stru
}
}
@@ -49,7 +47,7 @@ index 09b9ab15e4995f0bddf57dd309c010c849be40d9..a00aec05eff2da8197cc64690ba9665b
static int th1520_execute_tuning(struct sdhci_host *host, u32 opcode)
{
struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
@@ -1176,6 +1199,18 @@ static const struct dwcmshc_pltfm_data sdhci_dwcmshc_rk35xx_pdata = {
@@ -1218,6 +1241,18 @@ static const struct dwcmshc_pltfm_data s
.postinit = dwcmshc_rk35xx_postinit,
};
@@ -68,16 +66,14 @@ index 09b9ab15e4995f0bddf57dd309c010c849be40d9..a00aec05eff2da8197cc64690ba9665b
static const struct dwcmshc_pltfm_data sdhci_dwcmshc_th1520_pdata = {
.pdata = {
.ops = &sdhci_dwcmshc_th1520_ops,
@@ -1274,6 +1309,10 @@ static const struct of_device_id sdhci_dwcmshc_dt_ids[] = {
.compatible = "rockchip,rk3588-dwcmshc",
@@ -1317,6 +1352,10 @@ static const struct of_device_id sdhci_d
.data = &sdhci_dwcmshc_rk35xx_pdata,
},
+ {
{
+ .compatible = "rockchip,rk3576-dwcmshc",
+ .data = &sdhci_dwcmshc_rk3576_pdata,
+ },
{
+ {
.compatible = "rockchip,rk3568-dwcmshc",
.data = &sdhci_dwcmshc_rk35xx_pdata,
---
},

View File

@@ -11,7 +11,7 @@ Signed-off-by: wevsty <ty@wevs.org>
--- a/arch/arm64/boot/dts/rockchip/rk356x.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk356x.dtsi
@@ -1127,10 +1127,10 @@
@@ -1132,10 +1132,10 @@
};
rng: rng@fe388000 {

View File

@@ -191,7 +191,7 @@ Signed-off-by: hmz007 <hmz007@gmail.com>
const char *const *parent_names,
--- a/include/soc/rockchip/rockchip_sip.h
+++ b/include/soc/rockchip/rockchip_sip.h
@@ -16,5 +16,16 @@
@@ -19,5 +19,16 @@
#define ROCKCHIP_SIP_CONFIG_DRAM_CLR_IRQ 0x06
#define ROCKCHIP_SIP_CONFIG_DRAM_SET_PARAM 0x07
#define ROCKCHIP_SIP_CONFIG_DRAM_SET_ODT_PD 0x08

View File

@@ -9,7 +9,7 @@ Signed-off-by: hmz007 <hmz007@gmail.com>
--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi
@@ -1074,6 +1074,13 @@
@@ -1075,6 +1075,13 @@
status = "disabled";
};

View File

@@ -54,5 +54,5 @@
+};
+
&gmac2io {
phy-handle = <&yt8531c>;
tx_delay = <0x19>;
/delete-property/ tx_delay;
/delete-property/ rx_delay;

View File

@@ -2,7 +2,7 @@
index 83a7af898..b92e702d1 100644
--- a/net/rfkill/Kconfig
+++ b/net/rfkill/Kconfig
@@ -32,3 +32,12 @@ config RFKILL_GPIO
@@ -36,3 +36,12 @@ config RFKILL_GPIO
help
If you say yes here you get support of a generic gpio RFKILL
driver.
@@ -15,19 +15,14 @@ index 83a7af898..b92e702d1 100644
+ help
+ If you say yes here you get support of a new generic gpio RFKILL
+ driver.
diff --git a/net/rfkill/Makefile b/net/rfkill/Makefile
index dc47b6174..680302e72 100644
--- a/net/rfkill/Makefile
+++ b/net/rfkill/Makefile
@@ -7,3 +7,5 @@ rfkill-y += core.o
rfkill-$(CONFIG_RFKILL_INPUT) += input.o
obj-$(CONFIG_RFKILL) += rfkill.o
obj-$(CONFIG_RFKILL_FULL) += rfkill.o
obj-$(CONFIG_RFKILL_GPIO) += rfkill-gpio.o
+
+obj-$(CONFIG_RFKILL_GPIO_NEO) += rfkill-gpio-neo.o
diff --git a/net/rfkill/rfkill-gpio-neo.c b/net/rfkill/rfkill-gpio-neo.c
new file mode 100644
index 000000000..745e417e6
--- /dev/null
+++ b/net/rfkill/rfkill-gpio-neo.c
@@ -0,0 +1,261 @@

View File

@@ -1,5 +1,5 @@
--- a/drivers/net/phy/motorcomm.c 2025-02-14 18:58:18.691542738 +0900
+++ b/drivers/net/phy/motorcomm.c 2025-02-14 19:05:00.299135505 +0900
--- a/drivers/net/phy/motorcomm.c
+++ b/drivers/net/phy/motorcomm.c
@@ -353,6 +353,12 @@
#define YT8821_CHIP_MODE_AUTO_BX2500_SGMII 0
#define YT8821_CHIP_MODE_FORCE_BX2500 1
@@ -13,7 +13,7 @@
struct yt8521_priv {
/* combo_advertising is used for case of YT8521 in combo mode,
* this means that yt8521 may work in utp or fiber mode which depends
@@ -1577,6 +1583,20 @@
@@ -1577,6 +1583,20 @@ static int yt8521_modify_utp_fiber_bmcr(
return 0;
}
@@ -34,7 +34,7 @@
/**
* yt8521_soft_reset() - called to issue a PHY software reset
* @phydev: a pointer to a &struct phy_device
@@ -1677,6 +1697,9 @@
@@ -1677,6 +1697,9 @@ static int yt8521_config_init(struct phy
if (ret < 0)
goto err_restore_page;
}

View File

@@ -1,6 +1,6 @@
--- a/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c 2025-03-06 21:30:53.981108971 +0900
+++ b/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c 2025-03-06 21:30:06.752107940 +0900
@@ -138,6 +138,7 @@
--- a/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c
+++ b/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c
@@ -138,6 +138,7 @@ struct rockchip_combphy_grfcfg {
struct combphy_reg pipe_xpcs_phy_ready;
struct combphy_reg pipe_pcie1l0_sel;
struct combphy_reg pipe_pcie1l1_sel;
@@ -8,7 +8,7 @@
};
struct rockchip_combphy_cfg {
@@ -290,6 +291,7 @@
@@ -290,6 +291,7 @@ static struct phy *rockchip_combphy_xlat
static int rockchip_combphy_parse_dt(struct device *dev, struct rockchip_combphy_priv *priv)
{
@@ -16,7 +16,7 @@
int i;
priv->num_clks = devm_clk_bulk_get_all(dev, &priv->clks);
@@ -325,6 +327,11 @@
@@ -325,6 +327,11 @@ static int rockchip_combphy_parse_dt(str
priv->ext_refclk = device_property_present(dev, "rockchip,ext-refclk");
@@ -28,7 +28,7 @@
priv->phy_rst = devm_reset_control_get_exclusive(dev, "phy");
/* fallback to old behaviour */
if (PTR_ERR(priv->phy_rst) == -ENOENT)
@@ -704,6 +711,7 @@
@@ -704,6 +711,7 @@ static const struct rockchip_combphy_grf
/* pipe-grf */
.pipe_con0_for_sata = { 0x0000, 15, 0, 0x00, 0x2220 },
.pipe_xpcs_phy_ready = { 0x0040, 2, 2, 0x00, 0x01 },

View File

@@ -1,11 +1,11 @@
--- a/arch/x86/include/asm/intel-family.h
+++ b/arch/x86/include/asm/intel-family.h
@@ -126,6 +126,8 @@
#define INTEL_GRANITERAPIDS_X IFM(6, 0xAD) /* Redwood Cove */
#define INTEL_GRANITERAPIDS_D IFM(6, 0xAE)
@@ -117,6 +117,8 @@
#define INTEL_BARTLETTLAKE IFM(6, 0xD7) /* Raptor Cove */
+#define INTEL_RAPTORCOVE IFM(6, 0xD7) /* Bartlett Lake */
+
/* "Hybrid" Processors (P-Core/E-Core) */
#define INTEL_LAKEFIELD IFM(6, 0x8A) /* Sunny Cove / Tremont */
#define INTEL_LAKEFIELD IFM(6, 0x8A) /* Sunny Cove / Tremont */

View File

@@ -15,7 +15,7 @@ when FPU is not usable.
--- a/crypto/Kconfig
+++ b/crypto/Kconfig
@@ -683,6 +683,16 @@ config CRYPTO_HCTR2
@@ -685,6 +685,16 @@ config CRYPTO_HCTR2
See https://eprint.iacr.org/2021/1441

View File

@@ -9,7 +9,7 @@
```sh
curl -fSsLO https://raw.githubusercontent.com/enfein/mieru/refs/heads/main/tools/setup.py
chmod +x setup.py
sudo python3 setup.py
sudo python3 setup.py --lang=zh
```
或者,你也可以使用以下步骤手动安装并配置代理服务器。

View File

@@ -60,6 +60,14 @@ mita proxy server is not installed.
Type "y" to install mita proxy server.
Type any other character to exit.
(default is "y")
>>> '''
if _lang == ZH:
install_prompt = '''
[安装 mita]
尚未安装 mita 代理服务器软件。
输入 "y" 开始安装 mita 代理服务器软件。
输入其他任意字符退出。
(默认值是 "y")
>>> '''
install, _ = check_input(prompt=install_prompt, validator=any_validator(), default='y')
if install != 'y':
@@ -83,6 +91,15 @@ A new version {sys_info.latest_mita_version} is available.
Type "y" to update mita proxy server.
Type any other character to exit.
(default is "y")
>>> '''
if _lang == ZH:
update_prompt = f'''
[更新 mita]
已安装的 mita 代理服务器软件版本是 {sys_info.installed_mita_version}
最新版本是 {sys_info.latest_mita_version}
输入 "y" 开始更新 mita 代理服务器软件。
输入其他任意字符退出。
(默认值是 "y")
>>> '''
update, _ = check_input(prompt=update_prompt, validator=any_validator(), default='y')
if update != 'y':
@@ -103,33 +120,65 @@ mita proxy server is installed but not configured.
Type "y" to configure mita proxy server.
Type any other character to exit.
(default is "y")
>>> '''
if _lang == ZH:
configure_prompt = '''
[配置 mita 代理服务器]
mita 代理服务器已经安装但尚未配置。
输入 "y" 开始配置 mita 代理服务器。
输入其他任意字符退出。
(默认值是 "y")
>>> '''
configure, _ = check_input(prompt=configure_prompt, validator=any_validator(), default='y')
if configure != 'y':
return
configurer = Configurer()
add_op_user_prompt = '''
[configure mita server][add operation user]
[configure mita server][add Linux operation user]
Type a Linux user name to add the user to "mita" group,
such that the user can invoke mita command.
Otherwise, only root user can invoke mita command.
Press Enter to skip (default).
>>> '''
if _lang == ZH:
add_op_user_prompt = '''
[配置 mita 代理服务器][添加 Linux 操作用户]
输入一个 Linux 用户名,将其添加至 "mita" 用户组,
该用户将可以调用 mita 指令。
否则,只有 root 用户可以调用 mita 指令。
输入回车跳过这个步骤(默认)。
>>> '''
op_user, _ = check_input(prompt=add_op_user_prompt, validator=any_validator())
if op_user != "":
if configurer.add_operation_user(op_user):
print(f'Added {op_user} to mita group.')
if _lang == ZH:
print(f'已添加 {op_user} 至 mita 用户组。')
else:
print(f'Added {op_user} to mita group.')
else:
print(f'Failed to add {op_user} to mita group.')
if _lang == ZH:
print(f'添加 {op_user} 至 mita 用户组失败。')
else:
print(f'Failed to add {op_user} to mita group.')
configurer.configure_server(sys_info)
if not configurer.restart_mita():
print_exit(f'Failed to restart mita proxy server.')
if _lang == ZH:
print_exit('重新启动 mita 代理服务失败。')
else:
print_exit('Failed to restart mita proxy server.')
sys_info.is_mita_config_applied = True
build_client_prompt = '''
[configure mieru client]
Type "y" to generate mieru proxy client configuration.
Type any other character to exit.
(default is "y")
>>> '''
if _lang == ZH:
build_client_prompt = '''
[配置 mieru 客户端]
输入 "y" 生成 mieru 代理客户端的配置。
输入其他任意字符退出。
(默认值是 "y")
>>> '''
build_client, _ = check_input(prompt=build_client_prompt, validator=any_validator(), default='y')
if build_client != 'y':
@@ -141,9 +190,17 @@ Type any other character to exit.
uninstall_prompt = '''
[uninstall mita]
mita proxy server is installed.
Type "y" to uninstall mita proxy server.
Type "y" to uninstall mita proxy server and delete configuration.
Type any other character to exit.
(default is "n")
>>> '''
if _lang == ZH:
uninstall_prompt = '''
[卸载 mita]
已经安装 mita 代理服务器。
输入 "y" 卸载 mita 代理服务器并删除配置。
输入其他任意字符退出。
(默认值是 "n")
>>> '''
uninstall, _ = check_input(prompt=uninstall_prompt, validator=any_validator(), default='n')
if uninstall != 'y':
@@ -161,10 +218,16 @@ class SysInfo:
self.package_manager = self.detect_package_manager()
if self.package_manager == '':
print_exit('Failed to detect system package manager. Supported: deb, rpm.')
if _lang == ZH:
print_exit('检测系统包管理器失败。支持 deb 和 rpm。')
else:
print_exit('Failed to detect system package manager. Supported: deb, rpm.')
self.cpu_arch = self.detect_cpu_arch()
if self.cpu_arch == '':
print_exit('Failed to detect CPU architecture. Supported: amd64, arm64.')
if _lang == ZH:
print_exit('检测 CPU 架构失败。支持 amd64 和 arm64。')
else:
print_exit('Failed to detect CPU architecture. Supported: amd64, arm64.')
self.is_mita_installed = self.detect_mita_installed()
self.is_mita_systemd_active = self.detect_mita_systemd_active()
@@ -184,18 +247,27 @@ class SysInfo:
def check_python_version(self) -> None:
if sys.version_info < (3, 8, 0):
print_exit('Python version must be 3.8.0 or higher.')
if _lang == ZH:
print_exit('Python 版本必须为 3.8.0 或更高。')
else:
print_exit('Python version must be 3.8.0 or higher.')
def check_platform(self) -> None:
if not sys.platform.startswith('linux'):
print_exit('You can only run this program on Linux.')
if _lang == ZH:
print_exit('只能在 Linux 系统中运行此程序。')
else:
print_exit('You can only run this program on Linux.')
def check_permission(self) -> None:
uid = os.getuid()
if uid != 0:
print_exit('Only root user can run this program.')
if _lang == ZH:
print_exit('只有 root 用户可以运行此程序。')
else:
print_exit('Only root user can run this program.')
def detect_package_manager(self) -> str:
@@ -285,7 +357,10 @@ class SysInfo:
j = json.loads(body.decode('utf-8'))
return j['tag_name'].strip('v')
except Exception as e:
print_exit(f'Failed to query latest mita version: {e}')
if _lang == ZH:
print_exit(f'查询最新的 mita 版本失败:{e}')
else:
print_exit(f'Failed to query latest mita version: {e}')
class Version:
@@ -437,7 +512,10 @@ class Installer:
Return the path of downloaded file.
'''
if sys_info.latest_mita_version == None:
print_exit('Latest mita version is unknown.')
if _lang == ZH:
print_exit('获取 mita 的最新版本失败。')
else:
print_exit('Latest mita version is unknown.')
ver = sys_info.latest_mita_version
download_url = ''
if sys_info.package_manager == 'deb' and sys_info.cpu_arch == 'amd64':
@@ -449,14 +527,26 @@ class Installer:
elif sys_info.package_manager == 'rpm' and sys_info.cpu_arch == 'arm64':
download_url = f'https://github.com/enfein/mieru/releases/download/v{ver}/mita-{ver}-1.aarch64.rpm'
else:
print_exit(f'Failed to determine download URL based on package manager {sys_info.package_manager} and CPU architecture {sys_info.cpu_arch}')
if _lang == ZH:
print_exit(f'从包管理器 {sys_info.package_manager} 和 CPU 架构 {sys_info.cpu_arch} 无法决定下载链接。')
else:
print_exit(f'Failed to determine download URL based on package manager {sys_info.package_manager} and CPU architecture {sys_info.cpu_arch}.')
filename = os.path.join('/tmp', download_url.split('/')[-1])
try:
print(f'Downloading from {download_url}')
if _lang == ZH:
print(f'正在下载 {download_url}')
else:
print(f'Downloading from {download_url}')
urllib.request.urlretrieve(download_url, filename)
print(f'Downloaded to {filename}')
if _lang == ZH:
print(f'下载文件存储在 {filename}')
else:
print(f'Downloaded to {filename}')
except urllib.error.URLError as e:
print_exit(f'Failed to download {download_url}: {e}')
if _lang == ZH:
print_exit(f'下载 {download_url} 失败:{e}')
else:
print_exit(f'Failed to download {download_url}: {e}')
return filename
@@ -466,13 +556,22 @@ class Installer:
if ext == 'deb':
run_command(args=['dpkg', '-i', package_path],
timeout=60, check=True, print_args=True, print_stdout=True)
print(f'Installed {package_path}')
if _lang == ZH:
print(f'已安装 {package_path}')
else:
print(f'Installed {package_path}')
elif ext == 'rpm':
run_command(args=['rpm', '-Uvh', '--force', package_path],
timeout=60, check=True, print_args=True, print_stdout=True)
print(f'Installed {package_path}')
if _lang == ZH:
print(f'已安装 {package_path}')
else:
print(f'Installed {package_path}')
else:
print_exit(f'Unable to install {basename}: it is not a deb or a rpm package.')
if _lang == ZH:
print_exit(f'无法安装 {basename}:它不是 deb 或 rpm 安装包。')
else:
print_exit(f'Unable to install {basename}: it is not a deb or a rpm package.')
class Configurer:
@@ -502,44 +601,75 @@ class Configurer:
# Refresh the latest information and check pre-condition.
sys_info.is_mita_installed = sys_info.detect_mita_installed()
if not sys_info.is_mita_installed:
print_exit('mita proxy server is not installed.')
if _lang == ZH:
print_exit('mita 代理服务器软件尚未安装。')
else:
print_exit('mita proxy server is not installed.')
sys_info.is_mita_systemd_active = sys_info.detect_mita_systemd_active()
if not sys_info.is_mita_systemd_active:
print_exit('mita systemd service is not active.')
if _lang == ZH:
print_exit('mita systemd 服务尚未运行。')
else:
print_exit('mita systemd service is not active.')
while True:
# Let user to set server configuration.
if len(self._server_config.users()) == 0:
if not self.configure_users():
print('configure user is not successful')
if _lang == ZH:
print('配置用户失败。')
else:
print('Configure user is not successful.')
continue
if len(self._server_config.port_bindings()) == 0:
if not self.configure_port_bindings():
print('configure protocol and ports is not successful')
if _lang == ZH:
print('配置协议和端口失败。')
else:
print('Configure protocol and ports is not successful.')
continue
# Let user to confirm the server configuration.
print('The following server configuration will be applied:')
if _lang == ZH:
print('即将应用下面的代理服务器配置:')
else:
print('The following server configuration will be applied:')
print('')
self.describe_server_config()
print('')
confirm_prompt = '''Type "y" or "n" to apply or discard the server configuration.
(default is "y")
>>> '''
if _lang == ZH:
confirm_prompt = '''输入 "y" 确定,输入 "n" 取消。
(默认值是 "y")
>>> '''
confirm, valid = check_input(prompt=confirm_prompt, validator=match_preset_validator(['y', 'n']), default='y')
if not valid:
self._server_config = ServerConfig()
print(f'Invalid input: {confirm} is an invalid option. Discarded the server configuration.')
if _lang == ZH:
print(f'输入 {confirm} 是非法选项。已丢弃代理服务器配置。')
else:
print(f'Invalid input: {confirm} is an invalid option. Discarded the server configuration.')
continue
if confirm == 'y':
config_path = self.apply_server_config()
if config_path != '':
print(f'Server configuration file is stored at {config_path}')
if _lang == ZH:
print(f'代理服务器配置文件存储在 {config_path}')
else:
print(f'Server configuration file is stored at {config_path}')
return
print_exit('Apply server configuration is not successful.')
if _lang == ZH:
print_exit('应用代理服务器配置失败。')
else:
print_exit('Apply server configuration is not successful.')
else:
self._server_config = ServerConfig()
print('Discarded the server configuration.')
if _lang == ZH:
print('已丢弃代理服务器配置。')
else:
print('Discarded the server configuration.')
continue
@@ -551,38 +681,71 @@ class Configurer:
while True:
try:
external_ip = urllib.request.urlopen('https://checkip.amazonaws.com').read().decode('utf8').strip()
print(f'Your external IP address is: {external_ip}')
if _lang == ZH:
print(f'服务器的公网 IP 地址是 {external_ip}')
else:
print(f'Server\'s public IP address is: {external_ip}')
except Exception as e:
print(f'Failed to retrieve external IP address: {e}')
if _lang == ZH:
print(f'获取服务器的公网 IP 地址失败:{e}')
else:
print(f'Failed to retrieve server\'s public IP address: {e}')
time.sleep(1)
continue
socks5_port_prompt = '''
[configure mieru client][configure socks5 listening port]
Type a single port number to listen to socks5 requests.
(default is "1080")
>>> '''
if _lang == ZH:
socks5_port_prompt = '''
[配置 mieru 客户端][配置 socks5 监听端口]
输入一个端口号用于监听 socks5 请求。
(默认值是 "1080")
>>> '''
socks5_port, valid = check_input(prompt=socks5_port_prompt, validator=port_validator(), default='1080')
if not valid:
print(f'Invalid input: {socks5_port} is an invalid port number')
if _lang == ZH:
print(f'输入 {socks5_port} 是非法的端口号。')
else:
print(f'Invalid input: {socks5_port} is an invalid port number.')
continue
http_port_prompt = '''
[configure mieru client][configure HTTP proxy listening port]
Type a single port number to listen to HTTP and HTTPS requests.
Type a single port number to listen to HTTP and HTTPS proxy requests.
(default is "8080")
>>> '''
if _lang == ZH:
http_port_prompt = '''
[配置 mieru 客户端][配置 HTTP 代理监听端口]
输入一个端口号用于监听 HTTP 和 HTTPS 代理请求。
(默认值是 "8080")
>>> '''
http_port, valid = check_input(prompt=http_port_prompt, validator=port_validator(), default='8080')
if not valid:
print(f'Invalid input: {http_port} is an invalid port number')
if _lang == ZH:
print(f'输入 {http_port} 是非法的端口号。')
else:
print(f'Invalid input: {http_port} is an invalid port number.')
continue
rpc_port_prompt = '''
[configure mieru client][configure management listening port]
Type a single port number to listen to management RPC requests.
(default is randonly select a number from 2000 to 8000)
>>> '''
if _lang == ZH:
rpc_port_prompt = '''
[配置 mieru 客户端][配置管理监听端口]
输入一个端口号用于监听管理 RPC 请求。
(默认值是从 2000 到 8000 随机选取一个数字)
>>> '''
rpc_port_default = str(random.randint(2000, 8000))
rpc_port, valid = check_input(prompt=rpc_port_prompt, validator=port_validator(), default=rpc_port_default)
if not valid:
print(f'Invalid input: {rpc_port} is an invalid port number')
if _lang == ZH:
print(f'输入 {rpc_port} 是非法的端口号。')
else:
print(f'Invalid input: {rpc_port} is an invalid port number.')
continue
self._client_config.set_user(self._server_config.users()[0]['name'], self._server_config.users()[0]['password'])
if 'port' in self._server_config.port_bindings()[0]:
@@ -594,11 +757,17 @@ Type a single port number to listen to management RPC requests.
self._server_config.port_bindings()[0]['portRange'],
self._server_config.port_bindings()[0]['protocol'])
else:
print_exit(f'Found invalid server configuration port bindings.')
if _lang == ZH:
print_exit('代理服务器的端口绑定设置是非法的。')
else:
print_exit('Found invalid server configuration port bindings.')
self._client_config.set_rpc_port(int(rpc_port))
self._client_config.set_socks5_port(int(socks5_port))
self._client_config.set_http_proxy_port(int(http_port))
print('The following client configuration is generated:')
if _lang == ZH:
print('生成了下面的客户端配置:')
else:
print('The following client configuration is generated:')
print('')
print(self._client_config.to_json())
print('')
@@ -607,11 +776,17 @@ Type a single port number to listen to management RPC requests.
ntf.write(self._client_config.to_json())
ntf.flush()
except Exception as e:
print(f'Failed to save client configuration to {ntf.name}: {e}')
if _lang == ZH:
print(f'存储客户端配置至 {ntf.name} 失败:{e}')
else:
print(f'Failed to save client configuration to {ntf.name}: {e}')
return ''
finally:
ntf.close()
print(f'Client configuration file is stored at {ntf.name}')
if _lang == ZH:
print(f'客户端配置文件存储在 {ntf.name}')
else:
print(f'Client configuration file is stored at {ntf.name}')
return
@@ -628,34 +803,59 @@ Type a single port number to listen to management RPC requests.
def configure_users(self) -> bool:
op_prompt = '''
[configure mita server][configure proxy user]
Type a number to select from the options below.
Type number "1" or "2" to select from the options below.
(1): automatically generate user name and password (default)
(2): manually type user name and password
>>> '''
if _lang == ZH:
op_prompt = '''
[配置 mita 代理服务器][配置代理用户]
输入数字 "1""2" 选择下面的选项。
(1): 自动生成用户名和密码 (默认值)
(2): 手动输入用户名和密码
>>> '''
op, valid = check_input(prompt=op_prompt, validator=match_preset_validator(['1', '2']), default='1')
if not valid:
print(f'Invalid input: {op} is an invalid option')
if _lang == ZH:
print(f'输入 {op} 是非法的选项。')
else:
print(f'Invalid input: {op} is an invalid option.')
return False
if op == '1':
self._server_config.set_user(self.generate_random_str(), self.generate_random_str())
return True
elif op == '2':
user_prompt = '''Type a user name
>>> '''
if _lang == ZH:
user_prompt = '''输入用户名
>>> '''
u, valid = check_input(prompt=user_prompt, validator=not_empty_validator())
if not valid:
print('Invalid input: user name is empty')
if _lang == ZH:
print('输入的用户名为空值。')
else:
print('Invalid input: user name is empty.')
return False
pass_prompt = '''Type a password
>>> '''
if _lang == ZH:
pass_prompt = '''输入密码
>>> '''
p, valid = check_input(prompt=pass_prompt, validator=not_empty_validator())
if not valid:
print('Invalid input: password is empty')
if _lang == ZH:
print('输入的密码为空值。')
else:
print('Invalid input: password is empty.')
return False
self._server_config.set_user(u, p)
return True
else:
print(f'{op} is an invalid option')
if _lang == ZH:
print(f'{op} 是非法的选项。')
else:
print(f'{op} is an invalid option.')
return False
@@ -663,40 +863,72 @@ Type a number to select from the options below.
protocol_prompt = '''
[configure mita server][configure protocol and ports]
Type the proxy protocol to use. Support "TCP" and "UDP".
>>> '''
if _lang == ZH:
protocol_prompt = '''
[配置 mita 代理服务器][配置协议和端口]
输入代理协议。支持 "TCP""UDP"
>>> '''
protocol, valid = check_input(prompt=protocol_prompt, validator=match_preset_validator(['TCP', 'UDP']))
if not valid:
print(f'Invalid input: {protocol} is an invalid protocol')
if _lang == ZH:
print(f'输入 {protocol} 是非法的协议。')
else:
print(f'Invalid input: {protocol} is an invalid protocol.')
return False
op_prompt = '''Type a number to select from the options below.
op_prompt = '''Type number "1" or "2" to select from the options below.
(1): add a single listening port like "9000" (default)
(2): add a listening port range like "9000-9010"
>>> '''
if _lang == ZH:
op_prompt = '''输入数字 "1""2" 选择下面的选项。
(1): 添加一个端口号,例如 "9000" (默认值)
(2): 添加一个端口段,例如 "9000-9010"
>>> '''
op, valid = check_input(prompt=op_prompt, validator=match_preset_validator(['1', '2']), default='1')
if not valid:
print(f'Invalid input: {op} is an invalid option')
if _lang == ZH:
print(f'输入 {op} 是非法的选项。')
else:
print(f'Invalid input: {op} is an invalid option.')
return False
if op == '1':
port_prompt = '''Type a single port number like "9000".
port_prompt = '''Type a single port number.
Minimum value is 1. Maximum value is 65535.
>>> '''
if _lang == ZH:
port_prompt = '''输入一个端口号。
最小值为 1。最大值为 65535。
>>> '''
port, valid = check_input(prompt=port_prompt, validator=port_validator())
if not valid:
print(f'Invalid input: {port} is an invalid port number')
if _lang == ZH:
print(f'输入 {port} 是非法的端口号。')
else:
print(f'Invalid input: {port} is an invalid port number.')
return False
self._server_config.add_port(int(port), protocol)
return True
elif op == '2':
port_range_prompt = '''Type a port range like "9000-9010". No space character.
>>> '''
if _lang == ZH:
port_range_prompt = '''输入一个端口段,例如 "9000-9010"。请勿使用空格分隔。
>>> '''
port_range, valid = check_input(prompt=port_range_prompt, validator=port_range_validator())
if not valid:
print(f'Invalid input: {port_range} is an invalid port range')
if _lang == ZH:
print(f'输入 {port_range} 是非法的端口段。')
else:
print(f'Invalid input: {port_range} is an invalid port range.')
return False
self._server_config.add_port_range(port_range, protocol)
return True
else:
print(f'{op} is an invalid option')
if _lang == ZH:
print(f'{op} 是非法的选项。')
else:
print(f'{op} is an invalid option.')
return False
@@ -717,7 +949,10 @@ Minimum value is 1. Maximum value is 65535.
ntf.write(self._server_config.to_json())
ntf.flush()
except Exception as e:
print(f'Failed to save server configuration to {ntf.name}: {e}')
if _lang == ZH:
print(f'存储代理服务器配置至 {ntf.name} 失败:{e}')
else:
print(f'Failed to save server configuration to {ntf.name}: {e}')
return ''
finally:
ntf.close()
@@ -743,7 +978,10 @@ class Uninstaller:
run_command(['systemctl', 'daemon-reload'], timeout=30, print_args=True)
run_command(['userdel', 'mita'], print_args=True, print_stdout=True)
run_command(['groupdel', 'mita'], print_args=True, print_stdout=True)
print('mita proxy server is uninstalled')
if _lang == ZH:
print('成功卸载了 mita 代理服务器软件。')
else:
print('mita proxy server is uninstalled.')
elif sys_info.package_manager == 'rpm':
run_command(['systemctl', 'stop', 'mita'], print_args=True)
run_command(['rpm', '-e', 'mita'], timeout=30, print_args=True, print_stdout=True)
@@ -757,9 +995,15 @@ class Uninstaller:
run_command(['systemctl', 'daemon-reload'], timeout=30, print_args=True)
run_command(['userdel', 'mita'], print_args=True, print_stdout=True)
run_command(['groupdel', 'mita'], print_args=True, print_stdout=True)
print('mita proxy server is uninstalled')
if _lang == ZH:
print('成功卸载了 mita 代理服务器软件。')
else:
print('mita proxy server is uninstalled.')
else:
print_exit('Failed to uninstall mita: failed to detect system package manager')
if _lang == ZH:
print_exit('卸载 mita 代理服务器软件失败:未能成功检测系统包管理器。')
else:
print_exit('Failed to uninstall mita: failed to detect system package manager.')
def run_command(args: List[str], input=None, timeout=10, check=False, print_args=False, print_stdout=False):
@@ -768,7 +1012,10 @@ def run_command(args: List[str], input=None, timeout=10, check=False, print_args
'''
try:
if print_args:
print(f'Running command {args}')
if _lang == ZH:
print(f'运行指令 {args}')
else:
print(f'Running command {args}')
result = subprocess.run(args,
input=input,
stdout=subprocess.PIPE,
@@ -777,9 +1024,15 @@ def run_command(args: List[str], input=None, timeout=10, check=False, print_args
check=check,
text=True)
except subprocess.TimeoutExpired as te:
print_exit(f'Command {te.cmd} timed out after {te.timeout} seconds. Output: {te.output}')
if _lang == ZH:
print_exit(f'指令 {te.cmd} 运行 {te.timeout} 秒后超时。输出:{te.output}')
else:
print_exit(f'Command {te.cmd} timed out after {te.timeout} seconds. Output: {te.output}')
except subprocess.CalledProcessError as cpe:
print_exit(f'Command {cpe.cmd} returned code {cpe.returncode}. Output: {cpe.output}')
if _lang == ZH:
print_exit(f'指令 {cpe.cmd} 的返回值为 {cpe.returncode}。输出:{cpe.output}')
else:
print_exit(f'Command {cpe.cmd} returned code {cpe.returncode}. Output: {cpe.output}')
finally:
if print_stdout and result.stdout:
print(result.stdout)
@@ -846,7 +1099,10 @@ def print_exit(*values: Any) -> None:
'''
Print and exit with a non-zero value.
'''
print("[ERROR]", *values)
if _lang == ZH:
print('[错误]', *values)
else:
print('[ERROR]', *values)
sys.exit(1)

View File

@@ -3,6 +3,7 @@ package updater
import (
"archive/tar"
"archive/zip"
"bytes"
"compress/gzip"
"fmt"
"io"
@@ -32,6 +33,17 @@ const (
typeTarGzip
)
func (t compressionType) String() string {
switch t {
case typeZip:
return "zip"
case typeTarGzip:
return "tar.gz"
default:
return "unknown"
}
}
var DefaultUiUpdater = &UIUpdater{}
func NewUiUpdater(externalUI, externalUIURL, externalUIName string) *UIUpdater {
@@ -99,48 +111,35 @@ func detectFileType(data []byte) compressionType {
}
func (u *UIUpdater) downloadUI() error {
err := u.prepareUIPath()
if err != nil {
return fmt.Errorf("prepare UI path failed: %w", err)
}
data, err := downloadForBytes(u.externalUIURL)
if err != nil {
return fmt.Errorf("can't download file: %w", err)
}
fileType := detectFileType(data)
if fileType == typeUnknown {
return fmt.Errorf("unknown or unsupported file type")
tmpDir := C.Path.Resolve("downloadUI.tmp")
defer os.RemoveAll(tmpDir)
extractedFolder, err := extract(data, tmpDir)
if err != nil {
return fmt.Errorf("can't extract compressed file: %w", err)
}
ext := ".zip"
if fileType == typeTarGzip {
ext = ".tgz"
}
saved := path.Join(C.Path.HomeDir(), "download"+ext)
log.Debugln("compression Type: %s", ext)
if err = saveFile(data, saved); err != nil {
return fmt.Errorf("can't save compressed file: %w", err)
}
defer os.Remove(saved)
err = cleanup(u.externalUIPath)
log.Debugln("cleanupFolder: %s", u.externalUIPath)
err = cleanup(u.externalUIPath) // cleanup files in dir don't remove dir itself
if err != nil {
if !os.IsNotExist(err) {
return fmt.Errorf("cleanup exist file error: %w", err)
}
}
extractedFolder, err := extract(saved, C.Path.HomeDir())
err = u.prepareUIPath()
if err != nil {
return fmt.Errorf("can't extract compressed file: %w", err)
return fmt.Errorf("prepare UI path failed: %w", err)
}
err = os.Rename(extractedFolder, u.externalUIPath)
log.Debugln("moveFolder from %s to %s", extractedFolder, u.externalUIPath)
err = moveDir(extractedFolder, u.externalUIPath) // move files from tmp to target
if err != nil {
return fmt.Errorf("rename UI folder failed: %w", err)
return fmt.Errorf("move UI folder failed: %w", err)
}
return nil
}
@@ -155,12 +154,11 @@ func (u *UIUpdater) prepareUIPath() error {
return nil
}
func unzip(src, dest string) (string, error) {
r, err := zip.OpenReader(src)
func unzip(data []byte, dest string) (string, error) {
r, err := zip.NewReader(bytes.NewReader(data), int64(len(data)))
if err != nil {
return "", err
}
defer r.Close()
// check whether or not only exists singleRoot dir
rootDir := ""
@@ -199,17 +197,7 @@ func unzip(src, dest string) (string, error) {
log.Debugln("extractedFolder: %s", extractedFolder)
} else {
log.Debugln("Match the multiRoot")
// or put the files/dirs into new dir
baseName := filepath.Base(src)
baseName = strings.TrimSuffix(baseName, filepath.Ext(baseName))
extractedFolder = filepath.Join(dest, baseName)
for i := 1; ; i++ {
if _, err := os.Stat(extractedFolder); os.IsNotExist(err) {
break
}
extractedFolder = filepath.Join(dest, fmt.Sprintf("%s_%d", baseName, i))
}
extractedFolder = dest
log.Debugln("extractedFolder: %s", extractedFolder)
}
@@ -221,13 +209,17 @@ func unzip(src, dest string) (string, error) {
fpath = filepath.Join(extractedFolder, f.Name)
}
if !strings.HasPrefix(fpath, filepath.Clean(dest)+string(os.PathSeparator)) {
if !inDest(fpath, dest) {
return "", fmt.Errorf("invalid file path: %s", fpath)
}
if f.FileInfo().IsDir() {
info := f.FileInfo()
if info.IsDir() {
os.MkdirAll(fpath, os.ModePerm)
continue
}
if info.Mode()&os.ModeSymlink != 0 {
continue // disallow symlink
}
if err = os.MkdirAll(filepath.Dir(fpath), os.ModePerm); err != nil {
return "", err
}
@@ -249,14 +241,8 @@ func unzip(src, dest string) (string, error) {
return extractedFolder, nil
}
func untgz(src, dest string) (string, error) {
file, err := os.Open(src)
if err != nil {
return "", err
}
defer file.Close()
gzr, err := gzip.NewReader(file)
func untgz(data []byte, dest string) (string, error) {
gzr, err := gzip.NewReader(bytes.NewReader(data))
if err != nil {
return "", err
}
@@ -299,8 +285,7 @@ func untgz(src, dest string) (string, error) {
isSingleRoot = false
}
file.Seek(0, 0)
gzr, _ = gzip.NewReader(file)
_ = gzr.Reset(bytes.NewReader(data))
tr = tar.NewReader(gzr)
var extractedFolder string
@@ -310,17 +295,7 @@ func untgz(src, dest string) (string, error) {
log.Debugln("extractedFolder: %s", extractedFolder)
} else {
log.Debugln("Match the multiRoot")
baseName := filepath.Base(src)
baseName = strings.TrimSuffix(baseName, filepath.Ext(baseName))
baseName = strings.TrimSuffix(baseName, ".tar")
extractedFolder = filepath.Join(dest, baseName)
for i := 1; ; i++ {
if _, err := os.Stat(extractedFolder); os.IsNotExist(err) {
break
}
extractedFolder = filepath.Join(dest, fmt.Sprintf("%s_%d", baseName, i))
}
extractedFolder = dest
log.Debugln("extractedFolder: %s", extractedFolder)
}
@@ -340,7 +315,7 @@ func untgz(src, dest string) (string, error) {
fpath = filepath.Join(extractedFolder, cleanTarPath(header.Name))
}
if !strings.HasPrefix(fpath, filepath.Clean(dest)+string(os.PathSeparator)) {
if !inDest(fpath, dest) {
return "", fmt.Errorf("invalid file path: %s", fpath)
}
@@ -367,16 +342,16 @@ func untgz(src, dest string) (string, error) {
return extractedFolder, nil
}
func extract(src, dest string) (string, error) {
srcLower := strings.ToLower(src)
switch {
case strings.HasSuffix(srcLower, ".tar.gz") ||
strings.HasSuffix(srcLower, ".tgz"):
return untgz(src, dest)
case strings.HasSuffix(srcLower, ".zip"):
return unzip(src, dest)
func extract(data []byte, dest string) (string, error) {
fileType := detectFileType(data)
log.Debugln("compression Type: %s", fileType)
switch fileType {
case typeZip:
return unzip(data, dest)
case typeTarGzip:
return untgz(data, dest)
default:
return "", fmt.Errorf("unsupported file format: %s", src)
return "", fmt.Errorf("unknown or unsupported file type")
}
}
@@ -398,22 +373,40 @@ func cleanTarPath(path string) string {
}
func cleanup(root string) error {
if _, err := os.Stat(root); os.IsNotExist(err) {
return nil
dirEntryList, err := os.ReadDir(root)
if err != nil {
return err
}
return filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
for _, dirEntry := range dirEntryList {
err = os.RemoveAll(filepath.Join(root, dirEntry.Name()))
if err != nil {
return err
}
if info.IsDir() {
if err := os.RemoveAll(path); err != nil {
return err
}
} else {
if err := os.Remove(path); err != nil {
return err
}
}
return nil
})
}
return nil
}
func moveDir(src string, dst string) error {
dirEntryList, err := os.ReadDir(src)
if err != nil {
return err
}
for _, dirEntry := range dirEntryList {
err = os.Rename(filepath.Join(src, dirEntry.Name()), filepath.Join(dst, dirEntry.Name()))
if err != nil {
return err
}
}
return nil
}
func inDest(fpath, dest string) bool {
if rel, err := filepath.Rel(dest, fpath); err == nil {
if filepath.IsLocal(rel) {
return true
}
}
return false
}

View File

@@ -7,6 +7,7 @@ import (
"net"
"net/netip"
"net/url"
"path/filepath"
"strings"
"time"
_ "unsafe"
@@ -759,6 +760,9 @@ func parseController(cfg *RawConfig) (*Controller, error) {
if path := cfg.ExternalUI; path != "" && !C.Path.IsSafePath(path) {
return nil, C.Path.ErrNotSafePath(path)
}
if uiName := cfg.ExternalUIName; uiName != "" && !filepath.IsLocal(uiName) {
return nil, fmt.Errorf("external UI name is not local: %s", uiName)
}
return &Controller{
ExternalController: cfg.ExternalController,
ExternalUI: cfg.ExternalUI,

View File

@@ -10,13 +10,25 @@ include $(TOPDIR)/rules.mk
PKG_ARCH_DDNSTO:=$(ARCH)
PKG_NAME:=ddnsto
PKG_VERSION:=3.0.4
PKG_RELEASE:=$(PKG_ARCH_DDNSTO)-7
PKG_SOURCE:=$(PKG_NAME)-binary-$(PKG_VERSION).tar.gz
# use PKG_SOURCE_DATE instead of PKG_VERSION for compitable
PKG_SOURCE_DATE:=3.0.4
PKG_RELEASE:=8
ARCH_HEXCODE:=
ifeq ($(ARCH),x86_64)
ARCH_HEXCODE=8664
else ifeq ($(ARCH),aarch64)
ARCH_HEXCODE=aa64
else ifeq ($(ARCH),arm)
ARCH_HEXCODE=aa32
else ifeq ($(ARCH),mipsel)
ARCH_HEXCODE=1b0c
endif
PKG_SOURCE_VERSION:=$(ARCH_HEXCODE)
PKG_SOURCE:=$(PKG_NAME)-binary-$(PKG_SOURCE_DATE).tar.gz
PKG_SOURCE_URL:=http://fw.koolcenter.com/binary/ddnsto/
PKG_HASH:=486aa15a5e026b5a3aca72f1850746e127a7e86ef11db8a7c498dad29545eaf6
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-binary-$(PKG_VERSION)
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-binary-$(PKG_SOURCE_DATE)
PKG_BUILD_PARALLEL:=1
PKG_USE_MIPS16:=0

View File

@@ -8,8 +8,8 @@ include $(TOPDIR)/rules.mk
LUCI_TITLE:=LuCI support for ddnsto
LUCI_DEPENDS:=+ddnsto +block-mount
LUCI_PKGARCH:=all
PKG_VERSION:=3.0.4
PKG_RELEASE:=0
PKG_VERSION:=3.0.4-r1
PKG_RELEASE:=
include $(TOPDIR)/feeds/luci/luci.mk

View File

@@ -9,7 +9,7 @@ LUCI_TITLE:=LuCI support for quickstart
LUCI_DEPENDS:=+quickstart +luci-app-store
LUCI_PKGARCH:=all
PKG_VERSION:=0.8.17-1
PKG_VERSION:=0.8.17-r1
# PKG_RELEASE MUST be empty for luci.mk
PKG_RELEASE:=

File diff suppressed because one or more lines are too long

View File

@@ -1404,6 +1404,11 @@ body[class*="node-"] > .main > .main-left > .nav > .slide > .menu.active::before
display: none;
}
[data-page="admin-system-autoreboot"] {
#cbi-autoreboot {
margin-top: 0;
}
}
.cbi-section,
.cbi-section-error,
@@ -3536,6 +3541,11 @@ div[style*="display:grid;grid-template-columns:repeat"] {
h2 + p {
margin-bottom: 1rem;
padding-left: 1.5rem;
}
button + div {
display: none;
}
}
}

View File

@@ -18,7 +18,7 @@ local function _n(name)
end
local ss_method_list = {
"aes-128-gcm", "aes-256-gcm", "chacha20-poly1305", "chacha20-ietf-poly1305", "xchacha20-poly1305", "xchacha20-ietf-poly1305", "2022-blake3-aes-128-gcm", "2022-blake3-aes-256-gcm", "2022-blake3-chacha20-poly1305"
"none", "plain", "aes-128-gcm", "aes-256-gcm", "chacha20-poly1305", "chacha20-ietf-poly1305", "xchacha20-poly1305", "xchacha20-ietf-poly1305", "2022-blake3-aes-128-gcm", "2022-blake3-aes-256-gcm", "2022-blake3-chacha20-poly1305"
}
local security_list = { "none", "auto", "aes-128-gcm", "chacha20-poly1305", "zero" }

View File

@@ -15,7 +15,7 @@ local function _n(name)
end
local ssrust_encrypt_method_list = {
"plain", "none",
"none", "plain",
"aes-128-gcm", "aes-256-gcm", "chacha20-ietf-poly1305",
"2022-blake3-aes-128-gcm", "2022-blake3-aes-256-gcm", "2022-blake3-chacha20-poly1305"
}

View File

@@ -17,7 +17,7 @@ local function _n(name)
end
local x_ss_method_list = {
"aes-128-gcm", "aes-256-gcm", "chacha20-poly1305", "xchacha20-poly1305", "2022-blake3-aes-128-gcm", "2022-blake3-aes-256-gcm", "2022-blake3-chacha20-poly1305"
"none", "plain", "aes-128-gcm", "aes-256-gcm", "chacha20-poly1305", "xchacha20-poly1305", "2022-blake3-aes-128-gcm", "2022-blake3-aes-256-gcm", "2022-blake3-chacha20-poly1305"
}
local header_type_list = {

View File

@@ -1247,14 +1247,14 @@ return view.extend({
so = ss.option(form.Flag, 'ipv6', _('IPv6 support'));
so.default = so.enabled;
so = ss.option(form.MultiValue, 'boot_server', _('Boot DNS server'),
so = ss.option(form.MultiValue, 'boot_server', _('Bootstrap DNS server'),
_('Used to resolve the domain of the DNS server. Must be IP.'));
so.default = 'default-dns';
so.load = L.bind(loadDNSServerLabel, so);
so.validate = L.bind(validateNameserver, so);
so.rmempty = false;
so = ss.option(form.MultiValue, 'bootnode_server', _('Boot DNS server (Node)'),
so = ss.option(form.MultiValue, 'bootnode_server', _('Bootstrap DNS server (Node)'),
_('Used to resolve the domain of the Proxy node.'));
so.default = 'default-dns';
so.load = L.bind(loadDNSServerLabel, so);

View File

@@ -265,11 +265,11 @@ msgid "Block DNS queries"
msgstr ""
#: htdocs/luci-static/resources/view/fchomo/client.js:905
msgid "Boot DNS server"
msgid "Bootstrap DNS server"
msgstr ""
#: htdocs/luci-static/resources/view/fchomo/client.js:912
msgid "Boot DNS server (Node)"
msgid "Bootstrap DNS server (Node)"
msgstr ""
#: htdocs/luci-static/resources/view/fchomo/global.js:777

View File

@@ -273,12 +273,12 @@ msgid "Block DNS queries"
msgstr "封锁 DNS 请求"
#: htdocs/luci-static/resources/view/fchomo/client.js:905
msgid "Boot DNS server"
msgstr "启动 DNS 服务器"
msgid "Bootstrap DNS server"
msgstr "引导 DNS 服务器"
#: htdocs/luci-static/resources/view/fchomo/client.js:912
msgid "Boot DNS server (Node)"
msgstr "启动 DNS 服务器 (节点)"
msgid "Bootstrap DNS server (Node)"
msgstr "引导 DNS 服务器 (节点)"
#: htdocs/luci-static/resources/view/fchomo/global.js:777
msgid "Bypass CN"

View File

@@ -273,12 +273,12 @@ msgid "Block DNS queries"
msgstr "封鎖 DNS 請求"
#: htdocs/luci-static/resources/view/fchomo/client.js:905
msgid "Boot DNS server"
msgstr "啟動 DNS 伺服器"
msgid "Bootstrap DNS server"
msgstr "引導 DNS 伺服器"
#: htdocs/luci-static/resources/view/fchomo/client.js:912
msgid "Boot DNS server (Node)"
msgstr "啟動 DNS 伺服器 (節點)"
msgid "Bootstrap DNS server (Node)"
msgstr "引導 DNS 伺服器 (節點)"
#: htdocs/luci-static/resources/view/fchomo/global.js:777
msgid "Bypass CN"

View File

@@ -18,7 +18,7 @@ local function _n(name)
end
local ss_method_list = {
"aes-128-gcm", "aes-256-gcm", "chacha20-poly1305", "chacha20-ietf-poly1305", "xchacha20-poly1305", "xchacha20-ietf-poly1305", "2022-blake3-aes-128-gcm", "2022-blake3-aes-256-gcm", "2022-blake3-chacha20-poly1305"
"none", "plain", "aes-128-gcm", "aes-256-gcm", "chacha20-poly1305", "chacha20-ietf-poly1305", "xchacha20-poly1305", "xchacha20-ietf-poly1305", "2022-blake3-aes-128-gcm", "2022-blake3-aes-256-gcm", "2022-blake3-chacha20-poly1305"
}
local security_list = { "none", "auto", "aes-128-gcm", "chacha20-poly1305", "zero" }

View File

@@ -15,7 +15,7 @@ local function _n(name)
end
local ssrust_encrypt_method_list = {
"plain", "none",
"none", "plain",
"aes-128-gcm", "aes-256-gcm", "chacha20-ietf-poly1305",
"2022-blake3-aes-128-gcm", "2022-blake3-aes-256-gcm", "2022-blake3-chacha20-poly1305"
}

View File

@@ -17,7 +17,7 @@ local function _n(name)
end
local x_ss_method_list = {
"aes-128-gcm", "aes-256-gcm", "chacha20-poly1305", "xchacha20-poly1305", "2022-blake3-aes-128-gcm", "2022-blake3-aes-256-gcm", "2022-blake3-chacha20-poly1305"
"none", "plain", "aes-128-gcm", "aes-256-gcm", "chacha20-poly1305", "xchacha20-poly1305", "2022-blake3-aes-128-gcm", "2022-blake3-aes-256-gcm", "2022-blake3-chacha20-poly1305"
}
local header_type_list = {

View File

@@ -6,12 +6,12 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=sing-box
PKG_VERSION:=1.11.10
PKG_VERSION:=1.11.11
PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/SagerNet/sing-box/tar.gz/v$(PKG_VERSION)?
PKG_HASH:=b79281cbe1a9585bf53855ebc9513ccf2fe772983c4926554389ba0f5598da3e
PKG_HASH:=31cc321efaa2fe9f3e3be9b065354552378f5a1dac49f6a24ce7e48d8a6c8979
PKG_LICENSE:=GPL-3.0-or-later
PKG_LICENSE_FILES:=LICENSE

View File

@@ -21,13 +21,13 @@ define Download/geoip
HASH:=8023379316bca4713dcfa5ba4ea2fe7f4c127fff64a0cb7859d4756142b2c4dc
endef
GEOSITE_VER:=20250508005311
GEOSITE_VER:=20250519095148
GEOSITE_FILE:=dlc.dat.$(GEOSITE_VER)
define Download/geosite
URL:=https://github.com/v2fly/domain-list-community/releases/download/$(GEOSITE_VER)/
URL_FILE:=dlc.dat
FILE:=$(GEOSITE_FILE)
HASH:=ff833c7e95d0dadb97ba7d96598563d159fabb0b774dcebea15f335797259f42
HASH:=7a75b3ea15c2a5503b4dc46a677d8c98990860d6fe5378e16c0d98cb848b51a8
endef
GEOSITE_IRAN_VER:=202505120041