* [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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).