These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / net / arcnet / com90io.c
index 487d780..b57863d 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Linux ARCnet driver - COM90xx chipset (IO-mapped buffers)
- * 
+ *
  * Written 1997 by David Woodhouse.
  * Written 1994-1999 by Avery Pennarun.
  * Written 1999-2000 by Martin Mares <mj@ucw.cz>.
@@ -25,6 +25,9 @@
  *
  * **********************
  */
+
+#define pr_fmt(fmt) "arcnet:" KBUILD_MODNAME ": " fmt
+
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/moduleparam.h>
 #include <linux/bootmem.h>
 #include <linux/init.h>
 #include <linux/interrupt.h>
-#include <asm/io.h>
-#include <linux/arcdevice.h>
-
-
-#define VERSION "arcnet: COM90xx IO-mapped mode support (by David Woodhouse et el.)\n"
+#include <linux/io.h>
 
+#include "arcdevice.h"
+#include "com9026.h"
 
 /* Internal function declarations */
 
@@ -50,35 +51,14 @@ static void com90io_setmask(struct net_device *dev, int mask);
 static int com90io_reset(struct net_device *dev, int really_reset);
 static void com90io_copy_to_card(struct net_device *dev, int bufnum, int offset,
                                 void *buf, int count);
-static void com90io_copy_from_card(struct net_device *dev, int bufnum, int offset,
-                                  void *buf, int count);
-
+static void com90io_copy_from_card(struct net_device *dev, int bufnum,
+                                  int offset, void *buf, int count);
 
 /* Handy defines for ARCnet specific stuff */
 
 /* The number of low I/O ports used by the card. */
 #define ARCNET_TOTAL_SIZE 16
 
-/* COM 9026 controller chip --> ARCnet register addresses */
-#define _INTMASK (ioaddr+0)    /* writable */
-#define _STATUS  (ioaddr+0)    /* readable */
-#define _COMMAND (ioaddr+1)    /* writable, returns random vals on read (?) */
-#define _RESET  (ioaddr+8)     /* software reset (on read) */
-#define _MEMDATA  (ioaddr+12)  /* Data port for IO-mapped memory */
-#define _ADDR_HI  (ioaddr+15)  /* Control registers for said */
-#define _ADDR_LO  (ioaddr+14)
-#define _CONFIG  (ioaddr+2)    /* Configuration register */
-
-#undef ASTATUS
-#undef ACOMMAND
-#undef AINTMASK
-
-#define ASTATUS()      inb(_STATUS)
-#define ACOMMAND(cmd) outb((cmd),_COMMAND)
-#define AINTMASK(msk)  outb((msk),_INTMASK)
-#define SETCONF()      outb((lp->config),_CONFIG)
-
-
 /****************************************************************************
  *                                                                          *
  * IO-mapped operation routines                                             *
@@ -92,58 +72,59 @@ static u_char get_buffer_byte(struct net_device *dev, unsigned offset)
 {
        int ioaddr = dev->base_addr;
 
-       outb(offset >> 8, _ADDR_HI);
-       outb(offset & 0xff, _ADDR_LO);
+       arcnet_outb(offset >> 8, ioaddr, COM9026_REG_W_ADDR_HI);
+       arcnet_outb(offset & 0xff, ioaddr, COM9026_REG_W_ADDR_LO);
 
-       return inb(_MEMDATA);
+       return arcnet_inb(ioaddr, COM9026_REG_RW_MEMDATA);
 }
 
 #ifdef ONE_AT_A_TIME_TX
-static void put_buffer_byte(struct net_device *dev, unsigned offset, u_char datum)
+static void put_buffer_byte(struct net_device *dev, unsigned offset,
+                           u_char datum)
 {
        int ioaddr = dev->base_addr;
 
-       outb(offset >> 8, _ADDR_HI);
-       outb(offset & 0xff, _ADDR_LO);
+       arcnet_outb(offset >> 8, ioaddr, COM9026_REG_W_ADDR_HI);
+       arcnet_outb(offset & 0xff, ioaddr, COM9026_REG_W_ADDR_LO);
 
-       outb(datum, _MEMDATA);
+       arcnet_outb(datum, ioaddr, COM9026_REG_RW_MEMDATA);
 }
 
 #endif
 
-
-static void get_whole_buffer(struct net_device *dev, unsigned offset, unsigned length, char *dest)
+static void get_whole_buffer(struct net_device *dev, unsigned offset,
+                            unsigned length, char *dest)
 {
        int ioaddr = dev->base_addr;
 
-       outb((offset >> 8) | AUTOINCflag, _ADDR_HI);
-       outb(offset & 0xff, _ADDR_LO);
+       arcnet_outb((offset >> 8) | AUTOINCflag, ioaddr, COM9026_REG_W_ADDR_HI);
+       arcnet_outb(offset & 0xff, ioaddr, COM9026_REG_W_ADDR_LO);
 
        while (length--)
 #ifdef ONE_AT_A_TIME_RX
                *(dest++) = get_buffer_byte(dev, offset++);
 #else
-               *(dest++) = inb(_MEMDATA);
+               *(dest++) = arcnet_inb(ioaddr, COM9026_REG_RW_MEMDATA);
 #endif
 }
 
-static void put_whole_buffer(struct net_device *dev, unsigned offset, unsigned length, char *dest)
+static void put_whole_buffer(struct net_device *dev, unsigned offset,
+                            unsigned length, char *dest)
 {
        int ioaddr = dev->base_addr;
 
-       outb((offset >> 8) | AUTOINCflag, _ADDR_HI);
-       outb(offset & 0xff, _ADDR_LO);
+       arcnet_outb((offset >> 8) | AUTOINCflag, ioaddr, COM9026_REG_W_ADDR_HI);
+       arcnet_outb(offset & 0xff, ioaddr,COM9026_REG_W_ADDR_LO);
 
        while (length--)
 #ifdef ONE_AT_A_TIME_TX
                put_buffer_byte(dev, offset++, *(dest++));
 #else
-               outb(*(dest++), _MEMDATA);
+               arcnet_outb(*(dest++), ioaddr, COM9026_REG_RW_MEMDATA);
 #endif
 }
 
-/*
- * We cannot probe for an IO mapped card either, although we can check that
+/* We cannot probe for an IO mapped card either, although we can check that
  * it's where we were told it was, and even autoirq
  */
 static int __init com90io_probe(struct net_device *dev)
@@ -151,71 +132,78 @@ static int __init com90io_probe(struct net_device *dev)
        int ioaddr = dev->base_addr, status;
        unsigned long airqmask;
 
-       BUGLVL(D_NORMAL) printk(VERSION);
-       BUGLVL(D_NORMAL) printk("E-mail me if you actually test this driver, please!\n");
+       if (BUGLVL(D_NORMAL)) {
+               pr_info("%s\n", "COM90xx IO-mapped mode support (by David Woodhouse et el.)");
+               pr_info("E-mail me if you actually test this driver, please!\n");
+       }
 
        if (!ioaddr) {
-               BUGMSG(D_NORMAL, "No autoprobe for IO mapped cards; you "
-                      "must specify the base address!\n");
+               arc_printk(D_NORMAL, dev, "No autoprobe for IO mapped cards; you must specify the base address!\n");
                return -ENODEV;
        }
        if (!request_region(ioaddr, ARCNET_TOTAL_SIZE, "com90io probe")) {
-               BUGMSG(D_INIT_REASONS, "IO request_region %x-%x failed.\n",
-                      ioaddr, ioaddr + ARCNET_TOTAL_SIZE - 1);
+               arc_printk(D_INIT_REASONS, dev, "IO request_region %x-%x failed\n",
+                          ioaddr, ioaddr + ARCNET_TOTAL_SIZE - 1);
                return -ENXIO;
        }
-       if (ASTATUS() == 0xFF) {
-               BUGMSG(D_INIT_REASONS, "IO address %x empty\n", ioaddr);
+       if (arcnet_inb(ioaddr, COM9026_REG_R_STATUS) == 0xFF) {
+               arc_printk(D_INIT_REASONS, dev, "IO address %x empty\n",
+                          ioaddr);
                goto err_out;
        }
-       inb(_RESET);
+       arcnet_inb(ioaddr, COM9026_REG_R_RESET);
        mdelay(RESETtime);
 
-       status = ASTATUS();
+       status = arcnet_inb(ioaddr, COM9026_REG_R_STATUS);
 
        if ((status & 0x9D) != (NORXflag | RECONflag | TXFREEflag | RESETflag)) {
-               BUGMSG(D_INIT_REASONS, "Status invalid (%Xh).\n", status);
+               arc_printk(D_INIT_REASONS, dev, "Status invalid (%Xh)\n",
+                          status);
                goto err_out;
        }
-       BUGMSG(D_INIT_REASONS, "Status after reset: %X\n", status);
+       arc_printk(D_INIT_REASONS, dev, "Status after reset: %X\n", status);
 
-       ACOMMAND(CFLAGScmd | RESETclear | CONFIGclear);
+       arcnet_outb(CFLAGScmd | RESETclear | CONFIGclear,
+                   ioaddr, COM9026_REG_W_COMMAND);
 
-       BUGMSG(D_INIT_REASONS, "Status after reset acknowledged: %X\n", status);
+       arc_printk(D_INIT_REASONS, dev, "Status after reset acknowledged: %X\n",
+                  status);
 
-       status = ASTATUS();
+       status = arcnet_inb(ioaddr, COM9026_REG_R_STATUS);
 
        if (status & RESETflag) {
-               BUGMSG(D_INIT_REASONS, "Eternal reset (status=%Xh)\n", status);
+               arc_printk(D_INIT_REASONS, dev, "Eternal reset (status=%Xh)\n",
+                          status);
                goto err_out;
        }
-       outb((0x16 | IOMAPflag) & ~ENABLE16flag, _CONFIG);
+       arcnet_outb((0x16 | IOMAPflag) & ~ENABLE16flag,
+                   ioaddr, COM9026_REG_RW_CONFIG);
 
        /* Read first loc'n of memory */
 
-       outb(AUTOINCflag, _ADDR_HI);
-       outb(0, _ADDR_LO);
+       arcnet_outb(AUTOINCflag, ioaddr, COM9026_REG_W_ADDR_HI);
+       arcnet_outb(0, ioaddr,  COM9026_REG_W_ADDR_LO);
 
-       if ((status = inb(_MEMDATA)) != 0xd1) {
-               BUGMSG(D_INIT_REASONS, "Signature byte not found"
-                      " (%Xh instead).\n", status);
+       status = arcnet_inb(ioaddr, COM9026_REG_RW_MEMDATA);
+       if (status != 0xd1) {
+               arc_printk(D_INIT_REASONS, dev, "Signature byte not found (%Xh instead).\n",
+                          status);
                goto err_out;
        }
        if (!dev->irq) {
-               /*
-                * if we do this, we're sure to get an IRQ since the
+               /* if we do this, we're sure to get an IRQ since the
                 * card has just reset and the NORXflag is on until
                 * we tell it to start receiving.
                 */
 
                airqmask = probe_irq_on();
-               outb(NORXflag, _INTMASK);
+               arcnet_outb(NORXflag, ioaddr, COM9026_REG_W_INTMASK);
                udelay(1);
-               outb(0, _INTMASK);
+               arcnet_outb(0, ioaddr, COM9026_REG_W_INTMASK);
                dev->irq = probe_irq_off(airqmask);
 
                if ((int)dev->irq <= 0) {
-                       BUGMSG(D_INIT_REASONS, "Autoprobe IRQ failed\n");
+                       arc_printk(D_INIT_REASONS, dev, "Autoprobe IRQ failed\n");
                        goto err_out;
                }
        }
@@ -227,7 +215,6 @@ err_out:
        return -ENODEV;
 }
 
-
 /* Set up the struct net_device associated with this card.  Called after
  * probing succeeds.
  */
@@ -238,12 +225,14 @@ static int __init com90io_found(struct net_device *dev)
        int err;
 
        /* Reserve the irq */
-       if (request_irq(dev->irq, arcnet_interrupt, 0, "arcnet (COM90xx-IO)", dev)) {
-               BUGMSG(D_NORMAL, "Can't get IRQ %d!\n", dev->irq);
+       if (request_irq(dev->irq, arcnet_interrupt, 0,
+                       "arcnet (COM90xx-IO)", dev)) {
+               arc_printk(D_NORMAL, dev, "Can't get IRQ %d!\n", dev->irq);
                return -ENODEV;
        }
        /* Reserve the I/O region */
-       if (!request_region(dev->base_addr, ARCNET_TOTAL_SIZE, "arcnet (COM90xx-IO)")) {
+       if (!request_region(dev->base_addr, ARCNET_TOTAL_SIZE,
+                           "arcnet (COM90xx-IO)")) {
                free_irq(dev->irq, dev);
                return -EBUSY;
        }
@@ -259,7 +248,7 @@ static int __init com90io_found(struct net_device *dev)
        lp->hw.copy_from_card = com90io_copy_from_card;
 
        lp->config = (0x16 | IOMAPflag) & ~ENABLE16flag;
-       SETCONF();
+       arcnet_outb(lp->config, ioaddr, COM9026_REG_RW_CONFIG);
 
        /* get and check the station ID from offset 1 in shmem */
 
@@ -267,21 +256,20 @@ static int __init com90io_found(struct net_device *dev)
 
        err = register_netdev(dev);
        if (err) {
-               outb((inb(_CONFIG) & ~IOMAPflag), _CONFIG);
+               arcnet_outb(arcnet_inb(ioaddr, COM9026_REG_RW_CONFIG) & ~IOMAPflag,
+                           ioaddr, COM9026_REG_RW_CONFIG);
                free_irq(dev->irq, dev);
                release_region(dev->base_addr, ARCNET_TOTAL_SIZE);
                return err;
        }
 
-       BUGMSG(D_NORMAL, "COM90IO: station %02Xh found at %03lXh, IRQ %d.\n",
-              dev->dev_addr[0], dev->base_addr, dev->irq);
+       arc_printk(D_NORMAL, dev, "COM90IO: station %02Xh found at %03lXh, IRQ %d.\n",
+                  dev->dev_addr[0], dev->base_addr, dev->irq);
 
        return 0;
 }
 
-
-/*
- * Do a hardware reset on the card, and set up necessary registers.
+/* Do a hardware reset on the card, and set up necessary registers.
  *
  * This should be called as little as possible, because it disrupts the
  * token on the network (causes a RECON) and requires a significant delay.
@@ -293,67 +281,66 @@ static int com90io_reset(struct net_device *dev, int really_reset)
        struct arcnet_local *lp = netdev_priv(dev);
        short ioaddr = dev->base_addr;
 
-       BUGMSG(D_INIT, "Resetting %s (status=%02Xh)\n", dev->name, ASTATUS());
+       arc_printk(D_INIT, dev, "Resetting %s (status=%02Xh)\n",
+                  dev->name, arcnet_inb(ioaddr, COM9026_REG_R_STATUS));
 
        if (really_reset) {
                /* reset the card */
-               inb(_RESET);
+               arcnet_inb(ioaddr, COM9026_REG_R_RESET);
                mdelay(RESETtime);
        }
        /* Set the thing to IO-mapped, 8-bit  mode */
        lp->config = (0x1C | IOMAPflag) & ~ENABLE16flag;
-       SETCONF();
+       arcnet_outb(lp->config, ioaddr, COM9026_REG_RW_CONFIG);
 
-       ACOMMAND(CFLAGScmd | RESETclear);       /* clear flags & end reset */
-       ACOMMAND(CFLAGScmd | CONFIGclear);
+       arcnet_outb(CFLAGScmd | RESETclear, ioaddr, COM9026_REG_W_COMMAND);
+                                       /* clear flags & end reset */
+       arcnet_outb(CFLAGScmd | CONFIGclear, ioaddr, COM9026_REG_W_COMMAND);
 
        /* verify that the ARCnet signature byte is present */
        if (get_buffer_byte(dev, 0) != TESTvalue) {
-               BUGMSG(D_NORMAL, "reset failed: TESTvalue not present.\n");
+               arc_printk(D_NORMAL, dev, "reset failed: TESTvalue not present.\n");
                return 1;
        }
        /* enable extended (512-byte) packets */
-       ACOMMAND(CONFIGcmd | EXTconf);
-
+       arcnet_outb(CONFIGcmd | EXTconf, ioaddr, COM9026_REG_W_COMMAND);
        /* done!  return success. */
        return 0;
 }
 
-
 static void com90io_command(struct net_device *dev, int cmd)
 {
        short ioaddr = dev->base_addr;
 
-       ACOMMAND(cmd);
+       arcnet_outb(cmd, ioaddr, COM9026_REG_W_COMMAND);
 }
 
-
 static int com90io_status(struct net_device *dev)
 {
        short ioaddr = dev->base_addr;
 
-       return ASTATUS();
+       return arcnet_inb(ioaddr, COM9026_REG_R_STATUS);
 }
 
-
 static void com90io_setmask(struct net_device *dev, int mask)
 {
        short ioaddr = dev->base_addr;
 
-       AINTMASK(mask);
+       arcnet_outb(mask, ioaddr, COM9026_REG_W_INTMASK);
 }
 
-static void com90io_copy_to_card(struct net_device *dev, int bufnum, int offset,
-                                void *buf, int count)
+static void com90io_copy_to_card(struct net_device *dev, int bufnum,
+                                int offset, void *buf, int count)
 {
-       TIME("put_whole_buffer", count, put_whole_buffer(dev, bufnum * 512 + offset, count, buf));
+       TIME(dev, "put_whole_buffer", count,
+            put_whole_buffer(dev, bufnum * 512 + offset, count, buf));
 }
 
-
-static void com90io_copy_from_card(struct net_device *dev, int bufnum, int offset,
-                                  void *buf, int count)
+static void com90io_copy_from_card(struct net_device *dev, int bufnum,
+                                  int offset, void *buf, int count)
 {
-       TIME("get_whole_buffer", count, get_whole_buffer(dev, bufnum * 512 + offset, count, buf));
+       TIME(dev, "get_whole_buffer", count,
+            get_whole_buffer(dev, bufnum * 512 + offset, count, buf));
 }
 
 static int io;                 /* use the insmod io= irq= shmem= options */
@@ -369,12 +356,13 @@ MODULE_LICENSE("GPL");
 static int __init com90io_setup(char *s)
 {
        int ints[4];
+
        s = get_options(s, 4, ints);
        if (!ints[0])
                return 0;
        switch (ints[0]) {
        default:                /* ERROR */
-               printk("com90io: Too many arguments.\n");
+               pr_err("Too many arguments\n");
        case 2:         /* IRQ */
                irq = ints[2];
        case 1:         /* IO address */
@@ -421,8 +409,11 @@ static void __exit com90io_exit(void)
 
        unregister_netdev(dev);
 
-       /* Set the thing back to MMAP mode, in case the old driver is loaded later */
-       outb((inb(_CONFIG) & ~IOMAPflag), _CONFIG);
+       /* In case the old driver is loaded later,
+        * set the thing back to MMAP mode
+        */
+       arcnet_outb(arcnet_inb(ioaddr, COM9026_REG_RW_CONFIG) & ~IOMAPflag,
+                   ioaddr, COM9026_REG_RW_CONFIG);
 
        free_irq(dev->irq, dev);
        release_region(dev->base_addr, ARCNET_TOTAL_SIZE);