Merge remote-tracking branch 'staging/staging-next'
[deliverable/linux.git] / drivers / staging / i4l / icn / icn.c
index 46d957c34be1ea2f2fe78cdfde367f2dbd5e7566..514bfc2c5b53b84bda9177619736c57d6a388654 100644 (file)
@@ -62,7 +62,8 @@ icn_free_queue(icn_card *card, int channel)
        skb_queue_purge(queue);
        card->xlen[channel] = 0;
        card->sndcount[channel] = 0;
-       if ((skb = card->xskb[channel])) {
+       skb = card->xskb[channel];
+       if (skb) {
                card->xskb[channel] = NULL;
                dev_kfree_skb(skb);
        }
@@ -81,12 +82,11 @@ icn_shiftout(unsigned short port,
             int firstbit,
             int bitcount)
 {
-
        register u_char s;
        register u_char c;
 
        for (s = firstbit, c = bitcount; c > 0; s--, c--)
-               OUTB_P((u_char) ((val >> s) & 1) ? 0xff : 0, port);
+               OUTB_P((u_char)((val >> s) & 1) ? 0xff : 0, port);
 }
 
 /*
@@ -272,8 +272,10 @@ icn_pollbchan_receive(int channel, icn_card *card)
                        rbnext;
                        icn_maprelease_channel(card, mch & 2);
                        if (!eflag) {
-                               if ((cnt = card->rcvidx[channel])) {
-                                       if (!(skb = dev_alloc_skb(cnt))) {
+                               cnt = card->rcvidx[channel];
+                               if (cnt) {
+                                       skb = dev_alloc_skb(cnt);
+                                       if (!skb) {
                                                printk(KERN_WARNING "icn: receive out of memory\n");
                                                break;
                                        }
@@ -382,7 +384,7 @@ icn_pollbchan_send(int channel, icn_card *card)
 static void
 icn_pollbchan(unsigned long data)
 {
-       icn_card *card = (icn_card *) data;
+       icn_card *card = (icn_card *)data;
        unsigned long flags;
 
        if (card->flags & ICN_FLAGS_B1ACTIVE) {
@@ -472,7 +474,6 @@ icn_parse_status(u_char *status, int channel, icn_card *card)
 
                if (card->flags &
                    ((channel) ? ICN_FLAGS_B2ACTIVE : ICN_FLAGS_B1ACTIVE)) {
-
                        isdn_ctrl ncmd;
 
                        card->flags &= ~((channel) ?
@@ -544,7 +545,7 @@ icn_parse_status(u_char *status, int channel, icn_card *card)
                break;
        case 6:
                snprintf(cmd.parm.num, sizeof(cmd.parm.num), "%d",
-                        (int) simple_strtoul(status + 7, NULL, 16));
+                        (int)simple_strtoul(status + 7, NULL, 16));
                break;
        case 7:
                status += 3;
@@ -604,7 +605,7 @@ icn_putmsg(icn_card *card, unsigned char c)
 static void
 icn_polldchan(unsigned long data)
 {
-       icn_card *card = (icn_card *) data;
+       icn_card *card = (icn_card *)data;
        int mch = card->secondhalf ? 2 : 0;
        int avail = 0;
        int left;
@@ -656,9 +657,8 @@ icn_polldchan(unsigned long data)
                                                *q = '\0';
                                                strcat(vstr, "000");
                                                vstr[3] = '\0';
-                                               card->fw_rev = (int) simple_strtoul(vstr, NULL, 10);
+                                               card->fw_rev = (int)simple_strtoul(vstr, NULL, 10);
                                                continue;
-
                                        }
                                }
                        } else {
@@ -683,7 +683,7 @@ icn_polldchan(unsigned long data)
                        card->flags |= ICN_FLAGS_RBTIMER;
                        del_timer(&card->rb_timer);
                        card->rb_timer.function = icn_pollbchan;
-                       card->rb_timer.data = (unsigned long) card;
+                       card->rb_timer.data = (unsigned long)card;
                        card->rb_timer.expires = jiffies + ICN_TIMER_BCREAD;
                        add_timer(&card->rb_timer);
                }
@@ -805,17 +805,12 @@ icn_loadboot(u_char __user *buffer, icn_card *card)
        unsigned long flags;
 
 #ifdef BOOT_DEBUG
-       printk(KERN_DEBUG "icn_loadboot called, buffaddr=%08lx\n", (ulong) buffer);
+       printk(KERN_DEBUG "icn_loadboot called, buffaddr=%08lx\n", (ulong)buffer);
 #endif
-       if (!(codebuf = kmalloc(ICN_CODE_STAGE1, GFP_KERNEL))) {
-               printk(KERN_WARNING "icn: Could not allocate code buffer\n");
-               ret = -ENOMEM;
-               goto out;
-       }
-       if (copy_from_user(codebuf, buffer, ICN_CODE_STAGE1)) {
-               ret = -EFAULT;
-               goto out_kfree;
-       }
+       codebuf = memdup_user(buffer, ICN_CODE_STAGE1);
+       if (IS_ERR(codebuf))
+               return PTR_ERR(codebuf);
+
        if (!card->rvalid) {
                if (!request_region(card->port, ICN_PORTLEN, card->regname)) {
                        printk(KERN_WARNING
@@ -878,9 +873,9 @@ icn_loadboot(u_char __user *buffer, icn_card *card)
        }
        SLEEP(1);
        OUTB_P(0xff, ICN_RUN);  /* Start Boot-Code */
-       if ((ret = icn_check_loader(card->doubleS0 ? 2 : 1))) {
+       ret = icn_check_loader(card->doubleS0 ? 2 : 1);
+       if (ret)
                goto out_kfree;
-       }
        if (!card->doubleS0) {
                ret = 0;
                goto out_kfree;
@@ -898,7 +893,6 @@ icn_loadboot(u_char __user *buffer, icn_card *card)
 
 out_kfree:
        kfree(codebuf);
-out:
        return ret;
 }
 
@@ -980,18 +974,17 @@ icn_loadproto(u_char __user *buffer, icn_card *card)
                                       card->secondhalf);
 #endif
                                spin_lock_irqsave(&card->lock, flags);
-                               init_timer(&card->st_timer);
-                               card->st_timer.expires = jiffies + ICN_TIMER_DCREAD;
-                               card->st_timer.function = icn_polldchan;
-                               card->st_timer.data = (unsigned long) card;
-                               add_timer(&card->st_timer);
+                               setup_timer(&card->st_timer, icn_polldchan,
+                                           (unsigned long)card);
+                               mod_timer(&card->st_timer,
+                                         jiffies + ICN_TIMER_DCREAD);
                                card->flags |= ICN_FLAGS_RUNNING;
                                if (card->doubleS0) {
-                                       init_timer(&card->other->st_timer);
-                                       card->other->st_timer.expires = jiffies + ICN_TIMER_DCREAD;
-                                       card->other->st_timer.function = icn_polldchan;
-                                       card->other->st_timer.data = (unsigned long) card->other;
-                                       add_timer(&card->other->st_timer);
+                                       setup_timer(&card->other->st_timer,
+                                                   icn_polldchan,
+                                                   (unsigned long)card->other);
+                                       mod_timer(&card->other->st_timer,
+                                                 jiffies + ICN_TIMER_DCREAD);
                                        card->other->flags |= ICN_FLAGS_RUNNING;
                                }
                                spin_unlock_irqrestore(&card->lock, flags);
@@ -1022,7 +1015,8 @@ icn_readstatus(u_char __user *buf, int len, icn_card *card)
 
 /* Put command-strings into the command-queue of the Interface */
 static int
-icn_writecmd(const u_char *buf, int len, int user, icn_card *card)
+icn_writecmd(const u_char __user *ubuf, const u_char *kbuf, int len,
+            int user, icn_card *card)
 {
        int mch = card->secondhalf ? 2 : 0;
        int pp;
@@ -1045,10 +1039,10 @@ icn_writecmd(const u_char *buf, int len, int user, icn_card *card)
                if (count > len)
                        count = len;
                if (user) {
-                       if (copy_from_user(msg, buf, count))
+                       if (copy_from_user(msg, ubuf, count))
                                return -EFAULT;
                } else
-                       memcpy(msg, buf, count);
+                       memcpy(msg, kbuf, count);
 
                spin_lock_irqsave(&dev.devlock, flags);
                lastmap_card = dev.mcard;
@@ -1190,28 +1184,28 @@ icn_command(isdn_ctrl *c, icn_card *card)
                        }
                        break;
                case ICN_IOCTL_GETMMIO:
-                       return (long) dev.memaddr;
+                       return (long)dev.memaddr;
                case ICN_IOCTL_SETPORT:
                        if (a == 0x300 || a == 0x310 || a == 0x320 || a == 0x330
                            || a == 0x340 || a == 0x350 || a == 0x360 ||
                            a == 0x308 || a == 0x318 || a == 0x328 || a == 0x338
                            || a == 0x348 || a == 0x358 || a == 0x368) {
-                               if (card->port != (unsigned short) a) {
-                                       if (!request_region((unsigned short) a, ICN_PORTLEN, "icn-isdn")) {
+                               if (card->port != (unsigned short)a) {
+                                       if (!request_region((unsigned short)a, ICN_PORTLEN, "icn-isdn")) {
                                                printk(KERN_WARNING
                                                       "icn: (%s) ports 0x%03x-0x%03x in use.\n",
-                                                      CID, (int) a, (int) a + ICN_PORTLEN);
+                                                      CID, (int)a, (int)a + ICN_PORTLEN);
                                                return -EINVAL;
                                        }
-                                       release_region((unsigned short) a, ICN_PORTLEN);
+                                       release_region((unsigned short)a, ICN_PORTLEN);
                                        icn_stopcard(card);
                                        spin_lock_irqsave(&card->lock, flags);
                                        if (card->rvalid)
                                                release_region(card->port, ICN_PORTLEN);
-                                       card->port = (unsigned short) a;
+                                       card->port = (unsigned short)a;
                                        card->rvalid = 0;
                                        if (card->doubleS0) {
-                                               card->other->port = (unsigned short) a;
+                                               card->other->port = (unsigned short)a;
                                                card->other->rvalid = 0;
                                        }
                                        spin_unlock_irqrestore(&card->lock, flags);
@@ -1223,9 +1217,9 @@ icn_command(isdn_ctrl *c, icn_card *card)
                                return -EINVAL;
                        break;
                case ICN_IOCTL_GETPORT:
-                       return (int) card->port;
+                       return (int)card->port;
                case ICN_IOCTL_GETDOUBLE:
-                       return (int) card->doubleS0;
+                       return (int)card->doubleS0;
                case ICN_IOCTL_DEBUGVAR:
                        if (copy_to_user(arg,
                                         &card,
@@ -1246,10 +1240,11 @@ icn_command(isdn_ctrl *c, icn_card *card)
                                dev.firstload = 0;
                        }
                        icn_stopcard(card);
-                       return (icn_loadboot(arg, card));
+                       return icn_loadboot(arg, card);
                case ICN_IOCTL_LOADPROTO:
                        icn_stopcard(card);
-                       if ((i = (icn_loadproto(arg, card))))
+                       i = (icn_loadproto(arg, card));
+                       if (i)
                                return i;
                        if (card->doubleS0)
                                i = icn_loadproto(arg + ICN_CODE_STAGE2, card->other);
@@ -1262,19 +1257,20 @@ icn_command(isdn_ctrl *c, icn_card *card)
                                           arg,
                                           sizeof(cdef)))
                                return -EFAULT;
-                       return (icn_addcard(cdef.port, cdef.id1, cdef.id2));
+                       return icn_addcard(cdef.port, cdef.id1, cdef.id2);
                        break;
                case ICN_IOCTL_LEASEDCFG:
                        if (a) {
                                if (!card->leased) {
                                        card->leased = 1;
-                                       while (card->ptype == ISDN_PTYPE_UNKNOWN) {
+                                       while (card->ptype == ISDN_PTYPE_UNKNOWN)
                                                msleep_interruptible(ICN_BOOT_TIMEOUT1);
-                                       }
                                        msleep_interruptible(ICN_BOOT_TIMEOUT1);
                                        sprintf(cbuf, "00;FV2ON\n01;EAZ%c\n02;EAZ%c\n",
                                                (a & 1) ? '1' : 'C', (a & 2) ? '2' : 'C');
-                                       i = icn_writecmd(cbuf, strlen(cbuf), 0, card);
+                                       i = icn_writecmd(NULL, cbuf,
+                                                        strlen(cbuf),
+                                                        0, card);
                                        printk(KERN_INFO
                                               "icn: (%s) Leased-line mode enabled\n",
                                               CID);
@@ -1287,7 +1283,9 @@ icn_command(isdn_ctrl *c, icn_card *card)
                                if (card->leased) {
                                        card->leased = 0;
                                        sprintf(cbuf, "00;FV2OFF\n");
-                                       i = icn_writecmd(cbuf, strlen(cbuf), 0, card);
+                                       i = icn_writecmd(NULL, cbuf,
+                                                        strlen(cbuf),
+                                                        0, card);
                                        printk(KERN_INFO
                                               "icn: (%s) Leased-line mode disabled\n",
                                               CID);
@@ -1321,10 +1319,10 @@ icn_command(isdn_ctrl *c, icn_card *card)
                                /* Normal Dial */
                                strcpy(dcode, "CAL");
                        snprintf(cbuf, sizeof(cbuf),
-                                "%02d;D%s_R%s,%02d,%02d,%s\n", (int) (a + 1),
+                                "%02d;D%s_R%s,%02d,%02d,%s\n", (int)(a + 1),
                                 dcode, p, c->parm.setup.si1,
                                 c->parm.setup.si2, c->parm.setup.eazmsn);
-                       i = icn_writecmd(cbuf, strlen(cbuf), 0, card);
+                       i = icn_writecmd(NULL, cbuf, strlen(cbuf), 0, card);
                }
                break;
        case ISDN_CMD_ACCEPTD:
@@ -1335,16 +1333,18 @@ icn_command(isdn_ctrl *c, icn_card *card)
                        if (card->fw_rev >= 300) {
                                switch (card->l2_proto[a - 1]) {
                                case ISDN_PROTO_L2_X75I:
-                                       sprintf(cbuf, "%02d;BX75\n", (int) a);
+                                       sprintf(cbuf, "%02d;BX75\n", (int)a);
                                        break;
                                case ISDN_PROTO_L2_HDLC:
-                                       sprintf(cbuf, "%02d;BTRA\n", (int) a);
+                                       sprintf(cbuf, "%02d;BTRA\n", (int)a);
                                        break;
                                }
-                               i = icn_writecmd(cbuf, strlen(cbuf), 0, card);
+                               i = icn_writecmd(NULL, cbuf,
+                                                strlen(cbuf), 0,
+                                                card);
                        }
-                       sprintf(cbuf, "%02d;DCON_R\n", (int) a);
-                       i = icn_writecmd(cbuf, strlen(cbuf), 0, card);
+                       sprintf(cbuf, "%02d;DCON_R\n", (int)a);
+                       i = icn_writecmd(NULL, cbuf, strlen(cbuf), 0, card);
                }
                break;
        case ISDN_CMD_ACCEPTB:
@@ -1355,14 +1355,14 @@ icn_command(isdn_ctrl *c, icn_card *card)
                        if (card->fw_rev >= 300)
                                switch (card->l2_proto[a - 1]) {
                                case ISDN_PROTO_L2_X75I:
-                                       sprintf(cbuf, "%02d;BCON_R,BX75\n", (int) a);
+                                       sprintf(cbuf, "%02d;BCON_R,BX75\n", (int)a);
                                        break;
                                case ISDN_PROTO_L2_HDLC:
-                                       sprintf(cbuf, "%02d;BCON_R,BTRA\n", (int) a);
+                                       sprintf(cbuf, "%02d;BCON_R,BTRA\n", (int)a);
                                        break;
                                } else
-                               sprintf(cbuf, "%02d;BCON_R\n", (int) a);
-                       i = icn_writecmd(cbuf, strlen(cbuf), 0, card);
+                               sprintf(cbuf, "%02d;BCON_R\n", (int)a);
+                       i = icn_writecmd(NULL, cbuf, strlen(cbuf), 0, card);
                }
                break;
        case ISDN_CMD_HANGUP:
@@ -1370,8 +1370,8 @@ icn_command(isdn_ctrl *c, icn_card *card)
                        return -ENODEV;
                if (c->arg < ICN_BCH) {
                        a = c->arg + 1;
-                       sprintf(cbuf, "%02d;BDIS_R\n%02d;DDIS_R\n", (int) a, (int) a);
-                       i = icn_writecmd(cbuf, strlen(cbuf), 0, card);
+                       sprintf(cbuf, "%02d;BDIS_R\n%02d;DDIS_R\n", (int)a, (int)a);
+                       i = icn_writecmd(NULL, cbuf, strlen(cbuf), 0, card);
                }
                break;
        case ISDN_CMD_SETEAZ:
@@ -1382,12 +1382,12 @@ icn_command(isdn_ctrl *c, icn_card *card)
                if (c->arg < ICN_BCH) {
                        a = c->arg + 1;
                        if (card->ptype == ISDN_PTYPE_EURO) {
-                               sprintf(cbuf, "%02d;MS%s%s\n", (int) a,
+                               sprintf(cbuf, "%02d;MS%s%s\n", (int)a,
                                        c->parm.num[0] ? "N" : "ALL", c->parm.num);
                        } else
-                               sprintf(cbuf, "%02d;EAZ%s\n", (int) a,
+                               sprintf(cbuf, "%02d;EAZ%s\n", (int)a,
                                        c->parm.num[0] ? (char *)(c->parm.num) : "0123456789");
-                       i = icn_writecmd(cbuf, strlen(cbuf), 0, card);
+                       i = icn_writecmd(NULL, cbuf, strlen(cbuf), 0, card);
                }
                break;
        case ISDN_CMD_CLREAZ:
@@ -1398,10 +1398,10 @@ icn_command(isdn_ctrl *c, icn_card *card)
                if (c->arg < ICN_BCH) {
                        a = c->arg + 1;
                        if (card->ptype == ISDN_PTYPE_EURO)
-                               sprintf(cbuf, "%02d;MSNC\n", (int) a);
+                               sprintf(cbuf, "%02d;MSNC\n", (int)a);
                        else
-                               sprintf(cbuf, "%02d;EAZC\n", (int) a);
-                       i = icn_writecmd(cbuf, strlen(cbuf), 0, card);
+                               sprintf(cbuf, "%02d;EAZC\n", (int)a);
+                       i = icn_writecmd(NULL, cbuf, strlen(cbuf), 0, card);
                }
                break;
        case ISDN_CMD_SETL2:
@@ -1411,15 +1411,15 @@ icn_command(isdn_ctrl *c, icn_card *card)
                        a = c->arg;
                        switch (a >> 8) {
                        case ISDN_PROTO_L2_X75I:
-                               sprintf(cbuf, "%02d;BX75\n", (int) (a & 255) + 1);
+                               sprintf(cbuf, "%02d;BX75\n", (int)(a & 255) + 1);
                                break;
                        case ISDN_PROTO_L2_HDLC:
-                               sprintf(cbuf, "%02d;BTRA\n", (int) (a & 255) + 1);
+                               sprintf(cbuf, "%02d;BTRA\n", (int)(a & 255) + 1);
                                break;
                        default:
                                return -EINVAL;
                        }
-                       i = icn_writecmd(cbuf, strlen(cbuf), 0, card);
+                       i = icn_writecmd(NULL, cbuf, strlen(cbuf), 0, card);
                        card->l2_proto[a & 255] = (a >> 8);
                }
                break;
@@ -1446,7 +1446,7 @@ icn_findcard(int driverid)
                        return p;
                p = p->next;
        }
-       return (icn_card *) 0;
+       return (icn_card *)0;
 }
 
 /*
@@ -1458,7 +1458,7 @@ if_command(isdn_ctrl *c)
        icn_card *card = icn_findcard(c->driver);
 
        if (card)
-               return (icn_command(c, card));
+               return icn_command(c, card);
        printk(KERN_ERR
               "icn: if_command %d called with invalid driverId %d!\n",
               c->command, c->driver);
@@ -1473,7 +1473,7 @@ if_writecmd(const u_char __user *buf, int len, int id, int channel)
        if (card) {
                if (!(card->flags & ICN_FLAGS_RUNNING))
                        return -ENODEV;
-               return (icn_writecmd(buf, len, 1, card));
+               return icn_writecmd(buf, NULL, len, 1, card);
        }
        printk(KERN_ERR
               "icn: if_writecmd called with invalid driverId!\n");
@@ -1488,7 +1488,7 @@ if_readstatus(u_char __user *buf, int len, int id, int channel)
        if (card) {
                if (!(card->flags & ICN_FLAGS_RUNNING))
                        return -ENODEV;
-               return (icn_readstatus(buf, len, card));
+               return icn_readstatus(buf, len, card);
        }
        printk(KERN_ERR
               "icn: if_readstatus called with invalid driverId!\n");
@@ -1503,7 +1503,7 @@ if_sendbuf(int id, int channel, int ack, struct sk_buff *skb)
        if (card) {
                if (!(card->flags & ICN_FLAGS_RUNNING))
                        return -ENODEV;
-               return (icn_sendbuf(channel, ack, skb, card));
+               return icn_sendbuf(channel, ack, skb, card);
        }
        printk(KERN_ERR
               "icn: if_sendbuf called with invalid driverId!\n");
@@ -1520,10 +1520,11 @@ icn_initcard(int port, char *id)
        icn_card *card;
        int i;
 
-       if (!(card = kzalloc(sizeof(icn_card), GFP_KERNEL))) {
+       card = kzalloc(sizeof(icn_card), GFP_KERNEL);
+       if (!card) {
                printk(KERN_WARNING
                       "icn: (%s) Could not allocate card-struct.\n", id);
-               return (icn_card *) 0;
+               return (icn_card *)0;
        }
        spin_lock_init(&card->lock);
        card->port = port;
@@ -1555,7 +1556,7 @@ icn_initcard(int port, char *id)
                printk(KERN_WARNING
                       "icn: Unable to register %s\n", id);
                kfree(card);
-               return (icn_card *) 0;
+               return (icn_card *)0;
        }
        card->myid = card->interface.channels;
        sprintf(card->regname, "icn-isdn (%s)", card->interface.id);
@@ -1568,16 +1569,17 @@ icn_addcard(int port, char *id1, char *id2)
        icn_card *card;
        icn_card *card2;
 
-       if (!(card = icn_initcard(port, id1))) {
+       card = icn_initcard(port, id1);
+       if (!card)
                return -EIO;
-       }
        if (!strlen(id2)) {
                printk(KERN_INFO
                       "icn: (%s) ICN-2B, port 0x%x added\n",
                       card->interface.id, port);
                return 0;
        }
-       if (!(card2 = icn_initcard(port, id2))) {
+       card2 = icn_initcard(port, id2);
+       if (!card2) {
                printk(KERN_INFO
                       "icn: (%s) half ICN-4B, port 0x%x added\n", id2, port);
                return 0;
@@ -1611,13 +1613,14 @@ icn_setup(char *line)
        if (str && *str) {
                strlcpy(sid, str, sizeof(sid));
                icn_id = sid;
-               if ((p = strchr(sid, ','))) {
+               p = strchr(sid, ',');
+               if (p) {
                        *p++ = 0;
                        strcpy(sid2, p);
                        icn_id2 = sid2;
                }
        }
-       return (1);
+       return 1;
 }
 __setup("icn=", icn_setup);
 #endif /* MODULE */
@@ -1634,7 +1637,8 @@ static int __init icn_init(void)
        dev.firstload = 1;
        spin_lock_init(&dev.devlock);
 
-       if ((p = strchr(revision, ':'))) {
+       p = strchr(revision, ':');
+       if (p) {
                strncpy(rev, p + 1, 20);
                rev[20] = '\0';
                p = strchr(rev, '$');
@@ -1644,7 +1648,7 @@ static int __init icn_init(void)
                strcpy(rev, " ??? ");
        printk(KERN_NOTICE "ICN-ISDN-driver Rev%smem=0x%08lx\n", rev,
               dev.memaddr);
-       return (icn_addcard(portbase, icn_id, icn_id2));
+       return icn_addcard(portbase, icn_id, icn_id2);
 }
 
 static void __exit icn_exit(void)
This page took 0.03954 seconds and 5 git commands to generate.