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 
25 static u8 user_rmmod;
26 static struct mwifiex_if_ops usb_ops;
27 static struct semaphore add_remove_card_sem;
28 
29 static 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 
53 MODULE_DEVICE_TABLE(usb, mwifiex_usb_table);
54 
55 static 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  */
60 static 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 
158 exit_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 
165 static 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 
238 setup_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 
257 static 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 
297 static 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 
336 static 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  */
375 static 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  */
499 static 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  */
556 static 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 
600 static 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 
640 static 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 
650 static 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 
691 static 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 
730 static 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 
753 static 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 
773 static 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 
820 static 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 
833 static 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. */
846 static 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 
938 done:
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. */
946 static 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 
986 static 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 
993 static 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 
1113 cleanup:
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;
1122 fw_exit:
1123 	return ret;
1124 }
1125 
1126 static 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 
1149 static 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 
1162 static 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. */
1171 static 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 
1182 static 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. */
1197 static inline int
1198 mwifiex_pm_wakeup_card_complete(struct mwifiex_adapter *adapter)
1199 {
1200 	return 0;
1201 }
1202 
1203 static 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  */
1224 static 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  */
1249 static 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 
1260 module_init(mwifiex_usb_init_module);
1261 module_exit(mwifiex_usb_cleanup_module);
1262 
1263 MODULE_AUTHOR("Marvell International Ltd.");
1264 MODULE_DESCRIPTION("Marvell WiFi-Ex USB Driver version" USB_VERSION);
1265 MODULE_VERSION(USB_VERSION);
1266 MODULE_LICENSE("GPL v2");
1267 MODULE_FIRMWARE(USB8766_DEFAULT_FW_NAME);
1268 MODULE_FIRMWARE(USB8797_DEFAULT_FW_NAME);
1269 MODULE_FIRMWARE(USB8801_DEFAULT_FW_NAME);
1270 MODULE_FIRMWARE(USB8997_DEFAULT_FW_NAME);
1271