fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / drivers / atm / lanai.c
index 53f6d29..09f477d 100644 (file)
@@ -39,7 +39,7 @@
  * o  lanai_change_qos() isn't written yet
  *
  * o  There aren't any ioctl's yet -- I'd like to eventually support
- *    setting loopback and LED modes that way.  (see lanai_ioctl)
+ *    setting loopback and LED modes that way.
  *
  * o  If the segmentation engine or DMA gets shut down we should restart
  *    card as per section 17.0i.  (see lanai_reset)
 #include <asm/byteorder.h>
 #include <linux/spinlock.h>
 #include <linux/pci.h>
+#include <linux/dma-mapping.h>
 #include <linux/init.h>
 #include <linux/delay.h>
 #include <linux/interrupt.h>
+#include <linux/dma-mapping.h>
 
 /* -------------------- TUNABLE PARAMATERS: */
 
 #define LANAI_EEPROM_SIZE      (128)
 
 typedef int vci_t;
-typedef unsigned long bus_addr_t;
+typedef void __iomem *bus_addr_t;
 
 /* DMA buffer in host memory for TX, RX, or service list. */
 struct lanai_buffer {
@@ -303,7 +305,7 @@ struct lanai_dev {
  * vci with their bit set
  */
 static void vci_bitfield_iterate(struct lanai_dev *lanai,
-       /*const*/ unsigned long *lp,
+       const unsigned long *lp,
        void (*func)(struct lanai_dev *,vci_t vci))
 {
        vci_t vci = find_first_bit(lp, NUM_VCI);
@@ -471,7 +473,7 @@ enum lanai_register {
 static inline bus_addr_t reg_addr(const struct lanai_dev *lanai,
        enum lanai_register reg)
 {
-       return lanai->base + (bus_addr_t) reg;
+       return lanai->base + reg;
 }
 
 static inline u32 reg_read(const struct lanai_dev *lanai,
@@ -566,7 +568,7 @@ static int __init sram_test_word(
        return -EIO;
 }
 
-static int __init sram_test_pass(const struct lanai_dev *lanai, u32 pattern)
+static int __devinit sram_test_pass(const struct lanai_dev *lanai, u32 pattern)
 {
        int offset, result = 0;
        for (offset = 0; offset < SRAM_BYTES && result == 0; offset += 4)
@@ -574,7 +576,7 @@ static int __init sram_test_pass(const struct lanai_dev *lanai, u32 pattern)
        return result;
 }
 
-static int __init sram_test_and_clear(const struct lanai_dev *lanai)
+static int __devinit sram_test_and_clear(const struct lanai_dev *lanai)
 {
 #ifdef FULL_MEMORY_TEST
        int result;
@@ -650,8 +652,8 @@ static inline u32 cardvcc_read(const struct lanai_vcc *lvcc,
        enum lanai_vcc_offset offset)
 {
        u32 val;
-       APRINTK(lvcc->vbase != 0, "cardvcc_read: unbound vcc!\n");
-       val= readl(lvcc->vbase + (bus_addr_t) offset);
+       APRINTK(lvcc->vbase != NULL, "cardvcc_read: unbound vcc!\n");
+       val= readl(lvcc->vbase + offset);
        RWDEBUG("VR vci=%04d 0x%02X = 0x%08X\n",
            lvcc->vci, (int) offset, val);
        return val;
@@ -660,13 +662,13 @@ static inline u32 cardvcc_read(const struct lanai_vcc *lvcc,
 static inline void cardvcc_write(const struct lanai_vcc *lvcc,
        u32 val, enum lanai_vcc_offset offset)
 {
-       APRINTK(lvcc->vbase != 0, "cardvcc_write: unbound vcc!\n");
+       APRINTK(lvcc->vbase != NULL, "cardvcc_write: unbound vcc!\n");
        APRINTK((val & ~0xFFFF) == 0,
            "cardvcc_write: bad val 0x%X (vci=%d, addr=0x%02X)\n",
            (unsigned int) val, lvcc->vci, (unsigned int) offset);
        RWDEBUG("VW vci=%04d 0x%02X > 0x%08X\n",
            lvcc->vci, (unsigned int) offset, (unsigned int) val);
-       writel(val, lvcc->vbase + (bus_addr_t) offset);
+       writel(val, lvcc->vbase + offset);
 }
 
 /* -------------------- COMPUTE SIZE OF AN AAL5 PDU: */
@@ -748,7 +750,7 @@ static void host_vcc_start_tx(const struct lanai_vcc *lvcc)
 /* Shutdown receiving on card */
 static void lanai_shutdown_rx_vci(const struct lanai_vcc *lvcc)
 {
-       if (lvcc->vbase == 0)           /* We were never bound to a VCI */
+       if (lvcc->vbase == NULL)        /* We were never bound to a VCI */
                return;
        /* 15.1.1 - set to trashing, wait one cell time (15us) */
        cardvcc_write(lvcc,
@@ -779,7 +781,7 @@ static void lanai_shutdown_tx_vci(struct lanai_dev *lanai,
        int read, write, lastread = -1;
        APRINTK(!in_interrupt(),
            "lanai_shutdown_tx_vci called w/o process context!\n");
-       if (lvcc->vbase == 0)           /* We were never bound to a VCI */
+       if (lvcc->vbase == NULL)        /* We were never bound to a VCI */
                return;
        /* 15.2.1 - wait for queue to drain */
        while ((skb = skb_dequeue(&lvcc->tx.backlog)) != NULL)
@@ -813,7 +815,7 @@ static void lanai_shutdown_tx_vci(struct lanai_dev *lanai,
                        DPRINTK("read, write = %d, %d\n", read, write);
                        break;
                }
-               schedule_timeout(HZ / 25);
+               msleep(40);
        }
        /* 15.2.2 - clear out all tx registers */
        cardvcc_write(lvcc, 0, vcc_txreadptr);
@@ -860,7 +862,7 @@ static inline void aal0_buffer_free(struct lanai_dev *lanai)
 #ifndef READ_EEPROM
 
 /* Stub functions to use if EEPROM reading is disabled */
-static int __init eeprom_read(struct lanai_dev *lanai)
+static int __devinit eeprom_read(struct lanai_dev *lanai)
 {
        printk(KERN_INFO DEV_LABEL "(itf %d): *NOT* reading EEPROM\n",
            lanai->number);
@@ -868,7 +870,7 @@ static int __init eeprom_read(struct lanai_dev *lanai)
        return 0;
 }
 
-static int __init eeprom_validate(struct lanai_dev *lanai)
+static int __devinit eeprom_validate(struct lanai_dev *lanai)
 {
        lanai->serialno = 0;
        lanai->magicno = EEPROM_MAGIC_VALUE;
@@ -877,7 +879,7 @@ static int __init eeprom_validate(struct lanai_dev *lanai)
 
 #else /* READ_EEPROM */
 
-static int __init eeprom_read(struct lanai_dev *lanai)
+static int __devinit eeprom_read(struct lanai_dev *lanai)
 {
        int i, address;
        u8 data;
@@ -949,11 +951,11 @@ static int __init eeprom_read(struct lanai_dev *lanai)
 /* read a big-endian 4-byte value out of eeprom */
 static inline u32 eeprom_be4(const struct lanai_dev *lanai, int address)
 {
-       return be32_to_cpup((u32 *) (&lanai->eeprom[address]));
+       return be32_to_cpup((const u32 *) &lanai->eeprom[address]);
 }
 
 /* Checksum/validate EEPROM contents */
-static int __init eeprom_validate(struct lanai_dev *lanai)
+static int __devinit eeprom_validate(struct lanai_dev *lanai)
 {
        int i, s;
        u32 v;
@@ -1158,7 +1160,7 @@ static inline int vcc_tx_space(const struct lanai_vcc *lvcc, int endptr)
 }
 
 /* test if VCC is currently backlogged */
-static inline int vcc_is_backlogged(/*const*/ struct lanai_vcc *lvcc)
+static inline int vcc_is_backlogged(const struct lanai_vcc *lvcc)
 {
        return !skb_queue_empty(&lvcc->tx.backlog);
 }
@@ -1393,7 +1395,8 @@ static void vcc_rx_aal5(struct lanai_vcc *lvcc, int endptr)
 {
        int size;
        struct sk_buff *skb;
-       /*const*/ u32 *x, *end = &lvcc->rx.buf.start[endptr * 4];
+       const u32 *x;
+       u32 *end = &lvcc->rx.buf.start[endptr * 4];
        int n = ((unsigned long) end) - ((unsigned long) lvcc->rx.buf.ptr);
        if (n < 0)
                n += lanai_buf_size(&lvcc->rx.buf);
@@ -1425,7 +1428,7 @@ static void vcc_rx_aal5(struct lanai_vcc *lvcc, int endptr)
        skb_put(skb, size);
        vcc_rx_memcpy(skb->data, lvcc, size);
        ATM_SKB(skb)->vcc = lvcc->rx.atmvcc;
-       do_gettimeofday(&skb->stamp);
+       __net_timestamp(skb);
        lvcc->rx.atmvcc->push(lvcc->rx.atmvcc, skb);
        atomic_inc(&lvcc->rx.atmvcc->stats->rx);
     out:
@@ -1449,7 +1452,7 @@ static void vcc_rx_aal0(struct lanai_dev *lanai)
 #include <linux/vmalloc.h>
 #endif
 
-static int __init vcc_table_allocate(struct lanai_dev *lanai)
+static int __devinit vcc_table_allocate(struct lanai_dev *lanai)
 {
 #ifdef VCCTABLE_GETFREEPAGE
        APRINTK((lanai->num_vci) * sizeof(struct lanai_vcc *) <= PAGE_SIZE,
@@ -1479,16 +1482,10 @@ static inline void vcc_table_deallocate(const struct lanai_dev *lanai)
 static inline struct lanai_vcc *new_lanai_vcc(void)
 {
        struct lanai_vcc *lvcc;
-       lvcc = (struct lanai_vcc *) kmalloc(sizeof(*lvcc), GFP_KERNEL);
+       lvcc =  kzalloc(sizeof(*lvcc), GFP_KERNEL);
        if (likely(lvcc != NULL)) {
-               lvcc->vbase = 0;
-               lvcc->rx.atmvcc = lvcc->tx.atmvcc = NULL;
-               lvcc->nref = 0;
-               memset(&lvcc->stats, 0, sizeof lvcc->stats);
-               lvcc->rx.buf.start = lvcc->tx.buf.start = NULL;
                skb_queue_head_init(&lvcc->tx.backlog);
 #ifdef DEBUG
-               lvcc->tx.unqueue = NULL;
                lvcc->vci = -1;
 #endif
        }
@@ -1544,7 +1541,7 @@ static int lanai_setup_tx_vci(struct lanai_dev *lanai, struct lanai_vcc *lvcc,
 static inline void host_vcc_bind(struct lanai_dev *lanai,
        struct lanai_vcc *lvcc, vci_t vci)
 {
-       if (lvcc->vbase != 0)
+       if (lvcc->vbase != NULL)
                return;    /* We already were bound in the other direction */
        DPRINTK("Binding vci %d\n", vci);
 #ifdef USE_POWERDOWN
@@ -1562,10 +1559,10 @@ static inline void host_vcc_bind(struct lanai_dev *lanai,
 static inline void host_vcc_unbind(struct lanai_dev *lanai,
        struct lanai_vcc *lvcc)
 {
-       if (lvcc->vbase == 0)
+       if (lvcc->vbase == NULL)
                return; /* This vcc was never bound */
        DPRINTK("Unbinding vci %d\n", lvcc->vci);
-       lvcc->vbase = 0;
+       lvcc->vbase = NULL;
        lanai->vccs[lvcc->vci] = NULL;
 #ifdef USE_POWERDOWN
        if (--lanai->nbound == 0) {
@@ -1596,7 +1593,7 @@ static void lanai_reset(struct lanai_dev *lanai)
 /*
  * Allocate service buffer and tell card about it
  */
-static int __init service_buffer_allocate(struct lanai_dev *lanai)
+static int __devinit service_buffer_allocate(struct lanai_dev *lanai)
 {
        lanai_buf_allocate(&lanai->service, SERVICE_ENTRIES * 4, 8,
            lanai->pci);
@@ -1893,13 +1890,11 @@ static inline void lanai_int_1(struct lanai_dev *lanai, u32 reason)
                reg_write(lanai, ack, IntAck_Reg);
 }
 
-static irqreturn_t lanai_int(int irq, void *devid, struct pt_regs *regs)
+static irqreturn_t lanai_int(int irq, void *devid)
 {
-       struct lanai_dev *lanai = (struct lanai_dev *) devid;
+       struct lanai_dev *lanai = devid;
        u32 reason;
 
-       (void) irq; (void) regs;        /* unused variables */
-
 #ifdef USE_POWERDOWN
        /*
         * If we're powered down we shouldn't be generating any interrupts -
@@ -1952,7 +1947,7 @@ static int check_board_id_and_rev(const char *name, u32 val, int *revp)
 
 /* -------------------- PCI INITIALIZATION/SHUTDOWN: */
 
-static int __init lanai_pci_start(struct lanai_dev *lanai)
+static int __devinit lanai_pci_start(struct lanai_dev *lanai)
 {
        struct pci_dev *pci = lanai->pci;
        int result;
@@ -1964,12 +1959,12 @@ static int __init lanai_pci_start(struct lanai_dev *lanai)
                return -ENXIO;
        }
        pci_set_master(pci);
-       if (pci_set_dma_mask(pci, 0xFFFFFFFF) != 0) {
+       if (pci_set_dma_mask(pci, DMA_32BIT_MASK) != 0) {
                printk(KERN_WARNING DEV_LABEL
                    "(itf %d): No suitable DMA available.\n", lanai->number);
                return -EBUSY;
        }
-       if (pci_set_consistent_dma_mask(pci, 0xFFFFFFFF) != 0) {
+       if (pci_set_consistent_dma_mask(pci, DMA_32BIT_MASK) != 0) {
                printk(KERN_WARNING DEV_LABEL
                    "(itf %d): No suitable DMA available.\n", lanai->number);
                return -EBUSY;
@@ -2109,7 +2104,7 @@ static int lanai_normalize_ci(struct lanai_dev *lanai,
  * shifted by that much as we compute
  *
  */
-static int pcr_to_cbricg(/*const*/ struct atm_qos *qos)
+static int pcr_to_cbricg(const struct atm_qos *qos)
 {
        int rounddown = 0;      /* 1 = Round PCR down, i.e. round ICG _up_ */
        int x, icg, pcr = atm_pcr_goal(&qos->txtp);
@@ -2148,7 +2143,7 @@ static inline void lanai_cbr_shutdown(struct lanai_dev *lanai)
 /* -------------------- OPERATIONS: */
 
 /* setup a newly detected device */
-static int __init lanai_dev_open(struct atm_dev *atmdev)
+static int __devinit lanai_dev_open(struct atm_dev *atmdev)
 {
        struct lanai_dev *lanai = (struct lanai_dev *) atmdev->dev_data;
        unsigned long raw_base;
@@ -2177,9 +2172,9 @@ static int __init lanai_dev_open(struct atm_dev *atmdev)
        /* 3.2: PCI initialization */
        if ((result = lanai_pci_start(lanai)) != 0)
                goto error;
-       raw_base = (bus_addr_t) lanai->pci->resource[0].start;
+       raw_base = lanai->pci->resource[0].start;
        lanai->base = (bus_addr_t) ioremap(raw_base, LANAI_MAPPING_SIZE);
-       if (lanai->base == 0) {
+       if (lanai->base == NULL) {
                printk(KERN_ERR DEV_LABEL ": couldn't remap I/O space\n");
                goto error_pci;
        }
@@ -2237,7 +2232,7 @@ static int __init lanai_dev_open(struct atm_dev *atmdev)
        conf2_write(lanai);
        reg_write(lanai, TX_FIFO_DEPTH, TxDepth_Reg);
        reg_write(lanai, 0, CBR_ICG_Reg);       /* CBR defaults to no limit */
-       if ((result = request_irq(lanai->pci->irq, lanai_int, SA_SHIRQ,
+       if ((result = request_irq(lanai->pci->irq, lanai_int, IRQF_SHARED,
            DEV_LABEL, lanai)) != 0) {
                printk(KERN_ERR DEV_LABEL ": can't allocate interrupt\n");
                goto error_vcctable;
@@ -2279,7 +2274,7 @@ static int __init lanai_dev_open(struct atm_dev *atmdev)
        lanai->conf1 = reg_read(lanai, Config1_Reg) | CONFIG1_POWERDOWN;
        conf1_write(lanai);
 #endif
-       iounmap((void *) lanai->base);
+       iounmap(lanai->base);
     error_pci:
        pci_disable_device(lanai->pci);
     error:
@@ -2309,7 +2304,7 @@ static void lanai_dev_close(struct atm_dev *atmdev)
        pci_disable_device(lanai->pci);
        vcc_table_deallocate(lanai);
        service_buffer_deallocate(lanai);
-       iounmap((void *) lanai->base);
+       iounmap(lanai->base);
        kfree(lanai);
 }
 
@@ -2333,7 +2328,7 @@ static void lanai_close(struct atm_vcc *atmvcc)
        }
        if (lvcc->tx.atmvcc == atmvcc) {
                if (atmvcc == lanai->cbrvcc) {
-                       if (lvcc->vbase != 0)
+                       if (lvcc->vbase != NULL)
                                lanai_cbr_shutdown(lanai);
                        lanai->cbrvcc = NULL;
                }
@@ -2432,99 +2427,12 @@ static int lanai_open(struct atm_vcc *atmvcc)
        return result;
 }
 
-#if 0
-/* ioctl operations for card */
-/* NOTE: these are all DEBUGGING ONLY currently */
-static int lanai_ioctl(struct atm_dev *atmdev, unsigned int cmd, void __user *arg)
-{
-       int result = 0;
-       struct lanai_dev *lanai = (struct lanai_dev *) atmdev->dev_data;
-       switch(cmd) {
-               case 2106275:
-                       shutdown_atm_dev(atmdev);
-                       return 0;
-               case 2200000: {
-                       unsigned long flags;
-                       spin_lock_irqsave(&lanai->servicelock, flags);
-                       run_service(lanai);
-                       spin_unlock_irqrestore(&lanai->servicelock, flags);
-                       return 0; }
-               case 2200002:
-                       get_statistics(lanai);
-                       return 0;
-               case 2200003: {
-                       unsigned int i;
-                       for (i = 0; i <= 0x5C ; i += 4) {
-                               if (i==0x48) /* Write-only butt reg */
-                                       continue;
-                               printk(KERN_CRIT DEV_LABEL "  0x%02X: "
-                                   "0x%08X\n", i,
-                                   (unsigned int) readl(lanai->base + i));
-                               barrier(); mb();
-                               pcistatus_check(lanai, 0);
-                               barrier(); mb();
-                       }
-                       return 0; }
-               case 2200004: {
-                       u8 b;
-                       u16 w;
-                       u32 dw;
-                       struct pci_dev *pci = lanai->pci;
-                       (void) pci_read_config_word(pci, PCI_VENDOR_ID, &w);
-                       DPRINTK("vendor = 0x%X\n", (unsigned int) w);
-                       (void) pci_read_config_word(pci, PCI_DEVICE_ID, &w);
-                       DPRINTK("device = 0x%X\n", (unsigned int) w);
-                       (void) pci_read_config_word(pci, PCI_COMMAND, &w);
-                       DPRINTK("command = 0x%X\n", (unsigned int) w);
-                       (void) pci_read_config_word(pci, PCI_STATUS, &w);
-                       DPRINTK("status = 0x%X\n", (unsigned int) w);
-                       (void) pci_read_config_dword(pci,
-                           PCI_CLASS_REVISION, &dw);
-                       DPRINTK("class/revision = 0x%X\n", (unsigned int) dw);
-                       (void) pci_read_config_byte(pci,
-                           PCI_CACHE_LINE_SIZE, &b);
-                       DPRINTK("cache line size = 0x%X\n", (unsigned int) b);
-                       (void) pci_read_config_byte(pci, PCI_LATENCY_TIMER, &b);
-                       DPRINTK("latency = %d (0x%X)\n",
-                           (int) b, (unsigned int) b);
-                       (void) pci_read_config_byte(pci, PCI_HEADER_TYPE, &b);
-                       DPRINTK("header type = 0x%X\n", (unsigned int) b);
-                       (void) pci_read_config_byte(pci, PCI_BIST, &b);
-                       DPRINTK("bist = 0x%X\n", (unsigned int) b);
-                       /* skipping a few here */
-                       (void) pci_read_config_byte(pci,
-                           PCI_INTERRUPT_LINE, &b);
-                       DPRINTK("pci_int_line = 0x%X\n", (unsigned int) b);
-                       (void) pci_read_config_byte(pci,
-                           PCI_INTERRUPT_PIN, &b);
-                       DPRINTK("pci_int_pin = 0x%X\n", (unsigned int) b);
-                       (void) pci_read_config_byte(pci, PCI_MIN_GNT, &b);
-                       DPRINTK("min_gnt = 0x%X\n", (unsigned int) b);
-                       (void) pci_read_config_byte(pci, PCI_MAX_LAT, &b);
-                       DPRINTK("max_lat = 0x%X\n", (unsigned int) b); }
-                       return 0;
-#ifdef USE_POWERDOWN
-               case 2200005:
-                       DPRINTK("Coming out of powerdown\n");
-                       lanai->conf1 &= ~CONFIG1_POWERDOWN;
-                       conf1_write(lanai);
-                       return 0;
-#endif
-               default:
-                       result = -ENOIOCTLCMD;
-       }
-       return result;
-}
-#else /* !0 */
-#define lanai_ioctl NULL
-#endif /* 0 */
-
 static int lanai_send(struct atm_vcc *atmvcc, struct sk_buff *skb)
 {
        struct lanai_vcc *lvcc = (struct lanai_vcc *) atmvcc->dev_data;
        struct lanai_dev *lanai = (struct lanai_dev *) atmvcc->dev->dev_data;
        unsigned long flags;
-       if (unlikely(lvcc == NULL || lvcc->vbase == 0 ||
+       if (unlikely(lvcc == NULL || lvcc->vbase == NULL ||
              lvcc->tx.atmvcc != atmvcc))
                goto einval;
 #ifdef DEBUG
@@ -2676,7 +2584,6 @@ static const struct atmdev_ops ops = {
        .dev_close      = lanai_dev_close,
        .open           = lanai_open,
        .close          = lanai_close,
-       .ioctl          = lanai_ioctl,
        .getsockopt     = NULL,
        .setsockopt     = NULL,
        .send           = lanai_send,
@@ -2695,7 +2602,7 @@ static int __devinit lanai_init_one(struct pci_dev *pci,
        struct atm_dev *atmdev;
        int result;
 
-       lanai = (struct lanai_dev *) kmalloc(sizeof(*lanai), GFP_KERNEL);
+       lanai = kmalloc(sizeof(*lanai), GFP_KERNEL);
        if (lanai == NULL) {
                printk(KERN_ERR DEV_LABEL
                       ": couldn't allocate dev_data structure!\n");
@@ -2746,7 +2653,7 @@ static int __init lanai_module_init(void)
 {
        int x;
 
-       x = pci_module_init(&lanai_driver);
+       x = pci_register_driver(&lanai_driver);
        if (x != 0)
                printk(KERN_ERR DEV_LABEL ": no adapter found\n");
        return x;
@@ -2758,6 +2665,7 @@ static void __exit lanai_module_exit(void)
         * gone, so there isn't much to do
         */
        DPRINTK("cleanup_module()\n");
+       pci_unregister_driver(&lanai_driver);
 }
 
 module_init(lanai_module_init);