Message ID | 20200323234303.526748-14-marex@denx.de |
---|---|
State | Superseded |
Delegated to: | David Miller |
Headers | show |
Series | net: ks8851: Unify KS8851 SPI and MLL drivers | expand |
Hi Marek, I love your patch! Yet something to improve: [auto build test ERROR on net/master] [also build test ERROR on net-next/master linus/master ipvs/master v5.6-rc7 next-20200323] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system. BTW, we also suggest to use '--base' option to specify the base tree in git format-patch, please see https://stackoverflow.com/a/37406982] url: https://github.com/0day-ci/linux/commits/Marek-Vasut/net-ks8851-Unify-KS8851-SPI-and-MLL-drivers/20200324-074805 base: https://git.kernel.org/pub/scm/linux/kernel/git/davem/net.git 6cd6cbf593bfa3ae6fc3ed34ac21da4d35045425 config: x86_64-kexec (attached as .config) compiler: gcc-7 (Debian 7.5.0-5) 7.5.0 reproduce: # save the attached .config to linux build tree make ARCH=x86_64 If you fix the issue, kindly add following tag Reported-by: kbuild test robot <lkp@intel.com> All errors (new ones prefixed by >>): ld: drivers/net/ethernet/micrel/ks8851.o: in function `ks8851_set_eeprom': >> drivers/net/ethernet/micrel/ks8851.c:875: undefined reference to `eeprom_93cx6_wren' >> ld: drivers/net/ethernet/micrel/ks8851.c:880: undefined reference to `eeprom_93cx6_read' >> ld: drivers/net/ethernet/micrel/ks8851.c:890: undefined reference to `eeprom_93cx6_write' >> ld: drivers/net/ethernet/micrel/ks8851.c:891: undefined reference to `eeprom_93cx6_wren' ld: drivers/net/ethernet/micrel/ks8851.o: in function `ks8851_get_eeprom': >> drivers/net/ethernet/micrel/ks8851.c:914: undefined reference to `eeprom_93cx6_multiread' vim +875 drivers/net/ethernet/micrel/ks8851.c 51b7b1c34e1958 drivers/net/ethernet/micrel/ks8851.c Ben Dooks 2011-11-21 856 a84afa40e07b68 drivers/net/ks8851.c Sebastien Jan 2010-05-05 857 static int ks8851_set_eeprom(struct net_device *dev, 51b7b1c34e1958 drivers/net/ethernet/micrel/ks8851.c Ben Dooks 2011-11-21 858 struct ethtool_eeprom *ee, u8 *data) a84afa40e07b68 drivers/net/ks8851.c Sebastien Jan 2010-05-05 859 { a84afa40e07b68 drivers/net/ks8851.c Sebastien Jan 2010-05-05 860 struct ks8851_net *ks = netdev_priv(dev); 51b7b1c34e1958 drivers/net/ethernet/micrel/ks8851.c Ben Dooks 2011-11-21 861 int offset = ee->offset; 51b7b1c34e1958 drivers/net/ethernet/micrel/ks8851.c Ben Dooks 2011-11-21 862 int len = ee->len; 51b7b1c34e1958 drivers/net/ethernet/micrel/ks8851.c Ben Dooks 2011-11-21 863 u16 tmp; 51b7b1c34e1958 drivers/net/ethernet/micrel/ks8851.c Ben Dooks 2011-11-21 864 51b7b1c34e1958 drivers/net/ethernet/micrel/ks8851.c Ben Dooks 2011-11-21 865 /* currently only support byte writing */ 51b7b1c34e1958 drivers/net/ethernet/micrel/ks8851.c Ben Dooks 2011-11-21 866 if (len != 1) a84afa40e07b68 drivers/net/ks8851.c Sebastien Jan 2010-05-05 867 return -EINVAL; a84afa40e07b68 drivers/net/ks8851.c Sebastien Jan 2010-05-05 868 51b7b1c34e1958 drivers/net/ethernet/micrel/ks8851.c Ben Dooks 2011-11-21 869 if (ee->magic != KS_EEPROM_MAGIC) 51b7b1c34e1958 drivers/net/ethernet/micrel/ks8851.c Ben Dooks 2011-11-21 870 return -EINVAL; a84afa40e07b68 drivers/net/ks8851.c Sebastien Jan 2010-05-05 871 51b7b1c34e1958 drivers/net/ethernet/micrel/ks8851.c Ben Dooks 2011-11-21 872 if (ks8851_eeprom_claim(ks)) 51b7b1c34e1958 drivers/net/ethernet/micrel/ks8851.c Ben Dooks 2011-11-21 873 return -ENOENT; 51b7b1c34e1958 drivers/net/ethernet/micrel/ks8851.c Ben Dooks 2011-11-21 874 51b7b1c34e1958 drivers/net/ethernet/micrel/ks8851.c Ben Dooks 2011-11-21 @875 eeprom_93cx6_wren(&ks->eeprom, true); 51b7b1c34e1958 drivers/net/ethernet/micrel/ks8851.c Ben Dooks 2011-11-21 876 51b7b1c34e1958 drivers/net/ethernet/micrel/ks8851.c Ben Dooks 2011-11-21 877 /* ethtool currently only supports writing bytes, which means 51b7b1c34e1958 drivers/net/ethernet/micrel/ks8851.c Ben Dooks 2011-11-21 878 * we have to read/modify/write our 16bit EEPROMs */ 51b7b1c34e1958 drivers/net/ethernet/micrel/ks8851.c Ben Dooks 2011-11-21 879 51b7b1c34e1958 drivers/net/ethernet/micrel/ks8851.c Ben Dooks 2011-11-21 @880 eeprom_93cx6_read(&ks->eeprom, offset/2, &tmp); a84afa40e07b68 drivers/net/ks8851.c Sebastien Jan 2010-05-05 881 51b7b1c34e1958 drivers/net/ethernet/micrel/ks8851.c Ben Dooks 2011-11-21 882 if (offset & 1) { 51b7b1c34e1958 drivers/net/ethernet/micrel/ks8851.c Ben Dooks 2011-11-21 883 tmp &= 0xff; 51b7b1c34e1958 drivers/net/ethernet/micrel/ks8851.c Ben Dooks 2011-11-21 884 tmp |= *data << 8; 51b7b1c34e1958 drivers/net/ethernet/micrel/ks8851.c Ben Dooks 2011-11-21 885 } else { 51b7b1c34e1958 drivers/net/ethernet/micrel/ks8851.c Ben Dooks 2011-11-21 886 tmp &= 0xff00; 51b7b1c34e1958 drivers/net/ethernet/micrel/ks8851.c Ben Dooks 2011-11-21 887 tmp |= *data; 51b7b1c34e1958 drivers/net/ethernet/micrel/ks8851.c Ben Dooks 2011-11-21 888 } 51b7b1c34e1958 drivers/net/ethernet/micrel/ks8851.c Ben Dooks 2011-11-21 889 51b7b1c34e1958 drivers/net/ethernet/micrel/ks8851.c Ben Dooks 2011-11-21 @890 eeprom_93cx6_write(&ks->eeprom, offset/2, tmp); 51b7b1c34e1958 drivers/net/ethernet/micrel/ks8851.c Ben Dooks 2011-11-21 @891 eeprom_93cx6_wren(&ks->eeprom, false); 51b7b1c34e1958 drivers/net/ethernet/micrel/ks8851.c Ben Dooks 2011-11-21 892 51b7b1c34e1958 drivers/net/ethernet/micrel/ks8851.c Ben Dooks 2011-11-21 893 ks8851_eeprom_release(ks); a84afa40e07b68 drivers/net/ks8851.c Sebastien Jan 2010-05-05 894 51b7b1c34e1958 drivers/net/ethernet/micrel/ks8851.c Ben Dooks 2011-11-21 895 return 0; a84afa40e07b68 drivers/net/ks8851.c Sebastien Jan 2010-05-05 896 } a84afa40e07b68 drivers/net/ks8851.c Sebastien Jan 2010-05-05 897 51b7b1c34e1958 drivers/net/ethernet/micrel/ks8851.c Ben Dooks 2011-11-21 898 static int ks8851_get_eeprom(struct net_device *dev, 51b7b1c34e1958 drivers/net/ethernet/micrel/ks8851.c Ben Dooks 2011-11-21 899 struct ethtool_eeprom *ee, u8 *data) 51b7b1c34e1958 drivers/net/ethernet/micrel/ks8851.c Ben Dooks 2011-11-21 900 { 51b7b1c34e1958 drivers/net/ethernet/micrel/ks8851.c Ben Dooks 2011-11-21 901 struct ks8851_net *ks = netdev_priv(dev); 51b7b1c34e1958 drivers/net/ethernet/micrel/ks8851.c Ben Dooks 2011-11-21 902 int offset = ee->offset; 51b7b1c34e1958 drivers/net/ethernet/micrel/ks8851.c Ben Dooks 2011-11-21 903 int len = ee->len; a84afa40e07b68 drivers/net/ks8851.c Sebastien Jan 2010-05-05 904 51b7b1c34e1958 drivers/net/ethernet/micrel/ks8851.c Ben Dooks 2011-11-21 905 /* must be 2 byte aligned */ 51b7b1c34e1958 drivers/net/ethernet/micrel/ks8851.c Ben Dooks 2011-11-21 906 if (len & 1 || offset & 1) 51b7b1c34e1958 drivers/net/ethernet/micrel/ks8851.c Ben Dooks 2011-11-21 907 return -EINVAL; a84afa40e07b68 drivers/net/ks8851.c Sebastien Jan 2010-05-05 908 51b7b1c34e1958 drivers/net/ethernet/micrel/ks8851.c Ben Dooks 2011-11-21 909 if (ks8851_eeprom_claim(ks)) 51b7b1c34e1958 drivers/net/ethernet/micrel/ks8851.c Ben Dooks 2011-11-21 910 return -ENOENT; a84afa40e07b68 drivers/net/ks8851.c Sebastien Jan 2010-05-05 911 51b7b1c34e1958 drivers/net/ethernet/micrel/ks8851.c Ben Dooks 2011-11-21 912 ee->magic = KS_EEPROM_MAGIC; a84afa40e07b68 drivers/net/ks8851.c Sebastien Jan 2010-05-05 913 51b7b1c34e1958 drivers/net/ethernet/micrel/ks8851.c Ben Dooks 2011-11-21 @914 eeprom_93cx6_multiread(&ks->eeprom, offset/2, (__le16 *)data, len/2); 51b7b1c34e1958 drivers/net/ethernet/micrel/ks8851.c Ben Dooks 2011-11-21 915 ks8851_eeprom_release(ks); a84afa40e07b68 drivers/net/ks8851.c Sebastien Jan 2010-05-05 916 51b7b1c34e1958 drivers/net/ethernet/micrel/ks8851.c Ben Dooks 2011-11-21 917 return 0; a84afa40e07b68 drivers/net/ks8851.c Sebastien Jan 2010-05-05 918 } a84afa40e07b68 drivers/net/ks8851.c Sebastien Jan 2010-05-05 919 :::::: The code at line 875 was first introduced by commit :::::: 51b7b1c34e195886e38ee93ff2a8a203745f897f KSZ8851-SNL: Add ethtool support for EEPROM via eeprom_93cx6 :::::: TO: Ben Dooks <ben@simtec.co.uk> :::::: CC: David S. Miller <davem@davemloft.net> --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
diff --git a/drivers/net/ethernet/micrel/Makefile b/drivers/net/ethernet/micrel/Makefile index bb5c6c53fa02..bff104b15aaa 100644 --- a/drivers/net/ethernet/micrel/Makefile +++ b/drivers/net/ethernet/micrel/Makefile @@ -5,5 +5,5 @@ obj-$(CONFIG_KS8842) += ks8842.o obj-$(CONFIG_KS8851) += ks8851.o ks8851_spi.o -obj-$(CONFIG_KS8851_MLL) += ks8851_mll.o +obj-$(CONFIG_KS8851_MLL) += ks8851.o ks8851_par.o obj-$(CONFIG_KSZ884X_PCI) += ksz884x.o diff --git a/drivers/net/ethernet/micrel/ks8851_par.c b/drivers/net/ethernet/micrel/ks8851_par.c new file mode 100644 index 000000000000..2b1be1293c42 --- /dev/null +++ b/drivers/net/ethernet/micrel/ks8851_par.c @@ -0,0 +1,201 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* drivers/net/ethernet/micrel/ks8851.c + * + * Copyright 2009 Simtec Electronics + * http://www.simtec.co.uk/ + * Ben Dooks <ben@simtec.co.uk> + */ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#define DEBUG + +#include <linux/interrupt.h> +#include <linux/module.h> +#include <linux/kernel.h> +#include <linux/netdevice.h> +#include <linux/etherdevice.h> +#include <linux/ethtool.h> +#include <linux/cache.h> +#include <linux/crc32.h> +#include <linux/mii.h> +#include <linux/eeprom_93cx6.h> +#include <linux/regulator/consumer.h> + +#include <linux/platform_device.h> +#include <linux/gpio.h> +#include <linux/of_gpio.h> +#include <linux/of_net.h> + +#include "ks8851.h" + +#define BE3 0x8000 /* Byte Enable 3 */ +#define BE2 0x4000 /* Byte Enable 2 */ +#define BE1 0x2000 /* Byte Enable 1 */ +#define BE0 0x1000 /* Byte Enable 0 */ + +/** + * struct ks8851_net_par - KS8851 Parallel driver private data + * @ks8851: KS8851 driver common private data + * @hw_addr : start address of data register. + * @hw_addr_cmd : start address of command register. + * @cmd_reg_cache : command register cached. + */ +struct ks8851_net_par { + struct ks8851_net ks8851; /* Must be first */ + void __iomem *hw_addr; + void __iomem *hw_addr_cmd; + u16 cmd_reg_cache; +}; + +#define to_ks8851_par(ks) container_of((ks), struct ks8851_net_par, ks8851) + +/** + * ks8851_wrreg16_par - write 16bit register value to chip + * @ks: The chip state + * @reg: The register address + * @val: The value to write + * + * Issue a write to put the value @val into the register specified in @reg. + */ +static void ks8851_wrreg16_par(struct ks8851_net *ks, unsigned int reg, + unsigned int val) +{ + struct ks8851_net_par *ksp = to_ks8851_par(ks); + + ksp->cmd_reg_cache = (u16)reg | ((BE3 | BE2) >> (reg & 0x02)); + iowrite16(ksp->cmd_reg_cache, ksp->hw_addr_cmd); + iowrite16(val, ksp->hw_addr); +} + +/** + * ks8851_rdreg16_par - read 16 bit register from device via SPI + * @ks: The chip information + * @reg: The register address + * + * Read a 16bit register from the chip, returning the result + */ +static unsigned int ks8851_rdreg16_par(struct ks8851_net *ks, unsigned int reg) +{ + struct ks8851_net_par *ksp = to_ks8851_par(ks); + + ksp->cmd_reg_cache = (u16)reg | ((BE3 | BE2) >> (reg & 0x02)); + iowrite16(ksp->cmd_reg_cache, ksp->hw_addr_cmd); + return ioread16(ksp->hw_addr); +} + +/** + * ks8851_rdfifo_par - read data from the receive fifo + * @ks: The device state. + * @buff: The buffer address + * @len: The length of the data to read + * + * Issue an RXQ FIFO read command and read the @len amount of data from + * the FIFO into the buffer specified by @buff. + */ +static void ks8851_rdfifo_par(struct ks8851_net *ks, u8 *buff, unsigned int len) +{ + struct ks8851_net_par *ksp = to_ks8851_par(ks); + u16 *wptr = (u16 *)(buff + 2); + + netif_dbg(ks, rx_status, ks->netdev, + "%s: %d@%p\n", __func__, len, buff); + + len >>= 1; + while (len--) + *wptr++ = be16_to_cpu(ioread16(ksp->hw_addr)); +} + +/** + * ks8851_wrpkt_par - write packet to TX FIFO + * @ks: The device state. + * @txp: The sk_buff to transmit. + * @irq: IRQ on completion of the packet. + * + * Send the @txp to the chip. This means creating the relevant packet header + * specifying the length of the packet and the other information the chip + * needs, such as IRQ on completion. Send the header and the packet data to + * the device. + */ +static void ks8851_wrpkt_par(struct ks8851_net *ks, struct sk_buff *txp, + bool irq) +{ + struct ks8851_net_par *ksp = to_ks8851_par(ks); + unsigned int len = ALIGN(txp->len, 4); + u16 *wptr = (u16 *)txp->data; + unsigned int fid = 0; + + netif_dbg(ks, tx_queued, ks->netdev, "%s: skb %p, %d@%p, irq %d\n", + __func__, txp, txp->len, txp->data, irq); + + fid = ks->fid++; + fid &= TXFR_TXFID_MASK; + + if (irq) + fid |= TXFR_TXIC; /* irq on completion */ + + iowrite16(cpu_to_be16(fid), ksp->hw_addr); + iowrite16(cpu_to_be16(txp->len), ksp->hw_addr); + + len >>= 1; + while (len--) + iowrite16(cpu_to_be16(*wptr++), ksp->hw_addr); +} + +static int ks8851_probe_par(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct ks8851_net_par *ksp; + struct net_device *ndev; + struct ks8851_net *ks; + + ndev = devm_alloc_etherdev(dev, sizeof(struct ks8851_net_par)); + if (!ndev) + return -ENOMEM; + + ks = netdev_priv(ndev); + ks->rdreg16 = ks8851_rdreg16_par; + ks->wrreg16 = ks8851_wrreg16_par; + ks->rdfifo = ks8851_rdfifo_par; + ks->wrfifo = ks8851_wrpkt_par; + + ksp = to_ks8851_par(ks); + + ksp->hw_addr = devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(ksp->hw_addr)) + return PTR_ERR(ksp->hw_addr); + + ksp->hw_addr_cmd = devm_platform_ioremap_resource(pdev, 1); + if (IS_ERR(ksp->hw_addr_cmd)) + return PTR_ERR(ksp->hw_addr_cmd); + + ndev->irq = platform_get_irq(pdev, 0); + + return ks8851_probe_common(ndev, dev); +} + +static int ks8851_remove_par(struct platform_device *pdev) +{ + return ks8851_remove_common(&pdev->dev); +} + +static const struct of_device_id ks8851_match_table[] = { + { .compatible = "micrel,ks8851-mll" }, + { } +}; +MODULE_DEVICE_TABLE(of, ks8851_match_table); + +static struct platform_driver ks8851_driver = { + .driver = { + .name = "ks8851", + .of_match_table = ks8851_match_table, + .pm = &ks8851_pm_ops, + }, + .probe = ks8851_probe_par, + .remove = ks8851_remove_par, +}; +module_platform_driver(ks8851_driver); + +MODULE_DESCRIPTION("KS8851 Network driver"); +MODULE_AUTHOR("Ben Dooks <ben@simtec.co.uk>"); +MODULE_LICENSE("GPL");
Implement accessors for KS8851-16MLL/MLLI/MLLU parallel bus variant of the KS8851. This is based off the ks8851_mll.c , which is a driver for exactly the same hardware, however the ks8851.c code is much higher quality. Hence, this patch pulls out the relevant information from the ks8851_mll.c on how to access the bus, but uses the common ks8851.c code. To make this patch reviewable, instead of rewriting ks8851_mll.c, ks8851_mll.c is removed in a separate subsequent patch. Signed-off-by: Marek Vasut <marex@denx.de> Cc: David S. Miller <davem@davemloft.net> Cc: Lukas Wunner <lukas@wunner.de> Cc: Petr Stetiar <ynezz@true.cz> Cc: YueHaibing <yuehaibing@huawei.com> --- drivers/net/ethernet/micrel/Makefile | 2 +- drivers/net/ethernet/micrel/ks8851_par.c | 201 +++++++++++++++++++++++ 2 files changed, 202 insertions(+), 1 deletion(-) create mode 100644 drivers/net/ethernet/micrel/ks8851_par.c