linux/drivers/net/wireless/marvell/mwifiex/usb.c
<<
>>
Prefs
   1/*
   2 * Marvell Wireless LAN device driver: USB specific handling
   3 *
   4 * Copyright (C) 2012-2014, Marvell International Ltd.
   5 *
   6 * This software file (the "File") is distributed by Marvell International
   7 * Ltd. under the terms of the GNU General Public License Version 2, June 1991
   8 * (the "License").  You may use, redistribute and/or modify this File in
   9 * accordance with the terms and conditions of the License, a copy of which
  10 * is available by writing to the Free Software Foundation, Inc.,
  11 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA or on the
  12 * worldwide web at http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
  13 *
  14 * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
  15 * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
  16 * ARE EXPRESSLY DISCLAIMED.  The License provides additional details about
  17 * this warranty disclaimer.
  18 */
  19
  20#include "main.h"
  21#include "usb.h"
  22
  23#define USB_VERSION     "1.0"
  24
  25static u8 user_rmmod;
  26static struct mwifiex_if_ops usb_ops;
  27static struct semaphore add_remove_card_sem;
  28
  29static struct usb_device_id mwifiex_usb_table[] = {
  30        /* 8766 */
  31        {USB_DEVICE(USB8XXX_VID, USB8766_PID_1)},
  32        {USB_DEVICE_AND_INTERFACE_INFO(USB8XXX_VID, USB8766_PID_2,
  33                                       USB_CLASS_VENDOR_SPEC,
  34                                       USB_SUBCLASS_VENDOR_SPEC, 0xff)},
  35        /* 8797 */
  36        {USB_DEVICE(USB8XXX_VID, USB8797_PID_1)},
  37        {USB_DEVICE_AND_INTERFACE_INFO(USB8XXX_VID, USB8797_PID_2,
  38                                       USB_CLASS_VENDOR_SPEC,
  39                                       USB_SUBCLASS_VENDOR_SPEC, 0xff)},
  40        /* 8801 */
  41        {USB_DEVICE(USB8XXX_VID, USB8801_PID_1)},
  42        {USB_DEVICE_AND_INTERFACE_INFO(USB8XXX_VID, USB8801_PID_2,
  43                                       USB_CLASS_VENDOR_SPEC,
  44                                       USB_SUBCLASS_VENDOR_SPEC, 0xff)},
  45        /* 8997 */
  46        {USB_DEVICE(USB8XXX_VID, USB8997_PID_1)},
  47        {USB_DEVICE_AND_INTERFACE_INFO(USB8XXX_VID, USB8997_PID_2,
  48                                       USB_CLASS_VENDOR_SPEC,
  49                                       USB_SUBCLASS_VENDOR_SPEC, 0xff)},
  50        { }     /* Terminating entry */
  51};
  52
  53MODULE_DEVICE_TABLE(usb, mwifiex_usb_table);
  54
  55static int mwifiex_usb_submit_rx_urb(struct urb_context *ctx, int size);
  56
  57/* This function handles received packet. Necessary action is taken based on
  58 * cmd/event/data.
  59 */
  60static int mwifiex_usb_recv(struct mwifiex_adapter *adapter,
  61                            struct sk_buff *skb, u8 ep)
  62{
  63        u32 recv_type;
  64        __le32 tmp;
  65        int ret;
  66
  67        if (adapter->hs_activated)
  68                mwifiex_process_hs_config(adapter);
  69
  70        if (skb->len < INTF_HEADER_LEN) {
  71                mwifiex_dbg(adapter, ERROR,
  72                            "%s: invalid skb->len\n", __func__);
  73                return -1;
  74        }
  75
  76        switch (ep) {
  77        case MWIFIEX_USB_EP_CMD_EVENT:
  78                mwifiex_dbg(adapter, EVENT,
  79                            "%s: EP_CMD_EVENT\n", __func__);
  80                skb_copy_from_linear_data(skb, &tmp, INTF_HEADER_LEN);
  81                recv_type = le32_to_cpu(tmp);
  82                skb_pull(skb, INTF_HEADER_LEN);
  83
  84                switch (recv_type) {
  85                case MWIFIEX_USB_TYPE_CMD:
  86                        if (skb->len > MWIFIEX_SIZE_OF_CMD_BUFFER) {
  87                                mwifiex_dbg(adapter, ERROR,
  88                                            "CMD: skb->len too large\n");
  89                                ret = -1;
  90                                goto exit_restore_skb;
  91                        } else if (!adapter->curr_cmd) {
  92                                mwifiex_dbg(adapter, WARN, "CMD: no curr_cmd\n");
  93                                if (adapter->ps_state == PS_STATE_SLEEP_CFM) {
  94                                        mwifiex_process_sleep_confirm_resp(
  95                                                        adapter, skb->data,
  96                                                        skb->len);
  97                                        ret = 0;
  98                                        goto exit_restore_skb;
  99                                }
 100                                ret = -1;
 101                                goto exit_restore_skb;
 102                        }
 103
 104                        adapter->curr_cmd->resp_skb = skb;
 105                        adapter->cmd_resp_received = true;
 106                        break;
 107                case MWIFIEX_USB_TYPE_EVENT:
 108                        if (skb->len < sizeof(u32)) {
 109                                mwifiex_dbg(adapter, ERROR,
 110                                            "EVENT: skb->len too small\n");
 111                                ret = -1;
 112                                goto exit_restore_skb;
 113                        }
 114                        skb_copy_from_linear_data(skb, &tmp, sizeof(u32));
 115                        adapter->event_cause = le32_to_cpu(tmp);
 116                        mwifiex_dbg(adapter, EVENT,
 117                                    "event_cause %#x\n", adapter->event_cause);
 118
 119                        if (skb->len > MAX_EVENT_SIZE) {
 120                                mwifiex_dbg(adapter, ERROR,
 121                                            "EVENT: event body too large\n");
 122                                ret = -1;
 123                                goto exit_restore_skb;
 124                        }
 125
 126                        memcpy(adapter->event_body, skb->data +
 127                               MWIFIEX_EVENT_HEADER_LEN, skb->len);
 128
 129                        adapter->event_received = true;
 130                        adapter->event_skb = skb;
 131                        break;
 132                default:
 133                        mwifiex_dbg(adapter, ERROR,
 134                                    "unknown recv_type %#x\n", recv_type);
 135                        return -1;
 136                }
 137                break;
 138        case MWIFIEX_USB_EP_DATA:
 139                mwifiex_dbg(adapter, DATA, "%s: EP_DATA\n", __func__);
 140                if (skb->len > MWIFIEX_RX_DATA_BUF_SIZE) {
 141                        mwifiex_dbg(adapter, ERROR,
 142                                    "DATA: skb->len too large\n");
 143                        return -1;
 144                }
 145
 146                skb_queue_tail(&adapter->rx_data_q, skb);
 147                adapter->data_received = true;
 148                atomic_inc(&adapter->rx_pending);
 149                break;
 150        default:
 151                mwifiex_dbg(adapter, ERROR,
 152                            "%s: unknown endport %#x\n", __func__, ep);
 153                return -1;
 154        }
 155
 156        return -EINPROGRESS;
 157
 158exit_restore_skb:
 159        /* The buffer will be reused for further cmds/events */
 160        skb_push(skb, INTF_HEADER_LEN);
 161
 162        return ret;
 163}
 164
 165static void mwifiex_usb_rx_complete(struct urb *urb)
 166{
 167        struct urb_context *context = (struct urb_context *)urb->context;
 168        struct mwifiex_adapter *adapter = context->adapter;
 169        struct sk_buff *skb = context->skb;
 170        struct usb_card_rec *card;
 171        int recv_length = urb->actual_length;
 172        int size, status;
 173
 174        if (!adapter || !adapter->card) {
 175                pr_err("mwifiex adapter or card structure is not valid\n");
 176                return;
 177        }
 178
 179        card = (struct usb_card_rec *)adapter->card;
 180        if (card->rx_cmd_ep == context->ep)
 181                atomic_dec(&card->rx_cmd_urb_pending);
 182        else
 183                atomic_dec(&card->rx_data_urb_pending);
 184
 185        if (recv_length) {
 186                if (urb->status || (adapter->surprise_removed)) {
 187                        mwifiex_dbg(adapter, ERROR,
 188                                    "URB status is failed: %d\n", urb->status);
 189                        /* Do not free skb in case of command ep */
 190                        if (card->rx_cmd_ep != context->ep)
 191                                dev_kfree_skb_any(skb);
 192                        goto setup_for_next;
 193                }
 194                if (skb->len > recv_length)
 195                        skb_trim(skb, recv_length);
 196                else
 197                        skb_put(skb, recv_length - skb->len);
 198
 199                status = mwifiex_usb_recv(adapter, skb, context->ep);
 200
 201                mwifiex_dbg(adapter, INFO,
 202                            "info: recv_length=%d, status=%d\n",
 203                            recv_length, status);
 204                if (status == -EINPROGRESS) {
 205                        mwifiex_queue_main_work(adapter);
 206
 207                        /* urb for data_ep is re-submitted now;
 208                         * urb for cmd_ep will be re-submitted in callback
 209                         * mwifiex_usb_recv_complete
 210                         */
 211                        if (card->rx_cmd_ep == context->ep)
 212                                return;
 213                } else {
 214                        if (status == -1)
 215                                mwifiex_dbg(adapter, ERROR,
 216                                            "received data processing failed!\n");
 217
 218                        /* Do not free skb in case of command ep */
 219                        if (card->rx_cmd_ep != context->ep)
 220                                dev_kfree_skb_any(skb);
 221                }
 222        } else if (urb->status) {
 223                if (!adapter->is_suspended) {
 224                        mwifiex_dbg(adapter, FATAL,
 225                                    "Card is removed: %d\n", urb->status);
 226                        adapter->surprise_removed = true;
 227                }
 228                dev_kfree_skb_any(skb);
 229                return;
 230        } else {
 231                /* Do not free skb in case of command ep */
 232                if (card->rx_cmd_ep != context->ep)
 233                        dev_kfree_skb_any(skb);
 234
 235                /* fall through setup_for_next */
 236        }
 237
 238setup_for_next:
 239        if (card->rx_cmd_ep == context->ep)
 240                size = MWIFIEX_RX_CMD_BUF_SIZE;
 241        else
 242                size = MWIFIEX_RX_DATA_BUF_SIZE;
 243
 244        if (card->rx_cmd_ep == context->ep) {
 245                mwifiex_usb_submit_rx_urb(context, size);
 246        } else {
 247                if (atomic_read(&adapter->rx_pending) <= HIGH_RX_PENDING) {
 248                        mwifiex_usb_submit_rx_urb(context, size);
 249                } else {
 250                        context->skb = NULL;
 251                }
 252        }
 253
 254        return;
 255}
 256
 257static void mwifiex_usb_tx_complete(struct urb *urb)
 258{
 259        struct urb_context *context = (struct urb_context *)(urb->context);
 260        struct mwifiex_adapter *adapter = context->adapter;
 261        struct usb_card_rec *card = adapter->card;
 262        struct usb_tx_data_port *port;
 263        int i;
 264
 265        mwifiex_dbg(adapter, INFO,
 266                    "%s: status: %d\n", __func__, urb->status);
 267
 268        if (context->ep == card->tx_cmd_ep) {
 269                mwifiex_dbg(adapter, CMD,
 270                            "%s: CMD\n", __func__);
 271                atomic_dec(&card->tx_cmd_urb_pending);
 272                adapter->cmd_sent = false;
 273        } else {
 274                mwifiex_dbg(adapter, DATA,
 275                            "%s: DATA\n", __func__);
 276                for (i = 0; i < MWIFIEX_TX_DATA_PORT; i++) {
 277                        port = &card->port[i];
 278                        if (context->ep == port->tx_data_ep) {
 279                                atomic_dec(&port->tx_data_urb_pending);
 280                                port->block_status = false;
 281                                break;
 282                        }
 283                }
 284                adapter->data_sent = false;
 285                mwifiex_write_data_complete(adapter, context->skb, 0,
 286                                            urb->status ? -1 : 0);
 287        }
 288
 289        if (card->mc_resync_flag)
 290                mwifiex_multi_chan_resync(adapter);
 291
 292        mwifiex_queue_main_work(adapter);
 293
 294        return;
 295}
 296
 297static int mwifiex_usb_submit_rx_urb(struct urb_context *ctx, int size)
 298{
 299        struct mwifiex_adapter *adapter = ctx->adapter;
 300        struct usb_card_rec *card = (struct usb_card_rec *)adapter->card;
 301
 302        if (card->rx_cmd_ep != ctx->ep) {
 303                ctx->skb = dev_alloc_skb(size);
 304                if (!ctx->skb) {
 305                        mwifiex_dbg(adapter, ERROR,
 306                                    "%s: dev_alloc_skb failed\n", __func__);
 307                        return -ENOMEM;
 308                }
 309        }
 310
 311        usb_fill_bulk_urb(ctx->urb, card->udev,
 312                          usb_rcvbulkpipe(card->udev, ctx->ep), ctx->skb->data,
 313                          size, mwifiex_usb_rx_complete, (void *)ctx);
 314
 315        if (card->rx_cmd_ep == ctx->ep)
 316                atomic_inc(&card->rx_cmd_urb_pending);
 317        else
 318                atomic_inc(&card->rx_data_urb_pending);
 319
 320        if (usb_submit_urb(ctx->urb, GFP_ATOMIC)) {
 321                mwifiex_dbg(adapter, ERROR, "usb_submit_urb failed\n");
 322                dev_kfree_skb_any(ctx->skb);
 323                ctx->skb = NULL;
 324
 325                if (card->rx_cmd_ep == ctx->ep)
 326                        atomic_dec(&card->rx_cmd_urb_pending);
 327                else
 328                        atomic_dec(&card->rx_data_urb_pending);
 329
 330                return -1;
 331        }
 332
 333        return 0;
 334}
 335
 336static void mwifiex_usb_free(struct usb_card_rec *card)
 337{
 338        struct usb_tx_data_port *port;
 339        int i, j;
 340
 341        if (atomic_read(&card->rx_cmd_urb_pending) && card->rx_cmd.urb)
 342                usb_kill_urb(card->rx_cmd.urb);
 343
 344        usb_free_urb(card->rx_cmd.urb);
 345        card->rx_cmd.urb = NULL;
 346
 347        if (atomic_read(&card->rx_data_urb_pending))
 348                for (i = 0; i < MWIFIEX_RX_DATA_URB; i++)
 349                        if (card->rx_data_list[i].urb)
 350                                usb_kill_urb(card->rx_data_list[i].urb);
 351
 352        for (i = 0; i < MWIFIEX_RX_DATA_URB; i++) {
 353                usb_free_urb(card->rx_data_list[i].urb);
 354                card->rx_data_list[i].urb = NULL;
 355        }
 356
 357        for (i = 0; i < MWIFIEX_TX_DATA_PORT; i++) {
 358                port = &card->port[i];
 359                for (j = 0; j < MWIFIEX_TX_DATA_URB; j++) {
 360                        usb_free_urb(port->tx_data_list[j].urb);
 361                        port->tx_data_list[j].urb = NULL;
 362                }
 363        }
 364
 365        usb_free_urb(card->tx_cmd.urb);
 366        card->tx_cmd.urb = NULL;
 367
 368        return;
 369}
 370
 371/* This function probes an mwifiex device and registers it. It allocates
 372 * the card structure, initiates the device registration and initialization
 373 * procedure by adding a logical interface.
 374 */
 375static int mwifiex_usb_probe(struct usb_interface *intf,
 376                             const struct usb_device_id *id)
 377{
 378        struct usb_device *udev = interface_to_usbdev(intf);
 379        struct usb_host_interface *iface_desc = intf->cur_altsetting;
 380        struct usb_endpoint_descriptor *epd;
 381        int ret, i;
 382        struct usb_card_rec *card;
 383        u16 id_vendor, id_product, bcd_device, bcd_usb;
 384
 385        card = kzalloc(sizeof(struct usb_card_rec), GFP_KERNEL);
 386        if (!card)
 387                return -ENOMEM;
 388
 389        id_vendor = le16_to_cpu(udev->descriptor.idVendor);
 390        id_product = le16_to_cpu(udev->descriptor.idProduct);
 391        bcd_device = le16_to_cpu(udev->descriptor.bcdDevice);
 392        bcd_usb = le16_to_cpu(udev->descriptor.bcdUSB);
 393        pr_debug("info: VID/PID = %X/%X, Boot2 version = %X\n",
 394                 id_vendor, id_product, bcd_device);
 395
 396        /* PID_1 is used for firmware downloading only */
 397        switch (id_product) {
 398        case USB8766_PID_1:
 399        case USB8797_PID_1:
 400        case USB8801_PID_1:
 401        case USB8997_PID_1:
 402                card->usb_boot_state = USB8XXX_FW_DNLD;
 403                break;
 404        case USB8766_PID_2:
 405        case USB8797_PID_2:
 406        case USB8801_PID_2:
 407        case USB8997_PID_2:
 408                card->usb_boot_state = USB8XXX_FW_READY;
 409                break;
 410        default:
 411                pr_warn("unknown id_product %#x\n", id_product);
 412                card->usb_boot_state = USB8XXX_FW_DNLD;
 413                break;
 414        }
 415
 416        card->udev = udev;
 417        card->intf = intf;
 418
 419        pr_debug("info: bcdUSB=%#x Device Class=%#x SubClass=%#x Protocol=%#x\n",
 420                 udev->descriptor.bcdUSB, udev->descriptor.bDeviceClass,
 421                 udev->descriptor.bDeviceSubClass,
 422                 udev->descriptor.bDeviceProtocol);
 423
 424        for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
 425                epd = &iface_desc->endpoint[i].desc;
 426                if (usb_endpoint_dir_in(epd) &&
 427                    usb_endpoint_num(epd) == MWIFIEX_USB_EP_CMD_EVENT &&
 428                    usb_endpoint_xfer_bulk(epd)) {
 429                        pr_debug("info: bulk IN: max pkt size: %d, addr: %d\n",
 430                                 le16_to_cpu(epd->wMaxPacketSize),
 431                                 epd->bEndpointAddress);
 432                        card->rx_cmd_ep = usb_endpoint_num(epd);
 433                        atomic_set(&card->rx_cmd_urb_pending, 0);
 434                }
 435                if (usb_endpoint_dir_in(epd) &&
 436                    usb_endpoint_num(epd) == MWIFIEX_USB_EP_DATA &&
 437                    usb_endpoint_xfer_bulk(epd)) {
 438                        pr_debug("info: bulk IN: max pkt size: %d, addr: %d\n",
 439                                 le16_to_cpu(epd->wMaxPacketSize),
 440                                 epd->bEndpointAddress);
 441                        card->rx_data_ep = usb_endpoint_num(epd);
 442                        atomic_set(&card->rx_data_urb_pending, 0);
 443                }
 444                if (usb_endpoint_dir_out(epd) &&
 445                    usb_endpoint_num(epd) == MWIFIEX_USB_EP_DATA &&
 446                    usb_endpoint_xfer_bulk(epd)) {
 447                        pr_debug("info: bulk OUT: max pkt size: %d, addr: %d\n",
 448                                 le16_to_cpu(epd->wMaxPacketSize),
 449                                 epd->bEndpointAddress);
 450                        card->port[0].tx_data_ep = usb_endpoint_num(epd);
 451                        atomic_set(&card->port[0].tx_data_urb_pending, 0);
 452                }
 453                if (usb_endpoint_dir_out(epd) &&
 454                    usb_endpoint_num(epd) == MWIFIEX_USB_EP_DATA_CH2 &&
 455                    usb_endpoint_xfer_bulk(epd)) {
 456                        pr_debug("info: bulk OUT chan2:\t"
 457                                 "max pkt size: %d, addr: %d\n",
 458                                 le16_to_cpu(epd->wMaxPacketSize),
 459                                 epd->bEndpointAddress);
 460                        card->port[1].tx_data_ep = usb_endpoint_num(epd);
 461                        atomic_set(&card->port[1].tx_data_urb_pending, 0);
 462                }
 463                if (usb_endpoint_dir_out(epd) &&
 464                    usb_endpoint_num(epd) == MWIFIEX_USB_EP_CMD_EVENT &&
 465                    usb_endpoint_xfer_bulk(epd)) {
 466                        pr_debug("info: bulk OUT: max pkt size: %d, addr: %d\n",
 467                                 le16_to_cpu(epd->wMaxPacketSize),
 468                                 epd->bEndpointAddress);
 469                        card->tx_cmd_ep = usb_endpoint_num(epd);
 470                        atomic_set(&card->tx_cmd_urb_pending, 0);
 471                        card->bulk_out_maxpktsize =
 472                                        le16_to_cpu(epd->wMaxPacketSize);
 473                }
 474        }
 475
 476        usb_set_intfdata(intf, card);
 477
 478        ret = mwifiex_add_card(card, &add_remove_card_sem, &usb_ops,
 479                               MWIFIEX_USB);
 480        if (ret) {
 481                pr_err("%s: mwifiex_add_card failed: %d\n", __func__, ret);
 482                usb_reset_device(udev);
 483                kfree(card);
 484                return ret;
 485        }
 486
 487        usb_get_dev(udev);
 488
 489        return 0;
 490}
 491
 492/* Kernel needs to suspend all functions separately. Therefore all
 493 * registered functions must have drivers with suspend and resume
 494 * methods. Failing that the kernel simply removes the whole card.
 495 *
 496 * If already not suspended, this function allocates and sends a
 497 * 'host sleep activate' request to the firmware and turns off the traffic.
 498 */
 499static int mwifiex_usb_suspend(struct usb_interface *intf, pm_message_t message)
 500{
 501        struct usb_card_rec *card = usb_get_intfdata(intf);
 502        struct mwifiex_adapter *adapter;
 503        struct usb_tx_data_port *port;
 504        int i, j;
 505
 506        if (!card || !card->adapter) {
 507                pr_err("%s: card or card->adapter is NULL\n", __func__);
 508                return 0;
 509        }
 510        adapter = card->adapter;
 511
 512        if (unlikely(adapter->is_suspended))
 513                mwifiex_dbg(adapter, WARN,
 514                            "Device already suspended\n");
 515
 516        mwifiex_enable_hs(adapter);
 517
 518        /* 'is_suspended' flag indicates device is suspended.
 519         * It must be set here before the usb_kill_urb() calls. Reason
 520         * is in the complete handlers, urb->status(= -ENOENT) and
 521         * this flag is used in combination to distinguish between a
 522         * 'suspended' state and a 'disconnect' one.
 523         */
 524        adapter->is_suspended = true;
 525        adapter->hs_enabling = false;
 526
 527        if (atomic_read(&card->rx_cmd_urb_pending) && card->rx_cmd.urb)
 528                usb_kill_urb(card->rx_cmd.urb);
 529
 530        if (atomic_read(&card->rx_data_urb_pending))
 531                for (i = 0; i < MWIFIEX_RX_DATA_URB; i++)
 532                        if (card->rx_data_list[i].urb)
 533                                usb_kill_urb(card->rx_data_list[i].urb);
 534
 535        for (i = 0; i < MWIFIEX_TX_DATA_PORT; i++) {
 536                port = &card->port[i];
 537                for (j = 0; j < MWIFIEX_TX_DATA_URB; j++) {
 538                        if (port->tx_data_list[j].urb)
 539                                usb_kill_urb(port->tx_data_list[j].urb);
 540                }
 541        }
 542
 543        if (card->tx_cmd.urb)
 544                usb_kill_urb(card->tx_cmd.urb);
 545
 546        return 0;
 547}
 548
 549/* Kernel needs to suspend all functions separately. Therefore all
 550 * registered functions must have drivers with suspend and resume
 551 * methods. Failing that the kernel simply removes the whole card.
 552 *
 553 * If already not resumed, this function turns on the traffic and
 554 * sends a 'host sleep cancel' request to the firmware.
 555 */
 556static int mwifiex_usb_resume(struct usb_interface *intf)
 557{
 558        struct usb_card_rec *card = usb_get_intfdata(intf);
 559        struct mwifiex_adapter *adapter;
 560        int i;
 561
 562        if (!card || !card->adapter) {
 563                pr_err("%s: card or card->adapter is NULL\n", __func__);
 564                return 0;
 565        }
 566        adapter = card->adapter;
 567
 568        if (unlikely(!adapter->is_suspended)) {
 569                mwifiex_dbg(adapter, WARN,
 570                            "Device already resumed\n");
 571                return 0;
 572        }
 573
 574        /* Indicate device resumed. The netdev queue will be resumed only
 575         * after the urbs have been re-submitted
 576         */
 577        adapter->is_suspended = false;
 578
 579        if (!atomic_read(&card->rx_data_urb_pending))
 580                for (i = 0; i < MWIFIEX_RX_DATA_URB; i++)
 581                        mwifiex_usb_submit_rx_urb(&card->rx_data_list[i],
 582                                                  MWIFIEX_RX_DATA_BUF_SIZE);
 583
 584        if (!atomic_read(&card->rx_cmd_urb_pending)) {
 585                card->rx_cmd.skb = dev_alloc_skb(MWIFIEX_RX_CMD_BUF_SIZE);
 586                if (card->rx_cmd.skb)
 587                        mwifiex_usb_submit_rx_urb(&card->rx_cmd,
 588                                                  MWIFIEX_RX_CMD_BUF_SIZE);
 589        }
 590
 591        /* Disable Host Sleep */
 592        if (adapter->hs_activated)
 593                mwifiex_cancel_hs(mwifiex_get_priv(adapter,
 594                                                   MWIFIEX_BSS_ROLE_ANY),
 595                                  MWIFIEX_ASYNC_CMD);
 596
 597        return 0;
 598}
 599
 600static void mwifiex_usb_disconnect(struct usb_interface *intf)
 601{
 602        struct usb_card_rec *card = usb_get_intfdata(intf);
 603        struct mwifiex_adapter *adapter;
 604
 605        if (!card || !card->adapter) {
 606                pr_err("%s: card or card->adapter is NULL\n", __func__);
 607                return;
 608        }
 609
 610        adapter = card->adapter;
 611        if (!adapter->priv_num)
 612                return;
 613
 614        if (user_rmmod) {
 615#ifdef CONFIG_PM
 616                if (adapter->is_suspended)
 617                        mwifiex_usb_resume(intf);
 618#endif
 619
 620                mwifiex_deauthenticate_all(adapter);
 621
 622                mwifiex_init_shutdown_fw(mwifiex_get_priv(adapter,
 623                                                          MWIFIEX_BSS_ROLE_ANY),
 624                                         MWIFIEX_FUNC_SHUTDOWN);
 625        }
 626
 627        mwifiex_usb_free(card);
 628
 629        mwifiex_dbg(adapter, FATAL,
 630                    "%s: removing card\n", __func__);
 631        mwifiex_remove_card(adapter, &add_remove_card_sem);
 632
 633        usb_set_intfdata(intf, NULL);
 634        usb_put_dev(interface_to_usbdev(intf));
 635        kfree(card);
 636
 637        return;
 638}
 639
 640static struct usb_driver mwifiex_usb_driver = {
 641        .name = "mwifiex_usb",
 642        .probe = mwifiex_usb_probe,
 643        .disconnect = mwifiex_usb_disconnect,
 644        .id_table = mwifiex_usb_table,
 645        .suspend = mwifiex_usb_suspend,
 646        .resume = mwifiex_usb_resume,
 647        .soft_unbind = 1,
 648};
 649
 650static int mwifiex_usb_tx_init(struct mwifiex_adapter *adapter)
 651{
 652        struct usb_card_rec *card = (struct usb_card_rec *)adapter->card;
 653        struct usb_tx_data_port *port;
 654        int i, j;
 655
 656        card->tx_cmd.adapter = adapter;
 657        card->tx_cmd.ep = card->tx_cmd_ep;
 658
 659        card->tx_cmd.urb = usb_alloc_urb(0, GFP_KERNEL);
 660        if (!card->tx_cmd.urb) {
 661                mwifiex_dbg(adapter, ERROR,
 662                            "tx_cmd.urb allocation failed\n");
 663                return -ENOMEM;
 664        }
 665
 666        for (i = 0; i < MWIFIEX_TX_DATA_PORT; i++) {
 667                port = &card->port[i];
 668                if (!port->tx_data_ep)
 669                        continue;
 670                port->tx_data_ix = 0;
 671                if (port->tx_data_ep == MWIFIEX_USB_EP_DATA)
 672                        port->block_status = false;
 673                else
 674                        port->block_status = true;
 675                for (j = 0; j < MWIFIEX_TX_DATA_URB; j++) {
 676                        port->tx_data_list[j].adapter = adapter;
 677                        port->tx_data_list[j].ep = port->tx_data_ep;
 678                        port->tx_data_list[j].urb =
 679                                        usb_alloc_urb(0, GFP_KERNEL);
 680                        if (!port->tx_data_list[j].urb) {
 681                                mwifiex_dbg(adapter, ERROR,
 682                                            "urb allocation failed\n");
 683                                return -ENOMEM;
 684                        }
 685                }
 686        }
 687
 688        return 0;
 689}
 690
 691static int mwifiex_usb_rx_init(struct mwifiex_adapter *adapter)
 692{
 693        struct usb_card_rec *card = (struct usb_card_rec *)adapter->card;
 694        int i;
 695
 696        card->rx_cmd.adapter = adapter;
 697        card->rx_cmd.ep = card->rx_cmd_ep;
 698
 699        card->rx_cmd.urb = usb_alloc_urb(0, GFP_KERNEL);
 700        if (!card->rx_cmd.urb) {
 701                mwifiex_dbg(adapter, ERROR, "rx_cmd.urb allocation failed\n");
 702                return -ENOMEM;
 703        }
 704
 705        card->rx_cmd.skb = dev_alloc_skb(MWIFIEX_RX_CMD_BUF_SIZE);
 706        if (!card->rx_cmd.skb)
 707                return -ENOMEM;
 708
 709        if (mwifiex_usb_submit_rx_urb(&card->rx_cmd, MWIFIEX_RX_CMD_BUF_SIZE))
 710                return -1;
 711
 712        for (i = 0; i < MWIFIEX_RX_DATA_URB; i++) {
 713                card->rx_data_list[i].adapter = adapter;
 714                card->rx_data_list[i].ep = card->rx_data_ep;
 715
 716                card->rx_data_list[i].urb = usb_alloc_urb(0, GFP_KERNEL);
 717                if (!card->rx_data_list[i].urb) {
 718                        mwifiex_dbg(adapter, ERROR,
 719                                    "rx_data_list[] urb allocation failed\n");
 720                        return -1;
 721                }
 722                if (mwifiex_usb_submit_rx_urb(&card->rx_data_list[i],
 723                                              MWIFIEX_RX_DATA_BUF_SIZE))
 724                        return -1;
 725        }
 726
 727        return 0;
 728}
 729
 730static int mwifiex_write_data_sync(struct mwifiex_adapter *adapter, u8 *pbuf,
 731                                   u32 *len, u8 ep, u32 timeout)
 732{
 733        struct usb_card_rec *card = adapter->card;
 734        int actual_length, ret;
 735
 736        if (!(*len % card->bulk_out_maxpktsize))
 737                (*len)++;
 738
 739        /* Send the data block */
 740        ret = usb_bulk_msg(card->udev, usb_sndbulkpipe(card->udev, ep), pbuf,
 741                           *len, &actual_length, timeout);
 742        if (ret) {
 743                mwifiex_dbg(adapter, ERROR,
 744                            "usb_bulk_msg for tx failed: %d\n", ret);
 745                return ret;
 746        }
 747
 748        *len = actual_length;
 749
 750        return ret;
 751}
 752
 753static int mwifiex_read_data_sync(struct mwifiex_adapter *adapter, u8 *pbuf,
 754                                  u32 *len, u8 ep, u32 timeout)
 755{
 756        struct usb_card_rec *card = adapter->card;
 757        int actual_length, ret;
 758
 759        /* Receive the data response */
 760        ret = usb_bulk_msg(card->udev, usb_rcvbulkpipe(card->udev, ep), pbuf,
 761                           *len, &actual_length, timeout);
 762        if (ret) {
 763                mwifiex_dbg(adapter, ERROR,
 764                            "usb_bulk_msg for rx failed: %d\n", ret);
 765                return ret;
 766        }
 767
 768        *len = actual_length;
 769
 770        return ret;
 771}
 772
 773static void mwifiex_usb_port_resync(struct mwifiex_adapter *adapter)
 774{
 775        struct usb_card_rec *card = adapter->card;
 776        u8 active_port = MWIFIEX_USB_EP_DATA;
 777        struct mwifiex_private *priv = NULL;
 778        int i;
 779
 780        if (adapter->usb_mc_status) {
 781                for (i = 0; i < adapter->priv_num; i++) {
 782                        priv = adapter->priv[i];
 783                        if (!priv)
 784                                continue;
 785                        if ((priv->bss_role == MWIFIEX_BSS_ROLE_UAP &&
 786                             !priv->bss_started) ||
 787                            (priv->bss_role == MWIFIEX_BSS_ROLE_STA &&
 788                             !priv->media_connected))
 789                                priv->usb_port = MWIFIEX_USB_EP_DATA;
 790                }
 791                for (i = 0; i < MWIFIEX_TX_DATA_PORT; i++)
 792                        card->port[i].block_status = false;
 793        } else {
 794                for (i = 0; i < adapter->priv_num; i++) {
 795                        priv = adapter->priv[i];
 796                        if (!priv)
 797                                continue;
 798                        if ((priv->bss_role == MWIFIEX_BSS_ROLE_UAP &&
 799                             priv->bss_started) ||
 800                            (priv->bss_role == MWIFIEX_BSS_ROLE_STA &&
 801                             priv->media_connected)) {
 802                                active_port = priv->usb_port;
 803                                break;
 804                        }
 805                }
 806                for (i = 0; i < adapter->priv_num; i++) {
 807                        priv = adapter->priv[i];
 808                        if (priv)
 809                                priv->usb_port = active_port;
 810                }
 811                for (i = 0; i < MWIFIEX_TX_DATA_PORT; i++) {
 812                        if (active_port == card->port[i].tx_data_ep)
 813                                card->port[i].block_status = false;
 814                        else
 815                                card->port[i].block_status = true;
 816                }
 817        }
 818}
 819
 820static bool mwifiex_usb_is_port_ready(struct mwifiex_private *priv)
 821{
 822        struct usb_card_rec *card = priv->adapter->card;
 823        int idx;
 824
 825        for (idx = 0; idx < MWIFIEX_TX_DATA_PORT; idx++) {
 826                if (priv->usb_port == card->port[idx].tx_data_ep)
 827                        return !card->port[idx].block_status;
 828        }
 829
 830        return false;
 831}
 832
 833static inline u8 mwifiex_usb_data_sent(struct mwifiex_adapter *adapter)
 834{
 835        struct usb_card_rec *card = adapter->card;
 836        int i;
 837
 838        for (i = 0; i < MWIFIEX_TX_DATA_PORT; i++)
 839                if (!card->port[i].block_status)
 840                        return false;
 841
 842        return true;
 843}
 844
 845/* This function write a command/data packet to card. */
 846static int mwifiex_usb_host_to_card(struct mwifiex_adapter *adapter, u8 ep,
 847                                    struct sk_buff *skb,
 848                                    struct mwifiex_tx_param *tx_param)
 849{
 850        struct usb_card_rec *card = adapter->card;
 851        struct urb_context *context = NULL;
 852        struct usb_tx_data_port *port = NULL;
 853        u8 *data = (u8 *)skb->data;
 854        struct urb *tx_urb;
 855        int idx, ret;
 856
 857        if (adapter->is_suspended) {
 858                mwifiex_dbg(adapter, ERROR,
 859                            "%s: not allowed while suspended\n", __func__);
 860                return -1;
 861        }
 862
 863        if (adapter->surprise_removed) {
 864                mwifiex_dbg(adapter, ERROR, "%s: device removed\n", __func__);
 865                return -1;
 866        }
 867
 868        mwifiex_dbg(adapter, INFO, "%s: ep=%d\n", __func__, ep);
 869
 870        if (ep == card->tx_cmd_ep) {
 871                context = &card->tx_cmd;
 872        } else {
 873                for (idx = 0; idx < MWIFIEX_TX_DATA_PORT; idx++) {
 874                        if (ep == card->port[idx].tx_data_ep) {
 875                                port = &card->port[idx];
 876                                if (atomic_read(&port->tx_data_urb_pending)
 877                                    >= MWIFIEX_TX_DATA_URB) {
 878                                        port->block_status = true;
 879                                        ret = -EBUSY;
 880                                        goto done;
 881                                }
 882                                if (port->tx_data_ix >= MWIFIEX_TX_DATA_URB)
 883                                        port->tx_data_ix = 0;
 884                                context =
 885                                        &port->tx_data_list[port->tx_data_ix++];
 886                                break;
 887                        }
 888                }
 889                if (!port) {
 890                        mwifiex_dbg(adapter, ERROR, "Wrong usb tx data port\n");
 891                        return -1;
 892                }
 893        }
 894
 895        context->adapter = adapter;
 896        context->ep = ep;
 897        context->skb = skb;
 898        tx_urb = context->urb;
 899
 900        usb_fill_bulk_urb(tx_urb, card->udev, usb_sndbulkpipe(card->udev, ep),
 901                          data, skb->len, mwifiex_usb_tx_complete,
 902                          (void *)context);
 903
 904        tx_urb->transfer_flags |= URB_ZERO_PACKET;
 905
 906        if (ep == card->tx_cmd_ep)
 907                atomic_inc(&card->tx_cmd_urb_pending);
 908        else
 909                atomic_inc(&port->tx_data_urb_pending);
 910
 911        if (usb_submit_urb(tx_urb, GFP_ATOMIC)) {
 912                mwifiex_dbg(adapter, ERROR,
 913                            "%s: usb_submit_urb failed\n", __func__);
 914                if (ep == card->tx_cmd_ep) {
 915                        atomic_dec(&card->tx_cmd_urb_pending);
 916                } else {
 917                        atomic_dec(&port->tx_data_urb_pending);
 918                        port->block_status = false;
 919                        if (port->tx_data_ix)
 920                                port->tx_data_ix--;
 921                        else
 922                                port->tx_data_ix = MWIFIEX_TX_DATA_URB;
 923                }
 924
 925                return -1;
 926        } else {
 927                if (ep != card->tx_cmd_ep &&
 928                    atomic_read(&port->tx_data_urb_pending) ==
 929                                                        MWIFIEX_TX_DATA_URB) {
 930                        port->block_status = true;
 931                        ret = -ENOSR;
 932                        goto done;
 933                }
 934        }
 935
 936        return -EINPROGRESS;
 937
 938done:
 939        if (ep != card->tx_cmd_ep)
 940                adapter->data_sent = mwifiex_usb_data_sent(adapter);
 941
 942        return ret;
 943}
 944
 945/* This function register usb device and initialize parameter. */
 946static int mwifiex_register_dev(struct mwifiex_adapter *adapter)
 947{
 948        struct usb_card_rec *card = (struct usb_card_rec *)adapter->card;
 949
 950        card->adapter = adapter;
 951        adapter->dev = &card->udev->dev;
 952
 953        switch (le16_to_cpu(card->udev->descriptor.idProduct)) {
 954        case USB8997_PID_1:
 955        case USB8997_PID_2:
 956                adapter->tx_buf_size = MWIFIEX_TX_DATA_BUF_SIZE_4K;
 957                strcpy(adapter->fw_name, USB8997_DEFAULT_FW_NAME);
 958                adapter->ext_scan = true;
 959                break;
 960        case USB8766_PID_1:
 961        case USB8766_PID_2:
 962                adapter->tx_buf_size = MWIFIEX_TX_DATA_BUF_SIZE_2K;
 963                strcpy(adapter->fw_name, USB8766_DEFAULT_FW_NAME);
 964                adapter->ext_scan = true;
 965                break;
 966        case USB8801_PID_1:
 967        case USB8801_PID_2:
 968                adapter->tx_buf_size = MWIFIEX_TX_DATA_BUF_SIZE_2K;
 969                strcpy(adapter->fw_name, USB8801_DEFAULT_FW_NAME);
 970                adapter->ext_scan = false;
 971                break;
 972        case USB8797_PID_1:
 973        case USB8797_PID_2:
 974        default:
 975                adapter->tx_buf_size = MWIFIEX_TX_DATA_BUF_SIZE_2K;
 976                strcpy(adapter->fw_name, USB8797_DEFAULT_FW_NAME);
 977                break;
 978        }
 979
 980        adapter->usb_mc_status = false;
 981        adapter->usb_mc_setup = false;
 982
 983        return 0;
 984}
 985
 986static void mwifiex_unregister_dev(struct mwifiex_adapter *adapter)
 987{
 988        struct usb_card_rec *card = (struct usb_card_rec *)adapter->card;
 989
 990        card->adapter = NULL;
 991}
 992
 993static int mwifiex_prog_fw_w_helper(struct mwifiex_adapter *adapter,
 994                                    struct mwifiex_fw_image *fw)
 995{
 996        int ret = 0;
 997        u8 *firmware = fw->fw_buf, *recv_buff;
 998        u32 retries = USB8XXX_FW_MAX_RETRY + 1;
 999        u32 dlen;
1000        u32 fw_seqnum = 0, tlen = 0, dnld_cmd = 0;
1001        struct fw_data *fwdata;
1002        struct fw_sync_header sync_fw;
1003        u8 check_winner = 1;
1004
1005        if (!firmware) {
1006                mwifiex_dbg(adapter, ERROR,
1007                            "No firmware image found! Terminating download\n");
1008                ret = -1;
1009                goto fw_exit;
1010        }
1011
1012        /* Allocate memory for transmit */
1013        fwdata = kzalloc(FW_DNLD_TX_BUF_SIZE, GFP_KERNEL);
1014        if (!fwdata) {
1015                ret = -ENOMEM;
1016                goto fw_exit;
1017        }
1018
1019        /* Allocate memory for receive */
1020        recv_buff = kzalloc(FW_DNLD_RX_BUF_SIZE, GFP_KERNEL);
1021        if (!recv_buff) {
1022                ret = -ENOMEM;
1023                goto cleanup;
1024        }
1025
1026        do {
1027                /* Send pseudo data to check winner status first */
1028                if (check_winner) {
1029                        memset(&fwdata->fw_hdr, 0, sizeof(struct fw_header));
1030                        dlen = 0;
1031                } else {
1032                        /* copy the header of the fw_data to get the length */
1033                        memcpy(&fwdata->fw_hdr, &firmware[tlen],
1034                               sizeof(struct fw_header));
1035
1036                        dlen = le32_to_cpu(fwdata->fw_hdr.data_len);
1037                        dnld_cmd = le32_to_cpu(fwdata->fw_hdr.dnld_cmd);
1038                        tlen += sizeof(struct fw_header);
1039
1040                        memcpy(fwdata->data, &firmware[tlen], dlen);
1041
1042                        fwdata->seq_num = cpu_to_le32(fw_seqnum);
1043                        tlen += dlen;
1044                }
1045
1046                /* If the send/receive fails or CRC occurs then retry */
1047                while (--retries) {
1048                        u8 *buf = (u8 *)fwdata;
1049                        u32 len = FW_DATA_XMIT_SIZE;
1050
1051                        /* send the firmware block */
1052                        ret = mwifiex_write_data_sync(adapter, buf, &len,
1053                                                MWIFIEX_USB_EP_CMD_EVENT,
1054                                                MWIFIEX_USB_TIMEOUT);
1055                        if (ret) {
1056                                mwifiex_dbg(adapter, ERROR,
1057                                            "write_data_sync: failed: %d\n",
1058                                            ret);
1059                                continue;
1060                        }
1061
1062                        buf = recv_buff;
1063                        len = FW_DNLD_RX_BUF_SIZE;
1064
1065                        /* Receive the firmware block response */
1066                        ret = mwifiex_read_data_sync(adapter, buf, &len,
1067                                                MWIFIEX_USB_EP_CMD_EVENT,
1068                                                MWIFIEX_USB_TIMEOUT);
1069                        if (ret) {
1070                                mwifiex_dbg(adapter, ERROR,
1071                                            "read_data_sync: failed: %d\n",
1072                                            ret);
1073                                continue;
1074                        }
1075
1076                        memcpy(&sync_fw, recv_buff,
1077                               sizeof(struct fw_sync_header));
1078
1079                        /* check 1st firmware block resp for highest bit set */
1080                        if (check_winner) {
1081                                if (le32_to_cpu(sync_fw.cmd) & 0x80000000) {
1082                                        mwifiex_dbg(adapter, WARN,
1083                                                    "USB is not the winner %#x\n",
1084                                                    sync_fw.cmd);
1085
1086                                        /* returning success */
1087                                        ret = 0;
1088                                        goto cleanup;
1089                                }
1090
1091                                mwifiex_dbg(adapter, MSG,
1092                                            "start to download FW...\n");
1093
1094                                check_winner = 0;
1095                                break;
1096                        }
1097
1098                        /* check the firmware block response for CRC errors */
1099                        if (sync_fw.cmd) {
1100                                mwifiex_dbg(adapter, ERROR,
1101                                            "FW received block with CRC %#x\n",
1102                                            sync_fw.cmd);
1103                                ret = -1;
1104                                continue;
1105                        }
1106
1107                        retries = USB8XXX_FW_MAX_RETRY + 1;
1108                        break;
1109                }
1110                fw_seqnum++;
1111        } while ((dnld_cmd != FW_HAS_LAST_BLOCK) && retries);
1112
1113cleanup:
1114        mwifiex_dbg(adapter, MSG,
1115                    "info: FW download over, size %d bytes\n", tlen);
1116
1117        kfree(recv_buff);
1118        kfree(fwdata);
1119
1120        if (retries)
1121                ret = 0;
1122fw_exit:
1123        return ret;
1124}
1125
1126static int mwifiex_usb_dnld_fw(struct mwifiex_adapter *adapter,
1127                        struct mwifiex_fw_image *fw)
1128{
1129        int ret;
1130        struct usb_card_rec *card = (struct usb_card_rec *)adapter->card;
1131
1132        if (card->usb_boot_state == USB8XXX_FW_DNLD) {
1133                ret = mwifiex_prog_fw_w_helper(adapter, fw);
1134                if (ret)
1135                        return -1;
1136
1137                /* Boot state changes after successful firmware download */
1138                if (card->usb_boot_state == USB8XXX_FW_DNLD)
1139                        return -1;
1140        }
1141
1142        ret = mwifiex_usb_rx_init(adapter);
1143        if (!ret)
1144                ret = mwifiex_usb_tx_init(adapter);
1145
1146        return ret;
1147}
1148
1149static void mwifiex_submit_rx_urb(struct mwifiex_adapter *adapter, u8 ep)
1150{
1151        struct usb_card_rec *card = (struct usb_card_rec *)adapter->card;
1152
1153        skb_push(card->rx_cmd.skb, INTF_HEADER_LEN);
1154        if ((ep == card->rx_cmd_ep) &&
1155            (!atomic_read(&card->rx_cmd_urb_pending)))
1156                mwifiex_usb_submit_rx_urb(&card->rx_cmd,
1157                                          MWIFIEX_RX_CMD_BUF_SIZE);
1158
1159        return;
1160}
1161
1162static int mwifiex_usb_cmd_event_complete(struct mwifiex_adapter *adapter,
1163                                       struct sk_buff *skb)
1164{
1165        mwifiex_submit_rx_urb(adapter, MWIFIEX_USB_EP_CMD_EVENT);
1166
1167        return 0;
1168}
1169
1170/* This function wakes up the card. */
1171static int mwifiex_pm_wakeup_card(struct mwifiex_adapter *adapter)
1172{
1173        /* Simulation of HS_AWAKE event */
1174        adapter->pm_wakeup_fw_try = false;
1175        del_timer(&adapter->wakeup_timer);
1176        adapter->pm_wakeup_card_req = false;
1177        adapter->ps_state = PS_STATE_AWAKE;
1178
1179        return 0;
1180}
1181
1182static void mwifiex_usb_submit_rem_rx_urbs(struct mwifiex_adapter *adapter)
1183{
1184        struct usb_card_rec *card = (struct usb_card_rec *)adapter->card;
1185        int i;
1186        struct urb_context *ctx;
1187
1188        for (i = 0; i < MWIFIEX_RX_DATA_URB; i++) {
1189                if (card->rx_data_list[i].skb)
1190                        continue;
1191                ctx = &card->rx_data_list[i];
1192                mwifiex_usb_submit_rx_urb(ctx, MWIFIEX_RX_DATA_BUF_SIZE);
1193        }
1194}
1195
1196/* This function is called after the card has woken up. */
1197static inline int
1198mwifiex_pm_wakeup_card_complete(struct mwifiex_adapter *adapter)
1199{
1200        return 0;
1201}
1202
1203static struct mwifiex_if_ops usb_ops = {
1204        .register_dev =         mwifiex_register_dev,
1205        .unregister_dev =       mwifiex_unregister_dev,
1206        .wakeup =               mwifiex_pm_wakeup_card,
1207        .wakeup_complete =      mwifiex_pm_wakeup_card_complete,
1208
1209        /* USB specific */
1210        .dnld_fw =              mwifiex_usb_dnld_fw,
1211        .cmdrsp_complete =      mwifiex_usb_cmd_event_complete,
1212        .event_complete =       mwifiex_usb_cmd_event_complete,
1213        .host_to_card =         mwifiex_usb_host_to_card,
1214        .submit_rem_rx_urbs =   mwifiex_usb_submit_rem_rx_urbs,
1215        .multi_port_resync =    mwifiex_usb_port_resync,
1216        .is_port_ready =        mwifiex_usb_is_port_ready,
1217};
1218
1219/* This function initializes the USB driver module.
1220 *
1221 * This initiates the semaphore and registers the device with
1222 * USB bus.
1223 */
1224static int mwifiex_usb_init_module(void)
1225{
1226        int ret;
1227
1228        pr_debug("Marvell USB8797 Driver\n");
1229
1230        sema_init(&add_remove_card_sem, 1);
1231
1232        ret = usb_register(&mwifiex_usb_driver);
1233        if (ret)
1234                pr_err("Driver register failed!\n");
1235        else
1236                pr_debug("info: Driver registered successfully!\n");
1237
1238        return ret;
1239}
1240
1241/* This function cleans up the USB driver.
1242 *
1243 * The following major steps are followed in .disconnect for cleanup:
1244 *      - Resume the device if its suspended
1245 *      - Disconnect the device if connected
1246 *      - Shutdown the firmware
1247 *      - Unregister the device from USB bus.
1248 */
1249static void mwifiex_usb_cleanup_module(void)
1250{
1251        if (!down_interruptible(&add_remove_card_sem))
1252                up(&add_remove_card_sem);
1253
1254        /* set the flag as user is removing this module */
1255        user_rmmod = 1;
1256
1257        usb_deregister(&mwifiex_usb_driver);
1258}
1259
1260module_init(mwifiex_usb_init_module);
1261module_exit(mwifiex_usb_cleanup_module);
1262
1263MODULE_AUTHOR("Marvell International Ltd.");
1264MODULE_DESCRIPTION("Marvell WiFi-Ex USB Driver version" USB_VERSION);
1265MODULE_VERSION(USB_VERSION);
1266MODULE_LICENSE("GPL v2");
1267MODULE_FIRMWARE(USB8766_DEFAULT_FW_NAME);
1268MODULE_FIRMWARE(USB8797_DEFAULT_FW_NAME);
1269MODULE_FIRMWARE(USB8801_DEFAULT_FW_NAME);
1270MODULE_FIRMWARE(USB8997_DEFAULT_FW_NAME);
1271