@@ -301,37 +301,16 @@ int pch_set_station_address(u8 *addr, struct pci_dev *pdev)"invalid params returning PCH_INVALIDPARAM\n");returnPCH_INVALIDPARAM;}-/* For all station address bytes */-for(i=0;i<PCH_STATION_BYTES;i++){-u32val;-s32tmp;-tmp=hex_to_bin(addr[i*3]);-if(tmp<0){-dev_err(&pdev->dev,-"invalid params returning PCH_INVALIDPARAM\n");-returnPCH_INVALIDPARAM;-}-val=tmp*16;-tmp=hex_to_bin(addr[(i*3)+1]);-if(tmp<0){-dev_err(&pdev->dev,-"invalid params returning PCH_INVALIDPARAM\n");-returnPCH_INVALIDPARAM;-}-val+=tmp;-/* Expects ':' separated addresses */-if((i<5)&&(addr[(i*3)+2]!=':')){-dev_err(&pdev->dev,-"invalid params returning PCH_INVALIDPARAM\n");-returnPCH_INVALIDPARAM;-}--/* Ideally we should set the address only after validating-entirestring*/-dev_dbg(&pdev->dev,"invoking pch_station_set\n");-iowrite32(val,&chip->regs->ts_st[i]);+valid=mac_pton(addr,(u8*)&mac);+if(!valid){+dev_err(&pdev->dev,"invalid params returning PCH_INVALIDPARAM\n");+returnPCH_INVALIDPARAM;}++dev_dbg(&pdev->dev,"invoking pch_station_set\n");+iowrite32(lower_32_bits(mac),&chip->regs->ts_st[0]);+iowrite32(upper_32_bits(mac),&chip->regs->ts_st[4]);return0;}EXPORT_SYMBOL(pch_set_station_address);
From: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Date: 2021-08-13 12:29:55
This makes the error handling much more simpler than open-coding everything
and in addition makes the probe function smaller an tidier.
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
drivers/ptp/ptp_pch.c | 73 ++++++-------------------------------------
1 file changed, 10 insertions(+), 63 deletions(-)
@@ -456,24 +454,8 @@ static void pch_remove(struct pci_dev *pdev){structpch_dev*chip=pci_get_drvdata(pdev);+free_irq(pdev->irq,chip);ptp_clock_unregister(chip->ptp_clock);-/* free the interrupt */-if(pdev->irq!=0)-free_irq(pdev->irq,chip);--/* unmap the virtual IO memory space */-if(chip->regs!=NULL){-iounmap(chip->regs);-chip->regs=NULL;-}-/* release the reserved IO memory space */-if(chip->mem_base!=0){-release_mem_region(chip->mem_base,chip->mem_size);-chip->mem_base=0;-}-pci_disable_device(pdev);-kfree(chip);-dev_info(&pdev->dev,"complete\n");}statics32
@@ -483,50 +465,29 @@ pch_probe(struct pci_dev *pdev, const struct pci_device_id *id)unsignedlongflags;structpch_dev*chip;-chip=kzalloc(sizeof(structpch_dev),GFP_KERNEL);+chip=devm_kzalloc(&pdev->dev,sizeof(*chip),GFP_KERNEL);if(chip==NULL)return-ENOMEM;/* enable the 1588 pci device */-ret=pci_enable_device(pdev);+ret=pcim_enable_device(pdev);if(ret!=0){dev_err(&pdev->dev,"could not enable the pci device\n");-gotoerr_pci_en;+returnret;}-chip->mem_base=pci_resource_start(pdev,IO_MEM_BAR);-if(!chip->mem_base){+ret=pcim_iomap_regions(pdev,BIT(IO_MEM_BAR),"1588_regs");+if(ret){dev_err(&pdev->dev,"could not locate IO memory address\n");-ret=-ENODEV;-gotoerr_pci_start;-}--/* retrieve the available length of the IO memory space */-chip->mem_size=pci_resource_len(pdev,IO_MEM_BAR);--/* allocate the memory for the device registers */-if(!request_mem_region(chip->mem_base,chip->mem_size,"1588_regs")){-dev_err(&pdev->dev,-"could not allocate register memory space\n");-ret=-EBUSY;-gotoerr_req_mem_region;+returnret;}/* get the virtual address to the 1588 registers */-chip->regs=ioremap(chip->mem_base,chip->mem_size);--if(!chip->regs){-dev_err(&pdev->dev,"Could not get virtual address\n");-ret=-ENOMEM;-gotoerr_ioremap;-}-+chip->regs=pcim_iomap_table(pdev)[IO_MEM_BAR];chip->caps=ptp_pch_caps;chip->ptp_clock=ptp_clock_register(&chip->caps,&pdev->dev);-if(IS_ERR(chip->ptp_clock)){-ret=PTR_ERR(chip->ptp_clock);-gotoerr_ptp_clock_reg;-}+if(IS_ERR(chip->ptp_clock))+returnPTR_ERR(chip->ptp_clock);spin_lock_init(&chip->register_lock);
From: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Date: 2021-08-13 12:29:58
There is already helper functions to do 64-bit I/O on 32-bit machines or
buses, thus we don't need to reinvent the wheel.
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
drivers/ptp/ptp_pch.c | 13 ++++---------
1 file changed, 4 insertions(+), 9 deletions(-)
From: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Date: 2021-08-13 12:29:58
There is already helper functions to do 64-bit I/O on 32-bit machines or
buses, thus we don't need to reinvent the wheel.
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
drivers/ptp/ptp_pch.c | 46 ++++++++++---------------------------------
1 file changed, 10 insertions(+), 36 deletions(-)
From: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Date: 2021-08-13 12:30:01
Eliminate some boilerplate code by using module_pci_driver() instead of
init/exit, and, if needed, moving the salient bits from init into probe.
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
drivers/ptp/ptp_pch.c | 20 +-------------------
1 file changed, 1 insertion(+), 19 deletions(-)
From: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Date: 2021-08-13 12:30:03
The driver can't be loaded automatically because it misses
module alias to be provided. Add corresponding MODULE_DEVICE_TABLE()
call to the driver.
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
drivers/ptp/ptp_pch.c | 1 +
1 file changed, 1 insertion(+)
From: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Date: 2021-08-13 12:30:06
The default values for hooks in the driver.pm are NULLs.
Hence drop unused pch_pm_ops.
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
drivers/ptp/ptp_pch.c | 6 ------
1 file changed, 6 deletions(-)
drivers/ptp/ptp_pch.c:604:1: error: type defaults to 'int' in declaration of 'module_pci_driver' [-Werror=implicit-int]
drivers/ptp/ptp_pch.c:604:1: warning: parameter names (without types) in function declaration
drivers/ptp/ptp_pch.c:597:26: warning: 'pch_driver' defined but not used [-Wunused-variable]
597 | static struct pci_driver pch_driver = {
| ^~~~~~~~~~
cc1: some warnings being treated as errors
vim +604 drivers/ptp/ptp_pch.c
596
597 static struct pci_driver pch_driver = {
598 .name = KBUILD_MODNAME,
599 .id_table = pch_ieee1588_pcidev_id,
600 .probe = pch_probe,
601 .remove = pch_remove,
602 .driver.pm = &pch_pm_ops,
603 };
> 604 module_pci_driver(pch_driver);
605
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
From: kernel test robot <hidden> Date: 2021-08-13 16:19:21
Hi Andy,
I love your patch! Yet something to improve:
[auto build test ERROR on net-next/master]
url: https://github.com/0day-ci/linux/commits/Andy-Shevchenko/ptp_pch-use-mac_pton/20210813-203135
base: https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git b769cf44ed55f4b277b89cf53df6092f0c9082d0
config: powerpc64-randconfig-r034-20210813 (attached as .config)
compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project 62df4df41c939205b2dc0a2a3bfb75b8c1ed74fa)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# install powerpc64 cross compiling tool for clang build
# apt-get install binutils-powerpc-linux-gnu
# https://github.com/0day-ci/linux/commit/6c1fff5c80fe8f1a12c20bac2d28ebfa5960bde7
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Andy-Shevchenko/ptp_pch-use-mac_pton/20210813-203135
git checkout 6c1fff5c80fe8f1a12c20bac2d28ebfa5960bde7
# save the attached .config to linux build tree
mkdir build_dir
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross O=build_dir ARCH=powerpc SHELL=/bin/bash drivers/ptp/
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <redacted>
All error/warnings (new ones prefixed by >>):
__do_insb
^
arch/powerpc/include/asm/io.h:556:56: note: expanded from macro '__do_insb'
#define __do_insb(p, b, n) readsb((PCI_IO_ADDR)_IO_BASE+(p), (b), (n))
~~~~~~~~~~~~~~~~~~~~~^
In file included from drivers/ptp/ptp_pch.c:13:
In file included from include/linux/interrupt.h:11:
In file included from include/linux/hardirq.h:11:
In file included from arch/powerpc/include/asm/hardirq.h:6:
In file included from include/linux/irq.h:20:
In file included from include/linux/io.h:13:
In file included from arch/powerpc/include/asm/io.h:619:
arch/powerpc/include/asm/io-defs.h:45:1: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
DEF_PCI_AC_NORET(insw, (unsigned long p, void *b, unsigned long c),
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
arch/powerpc/include/asm/io.h:616:3: note: expanded from macro 'DEF_PCI_AC_NORET'
__do_##name al; \
^~~~~~~~~~~~~~
<scratch space>:174:1: note: expanded from here
__do_insw
^
arch/powerpc/include/asm/io.h:557:56: note: expanded from macro '__do_insw'
#define __do_insw(p, b, n) readsw((PCI_IO_ADDR)_IO_BASE+(p), (b), (n))
~~~~~~~~~~~~~~~~~~~~~^
In file included from drivers/ptp/ptp_pch.c:13:
In file included from include/linux/interrupt.h:11:
In file included from include/linux/hardirq.h:11:
In file included from arch/powerpc/include/asm/hardirq.h:6:
In file included from include/linux/irq.h:20:
In file included from include/linux/io.h:13:
In file included from arch/powerpc/include/asm/io.h:619:
arch/powerpc/include/asm/io-defs.h:47:1: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
DEF_PCI_AC_NORET(insl, (unsigned long p, void *b, unsigned long c),
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
arch/powerpc/include/asm/io.h:616:3: note: expanded from macro 'DEF_PCI_AC_NORET'
__do_##name al; \
^~~~~~~~~~~~~~
<scratch space>:176:1: note: expanded from here
__do_insl
^
arch/powerpc/include/asm/io.h:558:56: note: expanded from macro '__do_insl'
#define __do_insl(p, b, n) readsl((PCI_IO_ADDR)_IO_BASE+(p), (b), (n))
~~~~~~~~~~~~~~~~~~~~~^
In file included from drivers/ptp/ptp_pch.c:13:
In file included from include/linux/interrupt.h:11:
In file included from include/linux/hardirq.h:11:
In file included from arch/powerpc/include/asm/hardirq.h:6:
In file included from include/linux/irq.h:20:
In file included from include/linux/io.h:13:
In file included from arch/powerpc/include/asm/io.h:619:
arch/powerpc/include/asm/io-defs.h:49:1: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
DEF_PCI_AC_NORET(outsb, (unsigned long p, const void *b, unsigned long c),
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
arch/powerpc/include/asm/io.h:616:3: note: expanded from macro 'DEF_PCI_AC_NORET'
__do_##name al; \
^~~~~~~~~~~~~~
<scratch space>:178:1: note: expanded from here
__do_outsb
^
arch/powerpc/include/asm/io.h:559:58: note: expanded from macro '__do_outsb'
#define __do_outsb(p, b, n) writesb((PCI_IO_ADDR)_IO_BASE+(p),(b),(n))
~~~~~~~~~~~~~~~~~~~~~^
In file included from drivers/ptp/ptp_pch.c:13:
In file included from include/linux/interrupt.h:11:
In file included from include/linux/hardirq.h:11:
In file included from arch/powerpc/include/asm/hardirq.h:6:
In file included from include/linux/irq.h:20:
In file included from include/linux/io.h:13:
In file included from arch/powerpc/include/asm/io.h:619:
arch/powerpc/include/asm/io-defs.h:51:1: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
DEF_PCI_AC_NORET(outsw, (unsigned long p, const void *b, unsigned long c),
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
arch/powerpc/include/asm/io.h:616:3: note: expanded from macro 'DEF_PCI_AC_NORET'
__do_##name al; \
^~~~~~~~~~~~~~
<scratch space>:180:1: note: expanded from here
__do_outsw
^
arch/powerpc/include/asm/io.h:560:58: note: expanded from macro '__do_outsw'
#define __do_outsw(p, b, n) writesw((PCI_IO_ADDR)_IO_BASE+(p),(b),(n))
~~~~~~~~~~~~~~~~~~~~~^
In file included from drivers/ptp/ptp_pch.c:13:
In file included from include/linux/interrupt.h:11:
In file included from include/linux/hardirq.h:11:
In file included from arch/powerpc/include/asm/hardirq.h:6:
In file included from include/linux/irq.h:20:
In file included from include/linux/io.h:13:
In file included from arch/powerpc/include/asm/io.h:619:
arch/powerpc/include/asm/io-defs.h:53:1: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
DEF_PCI_AC_NORET(outsl, (unsigned long p, const void *b, unsigned long c),
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
arch/powerpc/include/asm/io.h:616:3: note: expanded from macro 'DEF_PCI_AC_NORET'
__do_##name al; \
^~~~~~~~~~~~~~
<scratch space>:182:1: note: expanded from here
__do_outsl
^
arch/powerpc/include/asm/io.h:561:58: note: expanded from macro '__do_outsl'
#define __do_outsl(p, b, n) writesl((PCI_IO_ADDR)_IO_BASE+(p),(b),(n))
~~~~~~~~~~~~~~~~~~~~~^
quoted
drivers/ptp/ptp_pch.c:604:1: warning: declaration specifier missing, defaulting to 'int'
module_pci_driver(pch_driver);
^
int
quoted
drivers/ptp/ptp_pch.c:604:19: error: a parameter list without types is only allowed in a function definition
Thanks!
Definitely I have compiled it in my local branch. I'll check what is the root
cause of this.
Kconfig misses PCI dependency. I will send a separate patch, there is nothing
to do here.
That patch has to be before this one, tho. There is a static inline
stub for pci_register_driver() etc. if !PCI, but there isn't for
module_pci_driver(), meaning in builds without PCI this driver used
to be harmlessly pointless, now it's breaking build.
Am I missing something?
Adding Bjorn in case he has a preference on adding the dependency vs
stubbing out module_pci_driver().
Thanks!
Definitely I have compiled it in my local branch. I'll check what is the root
cause of this.
Kconfig misses PCI dependency. I will send a separate patch, there is nothing
to do here.
That patch has to be before this one, tho.
Yes, I have sent it as a fix to the net, this series is to the
net-next. Am I missing something in the process here? Because I have
been told a few times that I mustn't collect net and net-next patches
in one series in the usual cases.
There is a static inline
stub for pci_register_driver() etc. if !PCI, but there isn't for
module_pci_driver(), meaning in builds without PCI this driver used
to be harmlessly pointless, now it's breaking build.
Am I missing something?
Adding Bjorn in case he has a preference on adding the dependency vs
stubbing out module_pci_driver().
I went all the same way but I have checked SPI and I²C how they are
doing. It seems the common practice is to use direct dependency.
Nevertheless, the stubs in PCI puzzled me a bit, why do we have them
in the first place?
--
With Best Regards,
Andy Shevchenko
(.text+0x32c): undefined reference to `ioread64_lo_hi'
hppa-linux-ld: drivers/ptp/ptp_pch.o: in function `pch_tx_snap_read':
(.text+0x3ac): undefined reference to `ioread64_lo_hi'
hppa-linux-ld: drivers/ptp/ptp_pch.o: in function `pch_set_station_address':
quoted
(.text+0x4a0): undefined reference to `iowrite64_lo_hi'
hppa-linux-ld: drivers/ptp/ptp_pch.o: in function `ptp_pch_settime':
quoted
ptp_pch.o:(.text+0x61c): undefined reference to `iowrite64_lo_hi'
hppa-linux-ld: drivers/ptp/ptp_pch.o: in function `ptp_pch_adjtime':
quoted
ptp_pch.o:(.text+0x6d8): undefined reference to `ioread64_lo_hi'
hppa-linux-ld: ptp_pch.o:(.text+0x6fc): undefined reference to `iowrite64_lo_hi'
hppa-linux-ld: drivers/ptp/ptp_pch.o: in function `ptp_pch_gettime':
ptp_pch.o:(.text+0x9d0): undefined reference to `ioread64_lo_hi'
hppa-linux-ld: drivers/ptp/ptp_pch.o: in function `pch_probe':
ptp_pch.o:(.text+0xd60): undefined reference to `iowrite64_lo_hi'
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
From: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Date: 2021-08-23 08:29:14
On Fri, Aug 13, 2021 at 11:23:12AM -0700, Jakub Kicinski wrote:
On Fri, 13 Aug 2021 18:39:14 +0300 Andy Shevchenko wrote:
quoted
On Fri, Aug 13, 2021 at 06:13:21PM +0300, Andy Shevchenko wrote:
quoted
On Fri, Aug 13, 2021 at 10:34:17PM +0800, kernel test robot wrote:
quoted
quoted
quoted
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <redacted>
Thanks!
Definitely I have compiled it in my local branch. I'll check what is the root
cause of this.
Kconfig misses PCI dependency. I will send a separate patch, there is nothing
to do here.
That patch has to be before this one, tho. There is a static inline
stub for pci_register_driver() etc. if !PCI, but there isn't for
module_pci_driver(), meaning in builds without PCI this driver used
to be harmlessly pointless, now it's breaking build.
Am I missing something?
Because the PCI dependency has been restored, can we now apply this series?
FYI, It was also reported that without PCI dependency and even w/o this path
the build can be broken on some architectures due to other reasons (PCI_IOBASE
is one of them IIRC).
--
With Best Regards,
Andy Shevchenko