* [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.