drm/radeon/kms: move panel mode setup into encoder mode set
[linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git] / drivers / staging / bcm / InterfaceInit.c
bloba09d35108f04b6a3f78c3d22612e303776a467fe
1 #include "headers.h"
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) },
11 { }
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)
28 int i = 0;
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");
44 msleep(100);
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;
71 int ret;
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);
84 } else {
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));
98 if (ret) {
99 BCM_DEBUG_PRINT(Adapter, DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL,
100 "reading of Tx EP failed\n");
101 return;
103 ulReg |= 0x6;
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);
121 ulReg &= 0x0101FFFF;
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);
136 ulReg = 0;
137 BeceemEEPROMBulkWrite(Adapter, (PUCHAR)&ulReg, 0x122, 4, TRUE);
138 ulReg = 0;
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);
145 int retval;
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);
152 if (ndev == NULL) {
153 dev_err(&udev->dev, DRV_NAME ": no memory for device\n");
154 return -ENOMEM;
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
176 * during early init.
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);
184 if (retval) {
185 dev_err(&udev->dev, DRV_NAME ": InitAdapter Failed\n");
186 AdapterFree(psAdapter);
187 return retval;
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);
195 return -ENOMEM;
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);
208 if (retval) {
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);
222 usb_put_dev(udev);
223 InterfaceAdapterFree(psIntfAdapter);
224 return retval;
226 if (psAdapter->chip_id > T3) {
227 uint32_t uiNackZeroLengthInt = 4;
229 retval = wrmalt(psAdapter, DISABLE_USB_ZERO_LEN_INT, &uiNackZeroLengthInt, sizeof(uiNackZeroLengthInt));
230 if (retval)
231 return retval;
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) {
238 #ifdef CONFIG_PM
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");
246 #endif
247 } else {
248 intf->needs_remote_wakeup = 0;
249 usb_disable_autosuspend(udev);
253 psAdapter->stDebugState.subtype[DBG_TYPE_INITEXIT] = 0x0;
254 return retval;
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)
264 return;
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);
275 usb_put_dev(udev);
278 static int AllocUsbCb(PS_INTERFACE_ADAPTER psIntfAdapter)
280 int i = 0;
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);
288 return -ENOMEM;
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);
298 return -ENOMEM;
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);
306 return -ENOMEM;
308 psIntfAdapter->asUsbRcb[i].urb->transfer_buffer_length = MAX_DATA_BUFFER_SIZE;
310 return 0;
313 static int device_run(PS_INTERFACE_ADAPTER psIntfAdapter)
315 int value = 0;
316 UINT status = STATUS_SUCCESS;
318 status = InitCardAndDownloadFirmware(psIntfAdapter->psAdapter);
319 if (status != STATUS_SUCCESS) {
320 pr_err(DRV_NAME "InitCardAndDownloadFirmware failed.\n");
321 return status;
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);
337 if (value == 0)
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");
342 return -EIO;
345 return 0;
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;
427 size_t buffer_size;
428 unsigned long value;
429 int retval = 0;
430 int usedIntOutForBulkTransfer = 0 ;
431 BOOLEAN bBcm16 = FALSE;
432 UINT uiData = 0;
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));
443 if (retval) {
444 BCM_DEBUG_PRINT(psIntfAdapter->psAdapter, DBG_TYPE_PRINTK, 0, 0, "CHIP ID Read Failed\n");
445 return retval;
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);
459 if (uiData == BECM)
460 bBcm16 = TRUE;
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
490 * the device
492 retval = usb_reset_device(psIntfAdapter->udev);
493 if (retval) {
494 BCM_DEBUG_PRINT(psIntfAdapter->psAdapter, DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL,
495 "reset failed. Re-enumerating the device.\n");
496 return retval ;
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);
507 } else {
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
521 * device
523 retval = usb_reset_device(psIntfAdapter->udev);
524 if (retval) {
525 BCM_DEBUG_PRINT(psIntfAdapter->psAdapter, DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL,
526 "reset failed. Re-enumerating the device.\n");
527 return retval;
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");
566 return -EINVAL;
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");
589 return -EINVAL;
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);
604 if (retval) {
605 BCM_DEBUG_PRINT(psIntfAdapter->psAdapter, DBG_TYPE_PRINTK, 0, 0,
606 "Cannot create interrupt urb\n");
607 return retval;
610 retval = AllocUsbCb(psIntfAdapter);
611 if (retval)
612 return retval;
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");
630 } else {
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);
641 return 0;
644 static int InterfaceResume(struct usb_interface *intf)
646 PS_INTERFACE_ADAPTER psIntfAdapter = usb_get_intfdata(intf);
648 mdelay(100);
649 psIntfAdapter->bSuspended = FALSE;
651 StartInterruptUrb(psIntfAdapter);
652 InterfaceRx(psIntfAdapter);
653 return 0;
656 static struct usb_driver usbbcm_driver = {
657 .name = "usbbcm",
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");