From d5187fef4d33b62d77e1e087d8a0f148150bc5c8 Mon Sep 17 00:00:00 2001 From: "Wesley W. Terpstra" <w.terpstra@gsi.de> Date: Fri, 29 Apr 2016 20:11:05 +0200 Subject: [PATCH] pcie_wb: mutex no longer required, and sleeping in MSI routines is safe --- pcie-wb/pcie_wb.c | 11 ----------- pcie-wb/pcie_wb.h | 1 - pcie-wb/spec_wb.c | 5 ----- pcie-wb/spec_wb.h | 1 - vme-wb/vme_wb_external.c | 13 ------------- 5 files changed, 31 deletions(-) diff --git a/pcie-wb/pcie_wb.c b/pcie-wb/pcie_wb.c index 1686775..e801677 100644 --- a/pcie-wb/pcie_wb.c +++ b/pcie-wb/pcie_wb.c @@ -60,14 +60,10 @@ static void wb_cycle(struct wishbone* wb, int on) dev = container_of(wb, struct pcie_wb_dev, wb); control = dev->pci_res[0].addr; - if (on) mutex_lock(&dev->mutex); - if (unlikely(debug)) printk(KERN_ALERT PCIE_WB ": cycle(%d)\n", on); iowrite32((on?0x80000000UL:0) + 0x40000000UL, control + CONTROL_REGISTER_HIGH); - - if (!on) mutex_unlock(&dev->mutex); } static void wb_byteenable(struct wishbone* wb, unsigned char be) @@ -216,8 +212,6 @@ static wb_data_t wb_read_cfg(struct wishbone *wb, wb_addr_t addr) static int wb_request(struct wishbone *wb, struct wishbone_request *req) { - /* All forms of sleep are forbidden in this method (no printk/mutex/etc) */ - struct pcie_wb_dev* dev; unsigned char* control; uint32_t ctl; @@ -243,8 +237,6 @@ static int wb_request(struct wishbone *wb, struct wishbone_request *req) static void wb_reply(struct wishbone *wb, int err, wb_data_t data) { - /* All forms of sleep are forbidden in this method (no printk/mutex/etc) */ - struct pcie_wb_dev* dev; unsigned char* control; @@ -268,8 +260,6 @@ static const struct wishbone_operations wb_ops = { static irqreturn_t irq_handler(int irq, void *dev_id) { - /* All forms of sleep are forbidden in this method (no printk/mutex/etc) */ - struct pcie_wb_dev *dev = dev_id; pcie_int_enable(dev, 0); @@ -348,7 +338,6 @@ static int probe(struct pci_dev *pdev, const struct pci_device_id *id) dev->wb.wops = &wb_ops; dev->wb.parent = &pdev->dev; dev->wb.mask = 0xffff; - mutex_init(&dev->mutex); dev->window_offset = 0; dev->low_addr = 0; dev->width = 4; diff --git a/pcie-wb/pcie_wb.h b/pcie-wb/pcie_wb.h index 688d4c2..543effc 100644 --- a/pcie-wb/pcie_wb.h +++ b/pcie-wb/pcie_wb.h @@ -43,7 +43,6 @@ struct pcie_wb_dev { int msi; struct wishbone wb; - struct mutex mutex; /* only one user can open a cycle at a time */ unsigned int window_offset; unsigned int low_addr, width, shift; }; diff --git a/pcie-wb/spec_wb.c b/pcie-wb/spec_wb.c index 6ff88a9..9193fc2 100644 --- a/pcie-wb/spec_wb.c +++ b/pcie-wb/spec_wb.c @@ -37,12 +37,8 @@ static void wb_cycle(struct wishbone* wb, int on) dev = container_of(wb, struct spec_wb_dev, wb); - if (on) mutex_lock(&dev->mutex); - if (unlikely(debug)) printk(KERN_ALERT SPEC_WB ": cycle(%d)\n", on); - - if (!on) mutex_unlock(&dev->mutex); } static void wb_byteenable(struct wishbone* wb, unsigned char be) @@ -270,7 +266,6 @@ static int probe(struct pci_dev *pdev, const struct pci_device_id *id) dev->wb.parent = &pdev->dev; dev->wb.mask = 0; // not MSI capable dev->msi = 1; - mutex_init(&dev->mutex); dev->window_offset = 0; dev->low_addr = 0; dev->width = 4; diff --git a/pcie-wb/spec_wb.h b/pcie-wb/spec_wb.h index d7dd282..c2d9868 100644 --- a/pcie-wb/spec_wb.h +++ b/pcie-wb/spec_wb.h @@ -34,7 +34,6 @@ struct spec_wb_dev { int msi; struct wishbone wb; - struct mutex mutex; /* only one user can open a cycle at a time */ unsigned int window_offset; unsigned int low_addr, width, shift; }; diff --git a/vme-wb/vme_wb_external.c b/vme-wb/vme_wb_external.c index 293ff6c..48c7ab0 100644 --- a/vme-wb/vme_wb_external.c +++ b/vme-wb/vme_wb_external.c @@ -49,17 +49,11 @@ static void wb_cycle(struct wishbone *wb, int on) ctrl_win = dev->vme_res.map[MAP_CTRL]->kernel_va; - if (on) - mutex_lock(&dev->mutex); - if (unlikely(debug)) printk(KERN_ALERT ": Cycle(%d)\n", on); iowrite32(cpu_to_be32((on ? 0x80000000UL : 0) + 0x40000000UL), ctrl_win + CTRL); - - if (!on) - mutex_unlock(&dev->mutex); } static wb_data_t wb_read_cfg(struct wishbone *wb, wb_addr_t addr) @@ -154,8 +148,6 @@ static wb_data_t wb_read(struct wishbone *wb, wb_addr_t addr) static int wb_request(struct wishbone *wb, struct wishbone_request *req) { - /* All forms of sleep are forbidden in this method (no printk/mutex/etc) */ - struct vme_wb_dev *dev; unsigned char *ctrl_win; uint32_t ctrl; @@ -178,8 +170,6 @@ static int wb_request(struct wishbone *wb, struct wishbone_request *req) static void wb_reply(struct wishbone *wb, int err, wb_data_t data) { - /* All forms of sleep are forbidden in this method (no printk/mutex/etc) */ - struct vme_wb_dev *dev; unsigned char *ctrl_win; @@ -229,8 +219,6 @@ static void init_ctrl_reg(struct vme_wb_dev *dev) int irq_handler(void *dev_id) { - /* All forms of sleep are forbidden in this method (no printk/mutex/etc) */ - struct vme_wb_dev *dev = dev_id; wishbone_slave_ready(&dev->wb); @@ -443,7 +431,6 @@ static int vme_probe(struct device *pdev, unsigned int ndev) dev->vme_res.vector = vector[ndev]; dev->vme_res.level = level[ndev]; /* Default value */ dev->vme_dev = pdev; - mutex_init(&dev->mutex); dev->wb.wops = &wb_ops; dev->wb.parent = pdev; dev->wb.mask = 0xffff; -- GitLab