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