linux/drivers/usb/gadget/function/f_phonet.c
<<
>>
Prefs
   1/*
   2 * f_phonet.c -- USB CDC Phonet function
   3 *
   4 * Copyright (C) 2007-2008 Nokia Corporation. All rights reserved.
   5 *
   6 * Author: Rémi Denis-Courmont
   7 *
   8 * This program is free software; you can redistribute it and/or
   9 * modify it under the terms of the GNU General Public License
  10 * version 2 as published by the Free Software Foundation.
  11 */
  12
  13#include <linux/mm.h>
  14#include <linux/slab.h>
  15#include <linux/kernel.h>
  16#include <linux/module.h>
  17#include <linux/device.h>
  18
  19#include <linux/netdevice.h>
  20#include <linux/if_ether.h>
  21#include <linux/if_phonet.h>
  22#include <linux/if_arp.h>
  23
  24#include <linux/usb/ch9.h>
  25#include <linux/usb/cdc.h>
  26#include <linux/usb/composite.h>
  27
  28#include "u_phonet.h"
  29#include "u_ether.h"
  30
  31#define PN_MEDIA_USB    0x1B
  32#define MAXPACKET       512
  33#if (PAGE_SIZE % MAXPACKET)
  34#error MAXPACKET must divide PAGE_SIZE!
  35#endif
  36
  37/*-------------------------------------------------------------------------*/
  38
  39struct phonet_port {
  40        struct f_phonet                 *usb;
  41        spinlock_t                      lock;
  42};
  43
  44struct f_phonet {
  45        struct usb_function             function;
  46        struct {
  47                struct sk_buff          *skb;
  48                spinlock_t              lock;
  49        } rx;
  50        struct net_device               *dev;
  51        struct usb_ep                   *in_ep, *out_ep;
  52
  53        struct usb_request              *in_req;
  54        struct usb_request              *out_reqv[0];
  55};
  56
  57static int phonet_rxq_size = 17;
  58
  59static inline struct f_phonet *func_to_pn(struct usb_function *f)
  60{
  61        return container_of(f, struct f_phonet, function);
  62}
  63
  64/*-------------------------------------------------------------------------*/
  65
  66#define USB_CDC_SUBCLASS_PHONET 0xfe
  67#define USB_CDC_PHONET_TYPE     0xab
  68
  69static struct usb_interface_descriptor
  70pn_control_intf_desc = {
  71        .bLength =              sizeof pn_control_intf_desc,
  72        .bDescriptorType =      USB_DT_INTERFACE,
  73
  74        /* .bInterfaceNumber =  DYNAMIC, */
  75        .bInterfaceClass =      USB_CLASS_COMM,
  76        .bInterfaceSubClass =   USB_CDC_SUBCLASS_PHONET,
  77};
  78
  79static const struct usb_cdc_header_desc
  80pn_header_desc = {
  81        .bLength =              sizeof pn_header_desc,
  82        .bDescriptorType =      USB_DT_CS_INTERFACE,
  83        .bDescriptorSubType =   USB_CDC_HEADER_TYPE,
  84        .bcdCDC =               cpu_to_le16(0x0110),
  85};
  86
  87static const struct usb_cdc_header_desc
  88pn_phonet_desc = {
  89        .bLength =              sizeof pn_phonet_desc,
  90        .bDescriptorType =      USB_DT_CS_INTERFACE,
  91        .bDescriptorSubType =   USB_CDC_PHONET_TYPE,
  92        .bcdCDC =               cpu_to_le16(0x1505), /* ??? */
  93};
  94
  95static struct usb_cdc_union_desc
  96pn_union_desc = {
  97        .bLength =              sizeof pn_union_desc,
  98        .bDescriptorType =      USB_DT_CS_INTERFACE,
  99        .bDescriptorSubType =   USB_CDC_UNION_TYPE,
 100
 101        /* .bMasterInterface0 = DYNAMIC, */
 102        /* .bSlaveInterface0 =  DYNAMIC, */
 103};
 104
 105static struct usb_interface_descriptor
 106pn_data_nop_intf_desc = {
 107        .bLength =              sizeof pn_data_nop_intf_desc,
 108        .bDescriptorType =      USB_DT_INTERFACE,
 109
 110        /* .bInterfaceNumber =  DYNAMIC, */
 111        .bAlternateSetting =    0,
 112        .bNumEndpoints =        0,
 113        .bInterfaceClass =      USB_CLASS_CDC_DATA,
 114};
 115
 116static struct usb_interface_descriptor
 117pn_data_intf_desc = {
 118        .bLength =              sizeof pn_data_intf_desc,
 119        .bDescriptorType =      USB_DT_INTERFACE,
 120
 121        /* .bInterfaceNumber =  DYNAMIC, */
 122        .bAlternateSetting =    1,
 123        .bNumEndpoints =        2,
 124        .bInterfaceClass =      USB_CLASS_CDC_DATA,
 125};
 126
 127static struct usb_endpoint_descriptor
 128pn_fs_sink_desc = {
 129        .bLength =              USB_DT_ENDPOINT_SIZE,
 130        .bDescriptorType =      USB_DT_ENDPOINT,
 131
 132        .bEndpointAddress =     USB_DIR_OUT,
 133        .bmAttributes =         USB_ENDPOINT_XFER_BULK,
 134};
 135
 136static struct usb_endpoint_descriptor
 137pn_hs_sink_desc = {
 138        .bLength =              USB_DT_ENDPOINT_SIZE,
 139        .bDescriptorType =      USB_DT_ENDPOINT,
 140
 141        .bEndpointAddress =     USB_DIR_OUT,
 142        .bmAttributes =         USB_ENDPOINT_XFER_BULK,
 143        .wMaxPacketSize =       cpu_to_le16(MAXPACKET),
 144};
 145
 146static struct usb_endpoint_descriptor
 147pn_fs_source_desc = {
 148        .bLength =              USB_DT_ENDPOINT_SIZE,
 149        .bDescriptorType =      USB_DT_ENDPOINT,
 150
 151        .bEndpointAddress =     USB_DIR_IN,
 152        .bmAttributes =         USB_ENDPOINT_XFER_BULK,
 153};
 154
 155static struct usb_endpoint_descriptor
 156pn_hs_source_desc = {
 157        .bLength =              USB_DT_ENDPOINT_SIZE,
 158        .bDescriptorType =      USB_DT_ENDPOINT,
 159
 160        .bEndpointAddress =     USB_DIR_IN,
 161        .bmAttributes =         USB_ENDPOINT_XFER_BULK,
 162        .wMaxPacketSize =       cpu_to_le16(512),
 163};
 164
 165static struct usb_descriptor_header *fs_pn_function[] = {
 166        (struct usb_descriptor_header *) &pn_control_intf_desc,
 167        (struct usb_descriptor_header *) &pn_header_desc,
 168        (struct usb_descriptor_header *) &pn_phonet_desc,
 169        (struct usb_descriptor_header *) &pn_union_desc,
 170        (struct usb_descriptor_header *) &pn_data_nop_intf_desc,
 171        (struct usb_descriptor_header *) &pn_data_intf_desc,
 172        (struct usb_descriptor_header *) &pn_fs_sink_desc,
 173        (struct usb_descriptor_header *) &pn_fs_source_desc,
 174        NULL,
 175};
 176
 177static struct usb_descriptor_header *hs_pn_function[] = {
 178        (struct usb_descriptor_header *) &pn_control_intf_desc,
 179        (struct usb_descriptor_header *) &pn_header_desc,
 180        (struct usb_descriptor_header *) &pn_phonet_desc,
 181        (struct usb_descriptor_header *) &pn_union_desc,
 182        (struct usb_descriptor_header *) &pn_data_nop_intf_desc,
 183        (struct usb_descriptor_header *) &pn_data_intf_desc,
 184        (struct usb_descriptor_header *) &pn_hs_sink_desc,
 185        (struct usb_descriptor_header *) &pn_hs_source_desc,
 186        NULL,
 187};
 188
 189/*-------------------------------------------------------------------------*/
 190
 191static int pn_net_open(struct net_device *dev)
 192{
 193        netif_wake_queue(dev);
 194        return 0;
 195}
 196
 197static int pn_net_close(struct net_device *dev)
 198{
 199        netif_stop_queue(dev);
 200        return 0;
 201}
 202
 203static void pn_tx_complete(struct usb_ep *ep, struct usb_request *req)
 204{
 205        struct f_phonet *fp = ep->driver_data;
 206        struct net_device *dev = fp->dev;
 207        struct sk_buff *skb = req->context;
 208
 209        switch (req->status) {
 210        case 0:
 211                dev->stats.tx_packets++;
 212                dev->stats.tx_bytes += skb->len;
 213                break;
 214
 215        case -ESHUTDOWN: /* disconnected */
 216        case -ECONNRESET: /* disabled */
 217                dev->stats.tx_aborted_errors++;
 218        default:
 219                dev->stats.tx_errors++;
 220        }
 221
 222        dev_kfree_skb_any(skb);
 223        netif_wake_queue(dev);
 224}
 225
 226static int pn_net_xmit(struct sk_buff *skb, struct net_device *dev)
 227{
 228        struct phonet_port *port = netdev_priv(dev);
 229        struct f_phonet *fp;
 230        struct usb_request *req;
 231        unsigned long flags;
 232
 233        if (skb->protocol != htons(ETH_P_PHONET))
 234                goto out;
 235
 236        spin_lock_irqsave(&port->lock, flags);
 237        fp = port->usb;
 238        if (unlikely(!fp)) /* race with carrier loss */
 239                goto out_unlock;
 240
 241        req = fp->in_req;
 242        req->buf = skb->data;
 243        req->length = skb->len;
 244        req->complete = pn_tx_complete;
 245        req->zero = 1;
 246        req->context = skb;
 247
 248        if (unlikely(usb_ep_queue(fp->in_ep, req, GFP_ATOMIC)))
 249                goto out_unlock;
 250
 251        netif_stop_queue(dev);
 252        skb = NULL;
 253
 254out_unlock:
 255        spin_unlock_irqrestore(&port->lock, flags);
 256out:
 257        if (unlikely(skb)) {
 258                dev_kfree_skb(skb);
 259                dev->stats.tx_dropped++;
 260        }
 261        return NETDEV_TX_OK;
 262}
 263
 264static const struct net_device_ops pn_netdev_ops = {
 265        .ndo_open       = pn_net_open,
 266        .ndo_stop       = pn_net_close,
 267        .ndo_start_xmit = pn_net_xmit,
 268};
 269
 270static void pn_net_setup(struct net_device *dev)
 271{
 272        dev->features           = 0;
 273        dev->type               = ARPHRD_PHONET;
 274        dev->flags              = IFF_POINTOPOINT | IFF_NOARP;
 275        dev->mtu                = PHONET_DEV_MTU;
 276        dev->min_mtu            = PHONET_MIN_MTU;
 277        dev->max_mtu            = PHONET_MAX_MTU;
 278        dev->hard_header_len    = 1;
 279        dev->dev_addr[0]        = PN_MEDIA_USB;
 280        dev->addr_len           = 1;
 281        dev->tx_queue_len       = 1;
 282
 283        dev->netdev_ops         = &pn_netdev_ops;
 284        dev->needs_free_netdev  = true;
 285        dev->header_ops         = &phonet_header_ops;
 286}
 287
 288/*-------------------------------------------------------------------------*/
 289
 290/*
 291 * Queue buffer for data from the host
 292 */
 293static int
 294pn_rx_submit(struct f_phonet *fp, struct usb_request *req, gfp_t gfp_flags)
 295{
 296        struct page *page;
 297        int err;
 298
 299        page = __dev_alloc_page(gfp_flags | __GFP_NOMEMALLOC);
 300        if (!page)
 301                return -ENOMEM;
 302
 303        req->buf = page_address(page);
 304        req->length = PAGE_SIZE;
 305        req->context = page;
 306
 307        err = usb_ep_queue(fp->out_ep, req, gfp_flags);
 308        if (unlikely(err))
 309                put_page(page);
 310        return err;
 311}
 312
 313static void pn_rx_complete(struct usb_ep *ep, struct usb_request *req)
 314{
 315        struct f_phonet *fp = ep->driver_data;
 316        struct net_device *dev = fp->dev;
 317        struct page *page = req->context;
 318        struct sk_buff *skb;
 319        unsigned long flags;
 320        int status = req->status;
 321
 322        switch (status) {
 323        case 0:
 324                spin_lock_irqsave(&fp->rx.lock, flags);
 325                skb = fp->rx.skb;
 326                if (!skb)
 327                        skb = fp->rx.skb = netdev_alloc_skb(dev, 12);
 328                if (req->actual < req->length) /* Last fragment */
 329                        fp->rx.skb = NULL;
 330                spin_unlock_irqrestore(&fp->rx.lock, flags);
 331
 332                if (unlikely(!skb))
 333                        break;
 334
 335                if (skb->len == 0) { /* First fragment */
 336                        skb->protocol = htons(ETH_P_PHONET);
 337                        skb_reset_mac_header(skb);
 338                        /* Can't use pskb_pull() on page in IRQ */
 339                        skb_put_data(skb, page_address(page), 1);
 340                }
 341
 342                skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, page,
 343                                skb->len <= 1, req->actual, PAGE_SIZE);
 344                page = NULL;
 345
 346                if (req->actual < req->length) { /* Last fragment */
 347                        skb->dev = dev;
 348                        dev->stats.rx_packets++;
 349                        dev->stats.rx_bytes += skb->len;
 350
 351                        netif_rx(skb);
 352                }
 353                break;
 354
 355        /* Do not resubmit in these cases: */
 356        case -ESHUTDOWN: /* disconnect */
 357        case -ECONNABORTED: /* hw reset */
 358        case -ECONNRESET: /* dequeued (unlink or netif down) */
 359                req = NULL;
 360                break;
 361
 362        /* Do resubmit in these cases: */
 363        case -EOVERFLOW: /* request buffer overflow */
 364                dev->stats.rx_over_errors++;
 365        default:
 366                dev->stats.rx_errors++;
 367                break;
 368        }
 369
 370        if (page)
 371                put_page(page);
 372        if (req)
 373                pn_rx_submit(fp, req, GFP_ATOMIC);
 374}
 375
 376/*-------------------------------------------------------------------------*/
 377
 378static void __pn_reset(struct usb_function *f)
 379{
 380        struct f_phonet *fp = func_to_pn(f);
 381        struct net_device *dev = fp->dev;
 382        struct phonet_port *port = netdev_priv(dev);
 383
 384        netif_carrier_off(dev);
 385        port->usb = NULL;
 386
 387        usb_ep_disable(fp->out_ep);
 388        usb_ep_disable(fp->in_ep);
 389        if (fp->rx.skb) {
 390                dev_kfree_skb_irq(fp->rx.skb);
 391                fp->rx.skb = NULL;
 392        }
 393}
 394
 395static int pn_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
 396{
 397        struct f_phonet *fp = func_to_pn(f);
 398        struct usb_gadget *gadget = fp->function.config->cdev->gadget;
 399
 400        if (intf == pn_control_intf_desc.bInterfaceNumber)
 401                /* control interface, no altsetting */
 402                return (alt > 0) ? -EINVAL : 0;
 403
 404        if (intf == pn_data_intf_desc.bInterfaceNumber) {
 405                struct net_device *dev = fp->dev;
 406                struct phonet_port *port = netdev_priv(dev);
 407
 408                /* data intf (0: inactive, 1: active) */
 409                if (alt > 1)
 410                        return -EINVAL;
 411
 412                spin_lock(&port->lock);
 413
 414                if (fp->in_ep->enabled)
 415                        __pn_reset(f);
 416
 417                if (alt == 1) {
 418                        int i;
 419
 420                        if (config_ep_by_speed(gadget, f, fp->in_ep) ||
 421                            config_ep_by_speed(gadget, f, fp->out_ep)) {
 422                                fp->in_ep->desc = NULL;
 423                                fp->out_ep->desc = NULL;
 424                                spin_unlock(&port->lock);
 425                                return -EINVAL;
 426                        }
 427                        usb_ep_enable(fp->out_ep);
 428                        usb_ep_enable(fp->in_ep);
 429
 430                        port->usb = fp;
 431                        fp->out_ep->driver_data = fp;
 432                        fp->in_ep->driver_data = fp;
 433
 434                        netif_carrier_on(dev);
 435                        for (i = 0; i < phonet_rxq_size; i++)
 436                                pn_rx_submit(fp, fp->out_reqv[i], GFP_ATOMIC);
 437                }
 438                spin_unlock(&port->lock);
 439                return 0;
 440        }
 441
 442        return -EINVAL;
 443}
 444
 445static int pn_get_alt(struct usb_function *f, unsigned intf)
 446{
 447        struct f_phonet *fp = func_to_pn(f);
 448
 449        if (intf == pn_control_intf_desc.bInterfaceNumber)
 450                return 0;
 451
 452        if (intf == pn_data_intf_desc.bInterfaceNumber) {
 453                struct phonet_port *port = netdev_priv(fp->dev);
 454                u8 alt;
 455
 456                spin_lock(&port->lock);
 457                alt = port->usb != NULL;
 458                spin_unlock(&port->lock);
 459                return alt;
 460        }
 461
 462        return -EINVAL;
 463}
 464
 465static void pn_disconnect(struct usb_function *f)
 466{
 467        struct f_phonet *fp = func_to_pn(f);
 468        struct phonet_port *port = netdev_priv(fp->dev);
 469        unsigned long flags;
 470
 471        /* remain disabled until set_alt */
 472        spin_lock_irqsave(&port->lock, flags);
 473        __pn_reset(f);
 474        spin_unlock_irqrestore(&port->lock, flags);
 475}
 476
 477/*-------------------------------------------------------------------------*/
 478
 479static int pn_bind(struct usb_configuration *c, struct usb_function *f)
 480{
 481        struct usb_composite_dev *cdev = c->cdev;
 482        struct usb_gadget *gadget = cdev->gadget;
 483        struct f_phonet *fp = func_to_pn(f);
 484        struct usb_ep *ep;
 485        int status, i;
 486
 487        struct f_phonet_opts *phonet_opts;
 488
 489        phonet_opts = container_of(f->fi, struct f_phonet_opts, func_inst);
 490
 491        /*
 492         * in drivers/usb/gadget/configfs.c:configfs_composite_bind()
 493         * configurations are bound in sequence with list_for_each_entry,
 494         * in each configuration its functions are bound in sequence
 495         * with list_for_each_entry, so we assume no race condition
 496         * with regard to phonet_opts->bound access
 497         */
 498        if (!phonet_opts->bound) {
 499                gphonet_set_gadget(phonet_opts->net, gadget);
 500                status = gphonet_register_netdev(phonet_opts->net);
 501                if (status)
 502                        return status;
 503                phonet_opts->bound = true;
 504        }
 505
 506        /* Reserve interface IDs */
 507        status = usb_interface_id(c, f);
 508        if (status < 0)
 509                goto err;
 510        pn_control_intf_desc.bInterfaceNumber = status;
 511        pn_union_desc.bMasterInterface0 = status;
 512
 513        status = usb_interface_id(c, f);
 514        if (status < 0)
 515                goto err;
 516        pn_data_nop_intf_desc.bInterfaceNumber = status;
 517        pn_data_intf_desc.bInterfaceNumber = status;
 518        pn_union_desc.bSlaveInterface0 = status;
 519
 520        /* Reserve endpoints */
 521        status = -ENODEV;
 522        ep = usb_ep_autoconfig(gadget, &pn_fs_sink_desc);
 523        if (!ep)
 524                goto err;
 525        fp->out_ep = ep;
 526
 527        ep = usb_ep_autoconfig(gadget, &pn_fs_source_desc);
 528        if (!ep)
 529                goto err;
 530        fp->in_ep = ep;
 531
 532        pn_hs_sink_desc.bEndpointAddress = pn_fs_sink_desc.bEndpointAddress;
 533        pn_hs_source_desc.bEndpointAddress = pn_fs_source_desc.bEndpointAddress;
 534
 535        /* Do not try to bind Phonet twice... */
 536        status = usb_assign_descriptors(f, fs_pn_function, hs_pn_function,
 537                        NULL, NULL);
 538        if (status)
 539                goto err;
 540
 541        /* Incoming USB requests */
 542        status = -ENOMEM;
 543        for (i = 0; i < phonet_rxq_size; i++) {
 544                struct usb_request *req;
 545
 546                req = usb_ep_alloc_request(fp->out_ep, GFP_KERNEL);
 547                if (!req)
 548                        goto err_req;
 549
 550                req->complete = pn_rx_complete;
 551                fp->out_reqv[i] = req;
 552        }
 553
 554        /* Outgoing USB requests */
 555        fp->in_req = usb_ep_alloc_request(fp->in_ep, GFP_KERNEL);
 556        if (!fp->in_req)
 557                goto err_req;
 558
 559        INFO(cdev, "USB CDC Phonet function\n");
 560        INFO(cdev, "using %s, OUT %s, IN %s\n", cdev->gadget->name,
 561                fp->out_ep->name, fp->in_ep->name);
 562        return 0;
 563
 564err_req:
 565        for (i = 0; i < phonet_rxq_size && fp->out_reqv[i]; i++)
 566                usb_ep_free_request(fp->out_ep, fp->out_reqv[i]);
 567        usb_free_all_descriptors(f);
 568err:
 569        ERROR(cdev, "USB CDC Phonet: cannot autoconfigure\n");
 570        return status;
 571}
 572
 573static inline struct f_phonet_opts *to_f_phonet_opts(struct config_item *item)
 574{
 575        return container_of(to_config_group(item), struct f_phonet_opts,
 576                        func_inst.group);
 577}
 578
 579static void phonet_attr_release(struct config_item *item)
 580{
 581        struct f_phonet_opts *opts = to_f_phonet_opts(item);
 582
 583        usb_put_function_instance(&opts->func_inst);
 584}
 585
 586static struct configfs_item_operations phonet_item_ops = {
 587        .release                = phonet_attr_release,
 588};
 589
 590static ssize_t f_phonet_ifname_show(struct config_item *item, char *page)
 591{
 592        return gether_get_ifname(to_f_phonet_opts(item)->net, page, PAGE_SIZE);
 593}
 594
 595CONFIGFS_ATTR_RO(f_phonet_, ifname);
 596
 597static struct configfs_attribute *phonet_attrs[] = {
 598        &f_phonet_attr_ifname,
 599        NULL,
 600};
 601
 602static struct config_item_type phonet_func_type = {
 603        .ct_item_ops    = &phonet_item_ops,
 604        .ct_attrs       = phonet_attrs,
 605        .ct_owner       = THIS_MODULE,
 606};
 607
 608static void phonet_free_inst(struct usb_function_instance *f)
 609{
 610        struct f_phonet_opts *opts;
 611
 612        opts = container_of(f, struct f_phonet_opts, func_inst);
 613        if (opts->bound)
 614                gphonet_cleanup(opts->net);
 615        else
 616                free_netdev(opts->net);
 617        kfree(opts);
 618}
 619
 620static struct usb_function_instance *phonet_alloc_inst(void)
 621{
 622        struct f_phonet_opts *opts;
 623
 624        opts = kzalloc(sizeof(*opts), GFP_KERNEL);
 625        if (!opts)
 626                return ERR_PTR(-ENOMEM);
 627
 628        opts->func_inst.free_func_inst = phonet_free_inst;
 629        opts->net = gphonet_setup_default();
 630        if (IS_ERR(opts->net)) {
 631                struct net_device *net = opts->net;
 632                kfree(opts);
 633                return ERR_CAST(net);
 634        }
 635
 636        config_group_init_type_name(&opts->func_inst.group, "",
 637                        &phonet_func_type);
 638
 639        return &opts->func_inst;
 640}
 641
 642static void phonet_free(struct usb_function *f)
 643{
 644        struct f_phonet *phonet;
 645
 646        phonet = func_to_pn(f);
 647        kfree(phonet);
 648}
 649
 650static void pn_unbind(struct usb_configuration *c, struct usb_function *f)
 651{
 652        struct f_phonet *fp = func_to_pn(f);
 653        int i;
 654
 655        /* We are already disconnected */
 656        if (fp->in_req)
 657                usb_ep_free_request(fp->in_ep, fp->in_req);
 658        for (i = 0; i < phonet_rxq_size; i++)
 659                if (fp->out_reqv[i])
 660                        usb_ep_free_request(fp->out_ep, fp->out_reqv[i]);
 661
 662        usb_free_all_descriptors(f);
 663}
 664
 665static struct usb_function *phonet_alloc(struct usb_function_instance *fi)
 666{
 667        struct f_phonet *fp;
 668        struct f_phonet_opts *opts;
 669        int size;
 670
 671        size = sizeof(*fp) + (phonet_rxq_size * sizeof(struct usb_request *));
 672        fp = kzalloc(size, GFP_KERNEL);
 673        if (!fp)
 674                return ERR_PTR(-ENOMEM);
 675
 676        opts = container_of(fi, struct f_phonet_opts, func_inst);
 677
 678        fp->dev = opts->net;
 679        fp->function.name = "phonet";
 680        fp->function.bind = pn_bind;
 681        fp->function.unbind = pn_unbind;
 682        fp->function.set_alt = pn_set_alt;
 683        fp->function.get_alt = pn_get_alt;
 684        fp->function.disable = pn_disconnect;
 685        fp->function.free_func = phonet_free;
 686        spin_lock_init(&fp->rx.lock);
 687
 688        return &fp->function;
 689}
 690
 691struct net_device *gphonet_setup_default(void)
 692{
 693        struct net_device *dev;
 694        struct phonet_port *port;
 695
 696        /* Create net device */
 697        dev = alloc_netdev(sizeof(*port), "upnlink%d", NET_NAME_UNKNOWN,
 698                           pn_net_setup);
 699        if (!dev)
 700                return ERR_PTR(-ENOMEM);
 701
 702        port = netdev_priv(dev);
 703        spin_lock_init(&port->lock);
 704        netif_carrier_off(dev);
 705
 706        return dev;
 707}
 708
 709void gphonet_set_gadget(struct net_device *net, struct usb_gadget *g)
 710{
 711        SET_NETDEV_DEV(net, &g->dev);
 712}
 713
 714int gphonet_register_netdev(struct net_device *net)
 715{
 716        int status;
 717
 718        status = register_netdev(net);
 719        if (status)
 720                free_netdev(net);
 721
 722        return status;
 723}
 724
 725void gphonet_cleanup(struct net_device *dev)
 726{
 727        unregister_netdev(dev);
 728}
 729
 730DECLARE_USB_FUNCTION_INIT(phonet, phonet_alloc_inst, phonet_alloc);
 731MODULE_AUTHOR("Rémi Denis-Courmont");
 732MODULE_LICENSE("GPL");
 733