Commit 308fd19d authored by Jeff Garzik's avatar Jeff Garzik

Merge pobox.com:/garz/repo/netdev-2.6/dscc4

into pobox.com:/garz/repo/net-drivers-2.6
parents bcbdd32c 3adae6e3
......@@ -691,7 +691,7 @@ static void dscc4_free1(struct pci_dev *pdev)
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,33 +706,36 @@ static int __devinit dscc4_init_one(struct pci_dev *pdev,
{
struct dscc4_pci_priv *priv;
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 +745,16 @@ static int __devinit dscc4_init_one(struct pci_dev *pdev,
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);
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 +774,11 @@ static int __devinit dscc4_init_one(struct pci_dev *pdev,
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 +788,7 @@ static int __devinit dscc4_init_one(struct pci_dev *pdev,
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 +796,7 @@ static int __devinit dscc4_init_one(struct pci_dev *pdev,
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);
}
......@@ -804,17 +811,18 @@ static int __devinit dscc4_init_one(struct pci_dev *pdev,
writel(0xff200001, ioaddr + GCMDR);
cards_found++;
return 0;
rc = 0;
out:
return rc;
err_out_free_iqrx:
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 +830,19 @@ static int __devinit dscc4_init_one(struct pci_dev *pdev,
}
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;
};
/*
......@@ -882,8 +889,7 @@ static int dscc4_found1(struct pci_dev *pdev, void __iomem *ioaddr)
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;
......@@ -892,22 +898,17 @@ static int dscc4_found1(struct pci_dev *pdev, void __iomem *ioaddr)
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);
ppriv = 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));
ret = dscc4_set_quartz(root, quartz);
if (ret < 0)
goto err_free_priv;
ppriv->root = root;
spin_lock_init(&ppriv->lock);
......@@ -951,20 +952,24 @@ static int dscc4_found1(struct pci_dev *pdev, void __iomem *ioaddr)
goto err_unregister;
}
}
ret = dscc4_set_quartz(root, quartz);
if (ret < 0)
goto err_unregister;
pci_set_drvdata(pdev, ppriv);
return ret;
err_unregister:
while (--i >= 0) {
while (i-- > 0) {
dscc4_release_ring(root + i);
unregister_hdlc_device(dscc4_to_dev(&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++)
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;
......@@ -1998,10 +2003,10 @@ static void __devexit dscc4_remove_one(struct pci_dev *pdev)
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,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment