From d180cb70e27b77f51d12e1dad9b12a055289d2f0 Mon Sep 17 00:00:00 2001 From: Ralph Metzler Date: Fri, 15 Apr 2016 23:53:20 +0200 Subject: [PATCH] octopro fixes --- ddbridge/ddbridge-core.c | 18 +++++++++--------- ddbridge/ddbridge.c | 9 +++++++-- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/ddbridge/ddbridge-core.c b/ddbridge/ddbridge-core.c index 1144dc5..4b60249 100644 --- a/ddbridge/ddbridge-core.c +++ b/ddbridge/ddbridge-core.c @@ -256,6 +256,7 @@ static int dma_alloc(struct pci_dev *pdev, struct ddb_dma *dma, int dir) DMA_FROM_DEVICE); if (dma_mapping_error(&pdev->dev, dma->pbuf[i])) { kfree(dma->vbuf[i]); + dma->vbuf[i] = 0; return -ENOMEM; } } else { @@ -3092,6 +3093,7 @@ static void ddb_ports_init(struct ddb *dev) } /* fallthrough */ case DDB_OCTONET: case DDB_OCTOPUS: + case DDB_OCTOPRO: ddb_input_init(port, 2 * i, 0, 2 * i, 2 * i); ddb_input_init(port, 2 * i + 1, 1, 2 * i + 1, 2 * i + 1); @@ -3148,12 +3150,12 @@ static void ddb_ports_release(struct ddb *dev) /****************************************************************************/ #define IRQ_HANDLE(_nr) \ - do { if ((s & (1UL << (_nr & 0x1f))) && dev->handler[0][_nr]) \ + do { if ((s & (1UL << ((_nr) & 0x1f))) && dev->handler[0][_nr]) \ dev->handler[0][_nr](dev->handler_data[0][_nr]); } \ while (0) #define IRQ_HANDLE_BYTE(_n) \ - if (s & (0x000000ff << (_n & 0x1f))) { \ + if (s & (0x000000ff << ((_n) & 0x1f))) { \ IRQ_HANDLE(0 + _n); \ IRQ_HANDLE(1 + _n); \ IRQ_HANDLE(2 + _n); \ @@ -3280,7 +3282,8 @@ static irqreturn_t irq_handle_v2_n(struct ddb *dev, u32 n) u32 reg = INTERRUPT_V2_STATUS_1 + 4 * n; u32 s = ddbreadl(dev, reg); u32 off = n * 32; - + + //pr_info("irq_handle_v2_%u s=%08x\n", n, s); if (!s) return IRQ_NONE; ddbwritel(dev, s, reg); @@ -3301,7 +3304,7 @@ static irqreturn_t irq_handle_v2_n(struct ddb *dev, u32 n) static irqreturn_t irq_handler_v2(int irq, void *dev_id) { struct ddb *dev = (struct ddb *) dev_id; - u32 s = ddbreadl(dev, INTERRUPT_V2_STATUS); + u32 s = 0xffff & ddbreadl(dev, INTERRUPT_V2_STATUS); int ret = IRQ_HANDLED; if (!s) @@ -3309,9 +3312,10 @@ static irqreturn_t irq_handler_v2(int irq, void *dev_id) do { if (s & 0x80000000) return IRQ_NONE; + //pr_info("irq_handler_v2 s=%08x\n", s); if (s & 0x00000001) irq_handle_v2_n(dev, 0); - } while ((s = ddbreadl(dev, INTERRUPT_V2_STATUS))); + } while ((s = 0xffff & ddbreadl(dev, INTERRUPT_V2_STATUS))); return ret; } @@ -4753,16 +4757,12 @@ static int ddb_init(struct ddb *dev) ddb_device_create(dev); return 0; } - - if (dev->link[0].info->ns_num) { ddbwritel(dev, 1, ETHER_CONTROL); dev->vlan = vlan; ddbwritel(dev, 14 + (dev->vlan ? 4 : 0), ETHER_LENGTH); } - mutex_init(&dev->link[0].lnb.lock); - if (dev->link[0].info->regmap->gtl) ddb_gtl_init(dev); diff --git a/ddbridge/ddbridge.c b/ddbridge/ddbridge.c index 0f37289..ab07005 100644 --- a/ddbridge/ddbridge.c +++ b/ddbridge/ddbridge.c @@ -57,7 +57,7 @@ static void ddb_unmap(struct ddb *dev) vfree(dev); } -static void __devexit ddb_irq_exit(struct ddb *dev) +static void __devexit ddb_irq_disable(struct ddb *dev) { if ((dev->link[0].ids.regmapid & 0xffff0000) == 0x00020000) { //ddbwritel(dev, 0x00000000, INTERRUPT_V2_CONTROL); @@ -72,6 +72,11 @@ static void __devexit ddb_irq_exit(struct ddb *dev) ddbwritel(dev, 0, INTERRUPT_ENABLE); ddbwritel(dev, 0, MSI1_ENABLE); } +} + +static void __devexit ddb_irq_exit(struct ddb *dev) +{ + ddb_irq_disable(dev); if (dev->msi == 2) free_irq(dev->pdev->irq + 1, dev); free_irq(dev->pdev->irq, dev); @@ -306,7 +311,7 @@ static int __devinit ddb_probe(struct pci_dev *pdev, if (ddb_init(dev) == 0) return 0; - ddb_irq_exit(dev); + ddb_irq_disable(dev); fail0: pr_err("fail0\n"); if (dev->msi)