diff options
author | Ovidiu Panait <ovidiu.panait.oss@gmail.com> | 2025-07-20 21:38:32 +0300 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2025-07-24 11:30:03 +0200 |
commit | ff9ec951021c2040db475f3d5cc1ada4259dad33 (patch) | |
tree | f979ee14263b45fbdee10c6a2a8675c3d2cf5109 | |
parent | a8934352ba01081c51d2df428e9d540aae0e88b5 (diff) |
staging: axis-fifo: remove sysfs interface
Unhandled fault: imprecise external abort (0x1406) at 0xaec8d000
[aec8d000] *pgd=03f74831, *pte=0525c75f, *ppte=0525cc7f
Internal error: Oops - BUG: 1406 [#1] SMP ARM
Hardware name: Xilinx Zynq Platform
PC is at sysfs_read+0xc4/0xd8
LR is at dev_attr_show+0x6c/0xc0
pc : [<c0ff9298>] lr : [<c0adad38>] psr: 60070013
sp : e09abd18 ip : c3193000 fp : c0adaccc
r10: 00000000 r9 : c3192000 r8 : 183abab5
r7 : c1d5d5a8 r6 : c2d71440 r5 : 00000024 r4 : c3192000
r3 : e0a60024 r2 : 00000000 r1 : c3192000 r0 : c2d71444
...
Call trace:
sysfs_read from dev_attr_show+0x6c/0xc0
dev_attr_show from sysfs_kf_seq_show+0x270/0x360
sysfs_kf_seq_show from seq_read_iter+0x7f4/0x10bc
seq_read_iter from vfs_read+0x350/0x3d0
vfs_read from ksys_read+0x104/0x194
ksys_read from ret_fast_syscall+0x0/0x54
The same abort is triggered if a read is attempted on RDFD register when
the fifo is empty.
Therefore, remove the sysfs interface and only let read()/write() modify
the fifo registers. For debugging purposes, a simple read-only debugfs
interface is added in the next patch.
Fixes: 4a965c5f89de ("staging: add driver for Xilinx AXI-Stream FIFO v4.1 IP core")
Signed-off-by: Ovidiu Panait <ovidiu.panait.oss@gmail.com>
Link: https://lore.kernel.org/r/20250720183833.3570345-1-ovidiu.panait.oss@gmail.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r-- | drivers/staging/axis-fifo/axis-fifo.c | 175 |
1 files changed, 0 insertions, 175 deletions
diff --git a/drivers/staging/axis-fifo/axis-fifo.c b/drivers/staging/axis-fifo/axis-fifo.c index 351f983ef914..7897434f2441 100644 --- a/drivers/staging/axis-fifo/axis-fifo.c +++ b/drivers/staging/axis-fifo/axis-fifo.c @@ -140,180 +140,6 @@ struct axis_fifo { }; /* ---------------------------- - * sysfs entries - * ---------------------------- - */ - -static ssize_t sysfs_write(struct device *dev, const char *buf, - size_t count, unsigned int addr_offset) -{ - struct axis_fifo *fifo = dev_get_drvdata(dev); - unsigned long tmp; - int rc; - - rc = kstrtoul(buf, 0, &tmp); - if (rc < 0) - return rc; - - iowrite32(tmp, fifo->base_addr + addr_offset); - - return count; -} - -static ssize_t sysfs_read(struct device *dev, char *buf, - unsigned int addr_offset) -{ - struct axis_fifo *fifo = dev_get_drvdata(dev); - unsigned int read_val; - - read_val = ioread32(fifo->base_addr + addr_offset); - return sysfs_emit(buf, "0x%x\n", read_val); -} - -static ssize_t isr_store(struct device *dev, struct device_attribute *attr, - const char *buf, size_t count) -{ - return sysfs_write(dev, buf, count, XLLF_ISR_OFFSET); -} - -static ssize_t isr_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - return sysfs_read(dev, buf, XLLF_ISR_OFFSET); -} - -static DEVICE_ATTR_RW(isr); - -static ssize_t ier_store(struct device *dev, struct device_attribute *attr, - const char *buf, size_t count) -{ - return sysfs_write(dev, buf, count, XLLF_IER_OFFSET); -} - -static ssize_t ier_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - return sysfs_read(dev, buf, XLLF_IER_OFFSET); -} - -static DEVICE_ATTR_RW(ier); - -static ssize_t tdfr_store(struct device *dev, struct device_attribute *attr, - const char *buf, size_t count) -{ - return sysfs_write(dev, buf, count, XLLF_TDFR_OFFSET); -} - -static DEVICE_ATTR_WO(tdfr); - -static ssize_t tdfv_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - return sysfs_read(dev, buf, XLLF_TDFV_OFFSET); -} - -static DEVICE_ATTR_RO(tdfv); - -static ssize_t tdfd_store(struct device *dev, struct device_attribute *attr, - const char *buf, size_t count) -{ - return sysfs_write(dev, buf, count, XLLF_TDFD_OFFSET); -} - -static DEVICE_ATTR_WO(tdfd); - -static ssize_t tlr_store(struct device *dev, struct device_attribute *attr, - const char *buf, size_t count) -{ - return sysfs_write(dev, buf, count, XLLF_TLR_OFFSET); -} - -static DEVICE_ATTR_WO(tlr); - -static ssize_t rdfr_store(struct device *dev, struct device_attribute *attr, - const char *buf, size_t count) -{ - return sysfs_write(dev, buf, count, XLLF_RDFR_OFFSET); -} - -static DEVICE_ATTR_WO(rdfr); - -static ssize_t rdfo_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - return sysfs_read(dev, buf, XLLF_RDFO_OFFSET); -} - -static DEVICE_ATTR_RO(rdfo); - -static ssize_t rdfd_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - return sysfs_read(dev, buf, XLLF_RDFD_OFFSET); -} - -static DEVICE_ATTR_RO(rdfd); - -static ssize_t rlr_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - return sysfs_read(dev, buf, XLLF_RLR_OFFSET); -} - -static DEVICE_ATTR_RO(rlr); - -static ssize_t srr_store(struct device *dev, struct device_attribute *attr, - const char *buf, size_t count) -{ - return sysfs_write(dev, buf, count, XLLF_SRR_OFFSET); -} - -static DEVICE_ATTR_WO(srr); - -static ssize_t tdr_store(struct device *dev, struct device_attribute *attr, - const char *buf, size_t count) -{ - return sysfs_write(dev, buf, count, XLLF_TDR_OFFSET); -} - -static DEVICE_ATTR_WO(tdr); - -static ssize_t rdr_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - return sysfs_read(dev, buf, XLLF_RDR_OFFSET); -} - -static DEVICE_ATTR_RO(rdr); - -static struct attribute *axis_fifo_attrs[] = { - &dev_attr_isr.attr, - &dev_attr_ier.attr, - &dev_attr_tdfr.attr, - &dev_attr_tdfv.attr, - &dev_attr_tdfd.attr, - &dev_attr_tlr.attr, - &dev_attr_rdfr.attr, - &dev_attr_rdfo.attr, - &dev_attr_rdfd.attr, - &dev_attr_rlr.attr, - &dev_attr_srr.attr, - &dev_attr_tdr.attr, - &dev_attr_rdr.attr, - NULL, -}; - -static const struct attribute_group axis_fifo_attrs_group = { - .name = "ip_registers", - .attrs = axis_fifo_attrs, -}; - -static const struct attribute_group *axis_fifo_attrs_groups[] = { - &axis_fifo_attrs_group, - NULL, -}; - -/* ---------------------------- * implementation * ---------------------------- */ @@ -877,7 +703,6 @@ static int axis_fifo_probe(struct platform_device *pdev) fifo->miscdev.fops = &fops; fifo->miscdev.minor = MISC_DYNAMIC_MINOR; fifo->miscdev.name = device_name; - fifo->miscdev.groups = axis_fifo_attrs_groups; fifo->miscdev.parent = dev; rc = misc_register(&fifo->miscdev); if (rc < 0) |