3 static struct usb_device_id InterfaceUsbtable
[] = {
4 { USB_DEVICE(BCM_USB_VENDOR_ID_T3
, BCM_USB_PRODUCT_ID_T3
) },
5 { USB_DEVICE(BCM_USB_VENDOR_ID_T3
, BCM_USB_PRODUCT_ID_T3B
) },
6 { USB_DEVICE(BCM_USB_VENDOR_ID_T3
, BCM_USB_PRODUCT_ID_T3L
) },
7 { USB_DEVICE(BCM_USB_VENDOR_ID_T3
, BCM_USB_PRODUCT_ID_SM250
) },
8 { USB_DEVICE(BCM_USB_VENDOR_ID_ZTE
, BCM_USB_PRODUCT_ID_226
) },
9 { USB_DEVICE(BCM_USB_VENDOR_ID_FOXCONN
, BCM_USB_PRODUCT_ID_1901
) },
10 { USB_DEVICE(BCM_USB_VENDOR_ID_ZTE
, BCM_USB_PRODUCT_ID_ZTE_TU25
) },
13 MODULE_DEVICE_TABLE(usb
, InterfaceUsbtable
);
15 static int debug
= -1;
16 module_param(debug
, uint
, 0600);
17 MODULE_PARM_DESC(debug
, "Debug level (0=none,...,16=all)");
19 static const u32 default_msg
=
20 NETIF_MSG_DRV
| NETIF_MSG_PROBE
| NETIF_MSG_LINK
21 | NETIF_MSG_TIMER
| NETIF_MSG_TX_ERR
| NETIF_MSG_RX_ERR
22 | NETIF_MSG_IFUP
| NETIF_MSG_IFDOWN
;
24 static int InterfaceAdapterInit(PS_INTERFACE_ADAPTER Adapter
);
26 static void InterfaceAdapterFree(PS_INTERFACE_ADAPTER psIntfAdapter
)
30 /* Wake up the wait_queue... */
31 if (psIntfAdapter
->psAdapter
->LEDInfo
.led_thread_running
& BCM_LED_THREAD_RUNNING_ACTIVELY
) {
32 psIntfAdapter
->psAdapter
->DriverState
= DRIVER_HALT
;
33 wake_up(&psIntfAdapter
->psAdapter
->LEDInfo
.notify_led_event
);
35 reset_card_proc(psIntfAdapter
->psAdapter
);
38 * worst case time taken by the RDM/WRM will be 5 sec. will check after every 100 ms
39 * to accertain the device is not being accessed. After this No RDM/WRM should be made.
41 while (psIntfAdapter
->psAdapter
->DeviceAccess
) {
42 BCM_DEBUG_PRINT(psIntfAdapter
->psAdapter
, DBG_TYPE_INITEXIT
, DRV_ENTRY
, DBG_LVL_ALL
,
43 "Device is being accessed.\n");
46 /* Free interrupt URB */
47 /* psIntfAdapter->psAdapter->device_removed = TRUE; */
48 usb_free_urb(psIntfAdapter
->psInterruptUrb
);
50 /* Free transmit URBs */
51 for (i
= 0; i
< MAXIMUM_USB_TCB
; i
++) {
52 if (psIntfAdapter
->asUsbTcb
[i
].urb
!= NULL
) {
53 usb_free_urb(psIntfAdapter
->asUsbTcb
[i
].urb
);
54 psIntfAdapter
->asUsbTcb
[i
].urb
= NULL
;
57 /* Free receive URB and buffers */
58 for (i
= 0; i
< MAXIMUM_USB_RCB
; i
++) {
59 if (psIntfAdapter
->asUsbRcb
[i
].urb
!= NULL
) {
60 kfree(psIntfAdapter
->asUsbRcb
[i
].urb
->transfer_buffer
);
61 usb_free_urb(psIntfAdapter
->asUsbRcb
[i
].urb
);
62 psIntfAdapter
->asUsbRcb
[i
].urb
= NULL
;
65 AdapterFree(psIntfAdapter
->psAdapter
);
68 static void ConfigureEndPointTypesThroughEEPROM(PMINI_ADAPTER Adapter
)
70 unsigned long ulReg
= 0;
73 /* Program EP2 MAX_PKT_SIZE */
74 ulReg
= ntohl(EP2_MPS_REG
);
75 BeceemEEPROMBulkWrite(Adapter
, (PUCHAR
)&ulReg
, 0x128, 4, TRUE
);
76 ulReg
= ntohl(EP2_MPS
);
77 BeceemEEPROMBulkWrite(Adapter
, (PUCHAR
)&ulReg
, 0x12C, 4, TRUE
);
79 ulReg
= ntohl(EP2_CFG_REG
);
80 BeceemEEPROMBulkWrite(Adapter
, (PUCHAR
)&ulReg
, 0x132, 4, TRUE
);
81 if (((PS_INTERFACE_ADAPTER
)(Adapter
->pvInterfaceAdapter
))->bHighSpeedDevice
== TRUE
) {
82 ulReg
= ntohl(EP2_CFG_INT
);
83 BeceemEEPROMBulkWrite(Adapter
, (PUCHAR
)&ulReg
, 0x136, 4, TRUE
);
85 /* USE BULK EP as TX in FS mode. */
86 ulReg
= ntohl(EP2_CFG_BULK
);
87 BeceemEEPROMBulkWrite(Adapter
, (PUCHAR
)&ulReg
, 0x136, 4, TRUE
);
90 /* Program EP4 MAX_PKT_SIZE. */
91 ulReg
= ntohl(EP4_MPS_REG
);
92 BeceemEEPROMBulkWrite(Adapter
, (PUCHAR
)&ulReg
, 0x13C, 4, TRUE
);
93 ulReg
= ntohl(EP4_MPS
);
94 BeceemEEPROMBulkWrite(Adapter
, (PUCHAR
)&ulReg
, 0x140, 4, TRUE
);
96 /* Program TX EP as interrupt(Alternate Setting) */
97 ret
= rdmalt(Adapter
, 0x0F0110F8, (u32
*)&ulReg
, sizeof(u32
));
99 BCM_DEBUG_PRINT(Adapter
, DBG_TYPE_INITEXIT
, DRV_ENTRY
, DBG_LVL_ALL
,
100 "reading of Tx EP failed\n");
105 ulReg
= ntohl(ulReg
);
106 BeceemEEPROMBulkWrite(Adapter
, (PUCHAR
)&ulReg
, 0x1CC, 4, TRUE
);
108 ulReg
= ntohl(EP4_CFG_REG
);
109 BeceemEEPROMBulkWrite(Adapter
, (PUCHAR
)&ulReg
, 0x1C8, 4, TRUE
);
110 /* Program ISOCHRONOUS EP size to zero. */
111 ulReg
= ntohl(ISO_MPS_REG
);
112 BeceemEEPROMBulkWrite(Adapter
, (PUCHAR
)&ulReg
, 0x1D2, 4, TRUE
);
113 ulReg
= ntohl(ISO_MPS
);
114 BeceemEEPROMBulkWrite(Adapter
, (PUCHAR
)&ulReg
, 0x1D6, 4, TRUE
);
117 * Update EEPROM Version.
118 * Read 4 bytes from 508 and modify 511 and 510.
120 ReadBeceemEEPROM(Adapter
, 0x1FC, (PUINT
)&ulReg
);
122 BeceemEEPROMBulkWrite(Adapter
, (PUCHAR
)&ulReg
, 0x1FC, 4, TRUE
);
124 /* Update length field if required. Also make the string NULL terminated. */
126 ReadBeceemEEPROM(Adapter
, 0xA8, (PUINT
)&ulReg
);
127 if ((ulReg
&0x00FF0000)>>16 > 0x30) {
128 ulReg
= (ulReg
&0xFF00FFFF)|(0x30<<16);
129 BeceemEEPROMBulkWrite(Adapter
, (PUCHAR
)&ulReg
, 0xA8, 4, TRUE
);
131 ReadBeceemEEPROM(Adapter
, 0x148, (PUINT
)&ulReg
);
132 if ((ulReg
&0x00FF0000)>>16 > 0x30) {
133 ulReg
= (ulReg
&0xFF00FFFF)|(0x30<<16);
134 BeceemEEPROMBulkWrite(Adapter
, (PUCHAR
)&ulReg
, 0x148, 4, TRUE
);
137 BeceemEEPROMBulkWrite(Adapter
, (PUCHAR
)&ulReg
, 0x122, 4, TRUE
);
139 BeceemEEPROMBulkWrite(Adapter
, (PUCHAR
)&ulReg
, 0x1C2, 4, TRUE
);
142 static int usbbcm_device_probe(struct usb_interface
*intf
, const struct usb_device_id
*id
)
144 struct usb_device
*udev
= interface_to_usbdev(intf
);
146 PMINI_ADAPTER psAdapter
;
147 PS_INTERFACE_ADAPTER psIntfAdapter
;
148 struct net_device
*ndev
;
150 /* Reserve one extra queue for the bit-bucket */
151 ndev
= alloc_etherdev_mq(sizeof(MINI_ADAPTER
), NO_OF_QUEUES
+1);
153 dev_err(&udev
->dev
, DRV_NAME
": no memory for device\n");
157 SET_NETDEV_DEV(ndev
, &intf
->dev
);
159 psAdapter
= netdev_priv(ndev
);
160 psAdapter
->dev
= ndev
;
161 psAdapter
->msg_enable
= netif_msg_init(debug
, default_msg
);
163 /* Init default driver debug state */
165 psAdapter
->stDebugState
.debug_level
= DBG_LVL_CURR
;
166 psAdapter
->stDebugState
.type
= DBG_TYPE_INITEXIT
;
169 * Technically, one can start using BCM_DEBUG_PRINT after this point.
170 * However, realize that by default the Type/Subtype bitmaps are all zero now;
171 * so no prints will actually appear until the TestApp turns on debug paths via
172 * the ioctl(); so practically speaking, in early init, no logging happens.
174 * A solution (used below): we explicitly set the bitmaps to 1 for Type=DBG_TYPE_INITEXIT
175 * and ALL subtype's of the same. Now all bcm debug statements get logged, enabling debug
177 * Further, we turn this OFF once init_module() completes.
180 psAdapter
->stDebugState
.subtype
[DBG_TYPE_INITEXIT
] = 0xff;
181 BCM_SHOW_DEBUG_BITMAP(psAdapter
);
183 retval
= InitAdapter(psAdapter
);
185 dev_err(&udev
->dev
, DRV_NAME
": InitAdapter Failed\n");
186 AdapterFree(psAdapter
);
190 /* Allocate interface adapter structure */
191 psIntfAdapter
= kzalloc(sizeof(S_INTERFACE_ADAPTER
), GFP_KERNEL
);
192 if (psIntfAdapter
== NULL
) {
193 dev_err(&udev
->dev
, DRV_NAME
": no memory for Interface adapter\n");
194 AdapterFree(psAdapter
);
198 psAdapter
->pvInterfaceAdapter
= psIntfAdapter
;
199 psIntfAdapter
->psAdapter
= psAdapter
;
201 /* Store usb interface in Interface Adapter */
202 psIntfAdapter
->interface
= intf
;
203 usb_set_intfdata(intf
, psIntfAdapter
);
205 BCM_DEBUG_PRINT(psAdapter
, DBG_TYPE_INITEXIT
, DRV_ENTRY
, DBG_LVL_ALL
,
206 "psIntfAdapter 0x%p\n", psIntfAdapter
);
207 retval
= InterfaceAdapterInit(psIntfAdapter
);
209 /* If the Firmware/Cfg File is not present
210 * then return success, let the application
211 * download the files.
213 if (-ENOENT
== retval
) {
214 BCM_DEBUG_PRINT(psAdapter
, DBG_TYPE_INITEXIT
, DRV_ENTRY
, DBG_LVL_ALL
,
215 "File Not Found. Use app to download.\n");
216 return STATUS_SUCCESS
;
218 BCM_DEBUG_PRINT(psAdapter
, DBG_TYPE_INITEXIT
, DRV_ENTRY
, DBG_LVL_ALL
,
219 "InterfaceAdapterInit failed.\n");
220 usb_set_intfdata(intf
, NULL
);
221 udev
= interface_to_usbdev(intf
);
223 InterfaceAdapterFree(psIntfAdapter
);
226 if (psAdapter
->chip_id
> T3
) {
227 uint32_t uiNackZeroLengthInt
= 4;
229 retval
= wrmalt(psAdapter
, DISABLE_USB_ZERO_LEN_INT
, &uiNackZeroLengthInt
, sizeof(uiNackZeroLengthInt
));
234 /* Check whether the USB-Device Supports remote Wake-Up */
235 if (USB_CONFIG_ATT_WAKEUP
& udev
->actconfig
->desc
.bmAttributes
) {
236 /* If Suspend then only support dynamic suspend */
237 if (psAdapter
->bDoSuspend
) {
239 pm_runtime_set_autosuspend_delay(&udev
->dev
, 0);
240 intf
->needs_remote_wakeup
= 1;
241 usb_enable_autosuspend(udev
);
242 device_init_wakeup(&intf
->dev
, 1);
243 INIT_WORK(&psIntfAdapter
->usbSuspendWork
, putUsbSuspend
);
244 BCM_DEBUG_PRINT(psAdapter
, DBG_TYPE_INITEXIT
, DRV_ENTRY
, DBG_LVL_ALL
,
245 "Enabling USB Auto-Suspend\n");
248 intf
->needs_remote_wakeup
= 0;
249 usb_disable_autosuspend(udev
);
253 psAdapter
->stDebugState
.subtype
[DBG_TYPE_INITEXIT
] = 0x0;
257 static void usbbcm_disconnect(struct usb_interface
*intf
)
259 PS_INTERFACE_ADAPTER psIntfAdapter
= usb_get_intfdata(intf
);
260 PMINI_ADAPTER psAdapter
;
261 struct usb_device
*udev
= interface_to_usbdev(intf
);
263 if (psIntfAdapter
== NULL
)
266 psAdapter
= psIntfAdapter
->psAdapter
;
267 netif_device_detach(psAdapter
->dev
);
269 if (psAdapter
->bDoSuspend
)
270 intf
->needs_remote_wakeup
= 0;
272 psAdapter
->device_removed
= TRUE
;
273 usb_set_intfdata(intf
, NULL
);
274 InterfaceAdapterFree(psIntfAdapter
);
278 static int AllocUsbCb(PS_INTERFACE_ADAPTER psIntfAdapter
)
282 for (i
= 0; i
< MAXIMUM_USB_TCB
; i
++) {
283 psIntfAdapter
->asUsbTcb
[i
].urb
= usb_alloc_urb(0, GFP_KERNEL
);
285 if (psIntfAdapter
->asUsbTcb
[i
].urb
== NULL
) {
286 BCM_DEBUG_PRINT(psIntfAdapter
->psAdapter
, DBG_TYPE_PRINTK
, 0, 0,
287 "Can't allocate Tx urb for index %d\n", i
);
292 for (i
= 0; i
< MAXIMUM_USB_RCB
; i
++) {
293 psIntfAdapter
->asUsbRcb
[i
].urb
= usb_alloc_urb(0, GFP_KERNEL
);
295 if (psIntfAdapter
->asUsbRcb
[i
].urb
== NULL
) {
296 BCM_DEBUG_PRINT(psIntfAdapter
->psAdapter
, DBG_TYPE_PRINTK
, 0, 0,
297 "Can't allocate Rx urb for index %d\n", i
);
301 psIntfAdapter
->asUsbRcb
[i
].urb
->transfer_buffer
= kmalloc(MAX_DATA_BUFFER_SIZE
, GFP_KERNEL
);
303 if (psIntfAdapter
->asUsbRcb
[i
].urb
->transfer_buffer
== NULL
) {
304 BCM_DEBUG_PRINT(psIntfAdapter
->psAdapter
, DBG_TYPE_PRINTK
, 0, 0,
305 "Can't allocate Rx buffer for index %d\n", i
);
308 psIntfAdapter
->asUsbRcb
[i
].urb
->transfer_buffer_length
= MAX_DATA_BUFFER_SIZE
;
313 static int device_run(PS_INTERFACE_ADAPTER psIntfAdapter
)
316 UINT status
= STATUS_SUCCESS
;
318 status
= InitCardAndDownloadFirmware(psIntfAdapter
->psAdapter
);
319 if (status
!= STATUS_SUCCESS
) {
320 pr_err(DRV_NAME
"InitCardAndDownloadFirmware failed.\n");
323 if (TRUE
== psIntfAdapter
->psAdapter
->fw_download_done
) {
324 if (StartInterruptUrb(psIntfAdapter
)) {
325 BCM_DEBUG_PRINT(psIntfAdapter
->psAdapter
, DBG_TYPE_INITEXIT
, DRV_ENTRY
, DBG_LVL_ALL
,
326 "Cannot send interrupt in URB\n");
330 * now register the cntrl interface.
331 * after downloading the f/w waiting for 5 sec to get the mailbox interrupt.
333 psIntfAdapter
->psAdapter
->waiting_to_fw_download_done
= FALSE
;
334 value
= wait_event_timeout(psIntfAdapter
->psAdapter
->ioctl_fw_dnld_wait_queue
,
335 psIntfAdapter
->psAdapter
->waiting_to_fw_download_done
, 5*HZ
);
338 pr_err(DRV_NAME
": Timeout waiting for mailbox interrupt.\n");
340 if (register_control_device_interface(psIntfAdapter
->psAdapter
) < 0) {
341 pr_err(DRV_NAME
": Register Control Device failed.\n");
349 static inline int bcm_usb_endpoint_num(const struct usb_endpoint_descriptor
*epd
)
351 return epd
->bEndpointAddress
& USB_ENDPOINT_NUMBER_MASK
;
354 static inline int bcm_usb_endpoint_type(const struct usb_endpoint_descriptor
*epd
)
356 return epd
->bmAttributes
& USB_ENDPOINT_XFERTYPE_MASK
;
359 static inline int bcm_usb_endpoint_dir_in(const struct usb_endpoint_descriptor
*epd
)
361 return ((epd
->bEndpointAddress
& USB_ENDPOINT_DIR_MASK
) == USB_DIR_IN
);
364 static inline int bcm_usb_endpoint_dir_out(const struct usb_endpoint_descriptor
*epd
)
366 return ((epd
->bEndpointAddress
& USB_ENDPOINT_DIR_MASK
) == USB_DIR_OUT
);
369 static inline int bcm_usb_endpoint_xfer_bulk(const struct usb_endpoint_descriptor
*epd
)
371 return ((epd
->bmAttributes
& USB_ENDPOINT_XFERTYPE_MASK
) ==
372 USB_ENDPOINT_XFER_BULK
);
375 static inline int bcm_usb_endpoint_xfer_control(const struct usb_endpoint_descriptor
*epd
)
377 return ((epd
->bmAttributes
& USB_ENDPOINT_XFERTYPE_MASK
) ==
378 USB_ENDPOINT_XFER_CONTROL
);
381 static inline int bcm_usb_endpoint_xfer_int(const struct usb_endpoint_descriptor
*epd
)
383 return ((epd
->bmAttributes
& USB_ENDPOINT_XFERTYPE_MASK
) ==
384 USB_ENDPOINT_XFER_INT
);
387 static inline int bcm_usb_endpoint_xfer_isoc(const struct usb_endpoint_descriptor
*epd
)
389 return ((epd
->bmAttributes
& USB_ENDPOINT_XFERTYPE_MASK
) ==
390 USB_ENDPOINT_XFER_ISOC
);
393 static inline int bcm_usb_endpoint_is_bulk_in(const struct usb_endpoint_descriptor
*epd
)
395 return bcm_usb_endpoint_xfer_bulk(epd
) && bcm_usb_endpoint_dir_in(epd
);
398 static inline int bcm_usb_endpoint_is_bulk_out(const struct usb_endpoint_descriptor
*epd
)
400 return bcm_usb_endpoint_xfer_bulk(epd
) && bcm_usb_endpoint_dir_out(epd
);
403 static inline int bcm_usb_endpoint_is_int_in(const struct usb_endpoint_descriptor
*epd
)
405 return bcm_usb_endpoint_xfer_int(epd
) && bcm_usb_endpoint_dir_in(epd
);
408 static inline int bcm_usb_endpoint_is_int_out(const struct usb_endpoint_descriptor
*epd
)
410 return bcm_usb_endpoint_xfer_int(epd
) && bcm_usb_endpoint_dir_out(epd
);
413 static inline int bcm_usb_endpoint_is_isoc_in(const struct usb_endpoint_descriptor
*epd
)
415 return bcm_usb_endpoint_xfer_isoc(epd
) && bcm_usb_endpoint_dir_in(epd
);
418 static inline int bcm_usb_endpoint_is_isoc_out(const struct usb_endpoint_descriptor
*epd
)
420 return bcm_usb_endpoint_xfer_isoc(epd
) && bcm_usb_endpoint_dir_out(epd
);
423 static int InterfaceAdapterInit(PS_INTERFACE_ADAPTER psIntfAdapter
)
425 struct usb_host_interface
*iface_desc
;
426 struct usb_endpoint_descriptor
*endpoint
;
430 int usedIntOutForBulkTransfer
= 0 ;
431 BOOLEAN bBcm16
= FALSE
;
434 /* Store the usb dev into interface adapter */
435 psIntfAdapter
->udev
= usb_get_dev(interface_to_usbdev(psIntfAdapter
->interface
));
437 psIntfAdapter
->bHighSpeedDevice
= (psIntfAdapter
->udev
->speed
== USB_SPEED_HIGH
);
438 psIntfAdapter
->psAdapter
->interface_rdm
= BcmRDM
;
439 psIntfAdapter
->psAdapter
->interface_wrm
= BcmWRM
;
441 retval
= rdmalt(psIntfAdapter
->psAdapter
, CHIP_ID_REG
,
442 (u32
*)&(psIntfAdapter
->psAdapter
->chip_id
), sizeof(u32
));
444 BCM_DEBUG_PRINT(psIntfAdapter
->psAdapter
, DBG_TYPE_PRINTK
, 0, 0, "CHIP ID Read Failed\n");
448 if (0xbece3200 == (psIntfAdapter
->psAdapter
->chip_id
& ~(0xF0)))
449 psIntfAdapter
->psAdapter
->chip_id
&= ~0xF0;
451 dev_info(&psIntfAdapter
->udev
->dev
, "RDM Chip ID 0x%lx\n",
452 psIntfAdapter
->psAdapter
->chip_id
);
454 iface_desc
= psIntfAdapter
->interface
->cur_altsetting
;
456 if (psIntfAdapter
->psAdapter
->chip_id
== T3B
) {
457 /* T3B device will have EEPROM, check if EEPROM is proper and BCM16 can be done or not. */
458 BeceemEEPROMBulkRead(psIntfAdapter
->psAdapter
, &uiData
, 0x0, 4);
462 dev_info(&psIntfAdapter
->udev
->dev
, "number of alternate setting %d\n",
463 psIntfAdapter
->interface
->num_altsetting
);
465 if (bBcm16
== TRUE
) {
466 /* selecting alternate setting one as a default setting for High Speed modem. */
467 if (psIntfAdapter
->bHighSpeedDevice
)
468 retval
= usb_set_interface(psIntfAdapter
->udev
, DEFAULT_SETTING_0
, ALTERNATE_SETTING_1
);
469 BCM_DEBUG_PRINT(psIntfAdapter
->psAdapter
, DBG_TYPE_INITEXIT
, DRV_ENTRY
, DBG_LVL_ALL
,
470 "BCM16 is applicable on this dongle\n");
471 if (retval
|| (psIntfAdapter
->bHighSpeedDevice
== FALSE
)) {
472 usedIntOutForBulkTransfer
= EP2
;
473 endpoint
= &iface_desc
->endpoint
[EP2
].desc
;
474 BCM_DEBUG_PRINT(psIntfAdapter
->psAdapter
, DBG_TYPE_INITEXIT
, DRV_ENTRY
, DBG_LVL_ALL
,
475 "Interface altsetting failed or modem is configured to Full Speed, hence will work on default setting 0\n");
477 * If Modem is high speed device EP2 should be INT OUT End point
478 * If Mode is FS then EP2 should be bulk end point
480 if (((psIntfAdapter
->bHighSpeedDevice
== TRUE
) && (bcm_usb_endpoint_is_int_out(endpoint
) == FALSE
))
481 || ((psIntfAdapter
->bHighSpeedDevice
== FALSE
) && (bcm_usb_endpoint_is_bulk_out(endpoint
) == FALSE
))) {
482 BCM_DEBUG_PRINT(psIntfAdapter
->psAdapter
, DBG_TYPE_INITEXIT
, DRV_ENTRY
, DBG_LVL_ALL
,
483 "Configuring the EEPROM\n");
484 /* change the EP2, EP4 to INT OUT end point */
485 ConfigureEndPointTypesThroughEEPROM(psIntfAdapter
->psAdapter
);
488 * It resets the device and if any thing gets changed
489 * in USB descriptor it will show fail and re-enumerate
492 retval
= usb_reset_device(psIntfAdapter
->udev
);
494 BCM_DEBUG_PRINT(psIntfAdapter
->psAdapter
, DBG_TYPE_INITEXIT
, DRV_ENTRY
, DBG_LVL_ALL
,
495 "reset failed. Re-enumerating the device.\n");
500 if ((psIntfAdapter
->bHighSpeedDevice
== FALSE
) && bcm_usb_endpoint_is_bulk_out(endpoint
)) {
501 /* Once BULK is selected in FS mode. Revert it back to INT. Else USB_IF will fail. */
502 UINT _uiData
= ntohl(EP2_CFG_INT
);
503 BCM_DEBUG_PRINT(psIntfAdapter
->psAdapter
, DBG_TYPE_INITEXIT
, DRV_ENTRY
, DBG_LVL_ALL
,
504 "Reverting Bulk to INT as it is in Full Speed mode.\n");
505 BeceemEEPROMBulkWrite(psIntfAdapter
->psAdapter
, (PUCHAR
)&_uiData
, 0x136, 4, TRUE
);
508 usedIntOutForBulkTransfer
= EP4
;
509 endpoint
= &iface_desc
->endpoint
[EP4
].desc
;
510 BCM_DEBUG_PRINT(psIntfAdapter
->psAdapter
, DBG_TYPE_INITEXIT
, DRV_ENTRY
, DBG_LVL_ALL
,
511 "Choosing AltSetting as a default setting.\n");
512 if (bcm_usb_endpoint_is_int_out(endpoint
) == FALSE
) {
513 BCM_DEBUG_PRINT(psIntfAdapter
->psAdapter
, DBG_TYPE_INITEXIT
, DRV_ENTRY
, DBG_LVL_ALL
,
514 "Dongle does not have BCM16 Fix.\n");
515 /* change the EP2, EP4 to INT OUT end point and use EP4 in altsetting */
516 ConfigureEndPointTypesThroughEEPROM(psIntfAdapter
->psAdapter
);
519 * It resets the device and if any thing gets changed in
520 * USB descriptor it will show fail and re-enumerate the
523 retval
= usb_reset_device(psIntfAdapter
->udev
);
525 BCM_DEBUG_PRINT(psIntfAdapter
->psAdapter
, DBG_TYPE_INITEXIT
, DRV_ENTRY
, DBG_LVL_ALL
,
526 "reset failed. Re-enumerating the device.\n");
535 iface_desc
= psIntfAdapter
->interface
->cur_altsetting
;
537 for (value
= 0; value
< iface_desc
->desc
.bNumEndpoints
; ++value
) {
538 endpoint
= &iface_desc
->endpoint
[value
].desc
;
540 if (!psIntfAdapter
->sBulkIn
.bulk_in_endpointAddr
&& bcm_usb_endpoint_is_bulk_in(endpoint
)) {
541 buffer_size
= le16_to_cpu(endpoint
->wMaxPacketSize
);
542 psIntfAdapter
->sBulkIn
.bulk_in_size
= buffer_size
;
543 psIntfAdapter
->sBulkIn
.bulk_in_endpointAddr
= endpoint
->bEndpointAddress
;
544 psIntfAdapter
->sBulkIn
.bulk_in_pipe
=
545 usb_rcvbulkpipe(psIntfAdapter
->udev
,
546 psIntfAdapter
->sBulkIn
.bulk_in_endpointAddr
);
549 if (!psIntfAdapter
->sBulkOut
.bulk_out_endpointAddr
&& bcm_usb_endpoint_is_bulk_out(endpoint
)) {
550 psIntfAdapter
->sBulkOut
.bulk_out_endpointAddr
= endpoint
->bEndpointAddress
;
551 psIntfAdapter
->sBulkOut
.bulk_out_pipe
=
552 usb_sndbulkpipe(psIntfAdapter
->udev
,
553 psIntfAdapter
->sBulkOut
.bulk_out_endpointAddr
);
556 if (!psIntfAdapter
->sIntrIn
.int_in_endpointAddr
&& bcm_usb_endpoint_is_int_in(endpoint
)) {
557 buffer_size
= le16_to_cpu(endpoint
->wMaxPacketSize
);
558 psIntfAdapter
->sIntrIn
.int_in_size
= buffer_size
;
559 psIntfAdapter
->sIntrIn
.int_in_endpointAddr
= endpoint
->bEndpointAddress
;
560 psIntfAdapter
->sIntrIn
.int_in_interval
= endpoint
->bInterval
;
561 psIntfAdapter
->sIntrIn
.int_in_buffer
=
562 kmalloc(buffer_size
, GFP_KERNEL
);
563 if (!psIntfAdapter
->sIntrIn
.int_in_buffer
) {
564 dev_err(&psIntfAdapter
->udev
->dev
,
565 "could not allocate interrupt_in_buffer\n");
570 if (!psIntfAdapter
->sIntrOut
.int_out_endpointAddr
&& bcm_usb_endpoint_is_int_out(endpoint
)) {
571 if (!psIntfAdapter
->sBulkOut
.bulk_out_endpointAddr
&&
572 (psIntfAdapter
->psAdapter
->chip_id
== T3B
) && (value
== usedIntOutForBulkTransfer
)) {
573 /* use first intout end point as a bulk out end point */
574 buffer_size
= le16_to_cpu(endpoint
->wMaxPacketSize
);
575 psIntfAdapter
->sBulkOut
.bulk_out_size
= buffer_size
;
576 psIntfAdapter
->sBulkOut
.bulk_out_endpointAddr
= endpoint
->bEndpointAddress
;
577 psIntfAdapter
->sBulkOut
.bulk_out_pipe
= usb_sndintpipe(psIntfAdapter
->udev
,
578 psIntfAdapter
->sBulkOut
.bulk_out_endpointAddr
);
579 psIntfAdapter
->sBulkOut
.int_out_interval
= endpoint
->bInterval
;
580 } else if (value
== EP6
) {
581 buffer_size
= le16_to_cpu(endpoint
->wMaxPacketSize
);
582 psIntfAdapter
->sIntrOut
.int_out_size
= buffer_size
;
583 psIntfAdapter
->sIntrOut
.int_out_endpointAddr
= endpoint
->bEndpointAddress
;
584 psIntfAdapter
->sIntrOut
.int_out_interval
= endpoint
->bInterval
;
585 psIntfAdapter
->sIntrOut
.int_out_buffer
= kmalloc(buffer_size
, GFP_KERNEL
);
586 if (!psIntfAdapter
->sIntrOut
.int_out_buffer
) {
587 dev_err(&psIntfAdapter
->udev
->dev
,
588 "could not allocate interrupt_out_buffer\n");
595 usb_set_intfdata(psIntfAdapter
->interface
, psIntfAdapter
);
597 psIntfAdapter
->psAdapter
->bcm_file_download
= InterfaceFileDownload
;
598 psIntfAdapter
->psAdapter
->bcm_file_readback_from_chip
=
599 InterfaceFileReadbackFromChip
;
600 psIntfAdapter
->psAdapter
->interface_transmit
= InterfaceTransmitPacket
;
602 retval
= CreateInterruptUrb(psIntfAdapter
);
605 BCM_DEBUG_PRINT(psIntfAdapter
->psAdapter
, DBG_TYPE_PRINTK
, 0, 0,
606 "Cannot create interrupt urb\n");
610 retval
= AllocUsbCb(psIntfAdapter
);
614 return device_run(psIntfAdapter
);
617 static int InterfaceSuspend(struct usb_interface
*intf
, pm_message_t message
)
619 PS_INTERFACE_ADAPTER psIntfAdapter
= usb_get_intfdata(intf
);
621 psIntfAdapter
->bSuspended
= TRUE
;
623 if (TRUE
== psIntfAdapter
->bPreparingForBusSuspend
) {
624 psIntfAdapter
->bPreparingForBusSuspend
= FALSE
;
626 if (psIntfAdapter
->psAdapter
->LinkStatus
== LINKUP_DONE
) {
627 psIntfAdapter
->psAdapter
->IdleMode
= TRUE
;
628 BCM_DEBUG_PRINT(psIntfAdapter
->psAdapter
, DBG_TYPE_INITEXIT
, DRV_ENTRY
, DBG_LVL_ALL
,
629 "Host Entered in PMU Idle Mode.\n");
631 psIntfAdapter
->psAdapter
->bShutStatus
= TRUE
;
632 BCM_DEBUG_PRINT(psIntfAdapter
->psAdapter
, DBG_TYPE_INITEXIT
, DRV_ENTRY
, DBG_LVL_ALL
,
633 "Host Entered in PMU Shutdown Mode.\n");
636 psIntfAdapter
->psAdapter
->bPreparingForLowPowerMode
= FALSE
;
638 /* Signaling the control pkt path */
639 wake_up(&psIntfAdapter
->psAdapter
->lowpower_mode_wait_queue
);
644 static int InterfaceResume(struct usb_interface
*intf
)
646 PS_INTERFACE_ADAPTER psIntfAdapter
= usb_get_intfdata(intf
);
649 psIntfAdapter
->bSuspended
= FALSE
;
651 StartInterruptUrb(psIntfAdapter
);
652 InterfaceRx(psIntfAdapter
);
656 static struct usb_driver usbbcm_driver
= {
658 .probe
= usbbcm_device_probe
,
659 .disconnect
= usbbcm_disconnect
,
660 .suspend
= InterfaceSuspend
,
661 .resume
= InterfaceResume
,
662 .id_table
= InterfaceUsbtable
,
663 .supports_autosuspend
= 1,
666 struct class *bcm_class
;
668 static __init
int bcm_init(void)
670 printk(KERN_INFO
"%s: %s, %s\n", DRV_NAME
, DRV_DESCRIPTION
, DRV_VERSION
);
671 printk(KERN_INFO
"%s\n", DRV_COPYRIGHT
);
673 bcm_class
= class_create(THIS_MODULE
, DRV_NAME
);
674 if (IS_ERR(bcm_class
)) {
675 printk(KERN_ERR DRV_NAME
": could not create class\n");
676 return PTR_ERR(bcm_class
);
679 return usb_register(&usbbcm_driver
);
682 static __exit
void bcm_exit(void)
684 usb_deregister(&usbbcm_driver
);
685 class_destroy(bcm_class
);
688 module_init(bcm_init
);
689 module_exit(bcm_exit
);
691 MODULE_DESCRIPTION(DRV_DESCRIPTION
);
692 MODULE_VERSION(DRV_VERSION
);
693 MODULE_LICENSE("GPL");