2 * Marvell Wireless LAN device driver: USB specific handling
4 * Copyright (C) 2012-2014, Marvell International Ltd.
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.
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.
23 #define USB_VERSION "1.0"
25 static struct mwifiex_if_ops usb_ops
;
27 static struct usb_device_id mwifiex_usb_table
[] = {
29 {USB_DEVICE(USB8XXX_VID
, USB8766_PID_1
)},
30 {USB_DEVICE_AND_INTERFACE_INFO(USB8XXX_VID
, USB8766_PID_2
,
31 USB_CLASS_VENDOR_SPEC
,
32 USB_SUBCLASS_VENDOR_SPEC
, 0xff)},
34 {USB_DEVICE(USB8XXX_VID
, USB8797_PID_1
)},
35 {USB_DEVICE_AND_INTERFACE_INFO(USB8XXX_VID
, USB8797_PID_2
,
36 USB_CLASS_VENDOR_SPEC
,
37 USB_SUBCLASS_VENDOR_SPEC
, 0xff)},
39 {USB_DEVICE(USB8XXX_VID
, USB8801_PID_1
)},
40 {USB_DEVICE_AND_INTERFACE_INFO(USB8XXX_VID
, USB8801_PID_2
,
41 USB_CLASS_VENDOR_SPEC
,
42 USB_SUBCLASS_VENDOR_SPEC
, 0xff)},
44 {USB_DEVICE(USB8XXX_VID
, USB8997_PID_1
)},
45 {USB_DEVICE_AND_INTERFACE_INFO(USB8XXX_VID
, USB8997_PID_2
,
46 USB_CLASS_VENDOR_SPEC
,
47 USB_SUBCLASS_VENDOR_SPEC
, 0xff)},
48 { } /* Terminating entry */
51 MODULE_DEVICE_TABLE(usb
, mwifiex_usb_table
);
53 static int mwifiex_usb_submit_rx_urb(struct urb_context
*ctx
, int size
);
55 /* This function handles received packet. Necessary action is taken based on
58 static int mwifiex_usb_recv(struct mwifiex_adapter
*adapter
,
59 struct sk_buff
*skb
, u8 ep
)
65 if (adapter
->hs_activated
)
66 mwifiex_process_hs_config(adapter
);
68 if (skb
->len
< INTF_HEADER_LEN
) {
69 mwifiex_dbg(adapter
, ERROR
,
70 "%s: invalid skb->len\n", __func__
);
75 case MWIFIEX_USB_EP_CMD_EVENT
:
76 mwifiex_dbg(adapter
, EVENT
,
77 "%s: EP_CMD_EVENT\n", __func__
);
78 skb_copy_from_linear_data(skb
, &tmp
, INTF_HEADER_LEN
);
79 recv_type
= le32_to_cpu(tmp
);
80 skb_pull(skb
, INTF_HEADER_LEN
);
83 case MWIFIEX_USB_TYPE_CMD
:
84 if (skb
->len
> MWIFIEX_SIZE_OF_CMD_BUFFER
) {
85 mwifiex_dbg(adapter
, ERROR
,
86 "CMD: skb->len too large\n");
88 goto exit_restore_skb
;
89 } else if (!adapter
->curr_cmd
) {
90 mwifiex_dbg(adapter
, WARN
, "CMD: no curr_cmd\n");
91 if (adapter
->ps_state
== PS_STATE_SLEEP_CFM
) {
92 mwifiex_process_sleep_confirm_resp(
96 goto exit_restore_skb
;
99 goto exit_restore_skb
;
102 adapter
->curr_cmd
->resp_skb
= skb
;
103 adapter
->cmd_resp_received
= true;
105 case MWIFIEX_USB_TYPE_EVENT
:
106 if (skb
->len
< sizeof(u32
)) {
107 mwifiex_dbg(adapter
, ERROR
,
108 "EVENT: skb->len too small\n");
110 goto exit_restore_skb
;
112 skb_copy_from_linear_data(skb
, &tmp
, sizeof(u32
));
113 adapter
->event_cause
= le32_to_cpu(tmp
);
114 mwifiex_dbg(adapter
, EVENT
,
115 "event_cause %#x\n", adapter
->event_cause
);
117 if (skb
->len
> MAX_EVENT_SIZE
) {
118 mwifiex_dbg(adapter
, ERROR
,
119 "EVENT: event body too large\n");
121 goto exit_restore_skb
;
124 memcpy(adapter
->event_body
, skb
->data
+
125 MWIFIEX_EVENT_HEADER_LEN
, skb
->len
);
127 adapter
->event_received
= true;
128 adapter
->event_skb
= skb
;
131 mwifiex_dbg(adapter
, ERROR
,
132 "unknown recv_type %#x\n", recv_type
);
136 case MWIFIEX_USB_EP_DATA
:
137 mwifiex_dbg(adapter
, DATA
, "%s: EP_DATA\n", __func__
);
138 if (skb
->len
> MWIFIEX_RX_DATA_BUF_SIZE
) {
139 mwifiex_dbg(adapter
, ERROR
,
140 "DATA: skb->len too large\n");
144 skb_queue_tail(&adapter
->rx_data_q
, skb
);
145 adapter
->data_received
= true;
146 atomic_inc(&adapter
->rx_pending
);
149 mwifiex_dbg(adapter
, ERROR
,
150 "%s: unknown endport %#x\n", __func__
, ep
);
157 /* The buffer will be reused for further cmds/events */
158 skb_push(skb
, INTF_HEADER_LEN
);
163 static void mwifiex_usb_rx_complete(struct urb
*urb
)
165 struct urb_context
*context
= (struct urb_context
*)urb
->context
;
166 struct mwifiex_adapter
*adapter
= context
->adapter
;
167 struct sk_buff
*skb
= context
->skb
;
168 struct usb_card_rec
*card
;
169 int recv_length
= urb
->actual_length
;
172 if (!adapter
|| !adapter
->card
) {
173 pr_err("mwifiex adapter or card structure is not valid\n");
177 card
= (struct usb_card_rec
*)adapter
->card
;
178 if (card
->rx_cmd_ep
== context
->ep
)
179 atomic_dec(&card
->rx_cmd_urb_pending
);
181 atomic_dec(&card
->rx_data_urb_pending
);
184 if (urb
->status
|| (adapter
->surprise_removed
)) {
185 mwifiex_dbg(adapter
, ERROR
,
186 "URB status is failed: %d\n", urb
->status
);
187 /* Do not free skb in case of command ep */
188 if (card
->rx_cmd_ep
!= context
->ep
)
189 dev_kfree_skb_any(skb
);
192 if (skb
->len
> recv_length
)
193 skb_trim(skb
, recv_length
);
195 skb_put(skb
, recv_length
- skb
->len
);
197 status
= mwifiex_usb_recv(adapter
, skb
, context
->ep
);
199 mwifiex_dbg(adapter
, INFO
,
200 "info: recv_length=%d, status=%d\n",
201 recv_length
, status
);
202 if (status
== -EINPROGRESS
) {
203 mwifiex_queue_main_work(adapter
);
205 /* urb for data_ep is re-submitted now;
206 * urb for cmd_ep will be re-submitted in callback
207 * mwifiex_usb_recv_complete
209 if (card
->rx_cmd_ep
== context
->ep
)
213 mwifiex_dbg(adapter
, ERROR
,
214 "received data processing failed!\n");
216 /* Do not free skb in case of command ep */
217 if (card
->rx_cmd_ep
!= context
->ep
)
218 dev_kfree_skb_any(skb
);
220 } else if (urb
->status
) {
221 if (!adapter
->is_suspended
) {
222 mwifiex_dbg(adapter
, FATAL
,
223 "Card is removed: %d\n", urb
->status
);
224 adapter
->surprise_removed
= true;
226 dev_kfree_skb_any(skb
);
229 /* Do not free skb in case of command ep */
230 if (card
->rx_cmd_ep
!= context
->ep
)
231 dev_kfree_skb_any(skb
);
233 /* fall through setup_for_next */
237 if (card
->rx_cmd_ep
== context
->ep
)
238 size
= MWIFIEX_RX_CMD_BUF_SIZE
;
240 size
= MWIFIEX_RX_DATA_BUF_SIZE
;
242 if (card
->rx_cmd_ep
== context
->ep
) {
243 mwifiex_usb_submit_rx_urb(context
, size
);
245 if (atomic_read(&adapter
->rx_pending
) <= HIGH_RX_PENDING
) {
246 mwifiex_usb_submit_rx_urb(context
, size
);
255 static void mwifiex_usb_tx_complete(struct urb
*urb
)
257 struct urb_context
*context
= (struct urb_context
*)(urb
->context
);
258 struct mwifiex_adapter
*adapter
= context
->adapter
;
259 struct usb_card_rec
*card
= adapter
->card
;
260 struct usb_tx_data_port
*port
;
263 mwifiex_dbg(adapter
, INFO
,
264 "%s: status: %d\n", __func__
, urb
->status
);
266 if (context
->ep
== card
->tx_cmd_ep
) {
267 mwifiex_dbg(adapter
, CMD
,
268 "%s: CMD\n", __func__
);
269 atomic_dec(&card
->tx_cmd_urb_pending
);
270 adapter
->cmd_sent
= false;
272 mwifiex_dbg(adapter
, DATA
,
273 "%s: DATA\n", __func__
);
274 mwifiex_write_data_complete(adapter
, context
->skb
, 0,
275 urb
->status
? -1 : 0);
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;
284 adapter
->data_sent
= false;
287 if (card
->mc_resync_flag
)
288 mwifiex_multi_chan_resync(adapter
);
290 mwifiex_queue_main_work(adapter
);
295 static int mwifiex_usb_submit_rx_urb(struct urb_context
*ctx
, int size
)
297 struct mwifiex_adapter
*adapter
= ctx
->adapter
;
298 struct usb_card_rec
*card
= (struct usb_card_rec
*)adapter
->card
;
300 if (card
->rx_cmd_ep
!= ctx
->ep
) {
301 ctx
->skb
= dev_alloc_skb(size
);
303 mwifiex_dbg(adapter
, ERROR
,
304 "%s: dev_alloc_skb failed\n", __func__
);
309 usb_fill_bulk_urb(ctx
->urb
, card
->udev
,
310 usb_rcvbulkpipe(card
->udev
, ctx
->ep
), ctx
->skb
->data
,
311 size
, mwifiex_usb_rx_complete
, (void *)ctx
);
313 if (card
->rx_cmd_ep
== ctx
->ep
)
314 atomic_inc(&card
->rx_cmd_urb_pending
);
316 atomic_inc(&card
->rx_data_urb_pending
);
318 if (usb_submit_urb(ctx
->urb
, GFP_ATOMIC
)) {
319 mwifiex_dbg(adapter
, ERROR
, "usb_submit_urb failed\n");
320 dev_kfree_skb_any(ctx
->skb
);
323 if (card
->rx_cmd_ep
== ctx
->ep
)
324 atomic_dec(&card
->rx_cmd_urb_pending
);
326 atomic_dec(&card
->rx_data_urb_pending
);
334 static void mwifiex_usb_free(struct usb_card_rec
*card
)
336 struct usb_tx_data_port
*port
;
339 if (atomic_read(&card
->rx_cmd_urb_pending
) && card
->rx_cmd
.urb
)
340 usb_kill_urb(card
->rx_cmd
.urb
);
342 usb_free_urb(card
->rx_cmd
.urb
);
343 card
->rx_cmd
.urb
= NULL
;
345 if (atomic_read(&card
->rx_data_urb_pending
))
346 for (i
= 0; i
< MWIFIEX_RX_DATA_URB
; i
++)
347 if (card
->rx_data_list
[i
].urb
)
348 usb_kill_urb(card
->rx_data_list
[i
].urb
);
350 for (i
= 0; i
< MWIFIEX_RX_DATA_URB
; i
++) {
351 usb_free_urb(card
->rx_data_list
[i
].urb
);
352 card
->rx_data_list
[i
].urb
= NULL
;
355 for (i
= 0; i
< MWIFIEX_TX_DATA_PORT
; i
++) {
356 port
= &card
->port
[i
];
357 for (j
= 0; j
< MWIFIEX_TX_DATA_URB
; j
++) {
358 usb_free_urb(port
->tx_data_list
[j
].urb
);
359 port
->tx_data_list
[j
].urb
= NULL
;
363 usb_free_urb(card
->tx_cmd
.urb
);
364 card
->tx_cmd
.urb
= NULL
;
369 /* This function probes an mwifiex device and registers it. It allocates
370 * the card structure, initiates the device registration and initialization
371 * procedure by adding a logical interface.
373 static int mwifiex_usb_probe(struct usb_interface
*intf
,
374 const struct usb_device_id
*id
)
376 struct usb_device
*udev
= interface_to_usbdev(intf
);
377 struct usb_host_interface
*iface_desc
= intf
->cur_altsetting
;
378 struct usb_endpoint_descriptor
*epd
;
380 struct usb_card_rec
*card
;
381 u16 id_vendor
, id_product
, bcd_device
;
383 card
= devm_kzalloc(&intf
->dev
, sizeof(*card
), GFP_KERNEL
);
387 init_completion(&card
->fw_done
);
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 pr_debug("info: VID/PID = %X/%X, Boot2 version = %X\n",
393 id_vendor
, id_product
, bcd_device
);
395 /* PID_1 is used for firmware downloading only */
396 switch (id_product
) {
401 card
->usb_boot_state
= USB8XXX_FW_DNLD
;
407 card
->usb_boot_state
= USB8XXX_FW_READY
;
410 pr_warn("unknown id_product %#x\n", id_product
);
411 card
->usb_boot_state
= USB8XXX_FW_DNLD
;
418 pr_debug("info: bcdUSB=%#x Device Class=%#x SubClass=%#x Protocol=%#x\n",
419 udev
->descriptor
.bcdUSB
, udev
->descriptor
.bDeviceClass
,
420 udev
->descriptor
.bDeviceSubClass
,
421 udev
->descriptor
.bDeviceProtocol
);
423 for (i
= 0; i
< iface_desc
->desc
.bNumEndpoints
; ++i
) {
424 epd
= &iface_desc
->endpoint
[i
].desc
;
425 if (usb_endpoint_dir_in(epd
) &&
426 usb_endpoint_num(epd
) == MWIFIEX_USB_EP_CMD_EVENT
&&
427 usb_endpoint_xfer_bulk(epd
)) {
428 pr_debug("info: bulk IN: max pkt size: %d, addr: %d\n",
429 le16_to_cpu(epd
->wMaxPacketSize
),
430 epd
->bEndpointAddress
);
431 card
->rx_cmd_ep
= usb_endpoint_num(epd
);
432 atomic_set(&card
->rx_cmd_urb_pending
, 0);
434 if (usb_endpoint_dir_in(epd
) &&
435 usb_endpoint_num(epd
) == MWIFIEX_USB_EP_DATA
&&
436 usb_endpoint_xfer_bulk(epd
)) {
437 pr_debug("info: bulk IN: max pkt size: %d, addr: %d\n",
438 le16_to_cpu(epd
->wMaxPacketSize
),
439 epd
->bEndpointAddress
);
440 card
->rx_data_ep
= usb_endpoint_num(epd
);
441 atomic_set(&card
->rx_data_urb_pending
, 0);
443 if (usb_endpoint_dir_out(epd
) &&
444 usb_endpoint_num(epd
) == MWIFIEX_USB_EP_DATA
&&
445 usb_endpoint_xfer_bulk(epd
)) {
446 pr_debug("info: bulk OUT: max pkt size: %d, addr: %d\n",
447 le16_to_cpu(epd
->wMaxPacketSize
),
448 epd
->bEndpointAddress
);
449 card
->port
[0].tx_data_ep
= usb_endpoint_num(epd
);
450 atomic_set(&card
->port
[0].tx_data_urb_pending
, 0);
452 if (usb_endpoint_dir_out(epd
) &&
453 usb_endpoint_num(epd
) == MWIFIEX_USB_EP_DATA_CH2
&&
454 usb_endpoint_xfer_bulk(epd
)) {
455 pr_debug("info: bulk OUT chan2:\t"
456 "max pkt size: %d, addr: %d\n",
457 le16_to_cpu(epd
->wMaxPacketSize
),
458 epd
->bEndpointAddress
);
459 card
->port
[1].tx_data_ep
= usb_endpoint_num(epd
);
460 atomic_set(&card
->port
[1].tx_data_urb_pending
, 0);
462 if (usb_endpoint_dir_out(epd
) &&
463 usb_endpoint_num(epd
) == MWIFIEX_USB_EP_CMD_EVENT
&&
464 usb_endpoint_xfer_bulk(epd
)) {
465 pr_debug("info: bulk OUT: max pkt size: %d, addr: %d\n",
466 le16_to_cpu(epd
->wMaxPacketSize
),
467 epd
->bEndpointAddress
);
468 card
->tx_cmd_ep
= usb_endpoint_num(epd
);
469 atomic_set(&card
->tx_cmd_urb_pending
, 0);
470 card
->bulk_out_maxpktsize
=
471 le16_to_cpu(epd
->wMaxPacketSize
);
475 usb_set_intfdata(intf
, card
);
477 ret
= mwifiex_add_card(card
, &card
->fw_done
, &usb_ops
,
478 MWIFIEX_USB
, &card
->udev
->dev
);
480 pr_err("%s: mwifiex_add_card failed: %d\n", __func__
, ret
);
481 usb_reset_device(udev
);
490 /* Kernel needs to suspend all functions separately. Therefore all
491 * registered functions must have drivers with suspend and resume
492 * methods. Failing that the kernel simply removes the whole card.
494 * If already not suspended, this function allocates and sends a
495 * 'host sleep activate' request to the firmware and turns off the traffic.
497 static int mwifiex_usb_suspend(struct usb_interface
*intf
, pm_message_t message
)
499 struct usb_card_rec
*card
= usb_get_intfdata(intf
);
500 struct mwifiex_adapter
*adapter
;
501 struct usb_tx_data_port
*port
;
504 /* Might still be loading firmware */
505 wait_for_completion(&card
->fw_done
);
507 adapter
= card
->adapter
;
509 dev_err(&intf
->dev
, "card is not valid\n");
513 if (unlikely(adapter
->is_suspended
))
514 mwifiex_dbg(adapter
, WARN
,
515 "Device already suspended\n");
517 /* Enable the Host Sleep */
518 if (!mwifiex_enable_hs(adapter
)) {
519 mwifiex_dbg(adapter
, ERROR
,
520 "cmd: failed to suspend\n");
521 adapter
->hs_enabling
= false;
526 /* 'is_suspended' flag indicates device is suspended.
527 * It must be set here before the usb_kill_urb() calls. Reason
528 * is in the complete handlers, urb->status(= -ENOENT) and
529 * this flag is used in combination to distinguish between a
530 * 'suspended' state and a 'disconnect' one.
532 adapter
->is_suspended
= true;
533 adapter
->hs_enabling
= false;
535 if (atomic_read(&card
->rx_cmd_urb_pending
) && card
->rx_cmd
.urb
)
536 usb_kill_urb(card
->rx_cmd
.urb
);
538 if (atomic_read(&card
->rx_data_urb_pending
))
539 for (i
= 0; i
< MWIFIEX_RX_DATA_URB
; i
++)
540 if (card
->rx_data_list
[i
].urb
)
541 usb_kill_urb(card
->rx_data_list
[i
].urb
);
543 for (i
= 0; i
< MWIFIEX_TX_DATA_PORT
; i
++) {
544 port
= &card
->port
[i
];
545 for (j
= 0; j
< MWIFIEX_TX_DATA_URB
; j
++) {
546 if (port
->tx_data_list
[j
].urb
)
547 usb_kill_urb(port
->tx_data_list
[j
].urb
);
551 if (card
->tx_cmd
.urb
)
552 usb_kill_urb(card
->tx_cmd
.urb
);
557 /* Kernel needs to suspend all functions separately. Therefore all
558 * registered functions must have drivers with suspend and resume
559 * methods. Failing that the kernel simply removes the whole card.
561 * If already not resumed, this function turns on the traffic and
562 * sends a 'host sleep cancel' request to the firmware.
564 static int mwifiex_usb_resume(struct usb_interface
*intf
)
566 struct usb_card_rec
*card
= usb_get_intfdata(intf
);
567 struct mwifiex_adapter
*adapter
;
570 if (!card
->adapter
) {
571 dev_err(&intf
->dev
, "%s: card->adapter is NULL\n",
575 adapter
= card
->adapter
;
577 if (unlikely(!adapter
->is_suspended
)) {
578 mwifiex_dbg(adapter
, WARN
,
579 "Device already resumed\n");
583 /* Indicate device resumed. The netdev queue will be resumed only
584 * after the urbs have been re-submitted
586 adapter
->is_suspended
= false;
588 if (!atomic_read(&card
->rx_data_urb_pending
))
589 for (i
= 0; i
< MWIFIEX_RX_DATA_URB
; i
++)
590 mwifiex_usb_submit_rx_urb(&card
->rx_data_list
[i
],
591 MWIFIEX_RX_DATA_BUF_SIZE
);
593 if (!atomic_read(&card
->rx_cmd_urb_pending
)) {
594 card
->rx_cmd
.skb
= dev_alloc_skb(MWIFIEX_RX_CMD_BUF_SIZE
);
595 if (card
->rx_cmd
.skb
)
596 mwifiex_usb_submit_rx_urb(&card
->rx_cmd
,
597 MWIFIEX_RX_CMD_BUF_SIZE
);
600 /* Disable Host Sleep */
601 if (adapter
->hs_activated
)
602 mwifiex_cancel_hs(mwifiex_get_priv(adapter
,
603 MWIFIEX_BSS_ROLE_ANY
),
609 static void mwifiex_usb_disconnect(struct usb_interface
*intf
)
611 struct usb_card_rec
*card
= usb_get_intfdata(intf
);
612 struct mwifiex_adapter
*adapter
;
614 wait_for_completion(&card
->fw_done
);
616 adapter
= card
->adapter
;
617 if (!adapter
|| !adapter
->priv_num
)
620 if (card
->udev
->state
!= USB_STATE_NOTATTACHED
&& !adapter
->mfg_mode
) {
621 mwifiex_deauthenticate_all(adapter
);
623 mwifiex_init_shutdown_fw(mwifiex_get_priv(adapter
,
624 MWIFIEX_BSS_ROLE_ANY
),
625 MWIFIEX_FUNC_SHUTDOWN
);
628 mwifiex_usb_free(card
);
630 mwifiex_dbg(adapter
, FATAL
,
631 "%s: removing card\n", __func__
);
632 mwifiex_remove_card(adapter
);
634 usb_put_dev(interface_to_usbdev(intf
));
637 static struct usb_driver mwifiex_usb_driver
= {
638 .name
= "mwifiex_usb",
639 .probe
= mwifiex_usb_probe
,
640 .disconnect
= mwifiex_usb_disconnect
,
641 .id_table
= mwifiex_usb_table
,
642 .suspend
= mwifiex_usb_suspend
,
643 .resume
= mwifiex_usb_resume
,
647 static int mwifiex_usb_tx_init(struct mwifiex_adapter
*adapter
)
649 struct usb_card_rec
*card
= (struct usb_card_rec
*)adapter
->card
;
650 struct usb_tx_data_port
*port
;
653 card
->tx_cmd
.adapter
= adapter
;
654 card
->tx_cmd
.ep
= card
->tx_cmd_ep
;
656 card
->tx_cmd
.urb
= usb_alloc_urb(0, GFP_KERNEL
);
657 if (!card
->tx_cmd
.urb
)
660 for (i
= 0; i
< MWIFIEX_TX_DATA_PORT
; i
++) {
661 port
= &card
->port
[i
];
662 if (!port
->tx_data_ep
)
664 port
->tx_data_ix
= 0;
665 if (port
->tx_data_ep
== MWIFIEX_USB_EP_DATA
)
666 port
->block_status
= false;
668 port
->block_status
= true;
669 for (j
= 0; j
< MWIFIEX_TX_DATA_URB
; j
++) {
670 port
->tx_data_list
[j
].adapter
= adapter
;
671 port
->tx_data_list
[j
].ep
= port
->tx_data_ep
;
672 port
->tx_data_list
[j
].urb
=
673 usb_alloc_urb(0, GFP_KERNEL
);
674 if (!port
->tx_data_list
[j
].urb
)
682 static int mwifiex_usb_rx_init(struct mwifiex_adapter
*adapter
)
684 struct usb_card_rec
*card
= (struct usb_card_rec
*)adapter
->card
;
687 card
->rx_cmd
.adapter
= adapter
;
688 card
->rx_cmd
.ep
= card
->rx_cmd_ep
;
690 card
->rx_cmd
.urb
= usb_alloc_urb(0, GFP_KERNEL
);
691 if (!card
->rx_cmd
.urb
)
694 card
->rx_cmd
.skb
= dev_alloc_skb(MWIFIEX_RX_CMD_BUF_SIZE
);
695 if (!card
->rx_cmd
.skb
)
698 if (mwifiex_usb_submit_rx_urb(&card
->rx_cmd
, MWIFIEX_RX_CMD_BUF_SIZE
))
701 for (i
= 0; i
< MWIFIEX_RX_DATA_URB
; i
++) {
702 card
->rx_data_list
[i
].adapter
= adapter
;
703 card
->rx_data_list
[i
].ep
= card
->rx_data_ep
;
705 card
->rx_data_list
[i
].urb
= usb_alloc_urb(0, GFP_KERNEL
);
706 if (!card
->rx_data_list
[i
].urb
)
708 if (mwifiex_usb_submit_rx_urb(&card
->rx_data_list
[i
],
709 MWIFIEX_RX_DATA_BUF_SIZE
))
716 static int mwifiex_write_data_sync(struct mwifiex_adapter
*adapter
, u8
*pbuf
,
717 u32
*len
, u8 ep
, u32 timeout
)
719 struct usb_card_rec
*card
= adapter
->card
;
720 int actual_length
, ret
;
722 if (!(*len
% card
->bulk_out_maxpktsize
))
725 /* Send the data block */
726 ret
= usb_bulk_msg(card
->udev
, usb_sndbulkpipe(card
->udev
, ep
), pbuf
,
727 *len
, &actual_length
, timeout
);
729 mwifiex_dbg(adapter
, ERROR
,
730 "usb_bulk_msg for tx failed: %d\n", ret
);
734 *len
= actual_length
;
739 static int mwifiex_read_data_sync(struct mwifiex_adapter
*adapter
, u8
*pbuf
,
740 u32
*len
, u8 ep
, u32 timeout
)
742 struct usb_card_rec
*card
= adapter
->card
;
743 int actual_length
, ret
;
745 /* Receive the data response */
746 ret
= usb_bulk_msg(card
->udev
, usb_rcvbulkpipe(card
->udev
, ep
), pbuf
,
747 *len
, &actual_length
, timeout
);
749 mwifiex_dbg(adapter
, ERROR
,
750 "usb_bulk_msg for rx failed: %d\n", ret
);
754 *len
= actual_length
;
759 static void mwifiex_usb_port_resync(struct mwifiex_adapter
*adapter
)
761 struct usb_card_rec
*card
= adapter
->card
;
762 u8 active_port
= MWIFIEX_USB_EP_DATA
;
763 struct mwifiex_private
*priv
= NULL
;
766 if (adapter
->usb_mc_status
) {
767 for (i
= 0; i
< adapter
->priv_num
; i
++) {
768 priv
= adapter
->priv
[i
];
771 if ((priv
->bss_role
== MWIFIEX_BSS_ROLE_UAP
&&
772 !priv
->bss_started
) ||
773 (priv
->bss_role
== MWIFIEX_BSS_ROLE_STA
&&
774 !priv
->media_connected
))
775 priv
->usb_port
= MWIFIEX_USB_EP_DATA
;
777 for (i
= 0; i
< MWIFIEX_TX_DATA_PORT
; i
++)
778 card
->port
[i
].block_status
= false;
780 for (i
= 0; i
< adapter
->priv_num
; i
++) {
781 priv
= adapter
->priv
[i
];
784 if ((priv
->bss_role
== MWIFIEX_BSS_ROLE_UAP
&&
785 priv
->bss_started
) ||
786 (priv
->bss_role
== MWIFIEX_BSS_ROLE_STA
&&
787 priv
->media_connected
)) {
788 active_port
= priv
->usb_port
;
792 for (i
= 0; i
< adapter
->priv_num
; i
++) {
793 priv
= adapter
->priv
[i
];
795 priv
->usb_port
= active_port
;
797 for (i
= 0; i
< MWIFIEX_TX_DATA_PORT
; i
++) {
798 if (active_port
== card
->port
[i
].tx_data_ep
)
799 card
->port
[i
].block_status
= false;
801 card
->port
[i
].block_status
= true;
806 static bool mwifiex_usb_is_port_ready(struct mwifiex_private
*priv
)
808 struct usb_card_rec
*card
= priv
->adapter
->card
;
811 for (idx
= 0; idx
< MWIFIEX_TX_DATA_PORT
; idx
++) {
812 if (priv
->usb_port
== card
->port
[idx
].tx_data_ep
)
813 return !card
->port
[idx
].block_status
;
819 static inline u8
mwifiex_usb_data_sent(struct mwifiex_adapter
*adapter
)
821 struct usb_card_rec
*card
= adapter
->card
;
824 for (i
= 0; i
< MWIFIEX_TX_DATA_PORT
; i
++)
825 if (!card
->port
[i
].block_status
)
831 /* This function write a command/data packet to card. */
832 static int mwifiex_usb_host_to_card(struct mwifiex_adapter
*adapter
, u8 ep
,
834 struct mwifiex_tx_param
*tx_param
)
836 struct usb_card_rec
*card
= adapter
->card
;
837 struct urb_context
*context
= NULL
;
838 struct usb_tx_data_port
*port
= NULL
;
839 u8
*data
= (u8
*)skb
->data
;
841 int idx
, ret
= -EINPROGRESS
;
843 if (adapter
->is_suspended
) {
844 mwifiex_dbg(adapter
, ERROR
,
845 "%s: not allowed while suspended\n", __func__
);
849 if (adapter
->surprise_removed
) {
850 mwifiex_dbg(adapter
, ERROR
, "%s: device removed\n", __func__
);
854 mwifiex_dbg(adapter
, INFO
, "%s: ep=%d\n", __func__
, ep
);
856 if (ep
== card
->tx_cmd_ep
) {
857 context
= &card
->tx_cmd
;
859 for (idx
= 0; idx
< MWIFIEX_TX_DATA_PORT
; idx
++) {
860 if (ep
== card
->port
[idx
].tx_data_ep
) {
861 port
= &card
->port
[idx
];
862 if (atomic_read(&port
->tx_data_urb_pending
)
863 >= MWIFIEX_TX_DATA_URB
) {
864 port
->block_status
= true;
866 mwifiex_usb_data_sent(adapter
);
869 if (port
->tx_data_ix
>= MWIFIEX_TX_DATA_URB
)
870 port
->tx_data_ix
= 0;
872 &port
->tx_data_list
[port
->tx_data_ix
++];
877 mwifiex_dbg(adapter
, ERROR
, "Wrong usb tx data port\n");
882 context
->adapter
= adapter
;
885 tx_urb
= context
->urb
;
887 usb_fill_bulk_urb(tx_urb
, card
->udev
, usb_sndbulkpipe(card
->udev
, ep
),
888 data
, skb
->len
, mwifiex_usb_tx_complete
,
891 tx_urb
->transfer_flags
|= URB_ZERO_PACKET
;
893 if (ep
== card
->tx_cmd_ep
)
894 atomic_inc(&card
->tx_cmd_urb_pending
);
896 atomic_inc(&port
->tx_data_urb_pending
);
898 if (ep
!= card
->tx_cmd_ep
&&
899 atomic_read(&port
->tx_data_urb_pending
) ==
900 MWIFIEX_TX_DATA_URB
) {
901 port
->block_status
= true;
902 adapter
->data_sent
= mwifiex_usb_data_sent(adapter
);
906 if (usb_submit_urb(tx_urb
, GFP_ATOMIC
)) {
907 mwifiex_dbg(adapter
, ERROR
,
908 "%s: usb_submit_urb failed\n", __func__
);
909 if (ep
== card
->tx_cmd_ep
) {
910 atomic_dec(&card
->tx_cmd_urb_pending
);
912 atomic_dec(&port
->tx_data_urb_pending
);
913 port
->block_status
= false;
914 adapter
->data_sent
= false;
915 if (port
->tx_data_ix
)
918 port
->tx_data_ix
= MWIFIEX_TX_DATA_URB
;
926 /* This function register usb device and initialize parameter. */
927 static int mwifiex_register_dev(struct mwifiex_adapter
*adapter
)
929 struct usb_card_rec
*card
= (struct usb_card_rec
*)adapter
->card
;
931 card
->adapter
= adapter
;
933 switch (le16_to_cpu(card
->udev
->descriptor
.idProduct
)) {
936 adapter
->tx_buf_size
= MWIFIEX_TX_DATA_BUF_SIZE_4K
;
937 strcpy(adapter
->fw_name
, USB8997_DEFAULT_FW_NAME
);
938 adapter
->ext_scan
= true;
942 adapter
->tx_buf_size
= MWIFIEX_TX_DATA_BUF_SIZE_2K
;
943 strcpy(adapter
->fw_name
, USB8766_DEFAULT_FW_NAME
);
944 adapter
->ext_scan
= true;
948 adapter
->tx_buf_size
= MWIFIEX_TX_DATA_BUF_SIZE_2K
;
949 strcpy(adapter
->fw_name
, USB8801_DEFAULT_FW_NAME
);
950 adapter
->ext_scan
= false;
955 adapter
->tx_buf_size
= MWIFIEX_TX_DATA_BUF_SIZE_2K
;
956 strcpy(adapter
->fw_name
, USB8797_DEFAULT_FW_NAME
);
960 adapter
->usb_mc_status
= false;
961 adapter
->usb_mc_setup
= false;
966 static void mwifiex_unregister_dev(struct mwifiex_adapter
*adapter
)
968 struct usb_card_rec
*card
= (struct usb_card_rec
*)adapter
->card
;
970 card
->adapter
= NULL
;
973 static int mwifiex_prog_fw_w_helper(struct mwifiex_adapter
*adapter
,
974 struct mwifiex_fw_image
*fw
)
977 u8
*firmware
= fw
->fw_buf
, *recv_buff
;
978 u32 retries
= USB8XXX_FW_MAX_RETRY
+ 1;
980 u32 fw_seqnum
= 0, tlen
= 0, dnld_cmd
= 0;
981 struct fw_data
*fwdata
;
982 struct fw_sync_header sync_fw
;
986 mwifiex_dbg(adapter
, ERROR
,
987 "No firmware image found! Terminating download\n");
992 /* Allocate memory for transmit */
993 fwdata
= kzalloc(FW_DNLD_TX_BUF_SIZE
, GFP_KERNEL
);
999 /* Allocate memory for receive */
1000 recv_buff
= kzalloc(FW_DNLD_RX_BUF_SIZE
, GFP_KERNEL
);
1007 /* Send pseudo data to check winner status first */
1009 memset(&fwdata
->fw_hdr
, 0, sizeof(struct fw_header
));
1012 /* copy the header of the fw_data to get the length */
1013 memcpy(&fwdata
->fw_hdr
, &firmware
[tlen
],
1014 sizeof(struct fw_header
));
1016 dlen
= le32_to_cpu(fwdata
->fw_hdr
.data_len
);
1017 dnld_cmd
= le32_to_cpu(fwdata
->fw_hdr
.dnld_cmd
);
1018 tlen
+= sizeof(struct fw_header
);
1020 /* Command 7 doesn't have data length field */
1021 if (dnld_cmd
== FW_CMD_7
)
1024 memcpy(fwdata
->data
, &firmware
[tlen
], dlen
);
1026 fwdata
->seq_num
= cpu_to_le32(fw_seqnum
);
1030 /* If the send/receive fails or CRC occurs then retry */
1032 u8
*buf
= (u8
*)fwdata
;
1033 u32 len
= FW_DATA_XMIT_SIZE
;
1035 /* send the firmware block */
1036 ret
= mwifiex_write_data_sync(adapter
, buf
, &len
,
1037 MWIFIEX_USB_EP_CMD_EVENT
,
1038 MWIFIEX_USB_TIMEOUT
);
1040 mwifiex_dbg(adapter
, ERROR
,
1041 "write_data_sync: failed: %d\n",
1047 len
= FW_DNLD_RX_BUF_SIZE
;
1049 /* Receive the firmware block response */
1050 ret
= mwifiex_read_data_sync(adapter
, buf
, &len
,
1051 MWIFIEX_USB_EP_CMD_EVENT
,
1052 MWIFIEX_USB_TIMEOUT
);
1054 mwifiex_dbg(adapter
, ERROR
,
1055 "read_data_sync: failed: %d\n",
1060 memcpy(&sync_fw
, recv_buff
,
1061 sizeof(struct fw_sync_header
));
1063 /* check 1st firmware block resp for highest bit set */
1065 if (le32_to_cpu(sync_fw
.cmd
) & 0x80000000) {
1066 mwifiex_dbg(adapter
, WARN
,
1067 "USB is not the winner %#x\n",
1070 /* returning success */
1075 mwifiex_dbg(adapter
, MSG
,
1076 "start to download FW...\n");
1082 /* check the firmware block response for CRC errors */
1084 mwifiex_dbg(adapter
, ERROR
,
1085 "FW received block with CRC %#x\n",
1091 retries
= USB8XXX_FW_MAX_RETRY
+ 1;
1095 } while ((dnld_cmd
!= FW_HAS_LAST_BLOCK
) && retries
);
1098 mwifiex_dbg(adapter
, MSG
,
1099 "info: FW download over, size %d bytes\n", tlen
);
1110 static int mwifiex_usb_dnld_fw(struct mwifiex_adapter
*adapter
,
1111 struct mwifiex_fw_image
*fw
)
1114 struct usb_card_rec
*card
= (struct usb_card_rec
*)adapter
->card
;
1116 if (card
->usb_boot_state
== USB8XXX_FW_DNLD
) {
1117 ret
= mwifiex_prog_fw_w_helper(adapter
, fw
);
1121 /* Boot state changes after successful firmware download */
1122 if (card
->usb_boot_state
== USB8XXX_FW_DNLD
)
1126 ret
= mwifiex_usb_rx_init(adapter
);
1128 ret
= mwifiex_usb_tx_init(adapter
);
1133 static void mwifiex_submit_rx_urb(struct mwifiex_adapter
*adapter
, u8 ep
)
1135 struct usb_card_rec
*card
= (struct usb_card_rec
*)adapter
->card
;
1137 skb_push(card
->rx_cmd
.skb
, INTF_HEADER_LEN
);
1138 if ((ep
== card
->rx_cmd_ep
) &&
1139 (!atomic_read(&card
->rx_cmd_urb_pending
)))
1140 mwifiex_usb_submit_rx_urb(&card
->rx_cmd
,
1141 MWIFIEX_RX_CMD_BUF_SIZE
);
1146 static int mwifiex_usb_cmd_event_complete(struct mwifiex_adapter
*adapter
,
1147 struct sk_buff
*skb
)
1149 mwifiex_submit_rx_urb(adapter
, MWIFIEX_USB_EP_CMD_EVENT
);
1154 /* This function wakes up the card. */
1155 static int mwifiex_pm_wakeup_card(struct mwifiex_adapter
*adapter
)
1157 /* Simulation of HS_AWAKE event */
1158 adapter
->pm_wakeup_fw_try
= false;
1159 del_timer(&adapter
->wakeup_timer
);
1160 adapter
->pm_wakeup_card_req
= false;
1161 adapter
->ps_state
= PS_STATE_AWAKE
;
1166 static void mwifiex_usb_submit_rem_rx_urbs(struct mwifiex_adapter
*adapter
)
1168 struct usb_card_rec
*card
= (struct usb_card_rec
*)adapter
->card
;
1170 struct urb_context
*ctx
;
1172 for (i
= 0; i
< MWIFIEX_RX_DATA_URB
; i
++) {
1173 if (card
->rx_data_list
[i
].skb
)
1175 ctx
= &card
->rx_data_list
[i
];
1176 mwifiex_usb_submit_rx_urb(ctx
, MWIFIEX_RX_DATA_BUF_SIZE
);
1180 /* This function is called after the card has woken up. */
1182 mwifiex_pm_wakeup_card_complete(struct mwifiex_adapter
*adapter
)
1187 static struct mwifiex_if_ops usb_ops
= {
1188 .register_dev
= mwifiex_register_dev
,
1189 .unregister_dev
= mwifiex_unregister_dev
,
1190 .wakeup
= mwifiex_pm_wakeup_card
,
1191 .wakeup_complete
= mwifiex_pm_wakeup_card_complete
,
1194 .dnld_fw
= mwifiex_usb_dnld_fw
,
1195 .cmdrsp_complete
= mwifiex_usb_cmd_event_complete
,
1196 .event_complete
= mwifiex_usb_cmd_event_complete
,
1197 .host_to_card
= mwifiex_usb_host_to_card
,
1198 .submit_rem_rx_urbs
= mwifiex_usb_submit_rem_rx_urbs
,
1199 .multi_port_resync
= mwifiex_usb_port_resync
,
1200 .is_port_ready
= mwifiex_usb_is_port_ready
,
1203 module_usb_driver(mwifiex_usb_driver
);
1205 MODULE_AUTHOR("Marvell International Ltd.");
1206 MODULE_DESCRIPTION("Marvell WiFi-Ex USB Driver version" USB_VERSION
);
1207 MODULE_VERSION(USB_VERSION
);
1208 MODULE_LICENSE("GPL v2");
1209 MODULE_FIRMWARE(USB8766_DEFAULT_FW_NAME
);
1210 MODULE_FIRMWARE(USB8797_DEFAULT_FW_NAME
);
1211 MODULE_FIRMWARE(USB8801_DEFAULT_FW_NAME
);
1212 MODULE_FIRMWARE(USB8997_DEFAULT_FW_NAME
);