2 * This file contains functions used in USB interface module.
4 #include <linux/delay.h>
5 #include <linux/moduleparam.h>
6 #include <linux/firmware.h>
7 #include <linux/netdevice.h>
10 #define DRV_NAME "usb8xxx"
18 #define MESSAGE_HEADER_LEN 4
20 static char *lbs_fw_name
= "usb8388.bin";
21 module_param_named(fw_name
, lbs_fw_name
, charp
, 0644);
23 static struct usb_device_id if_usb_table
[] = {
24 /* Enter the device signature inside */
25 { USB_DEVICE(0x1286, 0x2001) },
26 { USB_DEVICE(0x05a3, 0x8388) },
27 {} /* Terminating entry */
30 MODULE_DEVICE_TABLE(usb
, if_usb_table
);
32 static void if_usb_receive(struct urb
*urb
);
33 static void if_usb_receive_fwload(struct urb
*urb
);
34 static int if_usb_prog_firmware(struct usb_card_rec
*cardp
);
35 static int if_usb_host_to_card(lbs_private
*priv
, u8 type
, u8
*payload
, u16 nb
);
36 static int if_usb_get_int_status(lbs_private
*priv
, u8
*);
37 static int if_usb_read_event_cause(lbs_private
*);
38 static int usb_tx_block(struct usb_card_rec
*cardp
, u8
*payload
, u16 nb
);
39 static void if_usb_free(struct usb_card_rec
*cardp
);
40 static int if_usb_submit_rx_urb(struct usb_card_rec
*cardp
);
41 static int if_usb_reset_device(struct usb_card_rec
*cardp
);
44 * @brief call back function to handle the status of the URB
45 * @param urb pointer to urb structure
48 static void if_usb_write_bulk_callback(struct urb
*urb
)
50 struct usb_card_rec
*cardp
= (struct usb_card_rec
*) urb
->context
;
52 /* handle the transmission complete validations */
54 if (urb
->status
== 0) {
55 lbs_private
*priv
= cardp
->priv
;
58 lbs_deb_usbd(&urb->dev->dev, "URB status is successfull\n");
59 lbs_deb_usbd(&urb->dev->dev, "Actual length transmitted %d\n",
63 /* Used for both firmware TX and regular TX. priv isn't
64 * valid at firmware load time.
67 lbs_adapter
*adapter
= priv
->adapter
;
68 struct net_device
*dev
= priv
->dev
;
70 priv
->dnld_sent
= DNLD_RES_RECEIVED
;
72 /* Wake main thread if commands are pending */
73 if (!adapter
->cur_cmd
)
74 wake_up_interruptible(&priv
->waitq
);
76 if (adapter
->connect_status
== LBS_CONNECTED
)
77 netif_wake_queue(dev
);
79 if (priv
->mesh_dev
&& (adapter
->mesh_connect_status
== LBS_CONNECTED
))
80 netif_wake_queue(priv
->mesh_dev
);
83 /* print the failure status number for debug */
84 lbs_pr_info("URB in failure status: %d\n", urb
->status
);
91 * @brief free tx/rx urb, skb and rx buffer
92 * @param cardp pointer usb_card_rec
95 static void if_usb_free(struct usb_card_rec
*cardp
)
97 lbs_deb_enter(LBS_DEB_USB
);
99 /* Unlink tx & rx urb */
100 usb_kill_urb(cardp
->tx_urb
);
101 usb_kill_urb(cardp
->rx_urb
);
103 usb_free_urb(cardp
->tx_urb
);
104 cardp
->tx_urb
= NULL
;
106 usb_free_urb(cardp
->rx_urb
);
107 cardp
->rx_urb
= NULL
;
109 kfree(cardp
->bulk_out_buffer
);
110 cardp
->bulk_out_buffer
= NULL
;
112 lbs_deb_leave(LBS_DEB_USB
);
116 * @brief sets the configuration values
117 * @param ifnum interface number
118 * @param id pointer to usb_device_id
119 * @return 0 on success, error code on failure
121 static int if_usb_probe(struct usb_interface
*intf
,
122 const struct usb_device_id
*id
)
124 struct usb_device
*udev
;
125 struct usb_host_interface
*iface_desc
;
126 struct usb_endpoint_descriptor
*endpoint
;
128 struct usb_card_rec
*cardp
;
131 udev
= interface_to_usbdev(intf
);
133 cardp
= kzalloc(sizeof(struct usb_card_rec
), GFP_KERNEL
);
135 lbs_pr_err("Out of memory allocating private data.\n");
140 iface_desc
= intf
->cur_altsetting
;
142 lbs_deb_usbd(&udev
->dev
, "bcdUSB = 0x%X bDeviceClass = 0x%X"
143 " bDeviceSubClass = 0x%X, bDeviceProtocol = 0x%X\n",
144 le16_to_cpu(udev
->descriptor
.bcdUSB
),
145 udev
->descriptor
.bDeviceClass
,
146 udev
->descriptor
.bDeviceSubClass
,
147 udev
->descriptor
.bDeviceProtocol
);
149 for (i
= 0; i
< iface_desc
->desc
.bNumEndpoints
; ++i
) {
150 endpoint
= &iface_desc
->endpoint
[i
].desc
;
151 if ((endpoint
->bEndpointAddress
& USB_ENDPOINT_DIR_MASK
)
152 && ((endpoint
->bmAttributes
& USB_ENDPOINT_XFERTYPE_MASK
) ==
153 USB_ENDPOINT_XFER_BULK
)) {
154 /* we found a bulk in endpoint */
155 lbs_deb_usbd(&udev
->dev
, "Bulk in size is %d\n",
156 le16_to_cpu(endpoint
->wMaxPacketSize
));
157 if (!(cardp
->rx_urb
= usb_alloc_urb(0, GFP_KERNEL
))) {
158 lbs_deb_usbd(&udev
->dev
,
159 "Rx URB allocation failed\n");
162 cardp
->rx_urb_recall
= 0;
164 cardp
->bulk_in_size
=
165 le16_to_cpu(endpoint
->wMaxPacketSize
);
166 cardp
->bulk_in_endpointAddr
=
168 bEndpointAddress
& USB_ENDPOINT_NUMBER_MASK
);
169 lbs_deb_usbd(&udev
->dev
, "in_endpoint = %d\n",
170 endpoint
->bEndpointAddress
);
174 bEndpointAddress
& USB_ENDPOINT_DIR_MASK
) ==
176 && ((endpoint
->bmAttributes
& USB_ENDPOINT_XFERTYPE_MASK
) ==
177 USB_ENDPOINT_XFER_BULK
)) {
178 /* We found bulk out endpoint */
179 if (!(cardp
->tx_urb
= usb_alloc_urb(0, GFP_KERNEL
))) {
180 lbs_deb_usbd(&udev
->dev
,
181 "Tx URB allocation failed\n");
185 cardp
->bulk_out_size
=
186 le16_to_cpu(endpoint
->wMaxPacketSize
);
187 lbs_deb_usbd(&udev
->dev
,
188 "Bulk out size is %d\n",
189 le16_to_cpu(endpoint
->wMaxPacketSize
));
190 cardp
->bulk_out_endpointAddr
=
191 endpoint
->bEndpointAddress
;
192 lbs_deb_usbd(&udev
->dev
, "out_endpoint = %d\n",
193 endpoint
->bEndpointAddress
);
194 cardp
->bulk_out_buffer
=
195 kmalloc(MRVDRV_ETH_TX_PACKET_BUFFER_SIZE
,
198 if (!cardp
->bulk_out_buffer
) {
199 lbs_deb_usbd(&udev
->dev
,
200 "Could not allocate buffer\n");
206 /* Upload firmware */
207 cardp
->rinfo
.cardp
= cardp
;
208 if (if_usb_prog_firmware(cardp
)) {
209 lbs_deb_usbd(&udev
->dev
, "FW upload failed");
210 goto err_prog_firmware
;
213 if (!(priv
= lbs_add_card(cardp
, &udev
->dev
)))
214 goto err_prog_firmware
;
218 if (lbs_add_mesh(priv
, &udev
->dev
))
221 cardp
->eth_dev
= priv
->dev
;
223 priv
->hw_host_to_card
= if_usb_host_to_card
;
224 priv
->hw_get_int_status
= if_usb_get_int_status
;
225 priv
->hw_read_event_cause
= if_usb_read_event_cause
;
226 priv
->boot2_version
= udev
->descriptor
.bcdDevice
;
228 /* Delay 200 ms to waiting for the FW ready */
229 if_usb_submit_rx_urb(cardp
);
230 msleep_interruptible(200);
231 priv
->adapter
->fw_ready
= 1;
233 if (lbs_start_card(priv
))
237 usb_set_intfdata(intf
, cardp
);
242 lbs_remove_mesh(priv
);
244 lbs_remove_card(priv
);
246 if_usb_reset_device(cardp
);
255 * @brief free resource and cleanup
256 * @param intf USB interface structure
259 static void if_usb_disconnect(struct usb_interface
*intf
)
261 struct usb_card_rec
*cardp
= usb_get_intfdata(intf
);
262 lbs_private
*priv
= (lbs_private
*) cardp
->priv
;
264 lbs_deb_enter(LBS_DEB_MAIN
);
266 /* Update Surprise removed to TRUE */
267 cardp
->surprise_removed
= 1;
270 lbs_adapter
*adapter
= priv
->adapter
;
272 adapter
->surpriseremoved
= 1;
274 lbs_remove_mesh(priv
);
275 lbs_remove_card(priv
);
278 /* this is (apparently?) necessary for future usage of the device */
279 lbs_prepare_and_send_command(priv
, CMD_802_11_RESET
, CMD_ACT_HALT
,
282 /* Unlink and free urb */
285 usb_set_intfdata(intf
, NULL
);
286 usb_put_dev(interface_to_usbdev(intf
));
288 lbs_deb_leave(LBS_DEB_MAIN
);
292 * @brief This function download FW
293 * @param priv pointer to lbs_private
296 static int if_prog_firmware(struct usb_card_rec
*cardp
)
298 struct FWData
*fwdata
;
299 struct fwheader
*fwheader
;
300 u8
*firmware
= cardp
->fw
->data
;
302 fwdata
= kmalloc(sizeof(struct FWData
), GFP_ATOMIC
);
307 fwheader
= &fwdata
->fwheader
;
309 if (!cardp
->CRC_OK
) {
310 cardp
->totalbytes
= cardp
->fwlastblksent
;
311 cardp
->fwseqnum
= cardp
->lastseqnum
- 1;
315 lbs_deb_usbd(&cardp->udev->dev, "totalbytes = %d\n",
319 memcpy(fwheader
, &firmware
[cardp
->totalbytes
],
320 sizeof(struct fwheader
));
322 cardp
->fwlastblksent
= cardp
->totalbytes
;
323 cardp
->totalbytes
+= sizeof(struct fwheader
);
325 /* lbs_deb_usbd(&cardp->udev->dev,"Copy Data\n"); */
326 memcpy(fwdata
->data
, &firmware
[cardp
->totalbytes
],
327 le32_to_cpu(fwdata
->fwheader
.datalength
));
330 lbs_deb_usbd(&cardp->udev->dev,
331 "Data length = %d\n", le32_to_cpu(fwdata->fwheader.datalength));
334 cardp
->fwseqnum
= cardp
->fwseqnum
+ 1;
336 fwdata
->seqnum
= cpu_to_le32(cardp
->fwseqnum
);
337 cardp
->lastseqnum
= cardp
->fwseqnum
;
338 cardp
->totalbytes
+= le32_to_cpu(fwdata
->fwheader
.datalength
);
340 if (fwheader
->dnldcmd
== cpu_to_le32(FW_HAS_DATA_TO_RECV
)) {
342 lbs_deb_usbd(&cardp->udev->dev, "There are data to follow\n");
343 lbs_deb_usbd(&cardp->udev->dev,
344 "seqnum = %d totalbytes = %d\n", cardp->fwseqnum,
347 memcpy(cardp
->bulk_out_buffer
, fwheader
, FW_DATA_XMIT_SIZE
);
348 usb_tx_block(cardp
, cardp
->bulk_out_buffer
, FW_DATA_XMIT_SIZE
);
350 } else if (fwdata
->fwheader
.dnldcmd
== cpu_to_le32(FW_HAS_LAST_BLOCK
)) {
352 lbs_deb_usbd(&cardp->udev->dev,
353 "Host has finished FW downloading\n");
354 lbs_deb_usbd(&cardp->udev->dev,
355 "Donwloading FW JUMP BLOCK\n");
357 memcpy(cardp
->bulk_out_buffer
, fwheader
, FW_DATA_XMIT_SIZE
);
358 usb_tx_block(cardp
, cardp
->bulk_out_buffer
, FW_DATA_XMIT_SIZE
);
359 cardp
->fwfinalblk
= 1;
363 lbs_deb_usbd(&cardp->udev->dev,
364 "The firmware download is done size is %d\n",
373 static int if_usb_reset_device(struct usb_card_rec
*cardp
)
376 lbs_private
* priv
= cardp
->priv
;
378 lbs_deb_enter(LBS_DEB_USB
);
380 /* Try a USB port reset first, if that fails send the reset
381 * command to the firmware.
383 ret
= usb_reset_device(cardp
->udev
);
386 ret
= lbs_reset_device(priv
);
390 lbs_deb_leave_args(LBS_DEB_USB
, "ret %d", ret
);
396 * @brief This function transfer the data to the device.
397 * @param priv pointer to lbs_private
398 * @param payload pointer to payload data
399 * @param nb data length
402 static int usb_tx_block(struct usb_card_rec
*cardp
, u8
* payload
, u16 nb
)
406 /* check if device is removed */
407 if (cardp
->surprise_removed
) {
408 lbs_deb_usbd(&cardp
->udev
->dev
, "Device removed\n");
412 usb_fill_bulk_urb(cardp
->tx_urb
, cardp
->udev
,
413 usb_sndbulkpipe(cardp
->udev
,
414 cardp
->bulk_out_endpointAddr
),
415 payload
, nb
, if_usb_write_bulk_callback
, cardp
);
417 cardp
->tx_urb
->transfer_flags
|= URB_ZERO_PACKET
;
419 if ((ret
= usb_submit_urb(cardp
->tx_urb
, GFP_ATOMIC
))) {
420 /* transfer failed */
421 lbs_deb_usbd(&cardp
->udev
->dev
, "usb_submit_urb failed\n");
424 /* lbs_deb_usbd(&cardp->udev->dev, "usb_submit_urb success\n"); */
432 static int __if_usb_submit_rx_urb(struct usb_card_rec
*cardp
,
433 void (*callbackfn
)(struct urb
*urb
))
436 struct read_cb_info
*rinfo
= &cardp
->rinfo
;
439 if (!(skb
= dev_alloc_skb(MRVDRV_ETH_RX_PACKET_BUFFER_SIZE
))) {
440 lbs_pr_err("No free skb\n");
446 /* Fill the receive configuration URB and initialise the Rx call back */
447 usb_fill_bulk_urb(cardp
->rx_urb
, cardp
->udev
,
448 usb_rcvbulkpipe(cardp
->udev
,
449 cardp
->bulk_in_endpointAddr
),
450 (void *) (skb
->tail
+ (size_t) IPFIELD_ALIGN_OFFSET
),
451 MRVDRV_ETH_RX_PACKET_BUFFER_SIZE
, callbackfn
,
454 cardp
->rx_urb
->transfer_flags
|= URB_ZERO_PACKET
;
456 /* lbs_deb_usbd(&cardp->udev->dev, "Pointer for rx_urb %p\n", cardp->rx_urb); */
457 if ((ret
= usb_submit_urb(cardp
->rx_urb
, GFP_ATOMIC
))) {
458 /* handle failure conditions */
459 lbs_deb_usbd(&cardp
->udev
->dev
, "Submit Rx URB failed\n");
462 /* lbs_deb_usbd(&cardp->udev->dev, "Submit Rx URB success\n"); */
470 static int if_usb_submit_rx_urb_fwload(struct usb_card_rec
*cardp
)
472 return __if_usb_submit_rx_urb(cardp
, &if_usb_receive_fwload
);
475 static int if_usb_submit_rx_urb(struct usb_card_rec
*cardp
)
477 return __if_usb_submit_rx_urb(cardp
, &if_usb_receive
);
480 static void if_usb_receive_fwload(struct urb
*urb
)
482 struct read_cb_info
*rinfo
= (struct read_cb_info
*)urb
->context
;
483 struct sk_buff
*skb
= rinfo
->skb
;
484 struct usb_card_rec
*cardp
= (struct usb_card_rec
*)rinfo
->cardp
;
485 struct fwsyncheader
*syncfwheader
;
486 struct bootcmdrespStr bootcmdresp
;
489 lbs_deb_usbd(&cardp
->udev
->dev
,
490 "URB status is failed during fw load\n");
495 if (cardp
->bootcmdresp
== 0) {
496 memcpy (&bootcmdresp
, skb
->data
+ IPFIELD_ALIGN_OFFSET
,
497 sizeof(bootcmdresp
));
498 if (le16_to_cpu(cardp
->udev
->descriptor
.bcdDevice
) < 0x3106) {
500 if_usb_submit_rx_urb_fwload(cardp
);
501 cardp
->bootcmdresp
= 1;
502 lbs_deb_usbd(&cardp
->udev
->dev
,
503 "Received valid boot command response\n");
506 if (bootcmdresp
.u32magicnumber
!= cpu_to_le32(BOOT_CMD_MAGIC_NUMBER
)) {
508 "boot cmd response wrong magic number (0x%x)\n",
509 le32_to_cpu(bootcmdresp
.u32magicnumber
));
510 } else if (bootcmdresp
.u8cmd_tag
!= BOOT_CMD_FW_BY_USB
) {
512 "boot cmd response cmd_tag error (%d)\n",
513 bootcmdresp
.u8cmd_tag
);
514 } else if (bootcmdresp
.u8result
!= BOOT_CMD_RESP_OK
) {
516 "boot cmd response result error (%d)\n",
517 bootcmdresp
.u8result
);
519 cardp
->bootcmdresp
= 1;
520 lbs_deb_usbd(&cardp
->udev
->dev
,
521 "Received valid boot command response\n");
524 if_usb_submit_rx_urb_fwload(cardp
);
528 syncfwheader
= kmalloc(sizeof(struct fwsyncheader
), GFP_ATOMIC
);
530 lbs_deb_usbd(&cardp
->udev
->dev
, "Failure to allocate syncfwheader\n");
535 memcpy(syncfwheader
, skb
->data
+ IPFIELD_ALIGN_OFFSET
,
536 sizeof(struct fwsyncheader
));
538 if (!syncfwheader
->cmd
) {
540 lbs_deb_usbd(&cardp->udev->dev,
541 "FW received Blk with correct CRC\n");
542 lbs_deb_usbd(&cardp->udev->dev,
543 "FW received Blk seqnum = %d\n",
544 syncfwheader->seqnum);
548 lbs_deb_usbd(&cardp
->udev
->dev
,
549 "FW received Blk with CRC error\n");
555 if (cardp
->fwfinalblk
) {
556 cardp
->fwdnldover
= 1;
560 if_prog_firmware(cardp
);
562 if_usb_submit_rx_urb_fwload(cardp
);
570 #define MRVDRV_MIN_PKT_LEN 30
572 static inline void process_cmdtypedata(int recvlength
, struct sk_buff
*skb
,
573 struct usb_card_rec
*cardp
,
576 if (recvlength
> MRVDRV_ETH_RX_PACKET_BUFFER_SIZE
+
577 MESSAGE_HEADER_LEN
|| recvlength
< MRVDRV_MIN_PKT_LEN
) {
578 lbs_deb_usbd(&cardp
->udev
->dev
,
579 "Packet length is Invalid\n");
584 skb_reserve(skb
, IPFIELD_ALIGN_OFFSET
);
585 skb_put(skb
, recvlength
);
586 skb_pull(skb
, MESSAGE_HEADER_LEN
);
587 lbs_process_rxed_packet(priv
, skb
);
588 priv
->upld_len
= (recvlength
- MESSAGE_HEADER_LEN
);
591 static inline void process_cmdrequest(int recvlength
, u8
*recvbuff
,
593 struct usb_card_rec
*cardp
,
597 if (recvlength
> MRVDRV_SIZE_OF_CMD_BUFFER
) {
598 lbs_deb_usbd(&cardp
->udev
->dev
,
599 "The receive buffer is too large\n");
607 spin_lock(&priv
->adapter
->driver_lock
);
608 /* take care of cur_cmd = NULL case by reading the
609 * data to clear the interrupt */
610 if (!priv
->adapter
->cur_cmd
) {
611 cmdbuf
= priv
->upld_buf
;
612 priv
->adapter
->hisregcpy
&= ~MRVDRV_CMD_UPLD_RDY
;
614 cmdbuf
= priv
->adapter
->cur_cmd
->bufvirtualaddr
;
616 cardp
->usb_int_cause
|= MRVDRV_CMD_UPLD_RDY
;
617 priv
->upld_len
= (recvlength
- MESSAGE_HEADER_LEN
);
618 memcpy(cmdbuf
, recvbuff
+ MESSAGE_HEADER_LEN
,
622 lbs_interrupt(priv
->dev
);
623 spin_unlock(&priv
->adapter
->driver_lock
);
625 lbs_deb_usbd(&cardp
->udev
->dev
,
626 "Wake up main thread to handle cmd response\n");
632 * @brief This function reads of the packet into the upload buff,
633 * wake up the main thread and initialise the Rx callack.
635 * @param urb pointer to struct urb
638 static void if_usb_receive(struct urb
*urb
)
640 struct read_cb_info
*rinfo
= (struct read_cb_info
*)urb
->context
;
641 struct sk_buff
*skb
= rinfo
->skb
;
642 struct usb_card_rec
*cardp
= (struct usb_card_rec
*) rinfo
->cardp
;
643 lbs_private
* priv
= cardp
->priv
;
645 int recvlength
= urb
->actual_length
;
649 lbs_deb_enter(LBS_DEB_USB
);
655 lbs_deb_usbd(&cardp
->udev
->dev
,
656 "URB status is failed\n");
661 recvbuff
= skb
->data
+ IPFIELD_ALIGN_OFFSET
;
662 memcpy(&tmp
, recvbuff
, sizeof(u32
));
663 recvtype
= le32_to_cpu(tmp
);
664 lbs_deb_usbd(&cardp
->udev
->dev
,
665 "Recv length = 0x%x, Recv type = 0x%X\n",
666 recvlength
, recvtype
);
667 } else if (urb
->status
)
672 process_cmdtypedata(recvlength
, skb
, cardp
, priv
);
675 case CMD_TYPE_REQUEST
:
676 process_cmdrequest(recvlength
, recvbuff
, skb
, cardp
, priv
);
679 case CMD_TYPE_INDICATION
:
680 /* Event cause handling */
681 spin_lock(&priv
->adapter
->driver_lock
);
682 cardp
->usb_event_cause
= le32_to_cpu(*(__le32
*) (recvbuff
+ MESSAGE_HEADER_LEN
));
683 lbs_deb_usbd(&cardp
->udev
->dev
,"**EVENT** 0x%X\n",
684 cardp
->usb_event_cause
);
685 if (cardp
->usb_event_cause
& 0xffff0000) {
686 lbs_send_tx_feedback(priv
);
687 spin_unlock(&priv
->adapter
->driver_lock
);
690 cardp
->usb_event_cause
<<= 3;
691 cardp
->usb_int_cause
|= MRVDRV_CARDEVENT
;
693 lbs_interrupt(priv
->dev
);
694 spin_unlock(&priv
->adapter
->driver_lock
);
697 lbs_deb_usbd(&cardp
->udev
->dev
, "Unknown command type 0x%X\n",
704 if_usb_submit_rx_urb(cardp
);
706 lbs_deb_leave(LBS_DEB_USB
);
710 * @brief This function downloads data to FW
711 * @param priv pointer to lbs_private structure
712 * @param type type of data
713 * @param buf pointer to data buffer
714 * @param len number of bytes
717 static int if_usb_host_to_card(lbs_private
*priv
, u8 type
, u8
*payload
, u16 nb
)
719 struct usb_card_rec
*cardp
= (struct usb_card_rec
*)priv
->card
;
721 lbs_deb_usbd(&cardp
->udev
->dev
,"*** type = %u\n", type
);
722 lbs_deb_usbd(&cardp
->udev
->dev
,"size after = %d\n", nb
);
724 if (type
== MVMS_CMD
) {
725 __le32 tmp
= cpu_to_le32(CMD_TYPE_REQUEST
);
726 priv
->dnld_sent
= DNLD_CMD_SENT
;
727 memcpy(cardp
->bulk_out_buffer
, (u8
*) & tmp
,
731 __le32 tmp
= cpu_to_le32(CMD_TYPE_DATA
);
732 priv
->dnld_sent
= DNLD_DATA_SENT
;
733 memcpy(cardp
->bulk_out_buffer
, (u8
*) & tmp
,
737 memcpy((cardp
->bulk_out_buffer
+ MESSAGE_HEADER_LEN
), payload
, nb
);
739 return usb_tx_block(cardp
, cardp
->bulk_out_buffer
,
740 nb
+ MESSAGE_HEADER_LEN
);
743 /* called with adapter->driver_lock held */
744 static int if_usb_get_int_status(lbs_private
*priv
, u8
*ireg
)
746 struct usb_card_rec
*cardp
= priv
->card
;
748 *ireg
= cardp
->usb_int_cause
;
749 cardp
->usb_int_cause
= 0;
751 lbs_deb_usbd(&cardp
->udev
->dev
,"Int cause is 0x%X\n", *ireg
);
756 static int if_usb_read_event_cause(lbs_private
* priv
)
758 struct usb_card_rec
*cardp
= priv
->card
;
760 priv
->adapter
->eventcause
= cardp
->usb_event_cause
;
761 /* Re-submit rx urb here to avoid event lost issue */
762 if_usb_submit_rx_urb(cardp
);
767 * @brief This function issues Boot command to the Boot2 code
768 * @param ivalue 1:Boot from FW by USB-Download
769 * 2:Boot from FW in EEPROM
772 static int if_usb_issue_boot_command(struct usb_card_rec
*cardp
, int ivalue
)
774 struct bootcmdstr sbootcmd
;
777 /* Prepare command */
778 sbootcmd
.u32magicnumber
= cpu_to_le32(BOOT_CMD_MAGIC_NUMBER
);
779 sbootcmd
.u8cmd_tag
= ivalue
;
781 sbootcmd
.au8dumy
[i
]=0x00;
782 memcpy(cardp
->bulk_out_buffer
, &sbootcmd
, sizeof(struct bootcmdstr
));
785 usb_tx_block(cardp
, cardp
->bulk_out_buffer
, sizeof(struct bootcmdstr
));
792 * @brief This function checks the validity of Boot2/FW image.
794 * @param data pointer to image
798 static int check_fwfile_format(u8
*data
, u32 totlen
)
801 u32 blksize
, offset
, len
;
808 struct fwheader
*fwh
= (void *)data
;
810 bincmd
= le32_to_cpu(fwh
->dnldcmd
);
811 blksize
= le32_to_cpu(fwh
->datalength
);
813 case FW_HAS_DATA_TO_RECV
:
814 offset
= sizeof(struct fwheader
) + blksize
;
820 case FW_HAS_LAST_BLOCK
:
831 lbs_pr_err("firmware file format check FAIL\n");
833 lbs_deb_fw("firmware file format check PASS\n");
839 static int if_usb_prog_firmware(struct usb_card_rec
*cardp
)
842 static int reset_count
= 10;
845 lbs_deb_enter(LBS_DEB_USB
);
847 if ((ret
= request_firmware(&cardp
->fw
, lbs_fw_name
,
848 &cardp
->udev
->dev
)) < 0) {
849 lbs_pr_err("request_firmware() failed with %#x\n", ret
);
850 lbs_pr_err("firmware %s not found\n", lbs_fw_name
);
854 if (check_fwfile_format(cardp
->fw
->data
, cardp
->fw
->size
))
858 if (if_usb_submit_rx_urb_fwload(cardp
) < 0) {
859 lbs_deb_usbd(&cardp
->udev
->dev
, "URB submission is failed\n");
864 cardp
->bootcmdresp
= 0;
868 /* Issue Boot command = 1, Boot from Download-FW */
869 if_usb_issue_boot_command(cardp
, BOOT_CMD_FW_BY_USB
);
870 /* wait for command response */
873 msleep_interruptible(100);
874 } while (cardp
->bootcmdresp
== 0 && j
< 10);
875 } while (cardp
->bootcmdresp
== 0 && i
< 5);
877 if (cardp
->bootcmdresp
== 0) {
878 if (--reset_count
>= 0) {
879 if_usb_reset_device(cardp
);
887 cardp
->totalbytes
= 0;
888 cardp
->fwlastblksent
= 0;
890 cardp
->fwdnldover
= 0;
891 cardp
->fwseqnum
= -1;
892 cardp
->totalbytes
= 0;
893 cardp
->fwfinalblk
= 0;
895 if_prog_firmware(cardp
);
898 lbs_deb_usbd(&cardp
->udev
->dev
,"Wlan sched timeout\n");
900 msleep_interruptible(100);
901 if (cardp
->surprise_removed
|| i
>= 20)
903 } while (!cardp
->fwdnldover
);
905 if (!cardp
->fwdnldover
) {
906 lbs_pr_info("failed to load fw, resetting device!\n");
907 if (--reset_count
>= 0) {
908 if_usb_reset_device(cardp
);
912 lbs_pr_info("FW download failure, time = %d ms\n", i
* 100);
918 release_firmware(cardp
->fw
);
922 lbs_deb_leave_args(LBS_DEB_USB
, "ret %d", ret
);
928 static int if_usb_suspend(struct usb_interface
*intf
, pm_message_t message
)
930 struct usb_card_rec
*cardp
= usb_get_intfdata(intf
);
931 lbs_private
*priv
= cardp
->priv
;
933 lbs_deb_enter(LBS_DEB_USB
);
935 if (priv
->adapter
->psstate
!= PS_STATE_FULL_POWER
)
938 if (priv
->mesh_dev
&& !priv
->mesh_autostart_enabled
) {
939 /* Mesh autostart must be activated while sleeping
940 * On resume it will go back to the current state
942 struct cmd_ds_mesh_access mesh_access
;
943 memset(&mesh_access
, 0, sizeof(mesh_access
));
944 mesh_access
.data
[0] = cpu_to_le32(1);
945 lbs_prepare_and_send_command(priv
,
947 CMD_ACT_MESH_SET_AUTOSTART_ENABLED
,
948 CMD_OPTION_WAITFORRSP
, 0, (void *)&mesh_access
);
951 netif_device_detach(cardp
->eth_dev
);
952 netif_device_detach(priv
->mesh_dev
);
954 /* Unlink tx & rx urb */
955 usb_kill_urb(cardp
->tx_urb
);
956 usb_kill_urb(cardp
->rx_urb
);
958 cardp
->rx_urb_recall
= 1;
960 lbs_deb_leave(LBS_DEB_USB
);
964 static int if_usb_resume(struct usb_interface
*intf
)
966 struct usb_card_rec
*cardp
= usb_get_intfdata(intf
);
967 lbs_private
*priv
= cardp
->priv
;
969 lbs_deb_enter(LBS_DEB_USB
);
971 cardp
->rx_urb_recall
= 0;
973 if_usb_submit_rx_urb(cardp
->priv
);
975 netif_device_attach(cardp
->eth_dev
);
976 netif_device_attach(priv
->mesh_dev
);
978 if (priv
->mesh_dev
&& !priv
->mesh_autostart_enabled
) {
979 /* Mesh autostart was activated while sleeping
980 * Disable it if appropriate
982 struct cmd_ds_mesh_access mesh_access
;
983 memset(&mesh_access
, 0, sizeof(mesh_access
));
984 mesh_access
.data
[0] = cpu_to_le32(0);
985 lbs_prepare_and_send_command(priv
,
987 CMD_ACT_MESH_SET_AUTOSTART_ENABLED
,
988 CMD_OPTION_WAITFORRSP
, 0, (void *)&mesh_access
);
991 lbs_deb_leave(LBS_DEB_USB
);
995 #define if_usb_suspend NULL
996 #define if_usb_resume NULL
999 static struct usb_driver if_usb_driver
= {
1001 .probe
= if_usb_probe
,
1002 .disconnect
= if_usb_disconnect
,
1003 .id_table
= if_usb_table
,
1004 .suspend
= if_usb_suspend
,
1005 .resume
= if_usb_resume
,
1008 static int __init
if_usb_init_module(void)
1012 lbs_deb_enter(LBS_DEB_MAIN
);
1014 ret
= usb_register(&if_usb_driver
);
1016 lbs_deb_leave_args(LBS_DEB_MAIN
, "ret %d", ret
);
1020 static void __exit
if_usb_exit_module(void)
1022 lbs_deb_enter(LBS_DEB_MAIN
);
1024 usb_deregister(&if_usb_driver
);
1026 lbs_deb_leave(LBS_DEB_MAIN
);
1029 module_init(if_usb_init_module
);
1030 module_exit(if_usb_exit_module
);
1032 MODULE_DESCRIPTION("8388 USB WLAN Driver");
1033 MODULE_AUTHOR("Marvell International Ltd.");
1034 MODULE_LICENSE("GPL");