generic: 6.1: refresh backport patches

Refresh backport patches with make target/linux/refresh.

Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
This commit is contained in:
Christian Marangi 2023-05-22 18:06:14 +02:00
parent ce345dd0df
commit f79af59383
No known key found for this signature in database
GPG key ID: AC001D09ADBFEAD7
69 changed files with 380 additions and 381 deletions

View file

@ -58,11 +58,10 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
--- a/include/linux/mm_inline.h --- a/include/linux/mm_inline.h
+++ b/include/linux/mm_inline.h +++ b/include/linux/mm_inline.h
@@ -606,5 +606,13 @@ static __always_inline void del_page_fro @@ -578,4 +578,12 @@ pte_install_uffd_wp_if_needed(struct vm_
make_pte_marker(PTE_MARKER_UFFD_WP));
#endif #endif
} }
+
+static inline bool vma_has_recency(struct vm_area_struct *vma) +static inline bool vma_has_recency(struct vm_area_struct *vma)
+{ +{
+ if (vma->vm_flags & (VM_SEQ_READ | VM_RAND_READ)) + if (vma->vm_flags & (VM_SEQ_READ | VM_RAND_READ))
@ -70,11 +69,11 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+ +
+ return true; + return true;
+} +}
+
#endif #endif
--- a/mm/memory.c --- a/mm/memory.c
+++ b/mm/memory.c +++ b/mm/memory.c
@@ -1353,8 +1354,7 @@ again: @@ -1435,8 +1435,7 @@ again:
force_flush = 1; force_flush = 1;
set_page_dirty(page); set_page_dirty(page);
} }
@ -84,7 +83,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mark_page_accessed(page); mark_page_accessed(page);
} }
rss[mm_counter(page)]--; rss[mm_counter(page)]--;
@@ -4795,8 +4795,8 @@ static inline void mm_account_fault(stru @@ -5170,8 +5169,8 @@ static inline void mm_account_fault(stru
#ifdef CONFIG_LRU_GEN #ifdef CONFIG_LRU_GEN
static void lru_gen_enter_fault(struct vm_area_struct *vma) static void lru_gen_enter_fault(struct vm_area_struct *vma)
{ {
@ -97,7 +96,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
static void lru_gen_exit_fault(void) static void lru_gen_exit_fault(void)
--- a/mm/rmap.c --- a/mm/rmap.c
+++ b/mm/rmap.c +++ b/mm/rmap.c
@@ -794,25 +794,14 @@ static bool page_referenced_one(struct p @@ -823,25 +823,14 @@ static bool folio_referenced_one(struct
} }
if (pvmw.pte) { if (pvmw.pte) {
@ -126,8 +125,8 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
} else if (IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE)) { } else if (IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE)) {
if (pmdp_clear_flush_young_notify(vma, address, if (pmdp_clear_flush_young_notify(vma, address,
pvmw.pmd)) pvmw.pmd))
@@ -846,7 +835,20 @@ static bool invalid_page_referenced_vma( @@ -875,7 +864,20 @@ static bool invalid_folio_referenced_vma
struct page_referenced_arg *pra = arg; struct folio_referenced_arg *pra = arg;
struct mem_cgroup *memcg = pra->memcg; struct mem_cgroup *memcg = pra->memcg;
- if (!mm_match_cgroup(vma->vm_mm, memcg)) - if (!mm_match_cgroup(vma->vm_mm, memcg))
@ -148,7 +147,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
return true; return true;
return false; return false;
@@ -876,6 +878,7 @@ int page_referenced(struct page *page, @@ -906,6 +908,7 @@ int folio_referenced(struct folio *folio
.arg = (void *)&pra, .arg = (void *)&pra,
.anon_lock = folio_lock_anon_vma_read, .anon_lock = folio_lock_anon_vma_read,
.try_lock = true, .try_lock = true,
@ -156,7 +155,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
}; };
*vm_flags = 0; *vm_flags = 0;
@@ -891,15 +894,6 @@ int page_referenced(struct page *page, @@ -921,15 +924,6 @@ int folio_referenced(struct folio *folio
return 1; return 1;
} }
@ -174,7 +173,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
--- a/mm/vmscan.c --- a/mm/vmscan.c
+++ b/mm/vmscan.c +++ b/mm/vmscan.c
@@ -3486,7 +3486,10 @@ static int should_skip_vma(unsigned long @@ -3766,7 +3766,10 @@ static int should_skip_vma(unsigned long
if (is_vm_hugetlb_page(vma)) if (is_vm_hugetlb_page(vma))
return true; return true;

View file

@ -81,9 +81,9 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
--- a/include/linux/fs.h --- a/include/linux/fs.h
+++ b/include/linux/fs.h +++ b/include/linux/fs.h
@@ -167,6 +167,8 @@ typedef int (dio_iodone_t)(struct kiocb @@ -166,6 +166,8 @@ typedef int (dio_iodone_t)(struct kiocb
/* File is stream-like */ /* File supports DIRECT IO */
#define FMODE_STREAM ((__force fmode_t)0x200000) #define FMODE_CAN_ODIRECT ((__force fmode_t)0x400000)
+#define FMODE_NOREUSE ((__force fmode_t)0x400000) +#define FMODE_NOREUSE ((__force fmode_t)0x400000)
+ +
@ -92,7 +92,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
--- a/include/linux/mm_inline.h --- a/include/linux/mm_inline.h
+++ b/include/linux/mm_inline.h +++ b/include/linux/mm_inline.h
@@ -339,6 +339,9 @@ static inline bool vma_has_recency(struc @@ -583,6 +583,9 @@ static inline bool vma_has_recency(struc
if (vma->vm_flags & (VM_SEQ_READ | VM_RAND_READ)) if (vma->vm_flags & (VM_SEQ_READ | VM_RAND_READ))
return false; return false;
@ -122,4 +122,4 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+ spin_unlock(&file->f_lock); + spin_unlock(&file->f_lock);
break; break;
case POSIX_FADV_DONTNEED: case POSIX_FADV_DONTNEED:
if (!inode_write_congested(mapping->host)) __filemap_fdatawrite_range(mapping, offset, endbyte,

View file

@ -124,16 +124,16 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
--- a/include/linux/mm_inline.h --- a/include/linux/mm_inline.h
+++ b/include/linux/mm_inline.h +++ b/include/linux/mm_inline.h
@@ -168,7 +168,7 @@ static inline void lru_gen_update_size(s @@ -178,7 +178,7 @@ static inline void lru_gen_update_size(s
int zone = folio_zonenum(folio); int zone = folio_zonenum(folio);
int delta = thp_nr_folios(folio); int delta = folio_nr_pages(folio);
enum lru_list lru = type * LRU_INACTIVE_FILE; enum lru_list lru = type * LRU_INACTIVE_FILE;
- struct lru_gen_struct *lrugen = &lruvec->lrugen; - struct lru_gen_struct *lrugen = &lruvec->lrugen;
+ struct lru_gen_folio *lrugen = &lruvec->lrugen; + struct lru_gen_folio *lrugen = &lruvec->lrugen;
VM_WARN_ON_ONCE(old_gen != -1 && old_gen >= MAX_NR_GENS); VM_WARN_ON_ONCE(old_gen != -1 && old_gen >= MAX_NR_GENS);
VM_WARN_ON_ONCE(new_gen != -1 && new_gen >= MAX_NR_GENS); VM_WARN_ON_ONCE(new_gen != -1 && new_gen >= MAX_NR_GENS);
@@ -214,7 +214,7 @@ static inline bool lru_gen_add_folio(stru @@ -224,7 +224,7 @@ static inline bool lru_gen_add_folio(str
int gen = folio_lru_gen(folio); int gen = folio_lru_gen(folio);
int type = folio_is_file_lru(folio); int type = folio_is_file_lru(folio);
int zone = folio_zonenum(folio); int zone = folio_zonenum(folio);
@ -144,8 +144,8 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
--- a/include/linux/mmzone.h --- a/include/linux/mmzone.h
+++ b/include/linux/mmzone.h +++ b/include/linux/mmzone.h
@@ -394,7 +394,7 @@ enum { @@ -404,7 +404,7 @@ enum {
* The number of folios in each generation is eventually consistent and therefore * The number of pages in each generation is eventually consistent and therefore
* can be transiently negative when reset_batch_size() is pending. * can be transiently negative when reset_batch_size() is pending.
*/ */
-struct lru_gen_struct { -struct lru_gen_struct {
@ -153,7 +153,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
/* the aging increments the youngest generation number */ /* the aging increments the youngest generation number */
unsigned long max_seq; unsigned long max_seq;
/* the eviction increments the oldest generation numbers */ /* the eviction increments the oldest generation numbers */
@@ -451,7 +451,7 @@ struct lru_gen_mm_state { @@ -461,7 +461,7 @@ struct lru_gen_mm_state {
struct lru_gen_mm_walk { struct lru_gen_mm_walk {
/* the lruvec under reclaim */ /* the lruvec under reclaim */
struct lruvec *lruvec; struct lruvec *lruvec;
@ -162,7 +162,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
unsigned long max_seq; unsigned long max_seq;
/* the next address within an mm to scan */ /* the next address within an mm to scan */
unsigned long next_addr; unsigned long next_addr;
@@ -514,7 +514,7 @@ struct lruvec { @@ -524,7 +524,7 @@ struct lruvec {
unsigned long flags; unsigned long flags;
#ifdef CONFIG_LRU_GEN #ifdef CONFIG_LRU_GEN
/* evictable pages divided into generations */ /* evictable pages divided into generations */
@ -173,7 +173,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
#endif #endif
--- a/mm/vmscan.c --- a/mm/vmscan.c
+++ b/mm/vmscan.c +++ b/mm/vmscan.c
@@ -2910,7 +2910,7 @@ static int get_nr_gens(struct lruvec *lr @@ -3190,7 +3190,7 @@ static int get_nr_gens(struct lruvec *lr
static bool __maybe_unused seq_is_valid(struct lruvec *lruvec) static bool __maybe_unused seq_is_valid(struct lruvec *lruvec)
{ {
@ -182,7 +182,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
return get_nr_gens(lruvec, LRU_GEN_FILE) >= MIN_NR_GENS && return get_nr_gens(lruvec, LRU_GEN_FILE) >= MIN_NR_GENS &&
get_nr_gens(lruvec, LRU_GEN_FILE) <= get_nr_gens(lruvec, LRU_GEN_ANON) && get_nr_gens(lruvec, LRU_GEN_FILE) <= get_nr_gens(lruvec, LRU_GEN_ANON) &&
get_nr_gens(lruvec, LRU_GEN_ANON) <= MAX_NR_GENS; get_nr_gens(lruvec, LRU_GEN_ANON) <= MAX_NR_GENS;
@@ -3316,7 +3316,7 @@ struct ctrl_pos { @@ -3596,7 +3596,7 @@ struct ctrl_pos {
static void read_ctrl_pos(struct lruvec *lruvec, int type, int tier, int gain, static void read_ctrl_pos(struct lruvec *lruvec, int type, int tier, int gain,
struct ctrl_pos *pos) struct ctrl_pos *pos)
{ {
@ -191,7 +191,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
int hist = lru_hist_from_seq(lrugen->min_seq[type]); int hist = lru_hist_from_seq(lrugen->min_seq[type]);
pos->refaulted = lrugen->avg_refaulted[type][tier] + pos->refaulted = lrugen->avg_refaulted[type][tier] +
@@ -3331,7 +3331,7 @@ static void read_ctrl_pos(struct lruvec @@ -3611,7 +3611,7 @@ static void read_ctrl_pos(struct lruvec
static void reset_ctrl_pos(struct lruvec *lruvec, int type, bool carryover) static void reset_ctrl_pos(struct lruvec *lruvec, int type, bool carryover)
{ {
int hist, tier; int hist, tier;
@ -200,7 +200,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
bool clear = carryover ? NR_HIST_GENS == 1 : NR_HIST_GENS > 1; bool clear = carryover ? NR_HIST_GENS == 1 : NR_HIST_GENS > 1;
unsigned long seq = carryover ? lrugen->min_seq[type] : lrugen->max_seq + 1; unsigned long seq = carryover ? lrugen->min_seq[type] : lrugen->max_seq + 1;
@@ -3408,7 +3408,7 @@ static int folio_update_gen(struct folio * @@ -3688,7 +3688,7 @@ static int folio_update_gen(struct folio
static int folio_inc_gen(struct lruvec *lruvec, struct folio *folio, bool reclaiming) static int folio_inc_gen(struct lruvec *lruvec, struct folio *folio, bool reclaiming)
{ {
int type = folio_is_file_lru(folio); int type = folio_is_file_lru(folio);
@ -209,7 +209,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
int new_gen, old_gen = lru_gen_from_seq(lrugen->min_seq[type]); int new_gen, old_gen = lru_gen_from_seq(lrugen->min_seq[type]);
unsigned long new_flags, old_flags = READ_ONCE(folio->flags); unsigned long new_flags, old_flags = READ_ONCE(folio->flags);
@@ -3453,7 +3453,7 @@ static void update_batch_size(struct lru @@ -3733,7 +3733,7 @@ static void update_batch_size(struct lru
static void reset_batch_size(struct lruvec *lruvec, struct lru_gen_mm_walk *walk) static void reset_batch_size(struct lruvec *lruvec, struct lru_gen_mm_walk *walk)
{ {
int gen, type, zone; int gen, type, zone;
@ -218,7 +218,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
walk->batched = 0; walk->batched = 0;
@@ -3979,7 +3979,7 @@ static bool inc_min_seq(struct lruvec *l @@ -4253,7 +4253,7 @@ static bool inc_min_seq(struct lruvec *l
{ {
int zone; int zone;
int remaining = MAX_LRU_BATCH; int remaining = MAX_LRU_BATCH;
@ -227,7 +227,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
int new_gen, old_gen = lru_gen_from_seq(lrugen->min_seq[type]); int new_gen, old_gen = lru_gen_from_seq(lrugen->min_seq[type]);
if (type == LRU_GEN_ANON && !can_swap) if (type == LRU_GEN_ANON && !can_swap)
@@ -4015,7 +4015,7 @@ static bool try_to_inc_min_seq(struct lr @@ -4289,7 +4289,7 @@ static bool try_to_inc_min_seq(struct lr
{ {
int gen, type, zone; int gen, type, zone;
bool success = false; bool success = false;
@ -236,7 +236,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
DEFINE_MIN_SEQ(lruvec); DEFINE_MIN_SEQ(lruvec);
VM_WARN_ON_ONCE(!seq_is_valid(lruvec)); VM_WARN_ON_ONCE(!seq_is_valid(lruvec));
@@ -4036,7 +4036,7 @@ next: @@ -4310,7 +4310,7 @@ next:
; ;
} }
@ -245,7 +245,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
if (can_swap) { if (can_swap) {
min_seq[LRU_GEN_ANON] = min(min_seq[LRU_GEN_ANON], min_seq[LRU_GEN_FILE]); min_seq[LRU_GEN_ANON] = min(min_seq[LRU_GEN_ANON], min_seq[LRU_GEN_FILE]);
min_seq[LRU_GEN_FILE] = max(min_seq[LRU_GEN_ANON], lrugen->min_seq[LRU_GEN_FILE]); min_seq[LRU_GEN_FILE] = max(min_seq[LRU_GEN_ANON], lrugen->min_seq[LRU_GEN_FILE]);
@@ -4058,7 +4058,7 @@ static void inc_max_seq(struct lruvec *l @@ -4332,7 +4332,7 @@ static void inc_max_seq(struct lruvec *l
{ {
int prev, next; int prev, next;
int type, zone; int type, zone;
@ -254,7 +254,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
spin_lock_irq(&lruvec->lru_lock); spin_lock_irq(&lruvec->lru_lock);
@@ -4116,7 +4116,7 @@ static bool try_to_inc_max_seq(struct lr @@ -4390,7 +4390,7 @@ static bool try_to_inc_max_seq(struct lr
bool success; bool success;
struct lru_gen_mm_walk *walk; struct lru_gen_mm_walk *walk;
struct mm_struct *mm = NULL; struct mm_struct *mm = NULL;
@ -263,7 +263,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
VM_WARN_ON_ONCE(max_seq > READ_ONCE(lrugen->max_seq)); VM_WARN_ON_ONCE(max_seq > READ_ONCE(lrugen->max_seq));
@@ -4181,7 +4181,7 @@ static bool should_run_aging(struct lruv @@ -4455,7 +4455,7 @@ static bool should_run_aging(struct lruv
unsigned long old = 0; unsigned long old = 0;
unsigned long young = 0; unsigned long young = 0;
unsigned long total = 0; unsigned long total = 0;
@ -272,16 +272,16 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
struct mem_cgroup *memcg = lruvec_memcg(lruvec); struct mem_cgroup *memcg = lruvec_memcg(lruvec);
for (type = !can_swap; type < ANON_AND_FILE; type++) { for (type = !can_swap; type < ANON_AND_FILE; type++) {
@@ -4466,7 +4466,7 @@ static bool sort_folio(struct lruvec *lru @@ -4740,7 +4740,7 @@ static bool sort_folio(struct lruvec *lr
int delta = thp_nr_folios(folio); int delta = folio_nr_pages(folio);
int refs = folio_lru_refs(folio); int refs = folio_lru_refs(folio);
int tier = lru_tier_from_refs(refs); int tier = lru_tier_from_refs(refs);
- struct lru_gen_struct *lrugen = &lruvec->lrugen; - struct lru_gen_struct *lrugen = &lruvec->lrugen;
+ struct lru_gen_folio *lrugen = &lruvec->lrugen; + struct lru_gen_folio *lrugen = &lruvec->lrugen;
VM_WARN_ON_ONCE_folio(gen >= MAX_NR_GENS, folio); VM_WARN_ON_ONCE_FOLIO(gen >= MAX_NR_GENS, folio);
@@ -4566,7 +4566,7 @@ static int scan_folios(struct lruvec *lru @@ -4840,7 +4840,7 @@ static int scan_folios(struct lruvec *lr
int scanned = 0; int scanned = 0;
int isolated = 0; int isolated = 0;
int remaining = MAX_LRU_BATCH; int remaining = MAX_LRU_BATCH;
@ -290,7 +290,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
struct mem_cgroup *memcg = lruvec_memcg(lruvec); struct mem_cgroup *memcg = lruvec_memcg(lruvec);
VM_WARN_ON_ONCE(!list_empty(list)); VM_WARN_ON_ONCE(!list_empty(list));
@@ -4967,7 +4967,7 @@ done: @@ -5240,7 +5240,7 @@ done:
static bool __maybe_unused state_is_valid(struct lruvec *lruvec) static bool __maybe_unused state_is_valid(struct lruvec *lruvec)
{ {
@ -299,7 +299,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
if (lrugen->enabled) { if (lrugen->enabled) {
enum lru_list lru; enum lru_list lru;
@@ -5247,7 +5247,7 @@ static void lru_gen_seq_show_full(struct @@ -5522,7 +5522,7 @@ static void lru_gen_seq_show_full(struct
int i; int i;
int type, tier; int type, tier;
int hist = lru_hist_from_seq(seq); int hist = lru_hist_from_seq(seq);
@ -308,7 +308,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
for (tier = 0; tier < MAX_NR_TIERS; tier++) { for (tier = 0; tier < MAX_NR_TIERS; tier++) {
seq_printf(m, " %10d", tier); seq_printf(m, " %10d", tier);
@@ -5296,7 +5296,7 @@ static int lru_gen_seq_show(struct seq_f @@ -5572,7 +5572,7 @@ static int lru_gen_seq_show(struct seq_f
unsigned long seq; unsigned long seq;
bool full = !debugfs_real_fops(m->file)->write; bool full = !debugfs_real_fops(m->file)->write;
struct lruvec *lruvec = v; struct lruvec *lruvec = v;
@ -317,7 +317,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
int nid = lruvec_pgdat(lruvec)->node_id; int nid = lruvec_pgdat(lruvec)->node_id;
struct mem_cgroup *memcg = lruvec_memcg(lruvec); struct mem_cgroup *memcg = lruvec_memcg(lruvec);
DEFINE_MAX_SEQ(lruvec); DEFINE_MAX_SEQ(lruvec);
@@ -5549,7 +5549,7 @@ void lru_gen_init_lruvec(struct lruvec * @@ -5826,7 +5826,7 @@ void lru_gen_init_lruvec(struct lruvec *
{ {
int i; int i;
int gen, type, zone; int gen, type, zone;
@ -328,14 +328,14 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
lrugen->enabled = lru_gen_enabled(); lrugen->enabled = lru_gen_enabled();
--- a/mm/workingset.c --- a/mm/workingset.c
+++ b/mm/workingset.c +++ b/mm/workingset.c
@@ -223,7 +223,7 @@ static void *lru_gen_eviction(struct pag @@ -223,7 +223,7 @@ static void *lru_gen_eviction(struct fol
unsigned long token; unsigned long token;
unsigned long min_seq; unsigned long min_seq;
struct lruvec *lruvec; struct lruvec *lruvec;
- struct lru_gen_struct *lrugen; - struct lru_gen_struct *lrugen;
+ struct lru_gen_folio *lrugen; + struct lru_gen_folio *lrugen;
int type = folio_is_file_lru(folio); int type = folio_is_file_lru(folio);
int delta = thp_nr_folios(folio); int delta = folio_nr_pages(folio);
int refs = folio_lru_refs(folio); int refs = folio_lru_refs(folio);
@@ -252,7 +252,7 @@ static void lru_gen_refault(struct folio @@ -252,7 +252,7 @@ static void lru_gen_refault(struct folio
unsigned long token; unsigned long token;

View file

@ -25,9 +25,9 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
--- a/include/linux/mm_inline.h --- a/include/linux/mm_inline.h
+++ b/include/linux/mm_inline.h +++ b/include/linux/mm_inline.h
@@ -246,9 +246,9 @@ static inline bool lru_gen_add_folio(stru @@ -256,9 +256,9 @@ static inline bool lru_gen_add_folio(str
lru_gen_update_size(lruvec, folio, -1, gen); lru_gen_update_size(lruvec, folio, -1, gen);
/* for rotate_reclaimable_folio() */ /* for folio_rotate_reclaimable() */
if (reclaiming) if (reclaiming)
- list_add_tail(&folio->lru, &lrugen->lists[gen][type][zone]); - list_add_tail(&folio->lru, &lrugen->lists[gen][type][zone]);
+ list_add_tail(&folio->lru, &lrugen->folios[gen][type][zone]); + list_add_tail(&folio->lru, &lrugen->folios[gen][type][zone]);
@ -39,16 +39,16 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
} }
--- a/include/linux/mmzone.h --- a/include/linux/mmzone.h
+++ b/include/linux/mmzone.h +++ b/include/linux/mmzone.h
@@ -302,7 +302,7 @@ enum lruvec_flags { @@ -312,7 +312,7 @@ enum lruvec_flags {
* They form a sliding window of a variable size [MIN_NR_GENS, MAX_NR_GENS]. An * They form a sliding window of a variable size [MIN_NR_GENS, MAX_NR_GENS]. An
* offset within MAX_NR_GENS, i.e., gen, indexes the LRU list of the * offset within MAX_NR_GENS, i.e., gen, indexes the LRU list of the
* corresponding generation. The gen counter in folio->flags stores gen+1 while * corresponding generation. The gen counter in folio->flags stores gen+1 while
- * a page is on one of lrugen->lists[]. Otherwise it stores 0. - * a page is on one of lrugen->lists[]. Otherwise it stores 0.
+ * a page is on one of lrugen->folios[]. Otherwise it stores 0. + * a page is on one of lrugen->folios[]. Otherwise it stores 0.
* *
* A folio is added to the youngest generation on faulting. The aging needs to * A page is added to the youngest generation on faulting. The aging needs to
* check the accessed bit at least twice before handing this folio over to the * check the accessed bit at least twice before handing this page over to the
@@ -314,8 +314,8 @@ enum lruvec_flags { @@ -324,8 +324,8 @@ enum lruvec_flags {
* rest of generations, if they exist, are considered inactive. See * rest of generations, if they exist, are considered inactive. See
* lru_gen_is_active(). * lru_gen_is_active().
* *
@ -59,18 +59,18 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
* considered active is isolated for non-reclaiming purposes, e.g., migration. * considered active is isolated for non-reclaiming purposes, e.g., migration.
* See lru_gen_add_folio() and lru_gen_del_folio(). * See lru_gen_add_folio() and lru_gen_del_folio().
* *
@@ -402,7 +402,7 @@ struct lru_gen_folio { @@ -412,7 +412,7 @@ struct lru_gen_folio {
/* the birth time of each generation in jiffies */ /* the birth time of each generation in jiffies */
unsigned long timestamps[MAX_NR_GENS]; unsigned long timestamps[MAX_NR_GENS];
/* the multi-gen LRU lists, lazily sorted on eviction */ /* the multi-gen LRU lists, lazily sorted on eviction */
- struct list_head lists[MAX_NR_GENS][ANON_AND_FILE][MAX_NR_ZONES]; - struct list_head lists[MAX_NR_GENS][ANON_AND_FILE][MAX_NR_ZONES];
+ struct list_head folios[MAX_NR_GENS][ANON_AND_FILE][MAX_NR_ZONES]; + struct list_head folios[MAX_NR_GENS][ANON_AND_FILE][MAX_NR_ZONES];
/* the multi-gen LRU sizes, eventually consistent */ /* the multi-gen LRU sizes, eventually consistent */
long nr_folios[MAX_NR_GENS][ANON_AND_FILE][MAX_NR_ZONES]; long nr_pages[MAX_NR_GENS][ANON_AND_FILE][MAX_NR_ZONES];
/* the exponential moving average of refaulted */ /* the exponential moving average of refaulted */
--- a/mm/vmscan.c --- a/mm/vmscan.c
+++ b/mm/vmscan.c +++ b/mm/vmscan.c
@@ -3987,7 +3987,7 @@ static bool inc_min_seq(struct lruvec *l @@ -4261,7 +4261,7 @@ static bool inc_min_seq(struct lruvec *l
/* prevent cold/hot inversion if force_scan is true */ /* prevent cold/hot inversion if force_scan is true */
for (zone = 0; zone < MAX_NR_ZONES; zone++) { for (zone = 0; zone < MAX_NR_ZONES; zone++) {
@ -79,8 +79,8 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
while (!list_empty(head)) { while (!list_empty(head)) {
struct folio *folio = lru_to_folio(head); struct folio *folio = lru_to_folio(head);
@@ -3998,7 +3998,7 @@ static bool inc_min_seq(struct lruvec *l @@ -4272,7 +4272,7 @@ static bool inc_min_seq(struct lruvec *l
VM_WARN_ON_ONCE_folio(folio_zonenum(folio) != zone, folio); VM_WARN_ON_ONCE_FOLIO(folio_zonenum(folio) != zone, folio);
new_gen = folio_inc_gen(lruvec, folio, false); new_gen = folio_inc_gen(lruvec, folio, false);
- list_move_tail(&folio->lru, &lrugen->lists[new_gen][type][zone]); - list_move_tail(&folio->lru, &lrugen->lists[new_gen][type][zone]);
@ -88,7 +88,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
if (!--remaining) if (!--remaining)
return false; return false;
@@ -4026,7 +4026,7 @@ static bool try_to_inc_min_seq(struct lr @@ -4300,7 +4300,7 @@ static bool try_to_inc_min_seq(struct lr
gen = lru_gen_from_seq(min_seq[type]); gen = lru_gen_from_seq(min_seq[type]);
for (zone = 0; zone < MAX_NR_ZONES; zone++) { for (zone = 0; zone < MAX_NR_ZONES; zone++) {
@ -97,7 +97,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
goto next; goto next;
} }
@@ -4491,7 +4491,7 @@ static bool sort_folio(struct lruvec *lru @@ -4765,7 +4765,7 @@ static bool sort_folio(struct lruvec *lr
/* promoted */ /* promoted */
if (gen != lru_gen_from_seq(lrugen->min_seq[type])) { if (gen != lru_gen_from_seq(lrugen->min_seq[type])) {
@ -106,7 +106,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
return true; return true;
} }
@@ -4500,7 +4500,7 @@ static bool sort_folio(struct lruvec *lru @@ -4774,7 +4774,7 @@ static bool sort_folio(struct lruvec *lr
int hist = lru_hist_from_seq(lrugen->min_seq[type]); int hist = lru_hist_from_seq(lrugen->min_seq[type]);
gen = folio_inc_gen(lruvec, folio, false); gen = folio_inc_gen(lruvec, folio, false);
@ -115,16 +115,16 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
WRITE_ONCE(lrugen->protected[hist][type][tier - 1], WRITE_ONCE(lrugen->protected[hist][type][tier - 1],
lrugen->protected[hist][type][tier - 1] + delta); lrugen->protected[hist][type][tier - 1] + delta);
@@ -4512,7 +4512,7 @@ static bool sort_folio(struct lruvec *lru @@ -4786,7 +4786,7 @@ static bool sort_folio(struct lruvec *lr
if (folioLocked(folio) || folioWriteback(folio) || if (folio_test_locked(folio) || folio_test_writeback(folio) ||
(type == LRU_GEN_FILE && folioDirty(folio))) { (type == LRU_GEN_FILE && folio_test_dirty(folio))) {
gen = folio_inc_gen(lruvec, folio, true); gen = folio_inc_gen(lruvec, folio, true);
- list_move(&folio->lru, &lrugen->lists[gen][type][zone]); - list_move(&folio->lru, &lrugen->lists[gen][type][zone]);
+ list_move(&folio->lru, &lrugen->folios[gen][type][zone]); + list_move(&folio->lru, &lrugen->folios[gen][type][zone]);
return true; return true;
} }
@@ -4579,7 +4579,7 @@ static int scan_folios(struct lruvec *lru @@ -4853,7 +4853,7 @@ static int scan_folios(struct lruvec *lr
for (zone = sc->reclaim_idx; zone >= 0; zone--) { for (zone = sc->reclaim_idx; zone >= 0; zone--) {
LIST_HEAD(moved); LIST_HEAD(moved);
int skipped = 0; int skipped = 0;
@ -133,7 +133,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
while (!list_empty(head)) { while (!list_empty(head)) {
struct folio *folio = lru_to_folio(head); struct folio *folio = lru_to_folio(head);
@@ -4980,7 +4980,7 @@ static bool __maybe_unused state_is_vali @@ -5253,7 +5253,7 @@ static bool __maybe_unused state_is_vali
int gen, type, zone; int gen, type, zone;
for_each_gen_type_zone(gen, type, zone) { for_each_gen_type_zone(gen, type, zone) {
@ -142,7 +142,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
return false; return false;
} }
} }
@@ -5025,7 +5025,7 @@ static bool drain_evictable(struct lruve @@ -5298,7 +5298,7 @@ static bool drain_evictable(struct lruve
int remaining = MAX_LRU_BATCH; int remaining = MAX_LRU_BATCH;
for_each_gen_type_zone(gen, type, zone) { for_each_gen_type_zone(gen, type, zone) {
@ -151,7 +151,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
while (!list_empty(head)) { while (!list_empty(head)) {
bool success; bool success;
@@ -5558,7 +5558,7 @@ void lru_gen_init_lruvec(struct lruvec * @@ -5835,7 +5835,7 @@ void lru_gen_init_lruvec(struct lruvec *
lrugen->timestamps[i] = jiffies; lrugen->timestamps[i] = jiffies;
for_each_gen_type_zone(gen, type, zone) for_each_gen_type_zone(gen, type, zone)

View file

@ -37,7 +37,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
--- a/mm/vmscan.c --- a/mm/vmscan.c
+++ b/mm/vmscan.c +++ b/mm/vmscan.c
@@ -443,6 +443,11 @@ static bool cgroup_reclaim(struct scan_c @@ -448,6 +448,11 @@ static bool cgroup_reclaim(struct scan_c
return sc->target_mem_cgroup; return sc->target_mem_cgroup;
} }
@ -49,7 +49,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
/** /**
* writeback_throttling_sane - is the usual dirty throttling mechanism available? * writeback_throttling_sane - is the usual dirty throttling mechanism available?
* @sc: scan_control in question * @sc: scan_control in question
@@ -493,6 +498,11 @@ static bool cgroup_reclaim(struct scan_c @@ -498,6 +503,11 @@ static bool cgroup_reclaim(struct scan_c
return false; return false;
} }
@ -61,7 +61,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
static bool writeback_throttling_sane(struct scan_control *sc) static bool writeback_throttling_sane(struct scan_control *sc)
{ {
return true; return true;
@@ -4722,8 +4732,7 @@ static int isolate_folios(struct lruvec * @@ -4996,8 +5006,7 @@ static int isolate_folios(struct lruvec
return scanned; return scanned;
} }
@ -71,7 +71,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
{ {
int type; int type;
int scanned; int scanned;
@@ -4812,9 +4821,6 @@ retry: @@ -5086,9 +5095,6 @@ retry:
goto retry; goto retry;
} }
@ -81,7 +81,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
return scanned; return scanned;
} }
@@ -4853,67 +4859,26 @@ done: @@ -5127,67 +5133,26 @@ done:
return min_seq[!can_swap] + MIN_NR_GENS <= max_seq ? nr_to_scan : 0; return min_seq[!can_swap] + MIN_NR_GENS <= max_seq ? nr_to_scan : 0;
} }
@ -158,7 +158,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
lru_add_drain(); lru_add_drain();
@@ -4938,7 +4902,7 @@ static void lru_gen_shrink_lruvec(struct @@ -5211,7 +5176,7 @@ static void lru_gen_shrink_lruvec(struct
if (!nr_to_scan) if (!nr_to_scan)
goto done; goto done;
@ -167,7 +167,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
if (!delta) if (!delta)
goto done; goto done;
@@ -4946,7 +4910,7 @@ static void lru_gen_shrink_lruvec(struct @@ -5219,7 +5184,7 @@ static void lru_gen_shrink_lruvec(struct
if (scanned >= nr_to_scan) if (scanned >= nr_to_scan)
break; break;
@ -176,7 +176,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
break; break;
cond_resched(); cond_resched();
@@ -5393,7 +5357,7 @@ static int run_eviction(struct lruvec *l @@ -5669,7 +5634,7 @@ static int run_eviction(struct lruvec *l
if (sc->nr_reclaimed >= nr_to_reclaim) if (sc->nr_reclaimed >= nr_to_reclaim)
return 0; return 0;

View file

@ -37,7 +37,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
--- a/mm/vmscan.c --- a/mm/vmscan.c
+++ b/mm/vmscan.c +++ b/mm/vmscan.c
@@ -131,7 +131,6 @@ struct scan_control { @@ -136,7 +136,6 @@ struct scan_control {
#ifdef CONFIG_LRU_GEN #ifdef CONFIG_LRU_GEN
/* help kswapd make better choices among multiple memcgs */ /* help kswapd make better choices among multiple memcgs */
@ -45,7 +45,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
unsigned long last_reclaimed; unsigned long last_reclaimed;
#endif #endif
@@ -4184,7 +4183,7 @@ done: @@ -4458,7 +4457,7 @@ done:
return true; return true;
} }
@ -54,7 +54,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
struct scan_control *sc, bool can_swap, unsigned long *nr_to_scan) struct scan_control *sc, bool can_swap, unsigned long *nr_to_scan)
{ {
int gen, type, zone; int gen, type, zone;
@@ -4193,6 +4192,13 @@ static bool should_run_aging(struct lruv @@ -4467,6 +4466,13 @@ static bool should_run_aging(struct lruv
unsigned long total = 0; unsigned long total = 0;
struct lru_gen_folio *lrugen = &lruvec->lrugen; struct lru_gen_folio *lrugen = &lruvec->lrugen;
struct mem_cgroup *memcg = lruvec_memcg(lruvec); struct mem_cgroup *memcg = lruvec_memcg(lruvec);
@ -68,7 +68,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
for (type = !can_swap; type < ANON_AND_FILE; type++) { for (type = !can_swap; type < ANON_AND_FILE; type++) {
unsigned long seq; unsigned long seq;
@@ -4221,8 +4227,6 @@ static bool should_run_aging(struct lruv @@ -4495,8 +4501,6 @@ static bool should_run_aging(struct lruv
* stalls when the number of generations reaches MIN_NR_GENS. Hence, the * stalls when the number of generations reaches MIN_NR_GENS. Hence, the
* ideal number of generations is MIN_NR_GENS+1. * ideal number of generations is MIN_NR_GENS+1.
*/ */
@ -77,7 +77,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
if (min_seq[!can_swap] + MIN_NR_GENS < max_seq) if (min_seq[!can_swap] + MIN_NR_GENS < max_seq)
return false; return false;
@@ -4241,40 +4245,54 @@ static bool should_run_aging(struct lruv @@ -4515,40 +4519,54 @@ static bool should_run_aging(struct lruv
return false; return false;
} }
@ -153,7 +153,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
} }
/* to protect the working set of the last N jiffies */ /* to protect the working set of the last N jiffies */
@@ -4283,46 +4301,32 @@ static unsigned long lru_gen_min_ttl __r @@ -4557,46 +4575,32 @@ static unsigned long lru_gen_min_ttl __r
static void lru_gen_age_node(struct pglist_data *pgdat, struct scan_control *sc) static void lru_gen_age_node(struct pglist_data *pgdat, struct scan_control *sc)
{ {
struct mem_cgroup *memcg; struct mem_cgroup *memcg;
@ -207,7 +207,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
*/ */
if (mutex_trylock(&oom_lock)) { if (mutex_trylock(&oom_lock)) {
struct oom_control oc = { struct oom_control oc = {
@@ -4830,33 +4834,27 @@ retry: @@ -5104,33 +5108,27 @@ retry:
* reclaim. * reclaim.
*/ */
static unsigned long get_nr_to_scan(struct lruvec *lruvec, struct scan_control *sc, static unsigned long get_nr_to_scan(struct lruvec *lruvec, struct scan_control *sc,
@ -247,7 +247,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
} }
static unsigned long get_nr_to_reclaim(struct scan_control *sc) static unsigned long get_nr_to_reclaim(struct scan_control *sc)
@@ -4875,9 +4873,7 @@ static unsigned long get_nr_to_reclaim(s @@ -5149,9 +5147,7 @@ static unsigned long get_nr_to_reclaim(s
static void lru_gen_shrink_lruvec(struct lruvec *lruvec, struct scan_control *sc) static void lru_gen_shrink_lruvec(struct lruvec *lruvec, struct scan_control *sc)
{ {
struct blk_plug plug; struct blk_plug plug;
@ -257,7 +257,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
unsigned long nr_to_reclaim = get_nr_to_reclaim(sc); unsigned long nr_to_reclaim = get_nr_to_reclaim(sc);
lru_add_drain(); lru_add_drain();
@@ -4898,13 +4894,13 @@ static void lru_gen_shrink_lruvec(struct @@ -5172,13 +5168,13 @@ static void lru_gen_shrink_lruvec(struct
else else
swappiness = 0; swappiness = 0;
@ -274,7 +274,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
scanned += delta; scanned += delta;
if (scanned >= nr_to_scan) if (scanned >= nr_to_scan)
@@ -4916,10 +4912,6 @@ static void lru_gen_shrink_lruvec(struct @@ -5190,10 +5186,6 @@ static void lru_gen_shrink_lruvec(struct
cond_resched(); cond_resched();
} }

View file

@ -21,7 +21,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
--- a/mm/vmscan.c --- a/mm/vmscan.c
+++ b/mm/vmscan.c +++ b/mm/vmscan.c
@@ -4183,68 +4183,6 @@ done: @@ -4457,68 +4457,6 @@ done:
return true; return true;
} }
@ -90,7 +90,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
static bool lruvec_is_sizable(struct lruvec *lruvec, struct scan_control *sc) static bool lruvec_is_sizable(struct lruvec *lruvec, struct scan_control *sc)
{ {
int gen, type, zone; int gen, type, zone;
@@ -4828,6 +4766,68 @@ retry: @@ -5102,6 +5040,68 @@ retry:
return scanned; return scanned;
} }

View file

@ -69,7 +69,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
--- a/include/linux/memcontrol.h --- a/include/linux/memcontrol.h
+++ b/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h
@@ -818,6 +818,11 @@ static inline void obj_cgroup_put(struct @@ -790,6 +790,11 @@ static inline void obj_cgroup_put(struct
percpu_ref_put(&objcg->refcnt); percpu_ref_put(&objcg->refcnt);
} }
@ -81,8 +81,8 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
static inline void mem_cgroup_put(struct mem_cgroup *memcg) static inline void mem_cgroup_put(struct mem_cgroup *memcg)
{ {
if (memcg) if (memcg)
@@ -1283,6 +1288,11 @@ struct mem_cgroup *mem_cgroup_from_css(s @@ -1290,6 +1295,11 @@ static inline void obj_cgroup_put(struct
return NULL; {
} }
+static inline bool mem_cgroup_tryget(struct mem_cgroup *memcg) +static inline bool mem_cgroup_tryget(struct mem_cgroup *memcg)
@ -95,7 +95,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
} }
--- a/include/linux/mm_inline.h --- a/include/linux/mm_inline.h
+++ b/include/linux/mm_inline.h +++ b/include/linux/mm_inline.h
@@ -112,6 +112,18 @@ static inline bool lru_gen_in_fault(void @@ -122,6 +122,18 @@ static inline bool lru_gen_in_fault(void
return current->in_lru_fault; return current->in_lru_fault;
} }
@ -114,7 +114,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
static inline int lru_gen_from_seq(unsigned long seq) static inline int lru_gen_from_seq(unsigned long seq)
{ {
return seq % MAX_NR_GENS; return seq % MAX_NR_GENS;
@@ -287,6 +299,11 @@ static inline bool lru_gen_in_fault(void @@ -297,6 +309,11 @@ static inline bool lru_gen_in_fault(void
return false; return false;
} }
@ -136,7 +136,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
#include <linux/wait.h> #include <linux/wait.h>
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/cache.h> #include <linux/cache.h>
@@ -357,6 +358,15 @@ struct folio_vma_mapped_walk; @@ -367,6 +368,15 @@ struct page_vma_mapped_walk;
#define LRU_GEN_MASK ((BIT(LRU_GEN_WIDTH) - 1) << LRU_GEN_PGOFF) #define LRU_GEN_MASK ((BIT(LRU_GEN_WIDTH) - 1) << LRU_GEN_PGOFF)
#define LRU_REFS_MASK ((BIT(LRU_REFS_WIDTH) - 1) << LRU_REFS_PGOFF) #define LRU_REFS_MASK ((BIT(LRU_REFS_WIDTH) - 1) << LRU_REFS_PGOFF)
@ -152,7 +152,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
#ifdef CONFIG_LRU_GEN #ifdef CONFIG_LRU_GEN
enum { enum {
@@ -416,6 +426,14 @@ struct lru_gen_folio { @@ -426,6 +436,14 @@ struct lru_gen_folio {
atomic_long_t refaulted[NR_HIST_GENS][ANON_AND_FILE][MAX_NR_TIERS]; atomic_long_t refaulted[NR_HIST_GENS][ANON_AND_FILE][MAX_NR_TIERS];
/* whether the multi-gen LRU is enabled */ /* whether the multi-gen LRU is enabled */
bool enabled; bool enabled;
@ -167,7 +167,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
}; };
enum { enum {
@@ -469,12 +487,87 @@ void lru_gen_init_lruvec(struct lruvec * @@ -479,12 +497,87 @@ void lru_gen_init_lruvec(struct lruvec *
void lru_gen_look_around(struct page_vma_mapped_walk *pvmw); void lru_gen_look_around(struct page_vma_mapped_walk *pvmw);
#ifdef CONFIG_MEMCG #ifdef CONFIG_MEMCG
@ -256,7 +256,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
static inline void lru_gen_init_lruvec(struct lruvec *lruvec) static inline void lru_gen_init_lruvec(struct lruvec *lruvec)
{ {
} }
@@ -484,6 +577,7 @@ static inline void lru_gen_look_around(s @@ -494,6 +587,7 @@ static inline void lru_gen_look_around(s
} }
#ifdef CONFIG_MEMCG #ifdef CONFIG_MEMCG
@ -264,7 +264,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
static inline void lru_gen_init_memcg(struct mem_cgroup *memcg) static inline void lru_gen_init_memcg(struct mem_cgroup *memcg)
{ {
} }
@@ -491,7 +585,24 @@ static inline void lru_gen_init_memcg(st @@ -501,7 +595,24 @@ static inline void lru_gen_init_memcg(st
static inline void lru_gen_exit_memcg(struct mem_cgroup *memcg) static inline void lru_gen_exit_memcg(struct mem_cgroup *memcg)
{ {
} }
@ -290,7 +290,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
#endif /* CONFIG_LRU_GEN */ #endif /* CONFIG_LRU_GEN */
@@ -1105,6 +1216,8 @@ typedef struct pglist_data { @@ -1219,6 +1330,8 @@ typedef struct pglist_data {
#ifdef CONFIG_LRU_GEN #ifdef CONFIG_LRU_GEN
/* kswap mm walk data */ /* kswap mm walk data */
struct lru_gen_mm_walk mm_walk; struct lru_gen_mm_walk mm_walk;
@ -298,10 +298,10 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+ struct lru_gen_memcg memcg_lru; + struct lru_gen_memcg memcg_lru;
#endif #endif
ZONE_PADDING(_pad2_) CACHELINE_PADDING(_pad2_);
--- a/mm/memcontrol.c --- a/mm/memcontrol.c
+++ b/mm/memcontrol.c +++ b/mm/memcontrol.c
@@ -549,6 +549,16 @@ static void mem_cgroup_update_tree(struc @@ -477,6 +477,16 @@ static void mem_cgroup_update_tree(struc
struct mem_cgroup_per_node *mz; struct mem_cgroup_per_node *mz;
struct mem_cgroup_tree_per_node *mctz; struct mem_cgroup_tree_per_node *mctz;
@ -318,9 +318,9 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mctz = soft_limit_tree.rb_tree_per_node[nid]; mctz = soft_limit_tree.rb_tree_per_node[nid];
if (!mctz) if (!mctz)
return; return;
@@ -3433,6 +3443,9 @@ unsigned long mem_cgroup_soft_limit_recl @@ -3522,6 +3532,9 @@ unsigned long mem_cgroup_soft_limit_recl
struct mem_cgroup_tree_per_node *mctz;
unsigned long excess; unsigned long excess;
unsigned long nr_scanned;
+ if (lru_gen_enabled()) + if (lru_gen_enabled())
+ return 0; + return 0;
@ -328,15 +328,15 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
if (order > 0) if (order > 0)
return 0; return 0;
@@ -5321,6 +5334,7 @@ static int mem_cgroup_css_online(struct @@ -5382,6 +5395,7 @@ static int mem_cgroup_css_online(struct
if (unlikely(mem_cgroup_is_root(memcg))) if (unlikely(mem_cgroup_is_root(memcg)))
queue_delayed_work(system_unbound_wq, &stats_flush_dwork, queue_delayed_work(system_unbound_wq, &stats_flush_dwork,
2UL*HZ); 2UL*HZ);
+ lru_gen_online_memcg(memcg); + lru_gen_online_memcg(memcg);
return 0; return 0;
} offline_kmem:
memcg_offline_kmem(memcg);
@@ -5347,6 +5361,7 @@ static void mem_cgroup_css_offline(struc @@ -5413,6 +5427,7 @@ static void mem_cgroup_css_offline(struc
memcg_offline_kmem(memcg); memcg_offline_kmem(memcg);
reparent_shrinker_deferred(memcg); reparent_shrinker_deferred(memcg);
wb_memcg_offline(memcg); wb_memcg_offline(memcg);
@ -344,7 +344,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
drain_all_stock(memcg); drain_all_stock(memcg);
@@ -5358,6 +5373,7 @@ static void mem_cgroup_css_released(stru @@ -5424,6 +5439,7 @@ static void mem_cgroup_css_released(stru
struct mem_cgroup *memcg = mem_cgroup_from_css(css); struct mem_cgroup *memcg = mem_cgroup_from_css(css);
invalidate_reclaim_iterators(memcg); invalidate_reclaim_iterators(memcg);
@ -354,14 +354,14 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
static void mem_cgroup_css_free(struct cgroup_subsys_state *css) static void mem_cgroup_css_free(struct cgroup_subsys_state *css)
--- a/mm/page_alloc.c --- a/mm/page_alloc.c
+++ b/mm/page_alloc.c +++ b/mm/page_alloc.c
@@ -7661,6 +7661,7 @@ static void __init free_area_init_node(i @@ -7957,6 +7957,7 @@ static void __init free_area_init_node(i
pgdat_set_deferred_range(pgdat); pgdat_set_deferred_range(pgdat);
free_area_init_core(pgdat); free_area_init_core(pgdat);
+ lru_gen_init_pgdat(pgdat); + lru_gen_init_pgdat(pgdat);
} }
void __init free_area_init_memoryless_node(int nid) static void __init free_area_init_memoryless_node(int nid)
--- a/mm/vmscan.c --- a/mm/vmscan.c
+++ b/mm/vmscan.c +++ b/mm/vmscan.c
@@ -54,6 +54,8 @@ @@ -54,6 +54,8 @@
@ -373,7 +373,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
#include <asm/tlbflush.h> #include <asm/tlbflush.h>
#include <asm/div64.h> #include <asm/div64.h>
@@ -129,11 +131,6 @@ struct scan_control { @@ -134,11 +136,6 @@ struct scan_control {
/* Always discard instead of demoting to lower tier memory */ /* Always discard instead of demoting to lower tier memory */
unsigned int no_demotion:1; unsigned int no_demotion:1;
@ -385,7 +385,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
/* Allocation order */ /* Allocation order */
s8 order; s8 order;
@@ -2880,6 +2877,9 @@ DEFINE_STATIC_KEY_ARRAY_FALSE(lru_gen_ca @@ -3160,6 +3157,9 @@ DEFINE_STATIC_KEY_ARRAY_FALSE(lru_gen_ca
for ((type) = 0; (type) < ANON_AND_FILE; (type)++) \ for ((type) = 0; (type) < ANON_AND_FILE; (type)++) \
for ((zone) = 0; (zone) < MAX_NR_ZONES; (zone)++) for ((zone) = 0; (zone) < MAX_NR_ZONES; (zone)++)
@ -395,7 +395,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
static struct lruvec *get_lruvec(struct mem_cgroup *memcg, int nid) static struct lruvec *get_lruvec(struct mem_cgroup *memcg, int nid)
{ {
struct pglist_data *pgdat = NODE_DATA(nid); struct pglist_data *pgdat = NODE_DATA(nid);
@@ -4169,8 +4169,7 @@ done: @@ -4443,8 +4443,7 @@ done:
if (sc->priority <= DEF_PRIORITY - 2) if (sc->priority <= DEF_PRIORITY - 2)
wait_event_killable(lruvec->mm_state.wait, wait_event_killable(lruvec->mm_state.wait,
max_seq < READ_ONCE(lrugen->max_seq)); max_seq < READ_ONCE(lrugen->max_seq));
@ -405,7 +405,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
} }
VM_WARN_ON_ONCE(max_seq != READ_ONCE(lrugen->max_seq)); VM_WARN_ON_ONCE(max_seq != READ_ONCE(lrugen->max_seq));
@@ -4243,8 +4242,6 @@ static void lru_gen_age_node(struct pgli @@ -4517,8 +4516,6 @@ static void lru_gen_age_node(struct pgli
VM_WARN_ON_ONCE(!current_is_kswapd()); VM_WARN_ON_ONCE(!current_is_kswapd());
@ -414,7 +414,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
/* check the order to exclude compaction-induced reclaim */ /* check the order to exclude compaction-induced reclaim */
if (!min_ttl || sc->order || sc->priority == DEF_PRIORITY) if (!min_ttl || sc->order || sc->priority == DEF_PRIORITY)
return; return;
@@ -4833,8 +4830,7 @@ static bool should_run_aging(struct lruv @@ -5107,8 +5104,7 @@ static bool should_run_aging(struct lruv
* 1. Defer try_to_inc_max_seq() to workqueues to reduce latency for memcg * 1. Defer try_to_inc_max_seq() to workqueues to reduce latency for memcg
* reclaim. * reclaim.
*/ */
@ -424,7 +424,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
{ {
unsigned long nr_to_scan; unsigned long nr_to_scan;
struct mem_cgroup *memcg = lruvec_memcg(lruvec); struct mem_cgroup *memcg = lruvec_memcg(lruvec);
@@ -4851,10 +4847,8 @@ static unsigned long get_nr_to_scan(stru @@ -5125,10 +5121,8 @@ static unsigned long get_nr_to_scan(stru
if (sc->priority == DEF_PRIORITY) if (sc->priority == DEF_PRIORITY)
return nr_to_scan; return nr_to_scan;
@ -436,7 +436,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
} }
static unsigned long get_nr_to_reclaim(struct scan_control *sc) static unsigned long get_nr_to_reclaim(struct scan_control *sc)
@@ -4863,29 +4857,18 @@ static unsigned long get_nr_to_reclaim(s @@ -5137,29 +5131,18 @@ static unsigned long get_nr_to_reclaim(s
if (!global_reclaim(sc)) if (!global_reclaim(sc))
return -1; return -1;
@ -468,7 +468,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
if (sc->may_swap) if (sc->may_swap)
swappiness = get_swappiness(lruvec, sc); swappiness = get_swappiness(lruvec, sc);
@@ -4895,7 +4878,7 @@ static void lru_gen_shrink_lruvec(struct @@ -5169,7 +5152,7 @@ static void lru_gen_shrink_lruvec(struct
swappiness = 0; swappiness = 0;
nr_to_scan = get_nr_to_scan(lruvec, sc, swappiness); nr_to_scan = get_nr_to_scan(lruvec, sc, swappiness);
@ -477,7 +477,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
break; break;
delta = evict_folios(lruvec, sc, swappiness); delta = evict_folios(lruvec, sc, swappiness);
@@ -4912,10 +4895,250 @@ static void lru_gen_shrink_lruvec(struct @@ -5186,10 +5169,250 @@ static void lru_gen_shrink_lruvec(struct
cond_resched(); cond_resched();
} }
@ -728,7 +728,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
/****************************************************************************** /******************************************************************************
* state change * state change
@@ -5370,11 +5593,11 @@ static int run_cmd(char cmd, int memcg_i @@ -5647,11 +5870,11 @@ static int run_cmd(char cmd, int memcg_i
if (!mem_cgroup_disabled()) { if (!mem_cgroup_disabled()) {
rcu_read_lock(); rcu_read_lock();
@ -743,7 +743,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
rcu_read_unlock(); rcu_read_unlock();
if (!memcg) if (!memcg)
@@ -5521,6 +5744,19 @@ void lru_gen_init_lruvec(struct lruvec * @@ -5799,6 +6022,19 @@ void lru_gen_init_lruvec(struct lruvec *
} }
#ifdef CONFIG_MEMCG #ifdef CONFIG_MEMCG
@ -763,7 +763,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
void lru_gen_init_memcg(struct mem_cgroup *memcg) void lru_gen_init_memcg(struct mem_cgroup *memcg)
{ {
INIT_LIST_HEAD(&memcg->mm_list.fifo); INIT_LIST_HEAD(&memcg->mm_list.fifo);
@@ -5544,7 +5780,69 @@ void lru_gen_exit_memcg(struct mem_cgrou @@ -5822,7 +6058,69 @@ void lru_gen_exit_memcg(struct mem_cgrou
} }
} }
} }
@ -834,7 +834,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
static int __init init_lru_gen(void) static int __init init_lru_gen(void)
{ {
@@ -5571,6 +5869,10 @@ static void lru_gen_shrink_lruvec(struct @@ -5849,6 +6147,10 @@ static void lru_gen_shrink_lruvec(struct
{ {
} }
@ -845,7 +845,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
#endif /* CONFIG_LRU_GEN */ #endif /* CONFIG_LRU_GEN */
static void shrink_lruvec(struct lruvec *lruvec, struct scan_control *sc) static void shrink_lruvec(struct lruvec *lruvec, struct scan_control *sc)
@@ -5584,7 +5886,7 @@ static void shrink_lruvec(struct lruvec @@ -5862,7 +6164,7 @@ static void shrink_lruvec(struct lruvec
bool proportional_reclaim; bool proportional_reclaim;
struct blk_plug plug; struct blk_plug plug;
@ -854,7 +854,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
lru_gen_shrink_lruvec(lruvec, sc); lru_gen_shrink_lruvec(lruvec, sc);
return; return;
} }
@@ -5826,6 +6128,11 @@ static void shrink_node(pg_data_t *pgdat @@ -6105,6 +6407,11 @@ static void shrink_node(pg_data_t *pgdat
struct lruvec *target_lruvec; struct lruvec *target_lruvec;
bool reclaimable = false; bool reclaimable = false;

View file

@ -35,7 +35,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
--- a/mm/vmscan.c --- a/mm/vmscan.c
+++ b/mm/vmscan.c +++ b/mm/vmscan.c
@@ -2905,6 +2905,9 @@ static int get_swappiness(struct lruvec @@ -3185,6 +3185,9 @@ static int get_swappiness(struct lruvec
struct mem_cgroup *memcg = lruvec_memcg(lruvec); struct mem_cgroup *memcg = lruvec_memcg(lruvec);
struct pglist_data *pgdat = lruvec_pgdat(lruvec); struct pglist_data *pgdat = lruvec_pgdat(lruvec);
@ -43,9 +43,9 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+ return 0; + return 0;
+ +
if (!can_demote(pgdat->node_id, sc) && if (!can_demote(pgdat->node_id, sc) &&
mem_cgroup_get_nr_swap_folios(memcg) < MIN_LRU_BATCH) mem_cgroup_get_nr_swap_pages(memcg) < MIN_LRU_BATCH)
return 0; return 0;
@@ -3952,7 +3955,7 @@ static void walk_mm(struct lruvec *lruve @@ -4226,7 +4229,7 @@ static void walk_mm(struct lruvec *lruve
} while (err == -EAGAIN); } while (err == -EAGAIN);
} }
@ -54,7 +54,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
{ {
struct lru_gen_mm_walk *walk = current->reclaim_state->mm_walk; struct lru_gen_mm_walk *walk = current->reclaim_state->mm_walk;
@@ -3960,7 +3963,7 @@ static struct lru_gen_mm_walk *set_mm_wa @@ -4234,7 +4237,7 @@ static struct lru_gen_mm_walk *set_mm_wa
VM_WARN_ON_ONCE(walk); VM_WARN_ON_ONCE(walk);
walk = &pgdat->mm_walk; walk = &pgdat->mm_walk;
@ -63,7 +63,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
VM_WARN_ON_ONCE(current_is_kswapd()); VM_WARN_ON_ONCE(current_is_kswapd());
walk = kzalloc(sizeof(*walk), __GFP_HIGH | __GFP_NOMEMALLOC | __GFP_NOWARN); walk = kzalloc(sizeof(*walk), __GFP_HIGH | __GFP_NOMEMALLOC | __GFP_NOWARN);
@@ -4146,7 +4149,7 @@ static bool try_to_inc_max_seq(struct lr @@ -4420,7 +4423,7 @@ static bool try_to_inc_max_seq(struct lr
goto done; goto done;
} }
@ -72,7 +72,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
if (!walk) { if (!walk) {
success = iterate_mm_list_nowalk(lruvec, max_seq); success = iterate_mm_list_nowalk(lruvec, max_seq);
goto done; goto done;
@@ -4215,8 +4218,6 @@ static bool lruvec_is_reclaimable(struct @@ -4489,8 +4492,6 @@ static bool lruvec_is_reclaimable(struct
struct mem_cgroup *memcg = lruvec_memcg(lruvec); struct mem_cgroup *memcg = lruvec_memcg(lruvec);
DEFINE_MIN_SEQ(lruvec); DEFINE_MIN_SEQ(lruvec);
@ -81,7 +81,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
/* see the comment on lru_gen_folio */ /* see the comment on lru_gen_folio */
gen = lru_gen_from_seq(min_seq[LRU_GEN_FILE]); gen = lru_gen_from_seq(min_seq[LRU_GEN_FILE]);
birth = READ_ONCE(lruvec->lrugen.timestamps[gen]); birth = READ_ONCE(lruvec->lrugen.timestamps[gen]);
@@ -4472,12 +4473,8 @@ static bool isolate_folio(struct lruvec * @@ -4746,12 +4747,8 @@ static bool isolate_folio(struct lruvec
{ {
bool success; bool success;
@ -95,7 +95,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
(folio_test_dirty(folio) || (folio_test_dirty(folio) ||
(folio_test_anon(folio) && !folio_test_swapcache(folio)))) (folio_test_anon(folio) && !folio_test_swapcache(folio))))
return false; return false;
@@ -4574,9 +4571,8 @@ static int scan_folios(struct lruvec *lru @@ -4848,9 +4845,8 @@ static int scan_folios(struct lruvec *lr
__count_vm_events(PGSCAN_ANON + type, isolated); __count_vm_events(PGSCAN_ANON + type, isolated);
/* /*
@ -107,7 +107,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
*/ */
return isolated || !remaining ? scanned : 0; return isolated || !remaining ? scanned : 0;
} }
@@ -4836,8 +4832,7 @@ static long get_nr_to_scan(struct lruvec @@ -5110,8 +5106,7 @@ static long get_nr_to_scan(struct lruvec
struct mem_cgroup *memcg = lruvec_memcg(lruvec); struct mem_cgroup *memcg = lruvec_memcg(lruvec);
DEFINE_MAX_SEQ(lruvec); DEFINE_MAX_SEQ(lruvec);
@ -117,7 +117,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
return 0; return 0;
if (!should_run_aging(lruvec, max_seq, sc, can_swap, &nr_to_scan)) if (!should_run_aging(lruvec, max_seq, sc, can_swap, &nr_to_scan))
@@ -4865,17 +4860,14 @@ static bool try_to_shrink_lruvec(struct @@ -5139,17 +5134,14 @@ static bool try_to_shrink_lruvec(struct
long nr_to_scan; long nr_to_scan;
unsigned long scanned = 0; unsigned long scanned = 0;
unsigned long nr_to_reclaim = get_nr_to_reclaim(sc); unsigned long nr_to_reclaim = get_nr_to_reclaim(sc);
@ -140,7 +140,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
nr_to_scan = get_nr_to_scan(lruvec, sc, swappiness); nr_to_scan = get_nr_to_scan(lruvec, sc, swappiness);
if (nr_to_scan <= 0) if (nr_to_scan <= 0)
@@ -5005,12 +4997,13 @@ static void lru_gen_shrink_lruvec(struct @@ -5279,12 +5271,13 @@ static void lru_gen_shrink_lruvec(struct
struct blk_plug plug; struct blk_plug plug;
VM_WARN_ON_ONCE(global_reclaim(sc)); VM_WARN_ON_ONCE(global_reclaim(sc));
@ -155,7 +155,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
if (try_to_shrink_lruvec(lruvec, sc)) if (try_to_shrink_lruvec(lruvec, sc))
lru_gen_rotate_memcg(lruvec, MEMCG_LRU_YOUNG); lru_gen_rotate_memcg(lruvec, MEMCG_LRU_YOUNG);
@@ -5066,11 +5059,19 @@ static void lru_gen_shrink_node(struct p @@ -5340,11 +5333,19 @@ static void lru_gen_shrink_node(struct p
VM_WARN_ON_ONCE(!global_reclaim(sc)); VM_WARN_ON_ONCE(!global_reclaim(sc));
@ -176,7 +176,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
set_initial_priority(pgdat, sc); set_initial_priority(pgdat, sc);
@@ -5088,7 +5089,7 @@ static void lru_gen_shrink_node(struct p @@ -5362,7 +5363,7 @@ static void lru_gen_shrink_node(struct p
clear_mm_walk(); clear_mm_walk();
blk_finish_plug(&plug); blk_finish_plug(&plug);
@ -185,7 +185,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
/* kswapd should never fail */ /* kswapd should never fail */
pgdat->kswapd_failures = 0; pgdat->kswapd_failures = 0;
} }
@@ -5656,7 +5657,7 @@ static ssize_t lru_gen_seq_write(struct @@ -5934,7 +5935,7 @@ static ssize_t lru_gen_seq_write(struct
set_task_reclaim_state(current, &sc.reclaim_state); set_task_reclaim_state(current, &sc.reclaim_state);
flags = memalloc_noreclaim_save(); flags = memalloc_noreclaim_save();
blk_start_plug(&plug); blk_start_plug(&plug);

View file

@ -23,7 +23,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
--- a/mm/vmscan.c --- a/mm/vmscan.c
+++ b/mm/vmscan.c +++ b/mm/vmscan.c
@@ -4144,7 +4144,7 @@ static bool try_to_inc_max_seq(struct lr @@ -4418,7 +4418,7 @@ static bool try_to_inc_max_seq(struct lr
* handful of PTEs. Spreading the work out over a period of time usually * handful of PTEs. Spreading the work out over a period of time usually
* is less efficient, but it avoids bursty page faults. * is less efficient, but it avoids bursty page faults.
*/ */

View file

@ -25,7 +25,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
--- a/mm/vmscan.c --- a/mm/vmscan.c
+++ b/mm/vmscan.c +++ b/mm/vmscan.c
@@ -4934,18 +4934,20 @@ static int shrink_one(struct lruvec *lru @@ -5208,18 +5208,20 @@ static int shrink_one(struct lruvec *lru
static void shrink_many(struct pglist_data *pgdat, struct scan_control *sc) static void shrink_many(struct pglist_data *pgdat, struct scan_control *sc)
{ {
@ -48,7 +48,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
gen = get_memcg_gen(READ_ONCE(pgdat->memcg_lru.seq)); gen = get_memcg_gen(READ_ONCE(pgdat->memcg_lru.seq));
rcu_read_lock(); rcu_read_lock();
@@ -4969,14 +4971,22 @@ restart: @@ -5243,14 +5245,22 @@ restart:
op = shrink_one(lruvec, sc); op = shrink_one(lruvec, sc);
@ -74,7 +74,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
/* restart if raced with lru_gen_rotate_memcg() */ /* restart if raced with lru_gen_rotate_memcg() */
if (gen != get_nulls_value(pos)) if (gen != get_nulls_value(pos))
goto restart; goto restart;
@@ -4985,11 +4995,6 @@ restart: @@ -5259,11 +5269,6 @@ restart:
bin = get_memcg_bin(bin + 1); bin = get_memcg_bin(bin + 1);
if (bin != first_bin) if (bin != first_bin)
goto restart; goto restart;

View file

@ -21,7 +21,7 @@ Link: https://lore.kernel.org/linux-mtd/20221004083710.27704-1-zajec5@gmail.com
--- a/drivers/mtd/mtdcore.c --- a/drivers/mtd/mtdcore.c
+++ b/drivers/mtd/mtdcore.c +++ b/drivers/mtd/mtdcore.c
@@ -569,18 +569,16 @@ static void mtd_check_of_node(struct mtd @@ -551,18 +551,16 @@ static void mtd_check_of_node(struct mtd
struct device_node *partitions, *parent_dn, *mtd_dn = NULL; struct device_node *partitions, *parent_dn, *mtd_dn = NULL;
const char *pname, *prefix = "partition-"; const char *pname, *prefix = "partition-";
int plen, mtd_name_len, offset, prefix_len; int plen, mtd_name_len, offset, prefix_len;
@ -42,7 +42,7 @@ Link: https://lore.kernel.org/linux-mtd/20221004083710.27704-1-zajec5@gmail.com
if (!parent_dn) if (!parent_dn)
return; return;
@@ -593,15 +591,15 @@ static void mtd_check_of_node(struct mtd @@ -575,15 +573,15 @@ static void mtd_check_of_node(struct mtd
/* Search if a partition is defined with the same name */ /* Search if a partition is defined with the same name */
for_each_child_of_node(partitions, mtd_dn) { for_each_child_of_node(partitions, mtd_dn) {

View file

@ -35,7 +35,7 @@ Link: https://lore.kernel.org/linux-mtd/20221004083710.27704-2-zajec5@gmail.com
--- a/drivers/mtd/mtdcore.c --- a/drivers/mtd/mtdcore.c
+++ b/drivers/mtd/mtdcore.c +++ b/drivers/mtd/mtdcore.c
@@ -569,20 +569,22 @@ static void mtd_check_of_node(struct mtd @@ -551,20 +551,22 @@ static void mtd_check_of_node(struct mtd
struct device_node *partitions, *parent_dn, *mtd_dn = NULL; struct device_node *partitions, *parent_dn, *mtd_dn = NULL;
const char *pname, *prefix = "partition-"; const char *pname, *prefix = "partition-";
int plen, mtd_name_len, offset, prefix_len; int plen, mtd_name_len, offset, prefix_len;
@ -61,7 +61,7 @@ Link: https://lore.kernel.org/linux-mtd/20221004083710.27704-2-zajec5@gmail.com
if (!partitions) if (!partitions)
goto exit_parent; goto exit_parent;
@@ -606,19 +608,11 @@ static void mtd_check_of_node(struct mtd @@ -588,19 +590,11 @@ static void mtd_check_of_node(struct mtd
plen = strlen(pname) - offset; plen = strlen(pname) - offset;
if (plen == mtd_name_len && if (plen == mtd_name_len &&
!strncmp(mtd->name, pname + offset, plen)) { !strncmp(mtd->name, pname + offset, plen)) {

View file

@ -27,7 +27,7 @@ Link: https://lore.kernel.org/linux-mtd/20221022211318.32009-2-zajec5@gmail.com
#include <linux/mtd/mtd.h> #include <linux/mtd/mtd.h>
#include <linux/mtd/partitions.h> #include <linux/mtd/partitions.h>
@@ -748,6 +749,17 @@ int add_mtd_device(struct mtd_info *mtd) @@ -737,6 +738,17 @@ int add_mtd_device(struct mtd_info *mtd)
not->add(mtd); not->add(mtd);
mutex_unlock(&mtd_table_mutex); mutex_unlock(&mtd_table_mutex);

View file

@ -42,7 +42,7 @@ Link: https://lore.kernel.org/linux-mtd/20221015092950.27467-2-zajec5@gmail.com
--- a/drivers/mtd/parsers/Kconfig --- a/drivers/mtd/parsers/Kconfig
+++ b/drivers/mtd/parsers/Kconfig +++ b/drivers/mtd/parsers/Kconfig
@@ -113,6 +113,21 @@ config MTD_AFS_PARTS @@ -123,6 +123,21 @@ config MTD_AFS_PARTS
for your particular device. It won't happen automatically. The for your particular device. It won't happen automatically. The
'physmap' map driver (CONFIG_MTD_PHYSMAP) does this, for example. 'physmap' map driver (CONFIG_MTD_PHYSMAP) does this, for example.
@ -66,7 +66,7 @@ Link: https://lore.kernel.org/linux-mtd/20221015092950.27467-2-zajec5@gmail.com
depends on MTD && (BCM47XX || ARCH_BCM_5301X || ARCH_MEDIATEK || RALINK || COMPILE_TEST) depends on MTD && (BCM47XX || ARCH_BCM_5301X || ARCH_MEDIATEK || RALINK || COMPILE_TEST)
--- a/drivers/mtd/parsers/Makefile --- a/drivers/mtd/parsers/Makefile
+++ b/drivers/mtd/parsers/Makefile +++ b/drivers/mtd/parsers/Makefile
@@ -9,6 +9,7 @@ ofpart-$(CONFIG_MTD_OF_PARTS_BCM4908) += @@ -10,6 +10,7 @@ ofpart-$(CONFIG_MTD_OF_PARTS_BCM4908) +=
ofpart-$(CONFIG_MTD_OF_PARTS_LINKSYS_NS)+= ofpart_linksys_ns.o ofpart-$(CONFIG_MTD_OF_PARTS_LINKSYS_NS)+= ofpart_linksys_ns.o
obj-$(CONFIG_MTD_PARSER_IMAGETAG) += parser_imagetag.o obj-$(CONFIG_MTD_PARSER_IMAGETAG) += parser_imagetag.o
obj-$(CONFIG_MTD_AFS_PARTS) += afs.o obj-$(CONFIG_MTD_AFS_PARTS) += afs.o

View file

@ -17,7 +17,7 @@ Link: https://lore.kernel.org/linux-mtd/20230308082021.870459-4-michael@walle.cc
--- a/drivers/mtd/mtdcore.c --- a/drivers/mtd/mtdcore.c
+++ b/drivers/mtd/mtdcore.c +++ b/drivers/mtd/mtdcore.c
@@ -960,8 +960,8 @@ static int mtd_otp_nvmem_add(struct mtd_ @@ -953,8 +953,8 @@ static int mtd_otp_nvmem_add(struct mtd_
nvmem = mtd_otp_nvmem_register(mtd, "user-otp", size, nvmem = mtd_otp_nvmem_register(mtd, "user-otp", size,
mtd_nvmem_user_otp_reg_read); mtd_nvmem_user_otp_reg_read);
if (IS_ERR(nvmem)) { if (IS_ERR(nvmem)) {
@ -28,7 +28,7 @@ Link: https://lore.kernel.org/linux-mtd/20230308082021.870459-4-michael@walle.cc
} }
mtd->otp_user_nvmem = nvmem; mtd->otp_user_nvmem = nvmem;
} }
@@ -978,7 +978,6 @@ static int mtd_otp_nvmem_add(struct mtd_ @@ -971,7 +971,6 @@ static int mtd_otp_nvmem_add(struct mtd_
nvmem = mtd_otp_nvmem_register(mtd, "factory-otp", size, nvmem = mtd_otp_nvmem_register(mtd, "factory-otp", size,
mtd_nvmem_fact_otp_reg_read); mtd_nvmem_fact_otp_reg_read);
if (IS_ERR(nvmem)) { if (IS_ERR(nvmem)) {
@ -36,7 +36,7 @@ Link: https://lore.kernel.org/linux-mtd/20230308082021.870459-4-michael@walle.cc
err = PTR_ERR(nvmem); err = PTR_ERR(nvmem);
goto err; goto err;
} }
@@ -991,7 +990,7 @@ static int mtd_otp_nvmem_add(struct mtd_ @@ -983,7 +982,7 @@ static int mtd_otp_nvmem_add(struct mtd_
err: err:
nvmem_unregister(mtd->otp_user_nvmem); nvmem_unregister(mtd->otp_user_nvmem);

View file

@ -14,7 +14,7 @@ Signed-off-by: Qingfang DENG <qingfang.deng@siflower.com.cn>
--- a/include/net/page_pool.h --- a/include/net/page_pool.h
+++ b/include/net/page_pool.h +++ b/include/net/page_pool.h
@@ -357,7 +357,7 @@ static inline void page_pool_nid_changed @@ -386,7 +386,7 @@ static inline void page_pool_nid_changed
static inline void page_pool_ring_lock(struct page_pool *pool) static inline void page_pool_ring_lock(struct page_pool *pool)
__acquires(&pool->ring.producer_lock) __acquires(&pool->ring.producer_lock)
{ {
@ -23,7 +23,7 @@ Signed-off-by: Qingfang DENG <qingfang.deng@siflower.com.cn>
spin_lock(&pool->ring.producer_lock); spin_lock(&pool->ring.producer_lock);
else else
spin_lock_bh(&pool->ring.producer_lock); spin_lock_bh(&pool->ring.producer_lock);
@@ -366,7 +366,7 @@ static inline void page_pool_ring_lock(s @@ -395,7 +395,7 @@ static inline void page_pool_ring_lock(s
static inline void page_pool_ring_unlock(struct page_pool *pool) static inline void page_pool_ring_unlock(struct page_pool *pool)
__releases(&pool->ring.producer_lock) __releases(&pool->ring.producer_lock)
{ {
@ -34,7 +34,7 @@ Signed-off-by: Qingfang DENG <qingfang.deng@siflower.com.cn>
spin_unlock_bh(&pool->ring.producer_lock); spin_unlock_bh(&pool->ring.producer_lock);
--- a/net/core/page_pool.c --- a/net/core/page_pool.c
+++ b/net/core/page_pool.c +++ b/net/core/page_pool.c
@@ -512,8 +512,8 @@ static void page_pool_return_page(struct @@ -511,8 +511,8 @@ static void page_pool_return_page(struct
static bool page_pool_recycle_in_ring(struct page_pool *pool, struct page *page) static bool page_pool_recycle_in_ring(struct page_pool *pool, struct page *page)
{ {
int ret; int ret;
@ -45,7 +45,7 @@ Signed-off-by: Qingfang DENG <qingfang.deng@siflower.com.cn>
ret = ptr_ring_produce(&pool->ring, page); ret = ptr_ring_produce(&pool->ring, page);
else else
ret = ptr_ring_produce_bh(&pool->ring, page); ret = ptr_ring_produce_bh(&pool->ring, page);
@@ -576,7 +576,7 @@ __page_pool_put_page(struct page_pool *p @@ -570,7 +570,7 @@ __page_pool_put_page(struct page_pool *p
page_pool_dma_sync_for_device(pool, page, page_pool_dma_sync_for_device(pool, page,
dma_sync_size); dma_sync_size);

View file

@ -18,7 +18,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
--- a/include/linux/etherdevice.h --- a/include/linux/etherdevice.h
+++ b/include/linux/etherdevice.h +++ b/include/linux/etherdevice.h
@@ -478,6 +478,20 @@ static inline void eth_addr_inc(u8 *addr @@ -508,6 +508,20 @@ static inline void eth_addr_inc(u8 *addr
} }
/** /**

View file

@ -32,7 +32,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
--- a/MAINTAINERS --- a/MAINTAINERS
+++ b/MAINTAINERS +++ b/MAINTAINERS
@@ -11789,6 +11789,14 @@ L: netdev@vger.kernel.org @@ -12926,6 +12926,14 @@ L: netdev@vger.kernel.org
S: Maintained S: Maintained
F: drivers/net/ethernet/mediatek/ F: drivers/net/ethernet/mediatek/
@ -49,9 +49,9 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
L: linux-i2c@vger.kernel.org L: linux-i2c@vger.kernel.org
--- a/drivers/net/pcs/Kconfig --- a/drivers/net/pcs/Kconfig
+++ b/drivers/net/pcs/Kconfig +++ b/drivers/net/pcs/Kconfig
@@ -18,4 +18,11 @@ config PCS_LYNX @@ -32,4 +32,11 @@ config PCS_ALTERA_TSE
This module provides helpers to phylink for managing the Lynx PCS This module provides helper functions for the Altera Triple Speed
which is part of the Layerscape and QorIQ Ethernet SERDES. Ethernet SGMII PCS, that can be found on the Intel Socfpga family.
+config PCS_MTK_LYNXI +config PCS_MTK_LYNXI
+ tristate + tristate
@ -63,7 +63,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
endmenu endmenu
--- a/drivers/net/pcs/Makefile --- a/drivers/net/pcs/Makefile
+++ b/drivers/net/pcs/Makefile +++ b/drivers/net/pcs/Makefile
@@ -5,3 +5,4 @@ pcs_xpcs-$(CONFIG_PCS_XPCS) := pcs-xpcs. @@ -7,3 +7,4 @@ obj-$(CONFIG_PCS_XPCS) += pcs_xpcs.o
obj-$(CONFIG_PCS_LYNX) += pcs-lynx.o obj-$(CONFIG_PCS_LYNX) += pcs-lynx.o
obj-$(CONFIG_PCS_RZN1_MIIC) += pcs-rzn1-miic.o obj-$(CONFIG_PCS_RZN1_MIIC) += pcs-rzn1-miic.o
obj-$(CONFIG_PCS_ALTERA_TSE) += pcs-altera-tse.o obj-$(CONFIG_PCS_ALTERA_TSE) += pcs-altera-tse.o

View file

@ -44,7 +44,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
if (dev->wlan.bus_type == MTK_WED_BUS_PCIE) { if (dev->wlan.bus_type == MTK_WED_BUS_PCIE) {
struct device_node *wlan_node; struct device_node *wlan_node;
@@ -885,9 +888,11 @@ mtk_wed_attach(struct mtk_wed_device *de @@ -878,9 +881,11 @@ mtk_wed_attach(struct mtk_wed_device *de
} }
mtk_wed_hw_init_early(dev); mtk_wed_hw_init_early(dev);

View file

@ -23,7 +23,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
} }
static void static void
@@ -695,10 +695,10 @@ mtk_wed_ring_alloc(struct mtk_wed_device @@ -688,10 +688,10 @@ mtk_wed_ring_alloc(struct mtk_wed_device
} }
static int static int
@ -36,7 +36,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
if (mtk_wed_ring_alloc(dev, wdma, MTK_WED_WDMA_RING_SIZE, desc_size)) if (mtk_wed_ring_alloc(dev, wdma, MTK_WED_WDMA_RING_SIZE, desc_size))
return -ENOMEM; return -ENOMEM;
@@ -812,9 +812,9 @@ mtk_wed_start(struct mtk_wed_device *dev @@ -805,9 +805,9 @@ mtk_wed_start(struct mtk_wed_device *dev
{ {
int i; int i;
@ -49,7 +49,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
mtk_wed_hw_init(dev); mtk_wed_hw_init(dev);
mtk_wed_configure_irq(dev, irq_mask); mtk_wed_configure_irq(dev, irq_mask);
@@ -923,7 +923,7 @@ mtk_wed_tx_ring_setup(struct mtk_wed_dev @@ -916,7 +916,7 @@ mtk_wed_tx_ring_setup(struct mtk_wed_dev
sizeof(*ring->desc))) sizeof(*ring->desc)))
return -ENOMEM; return -ENOMEM;

View file

@ -409,7 +409,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
if (dev->wlan.bus_type == MTK_WED_BUS_PCIE) { if (dev->wlan.bus_type == MTK_WED_BUS_PCIE) {
struct device_node *wlan_node; struct device_node *wlan_node;
@@ -441,10 +667,12 @@ mtk_wed_set_wpdma(struct mtk_wed_device @@ -434,10 +660,12 @@ mtk_wed_set_wpdma(struct mtk_wed_device
} else { } else {
mtk_wed_bus_init(dev); mtk_wed_bus_init(dev);
@ -426,7 +426,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
} }
} }
@@ -494,6 +722,132 @@ mtk_wed_hw_init_early(struct mtk_wed_dev @@ -487,6 +715,132 @@ mtk_wed_hw_init_early(struct mtk_wed_dev
} }
} }
@ -559,7 +559,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
static void static void
mtk_wed_hw_init(struct mtk_wed_device *dev) mtk_wed_hw_init(struct mtk_wed_device *dev)
{ {
@@ -505,11 +859,11 @@ mtk_wed_hw_init(struct mtk_wed_device *d @@ -498,11 +852,11 @@ mtk_wed_hw_init(struct mtk_wed_device *d
wed_w32(dev, MTK_WED_TX_BM_CTRL, wed_w32(dev, MTK_WED_TX_BM_CTRL,
MTK_WED_TX_BM_CTRL_PAUSE | MTK_WED_TX_BM_CTRL_PAUSE |
FIELD_PREP(MTK_WED_TX_BM_CTRL_VLD_GRP_NUM, FIELD_PREP(MTK_WED_TX_BM_CTRL_VLD_GRP_NUM,
@ -573,7 +573,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
wed_w32(dev, MTK_WED_TX_BM_BUF_LEN, MTK_WED_PKT_SIZE); wed_w32(dev, MTK_WED_TX_BM_BUF_LEN, MTK_WED_PKT_SIZE);
@@ -536,9 +890,9 @@ mtk_wed_hw_init(struct mtk_wed_device *d @@ -529,9 +883,9 @@ mtk_wed_hw_init(struct mtk_wed_device *d
wed_w32(dev, MTK_WED_TX_TKID_CTRL, wed_w32(dev, MTK_WED_TX_TKID_CTRL,
MTK_WED_TX_TKID_CTRL_PAUSE | MTK_WED_TX_TKID_CTRL_PAUSE |
FIELD_PREP(MTK_WED_TX_TKID_CTRL_VLD_GRP_NUM, FIELD_PREP(MTK_WED_TX_TKID_CTRL_VLD_GRP_NUM,
@ -585,7 +585,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
wed_w32(dev, MTK_WED_TX_TKID_DYN_THR, wed_w32(dev, MTK_WED_TX_TKID_DYN_THR,
FIELD_PREP(MTK_WED_TX_TKID_DYN_THR_LO, 0) | FIELD_PREP(MTK_WED_TX_TKID_DYN_THR_LO, 0) |
MTK_WED_TX_TKID_DYN_THR_HI); MTK_WED_TX_TKID_DYN_THR_HI);
@@ -546,18 +900,28 @@ mtk_wed_hw_init(struct mtk_wed_device *d @@ -539,18 +893,28 @@ mtk_wed_hw_init(struct mtk_wed_device *d
mtk_wed_reset(dev, MTK_WED_RESET_TX_BM); mtk_wed_reset(dev, MTK_WED_RESET_TX_BM);
@ -617,7 +617,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
{ {
void *head = (void *)ring->desc; void *head = (void *)ring->desc;
int i; int i;
@@ -567,7 +931,10 @@ mtk_wed_ring_reset(struct mtk_wed_ring * @@ -560,7 +924,10 @@ mtk_wed_ring_reset(struct mtk_wed_ring *
desc = (struct mtk_wdma_desc *)(head + i * ring->desc_size); desc = (struct mtk_wdma_desc *)(head + i * ring->desc_size);
desc->buf0 = 0; desc->buf0 = 0;
@ -629,7 +629,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
desc->buf1 = 0; desc->buf1 = 0;
desc->info = 0; desc->info = 0;
} }
@@ -623,7 +990,8 @@ mtk_wed_reset_dma(struct mtk_wed_device @@ -616,7 +983,8 @@ mtk_wed_reset_dma(struct mtk_wed_device
if (!dev->tx_ring[i].desc) if (!dev->tx_ring[i].desc)
continue; continue;
@ -639,7 +639,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
} }
if (mtk_wed_poll_busy(dev)) if (mtk_wed_poll_busy(dev))
@@ -641,6 +1009,9 @@ mtk_wed_reset_dma(struct mtk_wed_device @@ -634,6 +1002,9 @@ mtk_wed_reset_dma(struct mtk_wed_device
wdma_w32(dev, MTK_WDMA_RESET_IDX, MTK_WDMA_RESET_IDX_RX); wdma_w32(dev, MTK_WDMA_RESET_IDX, MTK_WDMA_RESET_IDX_RX);
wdma_w32(dev, MTK_WDMA_RESET_IDX, 0); wdma_w32(dev, MTK_WDMA_RESET_IDX, 0);
@ -649,7 +649,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
if (busy) { if (busy) {
mtk_wed_reset(dev, MTK_WED_RESET_WDMA_INT_AGENT); mtk_wed_reset(dev, MTK_WED_RESET_WDMA_INT_AGENT);
mtk_wed_reset(dev, MTK_WED_RESET_WDMA_RX_DRV); mtk_wed_reset(dev, MTK_WED_RESET_WDMA_RX_DRV);
@@ -675,12 +1046,11 @@ mtk_wed_reset_dma(struct mtk_wed_device @@ -668,12 +1039,11 @@ mtk_wed_reset_dma(struct mtk_wed_device
MTK_WED_WPDMA_RESET_IDX_RX); MTK_WED_WPDMA_RESET_IDX_RX);
wed_w32(dev, MTK_WED_WPDMA_RESET_IDX, 0); wed_w32(dev, MTK_WED_WPDMA_RESET_IDX, 0);
} }
@ -663,7 +663,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
{ {
ring->desc = dma_alloc_coherent(dev->hw->dev, size * desc_size, ring->desc = dma_alloc_coherent(dev->hw->dev, size * desc_size,
&ring->desc_phys, GFP_KERNEL); &ring->desc_phys, GFP_KERNEL);
@@ -689,7 +1059,7 @@ mtk_wed_ring_alloc(struct mtk_wed_device @@ -682,7 +1052,7 @@ mtk_wed_ring_alloc(struct mtk_wed_device
ring->desc_size = desc_size; ring->desc_size = desc_size;
ring->size = size; ring->size = size;
@ -672,7 +672,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
return 0; return 0;
} }
@@ -698,9 +1068,14 @@ static int @@ -691,9 +1061,14 @@ static int
mtk_wed_wdma_rx_ring_setup(struct mtk_wed_device *dev, int idx, int size) mtk_wed_wdma_rx_ring_setup(struct mtk_wed_device *dev, int idx, int size)
{ {
u32 desc_size = sizeof(struct mtk_wdma_desc) * dev->hw->version; u32 desc_size = sizeof(struct mtk_wdma_desc) * dev->hw->version;
@ -689,7 +689,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
return -ENOMEM; return -ENOMEM;
wdma_w32(dev, MTK_WDMA_RING_RX(idx) + MTK_WED_RING_OFS_BASE, wdma_w32(dev, MTK_WDMA_RING_RX(idx) + MTK_WED_RING_OFS_BASE,
@@ -717,6 +1092,60 @@ mtk_wed_wdma_rx_ring_setup(struct mtk_we @@ -710,6 +1085,60 @@ mtk_wed_wdma_rx_ring_setup(struct mtk_we
return 0; return 0;
} }
@ -750,7 +750,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
static void static void
mtk_wed_configure_irq(struct mtk_wed_device *dev, u32 irq_mask) mtk_wed_configure_irq(struct mtk_wed_device *dev, u32 irq_mask)
{ {
@@ -739,6 +1168,8 @@ mtk_wed_configure_irq(struct mtk_wed_dev @@ -732,6 +1161,8 @@ mtk_wed_configure_irq(struct mtk_wed_dev
wed_clr(dev, MTK_WED_WDMA_INT_CTRL, wdma_mask); wed_clr(dev, MTK_WED_WDMA_INT_CTRL, wdma_mask);
} else { } else {
@ -759,7 +759,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
/* initail tx interrupt trigger */ /* initail tx interrupt trigger */
wed_w32(dev, MTK_WED_WPDMA_INT_CTRL_TX, wed_w32(dev, MTK_WED_WPDMA_INT_CTRL_TX,
MTK_WED_WPDMA_INT_CTRL_TX0_DONE_EN | MTK_WED_WPDMA_INT_CTRL_TX0_DONE_EN |
@@ -757,6 +1188,16 @@ mtk_wed_configure_irq(struct mtk_wed_dev @@ -750,6 +1181,16 @@ mtk_wed_configure_irq(struct mtk_wed_dev
FIELD_PREP(MTK_WED_WPDMA_INT_CTRL_TX_FREE_DONE_TRIG, FIELD_PREP(MTK_WED_WPDMA_INT_CTRL_TX_FREE_DONE_TRIG,
dev->wlan.txfree_tbit)); dev->wlan.txfree_tbit));
@ -776,7 +776,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
wed_w32(dev, MTK_WED_WDMA_INT_CLR, wdma_mask); wed_w32(dev, MTK_WED_WDMA_INT_CLR, wdma_mask);
wed_set(dev, MTK_WED_WDMA_INT_CTRL, wed_set(dev, MTK_WED_WDMA_INT_CTRL,
FIELD_PREP(MTK_WED_WDMA_INT_CTRL_POLL_SRC_SEL, FIELD_PREP(MTK_WED_WDMA_INT_CTRL_POLL_SRC_SEL,
@@ -794,9 +1235,15 @@ mtk_wed_dma_enable(struct mtk_wed_device @@ -787,9 +1228,15 @@ mtk_wed_dma_enable(struct mtk_wed_device
wdma_set(dev, MTK_WDMA_GLO_CFG, wdma_set(dev, MTK_WDMA_GLO_CFG,
MTK_WDMA_GLO_CFG_RX_INFO3_PRERES); MTK_WDMA_GLO_CFG_RX_INFO3_PRERES);
} else { } else {
@ -792,7 +792,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
wed_set(dev, MTK_WED_WPDMA_GLO_CFG, wed_set(dev, MTK_WED_WPDMA_GLO_CFG,
MTK_WED_WPDMA_GLO_CFG_RX_DRV_R0_PKT_PROC | MTK_WED_WPDMA_GLO_CFG_RX_DRV_R0_PKT_PROC |
MTK_WED_WPDMA_GLO_CFG_RX_DRV_R0_CRX_SYNC); MTK_WED_WPDMA_GLO_CFG_RX_DRV_R0_CRX_SYNC);
@@ -804,6 +1251,15 @@ mtk_wed_dma_enable(struct mtk_wed_device @@ -797,6 +1244,15 @@ mtk_wed_dma_enable(struct mtk_wed_device
wed_clr(dev, MTK_WED_WPDMA_GLO_CFG, wed_clr(dev, MTK_WED_WPDMA_GLO_CFG,
MTK_WED_WPDMA_GLO_CFG_TX_TKID_KEEP | MTK_WED_WPDMA_GLO_CFG_TX_TKID_KEEP |
MTK_WED_WPDMA_GLO_CFG_TX_DMAD_DW3_PREV); MTK_WED_WPDMA_GLO_CFG_TX_DMAD_DW3_PREV);
@ -808,7 +808,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
} }
} }
@@ -829,7 +1285,19 @@ mtk_wed_start(struct mtk_wed_device *dev @@ -822,7 +1278,19 @@ mtk_wed_start(struct mtk_wed_device *dev
val |= BIT(0) | (BIT(1) * !!dev->hw->index); val |= BIT(0) | (BIT(1) * !!dev->hw->index);
regmap_write(dev->hw->mirror, dev->hw->index * 4, val); regmap_write(dev->hw->mirror, dev->hw->index * 4, val);
} else { } else {
@ -829,7 +829,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
} }
mtk_wed_dma_enable(dev); mtk_wed_dma_enable(dev);
@@ -863,7 +1331,7 @@ mtk_wed_attach(struct mtk_wed_device *de @@ -856,7 +1324,7 @@ mtk_wed_attach(struct mtk_wed_device *de
if (!hw) { if (!hw) {
module_put(THIS_MODULE); module_put(THIS_MODULE);
ret = -ENODEV; ret = -ENODEV;
@ -838,7 +838,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
} }
device = dev->wlan.bus_type == MTK_WED_BUS_PCIE device = dev->wlan.bus_type == MTK_WED_BUS_PCIE
@@ -876,15 +1344,24 @@ mtk_wed_attach(struct mtk_wed_device *de @@ -869,15 +1337,24 @@ mtk_wed_attach(struct mtk_wed_device *de
dev->dev = hw->dev; dev->dev = hw->dev;
dev->irq = hw->irq; dev->irq = hw->irq;
dev->wdma_idx = hw->index; dev->wdma_idx = hw->index;
@ -866,7 +866,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
} }
mtk_wed_hw_init_early(dev); mtk_wed_hw_init_early(dev);
@@ -893,8 +1370,10 @@ mtk_wed_attach(struct mtk_wed_device *de @@ -886,8 +1363,10 @@ mtk_wed_attach(struct mtk_wed_device *de
BIT(hw->index), 0); BIT(hw->index), 0);
else else
ret = mtk_wed_wo_init(hw); ret = mtk_wed_wo_init(hw);
@ -878,7 +878,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
mutex_unlock(&hw_lock); mutex_unlock(&hw_lock);
return ret; return ret;
@@ -917,10 +1396,11 @@ mtk_wed_tx_ring_setup(struct mtk_wed_dev @@ -910,10 +1389,11 @@ mtk_wed_tx_ring_setup(struct mtk_wed_dev
* WDMA RX. * WDMA RX.
*/ */
@ -892,7 +892,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
return -ENOMEM; return -ENOMEM;
if (mtk_wed_wdma_rx_ring_setup(dev, idx, MTK_WED_WDMA_RING_SIZE)) if (mtk_wed_wdma_rx_ring_setup(dev, idx, MTK_WED_WDMA_RING_SIZE))
@@ -967,6 +1447,37 @@ mtk_wed_txfree_ring_setup(struct mtk_wed @@ -960,6 +1440,37 @@ mtk_wed_txfree_ring_setup(struct mtk_wed
return 0; return 0;
} }
@ -930,7 +930,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
static u32 static u32
mtk_wed_irq_get(struct mtk_wed_device *dev, u32 mask) mtk_wed_irq_get(struct mtk_wed_device *dev, u32 mask)
{ {
@@ -1063,7 +1574,9 @@ void mtk_wed_add_hw(struct device_node * @@ -1056,7 +1567,9 @@ void mtk_wed_add_hw(struct device_node *
static const struct mtk_wed_ops wed_ops = { static const struct mtk_wed_ops wed_ops = {
.attach = mtk_wed_attach, .attach = mtk_wed_attach,
.tx_ring_setup = mtk_wed_tx_ring_setup, .tx_ring_setup = mtk_wed_tx_ring_setup,
@ -940,7 +940,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
.start = mtk_wed_start, .start = mtk_wed_start,
.stop = mtk_wed_stop, .stop = mtk_wed_stop,
.reset_dma = mtk_wed_reset_dma, .reset_dma = mtk_wed_reset_dma,
@@ -1072,6 +1585,7 @@ void mtk_wed_add_hw(struct device_node * @@ -1065,6 +1578,7 @@ void mtk_wed_add_hw(struct device_node *
.irq_get = mtk_wed_irq_get, .irq_get = mtk_wed_irq_get,
.irq_set_mask = mtk_wed_irq_set_mask, .irq_set_mask = mtk_wed_irq_set_mask,
.detach = mtk_wed_detach, .detach = mtk_wed_detach,

View file

@ -12,7 +12,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -3437,11 +3437,8 @@ static void mtk_pending_work(struct work @@ -3495,11 +3495,8 @@ static void mtk_pending_work(struct work
rtnl_lock(); rtnl_lock();
dev_dbg(eth->dev, "[%s][%d] reset\n", __func__, __LINE__); dev_dbg(eth->dev, "[%s][%d] reset\n", __func__, __LINE__);
@ -25,7 +25,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
/* stop all devices to make sure that dma is properly shut down */ /* stop all devices to make sure that dma is properly shut down */
for (i = 0; i < MTK_MAC_COUNT; i++) { for (i = 0; i < MTK_MAC_COUNT; i++) {
if (!eth->netdev[i]) if (!eth->netdev[i])
@@ -3475,7 +3472,7 @@ static void mtk_pending_work(struct work @@ -3533,7 +3530,7 @@ static void mtk_pending_work(struct work
dev_dbg(eth->dev, "[%s][%d] reset done\n", __func__, __LINE__); dev_dbg(eth->dev, "[%s][%d] reset done\n", __func__, __LINE__);

View file

@ -27,7 +27,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
} }
static void static void
@@ -1297,9 +1297,10 @@ mtk_wed_start(struct mtk_wed_device *dev @@ -1290,9 +1290,10 @@ mtk_wed_start(struct mtk_wed_device *dev
if (mtk_wed_rro_cfg(dev)) if (mtk_wed_rro_cfg(dev))
return; return;
@ -39,7 +39,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
mtk_wed_dma_enable(dev); mtk_wed_dma_enable(dev);
dev->running = true; dev->running = true;
} }
@@ -1365,11 +1366,13 @@ mtk_wed_attach(struct mtk_wed_device *de @@ -1358,11 +1359,13 @@ mtk_wed_attach(struct mtk_wed_device *de
} }
mtk_wed_hw_init_early(dev); mtk_wed_hw_init_early(dev);

View file

@ -70,7 +70,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
} }
if (dev->wlan.bus_type == MTK_WED_BUS_PCIE) { if (dev->wlan.bus_type == MTK_WED_BUS_PCIE) {
@@ -1006,11 +1009,7 @@ mtk_wed_reset_dma(struct mtk_wed_device @@ -999,11 +1002,7 @@ mtk_wed_reset_dma(struct mtk_wed_device
wed_w32(dev, MTK_WED_RESET_IDX, 0); wed_w32(dev, MTK_WED_RESET_IDX, 0);
} }

View file

@ -67,7 +67,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
mtk_wdma_rx_reset(dev); mtk_wdma_rx_reset(dev);
mtk_wed_reset(dev, MTK_WED_RESET_WED); mtk_wed_reset(dev, MTK_WED_RESET_WED);
@@ -677,7 +691,7 @@ mtk_wed_hw_init_early(struct mtk_wed_dev @@ -670,7 +684,7 @@ mtk_wed_hw_init_early(struct mtk_wed_dev
{ {
u32 mask, set; u32 mask, set;

View file

@ -13,7 +13,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
--- a/drivers/net/ethernet/mediatek/mtk_wed.c --- a/drivers/net/ethernet/mediatek/mtk_wed.c
+++ b/drivers/net/ethernet/mediatek/mtk_wed.c +++ b/drivers/net/ethernet/mediatek/mtk_wed.c
@@ -951,42 +951,130 @@ mtk_wed_ring_reset(struct mtk_wed_ring * @@ -944,42 +944,130 @@ mtk_wed_ring_reset(struct mtk_wed_ring *
} }
static u32 static u32
@ -170,7 +170,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
} }
static void static void
@@ -1004,19 +1092,23 @@ mtk_wed_reset_dma(struct mtk_wed_device @@ -997,19 +1085,23 @@ mtk_wed_reset_dma(struct mtk_wed_device
true); true);
} }
@ -201,7 +201,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
if (busy) { if (busy) {
mtk_wed_reset(dev, MTK_WED_RESET_WDMA_INT_AGENT); mtk_wed_reset(dev, MTK_WED_RESET_WDMA_INT_AGENT);
@@ -1033,6 +1125,9 @@ mtk_wed_reset_dma(struct mtk_wed_device @@ -1026,6 +1118,9 @@ mtk_wed_reset_dma(struct mtk_wed_device
MTK_WED_WDMA_GLO_CFG_RST_INIT_COMPLETE); MTK_WED_WDMA_GLO_CFG_RST_INIT_COMPLETE);
} }
@ -211,7 +211,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
for (i = 0; i < 100; i++) { for (i = 0; i < 100; i++) {
val = wed_r32(dev, MTK_WED_TX_BM_INTF); val = wed_r32(dev, MTK_WED_TX_BM_INTF);
if (FIELD_GET(MTK_WED_TX_BM_INTF_TKFIFO_FDEP, val) == 0x40) if (FIELD_GET(MTK_WED_TX_BM_INTF_TKFIFO_FDEP, val) == 0x40)
@@ -1040,8 +1135,19 @@ mtk_wed_reset_dma(struct mtk_wed_device @@ -1033,8 +1128,19 @@ mtk_wed_reset_dma(struct mtk_wed_device
} }
mtk_wed_reset(dev, MTK_WED_RESET_TX_FREE_AGENT); mtk_wed_reset(dev, MTK_WED_RESET_TX_FREE_AGENT);
@ -231,7 +231,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
if (busy) { if (busy) {
mtk_wed_reset(dev, MTK_WED_RESET_WPDMA_INT_AGENT); mtk_wed_reset(dev, MTK_WED_RESET_WPDMA_INT_AGENT);
mtk_wed_reset(dev, MTK_WED_RESET_WPDMA_TX_DRV); mtk_wed_reset(dev, MTK_WED_RESET_WPDMA_TX_DRV);
@@ -1052,6 +1158,17 @@ mtk_wed_reset_dma(struct mtk_wed_device @@ -1045,6 +1151,17 @@ mtk_wed_reset_dma(struct mtk_wed_device
MTK_WED_WPDMA_RESET_IDX_RX); MTK_WED_WPDMA_RESET_IDX_RX);
wed_w32(dev, MTK_WED_WPDMA_RESET_IDX, 0); wed_w32(dev, MTK_WED_WPDMA_RESET_IDX, 0);
} }
@ -249,7 +249,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
} }
static int static int
@@ -1274,6 +1391,9 @@ mtk_wed_start(struct mtk_wed_device *dev @@ -1267,6 +1384,9 @@ mtk_wed_start(struct mtk_wed_device *dev
{ {
int i; int i;
@ -259,7 +259,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
for (i = 0; i < ARRAY_SIZE(dev->rx_wdma); i++) for (i = 0; i < ARRAY_SIZE(dev->rx_wdma); i++)
if (!dev->rx_wdma[i].desc) if (!dev->rx_wdma[i].desc)
mtk_wed_wdma_rx_ring_setup(dev, i, 16); mtk_wed_wdma_rx_ring_setup(dev, i, 16);
@@ -1362,10 +1482,6 @@ mtk_wed_attach(struct mtk_wed_device *de @@ -1355,10 +1475,6 @@ mtk_wed_attach(struct mtk_wed_device *de
goto out; goto out;
if (mtk_wed_get_rx_capa(dev)) { if (mtk_wed_get_rx_capa(dev)) {

View file

@ -14,7 +14,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
--- a/drivers/net/ethernet/mediatek/mtk_wed.c --- a/drivers/net/ethernet/mediatek/mtk_wed.c
+++ b/drivers/net/ethernet/mediatek/mtk_wed.c +++ b/drivers/net/ethernet/mediatek/mtk_wed.c
@@ -1188,7 +1188,8 @@ mtk_wed_ring_alloc(struct mtk_wed_device @@ -1181,7 +1181,8 @@ mtk_wed_ring_alloc(struct mtk_wed_device
} }
static int static int
@ -24,7 +24,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
{ {
u32 desc_size = sizeof(struct mtk_wdma_desc) * dev->hw->version; u32 desc_size = sizeof(struct mtk_wdma_desc) * dev->hw->version;
struct mtk_wed_ring *wdma; struct mtk_wed_ring *wdma;
@@ -1197,8 +1198,8 @@ mtk_wed_wdma_rx_ring_setup(struct mtk_we @@ -1190,8 +1191,8 @@ mtk_wed_wdma_rx_ring_setup(struct mtk_we
return -EINVAL; return -EINVAL;
wdma = &dev->rx_wdma[idx]; wdma = &dev->rx_wdma[idx];
@ -35,7 +35,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
return -ENOMEM; return -ENOMEM;
wdma_w32(dev, MTK_WDMA_RING_RX(idx) + MTK_WED_RING_OFS_BASE, wdma_w32(dev, MTK_WDMA_RING_RX(idx) + MTK_WED_RING_OFS_BASE,
@@ -1396,7 +1397,7 @@ mtk_wed_start(struct mtk_wed_device *dev @@ -1389,7 +1390,7 @@ mtk_wed_start(struct mtk_wed_device *dev
for (i = 0; i < ARRAY_SIZE(dev->rx_wdma); i++) for (i = 0; i < ARRAY_SIZE(dev->rx_wdma); i++)
if (!dev->rx_wdma[i].desc) if (!dev->rx_wdma[i].desc)
@ -44,7 +44,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
mtk_wed_hw_init(dev); mtk_wed_hw_init(dev);
mtk_wed_configure_irq(dev, irq_mask); mtk_wed_configure_irq(dev, irq_mask);
@@ -1505,7 +1506,8 @@ unlock: @@ -1498,7 +1499,8 @@ unlock:
} }
static int static int
@ -54,7 +54,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
{ {
struct mtk_wed_ring *ring = &dev->tx_ring[idx]; struct mtk_wed_ring *ring = &dev->tx_ring[idx];
@@ -1524,11 +1526,12 @@ mtk_wed_tx_ring_setup(struct mtk_wed_dev @@ -1517,11 +1519,12 @@ mtk_wed_tx_ring_setup(struct mtk_wed_dev
if (WARN_ON(idx >= ARRAY_SIZE(dev->tx_ring))) if (WARN_ON(idx >= ARRAY_SIZE(dev->tx_ring)))
return -EINVAL; return -EINVAL;

View file

@ -16,7 +16,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -3200,6 +3200,27 @@ static void mtk_set_mcr_max_rx(struct mt @@ -3254,6 +3254,27 @@ static void mtk_set_mcr_max_rx(struct mt
mtk_w32(mac->hw, mcr_new, MTK_MAC_MCR(mac->id)); mtk_w32(mac->hw, mcr_new, MTK_MAC_MCR(mac->id));
} }
@ -44,7 +44,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
static int mtk_hw_init(struct mtk_eth *eth) static int mtk_hw_init(struct mtk_eth *eth)
{ {
u32 dma_mask = ETHSYS_DMA_AG_MAP_PDMA | ETHSYS_DMA_AG_MAP_QDMA | u32 dma_mask = ETHSYS_DMA_AG_MAP_PDMA | ETHSYS_DMA_AG_MAP_QDMA |
@@ -3239,22 +3260,9 @@ static int mtk_hw_init(struct mtk_eth *e @@ -3293,22 +3314,9 @@ static int mtk_hw_init(struct mtk_eth *e
return 0; return 0;
} }

View file

@ -17,7 +17,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -3221,7 +3221,54 @@ static void mtk_hw_reset(struct mtk_eth @@ -3275,7 +3275,54 @@ static void mtk_hw_reset(struct mtk_eth
0x3ffffff); 0x3ffffff);
} }
@ -73,7 +73,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
{ {
u32 dma_mask = ETHSYS_DMA_AG_MAP_PDMA | ETHSYS_DMA_AG_MAP_QDMA | u32 dma_mask = ETHSYS_DMA_AG_MAP_PDMA | ETHSYS_DMA_AG_MAP_QDMA |
ETHSYS_DMA_AG_MAP_PPE; ETHSYS_DMA_AG_MAP_PPE;
@@ -3260,7 +3307,12 @@ static int mtk_hw_init(struct mtk_eth *e @@ -3314,7 +3361,12 @@ static int mtk_hw_init(struct mtk_eth *e
return 0; return 0;
} }
@ -87,7 +87,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) { if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) {
/* Set FE to PDMAv2 if necessary */ /* Set FE to PDMAv2 if necessary */
@@ -3465,7 +3517,7 @@ static void mtk_pending_work(struct work @@ -3522,7 +3574,7 @@ static void mtk_pending_work(struct work
if (eth->dev->pins) if (eth->dev->pins)
pinctrl_select_state(eth->dev->pins->p, pinctrl_select_state(eth->dev->pins->p,
eth->dev->pins->default_state); eth->dev->pins->default_state);
@ -96,7 +96,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
/* restart DMA and enable IRQs */ /* restart DMA and enable IRQs */
for (i = 0; i < MTK_MAC_COUNT; i++) { for (i = 0; i < MTK_MAC_COUNT; i++) {
@@ -4057,7 +4109,7 @@ static int mtk_probe(struct platform_dev @@ -4114,7 +4166,7 @@ static int mtk_probe(struct platform_dev
eth->msg_enable = netif_msg_init(mtk_msg_level, MTK_DEFAULT_MSG_ENABLE); eth->msg_enable = netif_msg_init(mtk_msg_level, MTK_DEFAULT_MSG_ENABLE);
INIT_WORK(&eth->pending_work, mtk_pending_work); INIT_WORK(&eth->pending_work, mtk_pending_work);

View file

@ -16,7 +16,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -2786,14 +2786,29 @@ static void mtk_dma_free(struct mtk_eth @@ -2842,14 +2842,29 @@ static void mtk_dma_free(struct mtk_eth
kfree(eth->scratch_head); kfree(eth->scratch_head);
} }
@ -48,7 +48,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
schedule_work(&eth->pending_work); schedule_work(&eth->pending_work);
} }
@@ -3275,15 +3290,17 @@ static int mtk_hw_init(struct mtk_eth *e @@ -3329,15 +3344,17 @@ static int mtk_hw_init(struct mtk_eth *e
const struct mtk_reg_map *reg_map = eth->soc->reg_map; const struct mtk_reg_map *reg_map = eth->soc->reg_map;
int i, val, ret; int i, val, ret;
@ -72,7 +72,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
if (eth->ethsys) if (eth->ethsys)
regmap_update_bits(eth->ethsys, ETHSYS_DMA_AG_MAP, dma_mask, regmap_update_bits(eth->ethsys, ETHSYS_DMA_AG_MAP, dma_mask,
@@ -3409,8 +3426,10 @@ static int mtk_hw_init(struct mtk_eth *e @@ -3466,8 +3483,10 @@ static int mtk_hw_init(struct mtk_eth *e
return 0; return 0;
err_disable_pm: err_disable_pm:
@ -85,7 +85,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
return ret; return ret;
} }
@@ -3489,30 +3508,53 @@ static int mtk_do_ioctl(struct net_devic @@ -3546,30 +3565,53 @@ static int mtk_do_ioctl(struct net_devic
return -EOPNOTSUPP; return -EOPNOTSUPP;
} }
@ -148,7 +148,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
if (eth->dev->pins) if (eth->dev->pins)
pinctrl_select_state(eth->dev->pins->p, pinctrl_select_state(eth->dev->pins->p,
@@ -3523,15 +3565,19 @@ static void mtk_pending_work(struct work @@ -3580,15 +3622,19 @@ static void mtk_pending_work(struct work
for (i = 0; i < MTK_MAC_COUNT; i++) { for (i = 0; i < MTK_MAC_COUNT; i++) {
if (!test_bit(i, &restart)) if (!test_bit(i, &restart))
continue; continue;
@ -201,7 +201,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
--- a/drivers/net/ethernet/mediatek/mtk_ppe.c --- a/drivers/net/ethernet/mediatek/mtk_ppe.c
+++ b/drivers/net/ethernet/mediatek/mtk_ppe.c +++ b/drivers/net/ethernet/mediatek/mtk_ppe.c
@@ -716,6 +716,33 @@ int mtk_foe_entry_idle_time(struct mtk_p @@ -710,6 +710,33 @@ int mtk_foe_entry_idle_time(struct mtk_p
return __mtk_foe_entry_idle_time(ppe, entry->data.ib1); return __mtk_foe_entry_idle_time(ppe, entry->data.ib1);
} }
@ -238,7 +238,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
--- a/drivers/net/ethernet/mediatek/mtk_ppe.h --- a/drivers/net/ethernet/mediatek/mtk_ppe.h
+++ b/drivers/net/ethernet/mediatek/mtk_ppe.h +++ b/drivers/net/ethernet/mediatek/mtk_ppe.h
@@ -306,6 +306,7 @@ struct mtk_ppe *mtk_ppe_init(struct mtk_ @@ -306,6 +306,7 @@ struct mtk_ppe *mtk_ppe_init(struct mtk_
int version, int index); void mtk_ppe_deinit(struct mtk_eth *eth);
void mtk_ppe_start(struct mtk_ppe *ppe); void mtk_ppe_start(struct mtk_ppe *ppe);
int mtk_ppe_stop(struct mtk_ppe *ppe); int mtk_ppe_stop(struct mtk_ppe *ppe);
+int mtk_ppe_prepare_reset(struct mtk_ppe *ppe); +int mtk_ppe_prepare_reset(struct mtk_ppe *ppe);

View file

@ -49,7 +49,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
}; };
/* strings used by ethtool */ /* strings used by ethtool */
@@ -3283,6 +3289,102 @@ static void mtk_hw_warm_reset(struct mtk @@ -3337,6 +3343,102 @@ static void mtk_hw_warm_reset(struct mtk
val, rst_mask); val, rst_mask);
} }
@ -152,7 +152,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
static int mtk_hw_init(struct mtk_eth *eth, bool reset) static int mtk_hw_init(struct mtk_eth *eth, bool reset)
{ {
u32 dma_mask = ETHSYS_DMA_AG_MAP_PDMA | ETHSYS_DMA_AG_MAP_QDMA | u32 dma_mask = ETHSYS_DMA_AG_MAP_PDMA | ETHSYS_DMA_AG_MAP_QDMA |
@@ -3615,6 +3717,7 @@ static int mtk_cleanup(struct mtk_eth *e @@ -3672,6 +3774,7 @@ static int mtk_cleanup(struct mtk_eth *e
mtk_unreg_dev(eth); mtk_unreg_dev(eth);
mtk_free_dev(eth); mtk_free_dev(eth);
cancel_work_sync(&eth->pending_work); cancel_work_sync(&eth->pending_work);
@ -160,7 +160,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
return 0; return 0;
} }
@@ -4042,6 +4145,7 @@ static int mtk_probe(struct platform_dev @@ -4099,6 +4202,7 @@ static int mtk_probe(struct platform_dev
eth->rx_dim.mode = DIM_CQ_PERIOD_MODE_START_FROM_EQE; eth->rx_dim.mode = DIM_CQ_PERIOD_MODE_START_FROM_EQE;
INIT_WORK(&eth->rx_dim.work, mtk_dim_rx); INIT_WORK(&eth->rx_dim.work, mtk_dim_rx);
@ -168,8 +168,8 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
eth->tx_dim.mode = DIM_CQ_PERIOD_MODE_START_FROM_EQE; eth->tx_dim.mode = DIM_CQ_PERIOD_MODE_START_FROM_EQE;
INIT_WORK(&eth->tx_dim.work, mtk_dim_tx); INIT_WORK(&eth->tx_dim.work, mtk_dim_tx);
@@ -4246,6 +4350,8 @@ static int mtk_probe(struct platform_dev @@ -4301,6 +4405,8 @@ static int mtk_probe(struct platform_dev
NAPI_POLL_WEIGHT); netif_napi_add(&eth->dummy_dev, &eth->rx_napi, mtk_napi_rx);
platform_set_drvdata(pdev, eth); platform_set_drvdata(pdev, eth);
+ schedule_delayed_work(&eth->reset.monitor_work, + schedule_delayed_work(&eth->reset.monitor_work,
@ -179,7 +179,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
@@ -256,6 +256,8 @@ @@ -257,6 +257,8 @@
#define MTK_RX_DONE_INT_V2 BIT(14) #define MTK_RX_DONE_INT_V2 BIT(14)
@ -188,7 +188,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
/* QDMA Interrupt grouping registers */ /* QDMA Interrupt grouping registers */
#define MTK_RLS_DONE_INT BIT(0) #define MTK_RLS_DONE_INT BIT(0)
@@ -538,6 +540,17 @@ @@ -542,6 +544,17 @@
#define MT7628_SDM_RBCNT (MT7628_SDM_OFFSET + 0x10c) #define MT7628_SDM_RBCNT (MT7628_SDM_OFFSET + 0x10c)
#define MT7628_SDM_CS_ERR (MT7628_SDM_OFFSET + 0x110) #define MT7628_SDM_CS_ERR (MT7628_SDM_OFFSET + 0x110)
@ -206,7 +206,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
struct mtk_rx_dma { struct mtk_rx_dma {
unsigned int rxd1; unsigned int rxd1;
unsigned int rxd2; unsigned int rxd2;
@@ -934,6 +947,7 @@ struct mtk_reg_map { @@ -938,6 +951,7 @@ struct mtk_reg_map {
u32 delay_irq; /* delay interrupt */ u32 delay_irq; /* delay interrupt */
u32 irq_status; /* interrupt status */ u32 irq_status; /* interrupt status */
u32 irq_mask; /* interrupt mask */ u32 irq_mask; /* interrupt mask */
@ -214,8 +214,8 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
u32 int_grp; u32 int_grp;
} pdma; } pdma;
struct { struct {
@@ -960,6 +974,8 @@ struct mtk_reg_map { @@ -964,6 +978,8 @@ struct mtk_reg_map {
u32 gdma_to_ppe0; u32 gdma_to_ppe;
u32 ppe_base; u32 ppe_base;
u32 wdma_base[2]; u32 wdma_base[2];
+ u32 pse_iq_sta; + u32 pse_iq_sta;
@ -223,7 +223,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
}; };
/* struct mtk_eth_data - This is the structure holding all differences /* struct mtk_eth_data - This is the structure holding all differences
@@ -1002,6 +1018,8 @@ struct mtk_soc_data { @@ -1006,6 +1022,8 @@ struct mtk_soc_data {
} txrx; } txrx;
}; };
@ -232,7 +232,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
/* currently no SoC has more than 2 macs */ /* currently no SoC has more than 2 macs */
#define MTK_MAX_DEVS 2 #define MTK_MAX_DEVS 2
@@ -1124,6 +1142,14 @@ struct mtk_eth { @@ -1128,6 +1146,14 @@ struct mtk_eth {
struct rhashtable flow_table; struct rhashtable flow_table;
struct bpf_prog __rcu *prog; struct bpf_prog __rcu *prog;

View file

@ -14,7 +14,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -3646,6 +3646,11 @@ static void mtk_pending_work(struct work @@ -3703,6 +3703,11 @@ static void mtk_pending_work(struct work
set_bit(MTK_RESETTING, &eth->state); set_bit(MTK_RESETTING, &eth->state);
mtk_prepare_for_reset(eth); mtk_prepare_for_reset(eth);
@ -26,7 +26,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
/* stop all devices to make sure that dma is properly shut down */ /* stop all devices to make sure that dma is properly shut down */
for (i = 0; i < MTK_MAC_COUNT; i++) { for (i = 0; i < MTK_MAC_COUNT; i++) {
@@ -3683,6 +3688,8 @@ static void mtk_pending_work(struct work @@ -3740,6 +3745,8 @@ static void mtk_pending_work(struct work
clear_bit(MTK_RESETTING, &eth->state); clear_bit(MTK_RESETTING, &eth->state);

View file

@ -17,7 +17,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
--- a/drivers/net/ethernet/mediatek/mtk_wed.c --- a/drivers/net/ethernet/mediatek/mtk_wed.c
+++ b/drivers/net/ethernet/mediatek/mtk_wed.c +++ b/drivers/net/ethernet/mediatek/mtk_wed.c
@@ -1259,7 +1259,8 @@ mtk_wed_wdma_rx_ring_setup(struct mtk_we @@ -1252,7 +1252,8 @@ mtk_wed_wdma_rx_ring_setup(struct mtk_we
} }
static int static int
@ -27,7 +27,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
{ {
u32 desc_size = sizeof(struct mtk_wdma_desc) * dev->hw->version; u32 desc_size = sizeof(struct mtk_wdma_desc) * dev->hw->version;
struct mtk_wed_ring *wdma; struct mtk_wed_ring *wdma;
@@ -1268,8 +1269,8 @@ mtk_wed_wdma_tx_ring_setup(struct mtk_we @@ -1261,8 +1262,8 @@ mtk_wed_wdma_tx_ring_setup(struct mtk_we
return -EINVAL; return -EINVAL;
wdma = &dev->tx_wdma[idx]; wdma = &dev->tx_wdma[idx];
@ -38,7 +38,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
return -ENOMEM; return -ENOMEM;
wdma_w32(dev, MTK_WDMA_RING_TX(idx) + MTK_WED_RING_OFS_BASE, wdma_w32(dev, MTK_WDMA_RING_TX(idx) + MTK_WED_RING_OFS_BASE,
@@ -1279,6 +1280,9 @@ mtk_wed_wdma_tx_ring_setup(struct mtk_we @@ -1272,6 +1273,9 @@ mtk_wed_wdma_tx_ring_setup(struct mtk_we
wdma_w32(dev, MTK_WDMA_RING_TX(idx) + MTK_WED_RING_OFS_CPU_IDX, 0); wdma_w32(dev, MTK_WDMA_RING_TX(idx) + MTK_WED_RING_OFS_CPU_IDX, 0);
wdma_w32(dev, MTK_WDMA_RING_TX(idx) + MTK_WED_RING_OFS_DMA_IDX, 0); wdma_w32(dev, MTK_WDMA_RING_TX(idx) + MTK_WED_RING_OFS_DMA_IDX, 0);
@ -48,7 +48,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
if (!idx) { if (!idx) {
wed_w32(dev, MTK_WED_WDMA_RING_TX + MTK_WED_RING_OFS_BASE, wed_w32(dev, MTK_WED_WDMA_RING_TX + MTK_WED_RING_OFS_BASE,
wdma->desc_phys); wdma->desc_phys);
@@ -1618,18 +1622,20 @@ mtk_wed_txfree_ring_setup(struct mtk_wed @@ -1611,18 +1615,20 @@ mtk_wed_txfree_ring_setup(struct mtk_wed
} }
static int static int

View file

@ -12,7 +12,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -901,7 +901,7 @@ static int mtk_init_fq_dma(struct mtk_et @@ -945,7 +945,7 @@ static int mtk_init_fq_dma(struct mtk_et
{ {
const struct mtk_soc_data *soc = eth->soc; const struct mtk_soc_data *soc = eth->soc;
dma_addr_t phy_ring_tail; dma_addr_t phy_ring_tail;
@ -21,7 +21,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
dma_addr_t dma_addr; dma_addr_t dma_addr;
int i; int i;
@@ -2155,19 +2155,25 @@ static int mtk_tx_alloc(struct mtk_eth * @@ -2209,19 +2209,25 @@ static int mtk_tx_alloc(struct mtk_eth *
struct mtk_tx_ring *ring = &eth->tx_ring; struct mtk_tx_ring *ring = &eth->tx_ring;
int i, sz = soc->txrx.txd_size; int i, sz = soc->txrx.txd_size;
struct mtk_tx_dma_v2 *txd; struct mtk_tx_dma_v2 *txd;
@ -51,7 +51,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
u32 next_ptr = ring->phys + next * sz; u32 next_ptr = ring->phys + next * sz;
txd = ring->dma + i * sz; txd = ring->dma + i * sz;
@@ -2187,22 +2193,22 @@ static int mtk_tx_alloc(struct mtk_eth * @@ -2241,22 +2247,22 @@ static int mtk_tx_alloc(struct mtk_eth *
* descriptors in ring->dma_pdma. * descriptors in ring->dma_pdma.
*/ */
if (!MTK_HAS_CAPS(soc->caps, MTK_QDMA)) { if (!MTK_HAS_CAPS(soc->caps, MTK_QDMA)) {
@ -79,7 +79,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
ring->thresh = MAX_SKB_FRAGS; ring->thresh = MAX_SKB_FRAGS;
/* make sure that all changes to the dma ring are flushed before we /* make sure that all changes to the dma ring are flushed before we
@@ -2214,14 +2220,14 @@ static int mtk_tx_alloc(struct mtk_eth * @@ -2268,14 +2274,14 @@ static int mtk_tx_alloc(struct mtk_eth *
mtk_w32(eth, ring->phys, soc->reg_map->qdma.ctx_ptr); mtk_w32(eth, ring->phys, soc->reg_map->qdma.ctx_ptr);
mtk_w32(eth, ring->phys, soc->reg_map->qdma.dtx_ptr); mtk_w32(eth, ring->phys, soc->reg_map->qdma.dtx_ptr);
mtk_w32(eth, mtk_w32(eth,
@ -96,7 +96,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
mtk_w32(eth, 0, MT7628_TX_CTX_IDX0); mtk_w32(eth, 0, MT7628_TX_CTX_IDX0);
mtk_w32(eth, MT7628_PST_DTX_IDX0, soc->reg_map->pdma.rst_idx); mtk_w32(eth, MT7628_PST_DTX_IDX0, soc->reg_map->pdma.rst_idx);
} }
@@ -2239,7 +2245,7 @@ static void mtk_tx_clean(struct mtk_eth @@ -2293,7 +2299,7 @@ static void mtk_tx_clean(struct mtk_eth
int i; int i;
if (ring->buf) { if (ring->buf) {
@ -105,7 +105,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
mtk_tx_unmap(eth, &ring->buf[i], NULL, false); mtk_tx_unmap(eth, &ring->buf[i], NULL, false);
kfree(ring->buf); kfree(ring->buf);
ring->buf = NULL; ring->buf = NULL;
@@ -2247,14 +2253,14 @@ static void mtk_tx_clean(struct mtk_eth @@ -2301,14 +2307,14 @@ static void mtk_tx_clean(struct mtk_eth
if (ring->dma) { if (ring->dma) {
dma_free_coherent(eth->dma_dev, dma_free_coherent(eth->dma_dev,
@ -122,7 +122,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
ring->dma_pdma, ring->phys_pdma); ring->dma_pdma, ring->phys_pdma);
ring->dma_pdma = NULL; ring->dma_pdma = NULL;
} }
@@ -2774,7 +2780,7 @@ static void mtk_dma_free(struct mtk_eth @@ -2830,7 +2836,7 @@ static void mtk_dma_free(struct mtk_eth
netdev_reset_queue(eth->netdev[i]); netdev_reset_queue(eth->netdev[i]);
if (eth->scratch_ring) { if (eth->scratch_ring) {
dma_free_coherent(eth->dma_dev, dma_free_coherent(eth->dma_dev,

View file

@ -12,7 +12,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -4428,7 +4428,7 @@ static const struct mtk_soc_data mt7621_ @@ -4484,7 +4484,7 @@ static const struct mtk_soc_data mt7621_
.hw_features = MTK_HW_FEATURES, .hw_features = MTK_HW_FEATURES,
.required_clks = MT7621_CLKS_BITMAP, .required_clks = MT7621_CLKS_BITMAP,
.required_pctl = false, .required_pctl = false,
@ -21,7 +21,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
.hash_offset = 2, .hash_offset = 2,
.foe_entry_size = sizeof(struct mtk_foe_entry) - 16, .foe_entry_size = sizeof(struct mtk_foe_entry) - 16,
.txrx = { .txrx = {
@@ -4467,7 +4467,7 @@ static const struct mtk_soc_data mt7623_ @@ -4523,7 +4523,7 @@ static const struct mtk_soc_data mt7623_
.hw_features = MTK_HW_FEATURES, .hw_features = MTK_HW_FEATURES,
.required_clks = MT7623_CLKS_BITMAP, .required_clks = MT7623_CLKS_BITMAP,
.required_pctl = true, .required_pctl = true,

View file

@ -53,8 +53,8 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
+ .tx_sch_rate = 0x4798, + .tx_sch_rate = 0x4798,
}, },
.gdm1_cnt = 0x1c00, .gdm1_cnt = 0x1c00,
.gdma_to_ppe0 = 0x3333, .gdma_to_ppe = 0x3333,
@@ -577,6 +581,75 @@ static void mtk_mac_link_down(struct phy @@ -620,6 +624,75 @@ static void mtk_mac_link_down(struct phy
mtk_w32(mac->hw, mcr, MTK_MAC_MCR(mac->id)); mtk_w32(mac->hw, mcr, MTK_MAC_MCR(mac->id));
} }
@ -130,7 +130,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
static void mtk_mac_link_up(struct phylink_config *config, static void mtk_mac_link_up(struct phylink_config *config,
struct phy_device *phy, struct phy_device *phy,
unsigned int mode, phy_interface_t interface, unsigned int mode, phy_interface_t interface,
@@ -602,6 +675,8 @@ static void mtk_mac_link_up(struct phyli @@ -645,6 +718,8 @@ static void mtk_mac_link_up(struct phyli
break; break;
} }
@ -139,7 +139,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
/* Configure duplex */ /* Configure duplex */
if (duplex == DUPLEX_FULL) if (duplex == DUPLEX_FULL)
mcr |= MAC_MCR_FORCE_DPX; mcr |= MAC_MCR_FORCE_DPX;
@@ -1060,7 +1135,8 @@ static void mtk_tx_set_dma_desc_v1(struc @@ -1106,7 +1181,8 @@ static void mtk_tx_set_dma_desc_v1(struc
WRITE_ONCE(desc->txd1, info->addr); WRITE_ONCE(desc->txd1, info->addr);
@ -149,7 +149,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
if (info->last) if (info->last)
data |= TX_DMA_LS0; data |= TX_DMA_LS0;
WRITE_ONCE(desc->txd3, data); WRITE_ONCE(desc->txd3, data);
@@ -1094,9 +1170,6 @@ static void mtk_tx_set_dma_desc_v2(struc @@ -1140,9 +1216,6 @@ static void mtk_tx_set_dma_desc_v2(struc
data |= TX_DMA_LS0; data |= TX_DMA_LS0;
WRITE_ONCE(desc->txd3, data); WRITE_ONCE(desc->txd3, data);
@ -159,7 +159,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
data = (mac->id + 1) << TX_DMA_FPORT_SHIFT_V2; /* forward port */ data = (mac->id + 1) << TX_DMA_FPORT_SHIFT_V2; /* forward port */
data |= TX_DMA_SWC_V2 | QID_BITS_V2(info->qid); data |= TX_DMA_SWC_V2 | QID_BITS_V2(info->qid);
WRITE_ONCE(desc->txd4, data); WRITE_ONCE(desc->txd4, data);
@@ -1140,11 +1213,12 @@ static int mtk_tx_map(struct sk_buff *sk @@ -1186,11 +1259,12 @@ static int mtk_tx_map(struct sk_buff *sk
.gso = gso, .gso = gso,
.csum = skb->ip_summed == CHECKSUM_PARTIAL, .csum = skb->ip_summed == CHECKSUM_PARTIAL,
.vlan = skb_vlan_tag_present(skb), .vlan = skb_vlan_tag_present(skb),
@ -173,7 +173,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
struct mtk_mac *mac = netdev_priv(dev); struct mtk_mac *mac = netdev_priv(dev);
struct mtk_eth *eth = mac->hw; struct mtk_eth *eth = mac->hw;
const struct mtk_soc_data *soc = eth->soc; const struct mtk_soc_data *soc = eth->soc;
@@ -1152,8 +1226,10 @@ static int mtk_tx_map(struct sk_buff *sk @@ -1198,8 +1272,10 @@ static int mtk_tx_map(struct sk_buff *sk
struct mtk_tx_dma *itxd_pdma, *txd_pdma; struct mtk_tx_dma *itxd_pdma, *txd_pdma;
struct mtk_tx_buf *itx_buf, *tx_buf; struct mtk_tx_buf *itx_buf, *tx_buf;
int i, n_desc = 1; int i, n_desc = 1;
@ -184,7 +184,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
itxd = ring->next_free; itxd = ring->next_free;
itxd_pdma = qdma_to_pdma(ring, itxd); itxd_pdma = qdma_to_pdma(ring, itxd);
if (itxd == ring->last_free) if (itxd == ring->last_free)
@@ -1202,7 +1278,7 @@ static int mtk_tx_map(struct sk_buff *sk @@ -1248,7 +1324,7 @@ static int mtk_tx_map(struct sk_buff *sk
memset(&txd_info, 0, sizeof(struct mtk_tx_dma_desc_info)); memset(&txd_info, 0, sizeof(struct mtk_tx_dma_desc_info));
txd_info.size = min_t(unsigned int, frag_size, txd_info.size = min_t(unsigned int, frag_size,
soc->txrx.dma_max_len); soc->txrx.dma_max_len);
@ -193,7 +193,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
txd_info.last = i == skb_shinfo(skb)->nr_frags - 1 && txd_info.last = i == skb_shinfo(skb)->nr_frags - 1 &&
!(frag_size - txd_info.size); !(frag_size - txd_info.size);
txd_info.addr = skb_frag_dma_map(eth->dma_dev, frag, txd_info.addr = skb_frag_dma_map(eth->dma_dev, frag,
@@ -1241,7 +1317,7 @@ static int mtk_tx_map(struct sk_buff *sk @@ -1287,7 +1363,7 @@ static int mtk_tx_map(struct sk_buff *sk
txd_pdma->txd2 |= TX_DMA_LS1; txd_pdma->txd2 |= TX_DMA_LS1;
} }
@ -202,7 +202,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
skb_tx_timestamp(skb); skb_tx_timestamp(skb);
ring->next_free = mtk_qdma_phys_to_virt(ring, txd->txd2); ring->next_free = mtk_qdma_phys_to_virt(ring, txd->txd2);
@@ -1253,8 +1329,7 @@ static int mtk_tx_map(struct sk_buff *sk @@ -1299,8 +1375,7 @@ static int mtk_tx_map(struct sk_buff *sk
wmb(); wmb();
if (MTK_HAS_CAPS(soc->caps, MTK_QDMA)) { if (MTK_HAS_CAPS(soc->caps, MTK_QDMA)) {
@ -212,7 +212,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
mtk_w32(eth, txd->txd2, soc->reg_map->qdma.ctx_ptr); mtk_w32(eth, txd->txd2, soc->reg_map->qdma.ctx_ptr);
} else { } else {
int next_idx; int next_idx;
@@ -1323,7 +1398,7 @@ static void mtk_wake_queue(struct mtk_et @@ -1369,7 +1444,7 @@ static void mtk_wake_queue(struct mtk_et
for (i = 0; i < MTK_MAC_COUNT; i++) { for (i = 0; i < MTK_MAC_COUNT; i++) {
if (!eth->netdev[i]) if (!eth->netdev[i])
continue; continue;
@ -221,7 +221,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
} }
} }
@@ -1347,7 +1422,7 @@ static netdev_tx_t mtk_start_xmit(struct @@ -1393,7 +1468,7 @@ static netdev_tx_t mtk_start_xmit(struct
tx_num = mtk_cal_txd_req(eth, skb); tx_num = mtk_cal_txd_req(eth, skb);
if (unlikely(atomic_read(&ring->free_count) <= tx_num)) { if (unlikely(atomic_read(&ring->free_count) <= tx_num)) {
@ -230,7 +230,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
netif_err(eth, tx_queued, dev, netif_err(eth, tx_queued, dev,
"Tx Ring full when queue awake!\n"); "Tx Ring full when queue awake!\n");
spin_unlock(&eth->page_lock); spin_unlock(&eth->page_lock);
@@ -1373,7 +1448,7 @@ static netdev_tx_t mtk_start_xmit(struct @@ -1419,7 +1494,7 @@ static netdev_tx_t mtk_start_xmit(struct
goto drop; goto drop;
if (unlikely(atomic_read(&ring->free_count) <= ring->thresh)) if (unlikely(atomic_read(&ring->free_count) <= ring->thresh))
@ -239,7 +239,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
spin_unlock(&eth->page_lock); spin_unlock(&eth->page_lock);
@@ -1540,10 +1615,12 @@ static int mtk_xdp_submit_frame(struct m @@ -1586,10 +1661,12 @@ static int mtk_xdp_submit_frame(struct m
struct skb_shared_info *sinfo = xdp_get_shared_info_from_frame(xdpf); struct skb_shared_info *sinfo = xdp_get_shared_info_from_frame(xdpf);
const struct mtk_soc_data *soc = eth->soc; const struct mtk_soc_data *soc = eth->soc;
struct mtk_tx_ring *ring = &eth->tx_ring; struct mtk_tx_ring *ring = &eth->tx_ring;
@ -251,8 +251,8 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
+ .qid = mac->id, + .qid = mac->id,
}; };
int err, index = 0, n_desc = 1, nr_frags; int err, index = 0, n_desc = 1, nr_frags;
struct mtk_tx_dma *htxd, *txd, *txd_pdma; struct mtk_tx_buf *htx_buf, *tx_buf;
@@ -1594,6 +1671,7 @@ static int mtk_xdp_submit_frame(struct m @@ -1639,6 +1716,7 @@ static int mtk_xdp_submit_frame(struct m
memset(&txd_info, 0, sizeof(struct mtk_tx_dma_desc_info)); memset(&txd_info, 0, sizeof(struct mtk_tx_dma_desc_info));
txd_info.size = skb_frag_size(&sinfo->frags[index]); txd_info.size = skb_frag_size(&sinfo->frags[index]);
txd_info.last = index + 1 == nr_frags; txd_info.last = index + 1 == nr_frags;
@ -260,7 +260,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
data = skb_frag_address(&sinfo->frags[index]); data = skb_frag_address(&sinfo->frags[index]);
index++; index++;
@@ -1945,8 +2023,46 @@ rx_done: @@ -1993,8 +2071,46 @@ rx_done:
return done; return done;
} }
@ -308,7 +308,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
{ {
const struct mtk_reg_map *reg_map = eth->soc->reg_map; const struct mtk_reg_map *reg_map = eth->soc->reg_map;
struct mtk_tx_ring *ring = &eth->tx_ring; struct mtk_tx_ring *ring = &eth->tx_ring;
@@ -1976,12 +2092,9 @@ static int mtk_poll_tx_qdma(struct mtk_e @@ -2026,12 +2142,9 @@ static int mtk_poll_tx_qdma(struct mtk_e
break; break;
if (tx_buf->data != (void *)MTK_DMA_DUMMY_DESC) { if (tx_buf->data != (void *)MTK_DMA_DUMMY_DESC) {
@ -322,8 +322,8 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
- } - }
budget--; budget--;
} }
mtk_tx_unmap(eth, tx_buf, true); mtk_tx_unmap(eth, tx_buf, &bq, true);
@@ -1999,7 +2112,7 @@ static int mtk_poll_tx_qdma(struct mtk_e @@ -2050,7 +2163,7 @@ static int mtk_poll_tx_qdma(struct mtk_e
} }
static int mtk_poll_tx_pdma(struct mtk_eth *eth, int budget, static int mtk_poll_tx_pdma(struct mtk_eth *eth, int budget,
@ -332,7 +332,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
{ {
struct mtk_tx_ring *ring = &eth->tx_ring; struct mtk_tx_ring *ring = &eth->tx_ring;
struct mtk_tx_buf *tx_buf; struct mtk_tx_buf *tx_buf;
@@ -2015,12 +2128,8 @@ static int mtk_poll_tx_pdma(struct mtk_e @@ -2068,12 +2181,8 @@ static int mtk_poll_tx_pdma(struct mtk_e
break; break;
if (tx_buf->data != (void *)MTK_DMA_DUMMY_DESC) { if (tx_buf->data != (void *)MTK_DMA_DUMMY_DESC) {
@ -346,8 +346,8 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
+ mtk_poll_tx_done(eth, state, 0, tx_buf->data); + mtk_poll_tx_done(eth, state, 0, tx_buf->data);
budget--; budget--;
} }
mtk_tx_unmap(eth, tx_buf, true); mtk_tx_unmap(eth, tx_buf, &bq, true);
@@ -2041,26 +2150,15 @@ static int mtk_poll_tx(struct mtk_eth *e @@ -2095,26 +2204,15 @@ static int mtk_poll_tx(struct mtk_eth *e
{ {
struct mtk_tx_ring *ring = &eth->tx_ring; struct mtk_tx_ring *ring = &eth->tx_ring;
struct dim_sample dim_sample = {}; struct dim_sample dim_sample = {};
@ -379,7 +379,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
dim_update_sample(eth->tx_events, eth->tx_packets, eth->tx_bytes, dim_update_sample(eth->tx_events, eth->tx_packets, eth->tx_bytes,
&dim_sample); &dim_sample);
@@ -2070,7 +2168,7 @@ static int mtk_poll_tx(struct mtk_eth *e @@ -2124,7 +2222,7 @@ static int mtk_poll_tx(struct mtk_eth *e
(atomic_read(&ring->free_count) > ring->thresh)) (atomic_read(&ring->free_count) > ring->thresh))
mtk_wake_queue(eth); mtk_wake_queue(eth);
@ -388,7 +388,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
} }
static void mtk_handle_status_irq(struct mtk_eth *eth) static void mtk_handle_status_irq(struct mtk_eth *eth)
@@ -2156,6 +2254,7 @@ static int mtk_tx_alloc(struct mtk_eth * @@ -2210,6 +2308,7 @@ static int mtk_tx_alloc(struct mtk_eth *
int i, sz = soc->txrx.txd_size; int i, sz = soc->txrx.txd_size;
struct mtk_tx_dma_v2 *txd; struct mtk_tx_dma_v2 *txd;
int ring_size; int ring_size;
@ -396,7 +396,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
if (MTK_HAS_CAPS(soc->caps, MTK_QDMA)) if (MTK_HAS_CAPS(soc->caps, MTK_QDMA))
ring_size = MTK_QDMA_RING_SIZE; ring_size = MTK_QDMA_RING_SIZE;
@@ -2223,8 +2322,25 @@ static int mtk_tx_alloc(struct mtk_eth * @@ -2277,8 +2376,25 @@ static int mtk_tx_alloc(struct mtk_eth *
ring->phys + ((ring_size - 1) * sz), ring->phys + ((ring_size - 1) * sz),
soc->reg_map->qdma.crx_ptr); soc->reg_map->qdma.crx_ptr);
mtk_w32(eth, ring->last_free_ptr, soc->reg_map->qdma.drx_ptr); mtk_w32(eth, ring->last_free_ptr, soc->reg_map->qdma.drx_ptr);
@ -424,7 +424,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
} else { } else {
mtk_w32(eth, ring->phys_pdma, MT7628_TX_BASE_PTR0); mtk_w32(eth, ring->phys_pdma, MT7628_TX_BASE_PTR0);
mtk_w32(eth, ring_size, MT7628_TX_MAX_CNT0); mtk_w32(eth, ring_size, MT7628_TX_MAX_CNT0);
@@ -2904,7 +3020,7 @@ static int mtk_start_dma(struct mtk_eth @@ -2960,7 +3076,7 @@ static int mtk_start_dma(struct mtk_eth
if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2))
val |= MTK_MUTLI_CNT | MTK_RESV_BUF | val |= MTK_MUTLI_CNT | MTK_RESV_BUF |
MTK_WCOMP_EN | MTK_DMAD_WR_WDONE | MTK_WCOMP_EN | MTK_DMAD_WR_WDONE |
@ -433,7 +433,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
else else
val |= MTK_RX_BT_32DWORDS; val |= MTK_RX_BT_32DWORDS;
mtk_w32(eth, val, reg_map->qdma.glo_cfg); mtk_w32(eth, val, reg_map->qdma.glo_cfg);
@@ -2950,6 +3066,45 @@ static void mtk_gdm_config(struct mtk_et @@ -3006,6 +3122,45 @@ static void mtk_gdm_config(struct mtk_et
mtk_w32(eth, 0, MTK_RST_GL); mtk_w32(eth, 0, MTK_RST_GL);
} }
@ -479,7 +479,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
static int mtk_open(struct net_device *dev) static int mtk_open(struct net_device *dev)
{ {
struct mtk_mac *mac = netdev_priv(dev); struct mtk_mac *mac = netdev_priv(dev);
@@ -2994,7 +3149,8 @@ static int mtk_open(struct net_device *d @@ -3048,7 +3203,8 @@ static int mtk_open(struct net_device *d
refcount_inc(&eth->dma_refcnt); refcount_inc(&eth->dma_refcnt);
phylink_start(mac->phylink); phylink_start(mac->phylink);
@ -489,7 +489,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
return 0; return 0;
} }
@@ -3717,8 +3873,12 @@ static int mtk_unreg_dev(struct mtk_eth @@ -3774,8 +3930,12 @@ static int mtk_unreg_dev(struct mtk_eth
int i; int i;
for (i = 0; i < MTK_MAC_COUNT; i++) { for (i = 0; i < MTK_MAC_COUNT; i++) {
@ -502,7 +502,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
unregister_netdev(eth->netdev[i]); unregister_netdev(eth->netdev[i]);
} }
@@ -3935,6 +4095,23 @@ static int mtk_set_rxnfc(struct net_devi @@ -3992,6 +4152,23 @@ static int mtk_set_rxnfc(struct net_devi
return ret; return ret;
} }
@ -526,7 +526,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
static const struct ethtool_ops mtk_ethtool_ops = { static const struct ethtool_ops mtk_ethtool_ops = {
.get_link_ksettings = mtk_get_link_ksettings, .get_link_ksettings = mtk_get_link_ksettings,
.set_link_ksettings = mtk_set_link_ksettings, .set_link_ksettings = mtk_set_link_ksettings,
@@ -3970,6 +4147,7 @@ static const struct net_device_ops mtk_n @@ -4027,6 +4204,7 @@ static const struct net_device_ops mtk_n
.ndo_setup_tc = mtk_eth_setup_tc, .ndo_setup_tc = mtk_eth_setup_tc,
.ndo_bpf = mtk_xdp, .ndo_bpf = mtk_xdp,
.ndo_xdp_xmit = mtk_xdp_xmit, .ndo_xdp_xmit = mtk_xdp_xmit,
@ -534,7 +534,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
}; };
static int mtk_add_mac(struct mtk_eth *eth, struct device_node *np) static int mtk_add_mac(struct mtk_eth *eth, struct device_node *np)
@@ -3979,6 +4157,7 @@ static int mtk_add_mac(struct mtk_eth *e @@ -4036,6 +4214,7 @@ static int mtk_add_mac(struct mtk_eth *e
struct phylink *phylink; struct phylink *phylink;
struct mtk_mac *mac; struct mtk_mac *mac;
int id, err; int id, err;
@ -542,7 +542,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
if (!_id) { if (!_id) {
dev_err(eth->dev, "missing mac id\n"); dev_err(eth->dev, "missing mac id\n");
@@ -3996,7 +4175,10 @@ static int mtk_add_mac(struct mtk_eth *e @@ -4053,7 +4232,10 @@ static int mtk_add_mac(struct mtk_eth *e
return -EINVAL; return -EINVAL;
} }
@ -554,7 +554,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
if (!eth->netdev[id]) { if (!eth->netdev[id]) {
dev_err(eth->dev, "alloc_etherdev failed\n"); dev_err(eth->dev, "alloc_etherdev failed\n");
return -ENOMEM; return -ENOMEM;
@@ -4093,6 +4275,11 @@ static int mtk_add_mac(struct mtk_eth *e @@ -4150,6 +4332,11 @@ static int mtk_add_mac(struct mtk_eth *e
else else
eth->netdev[id]->max_mtu = MTK_MAX_RX_LENGTH_2K - MTK_RX_ETH_HLEN; eth->netdev[id]->max_mtu = MTK_MAX_RX_LENGTH_2K - MTK_RX_ETH_HLEN;
@ -576,7 +576,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
#define MTK_QDMA_PAGE_SIZE 2048 #define MTK_QDMA_PAGE_SIZE 2048
#define MTK_MAX_RX_LENGTH 1536 #define MTK_MAX_RX_LENGTH 1536
#define MTK_MAX_RX_LENGTH_2K 2048 #define MTK_MAX_RX_LENGTH_2K 2048
@@ -215,8 +216,26 @@ @@ -216,8 +217,26 @@
#define MTK_RING_MAX_AGG_CNT_H ((MTK_HW_LRO_MAX_AGG_CNT >> 6) & 0x3) #define MTK_RING_MAX_AGG_CNT_H ((MTK_HW_LRO_MAX_AGG_CNT >> 6) & 0x3)
/* QDMA TX Queue Configuration Registers */ /* QDMA TX Queue Configuration Registers */
@ -603,7 +603,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
/* QDMA Global Configuration Register */ /* QDMA Global Configuration Register */
#define MTK_RX_2B_OFFSET BIT(31) #define MTK_RX_2B_OFFSET BIT(31)
#define MTK_RX_BT_32DWORDS (3 << 11) #define MTK_RX_BT_32DWORDS (3 << 11)
@@ -235,6 +254,7 @@ @@ -236,6 +255,7 @@
#define MTK_WCOMP_EN BIT(24) #define MTK_WCOMP_EN BIT(24)
#define MTK_RESV_BUF (0x40 << 16) #define MTK_RESV_BUF (0x40 << 16)
#define MTK_MUTLI_CNT (0x4 << 12) #define MTK_MUTLI_CNT (0x4 << 12)
@ -611,7 +611,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
/* QDMA Flow Control Register */ /* QDMA Flow Control Register */
#define FC_THRES_DROP_MODE BIT(20) #define FC_THRES_DROP_MODE BIT(20)
@@ -265,8 +285,6 @@ @@ -266,8 +286,6 @@
#define MTK_STAT_OFFSET 0x40 #define MTK_STAT_OFFSET 0x40
/* QDMA TX NUM */ /* QDMA TX NUM */
@ -620,7 +620,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
#define QID_BITS_V2(x) (((x) & 0x3f) << 16) #define QID_BITS_V2(x) (((x) & 0x3f) << 16)
#define MTK_QDMA_GMAC2_QID 8 #define MTK_QDMA_GMAC2_QID 8
@@ -296,6 +314,7 @@ @@ -297,6 +315,7 @@
#define TX_DMA_PLEN0(x) (((x) & eth->soc->txrx.dma_max_len) << eth->soc->txrx.dma_len_offset) #define TX_DMA_PLEN0(x) (((x) & eth->soc->txrx.dma_max_len) << eth->soc->txrx.dma_len_offset)
#define TX_DMA_PLEN1(x) ((x) & eth->soc->txrx.dma_max_len) #define TX_DMA_PLEN1(x) ((x) & eth->soc->txrx.dma_max_len)
#define TX_DMA_SWC BIT(14) #define TX_DMA_SWC BIT(14)
@ -628,7 +628,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
/* PDMA on MT7628 */ /* PDMA on MT7628 */
#define TX_DMA_DONE BIT(31) #define TX_DMA_DONE BIT(31)
@@ -953,6 +972,7 @@ struct mtk_reg_map { @@ -957,6 +976,7 @@ struct mtk_reg_map {
} pdma; } pdma;
struct { struct {
u32 qtx_cfg; /* tx queue configuration */ u32 qtx_cfg; /* tx queue configuration */
@ -636,15 +636,15 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
u32 rx_ptr; /* rx base pointer */ u32 rx_ptr; /* rx base pointer */
u32 rx_cnt_cfg; /* rx max count configuration */ u32 rx_cnt_cfg; /* rx max count configuration */
u32 qcrx_ptr; /* rx cpu pointer */ u32 qcrx_ptr; /* rx cpu pointer */
@@ -970,6 +990,7 @@ struct mtk_reg_map { @@ -974,6 +994,7 @@ struct mtk_reg_map {
u32 fq_tail; /* fq tail pointer */ u32 fq_tail; /* fq tail pointer */
u32 fq_count; /* fq free page count */ u32 fq_count; /* fq free page count */
u32 fq_blen; /* fq free page buffer length */ u32 fq_blen; /* fq free page buffer length */
+ u32 tx_sch_rate; /* tx scheduler rate control registers */ + u32 tx_sch_rate; /* tx scheduler rate control registers */
} qdma; } qdma;
u32 gdm1_cnt; u32 gdm1_cnt;
u32 gdma_to_ppe0; u32 gdma_to_ppe;
@@ -1173,6 +1194,7 @@ struct mtk_mac { @@ -1177,6 +1198,7 @@ struct mtk_mac {
__be32 hwlro_ip[MTK_MAX_LRO_IP_CNT]; __be32 hwlro_ip[MTK_MAX_LRO_IP_CNT];
int hwlro_ip_cnt; int hwlro_ip_cnt;
unsigned int syscfg0; unsigned int syscfg0;

View file

@ -10,8 +10,8 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
--- a/drivers/net/ethernet/mediatek/mtk_ppe.c --- a/drivers/net/ethernet/mediatek/mtk_ppe.c
+++ b/drivers/net/ethernet/mediatek/mtk_ppe.c +++ b/drivers/net/ethernet/mediatek/mtk_ppe.c
@@ -405,6 +405,24 @@ static inline bool mtk_foe_entry_usable( @@ -399,6 +399,24 @@ int mtk_foe_entry_set_wdma(struct mtk_et
FIELD_GET(MTK_FOE_IB1_STATE, entry->ib1) != MTK_FOE_STATE_BIND; return 0;
} }
+int mtk_foe_entry_set_queue(struct mtk_eth *eth, struct mtk_foe_entry *entry, +int mtk_foe_entry_set_queue(struct mtk_eth *eth, struct mtk_foe_entry *entry,

View file

@ -11,7 +11,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
@@ -917,7 +917,13 @@ enum mkt_eth_capabilities { @@ -921,7 +921,13 @@ enum mkt_eth_capabilities {
#define MTK_MUX_GMAC12_TO_GEPHY_SGMII \ #define MTK_MUX_GMAC12_TO_GEPHY_SGMII \
(MTK_ETH_MUX_GMAC12_TO_GEPHY_SGMII | MTK_MUX) (MTK_ETH_MUX_GMAC12_TO_GEPHY_SGMII | MTK_MUX)

View file

@ -12,7 +12,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
--- a/net/core/flow_dissector.c --- a/net/core/flow_dissector.c
+++ b/net/core/flow_dissector.c +++ b/net/core/flow_dissector.c
@@ -940,12 +940,14 @@ bool __skb_flow_dissect(const struct net @@ -971,12 +971,14 @@ bool __skb_flow_dissect(const struct net
#if IS_ENABLED(CONFIG_NET_DSA) #if IS_ENABLED(CONFIG_NET_DSA)
if (unlikely(skb->dev && netdev_uses_dsa(skb->dev) && if (unlikely(skb->dev && netdev_uses_dsa(skb->dev) &&
proto == htons(ETH_P_XDSA))) { proto == htons(ETH_P_XDSA))) {
@ -30,7 +30,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
else else
--- a/net/dsa/dsa.c --- a/net/dsa/dsa.c
+++ b/net/dsa/dsa.c +++ b/net/dsa/dsa.c
@@ -20,6 +20,7 @@ @@ -11,6 +11,7 @@
#include <linux/netdevice.h> #include <linux/netdevice.h>
#include <linux/sysfs.h> #include <linux/sysfs.h>
#include <linux/ptp_classify.h> #include <linux/ptp_classify.h>
@ -38,7 +38,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
#include "dsa_priv.h" #include "dsa_priv.h"
@@ -225,6 +226,7 @@ static bool dsa_skb_defer_rx_timestamp(s @@ -216,6 +217,7 @@ static bool dsa_skb_defer_rx_timestamp(s
static int dsa_switch_rcv(struct sk_buff *skb, struct net_device *dev, static int dsa_switch_rcv(struct sk_buff *skb, struct net_device *dev,
struct packet_type *pt, struct net_device *unused) struct packet_type *pt, struct net_device *unused)
{ {
@ -46,7 +46,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
struct dsa_port *cpu_dp = dev->dsa_ptr; struct dsa_port *cpu_dp = dev->dsa_ptr;
struct sk_buff *nskb = NULL; struct sk_buff *nskb = NULL;
struct dsa_slave_priv *p; struct dsa_slave_priv *p;
@@ -238,7 +240,22 @@ static int dsa_switch_rcv(struct sk_buff @@ -229,7 +231,22 @@ static int dsa_switch_rcv(struct sk_buff
if (!skb) if (!skb)
return 0; return 0;

View file

@ -22,7 +22,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
#include "mtk_eth_soc.h" #include "mtk_eth_soc.h"
#include "mtk_wed.h" #include "mtk_wed.h"
@@ -1974,16 +1975,22 @@ static int mtk_poll_rx(struct napi_struc @@ -2022,16 +2023,22 @@ static int mtk_poll_rx(struct napi_struc
htons(RX_DMA_VPID(trxd.rxd4)), htons(RX_DMA_VPID(trxd.rxd4)),
RX_DMA_VID(trxd.rxd4)); RX_DMA_VID(trxd.rxd4));
} else if (trxd.rxd2 & RX_DMA_VTAG) { } else if (trxd.rxd2 & RX_DMA_VTAG) {
@ -52,7 +52,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
} }
skb_record_rx_queue(skb, 0); skb_record_rx_queue(skb, 0);
@@ -2800,15 +2807,30 @@ static netdev_features_t mtk_fix_feature @@ -2856,15 +2863,30 @@ static netdev_features_t mtk_fix_feature
static int mtk_set_features(struct net_device *dev, netdev_features_t features) static int mtk_set_features(struct net_device *dev, netdev_features_t features)
{ {
@ -88,7 +88,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
} }
/* wait for DMA to finish whatever it is doing before we start using it again */ /* wait for DMA to finish whatever it is doing before we start using it again */
@@ -3105,11 +3127,45 @@ found: @@ -3161,11 +3183,45 @@ found:
return NOTIFY_DONE; return NOTIFY_DONE;
} }
@ -135,7 +135,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
err = phylink_of_phy_connect(mac->phylink, mac->of_node, 0); err = phylink_of_phy_connect(mac->phylink, mac->of_node, 0);
if (err) { if (err) {
@@ -3632,6 +3688,10 @@ static int mtk_hw_init(struct mtk_eth *e @@ -3686,6 +3742,10 @@ static int mtk_hw_init(struct mtk_eth *e
*/ */
val = mtk_r32(eth, MTK_CDMQ_IG_CTRL); val = mtk_r32(eth, MTK_CDMQ_IG_CTRL);
mtk_w32(eth, val | MTK_CDMQ_STAG_EN, MTK_CDMQ_IG_CTRL); mtk_w32(eth, val | MTK_CDMQ_STAG_EN, MTK_CDMQ_IG_CTRL);
@ -146,7 +146,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
/* Enable RX VLan Offloading */ /* Enable RX VLan Offloading */
mtk_w32(eth, 1, MTK_CDMP_EG_CTRL); mtk_w32(eth, 1, MTK_CDMP_EG_CTRL);
@@ -3865,6 +3925,12 @@ static int mtk_free_dev(struct mtk_eth * @@ -3922,6 +3982,12 @@ static int mtk_free_dev(struct mtk_eth *
free_netdev(eth->netdev[i]); free_netdev(eth->netdev[i]);
} }
@ -181,7 +181,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
/* CDMP Ingress Control Register */ /* CDMP Ingress Control Register */
#define MTK_CDMP_IG_CTRL 0x400 #define MTK_CDMP_IG_CTRL 0x400
#define MTK_CDMP_STAG_EN BIT(0) #define MTK_CDMP_STAG_EN BIT(0)
@@ -1166,6 +1172,8 @@ struct mtk_eth { @@ -1170,6 +1176,8 @@ struct mtk_eth {
int ip_align; int ip_align;

View file

@ -20,7 +20,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -3143,7 +3143,8 @@ static int mtk_open(struct net_device *d @@ -3199,7 +3199,8 @@ static int mtk_open(struct net_device *d
struct mtk_eth *eth = mac->hw; struct mtk_eth *eth = mac->hw;
int i, err; int i, err;
@ -30,7 +30,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
for (i = 0; i < ARRAY_SIZE(eth->dsa_meta); i++) { for (i = 0; i < ARRAY_SIZE(eth->dsa_meta); i++) {
struct metadata_dst *md_dst = eth->dsa_meta[i]; struct metadata_dst *md_dst = eth->dsa_meta[i];
@@ -3160,7 +3161,8 @@ static int mtk_open(struct net_device *d @@ -3216,7 +3217,8 @@ static int mtk_open(struct net_device *d
} }
} else { } else {
/* Hardware special tag parsing needs to be disabled if at least /* Hardware special tag parsing needs to be disabled if at least

View file

@ -23,7 +23,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -3078,7 +3078,7 @@ static void mtk_gdm_config(struct mtk_et @@ -3134,7 +3134,7 @@ static void mtk_gdm_config(struct mtk_et
val |= config; val |= config;
@ -32,7 +32,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
val |= MTK_GDMA_SPECIAL_TAG; val |= MTK_GDMA_SPECIAL_TAG;
mtk_w32(eth, val, MTK_GDMA_FWD_CFG(i)); mtk_w32(eth, val, MTK_GDMA_FWD_CFG(i));
@@ -3143,8 +3143,7 @@ static int mtk_open(struct net_device *d @@ -3199,8 +3199,7 @@ static int mtk_open(struct net_device *d
struct mtk_eth *eth = mac->hw; struct mtk_eth *eth = mac->hw;
int i, err; int i, err;
@ -42,7 +42,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
for (i = 0; i < ARRAY_SIZE(eth->dsa_meta); i++) { for (i = 0; i < ARRAY_SIZE(eth->dsa_meta); i++) {
struct metadata_dst *md_dst = eth->dsa_meta[i]; struct metadata_dst *md_dst = eth->dsa_meta[i];
@@ -3161,8 +3160,7 @@ static int mtk_open(struct net_device *d @@ -3217,8 +3216,7 @@ static int mtk_open(struct net_device *d
} }
} else { } else {
/* Hardware special tag parsing needs to be disabled if at least /* Hardware special tag parsing needs to be disabled if at least

View file

@ -77,7 +77,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -1830,7 +1830,9 @@ static int mtk_poll_rx(struct napi_struc @@ -1878,7 +1878,9 @@ static int mtk_poll_rx(struct napi_struc
while (done < budget) { while (done < budget) {
unsigned int pktlen, *rxdcsum; unsigned int pktlen, *rxdcsum;
@ -87,7 +87,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
dma_addr_t dma_addr; dma_addr_t dma_addr;
u32 hash, reason; u32 hash, reason;
int mac = 0; int mac = 0;
@@ -1970,27 +1972,29 @@ static int mtk_poll_rx(struct napi_struc @@ -2018,27 +2020,29 @@ static int mtk_poll_rx(struct napi_struc
if (netdev->features & NETIF_F_HW_VLAN_CTAG_RX) { if (netdev->features & NETIF_F_HW_VLAN_CTAG_RX) {
if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) { if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) {

View file

@ -16,7 +16,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
--- a/drivers/net/ethernet/mediatek/mtk_wed.c --- a/drivers/net/ethernet/mediatek/mtk_wed.c
+++ b/drivers/net/ethernet/mediatek/mtk_wed.c +++ b/drivers/net/ethernet/mediatek/mtk_wed.c
@@ -786,7 +786,6 @@ mtk_wed_rro_ring_alloc(struct mtk_wed_de @@ -779,7 +779,6 @@ mtk_wed_rro_ring_alloc(struct mtk_wed_de
ring->desc_size = sizeof(*ring->desc); ring->desc_size = sizeof(*ring->desc);
ring->size = size; ring->size = size;

View file

@ -43,7 +43,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
mutex_unlock(&hw_lock); mutex_unlock(&hw_lock);
} }
@@ -1545,8 +1550,10 @@ mtk_wed_attach(struct mtk_wed_device *de @@ -1538,8 +1543,10 @@ mtk_wed_attach(struct mtk_wed_device *de
ret = mtk_wed_wo_init(hw); ret = mtk_wed_wo_init(hw);
} }
out: out:

View file

@ -20,7 +20,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -676,8 +676,6 @@ static void mtk_mac_link_up(struct phyli @@ -719,8 +719,6 @@ static void mtk_mac_link_up(struct phyli
break; break;
} }

View file

@ -20,7 +20,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
@@ -501,8 +501,10 @@ @@ -504,8 +504,10 @@
#define ETHSYS_DMA_AG_MAP_PPE BIT(2) #define ETHSYS_DMA_AG_MAP_PPE BIT(2)
/* SGMII subsystem config registers */ /* SGMII subsystem config registers */
@ -32,7 +32,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
#define SGMII_AN_RESTART BIT(9) #define SGMII_AN_RESTART BIT(9)
#define SGMII_ISOLATE BIT(10) #define SGMII_ISOLATE BIT(10)
#define SGMII_AN_ENABLE BIT(12) #define SGMII_AN_ENABLE BIT(12)
@@ -512,13 +514,18 @@ @@ -515,13 +517,18 @@
#define SGMII_PCS_FAULT BIT(23) #define SGMII_PCS_FAULT BIT(23)
#define SGMII_AN_EXPANSION_CLR BIT(30) #define SGMII_AN_EXPANSION_CLR BIT(30)

View file

@ -34,7 +34,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
@@ -1070,11 +1070,13 @@ struct mtk_soc_data { @@ -1073,11 +1073,13 @@ struct mtk_soc_data {
* @regmap: The register map pointing at the range used to setup * @regmap: The register map pointing at the range used to setup
* SGMII modes * SGMII modes
* @ana_rgc3: The offset refers to register ANA_RGC3 related to regmap * @ana_rgc3: The offset refers to register ANA_RGC3 related to regmap

View file

@ -24,7 +24,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
@@ -531,7 +531,7 @@ @@ -534,7 +534,7 @@
#define SGMII_SPEED_10 FIELD_PREP(SGMII_SPEED_MASK, 0) #define SGMII_SPEED_10 FIELD_PREP(SGMII_SPEED_MASK, 0)
#define SGMII_SPEED_100 FIELD_PREP(SGMII_SPEED_MASK, 1) #define SGMII_SPEED_100 FIELD_PREP(SGMII_SPEED_MASK, 1)
#define SGMII_SPEED_1000 FIELD_PREP(SGMII_SPEED_MASK, 2) #define SGMII_SPEED_1000 FIELD_PREP(SGMII_SPEED_MASK, 2)

View file

@ -22,7 +22,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
@@ -539,6 +539,10 @@ @@ -542,6 +542,10 @@
#define SGMII_SEND_AN_ERROR_EN BIT(11) #define SGMII_SEND_AN_ERROR_EN BIT(11)
#define SGMII_IF_MODE_MASK GENMASK(5, 1) #define SGMII_IF_MODE_MASK GENMASK(5, 1)

View file

@ -51,7 +51,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
mtk_eth_path_name(path), __func__, updated); mtk_eth_path_name(path), __func__, updated);
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -4755,6 +4755,26 @@ static const struct mtk_soc_data mt7629_ @@ -4808,6 +4808,26 @@ static const struct mtk_soc_data mt7629_
}, },
}; };
@ -78,7 +78,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
static const struct mtk_soc_data mt7986_data = { static const struct mtk_soc_data mt7986_data = {
.reg_map = &mt7986_reg_map, .reg_map = &mt7986_reg_map,
.ana_rgc3 = 0x128, .ana_rgc3 = 0x128,
@@ -4797,6 +4817,7 @@ const struct of_device_id of_mtk_match[] @@ -4849,6 +4869,7 @@ const struct of_device_id of_mtk_match[]
{ .compatible = "mediatek,mt7622-eth", .data = &mt7622_data}, { .compatible = "mediatek,mt7622-eth", .data = &mt7622_data},
{ .compatible = "mediatek,mt7623-eth", .data = &mt7623_data}, { .compatible = "mediatek,mt7623-eth", .data = &mt7623_data},
{ .compatible = "mediatek,mt7629-eth", .data = &mt7629_data}, { .compatible = "mediatek,mt7629-eth", .data = &mt7629_data},
@ -88,7 +88,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
{}, {},
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
@@ -553,11 +553,22 @@ @@ -556,11 +556,22 @@
#define SGMSYS_QPHY_PWR_STATE_CTRL 0xe8 #define SGMSYS_QPHY_PWR_STATE_CTRL 0xe8
#define SGMII_PHYA_PWD BIT(4) #define SGMII_PHYA_PWD BIT(4)
@ -111,7 +111,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
/* MT7628/88 specific stuff */ /* MT7628/88 specific stuff */
#define MT7628_PDMA_OFFSET 0x0800 #define MT7628_PDMA_OFFSET 0x0800
#define MT7628_SDM_OFFSET 0x0c00 #define MT7628_SDM_OFFSET 0x0c00
@@ -738,6 +749,17 @@ enum mtk_clks_map { @@ -741,6 +752,17 @@ enum mtk_clks_map {
BIT(MTK_CLK_SGMII2_CDR_FB) | \ BIT(MTK_CLK_SGMII2_CDR_FB) | \
BIT(MTK_CLK_SGMII_CK) | \ BIT(MTK_CLK_SGMII_CK) | \
BIT(MTK_CLK_ETH2PLL) | BIT(MTK_CLK_SGMIITOP)) BIT(MTK_CLK_ETH2PLL) | BIT(MTK_CLK_SGMIITOP))
@ -129,7 +129,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
#define MT7986_CLKS_BITMAP (BIT(MTK_CLK_FE) | BIT(MTK_CLK_GP2) | BIT(MTK_CLK_GP1) | \ #define MT7986_CLKS_BITMAP (BIT(MTK_CLK_FE) | BIT(MTK_CLK_GP2) | BIT(MTK_CLK_GP1) | \
BIT(MTK_CLK_WOCPU1) | BIT(MTK_CLK_WOCPU0) | \ BIT(MTK_CLK_WOCPU1) | BIT(MTK_CLK_WOCPU0) | \
BIT(MTK_CLK_SGMII_TX_250M) | \ BIT(MTK_CLK_SGMII_TX_250M) | \
@@ -851,6 +873,7 @@ enum mkt_eth_capabilities { @@ -854,6 +876,7 @@ enum mkt_eth_capabilities {
MTK_NETSYS_V2_BIT, MTK_NETSYS_V2_BIT,
MTK_SOC_MT7628_BIT, MTK_SOC_MT7628_BIT,
MTK_RSTCTRL_PPE1_BIT, MTK_RSTCTRL_PPE1_BIT,
@ -137,7 +137,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
/* MUX BITS*/ /* MUX BITS*/
MTK_ETH_MUX_GDM1_TO_GMAC1_ESW_BIT, MTK_ETH_MUX_GDM1_TO_GMAC1_ESW_BIT,
@@ -885,6 +908,7 @@ enum mkt_eth_capabilities { @@ -888,6 +911,7 @@ enum mkt_eth_capabilities {
#define MTK_NETSYS_V2 BIT(MTK_NETSYS_V2_BIT) #define MTK_NETSYS_V2 BIT(MTK_NETSYS_V2_BIT)
#define MTK_SOC_MT7628 BIT(MTK_SOC_MT7628_BIT) #define MTK_SOC_MT7628 BIT(MTK_SOC_MT7628_BIT)
#define MTK_RSTCTRL_PPE1 BIT(MTK_RSTCTRL_PPE1_BIT) #define MTK_RSTCTRL_PPE1 BIT(MTK_RSTCTRL_PPE1_BIT)
@ -145,7 +145,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
#define MTK_ETH_MUX_GDM1_TO_GMAC1_ESW \ #define MTK_ETH_MUX_GDM1_TO_GMAC1_ESW \
BIT(MTK_ETH_MUX_GDM1_TO_GMAC1_ESW_BIT) BIT(MTK_ETH_MUX_GDM1_TO_GMAC1_ESW_BIT)
@@ -963,6 +987,11 @@ enum mkt_eth_capabilities { @@ -966,6 +990,11 @@ enum mkt_eth_capabilities {
MTK_MUX_U3_GMAC2_TO_QPHY | \ MTK_MUX_U3_GMAC2_TO_QPHY | \
MTK_MUX_GMAC12_TO_GEPHY_SGMII | MTK_QDMA) MTK_MUX_GMAC12_TO_GEPHY_SGMII | MTK_QDMA)
@ -157,7 +157,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
#define MT7986_CAPS (MTK_GMAC1_SGMII | MTK_GMAC2_SGMII | \ #define MT7986_CAPS (MTK_GMAC1_SGMII | MTK_GMAC2_SGMII | \
MTK_MUX_GMAC12_TO_GEPHY_SGMII | MTK_QDMA | \ MTK_MUX_GMAC12_TO_GEPHY_SGMII | MTK_QDMA | \
MTK_NETSYS_V2 | MTK_RSTCTRL_PPE1) MTK_NETSYS_V2 | MTK_RSTCTRL_PPE1)
@@ -1076,12 +1105,14 @@ struct mtk_soc_data { @@ -1079,12 +1108,14 @@ struct mtk_soc_data {
* @ana_rgc3: The offset refers to register ANA_RGC3 related to regmap * @ana_rgc3: The offset refers to register ANA_RGC3 related to regmap
* @interface: Currently configured interface mode * @interface: Currently configured interface mode
* @pcs: Phylink PCS structure * @pcs: Phylink PCS structure

View file

@ -21,7 +21,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -702,8 +702,10 @@ static const struct phylink_mac_ops mtk_ @@ -745,8 +745,10 @@ static const struct phylink_mac_ops mtk_
static int mtk_mdio_init(struct mtk_eth *eth) static int mtk_mdio_init(struct mtk_eth *eth)
{ {
@ -32,7 +32,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
mii_np = of_get_child_by_name(eth->dev->of_node, "mdio-bus"); mii_np = of_get_child_by_name(eth->dev->of_node, "mdio-bus");
if (!mii_np) { if (!mii_np) {
@@ -729,6 +731,25 @@ static int mtk_mdio_init(struct mtk_eth @@ -773,6 +775,25 @@ static int mtk_mdio_init(struct mtk_eth
eth->mii_bus->parent = eth->dev; eth->mii_bus->parent = eth->dev;
snprintf(eth->mii_bus->id, MII_BUS_ID_SIZE, "%pOFn", mii_np); snprintf(eth->mii_bus->id, MII_BUS_ID_SIZE, "%pOFn", mii_np);

View file

@ -21,7 +21,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
--- a/drivers/net/ethernet/mediatek/Kconfig --- a/drivers/net/ethernet/mediatek/Kconfig
+++ b/drivers/net/ethernet/mediatek/Kconfig +++ b/drivers/net/ethernet/mediatek/Kconfig
@@ -18,6 +18,8 @@ config NET_MEDIATEK_SOC @@ -19,6 +19,8 @@ config NET_MEDIATEK_SOC
select DIMLIB select DIMLIB
select PAGE_POOL select PAGE_POOL
select PAGE_POOL_STATS select PAGE_POOL_STATS
@ -51,7 +51,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
#include <linux/jhash.h> #include <linux/jhash.h>
#include <linux/bitfield.h> #include <linux/bitfield.h>
#include <net/dsa.h> #include <net/dsa.h>
@@ -357,7 +358,7 @@ static struct phylink_pcs *mtk_mac_selec @@ -400,7 +401,7 @@ static struct phylink_pcs *mtk_mac_selec
sid = (MTK_HAS_CAPS(eth->soc->caps, MTK_SHARED_SGMII)) ? sid = (MTK_HAS_CAPS(eth->soc->caps, MTK_SHARED_SGMII)) ?
0 : mac->id; 0 : mac->id;
@ -60,7 +60,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
} }
return NULL; return NULL;
@@ -3977,8 +3978,17 @@ static int mtk_unreg_dev(struct mtk_eth @@ -4031,8 +4032,17 @@ static int mtk_unreg_dev(struct mtk_eth
return 0; return 0;
} }
@ -78,7 +78,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
mtk_unreg_dev(eth); mtk_unreg_dev(eth);
mtk_free_dev(eth); mtk_free_dev(eth);
cancel_work_sync(&eth->pending_work); cancel_work_sync(&eth->pending_work);
@@ -4408,6 +4418,36 @@ void mtk_eth_set_dma_device(struct mtk_e @@ -4462,6 +4472,36 @@ void mtk_eth_set_dma_device(struct mtk_e
rtnl_unlock(); rtnl_unlock();
} }
@ -115,7 +115,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
static int mtk_probe(struct platform_device *pdev) static int mtk_probe(struct platform_device *pdev)
{ {
struct resource *res = NULL; struct resource *res = NULL;
@@ -4471,13 +4511,7 @@ static int mtk_probe(struct platform_dev @@ -4525,13 +4565,7 @@ static int mtk_probe(struct platform_dev
} }
if (MTK_HAS_CAPS(eth->soc->caps, MTK_SGMII)) { if (MTK_HAS_CAPS(eth->soc->caps, MTK_SGMII)) {
@ -130,7 +130,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
if (err) if (err)
return err; return err;
@@ -4488,14 +4522,17 @@ static int mtk_probe(struct platform_dev @@ -4542,14 +4576,17 @@ static int mtk_probe(struct platform_dev
"mediatek,pctl"); "mediatek,pctl");
if (IS_ERR(eth->pctl)) { if (IS_ERR(eth->pctl)) {
dev_err(&pdev->dev, "no pctl regmap found\n"); dev_err(&pdev->dev, "no pctl regmap found\n");
@ -151,7 +151,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
} }
if (eth->soc->offload_version) { if (eth->soc->offload_version) {
@@ -4655,6 +4692,8 @@ err_deinit_hw: @@ -4708,6 +4745,8 @@ err_deinit_hw:
mtk_hw_deinit(eth); mtk_hw_deinit(eth);
err_wed_exit: err_wed_exit:
mtk_wed_exit(); mtk_wed_exit();
@ -162,7 +162,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
} }
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
@@ -507,65 +507,6 @@ @@ -510,65 +510,6 @@
#define ETHSYS_DMA_AG_MAP_QDMA BIT(1) #define ETHSYS_DMA_AG_MAP_QDMA BIT(1)
#define ETHSYS_DMA_AG_MAP_PPE BIT(2) #define ETHSYS_DMA_AG_MAP_PPE BIT(2)
@ -228,7 +228,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
/* Infrasys subsystem config registers */ /* Infrasys subsystem config registers */
#define INFRA_MISC2 0x70c #define INFRA_MISC2 0x70c
#define CO_QPHY_SEL BIT(0) #define CO_QPHY_SEL BIT(0)
@@ -1105,31 +1046,6 @@ struct mtk_soc_data { @@ -1108,31 +1049,6 @@ struct mtk_soc_data {
/* currently no SoC has more than 2 macs */ /* currently no SoC has more than 2 macs */
#define MTK_MAX_DEVS 2 #define MTK_MAX_DEVS 2
@ -260,7 +260,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
/* struct mtk_eth - This is the main datasructure for holding the state /* struct mtk_eth - This is the main datasructure for holding the state
* of the driver * of the driver
* @dev: The device pointer * @dev: The device pointer
@@ -1149,6 +1065,7 @@ struct mtk_sgmii { @@ -1152,6 +1068,7 @@ struct mtk_sgmii {
* MII modes * MII modes
* @infra: The register map pointing at the range used to setup * @infra: The register map pointing at the range used to setup
* SGMII and GePHY path * SGMII and GePHY path
@ -268,7 +268,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
* @pctl: The register map pointing at the range used to setup * @pctl: The register map pointing at the range used to setup
* GMAC port drive/slew values * GMAC port drive/slew values
* @dma_refcnt: track how many netdevs are using the DMA engine * @dma_refcnt: track how many netdevs are using the DMA engine
@@ -1189,8 +1106,8 @@ struct mtk_eth { @@ -1192,8 +1109,8 @@ struct mtk_eth {
u32 msg_enable; u32 msg_enable;
unsigned long sysclk; unsigned long sysclk;
struct regmap *ethsys; struct regmap *ethsys;
@ -279,7 +279,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
struct regmap *pctl; struct regmap *pctl;
bool hwlro; bool hwlro;
refcount_t dma_refcnt; refcount_t dma_refcnt;
@@ -1352,10 +1269,6 @@ void mtk_stats_update_mac(struct mtk_mac @@ -1355,10 +1272,6 @@ void mtk_stats_update_mac(struct mtk_mac
void mtk_w32(struct mtk_eth *eth, u32 val, unsigned reg); void mtk_w32(struct mtk_eth *eth, u32 val, unsigned reg);
u32 mtk_r32(struct mtk_eth *eth, unsigned reg); u32 mtk_r32(struct mtk_eth *eth, unsigned reg);

View file

@ -81,7 +81,7 @@ Tested-by: Frank Wunderlich <frank-w@public-files.de>
#include <linux/phylink.h> #include <linux/phylink.h>
#include <linux/regmap.h> #include <linux/regmap.h>
#include <linux/regulator/consumer.h> #include <linux/regulator/consumer.h>
@@ -2573,128 +2574,11 @@ static int mt7531_rgmii_setup(struct mt7 @@ -2597,128 +2598,11 @@ static int mt7531_rgmii_setup(struct mt7
return 0; return 0;
} }
@ -210,7 +210,7 @@ Tested-by: Frank Wunderlich <frank-w@public-files.de>
static int static int
mt7531_mac_config(struct dsa_switch *ds, int port, unsigned int mode, mt7531_mac_config(struct dsa_switch *ds, int port, unsigned int mode,
phy_interface_t interface) phy_interface_t interface)
@@ -2717,11 +2601,11 @@ mt7531_mac_config(struct dsa_switch *ds, @@ -2741,11 +2625,11 @@ mt7531_mac_config(struct dsa_switch *ds,
phydev = dp->slave->phydev; phydev = dp->slave->phydev;
return mt7531_rgmii_setup(priv, port, interface, phydev); return mt7531_rgmii_setup(priv, port, interface, phydev);
case PHY_INTERFACE_MODE_SGMII: case PHY_INTERFACE_MODE_SGMII:
@ -224,7 +224,7 @@ Tested-by: Frank Wunderlich <frank-w@public-files.de>
default: default:
return -EINVAL; return -EINVAL;
} }
@@ -2746,11 +2630,11 @@ mt753x_phylink_mac_select_pcs(struct dsa @@ -2770,11 +2654,11 @@ mt753x_phylink_mac_select_pcs(struct dsa
switch (interface) { switch (interface) {
case PHY_INTERFACE_MODE_TRGMII: case PHY_INTERFACE_MODE_TRGMII:
@ -238,7 +238,7 @@ Tested-by: Frank Wunderlich <frank-w@public-files.de>
default: default:
return NULL; return NULL;
} }
@@ -2991,86 +2875,6 @@ static void mt7530_pcs_get_state(struct @@ -3015,86 +2899,6 @@ static void mt7530_pcs_get_state(struct
state->pause |= MLO_PAUSE_TX; state->pause |= MLO_PAUSE_TX;
} }
@ -325,7 +325,7 @@ Tested-by: Frank Wunderlich <frank-w@public-files.de>
static int mt753x_pcs_config(struct phylink_pcs *pcs, unsigned int mode, static int mt753x_pcs_config(struct phylink_pcs *pcs, unsigned int mode,
phy_interface_t interface, phy_interface_t interface,
const unsigned long *advertising, const unsigned long *advertising,
@@ -3090,18 +2894,57 @@ static const struct phylink_pcs_ops mt75 @@ -3114,18 +2918,57 @@ static const struct phylink_pcs_ops mt75
.pcs_an_restart = mt7530_pcs_an_restart, .pcs_an_restart = mt7530_pcs_an_restart,
}; };
@ -389,7 +389,7 @@ Tested-by: Frank Wunderlich <frank-w@public-files.de>
int i, ret; int i, ret;
/* Initialise the PCS devices */ /* Initialise the PCS devices */
@@ -3109,8 +2952,6 @@ mt753x_setup(struct dsa_switch *ds) @@ -3133,8 +2976,6 @@ mt753x_setup(struct dsa_switch *ds)
priv->pcs[i].pcs.ops = priv->info->pcs_ops; priv->pcs[i].pcs.ops = priv->info->pcs_ops;
priv->pcs[i].priv = priv; priv->pcs[i].priv = priv;
priv->pcs[i].port = i; priv->pcs[i].port = i;
@ -398,7 +398,7 @@ Tested-by: Frank Wunderlich <frank-w@public-files.de>
} }
ret = priv->info->sw_setup(ds); ret = priv->info->sw_setup(ds);
@@ -3125,6 +2966,16 @@ mt753x_setup(struct dsa_switch *ds) @@ -3149,6 +2990,16 @@ mt753x_setup(struct dsa_switch *ds)
if (ret && priv->irq) if (ret && priv->irq)
mt7530_free_irq_common(priv); mt7530_free_irq_common(priv);
@ -415,7 +415,7 @@ Tested-by: Frank Wunderlich <frank-w@public-files.de>
return ret; return ret;
} }
@@ -3216,7 +3067,7 @@ static const struct mt753x_info mt753x_t @@ -3240,7 +3091,7 @@ static const struct mt753x_info mt753x_t
}, },
[ID_MT7531] = { [ID_MT7531] = {
.id = ID_MT7531, .id = ID_MT7531,
@ -424,7 +424,7 @@ Tested-by: Frank Wunderlich <frank-w@public-files.de>
.sw_setup = mt7531_setup, .sw_setup = mt7531_setup,
.phy_read = mt7531_ind_phy_read, .phy_read = mt7531_ind_phy_read,
.phy_write = mt7531_ind_phy_write, .phy_write = mt7531_ind_phy_write,
@@ -3324,7 +3175,7 @@ static void @@ -3348,7 +3199,7 @@ static void
mt7530_remove(struct mdio_device *mdiodev) mt7530_remove(struct mdio_device *mdiodev)
{ {
struct mt7530_priv *priv = dev_get_drvdata(&mdiodev->dev); struct mt7530_priv *priv = dev_get_drvdata(&mdiodev->dev);
@ -433,7 +433,7 @@ Tested-by: Frank Wunderlich <frank-w@public-files.de>
if (!priv) if (!priv)
return; return;
@@ -3343,6 +3194,10 @@ mt7530_remove(struct mdio_device *mdiode @@ -3367,6 +3218,10 @@ mt7530_remove(struct mdio_device *mdiode
mt7530_free_irq(priv); mt7530_free_irq(priv);
dsa_unregister_switch(priv->ds); dsa_unregister_switch(priv->ds);
@ -442,8 +442,8 @@ Tested-by: Frank Wunderlich <frank-w@public-files.de>
+ mtk_pcs_lynxi_destroy(priv->ports[5 + i].sgmii_pcs); + mtk_pcs_lynxi_destroy(priv->ports[5 + i].sgmii_pcs);
+ +
mutex_destroy(&priv->reg_mutex); mutex_destroy(&priv->reg_mutex);
}
dev_set_drvdata(&mdiodev->dev, NULL);
--- a/drivers/net/dsa/mt7530.h --- a/drivers/net/dsa/mt7530.h
+++ b/drivers/net/dsa/mt7530.h +++ b/drivers/net/dsa/mt7530.h
@@ -364,47 +364,8 @@ enum mt7530_vlan_port_acc_frm { @@ -364,47 +364,8 @@ enum mt7530_vlan_port_acc_frm {

View file

@ -21,7 +21,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
--- a/MAINTAINERS --- a/MAINTAINERS
+++ b/MAINTAINERS +++ b/MAINTAINERS
@@ -12697,6 +12697,7 @@ F: include/uapi/linux/meye.h @@ -13959,6 +13959,7 @@ F: include/uapi/linux/meye.h
MOTORCOMM PHY DRIVER MOTORCOMM PHY DRIVER
M: Peter Geis <pgwipeout@gmail.com> M: Peter Geis <pgwipeout@gmail.com>
@ -31,7 +31,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
F: drivers/net/phy/motorcomm.c F: drivers/net/phy/motorcomm.c
--- a/drivers/net/phy/Kconfig --- a/drivers/net/phy/Kconfig
+++ b/drivers/net/phy/Kconfig +++ b/drivers/net/phy/Kconfig
@@ -245,7 +245,7 @@ config MOTORCOMM_PHY @@ -260,7 +260,7 @@ config MOTORCOMM_PHY
tristate "Motorcomm PHYs" tristate "Motorcomm PHYs"
help help
Enables support for Motorcomm network PHYs. Enables support for Motorcomm network PHYs.

View file

@ -22,7 +22,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
--- a/drivers/net/phy/Kconfig --- a/drivers/net/phy/Kconfig
+++ b/drivers/net/phy/Kconfig +++ b/drivers/net/phy/Kconfig
@@ -245,7 +245,7 @@ config MOTORCOMM_PHY @@ -260,7 +260,7 @@ config MOTORCOMM_PHY
tristate "Motorcomm PHYs" tristate "Motorcomm PHYs"
help help
Enables support for Motorcomm network PHYs. Enables support for Motorcomm network PHYs.

View file

@ -19,7 +19,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
--- a/drivers/net/phy/Kconfig --- a/drivers/net/phy/Kconfig
+++ b/drivers/net/phy/Kconfig +++ b/drivers/net/phy/Kconfig
@@ -245,7 +245,7 @@ config MOTORCOMM_PHY @@ -260,7 +260,7 @@ config MOTORCOMM_PHY
tristate "Motorcomm PHYs" tristate "Motorcomm PHYs"
help help
Enables support for Motorcomm network PHYs. Enables support for Motorcomm network PHYs.

View file

@ -41,7 +41,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
--- a/Documentation/driver-api/nvmem.rst --- a/Documentation/driver-api/nvmem.rst
+++ b/Documentation/driver-api/nvmem.rst +++ b/Documentation/driver-api/nvmem.rst
@@ -189,3 +189,18 @@ ex:: @@ -185,3 +185,18 @@ ex::
===================== =====================
See Documentation/devicetree/bindings/nvmem/nvmem.txt See Documentation/devicetree/bindings/nvmem/nvmem.txt

View file

@ -19,7 +19,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
--- a/drivers/nvmem/bcm-ocotp.c --- a/drivers/nvmem/bcm-ocotp.c
+++ b/drivers/nvmem/bcm-ocotp.c +++ b/drivers/nvmem/bcm-ocotp.c
@@ -254,7 +254,6 @@ MODULE_DEVICE_TABLE(acpi, bcm_otpc_acpi_ @@ -244,7 +244,6 @@ MODULE_DEVICE_TABLE(acpi, bcm_otpc_acpi_
static int bcm_otpc_probe(struct platform_device *pdev) static int bcm_otpc_probe(struct platform_device *pdev)
{ {
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
@ -27,7 +27,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
struct otpc_priv *priv; struct otpc_priv *priv;
struct nvmem_device *nvmem; struct nvmem_device *nvmem;
int err; int err;
@@ -269,8 +268,7 @@ static int bcm_otpc_probe(struct platfor @@ -259,8 +258,7 @@ static int bcm_otpc_probe(struct platfor
return -ENODEV; return -ENODEV;
/* Get OTP base address register. */ /* Get OTP base address register. */

View file

@ -24,7 +24,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
--- a/include/linux/of.h --- a/include/linux/of.h
+++ b/include/linux/of.h +++ b/include/linux/of.h
@@ -1169,6 +1169,31 @@ static inline int of_parse_phandle_with_ @@ -1009,6 +1009,31 @@ static inline int of_parse_phandle_with_
} }
/** /**

View file

@ -21,7 +21,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
--- a/drivers/of/property.c --- a/drivers/of/property.c
+++ b/drivers/of/property.c +++ b/drivers/of/property.c
@@ -1173,8 +1173,8 @@ static struct device_node *parse_prop_ce @@ -1202,8 +1202,8 @@ static struct device_node *parse_prop_ce
if (strcmp(prop_name, list_name)) if (strcmp(prop_name, list_name))
return NULL; return NULL;

View file

@ -19,7 +19,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
--- a/drivers/of/property.c --- a/drivers/of/property.c
+++ b/drivers/of/property.c +++ b/drivers/of/property.c
@@ -1276,7 +1276,7 @@ DEFINE_SIMPLE_PROP(dmas, "dmas", "#dma-c @@ -1307,7 +1307,7 @@ DEFINE_SIMPLE_PROP(dmas, "dmas", "#dma-c
DEFINE_SIMPLE_PROP(power_domains, "power-domains", "#power-domain-cells") DEFINE_SIMPLE_PROP(power_domains, "power-domains", "#power-domain-cells")
DEFINE_SIMPLE_PROP(hwlocks, "hwlocks", "#hwlock-cells") DEFINE_SIMPLE_PROP(hwlocks, "hwlocks", "#hwlock-cells")
DEFINE_SIMPLE_PROP(extcon, "extcon", NULL) DEFINE_SIMPLE_PROP(extcon, "extcon", NULL)

View file

@ -17,7 +17,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
--- a/drivers/of/device.c --- a/drivers/of/device.c
+++ b/drivers/of/device.c +++ b/drivers/of/device.c
@@ -249,7 +249,7 @@ static ssize_t of_device_get_modalias(st @@ -256,7 +256,7 @@ static ssize_t of_device_get_modalias(st
ssize_t csize; ssize_t csize;
ssize_t tsize; ssize_t tsize;
@ -26,7 +26,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
return -ENODEV; return -ENODEV;
/* Name & Type */ /* Name & Type */
@@ -372,7 +372,7 @@ int of_device_uevent_modalias(struct dev @@ -379,7 +379,7 @@ int of_device_uevent_modalias(struct dev
{ {
int sl; int sl;

View file

@ -18,7 +18,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
--- a/drivers/of/device.c --- a/drivers/of/device.c
+++ b/drivers/of/device.c +++ b/drivers/of/device.c
@@ -381,6 +381,8 @@ int of_device_uevent_modalias(struct dev @@ -388,6 +388,8 @@ int of_device_uevent_modalias(struct dev
sl = of_device_get_modalias(dev, &env->buf[env->buflen-1], sl = of_device_get_modalias(dev, &env->buf[env->buflen-1],
sizeof(env->buf) - env->buflen); sizeof(env->buf) - env->buflen);

View file

@ -23,7 +23,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
--- a/drivers/of/device.c --- a/drivers/of/device.c
+++ b/drivers/of/device.c +++ b/drivers/of/device.c
@@ -241,7 +241,7 @@ const void *of_device_get_match_data(con @@ -248,7 +248,7 @@ const void *of_device_get_match_data(con
} }
EXPORT_SYMBOL(of_device_get_match_data); EXPORT_SYMBOL(of_device_get_match_data);
@ -32,7 +32,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
{ {
const char *compat; const char *compat;
char *c; char *c;
@@ -249,19 +249,16 @@ static ssize_t of_device_get_modalias(st @@ -256,19 +256,16 @@ static ssize_t of_device_get_modalias(st
ssize_t csize; ssize_t csize;
ssize_t tsize; ssize_t tsize;
@ -55,7 +55,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
csize = strlen(compat) + 1; csize = strlen(compat) + 1;
tsize += csize; tsize += csize;
if (csize > len) if (csize > len)
@@ -286,7 +283,10 @@ int of_device_request_module(struct devi @@ -293,7 +290,10 @@ int of_device_request_module(struct devi
ssize_t size; ssize_t size;
int ret; int ret;
@ -67,7 +67,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
if (size < 0) if (size < 0)
return size; return size;
@@ -297,7 +297,7 @@ int of_device_request_module(struct devi @@ -304,7 +304,7 @@ int of_device_request_module(struct devi
if (!str) if (!str)
return -ENOMEM; return -ENOMEM;
@ -76,7 +76,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
str[size - 1] = '\0'; str[size - 1] = '\0';
ret = request_module(str); ret = request_module(str);
kfree(str); kfree(str);
@@ -314,7 +314,12 @@ EXPORT_SYMBOL_GPL(of_device_request_modu @@ -321,7 +321,12 @@ EXPORT_SYMBOL_GPL(of_device_request_modu
*/ */
ssize_t of_device_modalias(struct device *dev, char *str, ssize_t len) ssize_t of_device_modalias(struct device *dev, char *str, ssize_t len)
{ {
@ -90,7 +90,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
if (sl < 0) if (sl < 0)
return sl; return sl;
if (sl > len - 2) if (sl > len - 2)
@@ -379,8 +384,8 @@ int of_device_uevent_modalias(struct dev @@ -386,8 +391,8 @@ int of_device_uevent_modalias(struct dev
if (add_uevent_var(env, "MODALIAS=")) if (add_uevent_var(env, "MODALIAS="))
return -ENOMEM; return -ENOMEM;

View file

@ -44,7 +44,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
--- a/drivers/acpi/bus.c --- a/drivers/acpi/bus.c
+++ b/drivers/acpi/bus.c +++ b/drivers/acpi/bus.c
@@ -785,9 +785,10 @@ static bool acpi_of_modalias(struct acpi @@ -806,9 +806,10 @@ static bool acpi_of_modalias(struct acpi
* @modalias: Pointer to buffer that modalias value will be copied into * @modalias: Pointer to buffer that modalias value will be copied into
* @len: Length of modalias buffer * @len: Length of modalias buffer
* *
@ -104,7 +104,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
} }
--- a/drivers/of/base.c --- a/drivers/of/base.c
+++ b/drivers/of/base.c +++ b/drivers/of/base.c
@@ -1159,19 +1159,23 @@ struct device_node *of_find_matching_nod @@ -1208,19 +1208,23 @@ struct device_node *of_find_matching_nod
EXPORT_SYMBOL(of_find_matching_node_and_match); EXPORT_SYMBOL(of_find_matching_node_and_match);
/** /**
@ -133,7 +133,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
{ {
const char *compatible, *p; const char *compatible, *p;
int cplen; int cplen;
@@ -1180,10 +1184,10 @@ int of_modalias_node(struct device_node @@ -1229,10 +1233,10 @@ int of_modalias_node(struct device_node
if (!compatible || strlen(compatible) > cplen) if (!compatible || strlen(compatible) > cplen)
return -ENODEV; return -ENODEV;
p = strchr(compatible, ','); p = strchr(compatible, ',');
@ -148,7 +148,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
* of_find_node_by_phandle - Find a node given a phandle * of_find_node_by_phandle - Find a node given a phandle
--- a/drivers/spi/spi.c --- a/drivers/spi/spi.c
+++ b/drivers/spi/spi.c +++ b/drivers/spi/spi.c
@@ -2128,8 +2128,8 @@ of_register_spi_device(struct spi_contro @@ -2315,8 +2315,8 @@ of_register_spi_device(struct spi_contro
} }
/* Select device driver */ /* Select device driver */
@ -161,7 +161,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
goto err_out; goto err_out;
--- a/include/linux/of.h --- a/include/linux/of.h
+++ b/include/linux/of.h +++ b/include/linux/of.h
@@ -361,7 +361,8 @@ extern int of_n_addr_cells(struct device @@ -362,7 +362,8 @@ extern int of_n_addr_cells(struct device
extern int of_n_size_cells(struct device_node *np); extern int of_n_size_cells(struct device_node *np);
extern const struct of_device_id *of_match_node( extern const struct of_device_id *of_match_node(
const struct of_device_id *matches, const struct device_node *node); const struct of_device_id *matches, const struct device_node *node);

View file

@ -43,7 +43,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_device.h> #include <linux/of_device.h>
@@ -241,42 +240,6 @@ const void *of_device_get_match_data(con @@ -248,42 +247,6 @@ const void *of_device_get_match_data(con
} }
EXPORT_SYMBOL(of_device_get_match_data); EXPORT_SYMBOL(of_device_get_match_data);
@ -135,7 +135,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+} +}
--- a/include/linux/of.h --- a/include/linux/of.h
+++ b/include/linux/of.h +++ b/include/linux/of.h
@@ -373,6 +373,9 @@ extern int of_parse_phandle_with_args_ma @@ -374,6 +374,9 @@ extern int of_parse_phandle_with_args_ma
extern int of_count_phandle_with_args(const struct device_node *np, extern int of_count_phandle_with_args(const struct device_node *np,
const char *list_name, const char *cells_name); const char *list_name, const char *cells_name);
@ -145,7 +145,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
/* phandle iterator functions */ /* phandle iterator functions */
extern int of_phandle_iterator_init(struct of_phandle_iterator *it, extern int of_phandle_iterator_init(struct of_phandle_iterator *it,
const struct device_node *np, const struct device_node *np,
@@ -885,6 +888,12 @@ static inline int of_count_phandle_with_ @@ -731,6 +734,12 @@ static inline int of_count_phandle_with_
return -ENOSYS; return -ENOSYS;
} }

View file

@ -31,7 +31,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
#include <linux/mod_devicetable.h> #include <linux/mod_devicetable.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
@@ -242,30 +241,10 @@ EXPORT_SYMBOL(of_device_get_match_data); @@ -249,30 +248,10 @@ EXPORT_SYMBOL(of_device_get_match_data);
int of_device_request_module(struct device *dev) int of_device_request_module(struct device *dev)
{ {
@ -109,7 +109,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+EXPORT_SYMBOL_GPL(of_request_module); +EXPORT_SYMBOL_GPL(of_request_module);
--- a/include/linux/of.h --- a/include/linux/of.h
+++ b/include/linux/of.h +++ b/include/linux/of.h
@@ -375,6 +375,7 @@ extern int of_count_phandle_with_args(co @@ -376,6 +376,7 @@ extern int of_count_phandle_with_args(co
/* module functions */ /* module functions */
extern ssize_t of_modalias(const struct device_node *np, char *str, ssize_t len); extern ssize_t of_modalias(const struct device_node *np, char *str, ssize_t len);
@ -117,7 +117,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
/* phandle iterator functions */ /* phandle iterator functions */
extern int of_phandle_iterator_init(struct of_phandle_iterator *it, extern int of_phandle_iterator_init(struct of_phandle_iterator *it,
@@ -893,6 +894,11 @@ static inline ssize_t of_modalias(const @@ -739,6 +740,11 @@ static inline ssize_t of_modalias(const
{ {
return -ENODEV; return -ENODEV;
} }