fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / drivers / atm / eni.c
index 81127d1..5aab7bd 100644 (file)
@@ -4,7 +4,6 @@
  
 
 #include <linux/module.h>
-#include <linux/config.h>
 #include <linux/kernel.h>
 #include <linux/mm.h>
 #include <linux/pci.h>
@@ -59,7 +58,6 @@
  * - doesn't support OAM cells
  * - eni_put_free may hang if not putting memory fragments that _complete_
  *   2^n block (never happens in real life, though)
- * - keeps IRQ even if initialization fails
  */
 
 
@@ -245,7 +243,7 @@ static void __iomem *eni_alloc_mem(struct eni_dev *eni_dev, unsigned long *size)
        list = eni_dev->free_list;
        len = eni_dev->free_len;
        if (*size < MID_MIN_BUF_SIZE) *size = MID_MIN_BUF_SIZE;
-       if (*size > MID_MAX_BUF_SIZE) return 0;
+       if (*size > MID_MAX_BUF_SIZE) return NULL;
        for (order = 0; (1 << order) < *size; order++);
        DPRINTK("trying: %ld->%d\n",*size,order);
        best_order = 65; /* we don't have more than 2^64 of anything ... */
@@ -260,7 +258,7 @@ static void __iomem *eni_alloc_mem(struct eni_dev *eni_dev, unsigned long *size)
                                best_order = list[i].order;
                                index = i;
                        }
-       if (best_order == 65) return 0;
+       if (best_order == 65) return NULL;
        start = list[index].start-eni_dev->base_diff;
        list[index] = list[--len];
        eni_dev->free_len = len;
@@ -538,7 +536,7 @@ static int rx_aal0(struct atm_vcc *vcc)
                return 0;
        }
        skb_put(skb,length);
-       skb->stamp = eni_vcc->timestamp;
+       skb_set_timestamp(skb, &eni_vcc->timestamp);
        DPRINTK("got len %ld\n",length);
        if (do_rx_dma(vcc,skb,1,length >> 2,length >> 2)) return 1;
        eni_vcc->rxing++;
@@ -1315,7 +1313,7 @@ static int reserve_or_set_tx(struct atm_vcc *vcc,struct atm_trafprm *txtp,
                size = UBR_BUFFER;
        }
        new_tx = !eni_vcc->tx;
-       mem = 0; /* for gcc */
+       mem = NULL; /* for gcc */
        if (!new_tx) tx = eni_vcc->tx;
        else {
                mem = eni_alloc_mem(eni_dev,&size);
@@ -1349,7 +1347,7 @@ static int reserve_or_set_tx(struct atm_vcc *vcc,struct atm_trafprm *txtp,
                error = -EINVAL;
        if (error) {
                if (new_tx) {
-                       tx->send = 0;
+                       tx->send = NULL;
                        eni_free_mem(eni_dev,mem,size);
                }
                return error;
@@ -1423,7 +1421,7 @@ static void close_tx(struct atm_vcc *vcc)
                    eni_in(MID_TX_DESCRSTART(eni_vcc->tx->index)))
                        schedule();
                eni_free_mem(eni_dev,eni_vcc->tx->send,eni_vcc->tx->words << 2);
-               eni_vcc->tx->send = 0;
+               eni_vcc->tx->send = NULL;
                eni_dev->tx_bw += eni_vcc->tx->reserved;
        }
        eni_vcc->tx = NULL;
@@ -1444,7 +1442,7 @@ static int start_tx(struct atm_dev *dev)
        skb_queue_head_init(&eni_dev->tx_queue);
        eni_out(0,MID_DMA_WR_TX);
        for (i = 0; i < NR_CHAN; i++) {
-               eni_dev->tx[i].send = 0;
+               eni_dev->tx[i].send = NULL;
                eni_dev->tx[i].index = i;
        }
        return 0;
@@ -1490,7 +1488,7 @@ static void bug_int(struct atm_dev *dev,unsigned long reason)
 }
 
 
-static irqreturn_t eni_int(int irq,void *dev_id,struct pt_regs *regs)
+static irqreturn_t eni_int(int irq,void *dev_id)
 {
        struct atm_dev *dev;
        struct eni_dev *eni_dev;
@@ -1702,7 +1700,7 @@ static int __devinit get_esi_fpga(struct atm_dev *dev, void __iomem *base)
 
 static int __devinit eni_do_init(struct atm_dev *dev)
 {
-       struct midway_eprom *eprom;
+       struct midway_eprom __iomem *eprom;
        struct eni_dev *eni_dev;
        struct pci_dev *pci_dev;
        unsigned long real_base;
@@ -1742,8 +1740,7 @@ static int __devinit eni_do_init(struct atm_dev *dev)
        eni_dev->base_diff = real_base - (unsigned long) base;
        /* id may not be present in ASIC Tonga boards - check this @@@ */
        if (!eni_dev->asic) {
-               eprom = (struct midway_eprom *) (base+EPROM_SIZE-sizeof(struct
-                   midway_eprom));
+               eprom = (base+EPROM_SIZE-sizeof(struct midway_eprom));
                if (readl(&eprom->magic) != ENI155_MAGIC) {
                        printk("\n");
                        printk(KERN_ERR KERN_ERR DEV_LABEL "(itf %d): bad "
@@ -1800,25 +1797,25 @@ static int __devinit eni_start(struct atm_dev *dev)
 
        DPRINTK(">eni_start\n");
        eni_dev = ENI_DEV(dev);
-       if (request_irq(eni_dev->irq,&eni_int,SA_SHIRQ,DEV_LABEL,dev)) {
+       if (request_irq(eni_dev->irq,&eni_int,IRQF_SHARED,DEV_LABEL,dev)) {
                printk(KERN_ERR DEV_LABEL "(itf %d): IRQ%d is already in use\n",
                    dev->number,eni_dev->irq);
-               return -EAGAIN;
+               error = -EAGAIN;
+               goto out;
        }
-       /* @@@ should release IRQ on error */
        pci_set_master(eni_dev->pci_dev);
        if ((error = pci_write_config_word(eni_dev->pci_dev,PCI_COMMAND,
            PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER |
            (eni_dev->asic ? PCI_COMMAND_PARITY | PCI_COMMAND_SERR : 0)))) {
                printk(KERN_ERR DEV_LABEL "(itf %d): can't enable memory+"
                    "master (0x%02x)\n",dev->number,error);
-               return error;
+               goto free_irq;
        }
        if ((error = pci_write_config_byte(eni_dev->pci_dev,PCI_TONGA_CTRL,
            END_SWAP_DMA))) {
                printk(KERN_ERR DEV_LABEL "(itf %d): can't set endian swap "
                    "(0x%02x)\n",dev->number,error);
-               return error;
+               goto free_irq;
        }
        /* determine addresses of internal tables */
        eni_dev->vci = eni_dev->ram;
@@ -1835,12 +1832,13 @@ static int __devinit eni_start(struct atm_dev *dev)
        /* initialize memory management */
        buffer_mem = eni_dev->mem - (buf - eni_dev->ram);
        eni_dev->free_list_size = buffer_mem/MID_MIN_BUF_SIZE/2;
-       eni_dev->free_list = (struct eni_free *) kmalloc(
+       eni_dev->free_list = kmalloc(
            sizeof(struct eni_free)*(eni_dev->free_list_size+1),GFP_KERNEL);
        if (!eni_dev->free_list) {
                printk(KERN_ERR DEV_LABEL "(itf %d): couldn't get free page\n",
                    dev->number);
-               return -ENOMEM;
+               error = -ENOMEM;
+               goto free_irq;
        }
        eni_dev->free_len = 0;
        eni_put_free(eni_dev,buf,buffer_mem);
@@ -1856,17 +1854,26 @@ static int __devinit eni_start(struct atm_dev *dev)
         */
        eni_out(0xffffffff,MID_IE);
        error = start_tx(dev);
-       if (error) return error;
+       if (error) goto free_list;
        error = start_rx(dev);
-       if (error) return error;
+       if (error) goto free_list;
        error = dev->phy->start(dev);
-       if (error) return error;
+       if (error) goto free_list;
        eni_out(eni_in(MID_MC_S) | (1 << MID_INT_SEL_SHIFT) |
            MID_TX_LOCK_MODE | MID_DMA_ENABLE | MID_TX_ENABLE | MID_RX_ENABLE,
            MID_MC_S);
            /* Tonga uses SBus INTReq1 */
        (void) eni_in(MID_ISA); /* clear Midway interrupts */
        return 0;
+
+free_list:
+       kfree(eni_dev->free_list);
+
+free_irq:
+       free_irq(eni_dev->irq, eni_dev);
+
+out:
+       return error;
 }
 
 
@@ -2225,7 +2232,7 @@ static int __devinit eni_init_one(struct pci_dev *pci_dev,
                goto out0;
        }
 
-       eni_dev = (struct eni_dev *) kmalloc(sizeof(struct eni_dev),GFP_KERNEL);
+       eni_dev = kmalloc(sizeof(struct eni_dev),GFP_KERNEL);
        if (!eni_dev) goto out0;
        if (!cpu_zeroes) {
                cpu_zeroes = pci_alloc_consistent(pci_dev,ENI_ZEROES_SIZE,
@@ -2290,9 +2297,7 @@ static int __init eni_init(void)
                    sizeof(skb->cb),sizeof(struct eni_skb_prv));
                return -EIO;
        }
-       if (pci_register_driver(&eni_driver) > 0) return 0;
-       pci_unregister_driver (&eni_driver);
-       return -ENODEV;
+       return pci_register_driver(&eni_driver);
 }