linux/drivers/staging/greybus/es2.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * Greybus "AP" USB driver for "ES2" controller chips
   4 *
   5 * Copyright 2014-2015 Google Inc.
   6 * Copyright 2014-2015 Linaro Ltd.
   7 */
   8#include <linux/kthread.h>
   9#include <linux/sizes.h>
  10#include <linux/usb.h>
  11#include <linux/kfifo.h>
  12#include <linux/debugfs.h>
  13#include <linux/list.h>
  14#include <asm/unaligned.h>
  15
  16#include "arpc.h"
  17#include "greybus.h"
  18#include "greybus_trace.h"
  19#include "connection.h"
  20
  21
  22/* Default timeout for USB vendor requests. */
  23#define ES2_USB_CTRL_TIMEOUT    500
  24
  25/* Default timeout for ARPC CPort requests */
  26#define ES2_ARPC_CPORT_TIMEOUT  500
  27
  28/* Fixed CPort numbers */
  29#define ES2_CPORT_CDSI0         16
  30#define ES2_CPORT_CDSI1         17
  31
  32/* Memory sizes for the buffers sent to/from the ES2 controller */
  33#define ES2_GBUF_MSG_SIZE_MAX   2048
  34
  35/* Memory sizes for the ARPC buffers */
  36#define ARPC_OUT_SIZE_MAX       U16_MAX
  37#define ARPC_IN_SIZE_MAX        128
  38
  39static const struct usb_device_id id_table[] = {
  40        { USB_DEVICE(0x18d1, 0x1eaf) },
  41        { },
  42};
  43MODULE_DEVICE_TABLE(usb, id_table);
  44
  45#define APB1_LOG_SIZE           SZ_16K
  46
  47/*
  48 * Number of CPort IN urbs in flight at any point in time.
  49 * Adjust if we are having stalls in the USB buffer due to not enough urbs in
  50 * flight.
  51 */
  52#define NUM_CPORT_IN_URB        4
  53
  54/* Number of CPort OUT urbs in flight at any point in time.
  55 * Adjust if we get messages saying we are out of urbs in the system log.
  56 */
  57#define NUM_CPORT_OUT_URB       8
  58
  59/*
  60 * Number of ARPC in urbs in flight at any point in time.
  61 */
  62#define NUM_ARPC_IN_URB         2
  63
  64/*
  65 * @endpoint: bulk in endpoint for CPort data
  66 * @urb: array of urbs for the CPort in messages
  67 * @buffer: array of buffers for the @cport_in_urb urbs
  68 */
  69struct es2_cport_in {
  70        __u8 endpoint;
  71        struct urb *urb[NUM_CPORT_IN_URB];
  72        u8 *buffer[NUM_CPORT_IN_URB];
  73};
  74
  75/**
  76 * es2_ap_dev - ES2 USB Bridge to AP structure
  77 * @usb_dev: pointer to the USB device we are.
  78 * @usb_intf: pointer to the USB interface we are bound to.
  79 * @hd: pointer to our gb_host_device structure
  80
  81 * @cport_in: endpoint, urbs and buffer for cport in messages
  82 * @cport_out_endpoint: endpoint for for cport out messages
  83 * @cport_out_urb: array of urbs for the CPort out messages
  84 * @cport_out_urb_busy: array of flags to see if the @cport_out_urb is busy or
  85 *                      not.
  86 * @cport_out_urb_cancelled: array of flags indicating whether the
  87 *                      corresponding @cport_out_urb is being cancelled
  88 * @cport_out_urb_lock: locks the @cport_out_urb_busy "list"
  89 *
  90 * @apb_log_task: task pointer for logging thread
  91 * @apb_log_dentry: file system entry for the log file interface
  92 * @apb_log_enable_dentry: file system entry for enabling logging
  93 * @apb_log_fifo: kernel FIFO to carry logged data
  94 * @arpc_urb: array of urbs for the ARPC in messages
  95 * @arpc_buffer: array of buffers for the @arpc_urb urbs
  96 * @arpc_endpoint_in: bulk in endpoint for APBridgeA RPC
  97 * @arpc_id_cycle: gives an unique id to ARPC
  98 * @arpc_lock: locks ARPC list
  99 * @arpcs: list of in progress ARPCs
 100 */
 101struct es2_ap_dev {
 102        struct usb_device *usb_dev;
 103        struct usb_interface *usb_intf;
 104        struct gb_host_device *hd;
 105
 106        struct es2_cport_in cport_in;
 107        __u8 cport_out_endpoint;
 108        struct urb *cport_out_urb[NUM_CPORT_OUT_URB];
 109        bool cport_out_urb_busy[NUM_CPORT_OUT_URB];
 110        bool cport_out_urb_cancelled[NUM_CPORT_OUT_URB];
 111        spinlock_t cport_out_urb_lock;
 112
 113        bool cdsi1_in_use;
 114
 115        struct task_struct *apb_log_task;
 116        struct dentry *apb_log_dentry;
 117        struct dentry *apb_log_enable_dentry;
 118        DECLARE_KFIFO(apb_log_fifo, char, APB1_LOG_SIZE);
 119
 120        __u8 arpc_endpoint_in;
 121        struct urb *arpc_urb[NUM_ARPC_IN_URB];
 122        u8 *arpc_buffer[NUM_ARPC_IN_URB];
 123
 124        int arpc_id_cycle;
 125        spinlock_t arpc_lock;
 126        struct list_head arpcs;
 127};
 128
 129struct arpc {
 130        struct list_head list;
 131        struct arpc_request_message *req;
 132        struct arpc_response_message *resp;
 133        struct completion response_received;
 134        bool active;
 135};
 136
 137static inline struct es2_ap_dev *hd_to_es2(struct gb_host_device *hd)
 138{
 139        return (struct es2_ap_dev *)&hd->hd_priv;
 140}
 141
 142static void cport_out_callback(struct urb *urb);
 143static void usb_log_enable(struct es2_ap_dev *es2);
 144static void usb_log_disable(struct es2_ap_dev *es2);
 145static int arpc_sync(struct es2_ap_dev *es2, u8 type, void *payload,
 146                     size_t size, int *result, unsigned int timeout);
 147
 148static int output_sync(struct es2_ap_dev *es2, void *req, u16 size, u8 cmd)
 149{
 150        struct usb_device *udev = es2->usb_dev;
 151        u8 *data;
 152        int retval;
 153
 154        data = kmemdup(req, size, GFP_KERNEL);
 155        if (!data)
 156                return -ENOMEM;
 157
 158        retval = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
 159                                 cmd,
 160                                 USB_DIR_OUT | USB_TYPE_VENDOR |
 161                                 USB_RECIP_INTERFACE,
 162                                 0, 0, data, size, ES2_USB_CTRL_TIMEOUT);
 163        if (retval < 0)
 164                dev_err(&udev->dev, "%s: return error %d\n", __func__, retval);
 165        else
 166                retval = 0;
 167
 168        kfree(data);
 169        return retval;
 170}
 171
 172static void ap_urb_complete(struct urb *urb)
 173{
 174        struct usb_ctrlrequest *dr = urb->context;
 175
 176        kfree(dr);
 177        usb_free_urb(urb);
 178}
 179
 180static int output_async(struct es2_ap_dev *es2, void *req, u16 size, u8 cmd)
 181{
 182        struct usb_device *udev = es2->usb_dev;
 183        struct urb *urb;
 184        struct usb_ctrlrequest *dr;
 185        u8 *buf;
 186        int retval;
 187
 188        urb = usb_alloc_urb(0, GFP_ATOMIC);
 189        if (!urb)
 190                return -ENOMEM;
 191
 192        dr = kmalloc(sizeof(*dr) + size, GFP_ATOMIC);
 193        if (!dr) {
 194                usb_free_urb(urb);
 195                return -ENOMEM;
 196        }
 197
 198        buf = (u8 *)dr + sizeof(*dr);
 199        memcpy(buf, req, size);
 200
 201        dr->bRequest = cmd;
 202        dr->bRequestType = USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE;
 203        dr->wValue = 0;
 204        dr->wIndex = 0;
 205        dr->wLength = cpu_to_le16(size);
 206
 207        usb_fill_control_urb(urb, udev, usb_sndctrlpipe(udev, 0),
 208                             (unsigned char *)dr, buf, size,
 209                             ap_urb_complete, dr);
 210        retval = usb_submit_urb(urb, GFP_ATOMIC);
 211        if (retval) {
 212                usb_free_urb(urb);
 213                kfree(dr);
 214        }
 215        return retval;
 216}
 217
 218static int output(struct gb_host_device *hd, void *req, u16 size, u8 cmd,
 219                     bool async)
 220{
 221        struct es2_ap_dev *es2 = hd_to_es2(hd);
 222
 223        if (async)
 224                return output_async(es2, req, size, cmd);
 225
 226        return output_sync(es2, req, size, cmd);
 227}
 228
 229static int es2_cport_in_enable(struct es2_ap_dev *es2,
 230                                struct es2_cport_in *cport_in)
 231{
 232        struct urb *urb;
 233        int ret;
 234        int i;
 235
 236        for (i = 0; i < NUM_CPORT_IN_URB; ++i) {
 237                urb = cport_in->urb[i];
 238
 239                ret = usb_submit_urb(urb, GFP_KERNEL);
 240                if (ret) {
 241                        dev_err(&es2->usb_dev->dev,
 242                                        "failed to submit in-urb: %d\n", ret);
 243                        goto err_kill_urbs;
 244                }
 245        }
 246
 247        return 0;
 248
 249err_kill_urbs:
 250        for (--i; i >= 0; --i) {
 251                urb = cport_in->urb[i];
 252                usb_kill_urb(urb);
 253        }
 254
 255        return ret;
 256}
 257
 258static void es2_cport_in_disable(struct es2_ap_dev *es2,
 259                                struct es2_cport_in *cport_in)
 260{
 261        struct urb *urb;
 262        int i;
 263
 264        for (i = 0; i < NUM_CPORT_IN_URB; ++i) {
 265                urb = cport_in->urb[i];
 266                usb_kill_urb(urb);
 267        }
 268}
 269
 270static int es2_arpc_in_enable(struct es2_ap_dev *es2)
 271{
 272        struct urb *urb;
 273        int ret;
 274        int i;
 275
 276        for (i = 0; i < NUM_ARPC_IN_URB; ++i) {
 277                urb = es2->arpc_urb[i];
 278
 279                ret = usb_submit_urb(urb, GFP_KERNEL);
 280                if (ret) {
 281                        dev_err(&es2->usb_dev->dev,
 282                                "failed to submit arpc in-urb: %d\n", ret);
 283                        goto err_kill_urbs;
 284                }
 285        }
 286
 287        return 0;
 288
 289err_kill_urbs:
 290        for (--i; i >= 0; --i) {
 291                urb = es2->arpc_urb[i];
 292                usb_kill_urb(urb);
 293        }
 294
 295        return ret;
 296}
 297
 298static void es2_arpc_in_disable(struct es2_ap_dev *es2)
 299{
 300        struct urb *urb;
 301        int i;
 302
 303        for (i = 0; i < NUM_ARPC_IN_URB; ++i) {
 304                urb = es2->arpc_urb[i];
 305                usb_kill_urb(urb);
 306        }
 307}
 308
 309static struct urb *next_free_urb(struct es2_ap_dev *es2, gfp_t gfp_mask)
 310{
 311        struct urb *urb = NULL;
 312        unsigned long flags;
 313        int i;
 314
 315        spin_lock_irqsave(&es2->cport_out_urb_lock, flags);
 316
 317        /* Look in our pool of allocated urbs first, as that's the "fastest" */
 318        for (i = 0; i < NUM_CPORT_OUT_URB; ++i) {
 319                if (es2->cport_out_urb_busy[i] == false &&
 320                                es2->cport_out_urb_cancelled[i] == false) {
 321                        es2->cport_out_urb_busy[i] = true;
 322                        urb = es2->cport_out_urb[i];
 323                        break;
 324                }
 325        }
 326        spin_unlock_irqrestore(&es2->cport_out_urb_lock, flags);
 327        if (urb)
 328                return urb;
 329
 330        /*
 331         * Crap, pool is empty, complain to the syslog and go allocate one
 332         * dynamically as we have to succeed.
 333         */
 334        dev_dbg(&es2->usb_dev->dev,
 335                "No free CPort OUT urbs, having to dynamically allocate one!\n");
 336        return usb_alloc_urb(0, gfp_mask);
 337}
 338
 339static void free_urb(struct es2_ap_dev *es2, struct urb *urb)
 340{
 341        unsigned long flags;
 342        int i;
 343        /*
 344         * See if this was an urb in our pool, if so mark it "free", otherwise
 345         * we need to free it ourselves.
 346         */
 347        spin_lock_irqsave(&es2->cport_out_urb_lock, flags);
 348        for (i = 0; i < NUM_CPORT_OUT_URB; ++i) {
 349                if (urb == es2->cport_out_urb[i]) {
 350                        es2->cport_out_urb_busy[i] = false;
 351                        urb = NULL;
 352                        break;
 353                }
 354        }
 355        spin_unlock_irqrestore(&es2->cport_out_urb_lock, flags);
 356
 357        /* If urb is not NULL, then we need to free this urb */
 358        usb_free_urb(urb);
 359}
 360
 361/*
 362 * We (ab)use the operation-message header pad bytes to transfer the
 363 * cport id in order to minimise overhead.
 364 */
 365static void
 366gb_message_cport_pack(struct gb_operation_msg_hdr *header, u16 cport_id)
 367{
 368        header->pad[0] = cport_id;
 369}
 370
 371/* Clear the pad bytes used for the CPort id */
 372static void gb_message_cport_clear(struct gb_operation_msg_hdr *header)
 373{
 374        header->pad[0] = 0;
 375}
 376
 377/* Extract the CPort id packed into the header, and clear it */
 378static u16 gb_message_cport_unpack(struct gb_operation_msg_hdr *header)
 379{
 380        u16 cport_id = header->pad[0];
 381
 382        gb_message_cport_clear(header);
 383
 384        return cport_id;
 385}
 386
 387/*
 388 * Returns zero if the message was successfully queued, or a negative errno
 389 * otherwise.
 390 */
 391static int message_send(struct gb_host_device *hd, u16 cport_id,
 392                        struct gb_message *message, gfp_t gfp_mask)
 393{
 394        struct es2_ap_dev *es2 = hd_to_es2(hd);
 395        struct usb_device *udev = es2->usb_dev;
 396        size_t buffer_size;
 397        int retval;
 398        struct urb *urb;
 399        unsigned long flags;
 400
 401        /*
 402         * The data actually transferred will include an indication
 403         * of where the data should be sent.  Do one last check of
 404         * the target CPort id before filling it in.
 405         */
 406        if (!cport_id_valid(hd, cport_id)) {
 407                dev_err(&udev->dev, "invalid cport %u\n", cport_id);
 408                return -EINVAL;
 409        }
 410
 411        /* Find a free urb */
 412        urb = next_free_urb(es2, gfp_mask);
 413        if (!urb)
 414                return -ENOMEM;
 415
 416        spin_lock_irqsave(&es2->cport_out_urb_lock, flags);
 417        message->hcpriv = urb;
 418        spin_unlock_irqrestore(&es2->cport_out_urb_lock, flags);
 419
 420        /* Pack the cport id into the message header */
 421        gb_message_cport_pack(message->header, cport_id);
 422
 423        buffer_size = sizeof(*message->header) + message->payload_size;
 424
 425        usb_fill_bulk_urb(urb, udev,
 426                          usb_sndbulkpipe(udev,
 427                                          es2->cport_out_endpoint),
 428                          message->buffer, buffer_size,
 429                          cport_out_callback, message);
 430        urb->transfer_flags |= URB_ZERO_PACKET;
 431
 432        trace_gb_message_submit(message);
 433
 434        retval = usb_submit_urb(urb, gfp_mask);
 435        if (retval) {
 436                dev_err(&udev->dev, "failed to submit out-urb: %d\n", retval);
 437
 438                spin_lock_irqsave(&es2->cport_out_urb_lock, flags);
 439                message->hcpriv = NULL;
 440                spin_unlock_irqrestore(&es2->cport_out_urb_lock, flags);
 441
 442                free_urb(es2, urb);
 443                gb_message_cport_clear(message->header);
 444
 445                return retval;
 446        }
 447
 448        return 0;
 449}
 450
 451/*
 452 * Can not be called in atomic context.
 453 */
 454static void message_cancel(struct gb_message *message)
 455{
 456        struct gb_host_device *hd = message->operation->connection->hd;
 457        struct es2_ap_dev *es2 = hd_to_es2(hd);
 458        struct urb *urb;
 459        int i;
 460
 461        might_sleep();
 462
 463        spin_lock_irq(&es2->cport_out_urb_lock);
 464        urb = message->hcpriv;
 465
 466        /* Prevent dynamically allocated urb from being deallocated. */
 467        usb_get_urb(urb);
 468
 469        /* Prevent pre-allocated urb from being reused. */
 470        for (i = 0; i < NUM_CPORT_OUT_URB; ++i) {
 471                if (urb == es2->cport_out_urb[i]) {
 472                        es2->cport_out_urb_cancelled[i] = true;
 473                        break;
 474                }
 475        }
 476        spin_unlock_irq(&es2->cport_out_urb_lock);
 477
 478        usb_kill_urb(urb);
 479
 480        if (i < NUM_CPORT_OUT_URB) {
 481                spin_lock_irq(&es2->cport_out_urb_lock);
 482                es2->cport_out_urb_cancelled[i] = false;
 483                spin_unlock_irq(&es2->cport_out_urb_lock);
 484        }
 485
 486        usb_free_urb(urb);
 487}
 488
 489static int es2_cport_allocate(struct gb_host_device *hd, int cport_id,
 490                                unsigned long flags)
 491{
 492        struct es2_ap_dev *es2 = hd_to_es2(hd);
 493        struct ida *id_map = &hd->cport_id_map;
 494        int ida_start, ida_end;
 495
 496        switch (cport_id) {
 497        case ES2_CPORT_CDSI0:
 498        case ES2_CPORT_CDSI1:
 499                dev_err(&hd->dev, "cport %d not available\n", cport_id);
 500                return -EBUSY;
 501        }
 502
 503        if (flags & GB_CONNECTION_FLAG_OFFLOADED &&
 504                        flags & GB_CONNECTION_FLAG_CDSI1) {
 505                if (es2->cdsi1_in_use) {
 506                        dev_err(&hd->dev, "CDSI1 already in use\n");
 507                        return -EBUSY;
 508                }
 509
 510                es2->cdsi1_in_use = true;
 511
 512                return ES2_CPORT_CDSI1;
 513        }
 514
 515        if (cport_id < 0) {
 516                ida_start = 0;
 517                ida_end = hd->num_cports;
 518        } else if (cport_id < hd->num_cports) {
 519                ida_start = cport_id;
 520                ida_end = cport_id + 1;
 521        } else {
 522                dev_err(&hd->dev, "cport %d not available\n", cport_id);
 523                return -EINVAL;
 524        }
 525
 526        return ida_simple_get(id_map, ida_start, ida_end, GFP_KERNEL);
 527}
 528
 529static void es2_cport_release(struct gb_host_device *hd, u16 cport_id)
 530{
 531        struct es2_ap_dev *es2 = hd_to_es2(hd);
 532
 533        switch (cport_id) {
 534        case ES2_CPORT_CDSI1:
 535                es2->cdsi1_in_use = false;
 536                return;
 537        }
 538
 539        ida_simple_remove(&hd->cport_id_map, cport_id);
 540}
 541
 542static int cport_enable(struct gb_host_device *hd, u16 cport_id,
 543                        unsigned long flags)
 544{
 545        struct es2_ap_dev *es2 = hd_to_es2(hd);
 546        struct usb_device *udev = es2->usb_dev;
 547        struct gb_apb_request_cport_flags *req;
 548        u32 connection_flags;
 549        int ret;
 550
 551        req = kzalloc(sizeof(*req), GFP_KERNEL);
 552        if (!req)
 553                return -ENOMEM;
 554
 555        connection_flags = 0;
 556        if (flags & GB_CONNECTION_FLAG_CONTROL)
 557                connection_flags |= GB_APB_CPORT_FLAG_CONTROL;
 558        if (flags & GB_CONNECTION_FLAG_HIGH_PRIO)
 559                connection_flags |= GB_APB_CPORT_FLAG_HIGH_PRIO;
 560
 561        req->flags = cpu_to_le32(connection_flags);
 562
 563        dev_dbg(&hd->dev, "%s - cport = %u, flags = %02x\n", __func__,
 564                        cport_id, connection_flags);
 565
 566        ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
 567                                GB_APB_REQUEST_CPORT_FLAGS,
 568                                USB_DIR_OUT | USB_TYPE_VENDOR |
 569                                USB_RECIP_INTERFACE, cport_id, 0,
 570                                req, sizeof(*req), ES2_USB_CTRL_TIMEOUT);
 571        if (ret != sizeof(*req)) {
 572                dev_err(&udev->dev, "failed to set cport flags for port %d\n",
 573                                cport_id);
 574                if (ret >= 0)
 575                        ret = -EIO;
 576
 577                goto out;
 578        }
 579
 580        ret = 0;
 581out:
 582        kfree(req);
 583
 584        return ret;
 585}
 586
 587static int es2_cport_connected(struct gb_host_device *hd, u16 cport_id)
 588{
 589        struct es2_ap_dev *es2 = hd_to_es2(hd);
 590        struct device *dev = &es2->usb_dev->dev;
 591        struct arpc_cport_connected_req req;
 592        int ret;
 593
 594        req.cport_id = cpu_to_le16(cport_id);
 595        ret = arpc_sync(es2, ARPC_TYPE_CPORT_CONNECTED, &req, sizeof(req),
 596                        NULL, ES2_ARPC_CPORT_TIMEOUT);
 597        if (ret) {
 598                dev_err(dev, "failed to set connected state for cport %u: %d\n",
 599                                cport_id, ret);
 600                return ret;
 601        }
 602
 603        return 0;
 604}
 605
 606static int es2_cport_flush(struct gb_host_device *hd, u16 cport_id)
 607{
 608        struct es2_ap_dev *es2 = hd_to_es2(hd);
 609        struct device *dev = &es2->usb_dev->dev;
 610        struct arpc_cport_flush_req req;
 611        int ret;
 612
 613        req.cport_id = cpu_to_le16(cport_id);
 614        ret = arpc_sync(es2, ARPC_TYPE_CPORT_FLUSH, &req, sizeof(req),
 615                        NULL, ES2_ARPC_CPORT_TIMEOUT);
 616        if (ret) {
 617                dev_err(dev, "failed to flush cport %u: %d\n", cport_id, ret);
 618                return ret;
 619        }
 620
 621        return 0;
 622}
 623
 624static int es2_cport_shutdown(struct gb_host_device *hd, u16 cport_id,
 625                                u8 phase, unsigned int timeout)
 626{
 627        struct es2_ap_dev *es2 = hd_to_es2(hd);
 628        struct device *dev = &es2->usb_dev->dev;
 629        struct arpc_cport_shutdown_req req;
 630        int result;
 631        int ret;
 632
 633        if (timeout > U16_MAX)
 634                return -EINVAL;
 635
 636        req.cport_id = cpu_to_le16(cport_id);
 637        req.timeout = cpu_to_le16(timeout);
 638        req.phase = phase;
 639        ret = arpc_sync(es2, ARPC_TYPE_CPORT_SHUTDOWN, &req, sizeof(req),
 640                        &result, ES2_ARPC_CPORT_TIMEOUT + timeout);
 641        if (ret) {
 642                dev_err(dev, "failed to send shutdown over cport %u: %d (%d)\n",
 643                                cport_id, ret, result);
 644                return ret;
 645        }
 646
 647        return 0;
 648}
 649
 650static int es2_cport_quiesce(struct gb_host_device *hd, u16 cport_id,
 651                                size_t peer_space, unsigned int timeout)
 652{
 653        struct es2_ap_dev *es2 = hd_to_es2(hd);
 654        struct device *dev = &es2->usb_dev->dev;
 655        struct arpc_cport_quiesce_req req;
 656        int result;
 657        int ret;
 658
 659        if (peer_space > U16_MAX)
 660                return -EINVAL;
 661
 662        if (timeout > U16_MAX)
 663                return -EINVAL;
 664
 665        req.cport_id = cpu_to_le16(cport_id);
 666        req.peer_space = cpu_to_le16(peer_space);
 667        req.timeout = cpu_to_le16(timeout);
 668        ret = arpc_sync(es2, ARPC_TYPE_CPORT_QUIESCE, &req, sizeof(req),
 669                        &result, ES2_ARPC_CPORT_TIMEOUT + timeout);
 670        if (ret) {
 671                dev_err(dev, "failed to quiesce cport %u: %d (%d)\n",
 672                                cport_id, ret, result);
 673                return ret;
 674        }
 675
 676        return 0;
 677}
 678
 679static int es2_cport_clear(struct gb_host_device *hd, u16 cport_id)
 680{
 681        struct es2_ap_dev *es2 = hd_to_es2(hd);
 682        struct device *dev = &es2->usb_dev->dev;
 683        struct arpc_cport_clear_req req;
 684        int ret;
 685
 686        req.cport_id = cpu_to_le16(cport_id);
 687        ret = arpc_sync(es2, ARPC_TYPE_CPORT_CLEAR, &req, sizeof(req),
 688                        NULL, ES2_ARPC_CPORT_TIMEOUT);
 689        if (ret) {
 690                dev_err(dev, "failed to clear cport %u: %d\n", cport_id, ret);
 691                return ret;
 692        }
 693
 694        return 0;
 695}
 696
 697static int latency_tag_enable(struct gb_host_device *hd, u16 cport_id)
 698{
 699        int retval;
 700        struct es2_ap_dev *es2 = hd_to_es2(hd);
 701        struct usb_device *udev = es2->usb_dev;
 702
 703        retval = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
 704                                 GB_APB_REQUEST_LATENCY_TAG_EN,
 705                                 USB_DIR_OUT | USB_TYPE_VENDOR |
 706                                 USB_RECIP_INTERFACE, cport_id, 0, NULL,
 707                                 0, ES2_USB_CTRL_TIMEOUT);
 708
 709        if (retval < 0)
 710                dev_err(&udev->dev, "Cannot enable latency tag for cport %d\n",
 711                        cport_id);
 712        return retval;
 713}
 714
 715static int latency_tag_disable(struct gb_host_device *hd, u16 cport_id)
 716{
 717        int retval;
 718        struct es2_ap_dev *es2 = hd_to_es2(hd);
 719        struct usb_device *udev = es2->usb_dev;
 720
 721        retval = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
 722                                 GB_APB_REQUEST_LATENCY_TAG_DIS,
 723                                 USB_DIR_OUT | USB_TYPE_VENDOR |
 724                                 USB_RECIP_INTERFACE, cport_id, 0, NULL,
 725                                 0, ES2_USB_CTRL_TIMEOUT);
 726
 727        if (retval < 0)
 728                dev_err(&udev->dev, "Cannot disable latency tag for cport %d\n",
 729                        cport_id);
 730        return retval;
 731}
 732
 733static struct gb_hd_driver es2_driver = {
 734        .hd_priv_size                   = sizeof(struct es2_ap_dev),
 735        .message_send                   = message_send,
 736        .message_cancel                 = message_cancel,
 737        .cport_allocate                 = es2_cport_allocate,
 738        .cport_release                  = es2_cport_release,
 739        .cport_enable                   = cport_enable,
 740        .cport_connected                = es2_cport_connected,
 741        .cport_flush                    = es2_cport_flush,
 742        .cport_shutdown                 = es2_cport_shutdown,
 743        .cport_quiesce                  = es2_cport_quiesce,
 744        .cport_clear                    = es2_cport_clear,
 745        .latency_tag_enable             = latency_tag_enable,
 746        .latency_tag_disable            = latency_tag_disable,
 747        .output                         = output,
 748};
 749
 750/* Common function to report consistent warnings based on URB status */
 751static int check_urb_status(struct urb *urb)
 752{
 753        struct device *dev = &urb->dev->dev;
 754        int status = urb->status;
 755
 756        switch (status) {
 757        case 0:
 758                return 0;
 759
 760        case -EOVERFLOW:
 761                dev_err(dev, "%s: overflow actual length is %d\n",
 762                        __func__, urb->actual_length);
 763                /* fall through */
 764        case -ECONNRESET:
 765        case -ENOENT:
 766        case -ESHUTDOWN:
 767        case -EILSEQ:
 768        case -EPROTO:
 769                /* device is gone, stop sending */
 770                return status;
 771        }
 772        dev_err(dev, "%s: unknown status %d\n", __func__, status);
 773
 774        return -EAGAIN;
 775}
 776
 777static void es2_destroy(struct es2_ap_dev *es2)
 778{
 779        struct usb_device *udev;
 780        struct urb *urb;
 781        int i;
 782
 783        debugfs_remove(es2->apb_log_enable_dentry);
 784        usb_log_disable(es2);
 785
 786        /* Tear down everything! */
 787        for (i = 0; i < NUM_CPORT_OUT_URB; ++i) {
 788                urb = es2->cport_out_urb[i];
 789                usb_kill_urb(urb);
 790                usb_free_urb(urb);
 791                es2->cport_out_urb[i] = NULL;
 792                es2->cport_out_urb_busy[i] = false;     /* just to be anal */
 793        }
 794
 795        for (i = 0; i < NUM_ARPC_IN_URB; ++i) {
 796                usb_free_urb(es2->arpc_urb[i]);
 797                kfree(es2->arpc_buffer[i]);
 798                es2->arpc_buffer[i] = NULL;
 799        }
 800
 801        for (i = 0; i < NUM_CPORT_IN_URB; ++i) {
 802                usb_free_urb(es2->cport_in.urb[i]);
 803                kfree(es2->cport_in.buffer[i]);
 804                es2->cport_in.buffer[i] = NULL;
 805        }
 806
 807        /* release reserved CDSI0 and CDSI1 cports */
 808        gb_hd_cport_release_reserved(es2->hd, ES2_CPORT_CDSI1);
 809        gb_hd_cport_release_reserved(es2->hd, ES2_CPORT_CDSI0);
 810
 811        udev = es2->usb_dev;
 812        gb_hd_put(es2->hd);
 813
 814        usb_put_dev(udev);
 815}
 816
 817static void cport_in_callback(struct urb *urb)
 818{
 819        struct gb_host_device *hd = urb->context;
 820        struct device *dev = &urb->dev->dev;
 821        struct gb_operation_msg_hdr *header;
 822        int status = check_urb_status(urb);
 823        int retval;
 824        u16 cport_id;
 825
 826        if (status) {
 827                if ((status == -EAGAIN) || (status == -EPROTO))
 828                        goto exit;
 829
 830                /* The urb is being unlinked */
 831                if (status == -ENOENT || status == -ESHUTDOWN)
 832                        return;
 833
 834                dev_err(dev, "urb cport in error %d (dropped)\n", status);
 835                return;
 836        }
 837
 838        if (urb->actual_length < sizeof(*header)) {
 839                dev_err(dev, "short message received\n");
 840                goto exit;
 841        }
 842
 843        /* Extract the CPort id, which is packed in the message header */
 844        header = urb->transfer_buffer;
 845        cport_id = gb_message_cport_unpack(header);
 846
 847        if (cport_id_valid(hd, cport_id)) {
 848                greybus_data_rcvd(hd, cport_id, urb->transfer_buffer,
 849                                                        urb->actual_length);
 850        } else {
 851                dev_err(dev, "invalid cport id %u received\n", cport_id);
 852        }
 853exit:
 854        /* put our urb back in the request pool */
 855        retval = usb_submit_urb(urb, GFP_ATOMIC);
 856        if (retval)
 857                dev_err(dev, "failed to resubmit in-urb: %d\n", retval);
 858}
 859
 860static void cport_out_callback(struct urb *urb)
 861{
 862        struct gb_message *message = urb->context;
 863        struct gb_host_device *hd = message->operation->connection->hd;
 864        struct es2_ap_dev *es2 = hd_to_es2(hd);
 865        int status = check_urb_status(urb);
 866        unsigned long flags;
 867
 868        gb_message_cport_clear(message->header);
 869
 870        spin_lock_irqsave(&es2->cport_out_urb_lock, flags);
 871        message->hcpriv = NULL;
 872        spin_unlock_irqrestore(&es2->cport_out_urb_lock, flags);
 873
 874        /*
 875         * Tell the submitter that the message send (attempt) is
 876         * complete, and report the status.
 877         */
 878        greybus_message_sent(hd, message, status);
 879
 880        free_urb(es2, urb);
 881}
 882
 883static struct arpc *arpc_alloc(void *payload, u16 size, u8 type)
 884{
 885        struct arpc *rpc;
 886
 887        if (size + sizeof(*rpc->req) > ARPC_OUT_SIZE_MAX)
 888                return NULL;
 889
 890        rpc = kzalloc(sizeof(*rpc), GFP_KERNEL);
 891        if (!rpc)
 892                return NULL;
 893
 894        INIT_LIST_HEAD(&rpc->list);
 895        rpc->req = kzalloc(sizeof(*rpc->req) + size, GFP_KERNEL);
 896        if (!rpc->req)
 897                goto err_free_rpc;
 898
 899        rpc->resp = kzalloc(sizeof(*rpc->resp), GFP_KERNEL);
 900        if (!rpc->resp)
 901                goto err_free_req;
 902
 903        rpc->req->type = type;
 904        rpc->req->size = cpu_to_le16(sizeof(*rpc->req) + size);
 905        memcpy(rpc->req->data, payload, size);
 906
 907        init_completion(&rpc->response_received);
 908
 909        return rpc;
 910
 911err_free_req:
 912        kfree(rpc->req);
 913err_free_rpc:
 914        kfree(rpc);
 915
 916        return NULL;
 917}
 918
 919static void arpc_free(struct arpc *rpc)
 920{
 921        kfree(rpc->req);
 922        kfree(rpc->resp);
 923        kfree(rpc);
 924}
 925
 926static struct arpc *arpc_find(struct es2_ap_dev *es2, __le16 id)
 927{
 928        struct arpc *rpc;
 929
 930        list_for_each_entry(rpc, &es2->arpcs, list) {
 931                if (rpc->req->id == id)
 932                        return rpc;
 933        }
 934
 935        return NULL;
 936}
 937
 938static void arpc_add(struct es2_ap_dev *es2, struct arpc *rpc)
 939{
 940        rpc->active = true;
 941        rpc->req->id = cpu_to_le16(es2->arpc_id_cycle++);
 942        list_add_tail(&rpc->list, &es2->arpcs);
 943}
 944
 945static void arpc_del(struct es2_ap_dev *es2, struct arpc *rpc)
 946{
 947        if (rpc->active) {
 948                rpc->active = false;
 949                list_del(&rpc->list);
 950        }
 951}
 952
 953static int arpc_send(struct es2_ap_dev *es2, struct arpc *rpc, int timeout)
 954{
 955        struct usb_device *udev = es2->usb_dev;
 956        int retval;
 957
 958        retval = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
 959                                 GB_APB_REQUEST_ARPC_RUN,
 960                                 USB_DIR_OUT | USB_TYPE_VENDOR |
 961                                 USB_RECIP_INTERFACE,
 962                                 0, 0,
 963                                 rpc->req, le16_to_cpu(rpc->req->size),
 964                                 ES2_USB_CTRL_TIMEOUT);
 965        if (retval != le16_to_cpu(rpc->req->size)) {
 966                dev_err(&udev->dev,
 967                        "failed to send ARPC request %d: %d\n",
 968                        rpc->req->type, retval);
 969                if (retval > 0)
 970                        retval = -EIO;
 971                return retval;
 972        }
 973
 974        return 0;
 975}
 976
 977static int arpc_sync(struct es2_ap_dev *es2, u8 type, void *payload,
 978                     size_t size, int *result, unsigned int timeout)
 979{
 980        struct arpc *rpc;
 981        unsigned long flags;
 982        int retval;
 983
 984        if (result)
 985                *result = 0;
 986
 987        rpc = arpc_alloc(payload, size, type);
 988        if (!rpc)
 989                return -ENOMEM;
 990
 991        spin_lock_irqsave(&es2->arpc_lock, flags);
 992        arpc_add(es2, rpc);
 993        spin_unlock_irqrestore(&es2->arpc_lock, flags);
 994
 995        retval = arpc_send(es2, rpc, timeout);
 996        if (retval)
 997                goto out_arpc_del;
 998
 999        retval = wait_for_completion_interruptible_timeout(
1000                                                &rpc->response_received,
1001                                                msecs_to_jiffies(timeout));
1002        if (retval <= 0) {
1003                if (!retval)
1004                        retval = -ETIMEDOUT;
1005                goto out_arpc_del;
1006        }
1007
1008        if (rpc->resp->result) {
1009                retval = -EREMOTEIO;
1010                if (result)
1011                        *result = rpc->resp->result;
1012        } else {
1013                retval = 0;
1014        }
1015
1016out_arpc_del:
1017        spin_lock_irqsave(&es2->arpc_lock, flags);
1018        arpc_del(es2, rpc);
1019        spin_unlock_irqrestore(&es2->arpc_lock, flags);
1020        arpc_free(rpc);
1021
1022        if (retval < 0 && retval != -EREMOTEIO) {
1023                dev_err(&es2->usb_dev->dev,
1024                        "failed to execute ARPC: %d\n", retval);
1025        }
1026
1027        return retval;
1028}
1029
1030static void arpc_in_callback(struct urb *urb)
1031{
1032        struct es2_ap_dev *es2 = urb->context;
1033        struct device *dev = &urb->dev->dev;
1034        int status = check_urb_status(urb);
1035        struct arpc *rpc;
1036        struct arpc_response_message *resp;
1037        unsigned long flags;
1038        int retval;
1039
1040        if (status) {
1041                if ((status == -EAGAIN) || (status == -EPROTO))
1042                        goto exit;
1043
1044                /* The urb is being unlinked */
1045                if (status == -ENOENT || status == -ESHUTDOWN)
1046                        return;
1047
1048                dev_err(dev, "arpc in-urb error %d (dropped)\n", status);
1049                return;
1050        }
1051
1052        if (urb->actual_length < sizeof(*resp)) {
1053                dev_err(dev, "short aprc response received\n");
1054                goto exit;
1055        }
1056
1057        resp = urb->transfer_buffer;
1058        spin_lock_irqsave(&es2->arpc_lock, flags);
1059        rpc = arpc_find(es2, resp->id);
1060        if (!rpc) {
1061                dev_err(dev, "invalid arpc response id received: %u\n",
1062                        le16_to_cpu(resp->id));
1063                spin_unlock_irqrestore(&es2->arpc_lock, flags);
1064                goto exit;
1065        }
1066
1067        arpc_del(es2, rpc);
1068        memcpy(rpc->resp, resp, sizeof(*resp));
1069        complete(&rpc->response_received);
1070        spin_unlock_irqrestore(&es2->arpc_lock, flags);
1071
1072exit:
1073        /* put our urb back in the request pool */
1074        retval = usb_submit_urb(urb, GFP_ATOMIC);
1075        if (retval)
1076                dev_err(dev, "failed to resubmit arpc in-urb: %d\n", retval);
1077}
1078
1079#define APB1_LOG_MSG_SIZE       64
1080static void apb_log_get(struct es2_ap_dev *es2, char *buf)
1081{
1082        int retval;
1083
1084        do {
1085                retval = usb_control_msg(es2->usb_dev,
1086                                        usb_rcvctrlpipe(es2->usb_dev, 0),
1087                                        GB_APB_REQUEST_LOG,
1088                                        USB_DIR_IN | USB_TYPE_VENDOR |
1089                                        USB_RECIP_INTERFACE,
1090                                        0x00, 0x00,
1091                                        buf,
1092                                        APB1_LOG_MSG_SIZE,
1093                                        ES2_USB_CTRL_TIMEOUT);
1094                if (retval > 0)
1095                        kfifo_in(&es2->apb_log_fifo, buf, retval);
1096        } while (retval > 0);
1097}
1098
1099static int apb_log_poll(void *data)
1100{
1101        struct es2_ap_dev *es2 = data;
1102        char *buf;
1103
1104        buf = kmalloc(APB1_LOG_MSG_SIZE, GFP_KERNEL);
1105        if (!buf)
1106                return -ENOMEM;
1107
1108        while (!kthread_should_stop()) {
1109                msleep(1000);
1110                apb_log_get(es2, buf);
1111        }
1112
1113        kfree(buf);
1114
1115        return 0;
1116}
1117
1118static ssize_t apb_log_read(struct file *f, char __user *buf,
1119                                size_t count, loff_t *ppos)
1120{
1121        struct es2_ap_dev *es2 = file_inode(f)->i_private;
1122        ssize_t ret;
1123        size_t copied;
1124        char *tmp_buf;
1125
1126        if (count > APB1_LOG_SIZE)
1127                count = APB1_LOG_SIZE;
1128
1129        tmp_buf = kmalloc(count, GFP_KERNEL);
1130        if (!tmp_buf)
1131                return -ENOMEM;
1132
1133        copied = kfifo_out(&es2->apb_log_fifo, tmp_buf, count);
1134        ret = simple_read_from_buffer(buf, count, ppos, tmp_buf, copied);
1135
1136        kfree(tmp_buf);
1137
1138        return ret;
1139}
1140
1141static const struct file_operations apb_log_fops = {
1142        .read   = apb_log_read,
1143};
1144
1145static void usb_log_enable(struct es2_ap_dev *es2)
1146{
1147        if (!IS_ERR_OR_NULL(es2->apb_log_task))
1148                return;
1149
1150        /* get log from APB1 */
1151        es2->apb_log_task = kthread_run(apb_log_poll, es2, "apb_log");
1152        if (IS_ERR(es2->apb_log_task))
1153                return;
1154        /* XXX We will need to rename this per APB */
1155        es2->apb_log_dentry = debugfs_create_file("apb_log", 0444,
1156                                                gb_debugfs_get(), es2,
1157                                                &apb_log_fops);
1158}
1159
1160static void usb_log_disable(struct es2_ap_dev *es2)
1161{
1162        if (IS_ERR_OR_NULL(es2->apb_log_task))
1163                return;
1164
1165        debugfs_remove(es2->apb_log_dentry);
1166        es2->apb_log_dentry = NULL;
1167
1168        kthread_stop(es2->apb_log_task);
1169        es2->apb_log_task = NULL;
1170}
1171
1172static ssize_t apb_log_enable_read(struct file *f, char __user *buf,
1173                                size_t count, loff_t *ppos)
1174{
1175        struct es2_ap_dev *es2 = file_inode(f)->i_private;
1176        int enable = !IS_ERR_OR_NULL(es2->apb_log_task);
1177        char tmp_buf[3];
1178
1179        sprintf(tmp_buf, "%d\n", enable);
1180        return simple_read_from_buffer(buf, count, ppos, tmp_buf, 3);
1181}
1182
1183static ssize_t apb_log_enable_write(struct file *f, const char __user *buf,
1184                                size_t count, loff_t *ppos)
1185{
1186        int enable;
1187        ssize_t retval;
1188        struct es2_ap_dev *es2 = file_inode(f)->i_private;
1189
1190        retval = kstrtoint_from_user(buf, count, 10, &enable);
1191        if (retval)
1192                return retval;
1193
1194        if (enable)
1195                usb_log_enable(es2);
1196        else
1197                usb_log_disable(es2);
1198
1199        return count;
1200}
1201
1202static const struct file_operations apb_log_enable_fops = {
1203        .read   = apb_log_enable_read,
1204        .write  = apb_log_enable_write,
1205};
1206
1207static int apb_get_cport_count(struct usb_device *udev)
1208{
1209        int retval;
1210        __le16 *cport_count;
1211
1212        cport_count = kzalloc(sizeof(*cport_count), GFP_KERNEL);
1213        if (!cport_count)
1214                return -ENOMEM;
1215
1216        retval = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
1217                                 GB_APB_REQUEST_CPORT_COUNT,
1218                                 USB_DIR_IN | USB_TYPE_VENDOR |
1219                                 USB_RECIP_INTERFACE, 0, 0, cport_count,
1220                                 sizeof(*cport_count), ES2_USB_CTRL_TIMEOUT);
1221        if (retval != sizeof(*cport_count)) {
1222                dev_err(&udev->dev, "Cannot retrieve CPort count: %d\n",
1223                        retval);
1224
1225                if (retval >= 0)
1226                        retval = -EIO;
1227
1228                goto out;
1229        }
1230
1231        retval = le16_to_cpu(*cport_count);
1232
1233        /* We need to fit a CPort ID in one byte of a message header */
1234        if (retval > U8_MAX) {
1235                retval = U8_MAX;
1236                dev_warn(&udev->dev, "Limiting number of CPorts to U8_MAX\n");
1237        }
1238
1239out:
1240        kfree(cport_count);
1241        return retval;
1242}
1243
1244/*
1245 * The ES2 USB Bridge device has 15 endpoints
1246 * 1 Control - usual USB stuff + AP -> APBridgeA messages
1247 * 7 Bulk IN - CPort data in
1248 * 7 Bulk OUT - CPort data out
1249 */
1250static int ap_probe(struct usb_interface *interface,
1251                    const struct usb_device_id *id)
1252{
1253        struct es2_ap_dev *es2;
1254        struct gb_host_device *hd;
1255        struct usb_device *udev;
1256        struct usb_host_interface *iface_desc;
1257        struct usb_endpoint_descriptor *endpoint;
1258        __u8 ep_addr;
1259        int retval;
1260        int i;
1261        int num_cports;
1262        bool bulk_out_found = false;
1263        bool bulk_in_found = false;
1264        bool arpc_in_found = false;
1265
1266        udev = usb_get_dev(interface_to_usbdev(interface));
1267
1268        num_cports = apb_get_cport_count(udev);
1269        if (num_cports < 0) {
1270                usb_put_dev(udev);
1271                dev_err(&udev->dev, "Cannot retrieve CPort count: %d\n",
1272                        num_cports);
1273                return num_cports;
1274        }
1275
1276        hd = gb_hd_create(&es2_driver, &udev->dev, ES2_GBUF_MSG_SIZE_MAX,
1277                                num_cports);
1278        if (IS_ERR(hd)) {
1279                usb_put_dev(udev);
1280                return PTR_ERR(hd);
1281        }
1282
1283        es2 = hd_to_es2(hd);
1284        es2->hd = hd;
1285        es2->usb_intf = interface;
1286        es2->usb_dev = udev;
1287        spin_lock_init(&es2->cport_out_urb_lock);
1288        INIT_KFIFO(es2->apb_log_fifo);
1289        usb_set_intfdata(interface, es2);
1290
1291        /*
1292         * Reserve the CDSI0 and CDSI1 CPorts so they won't be allocated
1293         * dynamically.
1294         */
1295        retval = gb_hd_cport_reserve(hd, ES2_CPORT_CDSI0);
1296        if (retval)
1297                goto error;
1298        retval = gb_hd_cport_reserve(hd, ES2_CPORT_CDSI1);
1299        if (retval)
1300                goto error;
1301
1302        /* find all bulk endpoints */
1303        iface_desc = interface->cur_altsetting;
1304        for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
1305                endpoint = &iface_desc->endpoint[i].desc;
1306                ep_addr = endpoint->bEndpointAddress;
1307
1308                if (usb_endpoint_is_bulk_in(endpoint)) {
1309                        if (!bulk_in_found) {
1310                                es2->cport_in.endpoint = ep_addr;
1311                                bulk_in_found = true;
1312                        } else if (!arpc_in_found) {
1313                                es2->arpc_endpoint_in = ep_addr;
1314                                arpc_in_found = true;
1315                        } else {
1316                                dev_warn(&udev->dev,
1317                                         "Unused bulk IN endpoint found: 0x%02x\n",
1318                                         ep_addr);
1319                        }
1320                        continue;
1321                }
1322                if (usb_endpoint_is_bulk_out(endpoint)) {
1323                        if (!bulk_out_found) {
1324                                es2->cport_out_endpoint = ep_addr;
1325                                bulk_out_found = true;
1326                        } else {
1327                                dev_warn(&udev->dev,
1328                                         "Unused bulk OUT endpoint found: 0x%02x\n",
1329                                         ep_addr);
1330                        }
1331                        continue;
1332                }
1333                dev_warn(&udev->dev,
1334                         "Unknown endpoint type found, address 0x%02x\n",
1335                         ep_addr);
1336        }
1337        if (!bulk_in_found || !arpc_in_found || !bulk_out_found) {
1338                dev_err(&udev->dev, "Not enough endpoints found in device, aborting!\n");
1339                retval = -ENODEV;
1340                goto error;
1341        }
1342
1343        /* Allocate buffers for our cport in messages */
1344        for (i = 0; i < NUM_CPORT_IN_URB; ++i) {
1345                struct urb *urb;
1346                u8 *buffer;
1347
1348                urb = usb_alloc_urb(0, GFP_KERNEL);
1349                if (!urb) {
1350                        retval = -ENOMEM;
1351                        goto error;
1352                }
1353                es2->cport_in.urb[i] = urb;
1354
1355                buffer = kmalloc(ES2_GBUF_MSG_SIZE_MAX, GFP_KERNEL);
1356                if (!buffer) {
1357                        retval = -ENOMEM;
1358                        goto error;
1359                }
1360
1361                usb_fill_bulk_urb(urb, udev,
1362                                  usb_rcvbulkpipe(udev, es2->cport_in.endpoint),
1363                                  buffer, ES2_GBUF_MSG_SIZE_MAX,
1364                                  cport_in_callback, hd);
1365
1366                es2->cport_in.buffer[i] = buffer;
1367        }
1368
1369        /* Allocate buffers for ARPC in messages */
1370        for (i = 0; i < NUM_ARPC_IN_URB; ++i) {
1371                struct urb *urb;
1372                u8 *buffer;
1373
1374                urb = usb_alloc_urb(0, GFP_KERNEL);
1375                if (!urb) {
1376                        retval = -ENOMEM;
1377                        goto error;
1378                }
1379                es2->arpc_urb[i] = urb;
1380
1381                buffer = kmalloc(ARPC_IN_SIZE_MAX, GFP_KERNEL);
1382                if (!buffer) {
1383                        retval = -ENOMEM;
1384                        goto error;
1385                }
1386
1387                usb_fill_bulk_urb(urb, udev,
1388                                  usb_rcvbulkpipe(udev,
1389                                                  es2->arpc_endpoint_in),
1390                                  buffer, ARPC_IN_SIZE_MAX,
1391                                  arpc_in_callback, es2);
1392
1393                es2->arpc_buffer[i] = buffer;
1394        }
1395
1396        /* Allocate urbs for our CPort OUT messages */
1397        for (i = 0; i < NUM_CPORT_OUT_URB; ++i) {
1398                struct urb *urb;
1399
1400                urb = usb_alloc_urb(0, GFP_KERNEL);
1401                if (!urb) {
1402                        retval = -ENOMEM;
1403                        goto error;
1404                }
1405
1406                es2->cport_out_urb[i] = urb;
1407                es2->cport_out_urb_busy[i] = false;     /* just to be anal */
1408        }
1409
1410        /* XXX We will need to rename this per APB */
1411        es2->apb_log_enable_dentry = debugfs_create_file("apb_log_enable",
1412                                                        0644,
1413                                                        gb_debugfs_get(), es2,
1414                                                        &apb_log_enable_fops);
1415
1416        INIT_LIST_HEAD(&es2->arpcs);
1417        spin_lock_init(&es2->arpc_lock);
1418
1419        retval = es2_arpc_in_enable(es2);
1420        if (retval)
1421                goto error;
1422
1423        retval = gb_hd_add(hd);
1424        if (retval)
1425                goto err_disable_arpc_in;
1426
1427        retval = es2_cport_in_enable(es2, &es2->cport_in);
1428        if (retval)
1429                goto err_hd_del;
1430
1431        return 0;
1432
1433err_hd_del:
1434        gb_hd_del(hd);
1435err_disable_arpc_in:
1436        es2_arpc_in_disable(es2);
1437error:
1438        es2_destroy(es2);
1439
1440        return retval;
1441}
1442
1443static void ap_disconnect(struct usb_interface *interface)
1444{
1445        struct es2_ap_dev *es2 = usb_get_intfdata(interface);
1446
1447        gb_hd_del(es2->hd);
1448
1449        es2_cport_in_disable(es2, &es2->cport_in);
1450        es2_arpc_in_disable(es2);
1451
1452        es2_destroy(es2);
1453}
1454
1455static struct usb_driver es2_ap_driver = {
1456        .name =         "es2_ap_driver",
1457        .probe =        ap_probe,
1458        .disconnect =   ap_disconnect,
1459        .id_table =     id_table,
1460        .soft_unbind =  1,
1461};
1462
1463module_usb_driver(es2_ap_driver);
1464
1465MODULE_LICENSE("GPL v2");
1466MODULE_AUTHOR("Greg Kroah-Hartman <gregkh@linuxfoundation.org>");
1467