Re: [PATCH] staging: speakup: refactor synths array to use a list
Gregory Nowak, le lun. 11 juin 2018 16:51:22 -0700, a ecrit: > On Tue, Jun 12, 2018 at 12:57:03AM +0200, Samuel Thibault wrote: > > Anybody up for testing please? > > > > If people want to see speakup get mainlined instead of staging, please > > help. > > If I understand right, this patch changes how synthesizers are loaded > and unloaded through /sys/accessibility/speakup/synth, correct? The load/unload is about the module itself, i.e. modprobe speakup_bns ; modprobe speakup_soft, switch between them, then rmmod speakup_bns ; speakup_soft or the converse (to exercise both orders). Thanks! Samuel ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
Re: [PATCH] staging: lustre: add error handling for try_module_get
On Tue, Jun 12, 2018 at 12:49:26PM +0800, Zhouyang Jia wrote: > When try_module_get fails, the lack of error-handling code may > cause unexpected results. > > This patch adds error-handling code after calling try_module_get. > > Signed-off-by: Zhouyang Jia > --- > drivers/staging/lustre/lnet/klnds/socklnd/socklnd.c | 5 - This patch does not apply to Linus's tree. Always be sure to work against linux-next to catch things like this. thanks, greg k-h ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
Re: [PATCH] staging: lustre: add error handling for try_module_get
On Tue, Jun 12 2018, Zhouyang Jia wrote: > When try_module_get fails, the lack of error-handling code may > cause unexpected results. > > This patch adds error-handling code after calling try_module_get. > > Signed-off-by: Zhouyang Jia > --- > drivers/staging/lustre/lnet/klnds/socklnd/socklnd.c | 5 - > 1 file changed, 4 insertions(+), 1 deletion(-) > > diff --git a/drivers/staging/lustre/lnet/klnds/socklnd/socklnd.c > b/drivers/staging/lustre/lnet/klnds/socklnd/socklnd.c > index 7086678..72a42bd 100644 > --- a/drivers/staging/lustre/lnet/klnds/socklnd/socklnd.c > +++ b/drivers/staging/lustre/lnet/klnds/socklnd/socklnd.c > @@ -2422,7 +2422,10 @@ ksocknal_base_startup(void) > > /* flag lists/ptrs/locks initialised */ > ksocknal_data.ksnd_init = SOCKNAL_INIT_DATA; > - try_module_get(THIS_MODULE); > + if (!try_module_get(THIS_MODULE)) { > + CERROR("%s: cannot get module\n", __func__); > + goto failed; > + } > > ksocknal_data.ksnd_sched_info = cfs_percpt_alloc(lnet_cpt_table(), >sizeof(*info)); Thanks for the patch I agree that this is probably a bug, but the code is still buggy after you patch, just in a different way. Try following through the code and see what happens when you 'goto failed'. NeilBrown signature.asc Description: PGP signature ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
Re: [PATCH v5 2/4] resource: Use list_head to link sibling resource
Hi Baoquan, I love your patch! Perhaps something to improve: [auto build test WARNING on linus/master] [also build test WARNING on v4.17 next-20180608] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] url: https://github.com/0day-ci/linux/commits/Baoquan-He/resource-Use-list_head-to-link-sibling-resource/20180612-113600 config: x86_64-randconfig-x011-201823 (attached as .config) compiler: gcc-7 (Debian 7.3.0-16) 7.3.0 reproduce: # save the attached .config to linux build tree make ARCH=x86_64 All warnings (new ones prefixed by >>): kernel/resource.c: In function 'reparent_resources': kernel/resource.c:1005:26: error: passing argument 2 of 'list_add' from incompatible pointer type [-Werror=incompatible-pointer-types] list_add(&res->sibling, &p->sibling.prev); ^ In file included from include/linux/ioport.h:15:0, from kernel/resource.c:14: include/linux/list.h:77:20: note: expected 'struct list_head *' but argument is of type 'struct list_head **' static inline void list_add(struct list_head *new, struct list_head *head) ^~~~ In file included from include/linux/list.h:9:0, from include/linux/ioport.h:15, from kernel/resource.c:14: kernel/resource.c:1013:26: error: 'new' undeclared (first use in this function); did you mean 'net'? list_for_each_entry(p, &new->child, sibling) { ^ include/linux/kernel.h:963:26: note: in definition of macro 'container_of' void *__mptr = (void *)(ptr); \ ^~~ include/linux/list.h:377:2: note: in expansion of macro 'list_entry' list_entry((ptr)->next, type, member) ^~ include/linux/list.h:464:13: note: in expansion of macro 'list_first_entry' for (pos = list_first_entry(head, typeof(*pos), member); \ ^~~~ >> kernel/resource.c:1013:2: note: in expansion of macro 'list_for_each_entry' list_for_each_entry(p, &new->child, sibling) { ^~~ kernel/resource.c:1013:26: note: each undeclared identifier is reported only once for each function it appears in list_for_each_entry(p, &new->child, sibling) { ^ include/linux/kernel.h:963:26: note: in definition of macro 'container_of' void *__mptr = (void *)(ptr); \ ^~~ include/linux/list.h:377:2: note: in expansion of macro 'list_entry' list_entry((ptr)->next, type, member) ^~ include/linux/list.h:464:13: note: in expansion of macro 'list_first_entry' for (pos = list_first_entry(head, typeof(*pos), member); \ ^~~~ >> kernel/resource.c:1013:2: note: in expansion of macro 'list_for_each_entry' list_for_each_entry(p, &new->child, sibling) { ^~~ cc1: some warnings being treated as errors vim +/list_for_each_entry +1013 kernel/resource.c 983 984 /* 985 * Reparent resource children of pr that conflict with res 986 * under res, and make res replace those children. 987 */ 988 int reparent_resources(struct resource *parent, struct resource *res) 989 { 990 struct resource *p, *first = NULL; 991 992 list_for_each_entry(p, &parent->child, sibling) { 993 if (p->end < res->start) 994 continue; 995 if (res->end < p->start) 996 break; 997 if (p->start < res->start || p->end > res->end) 998 return -1; /* not completely contained */ 999 if (first == NULL) 1000 first = p; 1001 } 1002 if (first == NULL) 1003 return -1; /* didn't find any conflicting entries? */ 1004 res->parent = parent; 1005 list_add(&res->sibling, &p->sibling.prev); 1006 INIT_LIST_HEAD(&res->child); 1007 1008 /* 1009 * From first to p's previous sibling, they all fall into 1010 * res's region, change them as res's children. 1011 */ 1012 list_cut_position(&res->child, first->sibling.prev, res->sibling.prev); > 1013 list_for_each_entry(p, &new->child, sibling) { 1014 p->parent = new; 1015 pr_debug("PCI: Reparented %s %pR under %s\n", 1016 p->name, p, res->name); 1017 } 1018 return 0; 1019 } 1020 EXPORT_SYMBOL(reparent_resources); 1021 --- 0-DAY kernel test infrastructureOpen Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation .config.gz Description: application/gzip __
[PATCH] staging: lustre: add error handling for try_module_get
When try_module_get fails, the lack of error-handling code may cause unexpected results. This patch adds error-handling code after calling try_module_get. Signed-off-by: Zhouyang Jia --- drivers/staging/lustre/lnet/klnds/socklnd/socklnd.c | 5 - 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/staging/lustre/lnet/klnds/socklnd/socklnd.c b/drivers/staging/lustre/lnet/klnds/socklnd/socklnd.c index 7086678..72a42bd 100644 --- a/drivers/staging/lustre/lnet/klnds/socklnd/socklnd.c +++ b/drivers/staging/lustre/lnet/klnds/socklnd/socklnd.c @@ -2422,7 +2422,10 @@ ksocknal_base_startup(void) /* flag lists/ptrs/locks initialised */ ksocknal_data.ksnd_init = SOCKNAL_INIT_DATA; - try_module_get(THIS_MODULE); + if (!try_module_get(THIS_MODULE)) { + CERROR("%s: cannot get module\n", __func__); + goto failed; + } ksocknal_data.ksnd_sched_info = cfs_percpt_alloc(lnet_cpt_table(), sizeof(*info)); -- 2.7.4 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
Re: [PATCH v5 2/4] resource: Use list_head to link sibling resource
Hi Baoquan, I love your patch! Yet something to improve: [auto build test ERROR on linus/master] [also build test ERROR on v4.17 next-20180608] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] url: https://github.com/0day-ci/linux/commits/Baoquan-He/resource-Use-list_head-to-link-sibling-resource/20180612-113600 config: i386-tinyconfig (attached as .config) compiler: gcc-7 (Debian 7.3.0-16) 7.3.0 reproduce: # save the attached .config to linux build tree make ARCH=i386 All errors (new ones prefixed by >>): kernel/resource.c: In function 'reparent_resources': >> kernel/resource.c:1005:26: error: passing argument 2 of 'list_add' from >> incompatible pointer type [-Werror=incompatible-pointer-types] list_add(&res->sibling, &p->sibling.prev); ^ In file included from include/linux/ioport.h:15:0, from kernel/resource.c:14: include/linux/list.h:77:20: note: expected 'struct list_head *' but argument is of type 'struct list_head **' static inline void list_add(struct list_head *new, struct list_head *head) ^~~~ In file included from include/linux/list.h:9:0, from include/linux/ioport.h:15, from kernel/resource.c:14: >> kernel/resource.c:1013:26: error: 'new' undeclared (first use in this >> function); did you mean 'net'? list_for_each_entry(p, &new->child, sibling) { ^ include/linux/kernel.h:963:26: note: in definition of macro 'container_of' void *__mptr = (void *)(ptr); \ ^~~ include/linux/list.h:377:2: note: in expansion of macro 'list_entry' list_entry((ptr)->next, type, member) ^~ include/linux/list.h:464:13: note: in expansion of macro 'list_first_entry' for (pos = list_first_entry(head, typeof(*pos), member); \ ^~~~ kernel/resource.c:1013:2: note: in expansion of macro 'list_for_each_entry' list_for_each_entry(p, &new->child, sibling) { ^~~ kernel/resource.c:1013:26: note: each undeclared identifier is reported only once for each function it appears in list_for_each_entry(p, &new->child, sibling) { ^ include/linux/kernel.h:963:26: note: in definition of macro 'container_of' void *__mptr = (void *)(ptr); \ ^~~ include/linux/list.h:377:2: note: in expansion of macro 'list_entry' list_entry((ptr)->next, type, member) ^~ include/linux/list.h:464:13: note: in expansion of macro 'list_first_entry' for (pos = list_first_entry(head, typeof(*pos), member); \ ^~~~ kernel/resource.c:1013:2: note: in expansion of macro 'list_for_each_entry' list_for_each_entry(p, &new->child, sibling) { ^~~ cc1: some warnings being treated as errors vim +/list_add +1005 kernel/resource.c 983 984 /* 985 * Reparent resource children of pr that conflict with res 986 * under res, and make res replace those children. 987 */ 988 int reparent_resources(struct resource *parent, struct resource *res) 989 { 990 struct resource *p, *first = NULL; 991 992 list_for_each_entry(p, &parent->child, sibling) { 993 if (p->end < res->start) 994 continue; 995 if (res->end < p->start) 996 break; 997 if (p->start < res->start || p->end > res->end) 998 return -1; /* not completely contained */ 999 if (first == NULL) 1000 first = p; 1001 } 1002 if (first == NULL) 1003 return -1; /* didn't find any conflicting entries? */ 1004 res->parent = parent; > 1005 list_add(&res->sibling, &p->sibling.prev); 1006 INIT_LIST_HEAD(&res->child); 1007 1008 /* 1009 * From first to p's previous sibling, they all fall into 1010 * res's region, change them as res's children. 1011 */ 1012 list_cut_position(&res->child, first->sibling.prev, res->sibling.prev); > 1013 list_for_each_entry(p, &new->child, sibling) { 1014 p->parent = new; 1015 pr_debug("PCI: Reparented %s %pR under %s\n", 1016 p->name, p, res->name); 1017 } 1018 return 0; 1019 } 1020 EXPORT_SYMBOL(reparent_resources); 1021 --- 0-DAY kernel test infrastructureOpen Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation .config.gz Description: application/gzip ___ devel mailing lis
Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public
Hi Baoquan, I love your patch! Yet something to improve: [auto build test ERROR on linus/master] [also build test ERROR on v4.17 next-20180608] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] url: https://github.com/0day-ci/linux/commits/Baoquan-He/resource-Use-list_head-to-link-sibling-resource/20180612-113600 config: i386-tinyconfig (attached as .config) compiler: gcc-7 (Debian 7.3.0-16) 7.3.0 reproduce: # save the attached .config to linux build tree make ARCH=i386 Note: the linux-review/Baoquan-He/resource-Use-list_head-to-link-sibling-resource/20180612-113600 HEAD 5545e79eef6387857faf41cdffa7be6b1f5d4efe builds fine. It only hurts bisectibility. All errors (new ones prefixed by >>): >> kernel/resource.c:990:12: error: static declaration of 'reparent_resources' >> follows non-static declaration static int reparent_resources(struct resource *parent, ^~ In file included from kernel/resource.c:14:0: include/linux/ioport.h:195:5: note: previous declaration of 'reparent_resources' was here int reparent_resources(struct resource *parent, struct resource *res); ^~ kernel/resource.c:990:12: warning: 'reparent_resources' defined but not used [-Wunused-function] static int reparent_resources(struct resource *parent, ^~ vim +/reparent_resources +990 kernel/resource.c 985 986 /* 987 * Reparent resource children of pr that conflict with res 988 * under res, and make res replace those children. 989 */ > 990 static int reparent_resources(struct resource *parent, 991 struct resource *res) 992 { 993 struct resource *p, **pp; 994 struct resource **firstpp = NULL; 995 996 for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) { 997 if (p->end < res->start) 998 continue; 999 if (res->end < p->start) 1000 break; 1001 if (p->start < res->start || p->end > res->end) 1002 return -1; /* not completely contained */ 1003 if (firstpp == NULL) 1004 firstpp = pp; 1005 } 1006 if (firstpp == NULL) 1007 return -1; /* didn't find any conflicting entries? */ 1008 res->parent = parent; 1009 res->child = *firstpp; 1010 res->sibling = *pp; 1011 *firstpp = res; 1012 *pp = NULL; 1013 for (p = res->child; p != NULL; p = p->sibling) { 1014 p->parent = res; 1015 pr_debug("PCI: Reparented %s %pR under %s\n", 1016 p->name, p, res->name); 1017 } 1018 return 0; 1019 } 1020 EXPORT_SYMBOL(reparent_resources); 1021 --- 0-DAY kernel test infrastructureOpen Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation .config.gz Description: application/gzip ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public
On 06/12/18 at 11:28am, Baoquan He wrote: > reparent_resources() is duplicated in arch/microblaze/pci/pci-common.c > and arch/powerpc/kernel/pci-common.c, so move it to kernel/resource.c > so that it's shared. Later its code also need be updated using list_head > to replace singly linked list. > > Signed-off-by: Baoquan He > Cc: Michal Simek > Cc: Benjamin Herrenschmidt > Cc: Paul Mackerras > Cc: Michael Ellerman > --- > v4->v5: > Fix several code bugs reported by test robot on ARCH powerpc and > microblaze. Oops, I mistakenly added the patch change log of the current patch 0002 here. This patch is a newly added one. > > v3->v4: > Fix several bugs test robot reported. And change patch log. > > v2->v3: > Rename resource functions first_child() and sibling() to > resource_first_chils() and resource_sibling(). Dan suggested this. > > Move resource_first_chils() and resource_sibling() to linux/ioport.h > and make them as inline function. Rob suggested this. Accordingly add > linux/list.h including in linux/ioport.h, please help review if this > bring efficiency degradation or code redundancy. > > The change on struct resource {} bring two pointers of size increase, > mention this in git log to make it more specifically, Rob suggested > this. > > arch/microblaze/pci/pci-common.c | 37 - > arch/powerpc/kernel/pci-common.c | 35 --- > include/linux/ioport.h | 1 + > kernel/resource.c| 36 > 4 files changed, 37 insertions(+), 72 deletions(-) > > diff --git a/arch/microblaze/pci/pci-common.c > b/arch/microblaze/pci/pci-common.c > index f34346d56095..7899bafab064 100644 > --- a/arch/microblaze/pci/pci-common.c > +++ b/arch/microblaze/pci/pci-common.c > @@ -619,43 +619,6 @@ int pcibios_add_device(struct pci_dev *dev) > EXPORT_SYMBOL(pcibios_add_device); > > /* > - * Reparent resource children of pr that conflict with res > - * under res, and make res replace those children. > - */ > -static int __init reparent_resources(struct resource *parent, > - struct resource *res) > -{ > - struct resource *p, **pp; > - struct resource **firstpp = NULL; > - > - for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) { > - if (p->end < res->start) > - continue; > - if (res->end < p->start) > - break; > - if (p->start < res->start || p->end > res->end) > - return -1; /* not completely contained */ > - if (firstpp == NULL) > - firstpp = pp; > - } > - if (firstpp == NULL) > - return -1; /* didn't find any conflicting entries? */ > - res->parent = parent; > - res->child = *firstpp; > - res->sibling = *pp; > - *firstpp = res; > - *pp = NULL; > - for (p = res->child; p != NULL; p = p->sibling) { > - p->parent = res; > - pr_debug("PCI: Reparented %s [%llx..%llx] under %s\n", > - p->name, > - (unsigned long long)p->start, > - (unsigned long long)p->end, res->name); > - } > - return 0; > -} > - > -/* > * Handle resources of PCI devices. If the world were perfect, we could > * just allocate all the resource regions and do nothing more. It isn't. > * On the other hand, we cannot just re-allocate all devices, as it would > diff --git a/arch/powerpc/kernel/pci-common.c > b/arch/powerpc/kernel/pci-common.c > index fe9733aa..926035bb378d 100644 > --- a/arch/powerpc/kernel/pci-common.c > +++ b/arch/powerpc/kernel/pci-common.c > @@ -1088,41 +1088,6 @@ resource_size_t pcibios_align_resource(void *data, > const struct resource *res, > EXPORT_SYMBOL(pcibios_align_resource); > > /* > - * Reparent resource children of pr that conflict with res > - * under res, and make res replace those children. > - */ > -static int reparent_resources(struct resource *parent, > - struct resource *res) > -{ > - struct resource *p, **pp; > - struct resource **firstpp = NULL; > - > - for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) { > - if (p->end < res->start) > - continue; > - if (res->end < p->start) > - break; > - if (p->start < res->start || p->end > res->end) > - return -1; /* not completely contained */ > - if (firstpp == NULL) > - firstpp = pp; > - } > - if (firstpp == NULL) > - return -1; /* didn't find any conflicting entries? */ > - res->parent = parent; > - res->child = *firstpp; > - res->sibling = *pp; > - *firstpp = res; > - *pp = NULL; > - for (p = res->child; p != NULL; p = p->sibling) { > -
[PATCH v5 3/4] resource: add walk_system_ram_res_rev()
This function, being a variant of walk_system_ram_res() introduced in commit 8c86e70acead ("resource: provide new functions to walk through resources"), walks through a list of all the resources of System RAM in reversed order, i.e., from higher to lower. It will be used in kexec_file code. Signed-off-by: Baoquan He Cc: Andrew Morton Cc: Thomas Gleixner Cc: Brijesh Singh Cc: "Jérôme Glisse" Cc: Borislav Petkov Cc: Tom Lendacky Cc: Wei Yang --- include/linux/ioport.h | 3 +++ kernel/resource.c | 40 2 files changed, 43 insertions(+) diff --git a/include/linux/ioport.h b/include/linux/ioport.h index b7456ae889dd..066cc263e2cc 100644 --- a/include/linux/ioport.h +++ b/include/linux/ioport.h @@ -279,6 +279,9 @@ extern int walk_system_ram_res(u64 start, u64 end, void *arg, int (*func)(struct resource *, void *)); extern int +walk_system_ram_res_rev(u64 start, u64 end, void *arg, + int (*func)(struct resource *, void *)); +extern int walk_iomem_res_desc(unsigned long desc, unsigned long flags, u64 start, u64 end, void *arg, int (*func)(struct resource *, void *)); diff --git a/kernel/resource.c b/kernel/resource.c index ef9a20b75234..3128ac938f38 100644 --- a/kernel/resource.c +++ b/kernel/resource.c @@ -23,6 +23,8 @@ #include #include #include +#include +#include #include @@ -443,6 +445,44 @@ int walk_system_ram_res(u64 start, u64 end, void *arg, } /* + * This function, being a variant of walk_system_ram_res(), calls the @func + * callback against all memory ranges of type System RAM which are marked as + * IORESOURCE_SYSTEM_RAM and IORESOUCE_BUSY in reversed order, i.e., from + * higher to lower. + */ +int walk_system_ram_res_rev(u64 start, u64 end, void *arg, + int (*func)(struct resource *, void *)) +{ + unsigned long flags; + struct resource *res; + int ret = -1; + + flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY; + + read_lock(&resource_lock); + list_for_each_entry_reverse(res, &iomem_resource.child, sibling) { + if (start >= end) + break; + if ((res->flags & flags) != flags) + continue; + if (res->desc != IORES_DESC_NONE) + continue; + if (res->end < start) + break; + + if ((res->end >= start) && (res->start < end)) { + ret = (*func)(res, arg); + if (ret) + break; + } + end = res->start - 1; + + } + read_unlock(&resource_lock); + return ret; +} + +/* * This function calls the @func callback against all memory ranges, which * are ranges marked as IORESOURCE_MEM and IORESOUCE_BUSY. */ -- 2.13.6 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH v5 4/4] kexec_file: Load kernel at top of system RAM if required
For kexec_file loading, if kexec_buf.top_down is 'true', the memory which is used to load kernel/initrd/purgatory is supposed to be allocated from top to down. This is what we have been doing all along in the old kexec loading interface and the kexec loading is still default setting in some distributions. However, the current kexec_file loading interface doesn't do likt this. The function arch_kexec_walk_mem() it calls ignores checking kexec_buf.top_down, but calls walk_system_ram_res() directly to go through all resources of System RAM from bottom to up, to try to find memory region which can contain the specific kexec buffer, then call locate_mem_hole_callback() to allocate memory in that found memory region from top to down. This brings confusion especially when KASLR is widely supported , users have to make clear why kexec/kdump kernel loading position is different between these two interfaces in order to exclude unnecessary noises. Hence these two interfaces need be unified on behaviour. Here add checking if kexec_buf.top_down is 'true' in arch_kexec_walk_mem(), if yes, call the newly added walk_system_ram_res_rev() to find memory region from top to down to load kernel. Signed-off-by: Baoquan He Cc: Eric Biederman Cc: Vivek Goyal Cc: Dave Young Cc: Andrew Morton Cc: Yinghai Lu Cc: ke...@lists.infradead.org --- kernel/kexec_file.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c index 75d8e7cf040e..7a66d9d5a534 100644 --- a/kernel/kexec_file.c +++ b/kernel/kexec_file.c @@ -518,6 +518,8 @@ int __weak arch_kexec_walk_mem(struct kexec_buf *kbuf, IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY, crashk_res.start, crashk_res.end, kbuf, func); + else if (kbuf->top_down) + return walk_system_ram_res_rev(0, ULONG_MAX, kbuf, func); else return walk_system_ram_res(0, ULONG_MAX, kbuf, func); } -- 2.13.6 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public
reparent_resources() is duplicated in arch/microblaze/pci/pci-common.c and arch/powerpc/kernel/pci-common.c, so move it to kernel/resource.c so that it's shared. Later its code also need be updated using list_head to replace singly linked list. Signed-off-by: Baoquan He Cc: Michal Simek Cc: Benjamin Herrenschmidt Cc: Paul Mackerras Cc: Michael Ellerman --- v4->v5: Fix several code bugs reported by test robot on ARCH powerpc and microblaze. v3->v4: Fix several bugs test robot reported. And change patch log. v2->v3: Rename resource functions first_child() and sibling() to resource_first_chils() and resource_sibling(). Dan suggested this. Move resource_first_chils() and resource_sibling() to linux/ioport.h and make them as inline function. Rob suggested this. Accordingly add linux/list.h including in linux/ioport.h, please help review if this bring efficiency degradation or code redundancy. The change on struct resource {} bring two pointers of size increase, mention this in git log to make it more specifically, Rob suggested this. arch/microblaze/pci/pci-common.c | 37 - arch/powerpc/kernel/pci-common.c | 35 --- include/linux/ioport.h | 1 + kernel/resource.c| 36 4 files changed, 37 insertions(+), 72 deletions(-) diff --git a/arch/microblaze/pci/pci-common.c b/arch/microblaze/pci/pci-common.c index f34346d56095..7899bafab064 100644 --- a/arch/microblaze/pci/pci-common.c +++ b/arch/microblaze/pci/pci-common.c @@ -619,43 +619,6 @@ int pcibios_add_device(struct pci_dev *dev) EXPORT_SYMBOL(pcibios_add_device); /* - * Reparent resource children of pr that conflict with res - * under res, and make res replace those children. - */ -static int __init reparent_resources(struct resource *parent, -struct resource *res) -{ - struct resource *p, **pp; - struct resource **firstpp = NULL; - - for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) { - if (p->end < res->start) - continue; - if (res->end < p->start) - break; - if (p->start < res->start || p->end > res->end) - return -1; /* not completely contained */ - if (firstpp == NULL) - firstpp = pp; - } - if (firstpp == NULL) - return -1; /* didn't find any conflicting entries? */ - res->parent = parent; - res->child = *firstpp; - res->sibling = *pp; - *firstpp = res; - *pp = NULL; - for (p = res->child; p != NULL; p = p->sibling) { - p->parent = res; - pr_debug("PCI: Reparented %s [%llx..%llx] under %s\n", -p->name, -(unsigned long long)p->start, -(unsigned long long)p->end, res->name); - } - return 0; -} - -/* * Handle resources of PCI devices. If the world were perfect, we could * just allocate all the resource regions and do nothing more. It isn't. * On the other hand, we cannot just re-allocate all devices, as it would diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c index fe9733aa..926035bb378d 100644 --- a/arch/powerpc/kernel/pci-common.c +++ b/arch/powerpc/kernel/pci-common.c @@ -1088,41 +1088,6 @@ resource_size_t pcibios_align_resource(void *data, const struct resource *res, EXPORT_SYMBOL(pcibios_align_resource); /* - * Reparent resource children of pr that conflict with res - * under res, and make res replace those children. - */ -static int reparent_resources(struct resource *parent, -struct resource *res) -{ - struct resource *p, **pp; - struct resource **firstpp = NULL; - - for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) { - if (p->end < res->start) - continue; - if (res->end < p->start) - break; - if (p->start < res->start || p->end > res->end) - return -1; /* not completely contained */ - if (firstpp == NULL) - firstpp = pp; - } - if (firstpp == NULL) - return -1; /* didn't find any conflicting entries? */ - res->parent = parent; - res->child = *firstpp; - res->sibling = *pp; - *firstpp = res; - *pp = NULL; - for (p = res->child; p != NULL; p = p->sibling) { - p->parent = res; - pr_debug("PCI: Reparented %s %pR under %s\n", -p->name, p, res->name); - } - return 0; -} - -/* * Handle resources of PCI devices. If the world were perfect, we could * just allocate all the resource regions and do nothing mor
[PATCH v5 2/4] resource: Use list_head to link sibling resource
The struct resource uses singly linked list to link siblings, implemented by pointer operation. Replace it with list_head for better code readability. Based on this list_head replacement, it will be very easy to do reverse iteration on iomem_resource's sibling list in later patch. Besides, type of member variables of struct resource, sibling and child, are changed from 'struct resource *' to 'struct list_head'. This brings two pointers of size increase. Suggested-by: Andrew Morton Signed-off-by: Baoquan He Cc: Patrik Jakobsson Cc: David Airlie Cc: "K. Y. Srinivasan" Cc: Haiyang Zhang Cc: Stephen Hemminger Cc: Dmitry Torokhov Cc: Dan Williams Cc: Rob Herring Cc: Frank Rowand Cc: Keith Busch Cc: Jonathan Derrick Cc: Lorenzo Pieralisi Cc: Bjorn Helgaas Cc: Thomas Gleixner Cc: Brijesh Singh Cc: "Jérôme Glisse" Cc: Borislav Petkov Cc: Tom Lendacky Cc: Greg Kroah-Hartman Cc: Yaowei Bai Cc: Wei Yang Cc: de...@linuxdriverproject.org Cc: linux-in...@vger.kernel.org Cc: linux-nvd...@lists.01.org Cc: devicet...@vger.kernel.org Cc: linux-...@vger.kernel.org --- arch/arm/plat-samsung/pm-check.c| 6 +- arch/microblaze/pci/pci-common.c| 4 +- arch/powerpc/kernel/pci-common.c| 4 +- arch/sparc/kernel/ioport.c | 2 +- arch/xtensa/include/asm/pci-bridge.h| 4 +- drivers/eisa/eisa-bus.c | 2 + drivers/gpu/drm/drm_memory.c| 3 +- drivers/gpu/drm/gma500/gtt.c| 5 +- drivers/hv/vmbus_drv.c | 52 +++ drivers/input/joystick/iforce/iforce-main.c | 4 +- drivers/nvdimm/namespace_devs.c | 6 +- drivers/nvdimm/nd.h | 5 +- drivers/of/address.c| 4 +- drivers/parisc/lba_pci.c| 4 +- drivers/pci/host/vmd.c | 8 +- drivers/pci/probe.c | 2 + drivers/pci/setup-bus.c | 2 +- include/linux/ioport.h | 17 ++- kernel/resource.c | 211 ++-- 19 files changed, 176 insertions(+), 169 deletions(-) diff --git a/arch/arm/plat-samsung/pm-check.c b/arch/arm/plat-samsung/pm-check.c index cd2c02c68bc3..5494355b1c49 100644 --- a/arch/arm/plat-samsung/pm-check.c +++ b/arch/arm/plat-samsung/pm-check.c @@ -46,8 +46,8 @@ typedef u32 *(run_fn_t)(struct resource *ptr, u32 *arg); static void s3c_pm_run_res(struct resource *ptr, run_fn_t fn, u32 *arg) { while (ptr != NULL) { - if (ptr->child != NULL) - s3c_pm_run_res(ptr->child, fn, arg); + if (!list_empty(&ptr->child)) + s3c_pm_run_res(resource_first_child(&ptr->child), fn, arg); if ((ptr->flags & IORESOURCE_SYSTEM_RAM) == IORESOURCE_SYSTEM_RAM) { @@ -57,7 +57,7 @@ static void s3c_pm_run_res(struct resource *ptr, run_fn_t fn, u32 *arg) arg = (fn)(ptr, arg); } - ptr = ptr->sibling; + ptr = resource_sibling(ptr); } } diff --git a/arch/microblaze/pci/pci-common.c b/arch/microblaze/pci/pci-common.c index 7899bafab064..2bf73e27e231 100644 --- a/arch/microblaze/pci/pci-common.c +++ b/arch/microblaze/pci/pci-common.c @@ -533,7 +533,9 @@ void pci_process_bridge_OF_ranges(struct pci_controller *hose, res->flags = range.flags; res->start = range.cpu_addr; res->end = range.cpu_addr + range.size - 1; - res->parent = res->child = res->sibling = NULL; + res->parent = NULL; + INIT_LIST_HEAD(&res->child); + INIT_LIST_HEAD(&res->sibling); } } diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c index 926035bb378d..28fbe83c9daf 100644 --- a/arch/powerpc/kernel/pci-common.c +++ b/arch/powerpc/kernel/pci-common.c @@ -761,7 +761,9 @@ void pci_process_bridge_OF_ranges(struct pci_controller *hose, res->flags = range.flags; res->start = range.cpu_addr; res->end = range.cpu_addr + range.size - 1; - res->parent = res->child = res->sibling = NULL; + res->parent = NULL; + INIT_LIST_HEAD(&res->child); + INIT_LIST_HEAD(&res->sibling); } } } diff --git a/arch/sparc/kernel/ioport.c b/arch/sparc/kernel/ioport.c index cca9134cfa7d..99efe4e98b16 100644 --- a/arch/sparc/kernel/ioport.c +++ b/arch/sparc/kernel/ioport.c @@ -669,7 +669,7 @@ static int sparc_io_proc_show(struct seq_file *m, void *v) struct resource *root = m->private, *r; const char *nm; - for (r = root->child; r != NULL; r = r->sibling) { +
[PATCH v5 0/4] resource: Use list_head to link sibling resource
This patchset is doing: 1) Replace struct resource's sibling list from singly linked list to list_head. Clearing out those pointer operation within singly linked list for better code readability. 2) Based on list_head replacement, add a new function walk_system_ram_res_rev() which can does reversed iteration on iomem_resource's siblings. 3) Change kexec_file loading to search system RAM top down for kernel loadin, using walk_system_ram_res_rev(). Note: This patchset passed testing on my kvm guest, x86_64 arch with network enabling. The thing we need pay attetion to is that a root resource's child member need be initialized specifically with LIST_HEAD_INIT() if statically defined or INIT_LIST_HEAD() for dynamically definition. Here Just like we do for iomem_resource/ioport_resource, or the change in get_pci_domain_busn_res(). Links of the old post (Boris pointed out that we should use https://lkml.kernel.org/r/Message-ID, while it can't be opened from my side, so paste all of them here.): v4: https://lkml.kernel.org/r/20180507063224.24229-1-...@redhat.com https://lkml.org/lkml/2018/5/7/36 v3: https://lkml.kernel.org/r/20180419001848.3041-1-...@redhat.com https://lkml.org/lkml/2018/4/18/767 v2: https://lkml.kernel.org/r/20180408024724.16812-1-...@redhat.com https://lkml.org/lkml/2018/4/7/169 v1: https://lkml.kernel.org/r/20180322033722.9279-1-...@redhat.com https://lkml.org/lkml/2018/3/21/952 Changelog: v4->v5: Add new patch 0001 to move duplicated reparent_resources() to kernel/resource.c to make it be shared by different ARCH-es. Fix several code bugs reported by test robot on ARCH powerpc and microblaze. v3->v4: Fix several bugs test robot reported. Rewrite cover letter and patch log according to reviewer's comment. v2->v3: Rename resource functions first_child() and sibling() to resource_first_chils() and resource_sibling(). Dan suggested this. Move resource_first_chils() and resource_sibling() to linux/ioport.h and make them as inline function. Rob suggested this. Accordingly add linux/list.h including in linux/ioport.h, please help review if this bring efficiency degradation or code redundancy. The change on struct resource {} bring two pointers of size increase, mention this in git log to make it more specifically, Rob suggested this. v1->v2: Use list_head instead to link resource siblings. This is suggested by Andrew. Rewrite walk_system_ram_res_rev() after list_head is taken to link resouce siblings. Baoquan He (4): resource: Move reparent_resources() to kernel/resource.c and make it public resource: Use list_head to link sibling resource resource: add walk_system_ram_res_rev() kexec_file: Load kernel at top of system RAM if required arch/arm/plat-samsung/pm-check.c| 6 +- arch/microblaze/pci/pci-common.c| 41 + arch/powerpc/kernel/pci-common.c| 39 + arch/sparc/kernel/ioport.c | 2 +- arch/xtensa/include/asm/pci-bridge.h| 4 +- drivers/eisa/eisa-bus.c | 2 + drivers/gpu/drm/drm_memory.c| 3 +- drivers/gpu/drm/gma500/gtt.c| 5 +- drivers/hv/vmbus_drv.c | 52 +++--- drivers/input/joystick/iforce/iforce-main.c | 4 +- drivers/nvdimm/namespace_devs.c | 6 +- drivers/nvdimm/nd.h | 5 +- drivers/of/address.c| 4 +- drivers/parisc/lba_pci.c| 4 +- drivers/pci/host/vmd.c | 8 +- drivers/pci/probe.c | 2 + drivers/pci/setup-bus.c | 2 +- include/linux/ioport.h | 21 ++- kernel/kexec_file.c | 2 + kernel/resource.c | 259 ++-- 20 files changed, 244 insertions(+), 227 deletions(-) -- 2.13.6 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH] staging: comedi: add error handling for vmap
When vmap fails, the lack of error-handling code may cause unexpected results. This patch adds error-handling code after calling vmap. Signed-off-by: Zhouyang Jia --- drivers/staging/comedi/comedi_buf.c | 5 - 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/staging/comedi/comedi_buf.c b/drivers/staging/comedi/comedi_buf.c index f693c2c..5e48693 100644 --- a/drivers/staging/comedi/comedi_buf.c +++ b/drivers/staging/comedi/comedi_buf.c @@ -132,9 +132,12 @@ static void __comedi_buf_alloc(struct comedi_device *dev, spin_unlock_irqrestore(&s->spin_lock, flags); /* vmap the prealloc_buf if all the pages were allocated */ - if (i == n_pages) + if (i == n_pages) { async->prealloc_buf = vmap(pages, n_pages, VM_MAP, COMEDI_PAGE_PROTECTION); + if (!async->prealloc_buf) + dev_err(dev->class_dev, "failed to vmap pages\n"); + } vfree(pages); } -- 2.7.4 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH] staging: rtl8712: add error handling for register_netdev
When register_netdev fails, the lack of error-handling code may cause unexpected results. This patch adds error-handling code after calling register_netdev. Signed-off-by: Zhouyang Jia --- drivers/staging/rtl8712/hal_init.c | 8 +++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/staging/rtl8712/hal_init.c b/drivers/staging/rtl8712/hal_init.c index 2a3f074..2b47e75 100644 --- a/drivers/staging/rtl8712/hal_init.c +++ b/drivers/staging/rtl8712/hal_init.c @@ -40,6 +40,7 @@ static void rtl871x_load_fw_cb(const struct firmware *firmware, void *context) { struct _adapter *padapter = context; + int rc; complete(&padapter->rtl8712_fw_ready); if (!firmware) { @@ -53,7 +54,12 @@ static void rtl871x_load_fw_cb(const struct firmware *firmware, void *context) } padapter->fw = firmware; /* firmware available - start netdev */ - register_netdev(padapter->pnetdev); + rc = register_netdev(padapter->pnetdev); + if (rc) { + struct usb_device *udev = padapter->dvobjpriv.pusbdev; + + dev_err(&udev->dev, "r8712u: Unable to register netdev\n"); + } } static const char firmware_file[] = "rtlwifi/rtl8712u.bin"; -- 2.7.4 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
Re: [PATCH v3 0/8] staging: mt7621-gpio: last cleanups
On Mon, Jun 11 2018, Sergio Paracuellos wrote: > After submiting this driver to try to get mainlined and get > out of staging some new cleanups seems to be necessary. > According to this main of Linus Walleij: > > http://driverdev.linuxdriverproject.org/pipermail/driverdev-devel/2018-June/121742.html > > this series tries to fix all of the issues in order to send > v2 and give it a new try. Because I don't have to hardware to > test my changes I send new cleanups first in staging to make > easier to NeilBrown test it and get a feedback about them. > > Changes in v3: > - PATCH 7: refactor irq_type to make better code. > - Add PATCH 8 avoiding the use of custom domain and requesting > manually a 'IRQF_SHARED'. It should be working now?? Yes, it is working now - thanks. With this series, the driver again works for all the tests I can perform - except that some names aren't unique, as I've mentioned separately. Looking over the new code: - I don't think we need PIN_MASK() any more. We needed that when we had 1 irq_chip which handled 96 irqs. Now we have 3 irq_chips with 32 irqs each. - documentation for 'struct mtk_data' says it is a single irqchip, but I don't think it is any more - there is one per gpio chip. Related: doco for 'struct mtk_gc' contains data for both the gpio_chip and the irq_chip. I don't know if that needs to be spelled out. - In if (pending) { for_each_set_bit(bit, &pending, MTK_BANK_WIDTH) { I wouldn't bother with the "if (pending)". If pending is zero, then find_each_set_bit() won't find anything. It is at most a minor optimization. This is a personal preference and if you like it that way, leave it. Though if you are keen to optimize, then instead of calling mtk_gpio_w32(...BIT(bit)) for every found bit, just call mtk_gpio_w32(... pending) once at the top. - to_mediatek_gpio() cannot return NULL, so testing "if (!rg)" in several places is pointless. - If the dts file doesn't specify an irq, the irq_of_parse_and_map() will return -1 (I think). This might deserve a warning and probably shouldn't cause the probe to fail, but it should cause mediatek_gpio_bank_probe to avoid trying to set up interrupts. Nothing serious, but some might be worth fixing. Thanks a lot, NeilBrown signature.asc Description: PGP signature ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
Re: [PATCH v2 0/7] staging: mt7621-gpio: last cleanups
On Mon, Jun 11 2018, Sergio Paracuellos wrote: > On Mon, Jun 11, 2018 at 06:33:44PM +1000, NeilBrown wrote: >> On Mon, Jun 11 2018, Sergio Paracuellos wrote: >> >> > After submiting this driver to try to get mainlined and get >> > out of staging some new cleanups seems to be necessary. >> > According to this main of Linus Walleij: >> > >> > http://driverdev.linuxdriverproject.org/pipermail/driverdev-devel/2018-June/121742.html >> > >> > this series tries to fix all of the issues in order to send >> > v2 and give it a new try. Because I don't have to hardware to >> > test my changes I send new cleanups first in staging to make >> > easier to NeilBrown test it and get a feedback about them. >> > >> > Changes in v2: >> > - Patch where GPIOLIB_IRQCHIP was used avoiding >> > the use of a custom irq domain has been dropped to >> > be sure after this changes all is working properly. >> > (This was PATCH 7 in previous series) >> > - PATCH 1: >> > * avoid introducing new macros and use 'bank' >> >field of mtk_gc with register offset. >> > * Make correct use of bgpio_init passing new >> >void __iomem pointers instead of use the >> >macros. >> > - Previous series PATCH 8 now is PATCH 7. Avoid the >> > use of a switch-case statement which was wrong and >> > distinc if we have RISSING AND FALLING EDGE interrupt >> > or HIGH LOW level ones. This last two are exclusive and >> > cannot be generated at the same time. >> > >> > Also, I think is we finally avoid to use a new irq_domain the >> > need for the new functions introduced for request and release >> > resources dissapears. I was diving down the other drivers code >> > and I see that these two only are used in drivers which use its >> > own irq_domain. Correct me if I am wrong, please. >> > >> > Hope this helps. >> > >> > Thanks in advance. >> >> Thanks a lot. >> This series appears to work, though I sent a separate comment on one >> piece of code. > > Thanks for testing, review and feedback. > > I have resent a complete v3 of this series taking into account > your comments there. > >> However the gpio are numbers >> 480-511 >> 448-479 >> 416-447 >> >> instead of >> 0-31 >> 32-63 >> 64-95 >> >> which would be more normal. >> Maybe when you resubmit I'll raid it with Linus Walleij and see if he >> can explain why I can't have 0-95. > > This change is because the chip.base property changed to be -1 for > dynamic enumeration of the gpio's. In this mail there is some explanation > about it: > > http://lists.infradead.org/pipermail/linux-rpi-kernel/2014-October/001045.html Interesting - thanks for the link. It seems that the goal is to focus more on names than on numbers, and that probably makes sense. It means that we need to make sure that the names are useful. Currently the driver defines 3 gpiochips, one for each bank. # grep . /sys/class/gpio/gpiochip4*/label /sys/class/gpio/gpiochip416/label:1e000600.gpio /sys/class/gpio/gpiochip448/label:1e000600.gpio /sys/class/gpio/gpiochip480/label:1e000600.gpio Unfortunately they all have the same label :-( It would be good if there was a way to add 0, 1, and 2 to the labels, or something like that. In /proc/interrupts we now have: 17: 0 0 0 0 MIPS GIC 19 mt7621, mt7621, mt7621 which is the interrupt from the GPIO controller. It is a little weird that all three banks are named "mt7621" here. We also have: 26: 0 0 0 0 GPIO 18 reset which is the interrupt from GPIO which provides the "reset" button. I suspect that if I had interrupts form two different banks they would both be called "GPIO" which would be a little confusing. We could declare three different 'struct irq_chip' with three different names, but that would be ugly. Hopefully there is a better way. Thanks, NeilBrown signature.asc Description: PGP signature ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
Re: [kbuild-all] [PATCH v3] Drivers: HV: Send one page worth of kmsg dump over Hyper-V during panic
Hi, On 06/11, Sunil Muthuswamy wrote: >I haven't gotten any test build bot reports for the newer version of the >patches that were >Submitted last week. Is there a way to know what's going on there or force a >submission? If there is no reports for the newer version, it's likely that the new version is just fine and currently 0day bot won't notify build success for lkml patches. Thanks, Xiaolong > >- sunil > >> -Original Message- >> From: kbuild test robot >> Sent: Wednesday, May 23, 2018 7:57 PM >> To: Sunil Muthuswamy >> Cc: kbuild-...@01.org; Haiyang Zhang ; >> de...@linuxdriverproject.org; Sunil Muthuswamy >> ; Stephen Hemminger >> >> Subject: Re: [PATCH v3] Drivers: HV: Send one page worth of kmsg dump >> over Hyper-V during panic >> >> Hi Sunil, >> >> Thank you for the patch! Perhaps something to improve: >> >> [auto build test WARNING on linus/master] >> [also build test WARNING on v4.17-rc6 next-20180517] >> [cannot apply to tip/x86/core] >> [if your patch is applied to the wrong git tree, please drop us a note to >> help >> improve the system] >> >> url: >> https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub >> .com%2F0day-ci%2Flinux%2Fcommits%2FSunil-Muthuswamy%2FDrivers-HV- >> Send-one-page-worth-of-kmsg-dump-over-Hyper-V-during- >> panic%2F20180523- >> 035336&data=02%7C01%7Csunilmut%40microsoft.com%7Cea8837620518441 >> e279808d5c1221032%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C6 >> 36627274402211081&sdata=aRiQw64FhftuwLijjsPJigInUHEYBFWWl%2BMcgqI >> yNl4%3D&reserved=0 >> reproduce: >> # apt-get install sparse >> make ARCH=x86_64 allmodconfig >> make C=1 CF=-D__CHECK_ENDIAN__ >> >> >> sparse warnings: (new ones prefixed by >>) >> >> >> drivers/hv/vmbus_drv.c:1028:5: sparse: symbol >> 'sysctl_record_panic_msg' was not declared. Should it be static? >>drivers/hv/vmbus_drv.c:1631:32: sparse: expression using sizeof(void) >>drivers/hv/vmbus_drv.c:1633:32: sparse: expression using sizeof(void) >>include/asm-generic/atomic-instrumented.h:358:24: sparse: cast truncates >> bits from constant value (8010 becomes 10) >>include/asm-generic/atomic-instrumented.h:360:24: sparse: cast truncates >> bits from constant value (8010 becomes 10) >> >> Please review and possibly fold the followup patch. >> >> --- >> 0-DAY kernel test infrastructureOpen Source Technology Center >> https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Flists.01 >> .org%2Fpipermail%2Fkbuild- >> all&data=02%7C01%7Csunilmut%40microsoft.com%7Cea8837620518441e279 >> 808d5c1221032%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C63662 >> 7274402211081&sdata=HhJj%2BMSiTeoaxbBDEdMLquOAO%2B5AuQR0yENX >> BZ%2B77gQ%3D&reserved=0 Intel Corporation >___ >kbuild-all mailing list >kbuild-...@lists.01.org >https://lists.01.org/mailman/listinfo/kbuild-all ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
Re: [PATCH] staging:iio:accel:adis16240: sign extend function avoiding code duplication
On Tue, 2018-06-12 at 01:38 +0200, Karim Eshapa wrote: > Use sign_extend32 kernel function instead of code duplication. > Safe also for 16 bit. Perhaps remove the bits declaration and assignments and just use 9 directly. > diff --git a/drivers/staging/iio/accel/adis16240.c > b/drivers/staging/iio/accel/adis16240.c [] > @@ -292,9 +292,7 @@ static int adis16240_read_raw(struct iio_dev *indio_dev, > ret = adis_read_reg_16(st, addr, &val16); > if (ret) > return ret; > - val16 &= (1 << bits) - 1; > - val16 = (s16)(val16 << (16 - bits)) >> (16 - bits); > - *val = val16; > + *val = sign_extend32(val16, bits - 1); > return IIO_VAL_INT; > case IIO_CHAN_INFO_PEAK: > bits = 10; > @@ -302,9 +300,7 @@ static int adis16240_read_raw(struct iio_dev *indio_dev, > ret = adis_read_reg_16(st, addr, &val16); > if (ret) > return ret; > - val16 &= (1 << bits) - 1; > - val16 = (s16)(val16 << (16 - bits)) >> (16 - bits); > - *val = val16; > + *val = sign_extend32(val16, bits - 1); > return IIO_VAL_INT; > } > return -EINVAL; ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH] staging: pi433: add mutex fixing race condition when accessing tx_cfg
In the PI433_IOC_WR_TX_CFG case in pi433_ioctl, instance->tx_cfg is modified using copy_from_user(&instance->tx_cfg, argp, sizeof(struct pi433_tx_cfg))) without any kind of synchronization. In the case where two threads would execute this same command concurrently the tx_cfg field might enter in an inconsistent state. Add a mutex making sure that the PI433_IOC_WR_TX_CFG case will never be run by several threads concurrently. Signed-off-by: Hugo Lefeuvre --- drivers/staging/pi433/pi433_if.c | 9 - 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/drivers/staging/pi433/pi433_if.c b/drivers/staging/pi433/pi433_if.c index d1e0ddbc79ce..94c9d5482f44 100644 --- a/drivers/staging/pi433/pi433_if.c +++ b/drivers/staging/pi433/pi433_if.c @@ -115,6 +115,7 @@ struct pi433_device { struct pi433_instance { struct pi433_device *device; + struct mutextx_cfg_lock; /* guards race conditions when updating tx config */ struct pi433_tx_cfg tx_cfg; }; @@ -889,9 +890,13 @@ pi433_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) return -EFAULT; break; case PI433_IOC_WR_TX_CFG: + mutex_lock(&instance->tx_cfg_lock); if (copy_from_user(&instance->tx_cfg, argp, - sizeof(struct pi433_tx_cfg))) + sizeof(struct pi433_tx_cfg))) { + mutex_unlock(&instance->tx_cfg_lock); return -EFAULT; + } + mutex_unlock(&instance->tx_cfg_lock); break; case PI433_IOC_RD_RX_CFG: if (copy_to_user(argp, &device->rx_cfg, @@ -966,6 +971,8 @@ static int pi433_open(struct inode *inode, struct file *filp) instance->tx_cfg.bit_rate = 4711; // TODO: fill instance->tx_cfg; + mutex_init(&instance->tx_cfg_lock); + /* instance data as context */ filp->private_data = instance; nonseekable_open(inode, filp); -- 2.17.1 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
Re: [PATCH] staging:iio:accel:adis16240: sign extend function avoiding code duplication
Use sign_extend32 kernel function instead of code duplication. Safe also for 16 bit. Signed-off-by: Karim Eshapa --- drivers/staging/iio/accel/adis16240.c | 11 ++- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/drivers/staging/iio/accel/adis16240.c b/drivers/staging/iio/accel/adis16240.c index fff6d99089cc..24e525f1ef25 100644 --- a/drivers/staging/iio/accel/adis16240.c +++ b/drivers/staging/iio/accel/adis16240.c @@ -250,7 +250,6 @@ static int adis16240_read_raw(struct iio_dev *indio_dev, { struct adis *st = iio_priv(indio_dev); int ret; - int bits; u8 addr; s16 val16; @@ -287,24 +286,18 @@ static int adis16240_read_raw(struct iio_dev *indio_dev, *val = 25000 / 244 - 0x133; /* 25 C = 0x133 */ return IIO_VAL_INT; case IIO_CHAN_INFO_CALIBBIAS: - bits = 10; addr = adis16240_addresses[chan->scan_index][0]; ret = adis_read_reg_16(st, addr, &val16); if (ret) return ret; - val16 &= (1 << bits) - 1; - val16 = (s16)(val16 << (16 - bits)) >> (16 - bits); - *val = val16; + *val = sign_extend32(val16, 9); return IIO_VAL_INT; case IIO_CHAN_INFO_PEAK: - bits = 10; addr = adis16240_addresses[chan->scan_index][1]; ret = adis_read_reg_16(st, addr, &val16); if (ret) return ret; - val16 &= (1 << bits) - 1; - val16 = (s16)(val16 << (16 - bits)) >> (16 - bits); - *val = val16; + *val = sign_extend32(val16, 9); return IIO_VAL_INT; } return -EINVAL; -- 2.17.1 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
Re: [PATCH] staging: speakup: refactor synths array to use a list
Maybe I can do it, I have a kernel with speakup, using 4.9.43. Will the patch fit there? On Mon, 11 Jun 2018 18:57:03 -0400, Samuel Thibault wrote: > > [1 ] > Hello, > > Samuel Thibault, le mer. 06 juin 2018 15:26:28 +0200, a ecrit: > > I'd also rather see it tested in the real wild before committing. Could > > somebody on the speakup mailing list test the patch? (which I have > > re-attached as a file for conveniency). > > Anybody up for testing please? > > If people want to see speakup get mainlined instead of staging, please > help. > > Samuel > [2 patch ] > --- > drivers/staging/speakup/spk_types.h | 2 ++ > drivers/staging/speakup/synth.c | 40 ++--- > 2 files changed, 15 insertions(+), 27 deletions(-) > > diff --git a/drivers/staging/speakup/spk_types.h > b/drivers/staging/speakup/spk_types.h > index 3e082dc3d45c..a2fc72c29894 100644 > --- a/drivers/staging/speakup/spk_types.h > +++ b/drivers/staging/speakup/spk_types.h > @@ -160,6 +160,8 @@ struct spk_io_ops { > }; > > struct spk_synth { > + struct list_head node; > + > const char *name; > const char *version; > const char *long_name; > diff --git a/drivers/staging/speakup/synth.c b/drivers/staging/speakup/synth.c > index 7deeb7061018..25f259ee4ffc 100644 > --- a/drivers/staging/speakup/synth.c > +++ b/drivers/staging/speakup/synth.c > @@ -18,8 +18,7 @@ > #include "speakup.h" > #include "serialio.h" > > -#define MAXSYNTHS 16 /* Max number of synths in array. */ > -static struct spk_synth *synths[MAXSYNTHS + 1]; > +static LIST_HEAD(synths); > struct spk_synth *synth; > char spk_pitch_buff[32] = ""; > static int module_status; > @@ -355,9 +354,8 @@ struct var_t synth_time_vars[] = { > /* called by: speakup_init() */ > int synth_init(char *synth_name) > { > - int i; > int ret = 0; > - struct spk_synth *synth = NULL; > + struct spk_synth *tmp, *synth = NULL; > > if (!synth_name) > return 0; > @@ -371,9 +369,10 @@ int synth_init(char *synth_name) > > mutex_lock(&spk_mutex); > /* First, check if we already have it loaded. */ > - for (i = 0; i < MAXSYNTHS && synths[i]; i++) > - if (strcmp(synths[i]->name, synth_name) == 0) > - synth = synths[i]; > + list_for_each_entry(tmp, &synths, node) { > + if (strcmp(tmp->name, synth_name) == 0) > + synth = tmp; > + } > > /* If we got one, initialize it now. */ > if (synth) > @@ -448,29 +447,23 @@ void synth_release(void) > /* called by: all_driver_init() */ > int synth_add(struct spk_synth *in_synth) > { > - int i; > int status = 0; > + struct spk_synth *tmp; > > mutex_lock(&spk_mutex); > - for (i = 0; i < MAXSYNTHS && synths[i]; i++) > - /* synth_remove() is responsible for rotating the array down */ > - if (in_synth == synths[i]) { > + > + list_for_each_entry(tmp, &synths, node) { > + if (tmp == in_synth) { > mutex_unlock(&spk_mutex); > return 0; > } > - if (i == MAXSYNTHS) { > - pr_warn("Error: attempting to add a synth past end of array\n"); > - mutex_unlock(&spk_mutex); > - return -1; > } > > if (in_synth->startup) > status = do_synth_init(in_synth); > > - if (!status) { > - synths[i++] = in_synth; > - synths[i] = NULL; > - } > + if (!status) > + list_add_tail(&in_synth->node, &synths); > > mutex_unlock(&spk_mutex); > return status; > @@ -479,17 +472,10 @@ EXPORT_SYMBOL_GPL(synth_add); > > void synth_remove(struct spk_synth *in_synth) > { > - int i; > - > mutex_lock(&spk_mutex); > if (synth == in_synth) > synth_release(); > - for (i = 0; synths[i]; i++) { > - if (in_synth == synths[i]) > - break; > - } > - for ( ; synths[i]; i++) /* compress table */ > - synths[i] = synths[i + 1]; > + list_del(&in_synth->node); > module_status = 0; > mutex_unlock(&spk_mutex); > } > -- > 2.17.1 > [3 ] > ___ > Speakup mailing list > spea...@linux-speakup.org > http://linux-speakup.org/cgi-bin/mailman/listinfo/speakup -- Your life is like a penny. You're going to lose it. The question is: How do you spend it? John Covici wb2una cov...@ccs.covici.com ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
Re: [PATCH] staging: speakup: refactor synths array to use a list
On Tue, Jun 12, 2018 at 12:57:03AM +0200, Samuel Thibault wrote: > Anybody up for testing please? > > If people want to see speakup get mainlined instead of staging, please > help. If I understand right, this patch changes how synthesizers are loaded and unloaded through /sys/accessibility/speakup/synth, correct? If yes, then would for example verifying that echo bns >/sys/accessibility/speakup/synth echo soft >/sys/accessibility/speakup/synth does what it should be good enough of a test? If this would not be good enough, please describe exactly what needs testing. I likely won't be able to do a kernel build until this weekend, but should be able to report back next Monday on the 18th. Greg -- web site: http://www.gregn.net gpg public key: http://www.gregn.net/pubkey.asc skype: gregn1 (authorization required, add me to your contacts list first) If we haven't been in touch before, e-mail me before adding me to your contacts. -- Free domains: http://www.eu.org/ or mail dns-mana...@eu.org ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH] staging:iio:accel:adis16240: sign extend function avoiding code duplication
Use sign_extend32 kernel function instead of code duplication. Safe also for 16 bit. Signed-off-by: Karim Eshapa --- drivers/staging/iio/accel/adis16240.c | 8 ++-- 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/drivers/staging/iio/accel/adis16240.c b/drivers/staging/iio/accel/adis16240.c index fff6d99089cc..9adb5badb915 100644 --- a/drivers/staging/iio/accel/adis16240.c +++ b/drivers/staging/iio/accel/adis16240.c @@ -292,9 +292,7 @@ static int adis16240_read_raw(struct iio_dev *indio_dev, ret = adis_read_reg_16(st, addr, &val16); if (ret) return ret; - val16 &= (1 << bits) - 1; - val16 = (s16)(val16 << (16 - bits)) >> (16 - bits); - *val = val16; + *val = sign_extend32(val16, bits - 1); return IIO_VAL_INT; case IIO_CHAN_INFO_PEAK: bits = 10; @@ -302,9 +300,7 @@ static int adis16240_read_raw(struct iio_dev *indio_dev, ret = adis_read_reg_16(st, addr, &val16); if (ret) return ret; - val16 &= (1 << bits) - 1; - val16 = (s16)(val16 << (16 - bits)) >> (16 - bits); - *val = val16; + *val = sign_extend32(val16, bits - 1); return IIO_VAL_INT; } return -EINVAL; -- 2.17.1 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
Re: [PATCH] staging: speakup: refactor synths array to use a list
Hello, Samuel Thibault, le mer. 06 juin 2018 15:26:28 +0200, a ecrit: > I'd also rather see it tested in the real wild before committing. Could > somebody on the speakup mailing list test the patch? (which I have > re-attached as a file for conveniency). Anybody up for testing please? If people want to see speakup get mainlined instead of staging, please help. Samuel --- drivers/staging/speakup/spk_types.h | 2 ++ drivers/staging/speakup/synth.c | 40 ++--- 2 files changed, 15 insertions(+), 27 deletions(-) diff --git a/drivers/staging/speakup/spk_types.h b/drivers/staging/speakup/spk_types.h index 3e082dc3d45c..a2fc72c29894 100644 --- a/drivers/staging/speakup/spk_types.h +++ b/drivers/staging/speakup/spk_types.h @@ -160,6 +160,8 @@ struct spk_io_ops { }; struct spk_synth { + struct list_head node; + const char *name; const char *version; const char *long_name; diff --git a/drivers/staging/speakup/synth.c b/drivers/staging/speakup/synth.c index 7deeb7061018..25f259ee4ffc 100644 --- a/drivers/staging/speakup/synth.c +++ b/drivers/staging/speakup/synth.c @@ -18,8 +18,7 @@ #include "speakup.h" #include "serialio.h" -#define MAXSYNTHS 16 /* Max number of synths in array. */ -static struct spk_synth *synths[MAXSYNTHS + 1]; +static LIST_HEAD(synths); struct spk_synth *synth; char spk_pitch_buff[32] = ""; static int module_status; @@ -355,9 +354,8 @@ struct var_t synth_time_vars[] = { /* called by: speakup_init() */ int synth_init(char *synth_name) { - int i; int ret = 0; - struct spk_synth *synth = NULL; + struct spk_synth *tmp, *synth = NULL; if (!synth_name) return 0; @@ -371,9 +369,10 @@ int synth_init(char *synth_name) mutex_lock(&spk_mutex); /* First, check if we already have it loaded. */ - for (i = 0; i < MAXSYNTHS && synths[i]; i++) - if (strcmp(synths[i]->name, synth_name) == 0) - synth = synths[i]; + list_for_each_entry(tmp, &synths, node) { + if (strcmp(tmp->name, synth_name) == 0) + synth = tmp; + } /* If we got one, initialize it now. */ if (synth) @@ -448,29 +447,23 @@ void synth_release(void) /* called by: all_driver_init() */ int synth_add(struct spk_synth *in_synth) { - int i; int status = 0; + struct spk_synth *tmp; mutex_lock(&spk_mutex); - for (i = 0; i < MAXSYNTHS && synths[i]; i++) - /* synth_remove() is responsible for rotating the array down */ - if (in_synth == synths[i]) { + + list_for_each_entry(tmp, &synths, node) { + if (tmp == in_synth) { mutex_unlock(&spk_mutex); return 0; } - if (i == MAXSYNTHS) { - pr_warn("Error: attempting to add a synth past end of array\n"); - mutex_unlock(&spk_mutex); - return -1; } if (in_synth->startup) status = do_synth_init(in_synth); - if (!status) { - synths[i++] = in_synth; - synths[i] = NULL; - } + if (!status) + list_add_tail(&in_synth->node, &synths); mutex_unlock(&spk_mutex); return status; @@ -479,17 +472,10 @@ EXPORT_SYMBOL_GPL(synth_add); void synth_remove(struct spk_synth *in_synth) { - int i; - mutex_lock(&spk_mutex); if (synth == in_synth) synth_release(); - for (i = 0; synths[i]; i++) { - if (in_synth == synths[i]) - break; - } - for ( ; synths[i]; i++) /* compress table */ - synths[i] = synths[i + 1]; + list_del(&in_synth->node); module_status = 0; mutex_unlock(&spk_mutex); } -- 2.17.1 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
Re: [PATCH v3] staging: lustre: Change return type to vm_fault_t
On Tue, Jun 12, 2018 at 02:30:27AM +0530, Souptick Joarder wrote: > > > > > > If no further comment, we would like to get this patch in 4.18-rc-X. > > > > Why? Is it a regression fix? That's all that is allowed after -rc1. > > No, this is not regression fix. We need to get this into 4.18-rc-1. But > mostly it can't make into linus tree in rc-1 :) Why does it _have_ to get into 4.18-rc1? My tree is long-closed and Linus already has all of my patches in his tree for the staging section of the kernel. > > And have you tried applying it to Linus's current tree? :) > > Last tested on 4.17-rc-6 and it worked fine. Let me verify in current tree. Try it, you might be surprised :) greg k-h ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
Re: [PATCH v3] staging: lustre: Change return type to vm_fault_t
On Tue, Jun 12, 2018 at 02:00:47AM +0530, Souptick Joarder wrote: > On Mon, May 21, 2018 at 11:39 PM, Souptick Joarder > wrote: > > Use new return type vm_fault_t for fault handler. For > > now, this is just documenting that the function returns > > a VM_FAULT value rather than an errno. Once all instances > > are converted, vm_fault_t will become a distinct type. > > > > Ref-> commit 1c8f422059ae ("mm: change return type to > > vm_fault_t") was added in 4.17-rc1 to introduce the new > > typedef vm_fault_t. Currently we are making change to all > > drivers to return vm_fault_t for page fault handlers. As > > part of that lustre driver is also getting changed to > > return vm_fault_t type. > > > > Signed-off-by: Souptick Joarder > > --- > > v2: updated the change log > > > > v3: updated the change log > > > > drivers/staging/lustre/lustre/llite/llite_mmap.c | 35 > > > > 1 file changed, 18 insertions(+), 17 deletions(-) > > > > diff --git a/drivers/staging/lustre/lustre/llite/llite_mmap.c > > b/drivers/staging/lustre/lustre/llite/llite_mmap.c > > index c0533bd..5b8fd10 100644 > > --- a/drivers/staging/lustre/lustre/llite/llite_mmap.c > > +++ b/drivers/staging/lustre/lustre/llite/llite_mmap.c > > @@ -231,7 +231,7 @@ static int ll_page_mkwrite0(struct vm_area_struct *vma, > > struct page *vmpage, > > return result; > > } > > > > -static inline int to_fault_error(int result) > > +static inline vm_fault_t to_fault_error(int result) > > { > > switch (result) { > > case 0: > > @@ -261,7 +261,7 @@ static inline int to_fault_error(int result) > > * \retval VM_FAULT_ERROR on general error > > * \retval NOPAGE_OOM not have memory for allocate new page > > */ > > -static int ll_fault0(struct vm_area_struct *vma, struct vm_fault *vmf) > > +static vm_fault_t ll_fault0(struct vm_area_struct *vma, struct vm_fault > > *vmf) > > { > > struct lu_env *env; > > struct cl_io*io; > > @@ -269,16 +269,16 @@ static int ll_fault0(struct vm_area_struct *vma, > > struct vm_fault *vmf) > > struct page *vmpage; > > unsigned long ra_flags; > > int result = 0; > > - int fault_ret = 0; > > + vm_fault_t fault_ret = 0; > > u16 refcheck; > > > > env = cl_env_get(&refcheck); > > if (IS_ERR(env)) > > - return PTR_ERR(env); > > + return VM_FAULT_ERROR; > > > > io = ll_fault_io_init(env, vma, vmf->pgoff, &ra_flags); > > if (IS_ERR(io)) { > > - result = to_fault_error(PTR_ERR(io)); > > + fault_ret = to_fault_error(PTR_ERR(io)); > > goto out; > > } > > > > @@ -319,15 +319,15 @@ static int ll_fault0(struct vm_area_struct *vma, > > struct vm_fault *vmf) > > if (result != 0 && !(fault_ret & VM_FAULT_RETRY)) > > fault_ret |= to_fault_error(result); > > > > - CDEBUG(D_MMAP, "%s fault %d/%d\n", current->comm, fault_ret, > > result); > > + CDEBUG(D_MMAP, "%s fault %x/%d\n", current->comm, fault_ret, > > result); > > return fault_ret; > > } > > > > -static int ll_fault(struct vm_fault *vmf) > > +static vm_fault_t ll_fault(struct vm_fault *vmf) > > { > > int count = 0; > > bool printed = false; > > - int result; > > + vm_fault_t result; > > sigset_t set; > > > > /* Only SIGKILL and SIGTERM are allowed for fault/nopage/mkwrite > > @@ -364,18 +364,19 @@ static int ll_fault(struct vm_fault *vmf) > > return result; > > } > > > > -static int ll_page_mkwrite(struct vm_fault *vmf) > > +static vm_fault_t ll_page_mkwrite(struct vm_fault *vmf) > > { > > struct vm_area_struct *vma = vmf->vma; > > int count = 0; > > bool printed = false; > > bool retry; > > - int result; > > + int err; > > + vm_fault_t ret; > > > > file_update_time(vma->vm_file); > > do { > > retry = false; > > - result = ll_page_mkwrite0(vma, vmf->page, &retry); > > + err = ll_page_mkwrite0(vma, vmf->page, &retry); > > > > if (!printed && ++count > 16) { > > const struct dentry *de = > > vma->vm_file->f_path.dentry; > > @@ -387,25 +388,25 @@ static int ll_page_mkwrite(struct vm_fault *vmf) > > } > > } while (retry); > > > > - switch (result) { > > + switch (err) { > > case 0: > > LASSERT(PageLocked(vmf->page)); > > - result = VM_FAULT_LOCKED; > > + ret = VM_FAULT_LOCKED; > > break; > > case -ENODATA: > > case -EAGAIN: > > case -EFAULT: > > - result = VM_FAULT_NOPAGE; > > + ret = VM_FAULT_NOPAGE; > > break; > > case -ENOMEM: > > - result = VM_FAULT_OOM;
Re: [PATCH v4 2/2] media: staging/imx: fill vb2_v4l2_buffer sequence entry
Hello *, On Fri, 16 Mar 2018 10:05:44 -0700, Steve Longerbeam wrote: > Reviewed-by: Steve Longerbeam Ping? Anybody taking this one? Regards, Peter > > > On 03/15/2018 12:13 PM, Peter Seiderer wrote: > > - enables gstreamer v4l2src lost frame detection, e.g: > > > >0:00:08.685185668 348 0x54f520 WARN v4l2src > > gstv4l2src.c:970:gst_v4l2src_create: lost frames detected: count > > = 141 - ts: 0:00:08.330177332 > > > > - fixes v4l2-compliance test failure: > > > >Streaming ioctls: > >test read/write: OK (Not Supported) > >Video Capture: > >Buffer: 0 Sequence: 0 Field: None Timestamp: 92.991450s > >Buffer: 1 Sequence: 0 Field: None Timestamp: 93.008135s > >fail: v4l2-test-buffers.cpp(294): (int)g_sequence() < > > seq.last_seq + 1 > >fail: v4l2-test-buffers.cpp(707): buf.check(q, last_seq) > > > > Signed-off-by: Peter Seiderer > > --- > > Changes in v2: > >- fill vb2_v4l2_buffer sequence entry in imx-ic-prpencvf too > > (suggested by Steve Longerbeam) > > > > Changes in v3: > >- add changelog (suggested by Greg Kroah-Hartman, Fabio Estevam > > and Dan Carpenter) and patch history > >- use u32 (instead of __u32) (suggested by Dan Carpenter) > >- let sequence counter start with zero, keeping v4l2-compliance > > testing happy (needs additional setting of field to a valid > > value, patch will follow soon) > > > > Changes in v4: > >- add v4l2-compliance test failure to changelog > >- reorder frame_sequence increment and assignement to > > avoid -1 as start value (suggeted by Steve Longerbeam) > > --- > > drivers/staging/media/imx/imx-ic-prpencvf.c | 4 > > drivers/staging/media/imx/imx-media-csi.c | 4 > > 2 files changed, 8 insertions(+) > > > > diff --git a/drivers/staging/media/imx/imx-ic-prpencvf.c > > b/drivers/staging/media/imx/imx-ic-prpencvf.c > > index ffeb017c73b2..28f41caba05d 100644 > > --- a/drivers/staging/media/imx/imx-ic-prpencvf.c > > +++ b/drivers/staging/media/imx/imx-ic-prpencvf.c > > @@ -103,6 +103,7 @@ struct prp_priv { > > int nfb4eof_irq; > > > > int stream_count; > > + u32 frame_sequence; /* frame sequence counter */ > > bool last_eof; /* waiting for last EOF at stream off */ > > bool nfb4eof;/* NFB4EOF encountered during streaming */ > > struct completion last_eof_comp; > > @@ -211,12 +212,14 @@ static void prp_vb2_buf_done(struct prp_priv *priv, > > struct ipuv3_channel *ch) > > done = priv->active_vb2_buf[priv->ipu_buf_num]; > > if (done) { > > done->vbuf.field = vdev->fmt.fmt.pix.field; > > + done->vbuf.sequence = priv->frame_sequence; > > vb = &done->vbuf.vb2_buf; > > vb->timestamp = ktime_get_ns(); > > vb2_buffer_done(vb, priv->nfb4eof ? > > VB2_BUF_STATE_ERROR : VB2_BUF_STATE_DONE); > > } > > > > + priv->frame_sequence++; > > priv->nfb4eof = false; > > > > /* get next queued buffer */ > > @@ -638,6 +641,7 @@ static int prp_start(struct prp_priv *priv) > > > > /* init EOF completion waitq */ > > init_completion(&priv->last_eof_comp); > > + priv->frame_sequence = 0; > > priv->last_eof = false; > > priv->nfb4eof = false; > > > > diff --git a/drivers/staging/media/imx/imx-media-csi.c > > b/drivers/staging/media/imx/imx-media-csi.c > > index 5f69117b5811..3f2ce05848f3 100644 > > --- a/drivers/staging/media/imx/imx-media-csi.c > > +++ b/drivers/staging/media/imx/imx-media-csi.c > > @@ -111,6 +111,7 @@ struct csi_priv { > > struct v4l2_ctrl_handler ctrl_hdlr; > > > > int stream_count; /* streaming counter */ > > + u32 frame_sequence; /* frame sequence counter */ > > bool last_eof; /* waiting for last EOF at stream off */ > > bool nfb4eof;/* NFB4EOF encountered during streaming */ > > struct completion last_eof_comp; > > @@ -237,12 +238,14 @@ static void csi_vb2_buf_done(struct csi_priv *priv) > > done = priv->active_vb2_buf[priv->ipu_buf_num]; > > if (done) { > > done->vbuf.field = vdev->fmt.fmt.pix.field; > > + done->vbuf.sequence = priv->frame_sequence; > > vb = &done->vbuf.vb2_buf; > > vb->timestamp = ktime_get_ns(); > > vb2_buffer_done(vb, priv->nfb4eof ? > > VB2_BUF_STATE_ERROR : VB2_BUF_STATE_DONE); > > } > > > > + priv->frame_sequence++; > > priv->nfb4eof = false; > > > > /* get next queued buffer */ > > @@ -544,6 +547,7 @@ static int csi_idmac_start(struct csi_priv *priv) > > > > /* init EOF completion waitq */ > > init_completion(&priv->last_eof_comp); > > + priv->frame_sequence = 0; > > priv->last_eof = false; > > priv->nfb4eof = false; > > > ___ devel mailing list de...@linuxdriverproject.org http://drive
Re: [PATCH v4 1/2] media: staging/imx: fill vb2_v4l2_buffer field entry
Hello *, On Fri, 16 Mar 2018 10:02:47 -0700, Steve Longerbeam wrote: > Reviewed-by: Steve Longerbeam Ping? Anybody taking this one? Regards, Peter > > > On 03/15/2018 12:13 PM, Peter Seiderer wrote: > > - fixes gstreamer v4l2src warning: > > > >0:00:00.716640334 349 0x164f720 WARN v4l2bufferpool > > gstv4l2bufferpool.c:1195:gst_v4l2_buffer_pool_dqbuf: > > Driver should never set v4l2_buffer.field to ANY > > > > - fixes v4l2-compliance test failure: > > > >Streaming ioctls: > >test read/write: OK (Not Supported) > >Video Capture: > >Buffer: 0 Sequence: 0 Field: Any Timestamp: 58.383658s > >fail: v4l2-test-buffers.cpp(297): g_field() == > > V4L2_FIELD_ANY > > > > Signed-off-by: Peter Seiderer > > --- > > Changes in v4: > >- new patch (put first because patch is needed to advance with > > the v4l2-compliance test), thanks to Philipp Zabel > > for suggested solution for the right > > field value source > > --- > > drivers/staging/media/imx/imx-ic-prpencvf.c | 1 + > > drivers/staging/media/imx/imx-media-csi.c | 1 + > > 2 files changed, 2 insertions(+) > > > > diff --git a/drivers/staging/media/imx/imx-ic-prpencvf.c > > b/drivers/staging/media/imx/imx-ic-prpencvf.c > > index ae453fd422f0..ffeb017c73b2 100644 > > --- a/drivers/staging/media/imx/imx-ic-prpencvf.c > > +++ b/drivers/staging/media/imx/imx-ic-prpencvf.c > > @@ -210,6 +210,7 @@ static void prp_vb2_buf_done(struct prp_priv *priv, > > struct ipuv3_channel *ch) > > > > done = priv->active_vb2_buf[priv->ipu_buf_num]; > > if (done) { > > + done->vbuf.field = vdev->fmt.fmt.pix.field; > > vb = &done->vbuf.vb2_buf; > > vb->timestamp = ktime_get_ns(); > > vb2_buffer_done(vb, priv->nfb4eof ? > > diff --git a/drivers/staging/media/imx/imx-media-csi.c > > b/drivers/staging/media/imx/imx-media-csi.c > > index 5a195f80a24d..5f69117b5811 100644 > > --- a/drivers/staging/media/imx/imx-media-csi.c > > +++ b/drivers/staging/media/imx/imx-media-csi.c > > @@ -236,6 +236,7 @@ static void csi_vb2_buf_done(struct csi_priv *priv) > > > > done = priv->active_vb2_buf[priv->ipu_buf_num]; > > if (done) { > > + done->vbuf.field = vdev->fmt.fmt.pix.field; > > vb = &done->vbuf.vb2_buf; > > vb->timestamp = ktime_get_ns(); > > vb2_buffer_done(vb, priv->nfb4eof ? > ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
Re: [PATCH v3] staging: lustre: Change return type to vm_fault_t
On Mon, May 21, 2018 at 11:39 PM, Souptick Joarder wrote: > Use new return type vm_fault_t for fault handler. For > now, this is just documenting that the function returns > a VM_FAULT value rather than an errno. Once all instances > are converted, vm_fault_t will become a distinct type. > > Ref-> commit 1c8f422059ae ("mm: change return type to > vm_fault_t") was added in 4.17-rc1 to introduce the new > typedef vm_fault_t. Currently we are making change to all > drivers to return vm_fault_t for page fault handlers. As > part of that lustre driver is also getting changed to > return vm_fault_t type. > > Signed-off-by: Souptick Joarder > --- > v2: updated the change log > > v3: updated the change log > > drivers/staging/lustre/lustre/llite/llite_mmap.c | 35 > > 1 file changed, 18 insertions(+), 17 deletions(-) > > diff --git a/drivers/staging/lustre/lustre/llite/llite_mmap.c > b/drivers/staging/lustre/lustre/llite/llite_mmap.c > index c0533bd..5b8fd10 100644 > --- a/drivers/staging/lustre/lustre/llite/llite_mmap.c > +++ b/drivers/staging/lustre/lustre/llite/llite_mmap.c > @@ -231,7 +231,7 @@ static int ll_page_mkwrite0(struct vm_area_struct *vma, > struct page *vmpage, > return result; > } > > -static inline int to_fault_error(int result) > +static inline vm_fault_t to_fault_error(int result) > { > switch (result) { > case 0: > @@ -261,7 +261,7 @@ static inline int to_fault_error(int result) > * \retval VM_FAULT_ERROR on general error > * \retval NOPAGE_OOM not have memory for allocate new page > */ > -static int ll_fault0(struct vm_area_struct *vma, struct vm_fault *vmf) > +static vm_fault_t ll_fault0(struct vm_area_struct *vma, struct vm_fault *vmf) > { > struct lu_env *env; > struct cl_io*io; > @@ -269,16 +269,16 @@ static int ll_fault0(struct vm_area_struct *vma, struct > vm_fault *vmf) > struct page *vmpage; > unsigned long ra_flags; > int result = 0; > - int fault_ret = 0; > + vm_fault_t fault_ret = 0; > u16 refcheck; > > env = cl_env_get(&refcheck); > if (IS_ERR(env)) > - return PTR_ERR(env); > + return VM_FAULT_ERROR; > > io = ll_fault_io_init(env, vma, vmf->pgoff, &ra_flags); > if (IS_ERR(io)) { > - result = to_fault_error(PTR_ERR(io)); > + fault_ret = to_fault_error(PTR_ERR(io)); > goto out; > } > > @@ -319,15 +319,15 @@ static int ll_fault0(struct vm_area_struct *vma, struct > vm_fault *vmf) > if (result != 0 && !(fault_ret & VM_FAULT_RETRY)) > fault_ret |= to_fault_error(result); > > - CDEBUG(D_MMAP, "%s fault %d/%d\n", current->comm, fault_ret, result); > + CDEBUG(D_MMAP, "%s fault %x/%d\n", current->comm, fault_ret, result); > return fault_ret; > } > > -static int ll_fault(struct vm_fault *vmf) > +static vm_fault_t ll_fault(struct vm_fault *vmf) > { > int count = 0; > bool printed = false; > - int result; > + vm_fault_t result; > sigset_t set; > > /* Only SIGKILL and SIGTERM are allowed for fault/nopage/mkwrite > @@ -364,18 +364,19 @@ static int ll_fault(struct vm_fault *vmf) > return result; > } > > -static int ll_page_mkwrite(struct vm_fault *vmf) > +static vm_fault_t ll_page_mkwrite(struct vm_fault *vmf) > { > struct vm_area_struct *vma = vmf->vma; > int count = 0; > bool printed = false; > bool retry; > - int result; > + int err; > + vm_fault_t ret; > > file_update_time(vma->vm_file); > do { > retry = false; > - result = ll_page_mkwrite0(vma, vmf->page, &retry); > + err = ll_page_mkwrite0(vma, vmf->page, &retry); > > if (!printed && ++count > 16) { > const struct dentry *de = vma->vm_file->f_path.dentry; > @@ -387,25 +388,25 @@ static int ll_page_mkwrite(struct vm_fault *vmf) > } > } while (retry); > > - switch (result) { > + switch (err) { > case 0: > LASSERT(PageLocked(vmf->page)); > - result = VM_FAULT_LOCKED; > + ret = VM_FAULT_LOCKED; > break; > case -ENODATA: > case -EAGAIN: > case -EFAULT: > - result = VM_FAULT_NOPAGE; > + ret = VM_FAULT_NOPAGE; > break; > case -ENOMEM: > - result = VM_FAULT_OOM; > + ret = VM_FAULT_OOM; > break; > default: > - result = VM_FAULT_SIGBUS; > + ret = VM_FAULT_SIGBUS; > break; > } > > - return result; > + return ret; > } > > /** > -- > 1.9.1 > If no further comment, we would like to get this patch in 4.18-rc
[PATCH 12/34] staging: mt7621-mmc: Remove register debugging structures
Current code has structures for all the registers of the device, but these are never used and there are also masks for all of them, so these structures do not contain any useful information. Signed-off-by: Christian Lütke-Stetzkamp --- drivers/staging/mt7621-mmc/mt6575_sd.h | 411 - 1 file changed, 411 deletions(-) diff --git a/drivers/staging/mt7621-mmc/mt6575_sd.h b/drivers/staging/mt7621-mmc/mt6575_sd.h index 375cb109806e..07f48d526888 100644 --- a/drivers/staging/mt7621-mmc/mt6575_sd.h +++ b/drivers/staging/mt7621-mmc/mt6575_sd.h @@ -478,417 +478,6 @@ struct bd { u32 rsv3:16; }; -/*--*/ -/* Register Debugging Structure */ -/*--*/ - -struct msdc_cfg_reg { - u32 msdc:1; - u32 ckpwn:1; - u32 rst:1; - u32 pio:1; - u32 ckdrven:1; - u32 start18v:1; - u32 pass18v:1; - u32 ckstb:1; - u32 ckdiv:8; - u32 ckmod:2; - u32 pad:14; -}; - -struct msdc_iocon_reg { - u32 sdr104cksel:1; - u32 rsmpl:1; - u32 dsmpl:1; - u32 ddlysel:1; - u32 ddr50ckd:1; - u32 dsplsel:1; - u32 pad1:10; - u32 d0spl:1; - u32 d1spl:1; - u32 d2spl:1; - u32 d3spl:1; - u32 d4spl:1; - u32 d5spl:1; - u32 d6spl:1; - u32 d7spl:1; - u32 riscsz:1; - u32 pad2:7; -}; - -struct msdc_ps_reg { - u32 cden:1; - u32 cdsts:1; - u32 pad1:10; - u32 cddebounce:4; - u32 dat:8; - u32 cmd:1; - u32 pad2:6; - u32 wp:1; -}; - -struct msdc_int_reg { - u32 mmcirq:1; - u32 cdsc:1; - u32 pad1:1; - u32 atocmdrdy:1; - u32 atocmdtmo:1; - u32 atocmdcrc:1; - u32 dmaqempty:1; - u32 sdioirq:1; - u32 cmdrdy:1; - u32 cmdtmo:1; - u32 rspcrc:1; - u32 csta:1; - u32 xfercomp:1; - u32 dxferdone:1; - u32 dattmo:1; - u32 datcrc:1; - u32 atocmd19done:1; - u32 pad2:15; -}; - -struct msdc_inten_reg { - u32 mmcirq:1; - u32 cdsc:1; - u32 pad1:1; - u32 atocmdrdy:1; - u32 atocmdtmo:1; - u32 atocmdcrc:1; - u32 dmaqempty:1; - u32 sdioirq:1; - u32 cmdrdy:1; - u32 cmdtmo:1; - u32 rspcrc:1; - u32 csta:1; - u32 xfercomp:1; - u32 dxferdone:1; - u32 dattmo:1; - u32 datcrc:1; - u32 atocmd19done:1; - u32 pad2:15; -}; - -struct msdc_fifocs_reg { - u32 rxcnt:8; - u32 pad1:8; - u32 txcnt:8; - u32 pad2:7; - u32 clr:1; -}; - -struct msdc_txdat_reg { - u32 val; -}; - -struct msdc_rxdat_reg { - u32 val; -}; - -struct sdc_cfg_reg { - u32 sdiowkup:1; - u32 inswkup:1; - u32 pad1:14; - u32 buswidth:2; - u32 pad2:1; - u32 sdio:1; - u32 sdioide:1; - u32 intblkgap:1; - u32 pad4:2; - u32 dtoc:8; -}; - -struct sdc_cmd_reg { - u32 cmd:6; - u32 brk:1; - u32 rsptyp:3; - u32 pad1:1; - u32 dtype:2; - u32 rw:1; - u32 stop:1; - u32 goirq:1; - u32 blklen:12; - u32 atocmd:2; - u32 volswth:1; - u32 pad2:1; -}; - -struct sdc_arg_reg { - u32 arg; -}; - -struct sdc_sts_reg { - u32 sdcbusy:1; - u32 cmdbusy:1; - u32 pad:29; - u32 swrcmpl:1; -}; - -struct sdc_resp0_reg { - u32 val; -}; - -struct sdc_resp1_reg { - u32 val; -}; - -struct sdc_resp2_reg { - u32 val; -}; - -struct sdc_resp3_reg { - u32 val; -}; - -struct sdc_blknum_reg { - u32 num; -}; - -struct sdc_csts_reg { - u32 sts; -}; - -struct sdc_cstsen_reg { - u32 sts; -}; - -struct sdc_datcrcsts_reg { - u32 datcrcsts:8; - u32 ddrcrcsts:4; - u32 pad:20; -}; - -struct emmc_cfg0_reg { - u32 bootstart:1; - u32 bootstop:1; - u32 bootmode:1; - u32 pad1:9; - u32 bootwaidly:3; - u32 bootsupp:1; - u32 pad2:16; -}; - -struct emmc_cfg1_reg { - u32 bootcrctmc:16; - u32 pad:4; - u32 bootacktmc:12; -}; - -struct emmc_sts_reg { - u32 bootcrcerr:1; - u32 bootackerr:1; - u32 bootdattmo:1; - u32 bootacktmo:1; - u32 bootupstate:1; - u32 bootackrcv:1; - u32 bootdatrcv:1; - u32 pad:25; -}; - -struct emmc_iocon_reg { - u32 bootrst:1; - u32 pad:31; -}; - -struct msdc_acmd_resp_reg { - u32 val; -}; - -struct msdc_acmd19_trg_reg { - u32 tunesel:4; - u32 pad:28; -}; - -struct msdc_acmd19_sts_reg { - u32 val; -}; - -struct msdc_dma_sa_reg { - u32 addr; -}; - -struct msdc_dma_ca_reg { - u32 addr; -}; - -struct msdc_dma_ctrl_reg { - u32 start:1; - u32 stop:1; - u32 resume:1; - u32 pad1:5; - u32 mode:1; - u32
[PATCH 15/34] staging: mt7621-mmc: Refactor dma setup process
Current code uses two functions for dma setup, msdc_dma_config and msdc_dma_setup. By now msdc_dma_setup is nearly empty and mainly calls msdc_dma_config, so the later one can be inline into the first one. While doing this there is also some refactoring done. Signed-off-by: Christian Lütke-Stetzkamp --- drivers/staging/mt7621-mmc/sd.c | 34 +- 1 file changed, 13 insertions(+), 21 deletions(-) diff --git a/drivers/staging/mt7621-mmc/sd.c b/drivers/staging/mt7621-mmc/sd.c index 3066fa3799ac..923b0687918d 100644 --- a/drivers/staging/mt7621-mmc/sd.c +++ b/drivers/staging/mt7621-mmc/sd.c @@ -1030,18 +1030,24 @@ static u8 msdc_dma_calcs(u8 *buf, u32 len) return 0xFF - (u8)sum; } -/* gpd bd setup + dma registers */ -static void msdc_dma_config(struct msdc_host *host, struct msdc_dma *dma) +static void msdc_dma_setup(struct msdc_host *host, struct msdc_dma *dma, + struct scatterlist *sg_cmd, unsigned int sglen) { void __iomem *base = host->base; - //u32 i, j, num, bdlen, arg, xfersz; - u32 j, num; struct scatterlist *sg; struct gpd *gpd; struct bd *bd; + u32 j, num; + + BUG_ON(sglen > MAX_BD_NUM); /* not support currently */ + + dma->sg = sg_cmd; + dma->sglen = sglen; + + N_MSG(DMA, "DMA sglen<%d> xfersz<%d>", sglen, host->xfer_size); /* calculate the required number of gpd */ - num = (dma->sglen + MAX_BD_PER_GPD - 1) / MAX_BD_PER_GPD; + num = (sglen + MAX_BD_PER_GPD - 1) / MAX_BD_PER_GPD; BUG_ON(num != 1); gpd = dma->gpd; @@ -1055,13 +1061,13 @@ static void msdc_dma_config(struct msdc_host *host, struct msdc_dma *dma) gpd->chksum = msdc_dma_calcs((u8 *)gpd, 16); /* modify bd*/ - for_each_sg(dma->sg, sg, dma->sglen, j) { + for_each_sg(sg_cmd, sg, sglen, j) { bd[j].blkpad = 0; bd[j].dwpad = 0; bd[j].ptr = (void *)sg_dma_address(sg); bd[j].buflen = sg_dma_len(sg); - if (j == dma->sglen - 1) + if (j == sglen - 1) bd[j].eol = 1; /* the last bd */ else bd[j].eol = 0; @@ -1080,20 +1086,6 @@ static void msdc_dma_config(struct msdc_host *host, struct msdc_dma *dma) N_MSG(DMA, "DMA_CTRL = 0x%x", readl(MSDC_DMA_CTRL)); N_MSG(DMA, "DMA_CFG = 0x%x", readl(MSDC_DMA_CFG)); N_MSG(DMA, "DMA_SA = 0x%x", readl(MSDC_DMA_SA)); - -} - -static void msdc_dma_setup(struct msdc_host *host, struct msdc_dma *dma, - struct scatterlist *sg, unsigned int sglen) -{ - BUG_ON(sglen > MAX_BD_NUM); /* not support currently */ - - dma->sg = sg; - dma->sglen = sglen; - - N_MSG(DMA, "DMA sglen<%d> xfersz<%d>", dma->sglen, host->xfer_size); - - msdc_dma_config(host, dma); } static int msdc_do_request(struct mmc_host *mmc, struct mmc_request *mrq) -- 2.16.1 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH 01/34] staging: mt7621-mmc: Remove unused variable in msdc_command_resp
The variable resp in msdc_command_resp is once set and never read, delete it. Signed-off-by: Christian Lütke-Stetzkamp --- drivers/staging/mt7621-mmc/sd.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/drivers/staging/mt7621-mmc/sd.c b/drivers/staging/mt7621-mmc/sd.c index 648a2dd1436e..7cfadb41a53d 100644 --- a/drivers/staging/mt7621-mmc/sd.c +++ b/drivers/staging/mt7621-mmc/sd.c @@ -886,13 +886,10 @@ static unsigned int msdc_command_resp(struct msdc_host *host, void __iomem *base = host->base; u32 opcode = cmd->opcode; //u32 rawcmd; - u32 resp; u32 wints = MSDC_INT_CMDRDY | MSDC_INT_RSPCRCERR | MSDC_INT_CMDTMO | MSDC_INT_ACMDRDY | MSDC_INT_ACMDCRCERR | MSDC_INT_ACMDTMO | MSDC_INT_ACMD19_DONE; - resp = host->cmd_rsp; - BUG_ON(in_interrupt()); //init_completion(&host->cmd_done); //sdr_set_bits(MSDC_INTEN, wints); -- 2.16.1 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH 21/34] staging: mt7621-mmc: Remove unused macro msdc_retry
The macro msdc_retry is never used, so remove it. Signed-off-by: Christian Lütke-Stetzkamp --- drivers/staging/mt7621-mmc/sd.c | 13 - 1 file changed, 13 deletions(-) diff --git a/drivers/staging/mt7621-mmc/sd.c b/drivers/staging/mt7621-mmc/sd.c index 01a925ae662e..0e94bb0d5927 100644 --- a/drivers/staging/mt7621-mmc/sd.c +++ b/drivers/staging/mt7621-mmc/sd.c @@ -149,19 +149,6 @@ static int msdc_rsp[] = { #define msdc_dma_on()sdr_clr_bits(MSDC_CFG, MSDC_CFG_PIO) -#define msdc_retry(expr, retry, cnt) \ - do {\ - int backup = cnt; \ - while (retry) { \ - if (!(expr))\ - break; \ - if (cnt-- == 0) { \ - retry--; mdelay(1); cnt = backup; \ - } \ - } \ - WARN_ON(retry == 0);\ - } while (0) - static void msdc_reset_hw(struct msdc_host *host) { void __iomem *base = host->base; -- 2.16.1 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH 06/34] staging: mt7621-mmc: Remove unused macro msdc_txfifocnt
The macro msdc_txfifocnt is never used, so remove it. Signed-off-by: Christian Lütke-Stetzkamp --- drivers/staging/mt7621-mmc/sd.c | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/staging/mt7621-mmc/sd.c b/drivers/staging/mt7621-mmc/sd.c index 0f9cba918586..c6aced0c0a6a 100644 --- a/drivers/staging/mt7621-mmc/sd.c +++ b/drivers/staging/mt7621-mmc/sd.c @@ -147,7 +147,6 @@ static int msdc_rsp[] = { 7, /* RESP_R1b */ }; -#define msdc_txfifocnt() ((sdr_read32(MSDC_FIFOCS) & MSDC_FIFOCS_TXCNT) >> 16) #define msdc_rxfifocnt() ((sdr_read32(MSDC_FIFOCS) & MSDC_FIFOCS_RXCNT) >> 0) #define msdc_dma_on()sdr_clr_bits(MSDC_CFG, MSDC_CFG_PIO) -- 2.16.1 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH 23/34] staging: mt7621-mmc: Remove unused variable from msdc_tune_request
The variable cmd in the function msdc_tune_request is set but never used, so remove it. Signed-off-by: Christian Lütke-Stetzkamp --- drivers/staging/mt7621-mmc/sd.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/drivers/staging/mt7621-mmc/sd.c b/drivers/staging/mt7621-mmc/sd.c index e99a12002646..c5139a20e10f 100644 --- a/drivers/staging/mt7621-mmc/sd.c +++ b/drivers/staging/mt7621-mmc/sd.c @@ -1556,12 +1556,10 @@ static int msdc_check_busy(struct mmc_host *mmc, struct msdc_host *host) static int msdc_tune_request(struct mmc_host *mmc, struct mmc_request *mrq) { struct msdc_host *host = mmc_priv(mmc); - struct mmc_command *cmd; struct mmc_data *data; //u32 base = host->base; int ret = 0, read; - cmd = mrq->cmd; data = mrq->cmd->data; read = data->flags & MMC_DATA_READ ? 1 : 0; -- 2.16.1 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH 25/34] staging: mt7621-mmc: Cleanup source of base address for io
Currently the base address for all io operations is hidden behind a macro, REG_ADD. This macro uses the symbol "base" as the base address and all functions set base = host->base. This is hard to read, so the whole wrapping is removed and host->base is directly inserted in the io access. Signed-off-by: Christian Lütke-Stetzkamp --- drivers/staging/mt7621-mmc/mt6575_sd.h | 161 -- drivers/staging/mt7621-mmc/sd.c| 378 + 2 files changed, 236 insertions(+), 303 deletions(-) diff --git a/drivers/staging/mt7621-mmc/mt6575_sd.h b/drivers/staging/mt7621-mmc/mt6575_sd.h index 9b6cd6db37df..4e287c140acb 100644 --- a/drivers/staging/mt7621-mmc/mt6575_sd.h +++ b/drivers/staging/mt7621-mmc/mt6575_sd.h @@ -41,11 +41,6 @@ // #include /* --- by chhung */ -/*--*/ -/* Common Macro */ -/*--*/ -#define REG_ADDR(x) (base + OFFSET_##x) - /*--*/ /* Common Definition*/ /*--*/ @@ -95,117 +90,51 @@ enum { /*--*/ /* Register Offset */ /*--*/ -#define OFFSET_MSDC_CFG (0x0) -#define OFFSET_MSDC_IOCON (0x04) -#define OFFSET_MSDC_PS (0x08) -#define OFFSET_MSDC_INT (0x0c) -#define OFFSET_MSDC_INTEN (0x10) -#define OFFSET_MSDC_FIFOCS (0x14) -#define OFFSET_MSDC_TXDATA (0x18) -#define OFFSET_MSDC_RXDATA (0x1c) -#define OFFSET_SDC_CFG (0x30) -#define OFFSET_SDC_CMD (0x34) -#define OFFSET_SDC_ARG (0x38) -#define OFFSET_SDC_STS (0x3c) -#define OFFSET_SDC_RESP0(0x40) -#define OFFSET_SDC_RESP1(0x44) -#define OFFSET_SDC_RESP2(0x48) -#define OFFSET_SDC_RESP3(0x4c) -#define OFFSET_SDC_BLK_NUM (0x50) -#define OFFSET_SDC_CSTS (0x58) -#define OFFSET_SDC_CSTS_EN (0x5c) -#define OFFSET_SDC_DCRC_STS (0x60) -#define OFFSET_EMMC_CFG0(0x70) -#define OFFSET_EMMC_CFG1(0x74) -#define OFFSET_EMMC_STS (0x78) -#define OFFSET_EMMC_IOCON (0x7c) -#define OFFSET_SDC_ACMD_RESP(0x80) -#define OFFSET_SDC_ACMD19_TRG (0x84) -#define OFFSET_SDC_ACMD19_STS (0x88) -#define OFFSET_MSDC_DMA_SA (0x90) -#define OFFSET_MSDC_DMA_CA (0x94) -#define OFFSET_MSDC_DMA_CTRL(0x98) -#define OFFSET_MSDC_DMA_CFG (0x9c) -#define OFFSET_MSDC_DBG_SEL (0xa0) -#define OFFSET_MSDC_DBG_OUT (0xa4) -#define OFFSET_MSDC_PATCH_BIT (0xb0) -#define OFFSET_MSDC_PATCH_BIT1 (0xb4) -#define OFFSET_MSDC_PAD_CTL0(0xe0) -#define OFFSET_MSDC_PAD_CTL1(0xe4) -#define OFFSET_MSDC_PAD_CTL2(0xe8) -#define OFFSET_MSDC_PAD_TUNE(0xec) -#define OFFSET_MSDC_DAT_RDDLY0 (0xf0) -#define OFFSET_MSDC_DAT_RDDLY1 (0xf4) -#define OFFSET_MSDC_HW_DBG (0xf8) -#define OFFSET_MSDC_VERSION (0x100) -#define OFFSET_MSDC_ECO_VER (0x104) - -/*--*/ -/* Register Address */ -/*--*/ - -/* common register */ -#define MSDC_CFGREG_ADDR(MSDC_CFG) -#define MSDC_IOCON REG_ADDR(MSDC_IOCON) -#define MSDC_PS REG_ADDR(MSDC_PS) -#define MSDC_INTREG_ADDR(MSDC_INT) -#define MSDC_INTEN REG_ADDR(MSDC_INTEN) -#define MSDC_FIFOCS REG_ADDR(MSDC_FIFOCS) -#define MSDC_TXDATA REG_ADDR(MSDC_TXDATA) -#define MSDC_RXDATA REG_ADDR(MSDC_RXDATA) -#define MSDC_PATCH_BIT0 REG_ADDR(MSDC_PATCH_BIT) - -/* sdmmc register */ -#define SDC_CFG REG_ADDR(SDC_CFG) -#define SDC_CMD REG_ADDR(SDC_CMD) -#define SDC_ARG REG_ADDR(SDC_ARG) -#define SDC_STS REG_ADDR(SDC_STS) -#define SDC_RESP0 REG_ADDR(SDC_RESP0) -#define SDC_RESP1 REG_ADDR(SDC_RESP1) -#define SDC_RESP2 REG_ADDR(SDC_RESP2) -#define SDC_RESP3 REG_ADDR(SDC_RESP3) -#define SDC_BLK_NUM REG_ADDR(SDC_BLK_NUM) -#define SDC_CSTSREG_ADDR(SDC_CSTS) -#define SDC_CSTS_EN REG_ADDR(SDC_CSTS_EN) -#define SDC_DCRC_STSREG_ADDR(SDC_DCRC_STS) - -/* emmc register*/ -#define EMMC_CFG0 REG_ADDR(EMMC_CFG0) -#define EMMC_CFG1 REG_ADDR(EMMC_CFG1) -#define EMMC_STSREG_ADDR(EMMC_STS) -#define EMMC_IOCON
[PATCH 00/34] staging: mt7621-mmc: Cleanup continues
Here are the next cleanups for the mt7621-mmc driver. Again much of unused code is removed and the IO is cleaned up. The next major step will be the complete refactoring of the tuning, because it does not use the tuning capabilities of sd-core, but kind of re-implements that. Christian Lütke-Stetzkamp (34): staging: mt7621-mmc: Remove unused variable in msdc_command_resp staging: mt7621-mmc: Remove unused macro msdc_fifo_write8 staging: mt7621-mmc: Remove unused macro msdc_fifo_read8 staging: mt7621-mmc: Remove unused macro msdc_fifo_write32 staging: mt7621-mmc: Remove unused macro msdc_fifo_read32 staging: mt7621-mmc: Remove unused macro msdc_txfifocnt staging: mt7621-mmc: Remove unused macro msdc_rxfifocnt staging: mt7621-mmc: Replace sdr_write32 with writel staging: mt7621-mmc: Replace sdr_read32 with readl staging: mt7621-mmc: Remove unused macro sdr_read8 staging: mt7621-mmc: Remove unused macro sdr_write8 staging: mt7621-mmc: Remove register debugging structures staging: mt7621-mmc: Remove DMA basic mode code staging: mt7621-mmc: Remove unused field mode from msdc_dma staging: mt7621-mmc: Refactor dma setup process staging: mt7621-mmc: Remove unused field sg from msdc_dma staging: mt7621-mmc: Remove unused field sglen from msdc_dma staging: mt7621-mmc: Remove variable num form msdc_dma_setup staging: mt7621-mmc: Remove unnecessary BUG_ON() in msdc_dma_setup staging: mt7621-mmc: Make msdc_clr_fifo a function and relax cpu staging: mt7621-mmc: Remove unused macro msdc_retry staging: mt7621-mmc: Remove unused macro MAX_BD_PER_GPD staging: mt7621-mmc: Remove unused variable from msdc_tune_request staging: mt7621-mmc: Remove MSDC_MODE_* defines staging: mt7621-mmc: Cleanup source of base address for io staging: mt7621-mmc: Remove unused define RALINK_MSDC_BASE staging: mt7621-mmc: Remove unused define IRQ_SDC staging: mt7621-mmc: Remove unused enum msdc_mode staging: mt7621-mmc: Remove unused define MAX_PHY_SGMTS staging: mt7621-mmc: Remove unused macro is_card_present staging: mt7621-mmc: Remove unused argument from msdc_do_command staging: mt7621-mmc: Factor out from msdc_command_start() staging: mt7621-mmc: Find response of MMC_SEND_OP_COND by default staging: mt7621-mmc: Find response of SD_APP_OP_COND by default drivers/staging/mt7621-mmc/dbg.h | 6 - drivers/staging/mt7621-mmc/mt6575_sd.h | 588 +++-- drivers/staging/mt7621-mmc/sd.c| 584 +++- 3 files changed, 305 insertions(+), 873 deletions(-) -- 2.16.1 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH 17/34] staging: mt7621-mmc: Remove unused field sglen from msdc_dma
The field sglen from struct msdc_dma is once set and never read, so remove it. Signed-off-by: Christian Lütke-Stetzkamp --- drivers/staging/mt7621-mmc/mt6575_sd.h | 2 -- drivers/staging/mt7621-mmc/sd.c| 2 -- 2 files changed, 4 deletions(-) diff --git a/drivers/staging/mt7621-mmc/mt6575_sd.h b/drivers/staging/mt7621-mmc/mt6575_sd.h index c8c5c349adf8..4b56d9a37b84 100644 --- a/drivers/staging/mt7621-mmc/mt6575_sd.h +++ b/drivers/staging/mt7621-mmc/mt6575_sd.h @@ -479,8 +479,6 @@ struct bd { }; struct msdc_dma { - u32 sglen; /* size of scatter list */ - struct gpd *gpd; /* pointer to gpd array */ struct bd *bd; /* pointer to bd array */ dma_addr_t gpd_addr; /* the physical address of gpd array */ diff --git a/drivers/staging/mt7621-mmc/sd.c b/drivers/staging/mt7621-mmc/sd.c index 050c4a910aef..e1077068604d 100644 --- a/drivers/staging/mt7621-mmc/sd.c +++ b/drivers/staging/mt7621-mmc/sd.c @@ -1041,8 +1041,6 @@ static void msdc_dma_setup(struct msdc_host *host, struct msdc_dma *dma, BUG_ON(sglen > MAX_BD_NUM); /* not support currently */ - dma->sglen = sglen; - N_MSG(DMA, "DMA sglen<%d> xfersz<%d>", sglen, host->xfer_size); /* calculate the required number of gpd */ -- 2.16.1 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
RE: [PATCH v3] Drivers: HV: Send one page worth of kmsg dump over Hyper-V during panic
I haven't gotten any test build bot reports for the newer version of the patches that were Submitted last week. Is there a way to know what's going on there or force a submission? - sunil > -Original Message- > From: kbuild test robot > Sent: Wednesday, May 23, 2018 7:57 PM > To: Sunil Muthuswamy > Cc: kbuild-...@01.org; Haiyang Zhang ; > de...@linuxdriverproject.org; Sunil Muthuswamy > ; Stephen Hemminger > > Subject: Re: [PATCH v3] Drivers: HV: Send one page worth of kmsg dump > over Hyper-V during panic > > Hi Sunil, > > Thank you for the patch! Perhaps something to improve: > > [auto build test WARNING on linus/master] > [also build test WARNING on v4.17-rc6 next-20180517] > [cannot apply to tip/x86/core] > [if your patch is applied to the wrong git tree, please drop us a note to help > improve the system] > > url: > https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub > .com%2F0day-ci%2Flinux%2Fcommits%2FSunil-Muthuswamy%2FDrivers-HV- > Send-one-page-worth-of-kmsg-dump-over-Hyper-V-during- > panic%2F20180523- > 035336&data=02%7C01%7Csunilmut%40microsoft.com%7Cea8837620518441 > e279808d5c1221032%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C6 > 36627274402211081&sdata=aRiQw64FhftuwLijjsPJigInUHEYBFWWl%2BMcgqI > yNl4%3D&reserved=0 > reproduce: > # apt-get install sparse > make ARCH=x86_64 allmodconfig > make C=1 CF=-D__CHECK_ENDIAN__ > > > sparse warnings: (new ones prefixed by >>) > > >> drivers/hv/vmbus_drv.c:1028:5: sparse: symbol > 'sysctl_record_panic_msg' was not declared. Should it be static? >drivers/hv/vmbus_drv.c:1631:32: sparse: expression using sizeof(void) >drivers/hv/vmbus_drv.c:1633:32: sparse: expression using sizeof(void) >include/asm-generic/atomic-instrumented.h:358:24: sparse: cast truncates > bits from constant value (8010 becomes 10) >include/asm-generic/atomic-instrumented.h:360:24: sparse: cast truncates > bits from constant value (8010 becomes 10) > > Please review and possibly fold the followup patch. > > --- > 0-DAY kernel test infrastructureOpen Source Technology Center > https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Flists.01 > .org%2Fpipermail%2Fkbuild- > all&data=02%7C01%7Csunilmut%40microsoft.com%7Cea8837620518441e279 > 808d5c1221032%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C63662 > 7274402211081&sdata=HhJj%2BMSiTeoaxbBDEdMLquOAO%2B5AuQR0yENX > BZ%2B77gQ%3D&reserved=0 Intel Corporation ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH 18/34] staging: mt7621-mmc: Remove variable num form msdc_dma_setup
The variable num in msdc_dma_setup is only used for a BUG_ON statement, so it can be removed by inlining the condition. Signed-off-by: Christian Lütke-Stetzkamp --- drivers/staging/mt7621-mmc/sd.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/drivers/staging/mt7621-mmc/sd.c b/drivers/staging/mt7621-mmc/sd.c index e1077068604d..68dfbf38b0ea 100644 --- a/drivers/staging/mt7621-mmc/sd.c +++ b/drivers/staging/mt7621-mmc/sd.c @@ -1037,15 +1037,14 @@ static void msdc_dma_setup(struct msdc_host *host, struct msdc_dma *dma, struct scatterlist *sg; struct gpd *gpd; struct bd *bd; - u32 j, num; + u32 j; BUG_ON(sglen > MAX_BD_NUM); /* not support currently */ N_MSG(DMA, "DMA sglen<%d> xfersz<%d>", sglen, host->xfer_size); /* calculate the required number of gpd */ - num = (sglen + MAX_BD_PER_GPD - 1) / MAX_BD_PER_GPD; - BUG_ON(num != 1); + BUG_ON(((sglen + MAX_BD_PER_GPD - 1) / MAX_BD_PER_GPD) != 1); gpd = dma->gpd; bd = dma->bd; -- 2.16.1 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH 22/34] staging: mt7621-mmc: Remove unused macro MAX_BD_PER_GPD
The macro MAX_BD_PER_GPD is never used, so remove it. Signed-off-by: Christian Lütke-Stetzkamp --- drivers/staging/mt7621-mmc/sd.c | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/staging/mt7621-mmc/sd.c b/drivers/staging/mt7621-mmc/sd.c index 0e94bb0d5927..e99a12002646 100644 --- a/drivers/staging/mt7621-mmc/sd.c +++ b/drivers/staging/mt7621-mmc/sd.c @@ -91,7 +91,6 @@ #define MAX_GPD_NUM (1 + 1) /* one null gpd */ #define MAX_BD_NUM (1024) -#define MAX_BD_PER_GPD (MAX_BD_NUM) #define MAX_HW_SGMTS(MAX_BD_NUM) #define MAX_PHY_SGMTS (MAX_BD_NUM) -- 2.16.1 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH 09/34] staging: mt7621-mmc: Replace sdr_read32 with readl
The current code uses a macro (sdr_read32) for reading from hardware, but it is only a readl, so replace it to get nearer to upstream code. Signed-off-by: Christian Lütke-Stetzkamp --- drivers/staging/mt7621-mmc/mt6575_sd.h | 1 - drivers/staging/mt7621-mmc/sd.c| 98 +- 2 files changed, 49 insertions(+), 50 deletions(-) diff --git a/drivers/staging/mt7621-mmc/mt6575_sd.h b/drivers/staging/mt7621-mmc/mt6575_sd.h index e8e79aab52f8..29e2ede6816b 100644 --- a/drivers/staging/mt7621-mmc/mt6575_sd.h +++ b/drivers/staging/mt7621-mmc/mt6575_sd.h @@ -948,7 +948,6 @@ struct msdc_host { }; #define sdr_read8(reg)readb(reg) -#define sdr_read32(reg) readl(reg) #define sdr_write8(reg, val) writeb(val, reg) static inline void sdr_set_bits(void __iomem *reg, u32 bs) diff --git a/drivers/staging/mt7621-mmc/sd.c b/drivers/staging/mt7621-mmc/sd.c index e6232f5ac6a8..1d0829e6 100644 --- a/drivers/staging/mt7621-mmc/sd.c +++ b/drivers/staging/mt7621-mmc/sd.c @@ -167,13 +167,13 @@ static void msdc_reset_hw(struct msdc_host *host) void __iomem *base = host->base; sdr_set_bits(MSDC_CFG, MSDC_CFG_RST); - while (sdr_read32(MSDC_CFG) & MSDC_CFG_RST) + while (readl(MSDC_CFG) & MSDC_CFG_RST) cpu_relax(); } #define msdc_clr_int() \ do {\ - volatile u32 val = sdr_read32(MSDC_INT);\ + volatile u32 val = readl(MSDC_INT); \ writel(val, MSDC_INT); \ } while (0) @@ -181,12 +181,12 @@ static void msdc_reset_hw(struct msdc_host *host) do {\ int retry = 3, cnt = 1000; \ sdr_set_bits(MSDC_FIFOCS, MSDC_FIFOCS_CLR); \ - msdc_retry(sdr_read32(MSDC_FIFOCS) & MSDC_FIFOCS_CLR, retry, cnt); \ + msdc_retry(readl(MSDC_FIFOCS) & MSDC_FIFOCS_CLR, retry, cnt); \ } while (0) #define msdc_irq_save(val) \ do {\ - val = sdr_read32(MSDC_INTEN); \ + val = readl(MSDC_INTEN);\ sdr_clr_bits(MSDC_INTEN, val); \ } while (0) @@ -230,8 +230,8 @@ static u32 hclks[] = {5000}; /* +/- by chhung */ (void)hwPowerDown(MT65XX_POWER_LDO_VMCH, "SD"); \ } while (0) -#define sdc_is_busy() (sdr_read32(SDC_STS) & SDC_STS_SDCBUSY) -#define sdc_is_cmd_busy() (sdr_read32(SDC_STS) & SDC_STS_CMDBUSY) +#define sdc_is_busy() (readl(SDC_STS) & SDC_STS_SDCBUSY) +#define sdc_is_cmd_busy() (readl(SDC_STS) & SDC_STS_CMDBUSY) #define sdc_send_cmd(cmd, arg) \ do {\ @@ -240,7 +240,7 @@ static u32 hclks[] = {5000}; /* +/- by chhung */ } while (0) // can modify to read h/w register. -//#define is_card_present(h) ((sdr_read32(MSDC_PS) & MSDC_PS_CDSTS) ? 0 : 1); +//#define is_card_present(h) ((readl(MSDC_PS) & MSDC_PS_CDSTS) ? 0 : 1); #define is_card_present(h) (((struct msdc_host *)(h))->card_inserted) /* +++ by chhung */ @@ -426,7 +426,7 @@ static void msdc_tasklet_card(struct work_struct *work) spin_lock(&host->lock); - status = sdr_read32(MSDC_PS); + status = readl(MSDC_PS); if (cd_active_low) inserted = (status & MSDC_PS_CDSTS) ? 0 : 1; else @@ -469,8 +469,8 @@ static void msdc_select_clksrc(struct msdc_host *host, unsigned char clksrc) BUG_ON(clksrc > 3); INIT_MSG("set clock source to <%d>", clksrc); - val = sdr_read32(MSDC_CLKSRC_REG); - if (sdr_read32(MSDC_ECO_VER) >= 4) { + val = readl(MSDC_CLKSRC_REG); + if (readl(MSDC_ECO_VER) >= 4) { val &= ~(0x3 << clk_src_bit[host->id]); val |= clksrc << clk_src_bit[host->id]; } else { @@ -531,7 +531,7 @@ static void msdc_set_mclk(struct msdc_host *host, int ddr, unsigned int hz) sdr_set_field(MSDC_CFG, MSDC_CFG_CKDIV, div); /* wait clock stable */ - while (!(sdr_read32(MSDC_CFG) & MSDC_CFG_CKSTB)) + while (!(readl(MSDC_CFG) & MSDC_CFG_CKSTB)) cpu_relax(); host->sclk = sclk; @@ -940,7 +940,7 @@ static unsigned int msdc_command_resp(struct msdc_host *host, /* memory card CRC */ if (host->hw->flags & MSDC_REMOVABLE && cmd->error == -EIO) { - if (sdr_read32(SDC_CMD) & 0x1800) { /* check if has data phase */ + if (readl(SDC_CMD) & 0x1800) { /* check if has data phase */ msdc_abort_data(host); } else { /* do basic: reset*/ @@ -953,7 +953,7 @@ static unsigned int msdc_command_resp(struct msdc_host *host, // check DAT0 /* if (resp == RESP_R1B) { -
[PATCH 03/34] staging: mt7621-mmc: Remove unused macro msdc_fifo_read8
The macro msdc_fifo_read8 is never used, so remove it. Signed-off-by: Christian Lütke-Stetzkamp --- drivers/staging/mt7621-mmc/sd.c | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/staging/mt7621-mmc/sd.c b/drivers/staging/mt7621-mmc/sd.c index 4a69bc84bbd2..98bcb0fe6f40 100644 --- a/drivers/staging/mt7621-mmc/sd.c +++ b/drivers/staging/mt7621-mmc/sd.c @@ -151,7 +151,6 @@ static int msdc_rsp[] = { #define msdc_rxfifocnt() ((sdr_read32(MSDC_FIFOCS) & MSDC_FIFOCS_RXCNT) >> 0) #define msdc_fifo_write32(v) sdr_write32(MSDC_TXDATA, (v)) #define msdc_fifo_read32() sdr_read32(MSDC_RXDATA) -#define msdc_fifo_read8()sdr_read8(MSDC_RXDATA) #define msdc_dma_on()sdr_clr_bits(MSDC_CFG, MSDC_CFG_PIO) -- 2.16.1 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH 24/34] staging: mt7621-mmc: Remove MSDC_MODE_* defines
The MSDC_MODE_* defines are all never used and do not contain any information about the device, so remove them. Signed-off-by: Christian Lütke-Stetzkamp --- drivers/staging/mt7621-mmc/mt6575_sd.h | 7 --- 1 file changed, 7 deletions(-) diff --git a/drivers/staging/mt7621-mmc/mt6575_sd.h b/drivers/staging/mt7621-mmc/mt6575_sd.h index 4b56d9a37b84..9b6cd6db37df 100644 --- a/drivers/staging/mt7621-mmc/mt6575_sd.h +++ b/drivers/staging/mt7621-mmc/mt6575_sd.h @@ -56,13 +56,6 @@ #define MSDC_MS (0) #define MSDC_SDMMC (1) -#define MSDC_MODE_UNKNOWN (0) -#define MSDC_MODE_PIO (1) -#define MSDC_MODE_DMA_BASIC (2) -#define MSDC_MODE_DMA_DESC (3) -#define MSDC_MODE_DMA_ENHANCED (4) -#define MSDC_MODE_MMC_STREAM(5) - #define MSDC_BUS_1BITS (0) #define MSDC_BUS_4BITS (1) #define MSDC_BUS_8BITS (2) -- 2.16.1 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH 31/34] staging: mt7621-mmc: Remove unused argument from msdc_do_command
The argument tune of msdc_do_command is never used, so remove it. Signed-off-by: Christian Lütke-Stetzkamp --- drivers/staging/mt7621-mmc/sd.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/drivers/staging/mt7621-mmc/sd.c b/drivers/staging/mt7621-mmc/sd.c index cfe7517f8bdf..93f14c9694b9 100644 --- a/drivers/staging/mt7621-mmc/sd.c +++ b/drivers/staging/mt7621-mmc/sd.c @@ -710,7 +710,6 @@ static void msdc_pm(pm_message_t state, void *data) /*--*/ static unsigned int msdc_command_start(struct msdc_host *host, struct mmc_command *cmd, - int tune, /* not used */ unsigned long timeout) { u32 opcode = cmd->opcode; @@ -932,7 +931,7 @@ static unsigned int msdc_do_command(struct msdc_host *host, int tune, unsigned long timeout) { - if (msdc_command_start(host, cmd, tune, timeout)) + if (msdc_command_start(host, cmd, timeout)) goto end; if (msdc_command_resp(host, cmd, tune, timeout)) @@ -1098,7 +1097,7 @@ static int msdc_do_request(struct mmc_host *mmc, struct mmc_request *mrq) init_completion(&host->xfer_done); /* start the command first*/ - if (msdc_command_start(host, cmd, 1, CMD_TIMEOUT) != 0) + if (msdc_command_start(host, cmd, CMD_TIMEOUT) != 0) goto done; data->sg_count = dma_map_sg(mmc_dev(mmc), data->sg, -- 2.16.1 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH 29/34] staging: mt7621-mmc: Remove unused define MAX_PHY_SGMTS
The define MAX_PHY_SGMTS is never used, so remove it. Signed-off-by: Christian Lütke-Stetzkamp --- drivers/staging/mt7621-mmc/sd.c | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/staging/mt7621-mmc/sd.c b/drivers/staging/mt7621-mmc/sd.c index 31ee9c533f35..45d9b62f4a58 100644 --- a/drivers/staging/mt7621-mmc/sd.c +++ b/drivers/staging/mt7621-mmc/sd.c @@ -89,7 +89,6 @@ #define MAX_BD_NUM (1024) #define MAX_HW_SGMTS(MAX_BD_NUM) -#define MAX_PHY_SGMTS (MAX_BD_NUM) #define MAX_SGMT_SZ (MAX_DMA_CNT) #define MAX_REQ_SZ (MAX_SGMT_SZ * 8) -- 2.16.1 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH 10/34] staging: mt7621-mmc: Remove unused macro sdr_read8
The macro sdr_read8 is never used, so remove it. Signed-off-by: Christian Lütke-Stetzkamp --- drivers/staging/mt7621-mmc/mt6575_sd.h | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/staging/mt7621-mmc/mt6575_sd.h b/drivers/staging/mt7621-mmc/mt6575_sd.h index 29e2ede6816b..adccabe32660 100644 --- a/drivers/staging/mt7621-mmc/mt6575_sd.h +++ b/drivers/staging/mt7621-mmc/mt6575_sd.h @@ -947,7 +947,6 @@ struct msdc_host { u32 app_cmd_arg; }; -#define sdr_read8(reg)readb(reg) #define sdr_write8(reg, val) writeb(val, reg) static inline void sdr_set_bits(void __iomem *reg, u32 bs) -- 2.16.1 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH 27/34] staging: mt7621-mmc: Remove unused define IRQ_SDC
The define IRQ_SDC is never used, so remove it. Signed-off-by: Christian Lütke-Stetzkamp --- drivers/staging/mt7621-mmc/sd.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/drivers/staging/mt7621-mmc/sd.c b/drivers/staging/mt7621-mmc/sd.c index 101ceca2ee4c..31ee9c533f35 100644 --- a/drivers/staging/mt7621-mmc/sd.c +++ b/drivers/staging/mt7621-mmc/sd.c @@ -50,13 +50,11 @@ #include "dbg.h" #include "mt6575_sd.h" -//#define IRQ_SDC 14 //MT7620 /*FIXME*/ #ifdef CONFIG_SOC_MT7621 #define RALINK_SYSCTL_BASE 0xbe00 #else #define RALINK_SYSCTL_BASE 0xb000 #endif -#define IRQ_SDC22 /*FIXME*/ #define DRV_NAME"mtk-sd" -- 2.16.1 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH 14/34] staging: mt7621-mmc: Remove unused field mode from msdc_dma
The field mode of struct msdc_dma has no remaining use, so remove it. Signed-off-by: Christian Lütke-Stetzkamp --- drivers/staging/mt7621-mmc/mt6575_sd.h | 1 - drivers/staging/mt7621-mmc/sd.c| 5 + 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/drivers/staging/mt7621-mmc/mt6575_sd.h b/drivers/staging/mt7621-mmc/mt6575_sd.h index 07f48d526888..8eb30d908f9d 100644 --- a/drivers/staging/mt7621-mmc/mt6575_sd.h +++ b/drivers/staging/mt7621-mmc/mt6575_sd.h @@ -481,7 +481,6 @@ struct bd { struct msdc_dma { u32 sglen; /* size of scatter list */ struct scatterlist *sg; /* I/O scatter list */ - u8 mode;/* dma mode*/ struct gpd *gpd; /* pointer to gpd array */ struct bd *bd; /* pointer to bd array */ diff --git a/drivers/staging/mt7621-mmc/sd.c b/drivers/staging/mt7621-mmc/sd.c index 1196e8eb86c5..3066fa3799ac 100644 --- a/drivers/staging/mt7621-mmc/sd.c +++ b/drivers/staging/mt7621-mmc/sd.c @@ -1091,10 +1091,7 @@ static void msdc_dma_setup(struct msdc_host *host, struct msdc_dma *dma, dma->sg = sg; dma->sglen = sglen; - dma->mode = MSDC_MODE_DMA_DESC; - - N_MSG(DMA, "DMA mode<%d> sglen<%d> xfersz<%d>", dma->mode, dma->sglen, - host->xfer_size); + N_MSG(DMA, "DMA sglen<%d> xfersz<%d>", dma->sglen, host->xfer_size); msdc_dma_config(host, dma); } -- 2.16.1 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH 32/34] staging: mt7621-mmc: Factor out from msdc_command_start()
Currently msdc_command_start does multiple things and is hard to read, so factor out the finding of the response type. Signed-off-by: Christian Lütke-Stetzkamp --- drivers/staging/mt7621-mmc/sd.c | 40 +--- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/drivers/staging/mt7621-mmc/sd.c b/drivers/staging/mt7621-mmc/sd.c index 93f14c9694b9..c02799acb9e4 100644 --- a/drivers/staging/mt7621-mmc/sd.c +++ b/drivers/staging/mt7621-mmc/sd.c @@ -705,25 +705,11 @@ static void msdc_pm(pm_message_t state, void *data) } #endif -/*--*/ -/* mmc_host_ops members */ -/*--*/ -static unsigned int msdc_command_start(struct msdc_host *host, - struct mmc_command *cmd, - unsigned long timeout) +static inline u32 msdc_cmd_find_resp(struct mmc_command cmd) { u32 opcode = cmd->opcode; - u32 rawcmd; - u32 wints = MSDC_INT_CMDRDY | MSDC_INT_RSPCRCERR | MSDC_INT_CMDTMO | - MSDC_INT_ACMDRDY | MSDC_INT_ACMDCRCERR | MSDC_INT_ACMDTMO | - MSDC_INT_ACMD19_DONE; - u32 resp; - unsigned long tmo; - /* Protocol layer does not provide response type, but our hardware needs -* to know exact type, not just size! -*/ if (opcode == MMC_SEND_OP_COND || opcode == SD_APP_OP_COND) { resp = RESP_R3; } else if (opcode == MMC_SET_RELATIVE_ADDR) { @@ -759,6 +745,30 @@ static unsigned int msdc_command_start(struct msdc_host *host, } } + return resp; +} + +/*--*/ +/* mmc_host_ops members */ +/*--*/ +static unsigned int msdc_command_start(struct msdc_host *host, + struct mmc_command *cmd, + unsigned long timeout) +{ + u32 opcode = cmd->opcode; + u32 rawcmd; + u32 wints = MSDC_INT_CMDRDY | MSDC_INT_RSPCRCERR | MSDC_INT_CMDTMO | + MSDC_INT_ACMDRDY | MSDC_INT_ACMDCRCERR | MSDC_INT_ACMDTMO | + MSDC_INT_ACMD19_DONE; + + u32 resp; + unsigned long tmo; + + /* Protocol layer does not provide response type, but our hardware needs +* to know exact type, not just size! +*/ + resp = msdc_cmd_find_resp(cmd); + cmd->error = 0; /* rawcmd : * vol_swt << 30 | auto_cmd << 28 | blklen << 16 | go_irq << 15 | -- 2.16.1 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH 20/34] staging: mt7621-mmc: Make msdc_clr_fifo a function and relax cpu
In the current code, msdc_clr_fifo is a macro and just busy waits for a limited amount of time for the fifo clear to finish. That is not correct, the programming manual hits, that the user should wait until the bit is cleared by hardware and not a limited amount of time. So the code is changed to a function, that also relaxes the cpu while busy waiting. Signed-off-by: Christian Lütke-Stetzkamp --- drivers/staging/mt7621-mmc/sd.c | 28 +++- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/drivers/staging/mt7621-mmc/sd.c b/drivers/staging/mt7621-mmc/sd.c index a506c7e19086..01a925ae662e 100644 --- a/drivers/staging/mt7621-mmc/sd.c +++ b/drivers/staging/mt7621-mmc/sd.c @@ -177,12 +177,14 @@ static void msdc_reset_hw(struct msdc_host *host) writel(val, MSDC_INT); \ } while (0) -#define msdc_clr_fifo() \ - do {\ - int retry = 3, cnt = 1000; \ - sdr_set_bits(MSDC_FIFOCS, MSDC_FIFOCS_CLR); \ - msdc_retry(readl(MSDC_FIFOCS) & MSDC_FIFOCS_CLR, retry, cnt); \ - } while (0) +static void msdc_clr_fifo(struct msdc_host *host) +{ + void __iomem *base = host->base; + + sdr_set_bits(MSDC_FIFOCS, MSDC_FIFOCS_CLR); + while (readl(MSDC_FIFOCS) & MSDC_FIFOCS_CLR) + cpu_relax(); +} #define msdc_irq_save(val) \ do {\ @@ -554,7 +556,7 @@ static void msdc_abort_data(struct msdc_host *host) ERR_MSG("Need to Abort."); msdc_reset_hw(host); - msdc_clr_fifo(); + msdc_clr_fifo(host); msdc_clr_int(); // need to check FIFO count 0 ? @@ -945,7 +947,7 @@ static unsigned int msdc_command_resp(struct msdc_host *host, } else { /* do basic: reset*/ msdc_reset_hw(host); - msdc_clr_fifo(); + msdc_clr_fifo(host); msdc_clr_int(); } cmd->error = msdc_tune_cmdrsp(host, cmd); @@ -1131,7 +1133,7 @@ static int msdc_do_request(struct mmc_host *mmc, struct mmc_request *mrq) } writel(data->blocks, SDC_BLK_NUM); - //msdc_clr_fifo(); /* no need */ + //msdc_clr_fifo(host); /* no need */ msdc_dma_on(); /* enable DMA mode first!! */ init_completion(&host->xfer_done); @@ -1165,7 +1167,7 @@ static int msdc_do_request(struct mmc_host *mmc, struct mmc_request *mrq) data->error = -ETIMEDOUT; msdc_reset_hw(host); - msdc_clr_fifo(); + msdc_clr_fifo(host); msdc_clr_int(); } spin_lock(&host->lock); @@ -1868,7 +1870,7 @@ static irqreturn_t msdc_irq(int irq, void *dev_id) if (intsts & datsts) { /* do basic reset, or stop command will sdc_busy */ msdc_reset_hw(host); - msdc_clr_fifo(); + msdc_clr_fifo(host); msdc_clr_int(); if (intsts & MSDC_INT_DATTMO) { @@ -1917,7 +1919,7 @@ static irqreturn_t msdc_irq(int irq, void *dev_id) IRQ_MSG("XXX CMD<%d> MSDC_INT_CMDTMO", cmd->opcode); cmd->error = -ETIMEDOUT; msdc_reset_hw(host); - msdc_clr_fifo(); + msdc_clr_fifo(host); msdc_clr_int(); } complete(&host->cmd_done); @@ -2029,7 +2031,7 @@ static void msdc_init_hw(struct msdc_host *host) /* Reset */ msdc_reset_hw(host); - msdc_clr_fifo(); + msdc_clr_fifo(host); /* Disable card detection */ sdr_clr_bits(MSDC_PS, MSDC_PS_CDEN); -- 2.16.1 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH 11/34] staging: mt7621-mmc: Remove unused macro sdr_write8
The macro sdr_write8 is never used, so remove it. Signed-off-by: Christian Lütke-Stetzkamp --- drivers/staging/mt7621-mmc/mt6575_sd.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/drivers/staging/mt7621-mmc/mt6575_sd.h b/drivers/staging/mt7621-mmc/mt6575_sd.h index adccabe32660..375cb109806e 100644 --- a/drivers/staging/mt7621-mmc/mt6575_sd.h +++ b/drivers/staging/mt7621-mmc/mt6575_sd.h @@ -947,8 +947,6 @@ struct msdc_host { u32 app_cmd_arg; }; -#define sdr_write8(reg, val) writeb(val, reg) - static inline void sdr_set_bits(void __iomem *reg, u32 bs) { u32 val = readl(reg); -- 2.16.1 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH 08/34] staging: mt7621-mmc: Replace sdr_write32 with writel
The current code uses a macro (sdr_write32) for writing to hardware, but it is only a writel with switched arguments, so replace it to get nearer to upstream code. Signed-off-by: Christian Lütke-Stetzkamp --- drivers/staging/mt7621-mmc/mt6575_sd.h | 1 - drivers/staging/mt7621-mmc/sd.c| 64 +- 2 files changed, 32 insertions(+), 33 deletions(-) diff --git a/drivers/staging/mt7621-mmc/mt6575_sd.h b/drivers/staging/mt7621-mmc/mt6575_sd.h index 33fa59a019ec..e8e79aab52f8 100644 --- a/drivers/staging/mt7621-mmc/mt6575_sd.h +++ b/drivers/staging/mt7621-mmc/mt6575_sd.h @@ -950,7 +950,6 @@ struct msdc_host { #define sdr_read8(reg)readb(reg) #define sdr_read32(reg) readl(reg) #define sdr_write8(reg, val) writeb(val, reg) -#define sdr_write32(reg, val) writel(val, reg) static inline void sdr_set_bits(void __iomem *reg, u32 bs) { diff --git a/drivers/staging/mt7621-mmc/sd.c b/drivers/staging/mt7621-mmc/sd.c index 78a681a72f11..e6232f5ac6a8 100644 --- a/drivers/staging/mt7621-mmc/sd.c +++ b/drivers/staging/mt7621-mmc/sd.c @@ -174,7 +174,7 @@ static void msdc_reset_hw(struct msdc_host *host) #define msdc_clr_int() \ do {\ volatile u32 val = sdr_read32(MSDC_INT);\ - sdr_write32(MSDC_INT, val); \ + writel(val, MSDC_INT); \ } while (0) #define msdc_clr_fifo() \ @@ -235,8 +235,8 @@ static u32 hclks[] = {5000}; /* +/- by chhung */ #define sdc_send_cmd(cmd, arg) \ do {\ - sdr_write32(SDC_ARG, (arg));\ - sdr_write32(SDC_CMD, (cmd));\ + writel((arg), SDC_ARG); \ + writel((cmd), SDC_CMD); \ } while (0) // can modify to read h/w register. @@ -476,7 +476,7 @@ static void msdc_select_clksrc(struct msdc_host *host, unsigned char clksrc) } else { val &= ~0x3; val |= clksrc; } - sdr_write32(MSDC_CLKSRC_REG, val); + writel(val, MSDC_CLKSRC_REG); host->hclk = hclks[clksrc]; host->hw->clk_src = clksrc; @@ -1044,14 +1044,14 @@ static void msdc_dma_config(struct msdc_host *host, struct msdc_dma *dma) case MSDC_MODE_DMA_BASIC: BUG_ON(host->xfer_size > 65535); BUG_ON(dma->sglen != 1); - sdr_write32(MSDC_DMA_SA, PHYSADDR(sg_dma_address(sg))); + writel(PHYSADDR(sg_dma_address(sg)), MSDC_DMA_SA); sdr_set_field(MSDC_DMA_CTRL, MSDC_DMA_CTRL_LASTBUF, 1); //#if defined (CONFIG_RALINK_MT7620) if (ralink_soc == MT762X_SOC_MT7620A) sdr_set_field(MSDC_DMA_CTRL, MSDC_DMA_CTRL_XFERSZ, sg_dma_len(sg)); //#elif defined (CONFIG_RALINK_MT7621) || defined (CONFIG_RALINK_MT7628) else - sdr_write32((void __iomem *)(RALINK_MSDC_BASE + 0xa8), sg_dma_len(sg)); + writel(sg_dma_len(sg), (void __iomem *)(RALINK_MSDC_BASE + 0xa8)); //#endif sdr_set_field(MSDC_DMA_CTRL, MSDC_DMA_CTRL_BRUSTSZ, MSDC_BRUST_64B); @@ -1094,7 +1094,7 @@ static void msdc_dma_config(struct msdc_host *host, struct msdc_dma *dma) MSDC_BRUST_64B); sdr_set_field(MSDC_DMA_CTRL, MSDC_DMA_CTRL_MODE, 1); - sdr_write32(MSDC_DMA_SA, PHYSADDR((u32)dma->gpd_addr)); + writel(PHYSADDR((u32)dma->gpd_addr), MSDC_DMA_SA); break; default: @@ -1172,7 +1172,7 @@ static int msdc_do_request(struct mmc_host *mmc, struct mmc_request *mrq) } } - sdr_write32(SDC_BLK_NUM, data->blocks); + writel(data->blocks, SDC_BLK_NUM); //msdc_clr_fifo(); /* no need */ msdc_dma_on(); /* enable DMA mode first!! */ @@ -1465,8 +1465,8 @@ static int msdc_tune_bread(struct mmc_host *mmc, struct mmc_request *mrq) cur_rxdly0 = (cur_dat0 << 24) | (cur_dat1 << 16) | (cur_dat2 << 8) | (cur_dat3 << 0); cur_rxdly1 = (cur_dat4 << 24) | (cur_dat5 << 16) | (cur_dat6 << 8) | (cur_dat7 << 0); - sdr_write32(MSDC_DAT_RDDLY0, cur_rxdly0); - sdr_write32(MSDC_DAT_RDDLY1, cur_rxdly1); + writel(cur_rxdly0, MSDC_DAT_RDDLY0); + writel(cur_rxdly1, MSDC_DAT_RDDLY1); } while (++rxdly < 32); @@ -1555,7 +1555,7 @@ static int msdc_tune_bwrite(struct mmc_host *mmc, struct mmc_request *mrq) cur_dat3 = orig_dat3; cur_rxdly0 = (cur_dat0 << 24) | (cur_dat1 << 16) | (cur_dat2 << 8) | (cur_dat3 << 0); - sdr_write32(MSDC_DAT_RDDLY0, cur_rxdly0); + writel(cur_rxdly0, MSDC_DAT_RDDLY0); } while (++rxdly < 32); done: @@ -1726,7 +1726,7
[PATCH 34/34] staging: mt7621-mmc: Find response of SD_APP_OP_COND by default
The response type of the SD_APP_OP_COND command is correctly determined using the mmc_resp_type macro, because the only use of that opcode, mmc_send_app_op_cond, correctly places MMC_RSP_R3 in cmd.flags. So there is no need to treat that opcode separately. Signed-off-by: Christian Lütke-Stetzkamp --- drivers/staging/mt7621-mmc/sd.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/drivers/staging/mt7621-mmc/sd.c b/drivers/staging/mt7621-mmc/sd.c index 3f4de63b25a8..f1b3472b96c3 100644 --- a/drivers/staging/mt7621-mmc/sd.c +++ b/drivers/staging/mt7621-mmc/sd.c @@ -710,9 +710,7 @@ static inline u32 msdc_cmd_find_resp(struct mmc_command cmd) u32 opcode = cmd->opcode; u32 resp; - if (opcode == SD_APP_OP_COND) { - resp = RESP_R3; - } else if (opcode == MMC_SET_RELATIVE_ADDR) { + if (opcode == MMC_SET_RELATIVE_ADDR) { resp = (mmc_cmd_type(cmd) == MMC_CMD_BCR) ? RESP_R6 : RESP_R1; } else if (opcode == MMC_FAST_IO) { resp = RESP_R4; -- 2.16.1 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH 19/34] staging: mt7621-mmc: Remove unnecessary BUG_ON() in msdc_dma_setup
The BUG_ON() removed by this patch is just a duplicate of a prior BUG_ON() statement. There the condition is just clearer, it checks weather sglen > MAX_BD_NUM and MAX_BD_NUM is equal MAX_BD_PER_GPD. So this statement can be safely removed. Signed-off-by: Christian Lütke-Stetzkamp --- drivers/staging/mt7621-mmc/sd.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/drivers/staging/mt7621-mmc/sd.c b/drivers/staging/mt7621-mmc/sd.c index 68dfbf38b0ea..a506c7e19086 100644 --- a/drivers/staging/mt7621-mmc/sd.c +++ b/drivers/staging/mt7621-mmc/sd.c @@ -1043,9 +1043,6 @@ static void msdc_dma_setup(struct msdc_host *host, struct msdc_dma *dma, N_MSG(DMA, "DMA sglen<%d> xfersz<%d>", sglen, host->xfer_size); - /* calculate the required number of gpd */ - BUG_ON(((sglen + MAX_BD_PER_GPD - 1) / MAX_BD_PER_GPD) != 1); - gpd = dma->gpd; bd = dma->bd; -- 2.16.1 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH 28/34] staging: mt7621-mmc: Remove unused enum msdc_mode
The enum msdc_mode is never used, so remove it. Signed-off-by: Christian Lütke-Stetzkamp --- drivers/staging/mt7621-mmc/dbg.h | 6 -- 1 file changed, 6 deletions(-) diff --git a/drivers/staging/mt7621-mmc/dbg.h b/drivers/staging/mt7621-mmc/dbg.h index 5a25a69b00c9..2f2c56b73987 100644 --- a/drivers/staging/mt7621-mmc/dbg.h +++ b/drivers/staging/mt7621-mmc/dbg.h @@ -73,12 +73,6 @@ enum msdc_dbg { SD_TOOL_SDIO_PROFILE = 3, }; -enum msdc_mode { - MODE_PIO = 0, - MODE_DMA = 1, - MODE_SIZE_DEP = 2, -}; - /* Debug message event */ #define DBG_EVT_NONE(0) /* No event */ #define DBG_EVT_DMA (1 << 0) /* DMA related event */ -- 2.16.1 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH 16/34] staging: mt7621-mmc: Remove unused field sg from msdc_dma
The field sg from struct msdc_dma is once set and never read, so remove it. Signed-off-by: Christian Lütke-Stetzkamp --- drivers/staging/mt7621-mmc/mt6575_sd.h | 1 - drivers/staging/mt7621-mmc/sd.c| 1 - 2 files changed, 2 deletions(-) diff --git a/drivers/staging/mt7621-mmc/mt6575_sd.h b/drivers/staging/mt7621-mmc/mt6575_sd.h index 8eb30d908f9d..c8c5c349adf8 100644 --- a/drivers/staging/mt7621-mmc/mt6575_sd.h +++ b/drivers/staging/mt7621-mmc/mt6575_sd.h @@ -480,7 +480,6 @@ struct bd { struct msdc_dma { u32 sglen; /* size of scatter list */ - struct scatterlist *sg; /* I/O scatter list */ struct gpd *gpd; /* pointer to gpd array */ struct bd *bd; /* pointer to bd array */ diff --git a/drivers/staging/mt7621-mmc/sd.c b/drivers/staging/mt7621-mmc/sd.c index 923b0687918d..050c4a910aef 100644 --- a/drivers/staging/mt7621-mmc/sd.c +++ b/drivers/staging/mt7621-mmc/sd.c @@ -1041,7 +1041,6 @@ static void msdc_dma_setup(struct msdc_host *host, struct msdc_dma *dma, BUG_ON(sglen > MAX_BD_NUM); /* not support currently */ - dma->sg = sg_cmd; dma->sglen = sglen; N_MSG(DMA, "DMA sglen<%d> xfersz<%d>", sglen, host->xfer_size); -- 2.16.1 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH 02/34] staging: mt7621-mmc: Remove unused macro msdc_fifo_write8
The macro msdc_fifo_write8 is never used, so remove it. Signed-off-by: Christian Lütke-Stetzkamp --- drivers/staging/mt7621-mmc/sd.c | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/staging/mt7621-mmc/sd.c b/drivers/staging/mt7621-mmc/sd.c index 7cfadb41a53d..4a69bc84bbd2 100644 --- a/drivers/staging/mt7621-mmc/sd.c +++ b/drivers/staging/mt7621-mmc/sd.c @@ -150,7 +150,6 @@ static int msdc_rsp[] = { #define msdc_txfifocnt() ((sdr_read32(MSDC_FIFOCS) & MSDC_FIFOCS_TXCNT) >> 16) #define msdc_rxfifocnt() ((sdr_read32(MSDC_FIFOCS) & MSDC_FIFOCS_RXCNT) >> 0) #define msdc_fifo_write32(v) sdr_write32(MSDC_TXDATA, (v)) -#define msdc_fifo_write8(v)sdr_write8(MSDC_TXDATA, (v)) #define msdc_fifo_read32() sdr_read32(MSDC_RXDATA) #define msdc_fifo_read8()sdr_read8(MSDC_RXDATA) -- 2.16.1 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH 05/34] staging: mt7621-mmc: Remove unused macro msdc_fifo_read32
The macro msdc_fifo_read32 is never used, so remove it. Signed-off-by: Christian Lütke-Stetzkamp --- drivers/staging/mt7621-mmc/sd.c | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/staging/mt7621-mmc/sd.c b/drivers/staging/mt7621-mmc/sd.c index 9e00f86a0398..0f9cba918586 100644 --- a/drivers/staging/mt7621-mmc/sd.c +++ b/drivers/staging/mt7621-mmc/sd.c @@ -149,7 +149,6 @@ static int msdc_rsp[] = { #define msdc_txfifocnt() ((sdr_read32(MSDC_FIFOCS) & MSDC_FIFOCS_TXCNT) >> 16) #define msdc_rxfifocnt() ((sdr_read32(MSDC_FIFOCS) & MSDC_FIFOCS_RXCNT) >> 0) -#define msdc_fifo_read32() sdr_read32(MSDC_RXDATA) #define msdc_dma_on()sdr_clr_bits(MSDC_CFG, MSDC_CFG_PIO) -- 2.16.1 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH 30/34] staging: mt7621-mmc: Remove unused macro is_card_present
The macro is_card_present is unused and also a duplicate of a macro in mmc, so remove it. Signed-off-by: Christian Lütke-Stetzkamp --- drivers/staging/mt7621-mmc/sd.c | 4 1 file changed, 4 deletions(-) diff --git a/drivers/staging/mt7621-mmc/sd.c b/drivers/staging/mt7621-mmc/sd.c index 45d9b62f4a58..cfe7517f8bdf 100644 --- a/drivers/staging/mt7621-mmc/sd.c +++ b/drivers/staging/mt7621-mmc/sd.c @@ -218,10 +218,6 @@ static u32 hclks[] = {5000}; /* +/- by chhung */ writel((cmd), host->base + SDC_CMD);\ } while (0) -// can modify to read h/w register. -//#define is_card_present(h) ((readl(MSDC_PS) & MSDC_PS_CDSTS) ? 0 : 1); -#define is_card_present(h) (((struct msdc_host *)(h))->card_inserted) - /* +++ by chhung */ #ifndef __ASSEMBLY__ #define PHYSADDR(a) (((unsigned long)(a)) & 0x1fff) -- 2.16.1 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH 04/34] staging: mt7621-mmc: Remove unused macro msdc_fifo_write32
The macro msdc_fifo_write32 is never used, so remove it. Signed-off-by: Christian Lütke-Stetzkamp --- drivers/staging/mt7621-mmc/sd.c | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/staging/mt7621-mmc/sd.c b/drivers/staging/mt7621-mmc/sd.c index 98bcb0fe6f40..9e00f86a0398 100644 --- a/drivers/staging/mt7621-mmc/sd.c +++ b/drivers/staging/mt7621-mmc/sd.c @@ -149,7 +149,6 @@ static int msdc_rsp[] = { #define msdc_txfifocnt() ((sdr_read32(MSDC_FIFOCS) & MSDC_FIFOCS_TXCNT) >> 16) #define msdc_rxfifocnt() ((sdr_read32(MSDC_FIFOCS) & MSDC_FIFOCS_RXCNT) >> 0) -#define msdc_fifo_write32(v) sdr_write32(MSDC_TXDATA, (v)) #define msdc_fifo_read32() sdr_read32(MSDC_RXDATA) #define msdc_dma_on()sdr_clr_bits(MSDC_CFG, MSDC_CFG_PIO) -- 2.16.1 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH 33/34] staging: mt7621-mmc: Find response of MMC_SEND_OP_COND by default
The response type of the MMC_SEND_OP_COND command is correctly determined using the mmc_resp_type macro, because the only use of that opcode, mmc_send_op_cond, correctly places MMC_RSP_R3 in cmd.flags. So there is no need to treat that opcode separately. Signed-off-by: Christian Lütke-Stetzkamp --- drivers/staging/mt7621-mmc/sd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/staging/mt7621-mmc/sd.c b/drivers/staging/mt7621-mmc/sd.c index c02799acb9e4..3f4de63b25a8 100644 --- a/drivers/staging/mt7621-mmc/sd.c +++ b/drivers/staging/mt7621-mmc/sd.c @@ -710,7 +710,7 @@ static inline u32 msdc_cmd_find_resp(struct mmc_command cmd) u32 opcode = cmd->opcode; u32 resp; - if (opcode == MMC_SEND_OP_COND || opcode == SD_APP_OP_COND) { + if (opcode == SD_APP_OP_COND) { resp = RESP_R3; } else if (opcode == MMC_SET_RELATIVE_ADDR) { resp = (mmc_cmd_type(cmd) == MMC_CMD_BCR) ? RESP_R6 : RESP_R1; -- 2.16.1 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH 07/34] staging: mt7621-mmc: Remove unused macro msdc_rxfifocnt
The macro msdc_rxfifocnt is never used, so remove it. Signed-off-by: Christian Lütke-Stetzkamp --- drivers/staging/mt7621-mmc/sd.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/drivers/staging/mt7621-mmc/sd.c b/drivers/staging/mt7621-mmc/sd.c index c6aced0c0a6a..78a681a72f11 100644 --- a/drivers/staging/mt7621-mmc/sd.c +++ b/drivers/staging/mt7621-mmc/sd.c @@ -147,8 +147,6 @@ static int msdc_rsp[] = { 7, /* RESP_R1b */ }; -#define msdc_rxfifocnt() ((sdr_read32(MSDC_FIFOCS) & MSDC_FIFOCS_RXCNT) >> 0) - #define msdc_dma_on()sdr_clr_bits(MSDC_CFG, MSDC_CFG_PIO) #define msdc_retry(expr, retry, cnt) \ -- 2.16.1 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH 26/34] staging: mt7621-mmc: Remove unused define RALINK_MSDC_BASE
The define RALINK_MSDC_BASE is never used, so remove it. Signed-off-by: Christian Lütke-Stetzkamp --- drivers/staging/mt7621-mmc/sd.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/drivers/staging/mt7621-mmc/sd.c b/drivers/staging/mt7621-mmc/sd.c index e639ceb2ba85..101ceca2ee4c 100644 --- a/drivers/staging/mt7621-mmc/sd.c +++ b/drivers/staging/mt7621-mmc/sd.c @@ -53,10 +53,8 @@ //#define IRQ_SDC 14 //MT7620 /*FIXME*/ #ifdef CONFIG_SOC_MT7621 #define RALINK_SYSCTL_BASE 0xbe00 -#define RALINK_MSDC_BASE 0xbe13 #else #define RALINK_SYSCTL_BASE 0xb000 -#define RALINK_MSDC_BASE 0xb013 #endif #define IRQ_SDC22 /*FIXME*/ -- 2.16.1 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH 13/34] staging: mt7621-mmc: Remove DMA basic mode code
The driver currently only uses DMA linked mode and the upstream driver does the same, so remove the basic mode code. Signed-off-by: Christian Lütke-Stetzkamp --- drivers/staging/mt7621-mmc/sd.c | 88 +++-- 1 file changed, 32 insertions(+), 56 deletions(-) diff --git a/drivers/staging/mt7621-mmc/sd.c b/drivers/staging/mt7621-mmc/sd.c index 1d0829e6..1196e8eb86c5 100644 --- a/drivers/staging/mt7621-mmc/sd.c +++ b/drivers/staging/mt7621-mmc/sd.c @@ -1040,66 +1040,42 @@ static void msdc_dma_config(struct msdc_host *host, struct msdc_dma *dma) struct gpd *gpd; struct bd *bd; - switch (dma->mode) { - case MSDC_MODE_DMA_BASIC: - BUG_ON(host->xfer_size > 65535); - BUG_ON(dma->sglen != 1); - writel(PHYSADDR(sg_dma_address(sg)), MSDC_DMA_SA); - sdr_set_field(MSDC_DMA_CTRL, MSDC_DMA_CTRL_LASTBUF, 1); -//#if defined (CONFIG_RALINK_MT7620) - if (ralink_soc == MT762X_SOC_MT7620A) - sdr_set_field(MSDC_DMA_CTRL, MSDC_DMA_CTRL_XFERSZ, sg_dma_len(sg)); -//#elif defined (CONFIG_RALINK_MT7621) || defined (CONFIG_RALINK_MT7628) + /* calculate the required number of gpd */ + num = (dma->sglen + MAX_BD_PER_GPD - 1) / MAX_BD_PER_GPD; + BUG_ON(num != 1); + + gpd = dma->gpd; + bd = dma->bd; + + /* modify gpd*/ + //gpd->intr = 0; + gpd->hwo = 1; /* hw will clear it */ + gpd->bdp = 1; + gpd->chksum = 0; /* need to clear first. */ + gpd->chksum = msdc_dma_calcs((u8 *)gpd, 16); + + /* modify bd*/ + for_each_sg(dma->sg, sg, dma->sglen, j) { + bd[j].blkpad = 0; + bd[j].dwpad = 0; + bd[j].ptr = (void *)sg_dma_address(sg); + bd[j].buflen = sg_dma_len(sg); + + if (j == dma->sglen - 1) + bd[j].eol = 1; /* the last bd */ else - writel(sg_dma_len(sg), (void __iomem *)(RALINK_MSDC_BASE + 0xa8)); -//#endif - sdr_set_field(MSDC_DMA_CTRL, MSDC_DMA_CTRL_BRUSTSZ, - MSDC_BRUST_64B); - sdr_set_field(MSDC_DMA_CTRL, MSDC_DMA_CTRL_MODE, 0); - break; - case MSDC_MODE_DMA_DESC: - - /* calculate the required number of gpd */ - num = (dma->sglen + MAX_BD_PER_GPD - 1) / MAX_BD_PER_GPD; - BUG_ON(num != 1); - - gpd = dma->gpd; - bd = dma->bd; - - /* modify gpd*/ - //gpd->intr = 0; - gpd->hwo = 1; /* hw will clear it */ - gpd->bdp = 1; - gpd->chksum = 0; /* need to clear first. */ - gpd->chksum = msdc_dma_calcs((u8 *)gpd, 16); - - /* modify bd*/ - for_each_sg(dma->sg, sg, dma->sglen, j) { - bd[j].blkpad = 0; - bd[j].dwpad = 0; - bd[j].ptr = (void *)sg_dma_address(sg); - bd[j].buflen = sg_dma_len(sg); - - if (j == dma->sglen - 1) - bd[j].eol = 1; /* the last bd */ - else - bd[j].eol = 0; + bd[j].eol = 0; - bd[j].chksum = 0; /* checksume need to clear first */ - bd[j].chksum = msdc_dma_calcs((u8 *)(&bd[j]), 16); - } + bd[j].chksum = 0; /* checksume need to clear first */ + bd[j].chksum = msdc_dma_calcs((u8 *)(&bd[j]), 16); + } - sdr_set_field(MSDC_DMA_CFG, MSDC_DMA_CFG_DECSEN, 1); - sdr_set_field(MSDC_DMA_CTRL, MSDC_DMA_CTRL_BRUSTSZ, - MSDC_BRUST_64B); - sdr_set_field(MSDC_DMA_CTRL, MSDC_DMA_CTRL_MODE, 1); + sdr_set_field(MSDC_DMA_CFG, MSDC_DMA_CFG_DECSEN, 1); + sdr_set_field(MSDC_DMA_CTRL, MSDC_DMA_CTRL_BRUSTSZ, + MSDC_BRUST_64B); + sdr_set_field(MSDC_DMA_CTRL, MSDC_DMA_CTRL_MODE, 1); - writel(PHYSADDR((u32)dma->gpd_addr), MSDC_DMA_SA); - break; - - default: - break; - } + writel(PHYSADDR((u32)dma->gpd_addr), MSDC_DMA_SA); N_MSG(DMA, "DMA_CTRL = 0x%x", readl(MSDC_DMA_CTRL)); N_MSG(DMA, "DMA_CFG = 0x%x", readl(MSDC_DMA_CFG)); -- 2.16.1 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH v6] Drivers: HV: Send one page worth of kmsg dump over Hyper-V during panic
In the VM mode on Hyper-V, currently, when the kernel panics, an error code and few register values are populated in an MSR and the Hypervisor notified. This information is collected on the host. The amount of information currently collected is found to be limited and not very actionable. To gather more actionable data, such as stack trace, the proposal is to write one page worth of kmsg data on an allocated page and the Hypervisor notified of the page address through the MSR. - Sysctl option to control the behavior, with ON by default. Cc: K. Y. Srinivasan Cc: Stephen Hemminger Signed-off-by: Sunil Muthuswamy --- Changes since v1: - Added a sysctl config option to allow the user to control if panic message should be reported to Hyper-V. Changes since v2: - Addressed comments from Greg KH. - Moved the sysctl config option from 'kernel.hyperv' to 'kernel.' since the likelihood of having many Hyper-V specific sysctl config options seemed less and so having a specific dir for Hyper-V seemed unnecessary overhead. Changes since v3: - The feature is only enabled if the capability is supported by the hypervisor. This is done by reading the crash control MSR, in addition to the pre-existing check for the hypervisor feature using the CPUID. Changes since v4: - Addressed comments from Dexuan Cui: moved the global variable to static. Changes since v5: - Addressed comments from KY Srinivasan: errors during panic message initialization are no longer fatal. --- Documentation/sysctl/kernel.txt| 11 arch/x86/hyperv/hv_init.c | 27 + arch/x86/include/asm/hyperv-tlfs.h | 5 +- arch/x86/include/asm/mshyperv.h| 1 + drivers/hv/vmbus_drv.c | 110 + 5 files changed, 152 insertions(+), 2 deletions(-) diff --git a/Documentation/sysctl/kernel.txt b/Documentation/sysctl/kernel.txt index eded671d..5958503 100644 --- a/Documentation/sysctl/kernel.txt +++ b/Documentation/sysctl/kernel.txt @@ -39,6 +39,7 @@ show up in /proc/sys/kernel: - hung_task_check_count - hung_task_timeout_secs - hung_task_warnings +- hyperv_record_panic_msg - kexec_load_disabled - kptr_restrict - l2cr[ PPC only ] @@ -374,6 +375,16 @@ This file shows up if CONFIG_DETECT_HUNG_TASK is enabled. == +hyperv_record_panic_msg: + +Controls whether the panic kmsg data should be reported to Hyper-V. + +0: do not report panic kmsg data. + +1: report the panic kmsg data. This is the default behavior. + +== + kexec_load_disabled: A toggle indicating if the kexec_load syscall has been disabled. This diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c index cfecc22..af57162 100644 --- a/arch/x86/hyperv/hv_init.c +++ b/arch/x86/hyperv/hv_init.c @@ -395,6 +395,33 @@ void hyperv_report_panic(struct pt_regs *regs, long err) } EXPORT_SYMBOL_GPL(hyperv_report_panic); +/** + * hyperv_report_panic_msg - report panic message to Hyper-V + * @pa: physical address of the panic page containing the message + * @size: size of the message in the page + */ +void hyperv_report_panic_msg(phys_addr_t pa, size_t size) +{ + /* +* P3 to contain the physical address of the panic page & P4 to +* contain the size of the panic data in that page. Rest of the +* registers are no-op when the NOTIFY_MSG flag is set. +*/ + wrmsrl(HV_X64_MSR_CRASH_P0, 0); + wrmsrl(HV_X64_MSR_CRASH_P1, 0); + wrmsrl(HV_X64_MSR_CRASH_P2, 0); + wrmsrl(HV_X64_MSR_CRASH_P3, pa); + wrmsrl(HV_X64_MSR_CRASH_P4, size); + + /* +* Let Hyper-V know there is crash data available along with +* the panic message. +*/ + wrmsrl(HV_X64_MSR_CRASH_CTL, + (HV_CRASH_CTL_CRASH_NOTIFY | HV_CRASH_CTL_CRASH_NOTIFY_MSG)); +} +EXPORT_SYMBOL_GPL(hyperv_report_panic_msg); + bool hv_is_hyperv_initialized(void) { union hv_x64_msr_hypercall_contents hypercall_msr; diff --git a/arch/x86/include/asm/hyperv-tlfs.h b/arch/x86/include/asm/hyperv-tlfs.h index 416cb0e..76c58af 100644 --- a/arch/x86/include/asm/hyperv-tlfs.h +++ b/arch/x86/include/asm/hyperv-tlfs.h @@ -171,9 +171,10 @@ #define HV_X64_ENLIGHTENED_VMCS_RECOMMENDED(1 << 14) /* - * Crash notification flag. + * Crash notification flags. */ -#define HV_CRASH_CTL_CRASH_NOTIFY (1ULL << 63) +#define HV_CRASH_CTL_CRASH_NOTIFY_MSG BIT_ULL(62) +#define HV_CRASH_CTL_CRASH_NOTIFY BIT_ULL(63) /* MSR used to identify the guest OS. */ #define HV_X64_MSR_GUEST_OS_ID 0x4000 diff --git a/arch/x86/include/asm/mshyperv.h b/arch/x86/include/asm/mshyperv.h index b90e796..ac83f2d 100644 --- a/arch/x86/include/asm/mshyperv.h +++ b/arch/x86/include/asm/mshyperv.h @@ -262,6 +262,7 @@ void hyperv_init(void); void hyperv_setup_mmu_ops(void); void hyper_alloc_mmu(void); void hyperv_re
[PATCH net 2/3] hv_netvsc: fix network namespace issues with VF support
When finding the parent netvsc device, the search needs to be across all netvsc device instances (independent of network namespace). Find parent device of VF using upper_dev_get routine which searches only adjacent list. Fixes: e8ff40d4bff1 ("hv_netvsc: improve VF device matching") Signed-off-by: Stephen Hemminger netns aware byref --- drivers/net/hyperv/hyperv_net.h | 2 ++ drivers/net/hyperv/netvsc_drv.c | 43 +++-- 2 files changed, 22 insertions(+), 23 deletions(-) diff --git a/drivers/net/hyperv/hyperv_net.h b/drivers/net/hyperv/hyperv_net.h index 1be34d2e3563..c0b3f3c125d4 100644 --- a/drivers/net/hyperv/hyperv_net.h +++ b/drivers/net/hyperv/hyperv_net.h @@ -902,6 +902,8 @@ struct net_device_context { struct hv_device *device_ctx; /* netvsc_device */ struct netvsc_device __rcu *nvdev; + /* list of netvsc net_devices */ + struct list_head list; /* reconfigure work */ struct delayed_work dwork; /* last reconfig time */ diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c index 2d4370c94b6e..8cb21e013d1d 100644 --- a/drivers/net/hyperv/netvsc_drv.c +++ b/drivers/net/hyperv/netvsc_drv.c @@ -69,6 +69,8 @@ static int debug = -1; module_param(debug, int, 0444); MODULE_PARM_DESC(debug, "Debug level (0=none,...,16=all)"); +static LIST_HEAD(netvsc_dev_list); + static void netvsc_change_rx_flags(struct net_device *net, int change) { struct net_device_context *ndev_ctx = netdev_priv(net); @@ -1783,13 +1785,10 @@ static void netvsc_link_change(struct work_struct *w) static struct net_device *get_netvsc_bymac(const u8 *mac) { - struct net_device *dev; - - ASSERT_RTNL(); + struct net_device_context *ndev_ctx; - for_each_netdev(&init_net, dev) { - if (dev->netdev_ops != &device_ops) - continue; /* not a netvsc device */ + list_for_each_entry(ndev_ctx, &netvsc_dev_list, list) { + struct net_device *dev = hv_get_drvdata(ndev_ctx->device_ctx); if (ether_addr_equal(mac, dev->perm_addr)) return dev; @@ -1800,25 +1799,18 @@ static struct net_device *get_netvsc_bymac(const u8 *mac) static struct net_device *get_netvsc_byref(struct net_device *vf_netdev) { + struct net_device_context *net_device_ctx; struct net_device *dev; - ASSERT_RTNL(); - - for_each_netdev(&init_net, dev) { - struct net_device_context *net_device_ctx; + dev = netdev_master_upper_dev_get(vf_netdev); + if (!dev || dev->netdev_ops != &device_ops) + return NULL;/* not a netvsc device */ - if (dev->netdev_ops != &device_ops) - continue; /* not a netvsc device */ + net_device_ctx = netdev_priv(dev); + if (!rtnl_dereference(net_device_ctx->nvdev)) + return NULL;/* device is removed */ - net_device_ctx = netdev_priv(dev); - if (!rtnl_dereference(net_device_ctx->nvdev)) - continue; /* device is removed */ - - if (rtnl_dereference(net_device_ctx->vf_netdev) == vf_netdev) - return dev; /* a match */ - } - - return NULL; + return dev; } /* Called when VF is injecting data into network stack. @@ -2095,15 +2087,19 @@ static int netvsc_probe(struct hv_device *dev, else net->max_mtu = ETH_DATA_LEN; - ret = register_netdev(net); + rtnl_lock(); + ret = register_netdevice(net); if (ret != 0) { pr_err("Unable to register netdev.\n"); goto register_failed; } - return ret; + list_add(&net_device_ctx->list, &netvsc_dev_list); + rtnl_unlock(); + return 0; register_failed: + rtnl_unlock(); rndis_filter_device_remove(dev, nvdev); rndis_failed: free_percpu(net_device_ctx->vf_stats); @@ -2149,6 +2145,7 @@ static int netvsc_remove(struct hv_device *dev) rndis_filter_device_remove(dev, nvdev); unregister_netdevice(net); + list_del(&ndev_ctx->list); rtnl_unlock(); rcu_read_unlock(); -- 2.17.1 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH net 3/3] hv_netvsc: move VF to same namespace as netvsc device
When VF is added, the paravirtual device is already present and may have been moved to another network namespace. For example, sometimes the management interface is put in another net namespace in some environments. The VF should get moved to where the netvsc device is when the VF is discovered. The user can move it later (if desired). Signed-off-by: Stephen Hemminger --- drivers/net/hyperv/netvsc_drv.c | 21 - 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c index 8cb21e013d1d..bf1b845c1147 100644 --- a/drivers/net/hyperv/netvsc_drv.c +++ b/drivers/net/hyperv/netvsc_drv.c @@ -1930,6 +1930,7 @@ static int netvsc_register_vf(struct net_device *vf_netdev) struct net_device *ndev; struct net_device_context *net_device_ctx; struct netvsc_device *netvsc_dev; + int ret; if (vf_netdev->addr_len != ETH_ALEN) return NOTIFY_DONE; @@ -1948,11 +1949,29 @@ static int netvsc_register_vf(struct net_device *vf_netdev) if (!netvsc_dev || rtnl_dereference(net_device_ctx->vf_netdev)) return NOTIFY_DONE; - if (netvsc_vf_join(vf_netdev, ndev) != 0) + /* if syntihetic interface is a different namespace, +* then move the VF to that namespace; join will be +* done again in that context. +*/ + if (!net_eq(dev_net(ndev), dev_net(vf_netdev))) { + ret = dev_change_net_namespace(vf_netdev, + dev_net(ndev), "eth%d"); + if (ret) + netdev_err(vf_netdev, + "could not move to same namespace as %s: %d\n", + ndev->name, ret); + else + netdev_info(vf_netdev, + "VF moved to namespace with: %s\n", + ndev->name); return NOTIFY_DONE; + } netdev_info(ndev, "VF registering: %s\n", vf_netdev->name); + if (netvsc_vf_join(vf_netdev, ndev) != 0) + return NOTIFY_DONE; + dev_hold(vf_netdev); rcu_assign_pointer(net_device_ctx->vf_netdev, vf_netdev); return NOTIFY_OK; -- 2.17.1 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH net 1/3] hv_netvsc: drop common code until callback model fixed
The callback model of handling network failover is not suitable in the current form. 1. It was merged without addressing all the review feedback. 2. It was merged without approval of any of the netvsc maintainers. 3. Design discussion on how to handle PV/VF fallback is still not complete. 4. IMHO the code model using callbacks is trying to make something common which isn't. Revert the netvsc specific changes for now. Does not impact ongoing development of failover model for virtio. Revisit this after a simpler library based failover kernel routines are extracted. This reverts commit 9c6ffbacdb57 ("hv_netvsc: fix error return code in netvsc_probe()") and commit 1ff78076d8dd ("netvsc: refactor notifier/event handling code to use the failover framework") Signed-off-by: Stephen Hemminger --- drivers/net/hyperv/Kconfig | 1 - drivers/net/hyperv/hyperv_net.h | 2 - drivers/net/hyperv/netvsc_drv.c | 224 +++- 3 files changed, 165 insertions(+), 62 deletions(-) diff --git a/drivers/net/hyperv/Kconfig b/drivers/net/hyperv/Kconfig index 23a2d145813a..0765d5f61714 100644 --- a/drivers/net/hyperv/Kconfig +++ b/drivers/net/hyperv/Kconfig @@ -2,6 +2,5 @@ config HYPERV_NET tristate "Microsoft Hyper-V virtual network driver" depends on HYPERV select UCS2_STRING - select FAILOVER help Select this option to enable the Hyper-V virtual network driver. diff --git a/drivers/net/hyperv/hyperv_net.h b/drivers/net/hyperv/hyperv_net.h index 99d8e7398a5b..1be34d2e3563 100644 --- a/drivers/net/hyperv/hyperv_net.h +++ b/drivers/net/hyperv/hyperv_net.h @@ -932,8 +932,6 @@ struct net_device_context { u32 vf_alloc; /* Serial number of the VF to team with */ u32 vf_serial; - - struct failover *failover; }; /* Per channel data */ diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c index 8eec156418ea..2d4370c94b6e 100644 --- a/drivers/net/hyperv/netvsc_drv.c +++ b/drivers/net/hyperv/netvsc_drv.c @@ -43,7 +43,6 @@ #include #include #include -#include #include "hyperv_net.h" @@ -1782,6 +1781,46 @@ static void netvsc_link_change(struct work_struct *w) rtnl_unlock(); } +static struct net_device *get_netvsc_bymac(const u8 *mac) +{ + struct net_device *dev; + + ASSERT_RTNL(); + + for_each_netdev(&init_net, dev) { + if (dev->netdev_ops != &device_ops) + continue; /* not a netvsc device */ + + if (ether_addr_equal(mac, dev->perm_addr)) + return dev; + } + + return NULL; +} + +static struct net_device *get_netvsc_byref(struct net_device *vf_netdev) +{ + struct net_device *dev; + + ASSERT_RTNL(); + + for_each_netdev(&init_net, dev) { + struct net_device_context *net_device_ctx; + + if (dev->netdev_ops != &device_ops) + continue; /* not a netvsc device */ + + net_device_ctx = netdev_priv(dev); + if (!rtnl_dereference(net_device_ctx->nvdev)) + continue; /* device is removed */ + + if (rtnl_dereference(net_device_ctx->vf_netdev) == vf_netdev) + return dev; /* a match */ + } + + return NULL; +} + /* Called when VF is injecting data into network stack. * Change the associated network device from VF to netvsc. * note: already called with rcu_read_lock @@ -1804,6 +1843,46 @@ static rx_handler_result_t netvsc_vf_handle_frame(struct sk_buff **pskb) return RX_HANDLER_ANOTHER; } +static int netvsc_vf_join(struct net_device *vf_netdev, + struct net_device *ndev) +{ + struct net_device_context *ndev_ctx = netdev_priv(ndev); + int ret; + + ret = netdev_rx_handler_register(vf_netdev, +netvsc_vf_handle_frame, ndev); + if (ret != 0) { + netdev_err(vf_netdev, + "can not register netvsc VF receive handler (err = %d)\n", + ret); + goto rx_handler_failed; + } + + ret = netdev_master_upper_dev_link(vf_netdev, ndev, + NULL, NULL, NULL); + if (ret != 0) { + netdev_err(vf_netdev, + "can not set master device %s (err = %d)\n", + ndev->name, ret); + goto upper_link_failed; + } + + /* set slave flag before open to prevent IPv6 addrconf */ + vf_netdev->flags |= IFF_SLAVE; + + schedule_delayed_work(&ndev_ctx->vf_takeover, VF_TAKEOVER_INT); + + call_netdevice_notifiers(NETDEV_JOIN, vf_netdev); + + netdev_info(vf_netdev, "joined to %s\n", ndev->name); + return 0; + +upper_link_failed: + netdev_rx_handler_unregister(vf_netdev); +rx_handler_failed
[PATCH net 0/3] hv_netvsc: notification and namespace fixes
This set of patches addresses two set of fixes. First it backs out the common callback model which was merged in net-next without completing all the review feedback or getting maintainer approval. Then it fixes the transparent VF management code to handle network namespaces. Stephen Hemminger (3): hv_netvsc: drop common code until callback model fixed hv_netvsc: fix network namespace issues with VF support hv_netvsc: move VF to same namespace as netvsc device drivers/net/hyperv/Kconfig | 1 - drivers/net/hyperv/hyperv_net.h | 4 +- drivers/net/hyperv/netvsc_drv.c | 242 3 files changed, 184 insertions(+), 63 deletions(-) -- 2.17.1 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
RE: [PATCH v5] Drivers: HV: Send one page worth of kmsg dump over Hyper-V during panic
> -Original Message- > From: KY Srinivasan > Sent: Monday, June 11, 2018 11:39 AM > To: Sunil Muthuswamy ; Haiyang Zhang > > Cc: de...@linuxdriverproject.org; Stephen Hemminger > > Subject: RE: [PATCH v5] Drivers: HV: Send one page worth of kmsg dump > over Hyper-V during panic > > > > > -Original Message- > > From: Sunil Muthuswamy > > Sent: Monday, June 11, 2018 10:44 AM > > To: KY Srinivasan ; Haiyang Zhang > > > > Cc: de...@linuxdriverproject.org; Stephen Hemminger > > > > Subject: RE: [PATCH v5] Drivers: HV: Send one page worth of kmsg dump > > over Hyper-V during panic > > > > > > > > > -Original Message- > > > From: KY Srinivasan > > > Sent: Sunday, June 10, 2018 2:54 PM > > > To: Sunil Muthuswamy ; Haiyang Zhang > > > > > > Cc: de...@linuxdriverproject.org; Stephen Hemminger > > > > > > Subject: RE: [PATCH v5] Drivers: HV: Send one page worth of kmsg dump > > > over Hyper-V during panic > > > > > > > > > > > > > -Original Message- > > > > From: Sunil Muthuswamy > > > > Sent: Friday, June 8, 2018 11:39 AM > > > > To: Haiyang Zhang > > > > Cc: de...@linuxdriverproject.org; Sunil Muthuswamy > > > > ; KY Srinivasan ; > > Stephen > > > > Hemminger > > > > Subject: [PATCH v5] Drivers: HV: Send one page worth of kmsg dump > > over > > > > Hyper-V during panic > > > > > > > > In the VM mode on Hyper-V, currently, when the kernel panics, an > error > > > > code and few register values are populated in an MSR and the > Hypervisor > > > > notified. This information is collected on the host. The amount of > > > > information currently collected is found to be limited and not very > > > > actionable. To gather more actionable data, such as stack trace, the > > > > proposal is to write one page worth of kmsg data on an allocated page > > > > and the Hypervisor notified of the page address through the MSR. > > > > > > Snip. > > > > > /* > > > > * vmbus_bus_init -Main vmbus driver initialization routine. > > > > @@ -1065,6 +1136,38 @@ static int vmbus_bus_init(void) > > > > * Only register if the crash MSRs are available > > > > */ > > > > if (ms_hyperv.misc_features & > > > > HV_FEATURE_GUEST_CRASH_MSR_AVAILABLE) { > > > > + u64 hyperv_crash_ctl; > > > > + if (!hv_ctl_table_hdr) { > > > When vmus_bus_init is invoked, would hv_ctl_table_hdr ever be > > > Non-NULL? > Ping. Missed this somehow. It should not be. Will fix this as well in the next version. > > Snip. > > Regards, > > K. Y ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
RE: [PATCH v5] Drivers: HV: Send one page worth of kmsg dump over Hyper-V during panic
> -Original Message- > From: Sunil Muthuswamy > Sent: Monday, June 11, 2018 10:44 AM > To: KY Srinivasan ; Haiyang Zhang > > Cc: de...@linuxdriverproject.org; Stephen Hemminger > > Subject: RE: [PATCH v5] Drivers: HV: Send one page worth of kmsg dump > over Hyper-V during panic > > > > > -Original Message- > > From: KY Srinivasan > > Sent: Sunday, June 10, 2018 2:54 PM > > To: Sunil Muthuswamy ; Haiyang Zhang > > > > Cc: de...@linuxdriverproject.org; Stephen Hemminger > > > > Subject: RE: [PATCH v5] Drivers: HV: Send one page worth of kmsg dump > > over Hyper-V during panic > > > > > > > > > -Original Message- > > > From: Sunil Muthuswamy > > > Sent: Friday, June 8, 2018 11:39 AM > > > To: Haiyang Zhang > > > Cc: de...@linuxdriverproject.org; Sunil Muthuswamy > > > ; KY Srinivasan ; > Stephen > > > Hemminger > > > Subject: [PATCH v5] Drivers: HV: Send one page worth of kmsg dump > over > > > Hyper-V during panic > > > > > > In the VM mode on Hyper-V, currently, when the kernel panics, an error > > > code and few register values are populated in an MSR and the Hypervisor > > > notified. This information is collected on the host. The amount of > > > information currently collected is found to be limited and not very > > > actionable. To gather more actionable data, such as stack trace, the > > > proposal is to write one page worth of kmsg data on an allocated page > > > and the Hypervisor notified of the page address through the MSR. > > > Snip. > > > /* > > > * vmbus_bus_init -Main vmbus driver initialization routine. > > > @@ -1065,6 +1136,38 @@ static int vmbus_bus_init(void) > > >* Only register if the crash MSRs are available > > >*/ > > > if (ms_hyperv.misc_features & > > > HV_FEATURE_GUEST_CRASH_MSR_AVAILABLE) { > > > + u64 hyperv_crash_ctl; > > > + if (!hv_ctl_table_hdr) { > > When vmus_bus_init is invoked, would hv_ctl_table_hdr ever be > > Non-NULL? Ping. Snip. Regards, K. Y ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH] staging: android: ion: Return an ERR_PTR in ion_map_kernel
The expected return value from ion_map_kernel is an ERR_PTR. The error path for a vmalloc failure currently just returns NULL, triggering a warning in ion_buffer_kmap_get. Encode the vmalloc failure as an ERR_PTR. Reported-by: syzbot+55b1d9f811650de94...@syzkaller.appspotmail.com Signed-off-by: Laura Abbott --- drivers/staging/android/ion/ion_heap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/staging/android/ion/ion_heap.c b/drivers/staging/android/ion/ion_heap.c index 772dad65396e..f32c12439eee 100644 --- a/drivers/staging/android/ion/ion_heap.c +++ b/drivers/staging/android/ion/ion_heap.c @@ -29,7 +29,7 @@ void *ion_heap_map_kernel(struct ion_heap *heap, struct page **tmp = pages; if (!pages) - return NULL; + return ERR_PTR(-ENOMEM); if (buffer->flags & ION_FLAG_CACHED) pgprot = PAGE_KERNEL; -- 2.17.0 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
RE: [PATCH v5] Drivers: HV: Send one page worth of kmsg dump over Hyper-V during panic
> -Original Message- > From: KY Srinivasan > Sent: Sunday, June 10, 2018 2:54 PM > To: Sunil Muthuswamy ; Haiyang Zhang > > Cc: de...@linuxdriverproject.org; Stephen Hemminger > > Subject: RE: [PATCH v5] Drivers: HV: Send one page worth of kmsg dump > over Hyper-V during panic > > > > > -Original Message- > > From: Sunil Muthuswamy > > Sent: Friday, June 8, 2018 11:39 AM > > To: Haiyang Zhang > > Cc: de...@linuxdriverproject.org; Sunil Muthuswamy > > ; KY Srinivasan ; Stephen > > Hemminger > > Subject: [PATCH v5] Drivers: HV: Send one page worth of kmsg dump over > > Hyper-V during panic > > > > In the VM mode on Hyper-V, currently, when the kernel panics, an error > > code and few register values are populated in an MSR and the Hypervisor > > notified. This information is collected on the host. The amount of > > information currently collected is found to be limited and not very > > actionable. To gather more actionable data, such as stack trace, the > > proposal is to write one page worth of kmsg data on an allocated page > > and the Hypervisor notified of the page address through the MSR. > > > > - Sysctl option to control the behavior, with ON by default. > > > > Cc: K. Y. Srinivasan > > Cc: Stephen Hemminger > > Signed-off-by: Sunil Muthuswamy > > --- > > Changes since v1: > > - Added a sysctl config option to allow the user to control if panic message > > should be reported to Hyper-V. > > > > Changes since v2: > > - Addressed comments from Greg KH. > > - Moved the sysctl config option from 'kernel.hyperv' to 'kernel.' since the > > likelihood of having many Hyper-V specific sysctl config options seemed > less > > and so having a specific dir for Hyper-V seemed unnecessary overhead. > > > > Changes since v3: > > - The feature is only enabled if the capability is supported by the > hypervisor. > > This is done by reading the crash control MSR, in addition to the pre- > existing > > check for the hypervisor feature using the CPUID. > > > > Changes since v4: > > - Addressed comments from Dexuan Cui: moved the global variable to > static. > > --- > > Documentation/sysctl/kernel.txt| 11 > > arch/x86/hyperv/hv_init.c | 27 + > > arch/x86/include/asm/hyperv-tlfs.h | 5 +- > > arch/x86/include/asm/mshyperv.h| 1 + > > drivers/hv/vmbus_drv.c | 116 > > + > > 5 files changed, 158 insertions(+), 2 deletions(-) > > > > diff --git a/Documentation/sysctl/kernel.txt > > b/Documentation/sysctl/kernel.txt > > index eded671d..5958503 100644 > > --- a/Documentation/sysctl/kernel.txt > > +++ b/Documentation/sysctl/kernel.txt > > @@ -39,6 +39,7 @@ show up in /proc/sys/kernel: > > - hung_task_check_count > > - hung_task_timeout_secs > > - hung_task_warnings > > +- hyperv_record_panic_msg > > - kexec_load_disabled > > - kptr_restrict > > - l2cr[ PPC only ] > > @@ -374,6 +375,16 @@ This file shows up if CONFIG_DETECT_HUNG_TASK > is > > enabled. > > > > > > > == > > > > > > +hyperv_record_panic_msg: > > + > > +Controls whether the panic kmsg data should be reported to Hyper-V. > > + > > +0: do not report panic kmsg data. > > + > > +1: report the panic kmsg data. This is the default behavior. > > + > > > += > > = > > + > > kexec_load_disabled: > > > > A toggle indicating if the kexec_load syscall has been disabled. This > > diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c > > index cfecc22..af57162 100644 > > --- a/arch/x86/hyperv/hv_init.c > > +++ b/arch/x86/hyperv/hv_init.c > > @@ -395,6 +395,33 @@ void hyperv_report_panic(struct pt_regs *regs, > long > > err) > > } > > EXPORT_SYMBOL_GPL(hyperv_report_panic); > > > > +/** > > + * hyperv_report_panic_msg - report panic message to Hyper-V > > + * @pa: physical address of the panic page containing the message > > + * @size: size of the message in the page > > + */ > > +void hyperv_report_panic_msg(phys_addr_t pa, size_t size) > > +{ > > + /* > > +* P3 to contain the physical address of the panic page & P4 to > > +* contain the size of the panic data in that page. Rest of the > > +* registers are no-op when the NOTIFY_MSG flag is set. > > +*/ > > + wrmsrl(HV_X64_MSR_CRASH_P0, 0); > > + wrmsrl(HV_X64_MSR_CRASH_P1, 0); > > + wrmsrl(HV_X64_MSR_CRASH_P2, 0); > > + wrmsrl(HV_X64_MSR_CRASH_P3, pa); > > + wrmsrl(HV_X64_MSR_CRASH_P4, size); > > + > > + /* > > +* Let Hyper-V know there is crash data available along with > > +* the panic message. > > +*/ > > + wrmsrl(HV_X64_MSR_CRASH_CTL, > > + (HV_CRASH_CTL_CRASH_NOTIFY | > > HV_CRASH_CTL_CRASH_NOTIFY_MSG)); > > +} > > +EXPORT_SYMBOL_GPL(hyperv_report_panic_msg); > > + > > bool hv_is_hyperv_initialized(void) > > { > > union hv_x64_msr_hypercall_contents hypercall_msr; > > diff --git a/a
Important Notification
Dear Recipent , This email address has won Three Million Pounds on the o2 mobile sweepstakes.Please Contact Payment Cordinator Mat on email : mrw...@o2loto.co.uk for explanation and payment processing . Yours Faithfully Debbie Spence Cordinator O2 Mobile Promotional Sweepstakes. ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
Re: [PATCH v2] staging: mt7621-gpio: avoid custom irq_domain for gpio
On Mon, Jun 11, 2018 at 06:26:09PM +1000, NeilBrown wrote: > On Mon, Jun 11 2018, Sergio Paracuellos wrote: > > > Instead of create a custom irq_domain for this chip, use > > 'gpiochip_set_chained_irqchip' from GPIOLIB_IRQCHIP. It > > is ok to call this function several times. You only have to > > mark the line with 'IRQF_SHARED' and then loop over the > > three banks until you find a hit. There were some problems > > with removing an irqchip like that but this driver is a bool > > so it might work just fine. After this changes the functions > > 'mediatek_gpio_to_irq' is not needed anymore and also the > > 'gpio_irq_domain' field from the state container. Instead of > > use the custom irq domain in the irq handler use the associated > > domain from the gpio_chip in 'irq_find_mapping' function. > > Function 'mediatek_gpio_bank_probe' has been moved a it to the > > botton to have all the irq related functions together and avoid > > some forward declarations to resolve some symbols along the code. > > > > Signed-off-by: Sergio Paracuellos > > Thanks for this. > The patch has two problems. > 1/ it doesn't compile unless CONFIG_GPIOLIB_IRQCHIP is selected. > So we need "select GPIOLIB_IRQCHIP" in Kconfig > > 2/ The interrupt line has not been marked IRQF_SHARED. > I cannot figure out how to mark it as IRQF_SHARED. > If I hack the code so that mediatek_gpio_bank_probe() > is only called for the first bank, then interrupt from > that bank work fine. > If I let it be called for all three banks, then on the first interrupt, > the system starts to hang. The way to do this seems to mark IRQF_SHARED using devm_request_irq and then passing out NULL as irq handler in gpiochip_set_chained_irqchip. The prototype for the irq handler change also from the normal irqreturn_t stuff. I have just sent a new PATCH (included in the v3 of 'last cleanups' series) following this approach. Hope this helps and works :-), > > Thanks, > NeilBrown Best regards, Sergio Paracuellos ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
Re: [PATCH v2 0/7] staging: mt7621-gpio: last cleanups
On Mon, Jun 11, 2018 at 06:33:44PM +1000, NeilBrown wrote: > On Mon, Jun 11 2018, Sergio Paracuellos wrote: > > > After submiting this driver to try to get mainlined and get > > out of staging some new cleanups seems to be necessary. > > According to this main of Linus Walleij: > > > > http://driverdev.linuxdriverproject.org/pipermail/driverdev-devel/2018-June/121742.html > > > > this series tries to fix all of the issues in order to send > > v2 and give it a new try. Because I don't have to hardware to > > test my changes I send new cleanups first in staging to make > > easier to NeilBrown test it and get a feedback about them. > > > > Changes in v2: > > - Patch where GPIOLIB_IRQCHIP was used avoiding > > the use of a custom irq domain has been dropped to > > be sure after this changes all is working properly. > > (This was PATCH 7 in previous series) > > - PATCH 1: > > * avoid introducing new macros and use 'bank' > >field of mtk_gc with register offset. > > * Make correct use of bgpio_init passing new > >void __iomem pointers instead of use the > >macros. > > - Previous series PATCH 8 now is PATCH 7. Avoid the > > use of a switch-case statement which was wrong and > > distinc if we have RISSING AND FALLING EDGE interrupt > > or HIGH LOW level ones. This last two are exclusive and > > cannot be generated at the same time. > > > > Also, I think is we finally avoid to use a new irq_domain the > > need for the new functions introduced for request and release > > resources dissapears. I was diving down the other drivers code > > and I see that these two only are used in drivers which use its > > own irq_domain. Correct me if I am wrong, please. > > > > Hope this helps. > > > > Thanks in advance. > > Thanks a lot. > This series appears to work, though I sent a separate comment on one > piece of code. Thanks for testing, review and feedback. I have resent a complete v3 of this series taking into account your comments there. > However the gpio are numbers > 480-511 > 448-479 > 416-447 > > instead of > 0-31 > 32-63 > 64-95 > > which would be more normal. > Maybe when you resubmit I'll raid it with Linus Walleij and see if he > can explain why I can't have 0-95. This change is because the chip.base property changed to be -1 for dynamic enumeration of the gpio's. In this mail there is some explanation about it: http://lists.infradead.org/pipermail/linux-rpi-kernel/2014-October/001045.html Best regards, Sergio Paracuellos > > Thanks, > NeilBrown > > > > > > Best regards, > > Sergio Paracuellos > > > > Sergio Paracuellos (7): > > staging: mt7621-gpio: make use 'bgpio_init' from GPIO_GENERIC > > staging: mt7621-gpio: avoid including 'gpio.h' > > staging: mt7621-gpio: make use of 'builtin_platform_driver' > > staging: mt7621-gpio: implement '.irq_[request|release]_resources' > > functions > > staging: mt7621-gpio: add COMPILE_TEST > > staging: mt7621-gpio: add kerneldoc for state data containers > > staging: mt7621-gpio: implement high level and low level irqs > > > > drivers/staging/mt7621-gpio/Kconfig | 3 +- > > drivers/staging/mt7621-gpio/gpio-mt7621.c | 251 > > -- > > 2 files changed, 138 insertions(+), 116 deletions(-) > > > > -- > > 2.7.4 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH v3 7/8] staging: mt7621-gpio: implement high level and low level irqs
This chip support high level and low level interrupts. Those have to be implemented also to get a complete and clean driver. Signed-off-by: Sergio Paracuellos --- drivers/staging/mt7621-gpio/gpio-mt7621.c | 47 --- 1 file changed, 37 insertions(+), 10 deletions(-) diff --git a/drivers/staging/mt7621-gpio/gpio-mt7621.c b/drivers/staging/mt7621-gpio/gpio-mt7621.c index 54c18c1..0c344a5 100644 --- a/drivers/staging/mt7621-gpio/gpio-mt7621.c +++ b/drivers/staging/mt7621-gpio/gpio-mt7621.c @@ -38,6 +38,8 @@ * @bank: gpio bank number for the chip * @rising: mask for rising irqs * @falling: mask for falling irqs + * @hlevel: mask for high level irqs + * @llevel: mask for low level irqs */ struct mtk_gc { struct gpio_chip chip; @@ -45,6 +47,8 @@ struct mtk_gc { int bank; u32 rising; u32 falling; + u32 hlevel; + u32 llevel; }; /** @@ -184,7 +188,7 @@ mediatek_gpio_irq_unmask(struct irq_data *d) int bank = pin / MTK_BANK_WIDTH; struct mtk_gc *rg = &gpio_data->gc_map[bank]; unsigned long flags; - u32 rise, fall; + u32 rise, fall, high, low; if (!rg) return; @@ -192,8 +196,12 @@ mediatek_gpio_irq_unmask(struct irq_data *d) spin_lock_irqsave(&rg->lock, flags); rise = mtk_gpio_r32(rg, GPIO_REG_REDGE); fall = mtk_gpio_r32(rg, GPIO_REG_FEDGE); + high = mtk_gpio_r32(rg, GPIO_REG_HLVL); + low = mtk_gpio_r32(rg, GPIO_REG_LLVL); mtk_gpio_w32(rg, GPIO_REG_REDGE, rise | (PIN_MASK(pin) & rg->rising)); mtk_gpio_w32(rg, GPIO_REG_FEDGE, fall | (PIN_MASK(pin) & rg->falling)); + mtk_gpio_w32(rg, GPIO_REG_HLVL, high | (PIN_MASK(pin) & rg->hlevel)); + mtk_gpio_w32(rg, GPIO_REG_LLVL, low | (PIN_MASK(pin) & rg->llevel)); spin_unlock_irqrestore(&rg->lock, flags); } @@ -205,7 +213,7 @@ mediatek_gpio_irq_mask(struct irq_data *d) int bank = pin / MTK_BANK_WIDTH; struct mtk_gc *rg = &gpio_data->gc_map[bank]; unsigned long flags; - u32 rise, fall; + u32 rise, fall, high, low; if (!rg) return; @@ -213,8 +221,12 @@ mediatek_gpio_irq_mask(struct irq_data *d) spin_lock_irqsave(&rg->lock, flags); rise = mtk_gpio_r32(rg, GPIO_REG_REDGE); fall = mtk_gpio_r32(rg, GPIO_REG_FEDGE); + high = mtk_gpio_r32(rg, GPIO_REG_HLVL); + low = mtk_gpio_r32(rg, GPIO_REG_LLVL); mtk_gpio_w32(rg, GPIO_REG_FEDGE, fall & ~PIN_MASK(pin)); mtk_gpio_w32(rg, GPIO_REG_REDGE, rise & ~PIN_MASK(pin)); + mtk_gpio_w32(rg, GPIO_REG_HLVL, high & ~PIN_MASK(pin)); + mtk_gpio_w32(rg, GPIO_REG_LLVL, low & ~PIN_MASK(pin)); spin_unlock_irqrestore(&rg->lock, flags); } @@ -231,21 +243,36 @@ mediatek_gpio_irq_type(struct irq_data *d, unsigned int type) return -1; if (type == IRQ_TYPE_PROBE) { - if ((rg->rising | rg->falling) & mask) + if ((rg->rising | rg->falling | +rg->hlevel | rg->llevel) & mask) return 0; type = IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING; } - if (type & IRQ_TYPE_EDGE_RISING) - rg->rising |= mask; - else - rg->rising &= ~mask; + rg->rising &= ~mask; + rg->falling &= ~mask; + rg->hlevel &= ~mask; + rg->llevel &= ~mask; - if (type & IRQ_TYPE_EDGE_FALLING) + switch (type & IRQ_TYPE_SENSE_MASK) { + case IRQ_TYPE_EDGE_BOTH: + rg->rising |= mask; rg->falling |= mask; - else - rg->falling &= ~mask; + break; + case IRQ_TYPE_EDGE_RISING: + rg->rising |= mask; + break; + case IRQ_TYPE_EDGE_FALLING: + rg->falling |= mask; + break; + case IRQ_TYPE_LEVEL_HIGH: + rg->hlevel |= mask; + break; + case IRQ_TYPE_LEVEL_LOW: + rg->llevel |= mask; + break; + } return 0; } -- 2.7.4 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH v3 6/8] staging: mt7621-gpio: add kerneldoc for state data containers
This commit adds kerneldoc for the two data containers in order to better understanding of its existence. Signed-off-by: Sergio Paracuellos --- drivers/staging/mt7621-gpio/gpio-mt7621.c | 18 ++ 1 file changed, 18 insertions(+) diff --git a/drivers/staging/mt7621-gpio/gpio-mt7621.c b/drivers/staging/mt7621-gpio/gpio-mt7621.c index e5a7979..54c18c1 100644 --- a/drivers/staging/mt7621-gpio/gpio-mt7621.c +++ b/drivers/staging/mt7621-gpio/gpio-mt7621.c @@ -31,6 +31,14 @@ #define GPIO_REG_STAT 0x90 #define GPIO_REG_EDGE 0xA0 +/** + * struct mtk_gc - data for a single gpio-chip + * @chip: gpio chip instance + * @lock: spinlock to protect the chip + * @bank: gpio bank number for the chip + * @rising: mask for rising irqs + * @falling: mask for falling irqs + */ struct mtk_gc { struct gpio_chip chip; spinlock_t lock; @@ -39,6 +47,16 @@ struct mtk_gc { u32 falling; }; +/** + * struct mtk_data - state container for + * data of the platform driver. It is a + * single irq-chip but 3 separate gpio-chip. + * @dev: device instance + * @gpio_membase: memory base address + * @gpio_irq: irq number from the device tree + * @gpio_irq_domain: irq domain for this chip + * @gc_map: array of the gpio chips + */ struct mtk_data { struct device *dev; void __iomem *gpio_membase; -- 2.7.4 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH v3 8/8] staging: mt7621-gpio: avoid custom irq_domain for gpio
Instead of create a custom irq_domain for this chip, use 'gpiochip_set_chained_irqchip' from GPIOLIB_IRQCHIP. It is ok to call this function several times. We have to manually mark the line with 'IRQF_SHARED' and then loop over the three banks until you find a hit. There were some problems with removing an irqchip like that but this driver is a bool so it might work just fine. After this changes the functions 'mediatek_gpio_to_irq' is not needed anymore and also the 'gpio_irq_domain' field from the state container. Instead of use the custom irq domain in the irq handler use the associated domain from the gpio_chip in 'irq_find_mapping' function. Function 'mediatek_gpio_bank_probe' has been moved a it to the botton to have all the irq related functions together and avoid some forward declarations to resolve some symbols along the code. Signed-off-by: Sergio Paracuellos --- drivers/staging/mt7621-gpio/Kconfig | 1 + drivers/staging/mt7621-gpio/gpio-mt7621.c | 221 +++--- 2 files changed, 81 insertions(+), 141 deletions(-) diff --git a/drivers/staging/mt7621-gpio/Kconfig b/drivers/staging/mt7621-gpio/Kconfig index 835998a..e32facb 100644 --- a/drivers/staging/mt7621-gpio/Kconfig +++ b/drivers/staging/mt7621-gpio/Kconfig @@ -2,6 +2,7 @@ config GPIO_MT7621 bool "Mediatek GPIO Support" depends on SOC_MT7620 || SOC_MT7621 || COMPILE_TEST select GPIO_GENERIC + select GPIOLIB_IRQCHIP select ARCH_REQUIRE_GPIOLIB help Say yes here to support the Mediatek SoC GPIO device diff --git a/drivers/staging/mt7621-gpio/gpio-mt7621.c b/drivers/staging/mt7621-gpio/gpio-mt7621.c index 0c344a5..d2a7512 100644 --- a/drivers/staging/mt7621-gpio/gpio-mt7621.c +++ b/drivers/staging/mt7621-gpio/gpio-mt7621.c @@ -8,7 +8,6 @@ #include #include #include -#include #include #include #include @@ -58,14 +57,12 @@ struct mtk_gc { * @dev: device instance * @gpio_membase: memory base address * @gpio_irq: irq number from the device tree - * @gpio_irq_domain: irq domain for this chip * @gc_map: array of the gpio chips */ struct mtk_data { struct device *dev; void __iomem *gpio_membase; int gpio_irq; - struct irq_domain *gpio_irq_domain; struct mtk_gc gc_map[MTK_BANK_CNT]; }; @@ -95,98 +92,36 @@ mtk_gpio_r32(struct mtk_gc *rg, u32 offset) return gc->read_reg(gpio_data->gpio_membase + offset); } -static int -mediatek_gpio_to_irq(struct gpio_chip *chip, unsigned int pin) -{ - struct mtk_data *gpio_data = gpiochip_get_data(chip); - struct mtk_gc *rg = to_mediatek_gpio(chip); - - return irq_create_mapping(gpio_data->gpio_irq_domain, - pin + (rg->bank * MTK_BANK_WIDTH)); -} - -static int -mediatek_gpio_bank_probe(struct platform_device *pdev, struct device_node *bank) -{ - struct mtk_data *gpio = dev_get_drvdata(&pdev->dev); - const __be32 *id = of_get_property(bank, "reg", NULL); - struct mtk_gc *rg; - void __iomem *dat, *set, *ctrl, *diro; - int ret; - - if (!id || be32_to_cpu(*id) >= MTK_BANK_CNT) - return -EINVAL; - - rg = &gpio->gc_map[be32_to_cpu(*id)]; - memset(rg, 0, sizeof(*rg)); - - spin_lock_init(&rg->lock); - rg->chip.of_node = bank; - rg->bank = be32_to_cpu(*id); - - dat = gpio->gpio_membase + GPIO_REG_DATA + (rg->bank * GPIO_BANK_WIDE); - set = gpio->gpio_membase + GPIO_REG_DSET + (rg->bank * GPIO_BANK_WIDE); - ctrl = gpio->gpio_membase + GPIO_REG_DCLR + (rg->bank * GPIO_BANK_WIDE); - diro = gpio->gpio_membase + GPIO_REG_CTRL + (rg->bank * GPIO_BANK_WIDE); - - ret = bgpio_init(&rg->chip, &pdev->dev, 4, -dat, set, ctrl, diro, NULL, 0); - if (ret) { - dev_err(&pdev->dev, "bgpio_init() failed\n"); - return ret; - } - - if (gpio->gpio_irq_domain) - rg->chip.to_irq = mediatek_gpio_to_irq; - - ret = devm_gpiochip_add_data(&pdev->dev, &rg->chip, gpio); - if (ret < 0) { - dev_err(&pdev->dev, "Could not register gpio %d, ret=%d\n", - rg->chip.ngpio, ret); - return ret; - } - - /* set polarity to low for all gpios */ - mtk_gpio_w32(rg, GPIO_REG_POL, 0); - - dev_info(&pdev->dev, "registering %d gpios\n", rg->chip.ngpio); - - return 0; -} - -static void -mediatek_gpio_irq_handler(struct irq_desc *desc) +static irqreturn_t +mediatek_gpio_irq_handler(int irq, void *data) { - struct mtk_data *gpio_data = irq_desc_get_handler_data(desc); - int i; - - for (i = 0; i < MTK_BANK_CNT; i++) { - struct mtk_gc *rg = &gpio_data->gc_map[i]; - unsigned long pending; - int bit; - - if (!rg) - continue; + struct gpio_chip *gc = data; + struct mtk_gc *rg = to_medi
[PATCH v3 4/8] staging: mt7621-gpio: implement '.irq_[request|release]_resources' functions
When implementing custom irqchips it is important to also implement .irq_request_resources() and .irq_release_resources() and make sure these call gpiochip_[un]lock_as_irq(). Add those two for this driver. Also store struct device pointer in global state structure to be able to use 'dev_err' with the device from 'mediatek_request_resources' function. Signed-off-by: Sergio Paracuellos --- drivers/staging/mt7621-gpio/gpio-mt7621.c | 42 +++ 1 file changed, 37 insertions(+), 5 deletions(-) diff --git a/drivers/staging/mt7621-gpio/gpio-mt7621.c b/drivers/staging/mt7621-gpio/gpio-mt7621.c index 6a31f60..e5a7979 100644 --- a/drivers/staging/mt7621-gpio/gpio-mt7621.c +++ b/drivers/staging/mt7621-gpio/gpio-mt7621.c @@ -40,6 +40,7 @@ struct mtk_gc { }; struct mtk_data { + struct device *dev; void __iomem *gpio_membase; int gpio_irq; struct irq_domain *gpio_irq_domain; @@ -231,12 +232,42 @@ mediatek_gpio_irq_type(struct irq_data *d, unsigned int type) return 0; } +static int mediatek_irq_reqres(struct irq_data *d) +{ + struct mtk_data *gpio_data = irq_data_get_irq_chip_data(d); + int bank = irqd_to_hwirq(d) / MTK_BANK_WIDTH; + struct mtk_gc *rg = &gpio_data->gc_map[bank]; + struct gpio_chip *gc = &rg->chip; + int ret; + + ret = gpiochip_lock_as_irq(gc, irqd_to_hwirq(d)); + if (ret) { + dev_err(gpio_data->dev, "unable to lock HW IRQ %lu for IRQ\n", + irqd_to_hwirq(d)); + return -EINVAL; + } + + return 0; +} + +static void mediatek_irq_relres(struct irq_data *d) +{ + struct mtk_data *gpio_data = irq_data_get_irq_chip_data(d); + int bank = irqd_to_hwirq(d) / MTK_BANK_WIDTH; + struct mtk_gc *rg = &gpio_data->gc_map[bank]; + struct gpio_chip *gc = &rg->chip; + + gpiochip_unlock_as_irq(gc, irqd_to_hwirq(d)); +} + static struct irq_chip mediatek_gpio_irq_chip = { - .name = "GPIO", - .irq_unmask = mediatek_gpio_irq_unmask, - .irq_mask = mediatek_gpio_irq_mask, - .irq_mask_ack = mediatek_gpio_irq_mask, - .irq_set_type = mediatek_gpio_irq_type, + .name = "GPIO", + .irq_unmask = mediatek_gpio_irq_unmask, + .irq_mask = mediatek_gpio_irq_mask, + .irq_mask_ack = mediatek_gpio_irq_mask, + .irq_set_type = mediatek_gpio_irq_type, + .irq_request_resources = mediatek_irq_reqres, + .irq_release_resources = mediatek_irq_relres, }; static int @@ -284,6 +315,7 @@ mediatek_gpio_probe(struct platform_device *pdev) dev_err(&pdev->dev, "irq_domain_add_linear failed\n"); } + gpio_data->dev = &pdev->dev; platform_set_drvdata(pdev, gpio_data); for_each_child_of_node(np, bank) -- 2.7.4 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH v3 5/8] staging: mt7621-gpio: add COMPILE_TEST
This driver is actually platform-agnostic. Add COMPILE_TEST for the compilation test coverage. Signed-off-by: Sergio Paracuellos --- drivers/staging/mt7621-gpio/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/staging/mt7621-gpio/Kconfig b/drivers/staging/mt7621-gpio/Kconfig index f4453e8..835998a 100644 --- a/drivers/staging/mt7621-gpio/Kconfig +++ b/drivers/staging/mt7621-gpio/Kconfig @@ -1,6 +1,6 @@ config GPIO_MT7621 bool "Mediatek GPIO Support" - depends on SOC_MT7620 || SOC_MT7621 + depends on SOC_MT7620 || SOC_MT7621 || COMPILE_TEST select GPIO_GENERIC select ARCH_REQUIRE_GPIOLIB help -- 2.7.4 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH v3 3/8] staging: mt7621-gpio: make use of 'builtin_platform_driver'
This driver was being registered using 'module_platform_driver' but it is not a module at all. Instead of this use 'builtin_platform_driver' which seems to be the correct one. Signed-off-by: Sergio Paracuellos --- drivers/staging/mt7621-gpio/gpio-mt7621.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/staging/mt7621-gpio/gpio-mt7621.c b/drivers/staging/mt7621-gpio/gpio-mt7621.c index f95310c..6a31f60 100644 --- a/drivers/staging/mt7621-gpio/gpio-mt7621.c +++ b/drivers/staging/mt7621-gpio/gpio-mt7621.c @@ -312,4 +312,4 @@ static struct platform_driver mediatek_gpio_driver = { }, }; -module_platform_driver(mediatek_gpio_driver); +builtin_platform_driver(mediatek_gpio_driver); -- 2.7.4 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH v3 2/8] staging: mt7621-gpio: avoid including 'gpio.h'
Including file '' should be avoided in new drivers code, so just remove it because it is no necessary at all. Signed-off-by: Sergio Paracuellos --- drivers/staging/mt7621-gpio/gpio-mt7621.c | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/staging/mt7621-gpio/gpio-mt7621.c b/drivers/staging/mt7621-gpio/gpio-mt7621.c index eb60dd4..f95310c 100644 --- a/drivers/staging/mt7621-gpio/gpio-mt7621.c +++ b/drivers/staging/mt7621-gpio/gpio-mt7621.c @@ -5,7 +5,6 @@ */ #include -#include #include #include #include -- 2.7.4 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH v3 1/8] staging: mt7621-gpio: make use 'bgpio_init' from GPIO_GENERIC
Gpio complexity is just masking the fact that offset is always 0..n and writes to bits 0..n of some memory address. Because of this whole thing can just me converted to use GPIO_GENERIC and avoid duplications of a lot of driver custom functions. So use bgpio_init instead of custom code adding GPIO_GENERIC dependency to the Kconfig file. Also to make easier using bgpio_init function offset for each gpio bank, enumeration where register were defined has been replaced in favour of some macros which handle each gpio offset taking into account the bank where are located. Because of this change write and read functions which are being used for remaining irq handling stuff have been updated also as well as its dependencies along the code. Signed-off-by: Sergio Paracuellos --- drivers/staging/mt7621-gpio/Kconfig | 1 + drivers/staging/mt7621-gpio/gpio-mt7621.c | 136 +- 2 files changed, 42 insertions(+), 95 deletions(-) diff --git a/drivers/staging/mt7621-gpio/Kconfig b/drivers/staging/mt7621-gpio/Kconfig index c741ec3..f4453e8 100644 --- a/drivers/staging/mt7621-gpio/Kconfig +++ b/drivers/staging/mt7621-gpio/Kconfig @@ -1,6 +1,7 @@ config GPIO_MT7621 bool "Mediatek GPIO Support" depends on SOC_MT7620 || SOC_MT7621 + select GPIO_GENERIC select ARCH_REQUIRE_GPIOLIB help Say yes here to support the Mediatek SoC GPIO device diff --git a/drivers/staging/mt7621-gpio/gpio-mt7621.c b/drivers/staging/mt7621-gpio/gpio-mt7621.c index 0c4fb4a..eb60dd4 100644 --- a/drivers/staging/mt7621-gpio/gpio-mt7621.c +++ b/drivers/staging/mt7621-gpio/gpio-mt7621.c @@ -19,19 +19,18 @@ #define MTK_BANK_WIDTH 32 #define PIN_MASK(nr) (1UL << ((nr % MTK_BANK_WIDTH))) -enum mediatek_gpio_reg { - GPIO_REG_CTRL = 0, - GPIO_REG_POL, - GPIO_REG_DATA, - GPIO_REG_DSET, - GPIO_REG_DCLR, - GPIO_REG_REDGE, - GPIO_REG_FEDGE, - GPIO_REG_HLVL, - GPIO_REG_LLVL, - GPIO_REG_STAT, - GPIO_REG_EDGE, -}; +#define GPIO_BANK_WIDE 0x04 +#define GPIO_REG_CTRL 0x00 +#define GPIO_REG_POL 0x10 +#define GPIO_REG_DATA 0x20 +#define GPIO_REG_DSET 0x30 +#define GPIO_REG_DCLR 0x40 +#define GPIO_REG_REDGE 0x50 +#define GPIO_REG_FEDGE 0x60 +#define GPIO_REG_HLVL 0x70 +#define GPIO_REG_LLVL 0x80 +#define GPIO_REG_STAT 0x90 +#define GPIO_REG_EDGE 0xA0 struct mtk_gc { struct gpio_chip chip; @@ -55,80 +54,23 @@ to_mediatek_gpio(struct gpio_chip *chip) } static inline void -mtk_gpio_w32(struct mtk_gc *rg, u8 reg, u32 val) +mtk_gpio_w32(struct mtk_gc *rg, u32 offset, u32 val) { - struct mtk_data *gpio_data = gpiochip_get_data(&rg->chip); - u32 offset = (reg * 0x10) + (rg->bank * 0x4); + struct gpio_chip *gc = &rg->chip; + struct mtk_data *gpio_data = gpiochip_get_data(gc); - iowrite32(val, gpio_data->gpio_membase + offset); + offset = (rg->bank * GPIO_BANK_WIDE) + offset; + gc->write_reg(gpio_data->gpio_membase + offset, val); } static inline u32 -mtk_gpio_r32(struct mtk_gc *rg, u8 reg) -{ - struct mtk_data *gpio_data = gpiochip_get_data(&rg->chip); - u32 offset = (reg * 0x10) + (rg->bank * 0x4); - - return ioread32(gpio_data->gpio_membase + offset); -} - -static void -mediatek_gpio_set(struct gpio_chip *chip, unsigned int offset, int value) -{ - struct mtk_gc *rg = to_mediatek_gpio(chip); - - mtk_gpio_w32(rg, (value) ? GPIO_REG_DSET : GPIO_REG_DCLR, BIT(offset)); -} - -static int -mediatek_gpio_get(struct gpio_chip *chip, unsigned int offset) -{ - struct mtk_gc *rg = to_mediatek_gpio(chip); - - return !!(mtk_gpio_r32(rg, GPIO_REG_DATA) & BIT(offset)); -} - -static int -mediatek_gpio_direction_input(struct gpio_chip *chip, unsigned int offset) -{ - struct mtk_gc *rg = to_mediatek_gpio(chip); - unsigned long flags; - u32 t; - - spin_lock_irqsave(&rg->lock, flags); - t = mtk_gpio_r32(rg, GPIO_REG_CTRL); - t &= ~BIT(offset); - mtk_gpio_w32(rg, GPIO_REG_CTRL, t); - spin_unlock_irqrestore(&rg->lock, flags); - - return 0; -} - -static int -mediatek_gpio_direction_output(struct gpio_chip *chip, - unsigned int offset, int value) +mtk_gpio_r32(struct mtk_gc *rg, u32 offset) { - struct mtk_gc *rg = to_mediatek_gpio(chip); - unsigned long flags; - u32 t; + struct gpio_chip *gc = &rg->chip; + struct mtk_data *gpio_data = gpiochip_get_data(gc); - spin_lock_irqsave(&rg->lock, flags); - t = mtk_gpio_r32(rg, GPIO_REG_CTRL); - t |= BIT(offset); - mtk_gpio_w32(rg, GPIO_REG_CTRL, t); - mediatek_gpio_set(chip, offset, value); - spin_unlock_irqrestore(&rg->lock, flags); - - return 0; -} - -static int -mediatek_gpio_get_direction(struct gpio_chip *chip, unsigned int offset) -{ - struct mtk_gc *rg = to_mediatek_gpio(chip); - u32 t = mtk_g
[PATCH v3 0/8] staging: mt7621-gpio: last cleanups
After submiting this driver to try to get mainlined and get out of staging some new cleanups seems to be necessary. According to this main of Linus Walleij: http://driverdev.linuxdriverproject.org/pipermail/driverdev-devel/2018-June/121742.html this series tries to fix all of the issues in order to send v2 and give it a new try. Because I don't have to hardware to test my changes I send new cleanups first in staging to make easier to NeilBrown test it and get a feedback about them. Changes in v3: - PATCH 7: refactor irq_type to make better code. - Add PATCH 8 avoiding the use of custom domain and requesting manually a 'IRQF_SHARED'. It should be working now?? Changes in v2: - Patch where GPIOLIB_IRQCHIP was used avoiding the use of a custom irq domain has been dropped to be sure after this changes all is working properly. (This was PATCH 7 in previous series) - PATCH 1: * avoid introducing new macros and use 'bank' field of mtk_gc with register offset. * Make correct use of bgpio_init passing new void __iomem pointers instead of use the macros. - Previous series PATCH 8 now is PATCH 7. Avoid the use of a switch-case statement which was wrong and distinc if we have RISSING AND FALLING EDGE interrupt or HIGH LOW level ones. This last two are exclusive and cannot be generated at the same time. Hope this helps. Thanks in advance. Best regards, Sergio Paracuellos Sergio Paracuellos (8): staging: mt7621-gpio: make use 'bgpio_init' from GPIO_GENERIC staging: mt7621-gpio: avoid including 'gpio.h' staging: mt7621-gpio: make use of 'builtin_platform_driver' staging: mt7621-gpio: implement '.irq_[request|release]_resources' functions staging: mt7621-gpio: add COMPILE_TEST staging: mt7621-gpio: add kerneldoc for state data containers staging: mt7621-gpio: implement high level and low level irqs staging: mt7621-gpio: avoid custom irq_domain for gpio drivers/staging/mt7621-gpio/Kconfig | 4 +- drivers/staging/mt7621-gpio/gpio-mt7621.c | 369 +- 2 files changed, 168 insertions(+), 205 deletions(-) -- 2.7.4 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH V2 2/4] Staging:rtl8192e Fix Comparison to False is error prone
This patch removes comparison to False and boolean in the code which can be written as !var Signed-off-by: Janani Sankara Babu --- changelog v2 : remove comparison to 0 , replacing with !var v1 : remove comparison to false drivers/staging/rtl8192e/rtl819x_BAProc.c | 16 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/drivers/staging/rtl8192e/rtl819x_BAProc.c b/drivers/staging/rtl8192e/rtl819x_BAProc.c index c466a5e7..f194705 100644 --- a/drivers/staging/rtl8192e/rtl819x_BAProc.c +++ b/drivers/staging/rtl8192e/rtl819x_BAProc.c @@ -257,8 +257,8 @@ int rtllib_rx_ADDBAReq(struct rtllib_device *ieee, struct sk_buff *skb) pBaStartSeqCtrl = (union sequence_control *)(req + 7); RT_TRACE(COMP_DBG, ">rx ADDBAREQ from : %pM\n", dst); - if (ieee->current_network.qos_data.active == 0 || - (ieee->pHTInfo->bCurrentHTSupport == false) || + if (!ieee->current_network.qos_data.active || + !ieee->pHTInfo->bCurrentHTSupport || (ieee->pHTInfo->IOTAction & HT_IOT_ACT_REJECT_ADDBA_REQ)) { rc = ADDBA_STATUS_REFUSED; netdev_warn(ieee->dev, @@ -340,9 +340,9 @@ int rtllib_rx_ADDBARsp(struct rtllib_device *ieee, struct sk_buff *skb) pBaTimeoutVal = (u16 *)(tag + 7); RT_TRACE(COMP_DBG, ">rx ADDBARSP from : %pM\n", dst); - if (ieee->current_network.qos_data.active == 0 || - ieee->pHTInfo->bCurrentHTSupport == false || - ieee->pHTInfo->bCurrentAMPDUEnable == false) { + if (!ieee->current_network.qos_data.active || + !ieee->pHTInfo->bCurrentHTSupport || + !ieee->pHTInfo->bCurrentAMPDUEnable) { netdev_warn(ieee->dev, "reject to ADDBA_RSP as some capability is not ready(%d, %d, %d)\n", ieee->current_network.qos_data.active, @@ -369,7 +369,7 @@ int rtllib_rx_ADDBARsp(struct rtllib_device *ieee, struct sk_buff *skb) netdev_dbg(ieee->dev, "%s(): ADDBA response already admitted\n", __func__); return -1; - } else if ((pPendingBA->bValid == false) || + } else if (!pPendingBA->bValid || (*pDialogToken != pPendingBA->DialogToken)) { netdev_warn(ieee->dev, "%s(): ADDBA Rsp. BA invalid, DELBA!\n", @@ -431,8 +431,8 @@ int rtllib_rx_DELBA(struct rtllib_device *ieee, struct sk_buff *skb) return -1; } - if (ieee->current_network.qos_data.active == 0 || - ieee->pHTInfo->bCurrentHTSupport == false) { + if (!ieee->current_network.qos_data.active || + !ieee->pHTInfo->bCurrentHTSupport) { netdev_warn(ieee->dev, "received DELBA while QOS or HT is not supported(%d, %d)\n", ieee->current_network. qos_data.active, -- 1.9.1 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
Re: [PATCH v2 0/7] staging: mt7621-gpio: last cleanups
On Mon, Jun 11 2018, Sergio Paracuellos wrote: > After submiting this driver to try to get mainlined and get > out of staging some new cleanups seems to be necessary. > According to this main of Linus Walleij: > > http://driverdev.linuxdriverproject.org/pipermail/driverdev-devel/2018-June/121742.html > > this series tries to fix all of the issues in order to send > v2 and give it a new try. Because I don't have to hardware to > test my changes I send new cleanups first in staging to make > easier to NeilBrown test it and get a feedback about them. > > Changes in v2: > - Patch where GPIOLIB_IRQCHIP was used avoiding > the use of a custom irq domain has been dropped to > be sure after this changes all is working properly. > (This was PATCH 7 in previous series) > - PATCH 1: > * avoid introducing new macros and use 'bank' >field of mtk_gc with register offset. > * Make correct use of bgpio_init passing new >void __iomem pointers instead of use the >macros. > - Previous series PATCH 8 now is PATCH 7. Avoid the > use of a switch-case statement which was wrong and > distinc if we have RISSING AND FALLING EDGE interrupt > or HIGH LOW level ones. This last two are exclusive and > cannot be generated at the same time. > > Also, I think is we finally avoid to use a new irq_domain the > need for the new functions introduced for request and release > resources dissapears. I was diving down the other drivers code > and I see that these two only are used in drivers which use its > own irq_domain. Correct me if I am wrong, please. > > Hope this helps. > > Thanks in advance. Thanks a lot. This series appears to work, though I sent a separate comment on one piece of code. However the gpio are numbers 480-511 448-479 416-447 instead of 0-31 32-63 64-95 which would be more normal. Maybe when you resubmit I'll raid it with Linus Walleij and see if he can explain why I can't have 0-95. Thanks, NeilBrown > > Best regards, > Sergio Paracuellos > > Sergio Paracuellos (7): > staging: mt7621-gpio: make use 'bgpio_init' from GPIO_GENERIC > staging: mt7621-gpio: avoid including 'gpio.h' > staging: mt7621-gpio: make use of 'builtin_platform_driver' > staging: mt7621-gpio: implement '.irq_[request|release]_resources' > functions > staging: mt7621-gpio: add COMPILE_TEST > staging: mt7621-gpio: add kerneldoc for state data containers > staging: mt7621-gpio: implement high level and low level irqs > > drivers/staging/mt7621-gpio/Kconfig | 3 +- > drivers/staging/mt7621-gpio/gpio-mt7621.c | 251 > -- > 2 files changed, 138 insertions(+), 116 deletions(-) > > -- > 2.7.4 signature.asc Description: PGP signature ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH] staging: rtl8192u: add error handling for usb_alloc_urb
When usb_alloc_urb fails, the lack of error-handling code may cause unexpected results. This patch adds error-handling code after calling usb_alloc_urb. Signed-off-by: Zhouyang Jia --- drivers/staging/rtl8192u/r8192U_core.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/staging/rtl8192u/r8192U_core.c b/drivers/staging/rtl8192u/r8192U_core.c index 7a0dbc0..3f09615 100644 --- a/drivers/staging/rtl8192u/r8192U_core.c +++ b/drivers/staging/rtl8192u/r8192U_core.c @@ -1666,6 +1666,9 @@ static short rtl8192_usb_initendpoints(struct net_device *dev) void *oldaddr, *newaddr; priv->rx_urb[16] = usb_alloc_urb(0, GFP_KERNEL); + if (!priv->rx_urb[16]) + return -ENOMEM; + priv->oldaddr = kmalloc(16, GFP_KERNEL); if (!priv->oldaddr) return -ENOMEM; -- 2.7.4 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
Re: [PATCH] MAINTAINERS: update two greybus sections
On 11-06-18, 09:42, Johan Hovold wrote: > Fix a file entry typo and drop the obsolete timesync entries, which were > all caught by: > > scripts/get_maintainer.pl --self-test=patterns > > Reported-by: Joe Perches > Signed-off-by: Johan Hovold > --- > > This has been reported and at least partially fixed in the past, but due > to various other clean-up work that was going on in MAINTAINERS at the > time, was never applied. > > Johan > > > MAINTAINERS | 6 ++ > 1 file changed, 2 insertions(+), 4 deletions(-) > > diff --git a/MAINTAINERS b/MAINTAINERS > index 9c125f705f78..09d7f9eb5c13 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -6065,7 +6065,7 @@ F: drivers/staging/greybus/bootrom.c > F: drivers/staging/greybus/firmware.h > F: drivers/staging/greybus/fw-core.c > F: drivers/staging/greybus/fw-download.c > -F: drivers/staging/greybus/fw-managament.c > +F: drivers/staging/greybus/fw-management.c > F: drivers/staging/greybus/greybus_authentication.h > F: drivers/staging/greybus/greybus_firmware.h > F: drivers/staging/greybus/hid.c > @@ -6074,12 +6074,10 @@ F:drivers/staging/greybus/spi.c > F: drivers/staging/greybus/spilib.c > F: drivers/staging/greybus/spilib.h > > -GREYBUS LOOPBACK/TIME PROTOCOLS DRIVERS > +GREYBUS LOOPBACK DRIVER > M: Bryan O'Donoghue > S: Maintained > F: drivers/staging/greybus/loopback.c > -F: drivers/staging/greybus/timesync.c > -F: drivers/staging/greybus/timesync_platform.c > > GREYBUS PLATFORM DRIVERS > M: Vaibhav Hiremath Acked-by: Viresh Kumar -- viresh ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
Re: [PATCH v2] staging: mt7621-gpio: avoid custom irq_domain for gpio
On Mon, Jun 11 2018, Sergio Paracuellos wrote: > Instead of create a custom irq_domain for this chip, use > 'gpiochip_set_chained_irqchip' from GPIOLIB_IRQCHIP. It > is ok to call this function several times. You only have to > mark the line with 'IRQF_SHARED' and then loop over the > three banks until you find a hit. There were some problems > with removing an irqchip like that but this driver is a bool > so it might work just fine. After this changes the functions > 'mediatek_gpio_to_irq' is not needed anymore and also the > 'gpio_irq_domain' field from the state container. Instead of > use the custom irq domain in the irq handler use the associated > domain from the gpio_chip in 'irq_find_mapping' function. > Function 'mediatek_gpio_bank_probe' has been moved a it to the > botton to have all the irq related functions together and avoid > some forward declarations to resolve some symbols along the code. > > Signed-off-by: Sergio Paracuellos Thanks for this. The patch has two problems. 1/ it doesn't compile unless CONFIG_GPIOLIB_IRQCHIP is selected. So we need "select GPIOLIB_IRQCHIP" in Kconfig 2/ The interrupt line has not been marked IRQF_SHARED. I cannot figure out how to mark it as IRQF_SHARED. If I hack the code so that mediatek_gpio_bank_probe() is only called for the first bank, then interrupt from that bank work fine. If I let it be called for all three banks, then on the first interrupt, the system starts to hang. Thanks, NeilBrown signature.asc Description: PGP signature ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
Re: [PATCH] staging:iio:accel: use sign extend function avoiding code duplication
On Mon, 2018-06-11 at 00:09 +0200, Karim Eshapa wrote: > Use sign_extend32 kernel function instead of code duplication. > This function is also safe for 16 bits. Firstly: This file is not in staging anymore. Please use the -next tree for patches. > diff --git a/drivers/staging/iio/accel/adis16201.c > b/drivers/staging/iio/accel/adis16201.c [] > @@ -227,9 +227,7 @@ static int adis16201_read_raw(struct iio_dev *indio_dev, > ret = adis_read_reg_16(st, addr, &val16); > if (ret) > return ret; > - val16 &= (1 << bits) - 1; > - val16 = (s16)(val16 << (16 - bits)) >> (16 - bits); > - *val = val16; > + *val = sign_extend32(val16, bits); > return IIO_VAL_INT; > } Secondly: A similar patch with a different bits value was already applied. Please verify the appropriate bits value. commit e7f3bfb7eb7d9307c0c157f82fceb228f0aec1d9 Author: Himanshu Jha Date: Sat Mar 17 01:36:23 2018 +0530 Staging: iio: accel: adis16201: Use sign_extend32 function Use sign_extned32() for 32 bit sign extending rather than hard coding. Signed-off-by: Himanshu Jha Signed-off-by: Jonathan Cameron --- drivers/staging/iio/accel/adis16201.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/drivers/staging/iio/accel/adis16201.c b/drivers/staging/iio/accel/adis16201.c index 87ad3d421c12..526dde481f84 100644 --- a/drivers/staging/iio/accel/adis16201.c +++ b/drivers/staging/iio/accel/adis16201.c @@ -173,9 +173,8 @@ static int adis16201_read_raw(struct iio_dev *indio_dev, ret = adis_read_reg_16(st, addr, &val16); if (ret) return ret; - val16 &= (1 << bits) - 1; - val16 = (s16)(val16 << (16 - bits)) >> (16 - bits); - *val = val16; + + *val = sign_extend32(val16, bits - 1); return IIO_VAL_INT; } ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
[PATCH] MAINTAINERS: update two greybus sections
Fix a file entry typo and drop the obsolete timesync entries, which were all caught by: scripts/get_maintainer.pl --self-test=patterns Reported-by: Joe Perches Signed-off-by: Johan Hovold --- This has been reported and at least partially fixed in the past, but due to various other clean-up work that was going on in MAINTAINERS at the time, was never applied. Johan MAINTAINERS | 6 ++ 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/MAINTAINERS b/MAINTAINERS index 9c125f705f78..09d7f9eb5c13 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -6065,7 +6065,7 @@ F:drivers/staging/greybus/bootrom.c F: drivers/staging/greybus/firmware.h F: drivers/staging/greybus/fw-core.c F: drivers/staging/greybus/fw-download.c -F: drivers/staging/greybus/fw-managament.c +F: drivers/staging/greybus/fw-management.c F: drivers/staging/greybus/greybus_authentication.h F: drivers/staging/greybus/greybus_firmware.h F: drivers/staging/greybus/hid.c @@ -6074,12 +6074,10 @@ F: drivers/staging/greybus/spi.c F: drivers/staging/greybus/spilib.c F: drivers/staging/greybus/spilib.h -GREYBUS LOOPBACK/TIME PROTOCOLS DRIVERS +GREYBUS LOOPBACK DRIVER M: Bryan O'Donoghue S: Maintained F: drivers/staging/greybus/loopback.c -F: drivers/staging/greybus/timesync.c -F: drivers/staging/greybus/timesync_platform.c GREYBUS PLATFORM DRIVERS M: Vaibhav Hiremath -- 2.17.1 ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
Re: [PATCH v2 7/7] staging: mt7621-gpio: implement high level and low level irqs
On Mon, Jun 11 2018, Sergio Paracuellos wrote: > This chip support high level and low level interrupts. Those > have to be implemented also to get a complete and clean driver. > > Signed-off-by: Sergio Paracuellos > --- > drivers/staging/mt7621-gpio/gpio-mt7621.c | 51 > +++ > 1 file changed, 38 insertions(+), 13 deletions(-) > > diff --git a/drivers/staging/mt7621-gpio/gpio-mt7621.c > b/drivers/staging/mt7621-gpio/gpio-mt7621.c > index 54c18c1..39874cb 100644 > --- a/drivers/staging/mt7621-gpio/gpio-mt7621.c > +++ b/drivers/staging/mt7621-gpio/gpio-mt7621.c > @@ -38,6 +38,8 @@ > * @bank: gpio bank number for the chip > * @rising: mask for rising irqs > * @falling: mask for falling irqs > + * @hlevel: mask for high level irqs > + * @llevel: mask for low level irqs > */ > struct mtk_gc { > struct gpio_chip chip; > @@ -45,6 +47,8 @@ struct mtk_gc { > int bank; > u32 rising; > u32 falling; > + u32 hlevel; > + u32 llevel; > }; > > /** > @@ -184,7 +188,7 @@ mediatek_gpio_irq_unmask(struct irq_data *d) > int bank = pin / MTK_BANK_WIDTH; > struct mtk_gc *rg = &gpio_data->gc_map[bank]; > unsigned long flags; > - u32 rise, fall; > + u32 rise, fall, high, low; > > if (!rg) > return; > @@ -192,8 +196,12 @@ mediatek_gpio_irq_unmask(struct irq_data *d) > spin_lock_irqsave(&rg->lock, flags); > rise = mtk_gpio_r32(rg, GPIO_REG_REDGE); > fall = mtk_gpio_r32(rg, GPIO_REG_FEDGE); > + high = mtk_gpio_r32(rg, GPIO_REG_HLVL); > + low = mtk_gpio_r32(rg, GPIO_REG_LLVL); > mtk_gpio_w32(rg, GPIO_REG_REDGE, rise | (PIN_MASK(pin) & rg->rising)); > mtk_gpio_w32(rg, GPIO_REG_FEDGE, fall | (PIN_MASK(pin) & rg->falling)); > + mtk_gpio_w32(rg, GPIO_REG_HLVL, high | (PIN_MASK(pin) & rg->hlevel)); > + mtk_gpio_w32(rg, GPIO_REG_LLVL, low | (PIN_MASK(pin) & rg->llevel)); > spin_unlock_irqrestore(&rg->lock, flags); > } > > @@ -205,7 +213,7 @@ mediatek_gpio_irq_mask(struct irq_data *d) > int bank = pin / MTK_BANK_WIDTH; > struct mtk_gc *rg = &gpio_data->gc_map[bank]; > unsigned long flags; > - u32 rise, fall; > + u32 rise, fall, high, low; > > if (!rg) > return; > @@ -213,8 +221,12 @@ mediatek_gpio_irq_mask(struct irq_data *d) > spin_lock_irqsave(&rg->lock, flags); > rise = mtk_gpio_r32(rg, GPIO_REG_REDGE); > fall = mtk_gpio_r32(rg, GPIO_REG_FEDGE); > + high = mtk_gpio_r32(rg, GPIO_REG_HLVL); > + low = mtk_gpio_r32(rg, GPIO_REG_LLVL); > mtk_gpio_w32(rg, GPIO_REG_FEDGE, fall & ~PIN_MASK(pin)); > mtk_gpio_w32(rg, GPIO_REG_REDGE, rise & ~PIN_MASK(pin)); > + mtk_gpio_w32(rg, GPIO_REG_HLVL, high & ~PIN_MASK(pin)); > + mtk_gpio_w32(rg, GPIO_REG_LLVL, low & ~PIN_MASK(pin)); > spin_unlock_irqrestore(&rg->lock, flags); > } > > @@ -231,21 +243,34 @@ mediatek_gpio_irq_type(struct irq_data *d, unsigned int > type) > return -1; > > if (type == IRQ_TYPE_PROBE) { > - if ((rg->rising | rg->falling) & mask) > + if ((rg->rising | rg->falling | > + rg->hlevel | rg->llevel) & mask) > return 0; > > - type = IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING; > + type = (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING | > + IRQ_TYPE_LEVEL_HIGH | IRQ_TYPE_LEVEL_LOW); > } This doesn't look right. IRQ_TYPE_PROBE isn't very well documented and there aren't a lot of examples of usage, but I think the idea is that if the interrupt type is already set, then leave it along, otherwise choose a sane default, which is IRQ_TYPE_EDGE_BOTH (aka IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING) in all the cases that I've looked at. Certainly setting the type to RISING and FALLING and LOW and HIGH cannot be right as that would cause constant interrupts. > > - if (type & IRQ_TYPE_EDGE_RISING) > - rg->rising |= mask; > - else > - rg->rising &= ~mask; > - > - if (type & IRQ_TYPE_EDGE_FALLING) > - rg->falling |= mask; > - else > - rg->falling &= ~mask; > + if (type & IRQ_TYPE_EDGE_RISING || > + type & IRQ_TYPE_EDGE_FALLING) { > + if (type & IRQ_TYPE_EDGE_RISING) > + rg->rising |= mask; > + else > + rg->rising &= ~mask; > + > + if (type & IRQ_TYPE_EDGE_FALLING) > + rg->falling |= mask; > + else > + rg->falling &= ~mask; > + } else { > + if (type & IRQ_TYPE_LEVEL_HIGH) { > + rg->hlevel |= mask; > + rg->llevel &= ~mask; > + } else { > + rg->llevel |= mask; > + rg->hlevel &= ~mask; > + } > + } I wonder if we should be clearing the mask bit for hlevel and lleve