staging: rtl8723au: Do not duplicate kernel provided USB macros
[linux-2.6-microblaze.git] / drivers / staging / rtl8723au / os_dep / usb_intf.c
1 /******************************************************************************
2  *
3  * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms of version 2 of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12  * more details.
13  *
14  ******************************************************************************/
15 #define _HCI_INTF_C_
16
17 #include <osdep_service.h>
18 #include <drv_types.h>
19 #include <recv_osdep.h>
20 #include <xmit_osdep.h>
21 #include <hal_intf.h>
22 #include <rtw_version.h>
23 #include <osdep_intf.h>
24 #include <usb_ops.h>
25 #include <rtl8723a_hal.h>
26
27 static int rtw_suspend(struct usb_interface *intf, pm_message_t message);
28 static int rtw_resume(struct usb_interface *intf);
29 static int rtw_drv_init(struct usb_interface *pusb_intf,
30                         const struct usb_device_id *pdid);
31 static void rtw_disconnect(struct usb_interface *pusb_intf);
32
33 #define USB_VENDER_ID_REALTEK           0x0BDA
34
35 #define RTL8723A_USB_IDS \
36         {USB_DEVICE_AND_INTERFACE_INFO(USB_VENDER_ID_REALTEK, 0x8724,   \
37          0xff, 0xff, 0xff)}, /* 8723AU 1*1 */ \
38         {USB_DEVICE_AND_INTERFACE_INFO(USB_VENDER_ID_REALTEK, 0x1724,   \
39          0xff, 0xff, 0xff)}, /* 8723AU 1*1 */ \
40         {USB_DEVICE_AND_INTERFACE_INFO(USB_VENDER_ID_REALTEK, 0x0724,   \
41          0xff, 0xff, 0xff)}, /* 8723AU 1*1 */
42
43 static struct usb_device_id rtl8723a_usb_id_tbl[] = {
44         RTL8723A_USB_IDS
45         {}      /* Terminating entry */
46 };
47
48 MODULE_DEVICE_TABLE(usb, rtl8723a_usb_id_tbl);
49
50 static struct usb_driver rtl8723a_usb_drv = {
51         .name = (char *)"rtl8723au",
52         .probe = rtw_drv_init,
53         .disconnect = rtw_disconnect,
54         .id_table = rtl8723a_usb_id_tbl,
55         .suspend = rtw_suspend,
56         .resume = rtw_resume,
57         .reset_resume  = rtw_resume,
58 };
59
60 static struct usb_driver *usb_drv = &rtl8723a_usb_drv;
61
62 static inline int RT_usb_endpoint_is_bulk_in(const struct usb_endpoint_descriptor *epd)
63 {
64         return usb_endpoint_xfer_bulk(epd) && usb_endpoint_dir_in(epd);
65 }
66
67 static inline int RT_usb_endpoint_is_bulk_out(const struct usb_endpoint_descriptor *epd)
68 {
69         return usb_endpoint_xfer_bulk(epd) && usb_endpoint_dir_out(epd);
70 }
71
72 static inline int RT_usb_endpoint_is_int_in(const struct usb_endpoint_descriptor *epd)
73 {
74         return usb_endpoint_xfer_int(epd) && usb_endpoint_dir_in(epd);
75 }
76
77 static int rtw_init_intf_priv(struct dvobj_priv *dvobj)
78 {
79         mutex_init(&dvobj->usb_vendor_req_mutex);
80
81         return _SUCCESS;
82 }
83
84 static int rtw_deinit_intf_priv(struct dvobj_priv *dvobj)
85 {
86         mutex_destroy(&dvobj->usb_vendor_req_mutex);
87
88         return _SUCCESS;
89 }
90
91 static struct dvobj_priv *usb_dvobj_init(struct usb_interface *usb_intf)
92 {
93         struct dvobj_priv *pdvobjpriv;
94         struct usb_device_descriptor *pdev_desc;
95         struct usb_host_config   *phost_conf;
96         struct usb_config_descriptor *pconf_desc;
97         struct usb_host_interface *phost_iface;
98         struct usb_interface_descriptor *piface_desc;
99         struct usb_host_endpoint *phost_endp;
100         struct usb_endpoint_descriptor *pendp_desc;
101         struct usb_device                *pusbd;
102         int     i;
103         int     status = _FAIL;
104
105         pdvobjpriv = kzalloc(sizeof(*pdvobjpriv), GFP_KERNEL);
106         if (!pdvobjpriv)
107                 goto exit;
108
109         mutex_init(&pdvobjpriv->hw_init_mutex);
110         mutex_init(&pdvobjpriv->h2c_fwcmd_mutex);
111         mutex_init(&pdvobjpriv->setch_mutex);
112         mutex_init(&pdvobjpriv->setbw_mutex);
113
114         pdvobjpriv->pusbintf = usb_intf;
115         pusbd = interface_to_usbdev(usb_intf);
116         pdvobjpriv->pusbdev = pusbd;
117         usb_set_intfdata(usb_intf, pdvobjpriv);
118
119         pdvobjpriv->RtNumInPipes = 0;
120         pdvobjpriv->RtNumOutPipes = 0;
121
122         pdev_desc = &pusbd->descriptor;
123
124         phost_conf = pusbd->actconfig;
125         pconf_desc = &phost_conf->desc;
126
127         phost_iface = &usb_intf->altsetting[0];
128         piface_desc = &phost_iface->desc;
129
130         pdvobjpriv->NumInterfaces = pconf_desc->bNumInterfaces;
131         pdvobjpriv->InterfaceNumber = piface_desc->bInterfaceNumber;
132         pdvobjpriv->nr_endpoint = piface_desc->bNumEndpoints;
133
134         for (i = 0; i < pdvobjpriv->nr_endpoint; i++) {
135                 phost_endp = phost_iface->endpoint + i;
136                 if (phost_endp) {
137                         pendp_desc = &phost_endp->desc;
138
139                         DBG_8723A("\nusb_endpoint_descriptor(%d):\n", i);
140                         DBG_8723A("bLength =%x\n", pendp_desc->bLength);
141                         DBG_8723A("bDescriptorType =%x\n",
142                                   pendp_desc->bDescriptorType);
143                         DBG_8723A("bEndpointAddress =%x\n",
144                                   pendp_desc->bEndpointAddress);
145                         DBG_8723A("wMaxPacketSize =%d\n",
146                                   le16_to_cpu(pendp_desc->wMaxPacketSize));
147                         DBG_8723A("bInterval =%x\n", pendp_desc->bInterval);
148
149                         if (RT_usb_endpoint_is_bulk_in(pendp_desc)) {
150                                 DBG_8723A("RT_usb_endpoint_is_bulk_in = %x\n",
151                                           usb_endpoint_num(pendp_desc));
152                                 pdvobjpriv->RtInPipe[pdvobjpriv->RtNumInPipes] =
153                                         usb_endpoint_num(pendp_desc);
154                                 pdvobjpriv->RtNumInPipes++;
155                         } else if (RT_usb_endpoint_is_int_in(pendp_desc)) {
156                                 DBG_8723A("RT_usb_endpoint_is_int_in = %x, Interval = %x\n",
157                                           usb_endpoint_num(pendp_desc),
158                                           pendp_desc->bInterval);
159                                 pdvobjpriv->RtInPipe[pdvobjpriv->RtNumInPipes] =
160                                         usb_endpoint_num(pendp_desc);
161                                 pdvobjpriv->RtNumInPipes++;
162                         } else if (RT_usb_endpoint_is_bulk_out(pendp_desc)) {
163                                 DBG_8723A("RT_usb_endpoint_is_bulk_out = %x\n",
164                                           usb_endpoint_num(pendp_desc));
165                                 pdvobjpriv->RtOutPipe[pdvobjpriv->RtNumOutPipes] =
166                                         usb_endpoint_num(pendp_desc);
167                                 pdvobjpriv->RtNumOutPipes++;
168                         }
169                         pdvobjpriv->ep_num[i] = usb_endpoint_num(pendp_desc);
170                 }
171         }
172         DBG_8723A("nr_endpoint =%d, in_num =%d, out_num =%d\n\n",
173                   pdvobjpriv->nr_endpoint, pdvobjpriv->RtNumInPipes,
174                   pdvobjpriv->RtNumOutPipes);
175
176         if (pusbd->speed == USB_SPEED_HIGH) {
177                 pdvobjpriv->ishighspeed = true;
178                 DBG_8723A("USB_SPEED_HIGH\n");
179         } else {
180                 pdvobjpriv->ishighspeed = false;
181                 DBG_8723A("NON USB_SPEED_HIGH\n");
182         }
183
184         if (rtw_init_intf_priv(pdvobjpriv) == _FAIL) {
185                 RT_TRACE(_module_os_intfs_c_, _drv_err_,
186                          ("\n Can't INIT rtw_init_intf_priv\n"));
187                 goto free_dvobj;
188         }
189         /* 3 misc */
190         rtw_reset_continual_urb_error(pdvobjpriv);
191         usb_get_dev(pusbd);
192         status = _SUCCESS;
193 free_dvobj:
194         if (status != _SUCCESS && pdvobjpriv) {
195                 usb_set_intfdata(usb_intf, NULL);
196                 mutex_destroy(&pdvobjpriv->hw_init_mutex);
197                 mutex_destroy(&pdvobjpriv->h2c_fwcmd_mutex);
198                 mutex_destroy(&pdvobjpriv->setch_mutex);
199                 mutex_destroy(&pdvobjpriv->setbw_mutex);
200                 kfree(pdvobjpriv);
201                 pdvobjpriv = NULL;
202         }
203 exit:
204         return pdvobjpriv;
205 }
206
207 static void usb_dvobj_deinit(struct usb_interface *usb_intf)
208 {
209         struct dvobj_priv *dvobj = usb_get_intfdata(usb_intf);
210
211         usb_set_intfdata(usb_intf, NULL);
212         if (dvobj) {
213                 /* Modify condition for 92DU DMDP 2010.11.18, by Thomas */
214                 if ((dvobj->NumInterfaces != 2 && dvobj->NumInterfaces != 3) ||
215                     (dvobj->InterfaceNumber == 1)) {
216                         if (interface_to_usbdev(usb_intf)->state !=
217                             USB_STATE_NOTATTACHED) {
218                                 /* If we didn't unplug usb dongle and
219                                  * remove/insert module, driver fails on
220                                  * sitesurvey for the first time when
221                                  * device is up .
222                                  * Reset usb port for sitesurvey fail issue.
223                                  */
224                                 DBG_8723A("usb attached..., try to reset usb device\n");
225                                 usb_reset_device(interface_to_usbdev(usb_intf));
226                         }
227                 }
228                 rtw_deinit_intf_priv(dvobj);
229                 mutex_destroy(&dvobj->hw_init_mutex);
230                 mutex_destroy(&dvobj->h2c_fwcmd_mutex);
231                 mutex_destroy(&dvobj->setch_mutex);
232                 mutex_destroy(&dvobj->setbw_mutex);
233                 kfree(dvobj);
234         }
235         usb_put_dev(interface_to_usbdev(usb_intf));
236 }
237
238 void rtl8723a_usb_intf_stop(struct rtw_adapter *padapter)
239 {
240         RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("+usb_intf_stop\n"));
241
242         /* disable_hw_interrupt */
243         if (!padapter->bSurpriseRemoved) {
244                 /* device still exists, so driver can do i/o operation
245                  * TODO:
246                  */
247                 RT_TRACE(_module_hci_intfs_c_, _drv_err_,
248                          ("SurpriseRemoved == false\n"));
249         }
250
251         /* cancel in irp */
252         rtl8723au_inirp_deinit(padapter);
253
254         /* cancel out irp */
255         rtl8723au_write_port_cancel(padapter);
256
257         /* todo:cancel other irps */
258         RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("-usb_intf_stop\n"));
259 }
260
261 static void rtw_dev_unload(struct rtw_adapter *padapter)
262 {
263         RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("+rtw_dev_unload\n"));
264
265         if (padapter->bup) {
266                 DBG_8723A("===> rtw_dev_unload\n");
267
268                 padapter->bDriverStopped = true;
269                 if (padapter->xmitpriv.ack_tx)
270                         rtw_ack_tx_done23a(&padapter->xmitpriv,
271                                         RTW_SCTX_DONE_DRV_STOP);
272
273                 /* s3. */
274                 rtl8723a_usb_intf_stop(padapter);
275
276                 /* s4. */
277                 flush_workqueue(padapter->cmdpriv.wq);
278
279                 /* s5. */
280                 if (!padapter->bSurpriseRemoved) {
281                         rtl8723au_hal_deinit(padapter);
282                         padapter->bSurpriseRemoved = true;
283                 }
284                 padapter->bup = false;
285         } else {
286                 RT_TRACE(_module_hci_intfs_c_, _drv_err_,
287                          ("r871x_dev_unload():padapter->bup == false\n"));
288         }
289         DBG_8723A("<=== rtw_dev_unload\n");
290         RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("-rtw_dev_unload\n"));
291 }
292
293 int rtw_hw_suspend23a(struct rtw_adapter *padapter)
294 {
295         struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
296         struct net_device *pnetdev = padapter->pnetdev;
297         struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
298
299         if ((!padapter->bup) || (padapter->bDriverStopped) ||
300             (padapter->bSurpriseRemoved)) {
301                 DBG_8723A("padapter->bup =%d bDriverStopped =%d bSurpriseRemoved = %d\n",
302                           padapter->bup, padapter->bDriverStopped,
303                           padapter->bSurpriseRemoved);
304                 goto error_exit;
305         }
306
307         if (padapter) { /* system suspend */
308                 LeaveAllPowerSaveMode23a(padapter);
309
310                 DBG_8723A("==> rtw_hw_suspend23a\n");
311                 down(&pwrpriv->lock);
312                 pwrpriv->bips_processing = true;
313                 /* padapter->net_closed = true; */
314                 /* s1. */
315                 if (pnetdev) {
316                         netif_carrier_off(pnetdev);
317                         netif_tx_stop_all_queues(pnetdev);
318                 }
319
320                 /* s2. */
321                 rtw_disassoc_cmd23a(padapter, 500, false);
322
323                 /* s2-2.  indicate disconnect to os */
324                 /* rtw_indicate_disconnect23a(padapter); */
325                 if (check_fwstate(pmlmepriv, _FW_LINKED)) {
326                         _clr_fwstate_(pmlmepriv, _FW_LINKED);
327
328                         rtw_led_control(padapter, LED_CTL_NO_LINK);
329
330                         rtw_os_indicate_disconnect23a(padapter);
331
332                         /* donnot enqueue cmd */
333                         rtw_lps_ctrl_wk_cmd23a(padapter,
334                                                LPS_CTRL_DISCONNECT, 0);
335                 }
336                 /* s2-3. */
337                 rtw_free_assoc_resources23a(padapter, 1);
338
339                 /* s2-4. */
340                 rtw_free_network_queue23a(padapter);
341                 rtw_ips_dev_unload23a(padapter);
342                 pwrpriv->rf_pwrstate = rf_off;
343                 pwrpriv->bips_processing = false;
344                 up(&pwrpriv->lock);
345         } else {
346                 goto error_exit;
347         }
348         return 0;
349 error_exit:
350         DBG_8723A("%s, failed\n", __func__);
351         return -1;
352 }
353
354 int rtw_hw_resume23a(struct rtw_adapter *padapter)
355 {
356         struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
357         struct net_device *pnetdev = padapter->pnetdev;
358
359         if (padapter) { /* system resume */
360                 DBG_8723A("==> rtw_hw_resume23a\n");
361                 down(&pwrpriv->lock);
362                 pwrpriv->bips_processing = true;
363                 rtw_reset_drv_sw23a(padapter);
364
365                 if (pm_netdev_open23a(pnetdev, false)) {
366                         up(&pwrpriv->lock);
367                         goto error_exit;
368                 }
369
370                 netif_device_attach(pnetdev);
371                 netif_carrier_on(pnetdev);
372
373                 if (!rtw_netif_queue_stopped(pnetdev))
374                         netif_tx_start_all_queues(pnetdev);
375                 else
376                         netif_tx_wake_all_queues(pnetdev);
377
378                 pwrpriv->bkeepfwalive = false;
379
380                 pwrpriv->rf_pwrstate = rf_on;
381                 pwrpriv->bips_processing = false;
382
383                 up(&pwrpriv->lock);
384         } else {
385                 goto error_exit;
386         }
387         return 0;
388 error_exit:
389         DBG_8723A("%s, Open net dev failed\n", __func__);
390         return -1;
391 }
392
393 static int rtw_suspend(struct usb_interface *pusb_intf, pm_message_t message)
394 {
395         struct dvobj_priv *dvobj = usb_get_intfdata(pusb_intf);
396         struct rtw_adapter *padapter = dvobj->if1;
397         struct net_device *pnetdev = padapter->pnetdev;
398         struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
399         struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
400         int ret = 0;
401         unsigned long start_time = jiffies;
402
403         DBG_8723A("==> %s (%s:%d)\n", __func__, current->comm, current->pid);
404
405         if ((!padapter->bup) || (padapter->bDriverStopped) ||
406             (padapter->bSurpriseRemoved)) {
407                 DBG_8723A("padapter->bup =%d bDriverStopped =%d bSurpriseRemoved = %d\n",
408                           padapter->bup, padapter->bDriverStopped,
409                           padapter->bSurpriseRemoved);
410                 goto exit;
411         }
412         pwrpriv->bInSuspend = true;
413         rtw_cancel_all_timer23a(padapter);
414         LeaveAllPowerSaveMode23a(padapter);
415
416         down(&pwrpriv->lock);
417         /* padapter->net_closed = true; */
418         /* s1. */
419         if (pnetdev) {
420                 netif_carrier_off(pnetdev);
421                 netif_tx_stop_all_queues(pnetdev);
422         }
423
424         /* s2. */
425         rtw_disassoc_cmd23a(padapter, 0, false);
426
427         if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) &&
428             check_fwstate(pmlmepriv, _FW_LINKED)) {
429                 DBG_8723A("%s:%d %s(%pM), length:%d assoc_ssid.length:%d\n",
430                           __func__, __LINE__,
431                           pmlmepriv->cur_network.network.Ssid.ssid,
432                           pmlmepriv->cur_network.network.MacAddress,
433                           pmlmepriv->cur_network.network.Ssid.ssid_len,
434                           pmlmepriv->assoc_ssid.ssid_len);
435
436                 rtw_set_roaming(padapter, 1);
437         }
438         /* s2-2.  indicate disconnect to os */
439         rtw_indicate_disconnect23a(padapter);
440         /* s2-3. */
441         rtw_free_assoc_resources23a(padapter, 1);
442         /* s2-4. */
443         rtw_free_network_queue23a(padapter);
444
445         rtw_dev_unload(padapter);
446         up(&pwrpriv->lock);
447
448         if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY))
449                 rtw_cfg80211_indicate_scan_done(
450                         wdev_to_priv(padapter->rtw_wdev), true);
451
452         if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING))
453                 rtw_indicate_disconnect23a(padapter);
454
455 exit:
456         DBG_8723A("<===  %s return %d.............. in %dms\n", __func__,
457                   ret, jiffies_to_msecs(jiffies - start_time));
458
459         return ret;
460 }
461
462 static int rtw_resume(struct usb_interface *pusb_intf)
463 {
464         struct dvobj_priv *dvobj = usb_get_intfdata(pusb_intf);
465         struct rtw_adapter *padapter = dvobj->if1;
466         struct net_device *pnetdev;
467         struct pwrctrl_priv *pwrpriv = NULL;
468         int ret = -1;
469         unsigned long start_time = jiffies;
470
471         DBG_8723A("==> %s (%s:%d)\n", __func__, current->comm, current->pid);
472
473         if (!padapter)
474                 goto exit;
475         pnetdev = padapter->pnetdev;
476         pwrpriv = &padapter->pwrctrlpriv;
477
478         down(&pwrpriv->lock);
479         rtw_reset_drv_sw23a(padapter);
480         pwrpriv->bkeepfwalive = false;
481
482         DBG_8723A("bkeepfwalive(%x)\n", pwrpriv->bkeepfwalive);
483         if (pm_netdev_open23a(pnetdev, true) != 0) {
484                 up(&pwrpriv->lock);
485                 goto exit;
486         }
487
488         netif_device_attach(pnetdev);
489         netif_carrier_on(pnetdev);
490
491         up(&pwrpriv->lock);
492
493         if (padapter->pid[1] != 0) {
494                 DBG_8723A("pid[1]:%d\n", padapter->pid[1]);
495                 kill_pid(find_vpid(padapter->pid[1]), SIGUSR2, 1);
496         }
497
498         rtw23a_roaming(padapter, NULL);
499
500         ret = 0;
501 exit:
502         if (pwrpriv)
503                 pwrpriv->bInSuspend = false;
504         DBG_8723A("<===  %s return %d.............. in %dms\n", __func__,
505                   ret, jiffies_to_msecs(jiffies - start_time));
506
507         return ret;
508 }
509
510 /*
511  * drv_init() - a device potentially for us
512  *
513  * notes: drv_init() is called when the bus driver has located a card
514  * for us to support.
515  *        We accept the new device by returning 0.
516  */
517 static struct rtw_adapter *rtw_usb_if1_init(struct dvobj_priv *dvobj,
518                                             struct usb_interface *pusb_intf,
519                                             const struct usb_device_id *pdid)
520 {
521         struct rtw_adapter *padapter = NULL;
522         struct net_device *pnetdev = NULL;
523         int status = _FAIL;
524
525         pnetdev = rtw_init_netdev23a(padapter);
526         if (!pnetdev)
527                 goto free_adapter;
528         padapter = netdev_priv(pnetdev);
529
530         padapter->dvobj = dvobj;
531         padapter->bDriverStopped = true;
532         dvobj->if1 = padapter;
533         dvobj->padapters[dvobj->iface_nums++] = padapter;
534         padapter->iface_id = IFACE_ID0;
535
536         rtl8723au_set_hw_type(padapter);
537
538         SET_NETDEV_DEV(pnetdev, dvobj_to_dev(dvobj));
539
540         if (rtw_wdev_alloc(padapter, dvobj_to_dev(dvobj)))
541                 goto free_adapter;
542
543         /* step 2. allocate HalData */
544         padapter->HalData = kzalloc(sizeof(struct hal_data_8723a), GFP_KERNEL);
545         if (!padapter->HalData)
546                 goto free_wdev;
547
548         /* step read_chip_version */
549         rtl8723a_read_chip_version(padapter);
550
551         /* step usb endpoint mapping */
552         rtl8723au_chip_configure(padapter);
553
554         /* step read efuse/eeprom data and get mac_addr */
555         rtl8723a_read_adapter_info(padapter);
556
557         /* step 5. */
558         if (rtw_init_drv_sw23a(padapter) == _FAIL) {
559                 RT_TRACE(_module_hci_intfs_c_, _drv_err_,
560                          ("Initialize driver software resource Failed!\n"));
561                 goto free_hal_data;
562         }
563
564 #ifdef CONFIG_PM
565         if (padapter->pwrctrlpriv.bSupportRemoteWakeup) {
566                 dvobj->pusbdev->do_remote_wakeup = 1;
567                 pusb_intf->needs_remote_wakeup = 1;
568                 device_init_wakeup(&pusb_intf->dev, 1);
569                 DBG_8723A("\n  padapter->pwrctrlpriv.bSupportRemoteWakeup~~~~~~\n");
570                 DBG_8723A("\n  padapter->pwrctrlpriv.bSupportRemoteWakeup~~~[%d]~~~\n",
571                           device_may_wakeup(&pusb_intf->dev));
572         }
573 #endif
574         /* 2012-07-11 Move here to prevent the 8723AS-VAU BT
575          * auto suspend influence
576          */
577         if (usb_autopm_get_interface(pusb_intf) < 0)
578                 DBG_8723A("can't get autopm:\n");
579 #ifdef  CONFIG_8723AU_BT_COEXIST
580         padapter->pwrctrlpriv.autopm_cnt = 1;
581 #endif
582
583         /* If the eeprom mac address is corrupted, assign a random address */
584         if (is_broadcast_ether_addr(padapter->eeprompriv.mac_addr) ||
585             is_zero_ether_addr(padapter->eeprompriv.mac_addr))
586                 eth_random_addr(padapter->eeprompriv.mac_addr);
587
588         DBG_8723A("bDriverStopped:%d, bSurpriseRemoved:%d, bup:%d, hw_init_completed:%d\n",
589                   padapter->bDriverStopped, padapter->bSurpriseRemoved,
590                   padapter->bup, padapter->hw_init_completed
591         );
592         status = _SUCCESS;
593
594 free_hal_data:
595         if (status != _SUCCESS)
596                 kfree(padapter->HalData);
597 free_wdev:
598         if (status != _SUCCESS) {
599                 rtw_wdev_unregister(padapter->rtw_wdev);
600                 rtw_wdev_free(padapter->rtw_wdev);
601         }
602 free_adapter:
603         if (status != _SUCCESS) {
604                 if (pnetdev)
605                         free_netdev(pnetdev);
606                 padapter = NULL;
607         }
608         return padapter;
609 }
610
611 static void rtw_usb_if1_deinit(struct rtw_adapter *if1)
612 {
613         struct net_device *pnetdev = if1->pnetdev;
614         struct mlme_priv *pmlmepriv = &if1->mlmepriv;
615
616         if (check_fwstate(pmlmepriv, _FW_LINKED))
617                 rtw_disassoc_cmd23a(if1, 0, false);
618
619 #ifdef CONFIG_8723AU_AP_MODE
620         free_mlme_ap_info23a(if1);
621 #endif
622
623         if (pnetdev)
624                 unregister_netdev(pnetdev); /* will call netdev_close() */
625
626         rtw_cancel_all_timer23a(if1);
627
628         rtw_dev_unload(if1);
629
630         DBG_8723A("+r871xu_dev_remove, hw_init_completed =%d\n",
631                   if1->hw_init_completed);
632
633         if (if1->rtw_wdev) {
634                 rtw_wdev_unregister(if1->rtw_wdev);
635                 rtw_wdev_free(if1->rtw_wdev);
636         }
637
638 #ifdef CONFIG_8723AU_BT_COEXIST
639         if (1 == if1->pwrctrlpriv.autopm_cnt) {
640                 usb_autopm_put_interface(adapter_to_dvobj(if1)->pusbintf);
641                 if1->pwrctrlpriv.autopm_cnt--;
642         }
643 #endif
644
645         rtw_free_drv_sw23a(if1);
646
647         if (pnetdev)
648                 free_netdev(pnetdev);
649 }
650
651 static int rtw_drv_init(struct usb_interface *pusb_intf,
652                         const struct usb_device_id *pdid)
653 {
654         struct rtw_adapter *if1 = NULL;
655         struct dvobj_priv *dvobj;
656         int status = _FAIL;
657
658         RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("+rtw_drv_init\n"));
659
660         /* Initialize dvobj_priv */
661         dvobj = usb_dvobj_init(pusb_intf);
662         if (!dvobj) {
663                 RT_TRACE(_module_hci_intfs_c_, _drv_err_,
664                          ("initialize device object priv Failed!\n"));
665                 goto exit;
666         }
667
668         if1 = rtw_usb_if1_init(dvobj, pusb_intf, pdid);
669         if (!if1) {
670                 DBG_8723A("rtw_init_primary_adapter Failed!\n");
671                 goto free_dvobj;
672         }
673
674         /* dev_alloc_name && register_netdev */
675         status = rtw_drv_register_netdev(if1);
676         if (status != _SUCCESS)
677                 goto free_if1;
678         RT_TRACE(_module_hci_intfs_c_, _drv_err_,
679                  ("-871x_drv - drv_init, success!\n"));
680
681         status = _SUCCESS;
682
683 free_if1:
684         if (status != _SUCCESS && if1)
685                 rtw_usb_if1_deinit(if1);
686 free_dvobj:
687         if (status != _SUCCESS)
688                 usb_dvobj_deinit(pusb_intf);
689 exit:
690         return status == _SUCCESS ? 0 : -ENODEV;
691 }
692
693 /* dev_remove() - our device is being removed */
694 static void rtw_disconnect(struct usb_interface *pusb_intf)
695 {
696         struct dvobj_priv *dvobj;
697         struct rtw_adapter *padapter;
698         struct net_device *pnetdev;
699         struct mlme_priv *pmlmepriv;
700
701         dvobj = usb_get_intfdata(pusb_intf);
702         if (!dvobj)
703                 return;
704
705         padapter = dvobj->if1;
706         pnetdev = padapter->pnetdev;
707         pmlmepriv = &padapter->mlmepriv;
708
709         usb_set_intfdata(pusb_intf, NULL);
710
711         RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("+dev_remove()\n"));
712
713         rtw_pm_set_ips23a(padapter, IPS_NONE);
714         rtw_pm_set_lps23a(padapter, PS_MODE_ACTIVE);
715
716         LeaveAllPowerSaveMode23a(padapter);
717
718         rtw_usb_if1_deinit(padapter);
719
720         usb_dvobj_deinit(pusb_intf);
721
722         RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("-dev_remove()\n"));
723         DBG_8723A("-r871xu_dev_remove, done\n");
724
725         return;
726 }
727
728 static int __init rtw_drv_entry(void)
729 {
730         RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("+rtw_drv_entry\n"));
731         return usb_register(usb_drv);
732 }
733
734 static void __exit rtw_drv_halt(void)
735 {
736         RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("+rtw_drv_halt\n"));
737         DBG_8723A("+rtw_drv_halt\n");
738
739         usb_deregister(usb_drv);
740
741         DBG_8723A("-rtw_drv_halt\n");
742 }
743
744 module_init(rtw_drv_entry);
745 module_exit(rtw_drv_halt);