linux/drivers/net/can/slcan.c
<<
>>
Prefs
   1/*
   2 * slcan.c - serial line CAN interface driver (using tty line discipline)
   3 *
   4 * This file is derived from linux/drivers/net/slip/slip.c
   5 *
   6 * slip.c Authors  : Laurence Culhane <loz@holmes.demon.co.uk>
   7 *                   Fred N. van Kempen <waltje@uwalt.nl.mugnet.org>
   8 * slcan.c Author  : Oliver Hartkopp <socketcan@hartkopp.net>
   9 *
  10 * This program is free software; you can redistribute it and/or modify it
  11 * under the terms of the GNU General Public License as published by the
  12 * Free Software Foundation; either version 2 of the License, or (at your
  13 * option) any later version.
  14 *
  15 * This program is distributed in the hope that it will be useful, but
  16 * WITHOUT ANY WARRANTY; without even the implied warranty of
  17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  18 * General Public License for more details.
  19 *
  20 * You should have received a copy of the GNU General Public License along
  21 * with this program; if not, see http://www.gnu.org/licenses/gpl.html
  22 *
  23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  24 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  25 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  26 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  27 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  28 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  29 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  30 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  31 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  32 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  33 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
  34 * DAMAGE.
  35 *
  36 */
  37
  38#include <linux/module.h>
  39#include <linux/moduleparam.h>
  40
  41#include <linux/uaccess.h>
  42#include <linux/bitops.h>
  43#include <linux/string.h>
  44#include <linux/tty.h>
  45#include <linux/errno.h>
  46#include <linux/netdevice.h>
  47#include <linux/skbuff.h>
  48#include <linux/rtnetlink.h>
  49#include <linux/if_arp.h>
  50#include <linux/if_ether.h>
  51#include <linux/sched.h>
  52#include <linux/delay.h>
  53#include <linux/init.h>
  54#include <linux/kernel.h>
  55#include <linux/workqueue.h>
  56#include <linux/can.h>
  57#include <linux/can/skb.h>
  58
  59MODULE_ALIAS_LDISC(N_SLCAN);
  60MODULE_DESCRIPTION("serial line CAN interface");
  61MODULE_LICENSE("GPL");
  62MODULE_AUTHOR("Oliver Hartkopp <socketcan@hartkopp.net>");
  63
  64#define SLCAN_MAGIC 0x53CA
  65
  66static int maxdev = 10;         /* MAX number of SLCAN channels;
  67                                   This can be overridden with
  68                                   insmod slcan.ko maxdev=nnn   */
  69module_param(maxdev, int, 0);
  70MODULE_PARM_DESC(maxdev, "Maximum number of slcan interfaces");
  71
  72/* maximum rx buffer len: extended CAN frame with timestamp */
  73#define SLC_MTU (sizeof("T1111222281122334455667788EA5F\r")+1)
  74
  75#define SLC_CMD_LEN 1
  76#define SLC_SFF_ID_LEN 3
  77#define SLC_EFF_ID_LEN 8
  78
  79struct slcan {
  80        int                     magic;
  81
  82        /* Various fields. */
  83        struct tty_struct       *tty;           /* ptr to TTY structure      */
  84        struct net_device       *dev;           /* easy for intr handling    */
  85        spinlock_t              lock;
  86        struct work_struct      tx_work;        /* Flushes transmit buffer   */
  87
  88        /* These are pointers to the malloc()ed frame buffers. */
  89        unsigned char           rbuff[SLC_MTU]; /* receiver buffer           */
  90        int                     rcount;         /* received chars counter    */
  91        unsigned char           xbuff[SLC_MTU]; /* transmitter buffer        */
  92        unsigned char           *xhead;         /* pointer to next XMIT byte */
  93        int                     xleft;          /* bytes left in XMIT queue  */
  94
  95        unsigned long           flags;          /* Flag values/ mode etc     */
  96#define SLF_INUSE               0               /* Channel in use            */
  97#define SLF_ERROR               1               /* Parity, etc. error        */
  98};
  99
 100static struct net_device **slcan_devs;
 101
 102 /************************************************************************
 103  *                     SLCAN ENCAPSULATION FORMAT                       *
 104  ************************************************************************/
 105
 106/*
 107 * A CAN frame has a can_id (11 bit standard frame format OR 29 bit extended
 108 * frame format) a data length code (can_dlc) which can be from 0 to 8
 109 * and up to <can_dlc> data bytes as payload.
 110 * Additionally a CAN frame may become a remote transmission frame if the
 111 * RTR-bit is set. This causes another ECU to send a CAN frame with the
 112 * given can_id.
 113 *
 114 * The SLCAN ASCII representation of these different frame types is:
 115 * <type> <id> <dlc> <data>*
 116 *
 117 * Extended frames (29 bit) are defined by capital characters in the type.
 118 * RTR frames are defined as 'r' types - normal frames have 't' type:
 119 * t => 11 bit data frame
 120 * r => 11 bit RTR frame
 121 * T => 29 bit data frame
 122 * R => 29 bit RTR frame
 123 *
 124 * The <id> is 3 (standard) or 8 (extended) bytes in ASCII Hex (base64).
 125 * The <dlc> is a one byte ASCII number ('0' - '8')
 126 * The <data> section has at much ASCII Hex bytes as defined by the <dlc>
 127 *
 128 * Examples:
 129 *
 130 * t1230 : can_id 0x123, can_dlc 0, no data
 131 * t4563112233 : can_id 0x456, can_dlc 3, data 0x11 0x22 0x33
 132 * T12ABCDEF2AA55 : extended can_id 0x12ABCDEF, can_dlc 2, data 0xAA 0x55
 133 * r1230 : can_id 0x123, can_dlc 0, no data, remote transmission request
 134 *
 135 */
 136
 137 /************************************************************************
 138  *                     STANDARD SLCAN DECAPSULATION                     *
 139  ************************************************************************/
 140
 141/* Send one completely decapsulated can_frame to the network layer */
 142static void slc_bump(struct slcan *sl)
 143{
 144        struct sk_buff *skb;
 145        struct can_frame cf;
 146        int i, tmp;
 147        u32 tmpid;
 148        char *cmd = sl->rbuff;
 149
 150        cf.can_id = 0;
 151
 152        switch (*cmd) {
 153        case 'r':
 154                cf.can_id = CAN_RTR_FLAG;
 155                /* fallthrough */
 156        case 't':
 157                /* store dlc ASCII value and terminate SFF CAN ID string */
 158                cf.can_dlc = sl->rbuff[SLC_CMD_LEN + SLC_SFF_ID_LEN];
 159                sl->rbuff[SLC_CMD_LEN + SLC_SFF_ID_LEN] = 0;
 160                /* point to payload data behind the dlc */
 161                cmd += SLC_CMD_LEN + SLC_SFF_ID_LEN + 1;
 162                break;
 163        case 'R':
 164                cf.can_id = CAN_RTR_FLAG;
 165                /* fallthrough */
 166        case 'T':
 167                cf.can_id |= CAN_EFF_FLAG;
 168                /* store dlc ASCII value and terminate EFF CAN ID string */
 169                cf.can_dlc = sl->rbuff[SLC_CMD_LEN + SLC_EFF_ID_LEN];
 170                sl->rbuff[SLC_CMD_LEN + SLC_EFF_ID_LEN] = 0;
 171                /* point to payload data behind the dlc */
 172                cmd += SLC_CMD_LEN + SLC_EFF_ID_LEN + 1;
 173                break;
 174        default:
 175                return;
 176        }
 177
 178        if (kstrtou32(sl->rbuff + SLC_CMD_LEN, 16, &tmpid))
 179                return;
 180
 181        cf.can_id |= tmpid;
 182
 183        /* get can_dlc from sanitized ASCII value */
 184        if (cf.can_dlc >= '0' && cf.can_dlc < '9')
 185                cf.can_dlc -= '0';
 186        else
 187                return;
 188
 189        *(u64 *) (&cf.data) = 0; /* clear payload */
 190
 191        /* RTR frames may have a dlc > 0 but they never have any data bytes */
 192        if (!(cf.can_id & CAN_RTR_FLAG)) {
 193                for (i = 0; i < cf.can_dlc; i++) {
 194                        tmp = hex_to_bin(*cmd++);
 195                        if (tmp < 0)
 196                                return;
 197                        cf.data[i] = (tmp << 4);
 198                        tmp = hex_to_bin(*cmd++);
 199                        if (tmp < 0)
 200                                return;
 201                        cf.data[i] |= tmp;
 202                }
 203        }
 204
 205        skb = dev_alloc_skb(sizeof(struct can_frame) +
 206                            sizeof(struct can_skb_priv));
 207        if (!skb)
 208                return;
 209
 210        skb->dev = sl->dev;
 211        skb->protocol = htons(ETH_P_CAN);
 212        skb->pkt_type = PACKET_BROADCAST;
 213        skb->ip_summed = CHECKSUM_UNNECESSARY;
 214
 215        can_skb_reserve(skb);
 216        can_skb_prv(skb)->ifindex = sl->dev->ifindex;
 217        can_skb_prv(skb)->skbcnt = 0;
 218
 219        skb_put_data(skb, &cf, sizeof(struct can_frame));
 220
 221        sl->dev->stats.rx_packets++;
 222        sl->dev->stats.rx_bytes += cf.can_dlc;
 223        netif_rx_ni(skb);
 224}
 225
 226/* parse tty input stream */
 227static void slcan_unesc(struct slcan *sl, unsigned char s)
 228{
 229        if ((s == '\r') || (s == '\a')) { /* CR or BEL ends the pdu */
 230                if (!test_and_clear_bit(SLF_ERROR, &sl->flags) &&
 231                    (sl->rcount > 4))  {
 232                        slc_bump(sl);
 233                }
 234                sl->rcount = 0;
 235        } else {
 236                if (!test_bit(SLF_ERROR, &sl->flags))  {
 237                        if (sl->rcount < SLC_MTU)  {
 238                                sl->rbuff[sl->rcount++] = s;
 239                                return;
 240                        } else {
 241                                sl->dev->stats.rx_over_errors++;
 242                                set_bit(SLF_ERROR, &sl->flags);
 243                        }
 244                }
 245        }
 246}
 247
 248 /************************************************************************
 249  *                     STANDARD SLCAN ENCAPSULATION                     *
 250  ************************************************************************/
 251
 252/* Encapsulate one can_frame and stuff into a TTY queue. */
 253static void slc_encaps(struct slcan *sl, struct can_frame *cf)
 254{
 255        int actual, i;
 256        unsigned char *pos;
 257        unsigned char *endpos;
 258        canid_t id = cf->can_id;
 259
 260        pos = sl->xbuff;
 261
 262        if (cf->can_id & CAN_RTR_FLAG)
 263                *pos = 'R'; /* becomes 'r' in standard frame format (SFF) */
 264        else
 265                *pos = 'T'; /* becomes 't' in standard frame format (SSF) */
 266
 267        /* determine number of chars for the CAN-identifier */
 268        if (cf->can_id & CAN_EFF_FLAG) {
 269                id &= CAN_EFF_MASK;
 270                endpos = pos + SLC_EFF_ID_LEN;
 271        } else {
 272                *pos |= 0x20; /* convert R/T to lower case for SFF */
 273                id &= CAN_SFF_MASK;
 274                endpos = pos + SLC_SFF_ID_LEN;
 275        }
 276
 277        /* build 3 (SFF) or 8 (EFF) digit CAN identifier */
 278        pos++;
 279        while (endpos >= pos) {
 280                *endpos-- = hex_asc_upper[id & 0xf];
 281                id >>= 4;
 282        }
 283
 284        pos += (cf->can_id & CAN_EFF_FLAG) ? SLC_EFF_ID_LEN : SLC_SFF_ID_LEN;
 285
 286        *pos++ = cf->can_dlc + '0';
 287
 288        /* RTR frames may have a dlc > 0 but they never have any data bytes */
 289        if (!(cf->can_id & CAN_RTR_FLAG)) {
 290                for (i = 0; i < cf->can_dlc; i++)
 291                        pos = hex_byte_pack_upper(pos, cf->data[i]);
 292        }
 293
 294        *pos++ = '\r';
 295
 296        /* Order of next two lines is *very* important.
 297         * When we are sending a little amount of data,
 298         * the transfer may be completed inside the ops->write()
 299         * routine, because it's running with interrupts enabled.
 300         * In this case we *never* got WRITE_WAKEUP event,
 301         * if we did not request it before write operation.
 302         *       14 Oct 1994  Dmitry Gorodchanin.
 303         */
 304        set_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags);
 305        actual = sl->tty->ops->write(sl->tty, sl->xbuff, pos - sl->xbuff);
 306        sl->xleft = (pos - sl->xbuff) - actual;
 307        sl->xhead = sl->xbuff + actual;
 308        sl->dev->stats.tx_bytes += cf->can_dlc;
 309}
 310
 311/* Write out any remaining transmit buffer. Scheduled when tty is writable */
 312static void slcan_transmit(struct work_struct *work)
 313{
 314        struct slcan *sl = container_of(work, struct slcan, tx_work);
 315        int actual;
 316
 317        spin_lock_bh(&sl->lock);
 318        /* First make sure we're connected. */
 319        if (!sl->tty || sl->magic != SLCAN_MAGIC || !netif_running(sl->dev)) {
 320                spin_unlock_bh(&sl->lock);
 321                return;
 322        }
 323
 324        if (sl->xleft <= 0)  {
 325                /* Now serial buffer is almost free & we can start
 326                 * transmission of another packet */
 327                sl->dev->stats.tx_packets++;
 328                clear_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags);
 329                spin_unlock_bh(&sl->lock);
 330                netif_wake_queue(sl->dev);
 331                return;
 332        }
 333
 334        actual = sl->tty->ops->write(sl->tty, sl->xhead, sl->xleft);
 335        sl->xleft -= actual;
 336        sl->xhead += actual;
 337        spin_unlock_bh(&sl->lock);
 338}
 339
 340/*
 341 * Called by the driver when there's room for more data.
 342 * Schedule the transmit.
 343 */
 344static void slcan_write_wakeup(struct tty_struct *tty)
 345{
 346        struct slcan *sl = tty->disc_data;
 347
 348        schedule_work(&sl->tx_work);
 349}
 350
 351/* Send a can_frame to a TTY queue. */
 352static netdev_tx_t slc_xmit(struct sk_buff *skb, struct net_device *dev)
 353{
 354        struct slcan *sl = netdev_priv(dev);
 355
 356        if (skb->len != CAN_MTU)
 357                goto out;
 358
 359        spin_lock(&sl->lock);
 360        if (!netif_running(dev))  {
 361                spin_unlock(&sl->lock);
 362                printk(KERN_WARNING "%s: xmit: iface is down\n", dev->name);
 363                goto out;
 364        }
 365        if (sl->tty == NULL) {
 366                spin_unlock(&sl->lock);
 367                goto out;
 368        }
 369
 370        netif_stop_queue(sl->dev);
 371        slc_encaps(sl, (struct can_frame *) skb->data); /* encaps & send */
 372        spin_unlock(&sl->lock);
 373
 374out:
 375        kfree_skb(skb);
 376        return NETDEV_TX_OK;
 377}
 378
 379
 380/******************************************
 381 *   Routines looking at netdevice side.
 382 ******************************************/
 383
 384/* Netdevice UP -> DOWN routine */
 385static int slc_close(struct net_device *dev)
 386{
 387        struct slcan *sl = netdev_priv(dev);
 388
 389        spin_lock_bh(&sl->lock);
 390        if (sl->tty) {
 391                /* TTY discipline is running. */
 392                clear_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags);
 393        }
 394        netif_stop_queue(dev);
 395        sl->rcount   = 0;
 396        sl->xleft    = 0;
 397        spin_unlock_bh(&sl->lock);
 398
 399        return 0;
 400}
 401
 402/* Netdevice DOWN -> UP routine */
 403static int slc_open(struct net_device *dev)
 404{
 405        struct slcan *sl = netdev_priv(dev);
 406
 407        if (sl->tty == NULL)
 408                return -ENODEV;
 409
 410        sl->flags &= (1 << SLF_INUSE);
 411        netif_start_queue(dev);
 412        return 0;
 413}
 414
 415/* Hook the destructor so we can free slcan devs at the right point in time */
 416static void slc_free_netdev(struct net_device *dev)
 417{
 418        int i = dev->base_addr;
 419
 420        slcan_devs[i] = NULL;
 421}
 422
 423static int slcan_change_mtu(struct net_device *dev, int new_mtu)
 424{
 425        return -EINVAL;
 426}
 427
 428static const struct net_device_ops slc_netdev_ops = {
 429        .ndo_open               = slc_open,
 430        .ndo_stop               = slc_close,
 431        .ndo_start_xmit         = slc_xmit,
 432        .ndo_change_mtu         = slcan_change_mtu,
 433};
 434
 435static void slc_setup(struct net_device *dev)
 436{
 437        dev->netdev_ops         = &slc_netdev_ops;
 438        dev->needs_free_netdev  = true;
 439        dev->priv_destructor    = slc_free_netdev;
 440
 441        dev->hard_header_len    = 0;
 442        dev->addr_len           = 0;
 443        dev->tx_queue_len       = 10;
 444
 445        dev->mtu                = CAN_MTU;
 446        dev->type               = ARPHRD_CAN;
 447
 448        /* New-style flags. */
 449        dev->flags              = IFF_NOARP;
 450        dev->features           = NETIF_F_HW_CSUM;
 451}
 452
 453/******************************************
 454  Routines looking at TTY side.
 455 ******************************************/
 456
 457/*
 458 * Handle the 'receiver data ready' interrupt.
 459 * This function is called by the 'tty_io' module in the kernel when
 460 * a block of SLCAN data has been received, which can now be decapsulated
 461 * and sent on to some IP layer for further processing. This will not
 462 * be re-entered while running but other ldisc functions may be called
 463 * in parallel
 464 */
 465
 466static void slcan_receive_buf(struct tty_struct *tty,
 467                              const unsigned char *cp, char *fp, int count)
 468{
 469        struct slcan *sl = (struct slcan *) tty->disc_data;
 470
 471        if (!sl || sl->magic != SLCAN_MAGIC || !netif_running(sl->dev))
 472                return;
 473
 474        /* Read the characters out of the buffer */
 475        while (count--) {
 476                if (fp && *fp++) {
 477                        if (!test_and_set_bit(SLF_ERROR, &sl->flags))
 478                                sl->dev->stats.rx_errors++;
 479                        cp++;
 480                        continue;
 481                }
 482                slcan_unesc(sl, *cp++);
 483        }
 484}
 485
 486/************************************
 487 *  slcan_open helper routines.
 488 ************************************/
 489
 490/* Collect hanged up channels */
 491static void slc_sync(void)
 492{
 493        int i;
 494        struct net_device *dev;
 495        struct slcan      *sl;
 496
 497        for (i = 0; i < maxdev; i++) {
 498                dev = slcan_devs[i];
 499                if (dev == NULL)
 500                        break;
 501
 502                sl = netdev_priv(dev);
 503                if (sl->tty)
 504                        continue;
 505                if (dev->flags & IFF_UP)
 506                        dev_close(dev);
 507        }
 508}
 509
 510/* Find a free SLCAN channel, and link in this `tty' line. */
 511static struct slcan *slc_alloc(dev_t line)
 512{
 513        int i;
 514        char name[IFNAMSIZ];
 515        struct net_device *dev = NULL;
 516        struct slcan       *sl;
 517
 518        for (i = 0; i < maxdev; i++) {
 519                dev = slcan_devs[i];
 520                if (dev == NULL)
 521                        break;
 522
 523        }
 524
 525        /* Sorry, too many, all slots in use */
 526        if (i >= maxdev)
 527                return NULL;
 528
 529        sprintf(name, "slcan%d", i);
 530        dev = alloc_netdev(sizeof(*sl), name, NET_NAME_UNKNOWN, slc_setup);
 531        if (!dev)
 532                return NULL;
 533
 534        dev->base_addr  = i;
 535        sl = netdev_priv(dev);
 536
 537        /* Initialize channel control data */
 538        sl->magic = SLCAN_MAGIC;
 539        sl->dev = dev;
 540        spin_lock_init(&sl->lock);
 541        INIT_WORK(&sl->tx_work, slcan_transmit);
 542        slcan_devs[i] = dev;
 543
 544        return sl;
 545}
 546
 547/*
 548 * Open the high-level part of the SLCAN channel.
 549 * This function is called by the TTY module when the
 550 * SLCAN line discipline is called for.  Because we are
 551 * sure the tty line exists, we only have to link it to
 552 * a free SLCAN channel...
 553 *
 554 * Called in process context serialized from other ldisc calls.
 555 */
 556
 557static int slcan_open(struct tty_struct *tty)
 558{
 559        struct slcan *sl;
 560        int err;
 561
 562        if (!capable(CAP_NET_ADMIN))
 563                return -EPERM;
 564
 565        if (tty->ops->write == NULL)
 566                return -EOPNOTSUPP;
 567
 568        /* RTnetlink lock is misused here to serialize concurrent
 569           opens of slcan channels. There are better ways, but it is
 570           the simplest one.
 571         */
 572        rtnl_lock();
 573
 574        /* Collect hanged up channels. */
 575        slc_sync();
 576
 577        sl = tty->disc_data;
 578
 579        err = -EEXIST;
 580        /* First make sure we're not already connected. */
 581        if (sl && sl->magic == SLCAN_MAGIC)
 582                goto err_exit;
 583
 584        /* OK.  Find a free SLCAN channel to use. */
 585        err = -ENFILE;
 586        sl = slc_alloc(tty_devnum(tty));
 587        if (sl == NULL)
 588                goto err_exit;
 589
 590        sl->tty = tty;
 591        tty->disc_data = sl;
 592
 593        if (!test_bit(SLF_INUSE, &sl->flags)) {
 594                /* Perform the low-level SLCAN initialization. */
 595                sl->rcount   = 0;
 596                sl->xleft    = 0;
 597
 598                set_bit(SLF_INUSE, &sl->flags);
 599
 600                err = register_netdevice(sl->dev);
 601                if (err)
 602                        goto err_free_chan;
 603        }
 604
 605        /* Done.  We have linked the TTY line to a channel. */
 606        rtnl_unlock();
 607        tty->receive_room = 65536;      /* We don't flow control */
 608
 609        /* TTY layer expects 0 on success */
 610        return 0;
 611
 612err_free_chan:
 613        sl->tty = NULL;
 614        tty->disc_data = NULL;
 615        clear_bit(SLF_INUSE, &sl->flags);
 616
 617err_exit:
 618        rtnl_unlock();
 619
 620        /* Count references from TTY module */
 621        return err;
 622}
 623
 624/*
 625 * Close down a SLCAN channel.
 626 * This means flushing out any pending queues, and then returning. This
 627 * call is serialized against other ldisc functions.
 628 *
 629 * We also use this method for a hangup event.
 630 */
 631
 632static void slcan_close(struct tty_struct *tty)
 633{
 634        struct slcan *sl = (struct slcan *) tty->disc_data;
 635
 636        /* First make sure we're connected. */
 637        if (!sl || sl->magic != SLCAN_MAGIC || sl->tty != tty)
 638                return;
 639
 640        spin_lock_bh(&sl->lock);
 641        tty->disc_data = NULL;
 642        sl->tty = NULL;
 643        spin_unlock_bh(&sl->lock);
 644
 645        flush_work(&sl->tx_work);
 646
 647        /* Flush network side */
 648        unregister_netdev(sl->dev);
 649        /* This will complete via sl_free_netdev */
 650}
 651
 652static int slcan_hangup(struct tty_struct *tty)
 653{
 654        slcan_close(tty);
 655        return 0;
 656}
 657
 658/* Perform I/O control on an active SLCAN channel. */
 659static int slcan_ioctl(struct tty_struct *tty, struct file *file,
 660                       unsigned int cmd, unsigned long arg)
 661{
 662        struct slcan *sl = (struct slcan *) tty->disc_data;
 663        unsigned int tmp;
 664
 665        /* First make sure we're connected. */
 666        if (!sl || sl->magic != SLCAN_MAGIC)
 667                return -EINVAL;
 668
 669        switch (cmd) {
 670        case SIOCGIFNAME:
 671                tmp = strlen(sl->dev->name) + 1;
 672                if (copy_to_user((void __user *)arg, sl->dev->name, tmp))
 673                        return -EFAULT;
 674                return 0;
 675
 676        case SIOCSIFHWADDR:
 677                return -EINVAL;
 678
 679        default:
 680                return tty_mode_ioctl(tty, file, cmd, arg);
 681        }
 682}
 683
 684static struct tty_ldisc_ops slc_ldisc = {
 685        .owner          = THIS_MODULE,
 686        .magic          = TTY_LDISC_MAGIC,
 687        .name           = "slcan",
 688        .open           = slcan_open,
 689        .close          = slcan_close,
 690        .hangup         = slcan_hangup,
 691        .ioctl          = slcan_ioctl,
 692        .receive_buf    = slcan_receive_buf,
 693        .write_wakeup   = slcan_write_wakeup,
 694};
 695
 696static int __init slcan_init(void)
 697{
 698        int status;
 699
 700        if (maxdev < 4)
 701                maxdev = 4; /* Sanity */
 702
 703        pr_info("slcan: serial line CAN interface driver\n");
 704        pr_info("slcan: %d dynamic interface channels.\n", maxdev);
 705
 706        slcan_devs = kzalloc(sizeof(struct net_device *)*maxdev, GFP_KERNEL);
 707        if (!slcan_devs)
 708                return -ENOMEM;
 709
 710        /* Fill in our line protocol discipline, and register it */
 711        status = tty_register_ldisc(N_SLCAN, &slc_ldisc);
 712        if (status)  {
 713                printk(KERN_ERR "slcan: can't register line discipline\n");
 714                kfree(slcan_devs);
 715        }
 716        return status;
 717}
 718
 719static void __exit slcan_exit(void)
 720{
 721        int i;
 722        struct net_device *dev;
 723        struct slcan *sl;
 724        unsigned long timeout = jiffies + HZ;
 725        int busy = 0;
 726
 727        if (slcan_devs == NULL)
 728                return;
 729
 730        /* First of all: check for active disciplines and hangup them.
 731         */
 732        do {
 733                if (busy)
 734                        msleep_interruptible(100);
 735
 736                busy = 0;
 737                for (i = 0; i < maxdev; i++) {
 738                        dev = slcan_devs[i];
 739                        if (!dev)
 740                                continue;
 741                        sl = netdev_priv(dev);
 742                        spin_lock_bh(&sl->lock);
 743                        if (sl->tty) {
 744                                busy++;
 745                                tty_hangup(sl->tty);
 746                        }
 747                        spin_unlock_bh(&sl->lock);
 748                }
 749        } while (busy && time_before(jiffies, timeout));
 750
 751        /* FIXME: hangup is async so we should wait when doing this second
 752           phase */
 753
 754        for (i = 0; i < maxdev; i++) {
 755                dev = slcan_devs[i];
 756                if (!dev)
 757                        continue;
 758                slcan_devs[i] = NULL;
 759
 760                sl = netdev_priv(dev);
 761                if (sl->tty) {
 762                        printk(KERN_ERR "%s: tty discipline still running\n",
 763                               dev->name);
 764                }
 765
 766                unregister_netdev(dev);
 767        }
 768
 769        kfree(slcan_devs);
 770        slcan_devs = NULL;
 771
 772        i = tty_unregister_ldisc(N_SLCAN);
 773        if (i)
 774                printk(KERN_ERR "slcan: can't unregister ldisc (err %d)\n", i);
 775}
 776
 777module_init(slcan_init);
 778module_exit(slcan_exit);
 779