* [patch 2.6.10-rc1 0/5] dscc4: short summary for the serie of patches @ 2005-01-14 0:07 Francois Romieu 2005-01-14 0:09 ` [patch 2.6.10-rc1 1/5] dscc4: use of uncompletely initialized struct Francois Romieu 0 siblings, 1 reply; 7+ messages in thread From: Francois Romieu @ 2005-01-14 0:07 UTC (permalink / raw) To: jgarzik; +Cc: netdev The dscc4 driver has inherited a missing initialization bug since the internals of the struct hdlc_dev was reworked (!). Now it kills the driver at startup. The first patch of the incoming serie fixes it. I would appreciate if it could be included in mainline for the next release. The remaining patches are not critical. Patches are archived as: o patch-script http://www.fr.zoreil.com/linux/kernel/2.6.x/2.6.11-rc1/dscc4 o tar-ball http://www.fr.zoreil.com/linux/kernel/2.6.x/2.6.11-rc1/dscc4-blob.tar.bz2 -- Ueimor ^ permalink raw reply [flat|nested] 7+ messages in thread
* [patch 2.6.10-rc1 1/5] dscc4: use of uncompletely initialized struct 2005-01-14 0:07 [patch 2.6.10-rc1 0/5] dscc4: short summary for the serie of patches Francois Romieu @ 2005-01-14 0:09 ` Francois Romieu 2005-01-14 0:10 ` [patch 2.6.10-rc1 2/5] dscc4: code factorisation Francois Romieu 2005-01-27 20:59 ` [patch 2.6.10-rc1 1/5] dscc4: use of uncompletely initialized struct Jeff Garzik 0 siblings, 2 replies; 7+ messages in thread From: Francois Romieu @ 2005-01-14 0:09 UTC (permalink / raw) To: jgarzik; +Cc: netdev dscc4_set_quartz() is issued with an argument in an unitialized state and the kernel does not like it. Signed-off-by: Francois Romieu <romieu@fr.zoreil.com> diff -puN drivers/net/wan/dscc4.c~dscc4-000 drivers/net/wan/dscc4.c --- linux-2.6.11-rc1/drivers/net/wan/dscc4.c~dscc4-000 2005-01-13 23:57:53.017533390 +0100 +++ linux-2.6.11-rc1-fr/drivers/net/wan/dscc4.c 2005-01-14 00:06:01.600966142 +0100 @@ -905,9 +905,7 @@ static int dscc4_found1(struct pci_dev * goto err_free_dev2; } memset(ppriv, 0, sizeof(struct dscc4_pci_priv)); - ret = dscc4_set_quartz(root, quartz); - if (ret < 0) - goto err_free_priv; + ppriv->root = root; spin_lock_init(&ppriv->lock); @@ -951,6 +949,11 @@ static int dscc4_found1(struct pci_dev * goto err_unregister; } } + + ret = dscc4_set_quartz(root, quartz); + if (ret < 0) + goto err_unregister; + pci_set_drvdata(pdev, ppriv); return ret; @@ -959,7 +962,6 @@ err_unregister: dscc4_release_ring(root + i); unregister_hdlc_device(dscc4_to_dev(&root[i])); } -err_free_priv: kfree(ppriv); err_free_dev2: for (i = 0; i < dev_per_card; i++) _ ^ permalink raw reply [flat|nested] 7+ messages in thread
* [patch 2.6.10-rc1 2/5] dscc4: code factorisation 2005-01-14 0:09 ` [patch 2.6.10-rc1 1/5] dscc4: use of uncompletely initialized struct Francois Romieu @ 2005-01-14 0:10 ` Francois Romieu 2005-01-14 0:12 ` [patch 2.6.10-rc1 3/5] dscc4: error status checking and pci janitoring Francois Romieu 2005-01-27 20:59 ` [patch 2.6.10-rc1 1/5] dscc4: use of uncompletely initialized struct Jeff Garzik 1 sibling, 1 reply; 7+ messages in thread From: Francois Romieu @ 2005-01-14 0:10 UTC (permalink / raw) To: jgarzik; +Cc: netdev Small code factorization. Signed-off-by: Francois Romieu <romieu@fr.zoreil.com> diff -puN drivers/net/wan/dscc4.c~dscc4-010 drivers/net/wan/dscc4.c --- linux-2.6.11-rc1/drivers/net/wan/dscc4.c~dscc4-010 2005-01-14 00:54:44.287823008 +0100 +++ linux-2.6.11-rc1-fr/drivers/net/wan/dscc4.c 2005-01-14 00:54:44.291822356 +0100 @@ -892,17 +892,14 @@ static int dscc4_found1(struct pci_dev * for (i = 0; i < dev_per_card; i++) { root[i].dev = alloc_hdlcdev(root + i); - if (!root[i].dev) { - while (i--) - free_netdev(root[i].dev); + if (!root[i].dev) goto err_free_dev; - } } ppriv = (struct dscc4_pci_priv *) kmalloc(sizeof(*ppriv), GFP_KERNEL); if (!ppriv) { printk(KERN_ERR "%s: can't allocate private data\n", DRV_NAME); - goto err_free_dev2; + goto err_free_dev; } memset(ppriv, 0, sizeof(struct dscc4_pci_priv)); @@ -958,15 +955,15 @@ static int dscc4_found1(struct pci_dev * return ret; err_unregister: - while (--i >= 0) { + while (i-- > 0) { dscc4_release_ring(root + i); unregister_hdlc_device(dscc4_to_dev(&root[i])); } kfree(ppriv); -err_free_dev2: - for (i = 0; i < dev_per_card; i++) - free_netdev(root[i].dev); + i = dev_per_card; err_free_dev: + while (i-- > 0) + free_netdev(root[i].dev); kfree(root); err_out: return ret; _ ^ permalink raw reply [flat|nested] 7+ messages in thread
* [patch 2.6.10-rc1 3/5] dscc4: error status checking and pci janitoring 2005-01-14 0:10 ` [patch 2.6.10-rc1 2/5] dscc4: code factorisation Francois Romieu @ 2005-01-14 0:12 ` Francois Romieu 2005-01-14 0:13 ` [patch 2.6.10-rc1 4/5] dscc4: removal of unneeded casts Francois Romieu 0 siblings, 1 reply; 7+ messages in thread From: Francois Romieu @ 2005-01-14 0:12 UTC (permalink / raw) To: jgarzik; +Cc: netdev Error status checking and PCI janitoring - propagation of the error code; - pci_request_region use in dscc4_init_one; - missing pci_disable_device() added to the error path; Signed-off-by: Francois Romieu <romieu@fr.zoreil.com> diff -puN drivers/net/wan/dscc4.c~dscc4-020 drivers/net/wan/dscc4.c --- linux-2.6.11-rc1/drivers/net/wan/dscc4.c~dscc4-020 2005-01-14 00:54:49.243016015 +0100 +++ linux-2.6.11-rc1-fr/drivers/net/wan/dscc4.c 2005-01-14 00:54:49.248015200 +0100 @@ -708,31 +708,35 @@ static int __devinit dscc4_init_one(stru struct dscc4_dev_priv *dpriv; static int cards_found = 0; void __iomem *ioaddr; - int i; + int i, rc; printk(KERN_DEBUG "%s", version); - if (pci_enable_device(pdev)) - goto err_out; - if (!request_mem_region(pci_resource_start(pdev, 0), - pci_resource_len(pdev, 0), "registers")) { + rc = pci_enable_device(pdev); + if (rc < 0) + goto out; + + rc = pci_request_region(pdev, 0, "registers"); + if (rc < 0) { printk(KERN_ERR "%s: can't reserve MMIO region (regs)\n", DRV_NAME); - goto err_out; + goto err_disable_0; } - if (!request_mem_region(pci_resource_start(pdev, 1), - pci_resource_len(pdev, 1), "LBI interface")) { + rc = pci_request_region(pdev, 1, "LBI interface"); + if (rc < 0) { printk(KERN_ERR "%s: can't reserve MMIO region (lbi)\n", DRV_NAME); - goto err_out_free_mmio_region0; + goto err_free_mmio_region_1; } + ioaddr = ioremap(pci_resource_start(pdev, 0), pci_resource_len(pdev, 0)); if (!ioaddr) { printk(KERN_ERR "%s: cannot remap MMIO region %lx @ %lx\n", DRV_NAME, pci_resource_len(pdev, 0), pci_resource_start(pdev, 0)); - goto err_out_free_mmio_region; + rc = -EIO; + goto err_free_mmio_regions_2; } printk(KERN_DEBUG "Siemens DSCC4, MMIO at %#lx (regs), %#lx (lbi), IRQ %d\n", pci_resource_start(pdev, 0), @@ -742,14 +746,16 @@ static int __devinit dscc4_init_one(stru pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 0xf8); pci_set_master(pdev); - if (dscc4_found1(pdev, ioaddr)) - goto err_out_iounmap; + rc = dscc4_found1(pdev, ioaddr); + if (rc < 0) + goto err_iounmap_3; priv = (struct dscc4_pci_priv *)pci_get_drvdata(pdev); - if (request_irq(pdev->irq, &dscc4_irq, SA_SHIRQ, DRV_NAME, priv->root)){ + rc = request_irq(pdev->irq, dscc4_irq, SA_SHIRQ, DRV_NAME, priv->root); + if (rc < 0) { printk(KERN_WARNING "%s: IRQ %d busy\n", DRV_NAME, pdev->irq); - goto err_out_free1; + goto err_release_4; } /* power up/little endian/dma core controlled via lrda/ltda */ @@ -769,9 +775,11 @@ static int __devinit dscc4_init_one(stru priv->iqcfg = (u32 *) pci_alloc_consistent(pdev, IRQ_RING_SIZE*sizeof(u32), &priv->iqcfg_dma); if (!priv->iqcfg) - goto err_out_free_irq; + goto err_free_irq_5; writel(priv->iqcfg_dma, ioaddr + IQCFG); + rc = -ENOMEM; + /* * SCC 0-3 private rx/tx irq structures * IQRX/TXi needs to be set soon. Learned it the hard way... @@ -781,7 +789,7 @@ static int __devinit dscc4_init_one(stru dpriv->iqtx = (u32 *) pci_alloc_consistent(pdev, IRQ_RING_SIZE*sizeof(u32), &dpriv->iqtx_dma); if (!dpriv->iqtx) - goto err_out_free_iqtx; + goto err_free_iqtx_6; writel(dpriv->iqtx_dma, ioaddr + IQTX0 + i*4); } for (i = 0; i < dev_per_card; i++) { @@ -789,7 +797,7 @@ static int __devinit dscc4_init_one(stru dpriv->iqrx = (u32 *) pci_alloc_consistent(pdev, IRQ_RING_SIZE*sizeof(u32), &dpriv->iqrx_dma); if (!dpriv->iqrx) - goto err_out_free_iqrx; + goto err_free_iqrx_7; writel(dpriv->iqrx_dma, ioaddr + IQRX0 + i*4); } @@ -805,16 +813,19 @@ static int __devinit dscc4_init_one(stru writel(0xff200001, ioaddr + GCMDR); cards_found++; - return 0; -err_out_free_iqrx: + rc = 0; +out: + return rc; + +err_free_iqrx_7: while (--i >= 0) { dpriv = priv->root + i; pci_free_consistent(pdev, IRQ_RING_SIZE*sizeof(u32), dpriv->iqrx, dpriv->iqrx_dma); } i = dev_per_card; -err_out_free_iqtx: +err_free_iqtx_6: while (--i >= 0) { dpriv = priv->root + i; pci_free_consistent(pdev, IRQ_RING_SIZE*sizeof(u32), @@ -822,20 +833,19 @@ err_out_free_iqtx: } pci_free_consistent(pdev, IRQ_RING_SIZE*sizeof(u32), priv->iqcfg, priv->iqcfg_dma); -err_out_free_irq: +err_free_irq_5: free_irq(pdev->irq, priv->root); -err_out_free1: +err_release_4: dscc4_free1(pdev); -err_out_iounmap: +err_iounmap_3: iounmap (ioaddr); -err_out_free_mmio_region: - release_mem_region(pci_resource_start(pdev, 1), - pci_resource_len(pdev, 1)); -err_out_free_mmio_region0: - release_mem_region(pci_resource_start(pdev, 0), - pci_resource_len(pdev, 0)); -err_out: - return -ENODEV; +err_free_mmio_regions_2: + pci_release_region(pdev, 1); +err_free_mmio_region_1: + pci_release_region(pdev, 0); +err_disable_0: + pci_disable_device(pdev); + goto out; }; /* @@ -1997,10 +2007,10 @@ static void __devexit dscc4_remove_one(s iounmap(ioaddr); - release_mem_region(pci_resource_start(pdev, 1), - pci_resource_len(pdev, 1)); - release_mem_region(pci_resource_start(pdev, 0), - pci_resource_len(pdev, 0)); + pci_release_region(pdev, 1); + pci_release_region(pdev, 0); + + pci_disable_device(pdev); } static int dscc4_hdlc_attach(struct net_device *dev, unsigned short encoding, _ ^ permalink raw reply [flat|nested] 7+ messages in thread
* [patch 2.6.10-rc1 4/5] dscc4: removal of unneeded casts 2005-01-14 0:12 ` [patch 2.6.10-rc1 3/5] dscc4: error status checking and pci janitoring Francois Romieu @ 2005-01-14 0:13 ` Francois Romieu 2005-01-14 0:15 ` [patch 2.6.10-rc1 5/5] dscc4: removal of unneeded variable Francois Romieu 0 siblings, 1 reply; 7+ messages in thread From: Francois Romieu @ 2005-01-14 0:13 UTC (permalink / raw) To: jgarzik; +Cc: netdev Removal of unneeded casts. Signed-off-by: Francois Romieu <romieu@fr.zoreil.com> diff -puN drivers/net/wan/dscc4.c~dscc4-030 drivers/net/wan/dscc4.c --- linux-2.6.11-rc1/drivers/net/wan/dscc4.c~dscc4-030 2005-01-14 00:54:54.446168638 +0100 +++ linux-2.6.11-rc1-fr/drivers/net/wan/dscc4.c 2005-01-14 00:54:54.449168149 +0100 @@ -750,7 +750,7 @@ static int __devinit dscc4_init_one(stru if (rc < 0) goto err_iounmap_3; - priv = (struct dscc4_pci_priv *)pci_get_drvdata(pdev); + priv = pci_get_drvdata(pdev); rc = request_irq(pdev->irq, dscc4_irq, SA_SHIRQ, DRV_NAME, priv->root); if (rc < 0) { @@ -892,8 +892,7 @@ static int dscc4_found1(struct pci_dev * struct dscc4_dev_priv *root; int i, ret = -ENOMEM; - root = (struct dscc4_dev_priv *) - kmalloc(dev_per_card*sizeof(*root), GFP_KERNEL); + root = kmalloc(dev_per_card*sizeof(*root), GFP_KERNEL); if (!root) { printk(KERN_ERR "%s: can't allocate data\n", DRV_NAME); goto err_out; @@ -906,7 +905,7 @@ static int dscc4_found1(struct pci_dev * goto err_free_dev; } - ppriv = (struct dscc4_pci_priv *) kmalloc(sizeof(*ppriv), GFP_KERNEL); + ppriv = kmalloc(sizeof(*ppriv), GFP_KERNEL); if (!ppriv) { printk(KERN_ERR "%s: can't allocate private data\n", DRV_NAME); goto err_free_dev; _ ^ permalink raw reply [flat|nested] 7+ messages in thread
* [patch 2.6.10-rc1 5/5] dscc4: removal of unneeded variable 2005-01-14 0:13 ` [patch 2.6.10-rc1 4/5] dscc4: removal of unneeded casts Francois Romieu @ 2005-01-14 0:15 ` Francois Romieu 0 siblings, 0 replies; 7+ messages in thread From: Francois Romieu @ 2005-01-14 0:15 UTC (permalink / raw) To: jgarzik; +Cc: netdev Removal of unneeded variable and more spaces for my eyes. Signed-off-by: Francois Romieu <romieu@fr.zoreil.com> diff -puN drivers/net/wan/dscc4.c~dscc4-040 drivers/net/wan/dscc4.c --- linux-2.6.11-rc1/drivers/net/wan/dscc4.c~dscc4-040 2005-01-14 00:54:59.425357736 +0100 +++ linux-2.6.11-rc1-fr/drivers/net/wan/dscc4.c 2005-01-14 00:55:22.581586543 +0100 @@ -691,7 +691,7 @@ static void dscc4_free1(struct pci_dev * root = ppriv->root; for (i = 0; i < dev_per_card; i++) - unregister_hdlc_device(dscc4_to_dev(&root[i])); + unregister_hdlc_device(dscc4_to_dev(root + i)); pci_set_drvdata(pdev, NULL); @@ -706,7 +706,6 @@ static int __devinit dscc4_init_one(stru { struct dscc4_pci_priv *priv; struct dscc4_dev_priv *dpriv; - static int cards_found = 0; void __iomem *ioaddr; int i, rc; @@ -812,8 +811,6 @@ static int __devinit dscc4_init_one(stru writel(0xff200001, ioaddr + GCMDR); - cards_found++; - rc = 0; out: return rc; @@ -966,7 +963,7 @@ static int dscc4_found1(struct pci_dev * err_unregister: while (i-- > 0) { dscc4_release_ring(root + i); - unregister_hdlc_device(dscc4_to_dev(&root[i])); + unregister_hdlc_device(dscc4_to_dev(root + i)); } kfree(ppriv); i = dev_per_card; _ ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [patch 2.6.10-rc1 1/5] dscc4: use of uncompletely initialized struct 2005-01-14 0:09 ` [patch 2.6.10-rc1 1/5] dscc4: use of uncompletely initialized struct Francois Romieu 2005-01-14 0:10 ` [patch 2.6.10-rc1 2/5] dscc4: code factorisation Francois Romieu @ 2005-01-27 20:59 ` Jeff Garzik 1 sibling, 0 replies; 7+ messages in thread From: Jeff Garzik @ 2005-01-27 20:59 UTC (permalink / raw) To: Francois Romieu; +Cc: netdev applied all 5 ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2005-01-27 20:59 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2005-01-14 0:07 [patch 2.6.10-rc1 0/5] dscc4: short summary for the serie of patches Francois Romieu 2005-01-14 0:09 ` [patch 2.6.10-rc1 1/5] dscc4: use of uncompletely initialized struct Francois Romieu 2005-01-14 0:10 ` [patch 2.6.10-rc1 2/5] dscc4: code factorisation Francois Romieu 2005-01-14 0:12 ` [patch 2.6.10-rc1 3/5] dscc4: error status checking and pci janitoring Francois Romieu 2005-01-14 0:13 ` [patch 2.6.10-rc1 4/5] dscc4: removal of unneeded casts Francois Romieu 2005-01-14 0:15 ` [patch 2.6.10-rc1 5/5] dscc4: removal of unneeded variable Francois Romieu 2005-01-27 20:59 ` [patch 2.6.10-rc1 1/5] dscc4: use of uncompletely initialized struct Jeff Garzik
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.