Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / drivers / char / sx.c
index 643163b..3b47472 100644 (file)
@@ -4,7 +4,7 @@
  *  This driver will also support the older SI, and XIO cards.
  *
  *
- *   (C) 1998 - 2000  R.E.Wolff@BitWizard.nl
+ *   (C) 1998 - 2004  R.E.Wolff@BitWizard.nl
  *
  *  Simon Allen (simonallen@cix.compulink.co.uk) wrote a previous
  *  version of this driver. Some fragments may have been copied. (none
 #define PCI_DEVICE_ID_SPECIALIX_SX_XIO_IO8 0x2000
 #endif
 
+#ifdef CONFIG_PCI
 static struct pci_device_id sx_pci_tbl[] = {
        { PCI_VENDOR_ID_SPECIALIX, PCI_DEVICE_ID_SPECIALIX_SX_XIO_IO8, PCI_ANY_ID, PCI_ANY_ID },
        { 0 }
 };
 MODULE_DEVICE_TABLE(pci, sx_pci_tbl);
+#endif /* CONFIG_PCI */
 
 /* Configurable options: 
    (Don't be too sure that it'll work if you toggle them) */
@@ -343,22 +345,22 @@ static int si_probe_addrs[]= {0xc0000, 0xd0000, 0xe0000,
                               0xc8000, 0xd8000, 0xe8000, 0xa0000};
 static int si1_probe_addrs[]= { 0xd0000};
 
-#define NR_SX_ADDRS (sizeof(sx_probe_addrs)/sizeof (int))
-#define NR_SI_ADDRS (sizeof(si_probe_addrs)/sizeof (int))
-#define NR_SI1_ADDRS (sizeof(si1_probe_addrs)/sizeof (int))
+#define NR_SX_ADDRS ARRAY_SIZE(sx_probe_addrs)
+#define NR_SI_ADDRS ARRAY_SIZE(si_probe_addrs)
+#define NR_SI1_ADDRS ARRAY_SIZE(si1_probe_addrs)
 
 
 /* Set the mask to all-ones. This alas, only supports 32 interrupts. 
    Some architectures may need more. */
 static int sx_irqmask = -1;
 
-MODULE_PARM(sx_probe_addrs, "i");
-MODULE_PARM(si_probe_addrs, "i");
-MODULE_PARM(sx_poll, "i");
-MODULE_PARM(sx_slowpoll, "i");
-MODULE_PARM(sx_maxints, "i");
-MODULE_PARM(sx_debug, "i");
-MODULE_PARM(sx_irqmask, "i");
+module_param_array(sx_probe_addrs, int, NULL, 0);
+module_param_array(si_probe_addrs, int, NULL, 0);
+module_param(sx_poll, int, 0);
+module_param(sx_slowpoll, int, 0);
+module_param(sx_maxints, int, 0);
+module_param(sx_debug, int, 0);
+module_param(sx_irqmask, int, 0);
 
 MODULE_LICENSE("GPL");
 
@@ -394,7 +396,7 @@ static struct real_driver sx_real_driver = {
 
 
 
-#define func_enter() sx_dprintk (SX_DEBUG_FLOW, "sx: enter %s\b",__FUNCTION__)
+#define func_enter() sx_dprintk (SX_DEBUG_FLOW, "sx: enter %s\n",__FUNCTION__)
 #define func_exit()  sx_dprintk (SX_DEBUG_FLOW, "sx: exit  %s\n", __FUNCTION__)
 
 #define func_enter2() sx_dprintk (SX_DEBUG_FLOW, "sx: enter %s (port %d)\n", \
@@ -458,9 +460,27 @@ static inline int sx_paranoia_check(struct sx_port const * port,
 
 
 #ifdef DEBUG
-static void my_hd (unsigned char *addr, int len)
+static void my_hd_io(void __iomem *p, int len)
+{
+       int i, j, ch;
+       unsigned char __iomem *addr = p;
+
+       for (i=0;i<len;i+=16) {
+               printk ("%p ", addr+i);
+               for (j=0;j<16;j++) {
+                       printk ("%02x %s", readb(addr+j+i), (j==7)?" ":"");
+               }
+               for (j=0;j<16;j++) {
+                       ch = readb(addr+j+i);
+                       printk ("%c", (ch < 0x20)?'.':((ch > 0x7f)?'.':ch));
+               }
+               printk ("\n");
+       }
+}
+static void my_hd(void *p, int len)
 {
        int i, j, ch;
+       unsigned char *addr = p;
 
        for (i=0;i<len;i+=16) {
                printk ("%p ", addr+i);
@@ -911,7 +931,7 @@ static int sx_set_real_termios (void *ptr)
        case CS6:sx_write_channel_byte (port, hi_mask, 0x3f);break;
        case CS5:sx_write_channel_byte (port, hi_mask, 0x1f);break;
        default:
-               printk (KERN_INFO "sx: Invalid wordsize: %d\n", CFLAG & CSIZE);
+               printk (KERN_INFO "sx: Invalid wordsize: %u\n", CFLAG & CSIZE);
                break;
        }
 
@@ -938,7 +958,7 @@ static int sx_set_real_termios (void *ptr)
        } else {
                set_bit(TTY_HW_COOK_IN, &port->gs.tty->flags);
        }
-       sx_dprintk (SX_DEBUG_TERMIOS, "iflags: %x(%d) ", 
+       sx_dprintk (SX_DEBUG_TERMIOS, "iflags: %x(%d) ",
                    port->gs.tty->termios->c_iflag, 
                    I_OTHER(port->gs.tty));
 
@@ -953,7 +973,7 @@ static int sx_set_real_termios (void *ptr)
        } else {
                clear_bit(TTY_HW_COOK_OUT, &port->gs.tty->flags);
        }
-       sx_dprintk (SX_DEBUG_TERMIOS, "oflags: %x(%d)\n", 
+       sx_dprintk (SX_DEBUG_TERMIOS, "oflags: %x(%d)\n",
                    port->gs.tty->termios->c_oflag, 
                    O_OTHER(port->gs.tty));
        /* port->c_dcd = sx_get_CD (port); */
@@ -1044,12 +1064,9 @@ static void sx_transmit_chars (struct sx_port *port)
        }
 
        if ((port->gs.xmit_cnt <= port->gs.wakeup_chars) && port->gs.tty) {
-               if ((port->gs.tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
-                   port->gs.tty->ldisc.write_wakeup)
-                       (port->gs.tty->ldisc.write_wakeup)(port->gs.tty);
+               tty_wakeup(port->gs.tty);
                sx_dprintk (SX_DEBUG_TRANSMIT, "Waking up.... ldisc (%d)....\n",
                            port->gs.wakeup_chars); 
-               wake_up_interruptible(&port->gs.tty->write_wait);
        }
 
        clear_bit (SX_PORT_TRANSMIT_LOCK, &port->locks);
@@ -1068,6 +1085,7 @@ static inline void sx_receive_chars (struct sx_port *port)
        int rx_op;
        struct tty_struct *tty;
        int copied=0;
+       unsigned char *rp;
 
        func_enter2 ();
        tty = port->gs.tty;
@@ -1077,31 +1095,25 @@ static inline void sx_receive_chars (struct sx_port *port)
 
                sx_dprintk (SX_DEBUG_RECEIVE, "rxop=%d, c = %d.\n", rx_op, c); 
 
-               /* Don't copy more bytes than there is room for in the buffer */
-               if (tty->flip.count + c > TTY_FLIPBUF_SIZE) 
-                       c = TTY_FLIPBUF_SIZE - tty->flip.count;
-
-               sx_dprintk (SX_DEBUG_RECEIVE, "c = %d.\n", c); 
-
                /* Don't copy past the end of the hardware receive buffer */
                if (rx_op + c > 0x100) c = 0x100 - rx_op;
 
                sx_dprintk (SX_DEBUG_RECEIVE, "c = %d.\n", c);
 
+               /* Don't copy more bytes than there is room for in the buffer */
+
+               c = tty_prepare_flip_string(tty, &rp, c);
+
+               sx_dprintk (SX_DEBUG_RECEIVE, "c = %d.\n", c); 
+
                /* If for one reason or another, we can't copy more data, we're done! */
                if (c == 0) break;
 
                sx_dprintk (SX_DEBUG_RECEIVE , "Copying over %d chars. First is %d at %lx\n", c, 
                            read_sx_byte (port->board, CHAN_OFFSET(port,hi_rxbuf) + rx_op),
                            CHAN_OFFSET(port, hi_rxbuf)); 
-               memcpy_fromio (tty->flip.char_buf_ptr, 
+               memcpy_fromio (rp,
                               port->board->base + CHAN_OFFSET(port,hi_rxbuf) + rx_op, c);
-               memset(tty->flip.flag_buf_ptr, TTY_NORMAL, c);
-
-               /* Update the kernel buffer end */
-               tty->flip.count += c;
-               tty->flip.char_buf_ptr += c;
-               tty->flip.flag_buf_ptr += c;
 
                /* This one last. ( Not essential.)
                   It allows the card to start putting more data into the buffer! 
@@ -1141,7 +1153,6 @@ static inline void sx_check_modem_signals (struct sx_port *port)
        if (hi_state & ST_BREAK) {
                hi_state &= ~ST_BREAK;
                sx_dprintk (SX_DEBUG_MODEMSIGNALS, "got a break.\n");
-
                sx_write_channel_byte (port, hi_state, hi_state);
                gs_got_break (&port->gs);
        }
@@ -1189,7 +1200,7 @@ static irqreturn_t sx_interrupt (int irq, void *ptr, struct pt_regs *regs)
        struct sx_port *port;
        int i;
 
-       /*   func_enter ();  */
+       func_enter ();
        sx_dprintk (SX_DEBUG_FLOW, "sx: enter sx_interrupt (%d/%d)\n", irq, board->irq); 
 
        /* AAargh! The order in which to do these things is essential and
@@ -1280,7 +1291,7 @@ static irqreturn_t sx_interrupt (int irq, void *ptr, struct pt_regs *regs)
        clear_bit (SX_BOARD_INTR_LOCK, &board->locks);
 
        sx_dprintk (SX_DEBUG_FLOW, "sx: exit sx_interrupt (%d/%d)\n", irq, board->irq); 
-       /*  func_exit ();  */
+        func_exit ();
        return IRQ_HANDLED;
 }
 
@@ -1411,6 +1422,7 @@ static int sx_open  (struct tty_struct * tty, struct file * filp)
 {
        struct sx_port *port;
        int retval, line;
+       unsigned long flags;
 
        func_enter();
 
@@ -1432,9 +1444,12 @@ static int sx_open  (struct tty_struct * tty, struct file * filp)
 
        sx_dprintk (SX_DEBUG_OPEN, "port = %p c_dcd = %d\n", port, port->c_dcd);
 
+       spin_lock_irqsave(&port->gs.driver_lock, flags);
+
        tty->driver_data = port;
        port->gs.tty = tty;
        port->gs.count++;
+       spin_unlock_irqrestore(&port->gs.driver_lock, flags);
 
        sx_dprintk (SX_DEBUG_OPEN, "starting port\n");
 
@@ -1449,21 +1464,25 @@ static int sx_open  (struct tty_struct * tty, struct file * filp)
        }
 
        port->gs.flags |= GS_ACTIVE;
-       sx_setsignals (port, 1,1);
+       if (port->gs.count <= 1)
+               sx_setsignals (port, 1,1);
 
 #if 0
        if (sx_debug & SX_DEBUG_OPEN)
-               my_hd ((unsigned char *)port, sizeof (*port));
+               my_hd (port, sizeof (*port));
 #else
        if (sx_debug & SX_DEBUG_OPEN)
-               my_hd ((unsigned char *)port->board->base + port->ch_base, 
-                      sizeof (*port));
+               my_hd_io (port->board->base + port->ch_base, sizeof (*port));
 #endif
 
-       if (sx_send_command (port, HS_LOPEN, -1, HS_IDLE_OPEN) != 1) {
-               printk (KERN_ERR "sx: Card didn't respond to LOPEN command.\n");
-               port->gs.count--;
-               return -EIO;
+       if (port->gs.count <= 1) {
+               if (sx_send_command (port, HS_LOPEN, -1, HS_IDLE_OPEN) != 1) {
+                       printk (KERN_ERR "sx: Card didn't respond to LOPEN command.\n");
+                       spin_lock_irqsave(&port->gs.driver_lock, flags);
+                       port->gs.count--;
+                       spin_unlock_irqrestore(&port->gs.driver_lock, flags);
+                       return -EIO;
+               }
        }
 
        retval = gs_block_til_ready(port, filp);
@@ -1481,6 +1500,7 @@ static int sx_open  (struct tty_struct * tty, struct file * filp)
 
        port->c_dcd = sx_get_CD (port);
        sx_dprintk (SX_DEBUG_OPEN, "at open: cd=%d\n", port->c_dcd);
+
        func_exit();
        return 0;
 
@@ -1499,13 +1519,9 @@ static void sx_close (void *ptr)
        sx_reconfigure_port(port);      
        sx_send_command (port, HS_CLOSE, 0, 0);
 
-       while (to-- && (sx_read_channel_byte (port, hi_hstat) != HS_IDLE_CLOSED)) {
-               current->state = TASK_INTERRUPTIBLE;
-               schedule_timeout (1);
-               if (signal_pending (current))
-                               break;
-       }
-       current->state = TASK_RUNNING;
+       while (to-- && (sx_read_channel_byte (port, hi_hstat) != HS_IDLE_CLOSED))
+               if (msleep_interruptible(10))
+                       break;
        if (sx_read_channel_byte (port, hi_hstat) != HS_IDLE_CLOSED) {
                if (sx_send_command (port, HS_FORCE_CLOSED, -1, HS_IDLE_CLOSED) != 1) {
                        printk (KERN_ERR 
@@ -1519,7 +1535,8 @@ static void sx_close (void *ptr)
 
        if(port->gs.count) {
                sx_dprintk(SX_DEBUG_CLOSE, "WARNING port count:%d\n", port->gs.count);
-               port->gs.count = 0;
+               //printk ("%s SETTING port count to zero: %p count: %d\n", __FUNCTION__, port, port->gs.count);
+               //port->gs.count = 0;
        }
 
        func_exit ();
@@ -1592,7 +1609,8 @@ static int sx_fw_ioctl (struct inode *inode, struct file *filp,
                         unsigned int cmd, unsigned long arg)
 {
        int rc = 0;
-       int *descr = (int *)arg, i;
+       int __user *descr = (int __user *)arg;
+       int i;
        static struct sx_board *board = NULL;
        int nbytes, offset;
        unsigned long data;
@@ -1668,14 +1686,14 @@ static int sx_fw_ioctl (struct inode *inode, struct file *filp,
                get_user (data,  descr++);
                while (nbytes && data) {
                        for (i=0;i<nbytes;i += SX_CHUNK_SIZE) {
-                               if (copy_from_user(tmp, (char *)data + i, 
+                               if (copy_from_user(tmp, (char __user *)data+i, 
                                                   (i + SX_CHUNK_SIZE >
                                                    nbytes) ? nbytes - i :
                                                              SX_CHUNK_SIZE)) {
                                        kfree (tmp);
                                        return -EFAULT;
                                }
-                               memcpy_toio    ((char *) (board->base2 + offset + i), tmp, 
+                               memcpy_toio(board->base2 + offset + i, tmp, 
                                                (i+SX_CHUNK_SIZE>nbytes)?nbytes-i:SX_CHUNK_SIZE);
                        }
 
@@ -1734,12 +1752,16 @@ static void sx_break (struct tty_struct * tty, int flag)
        struct sx_port *port = tty->driver_data;
        int rv;
 
+       func_enter ();
+
        if (flag) 
                rv = sx_send_command (port, HS_START, -1, HS_IDLE_BREAK);
        else 
                rv = sx_send_command (port, HS_STOP, -1, HS_IDLE_OPEN);
        if (rv != 1) printk (KERN_ERR "sx: couldn't send break (%x).\n",
                        read_sx_byte (port->board, CHAN_OFFSET (port, hi_hstat)));
+
+       func_exit ();
 }
 
 
@@ -1774,6 +1796,7 @@ static int sx_ioctl (struct tty_struct * tty, struct file * filp,
 {
        int rc;
        struct sx_port *port = tty->driver_data;
+       void __user *argp = (void __user *)arg;
        int ival;
 
        /* func_enter2(); */
@@ -1782,24 +1805,20 @@ static int sx_ioctl (struct tty_struct * tty, struct file * filp,
        switch (cmd) {
        case TIOCGSOFTCAR:
                rc = put_user(((tty->termios->c_cflag & CLOCAL) ? 1 : 0),
-                             (unsigned int *) arg);
+                             (unsigned __user *) argp);
                break;
        case TIOCSSOFTCAR:
-               if ((rc = get_user(ival, (unsigned int *) arg)) == 0) {
+               if ((rc = get_user(ival, (unsigned __user *) argp)) == 0) {
                        tty->termios->c_cflag =
                                (tty->termios->c_cflag & ~CLOCAL) |
                                (ival ? CLOCAL : 0);
                }
                break;
        case TIOCGSERIAL:
-               if ((rc = verify_area(VERIFY_WRITE, (void *) arg,
-                                     sizeof(struct serial_struct))) == 0)
-                       rc = gs_getserial(&port->gs, (struct serial_struct *) arg);
+               rc = gs_getserial(&port->gs, argp);
                break;
        case TIOCSSERIAL:
-               if ((rc = verify_area(VERIFY_READ, (void *) arg,
-                                     sizeof(struct serial_struct))) == 0)
-                       rc = gs_setserial(&port->gs, (struct serial_struct *) arg);
+               rc = gs_setserial(&port->gs, argp);
                break;
        default:
                rc = -ENOIOCTLCMD;
@@ -1895,9 +1914,9 @@ static int sx_init_board (struct sx_board *board)
        /* Ok. So now the processor on the card is running. It gathered
           some info for us... */
        sx_dprintk (SX_DEBUG_INIT, "The sxcard structure:\n");
-       if (sx_debug & SX_DEBUG_INIT) my_hd ((char *)(board->base), 0x10);
+       if (sx_debug & SX_DEBUG_INIT) my_hd_io (board->base, 0x10);
        sx_dprintk (SX_DEBUG_INIT, "the first sx_module structure:\n");
-       if (sx_debug & SX_DEBUG_INIT) my_hd ((char *)(board->base + 0x80), 0x30);
+       if (sx_debug & SX_DEBUG_INIT) my_hd_io (board->base + 0x80, 0x30);
 
        sx_dprintk (SX_DEBUG_INIT, 
                    "init_status: %x, %dk memory, firmware V%x.%02x,\n", 
@@ -2050,18 +2069,18 @@ static int probe_sx (struct sx_board *board)
        func_enter();
 
        if (!IS_CF_BOARD (board)) {    
-               sx_dprintk (SX_DEBUG_PROBE, "Going to verify vpd prom at %lx.\n", 
+               sx_dprintk (SX_DEBUG_PROBE, "Going to verify vpd prom at %p.\n", 
                            board->base + SX_VPD_ROM);
 
                if (sx_debug & SX_DEBUG_PROBE)
-                       my_hd ((char *)(board->base + SX_VPD_ROM), 0x40);
+                       my_hd_io(board->base + SX_VPD_ROM, 0x40);
 
                p = (char *) &vpdp;
                for (i=0;i< sizeof (struct vpd_prom);i++)
                        *p++ = read_sx_byte (board, SX_VPD_ROM + i*2);
 
                if (sx_debug & SX_DEBUG_PROBE)
-                       my_hd ((char *)&vpdp, 0x20);
+                       my_hd (&vpdp, 0x20);
 
                sx_dprintk (SX_DEBUG_PROBE, "checking identifier...\n");
 
@@ -2091,8 +2110,8 @@ static int probe_sx (struct sx_board *board)
                }
 
                if (((vpdp.uniqid >> 24) & SX_UNIQUEID_MASK) == SX_ISA_UNIQUEID1) {
-                       if (board->base & 0x8000) {
-                               printk (KERN_WARNING "sx: Warning: There may be hardware problems with the card at %lx.\n", board->base);
+                       if (((unsigned long)board->hw_base) & 0x8000) {
+                               printk (KERN_WARNING "sx: Warning: There may be hardware problems with the card at %lx.\n", board->hw_base);
                                printk (KERN_WARNING "sx: Read sx.txt for more info.\n");
                        }
                }
@@ -2124,11 +2143,11 @@ static int probe_si (struct sx_board *board)
        int i;
 
        func_enter();
-       sx_dprintk (SX_DEBUG_PROBE, "Going to verify SI signature hw %lx at %lx.\n", board->hw_base,
+       sx_dprintk (SX_DEBUG_PROBE, "Going to verify SI signature hw %lx at %p.\n", board->hw_base,
                    board->base + SI2_ISA_ID_BASE);
 
        if (sx_debug & SX_DEBUG_PROBE)
-               my_hd ((char *)(board->base + SI2_ISA_ID_BASE), 0x8);
+               my_hd_io(board->base + SI2_ISA_ID_BASE, 0x8);
 
        if (!IS_EISA_BOARD(board)) {
          if( IS_SI1_BOARD(board) ) 
@@ -2140,6 +2159,7 @@ static int probe_si (struct sx_board *board)
            }
                for (i=0;i<8;i++) {
                        if ((read_sx_byte (board, SI2_ISA_ID_BASE+7-i) & 7) != i) {
+                               func_exit ();
                                return 0;
                        }
                }
@@ -2153,13 +2173,17 @@ static int probe_si (struct sx_board *board)
        if ( IS_SI1_BOARD(board)) {
                /* This should be an SI1 board, which has this
                   location writable... */
-               if (read_sx_byte (board, SI2_ISA_ID_BASE) != 0x10)
+               if (read_sx_byte (board, SI2_ISA_ID_BASE) != 0x10) {
+                       func_exit ();
                        return 0; 
+               }
        } else {
                /* This should be an SI2 board, which has the bottom
                   3 bits non-writable... */
-               if (read_sx_byte (board, SI2_ISA_ID_BASE) == 0x10)
+               if (read_sx_byte (board, SI2_ISA_ID_BASE) == 0x10) {
+                       func_exit ();
                        return 0; 
+               }
        }
 
        /* Now we're pretty much convinced that there is an SI board here, 
@@ -2170,13 +2194,17 @@ static int probe_si (struct sx_board *board)
        if ( IS_SI1_BOARD(board)) {
                /* This should be an SI1 board, which has this
                   location writable... */
-               if (read_sx_byte (board, SI2_ISA_ID_BASE) != 0x10)
+               if (read_sx_byte (board, SI2_ISA_ID_BASE) != 0x10) {
+                       func_exit();
                        return 0; 
+               }
        } else {
                /* This should be an SI2 board, which has the bottom
                   3 bits non-writable... */
-               if (read_sx_byte (board, SI2_ISA_ID_BASE) == 0x10)
+               if (read_sx_byte (board, SI2_ISA_ID_BASE) == 0x10) {
+                       func_exit ();
                        return 0; 
+               }
        }
 
        printheader ();
@@ -2290,8 +2318,9 @@ static int sx_init_portstructs (int nboards, int nports)
                        port->board = board;
                        port->gs.rd = &sx_real_driver;
 #ifdef NEW_WRITE_LOCKING
-                       port->gs.port_write_sem = MUTEX;
+                       port->gs.port_write_mutex = MUTEX;
 #endif
+                       port->gs.driver_lock = SPIN_LOCK_UNLOCKED;
                        /*
                         * Initializing wait queue
                         */
@@ -2362,7 +2391,7 @@ static void __exit sx_release_drivers(void)
 static void fix_sx_pci (struct pci_dev *pdev, struct sx_board *board)
 {
        unsigned int hwbase;
-       unsigned long rebase;
+       void __iomem *rebase;
        unsigned int t;
 
 #define CNTRL_REG_OFFSET        0x50
@@ -2370,13 +2399,13 @@ static void fix_sx_pci (struct pci_dev *pdev, struct sx_board *board)
 
        pci_read_config_dword(pdev, PCI_BASE_ADDRESS_0, &hwbase);
        hwbase &= PCI_BASE_ADDRESS_MEM_MASK;
-       rebase = (ulong) ioremap(hwbase, 0x80);
+       rebase = ioremap(hwbase, 0x80);
        t = readl (rebase + CNTRL_REG_OFFSET);
        if (t != CNTRL_REG_GOODVALUE) {
                printk (KERN_DEBUG "sx: performing cntrl reg fix: %08x -> %08x\n", t, CNTRL_REG_GOODVALUE); 
                writel (CNTRL_REG_GOODVALUE, rebase + CNTRL_REG_OFFSET);
        }
-       iounmap ((char *) rebase);
+       iounmap(rebase);
 }
 #endif
 
@@ -2444,7 +2473,7 @@ static int __init sx_init(void)
                else
                        board->hw_base = pci_resource_start (pdev, 2);
                board->base2 = 
-               board->base = (ulong) ioremap(board->hw_base, WINDOW_LEN (board));
+               board->base = ioremap(board->hw_base, WINDOW_LEN (board));
                if (!board->base) {
                        printk(KERN_ERR "ioremap failed\n");
                        /* XXX handle error */
@@ -2456,14 +2485,14 @@ static int __init sx_init(void)
 
                board->irq = pdev->irq;
 
-               sx_dprintk (SX_DEBUG_PROBE, "Got a specialix card: %x/%lx(%d) %x.\n", 
+               sx_dprintk (SX_DEBUG_PROBE, "Got a specialix card: %x/%p(%d) %x.\n", 
                            tint, boards[found].base, board->irq, board->flags);
 
                if (probe_sx (board)) {
                        found++;
                        fix_sx_pci (pdev, board);
                } else 
-                       iounmap ((char *) (board->base));
+                       iounmap(board->base2);
        }
 #endif
 
@@ -2471,7 +2500,7 @@ static int __init sx_init(void)
                board = &boards[found];
                board->hw_base = sx_probe_addrs[i];
                board->base2 =
-               board->base = (ulong) ioremap(board->hw_base, SX_WINDOW_LEN);
+               board->base = ioremap(board->hw_base, SX_WINDOW_LEN);
                board->flags &= ~SX_BOARD_TYPE;
                board->flags |= SX_ISA_BOARD;
                board->irq = sx_irqmask?-1:0;
@@ -2479,7 +2508,7 @@ static int __init sx_init(void)
                if (probe_sx (board)) {
                        found++;
                } else {
-                       iounmap ((char *) (board->base));
+                       iounmap(board->base);
                }
        }
 
@@ -2487,7 +2516,7 @@ static int __init sx_init(void)
                board = &boards[found];
                board->hw_base = si_probe_addrs[i];
                board->base2 =
-               board->base = (ulong) ioremap(board->hw_base, SI2_ISA_WINDOW_LEN);
+               board->base = ioremap(board->hw_base, SI2_ISA_WINDOW_LEN);
                board->flags &= ~SX_BOARD_TYPE;
                board->flags |=  SI_ISA_BOARD;
                board->irq = sx_irqmask ?-1:0;
@@ -2495,14 +2524,14 @@ static int __init sx_init(void)
                if (probe_si (board)) {
                        found++;
                } else {
-                       iounmap ((char *) (board->base));
+                       iounmap (board->base);
                }
        }
        for (i=0;i<NR_SI1_ADDRS;i++) {
                board = &boards[found];
                board->hw_base = si1_probe_addrs[i];
                board->base2 =
-               board->base = (ulong) ioremap(board->hw_base, SI1_ISA_WINDOW_LEN);
+               board->base = ioremap(board->hw_base, SI1_ISA_WINDOW_LEN);
                board->flags &= ~SX_BOARD_TYPE;
                board->flags |=  SI1_ISA_BOARD;
                board->irq = sx_irqmask ?-1:0;
@@ -2510,7 +2539,7 @@ static int __init sx_init(void)
                if (probe_si (board)) {
                        found++;
                } else {
-                       iounmap ((char *) (board->base));
+                       iounmap (board->base);
                }
        }
 
@@ -2530,10 +2559,10 @@ static int __init sx_init(void)
 
                        board->hw_base = (((inb(0xc01+eisa_slot) << 8) + inb(0xc00+eisa_slot)) << 16);
                        board->base2 =
-                       board->base = (ulong) ioremap(board->hw_base, SI2_EISA_WINDOW_LEN);
+                       board->base = ioremap(board->hw_base, SI2_EISA_WINDOW_LEN);
 
                        sx_dprintk(SX_DEBUG_PROBE, "IO hw_base address: %lx\n", board->hw_base);
-                       sx_dprintk(SX_DEBUG_PROBE, "base: %lx\n", board->base);
+                       sx_dprintk(SX_DEBUG_PROBE, "base: %p\n", board->base);
                        board->irq = inb(board->eisa_base+0xc02)>>4; 
                        sx_dprintk(SX_DEBUG_PROBE, "IRQ: %d\n", board->irq);
                        
@@ -2562,7 +2591,7 @@ static void __exit sx_exit (void)
        for (i = 0; i < SX_NBOARDS; i++) {
                board = &boards[i];
                if (board->flags & SX_BOARD_INITIALIZED) {
-                       sx_dprintk (SX_DEBUG_CLEANUP, "Cleaning up board at %lx\n", board->base);
+                       sx_dprintk (SX_DEBUG_CLEANUP, "Cleaning up board at %p\n", board->base);
                        /* The board should stop messing with us.
                           (actually I mean the interrupt) */
                        sx_reset (board);
@@ -2571,11 +2600,11 @@ static void __exit sx_exit (void)
 
                        /* It is safe/allowed to del_timer a non-active timer */
                        del_timer (& board->timer);
-                       iounmap ((char *) (board->base));
+                       iounmap(board->base);
                }
        }
        if (misc_deregister(&sx_fw_device) < 0) {
-               printk (KERN_INFO "sx: couldn't deregister firmware loader device\n");
+               printk (KERN_INFO "sx: couldn't deregister firmware loader devic\n");
        }
        sx_dprintk (SX_DEBUG_CLEANUP, "Cleaning up drivers (%d)\n", sx_initialized);
        if (sx_initialized)