1 /******************************************************************************
3 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
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.
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
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 ******************************************************************************/
22 #include <osdep_service.h>
23 #include <drv_types.h>
24 #include <recv_osdep.h>
25 #include <xmit_osdep.h>
27 #include <linux/usb.h>
28 #include <linux/vmalloc.h>
29 #include <osdep_intf.h>
31 #include <usb_ops_linux.h>
32 #include <usb_osintf.h>
34 #include <rtw_ioctl.h>
36 int ui_pid
[3] = {0, 0, 0};
38 #define USB_VENDER_ID_REALTEK 0x0bda
40 /* DID_USB_v916_20130116 */
41 static struct usb_device_id rtw_usb_id_tbl
[] = {
42 /*=== Realtek demoboard ===*/
43 {USB_DEVICE(USB_VENDER_ID_REALTEK
, 0x8179)}, /* 8188EUS */
44 {USB_DEVICE(USB_VENDER_ID_REALTEK
, 0x0179)}, /* 8188ETV */
45 /*=== Customer ID ===*/
46 /****** 8188EUS ********/
47 {USB_DEVICE(0x07b8, 0x8179)}, /* Abocom - Abocom */
48 {USB_DEVICE(0x2001, 0x330F)}, /* DLink DWA-125 REV D1 */
49 {USB_DEVICE(0x2001, 0x3310)}, /* Dlink DWA-123 REV D1 */
50 {} /* Terminating entry */
53 MODULE_DEVICE_TABLE(usb
, rtw_usb_id_tbl
);
55 static struct dvobj_priv
*usb_dvobj_init(struct usb_interface
*usb_intf
)
59 struct dvobj_priv
*pdvobjpriv
;
60 struct usb_host_config
*phost_conf
;
61 struct usb_config_descriptor
*pconf_desc
;
62 struct usb_host_interface
*phost_iface
;
63 struct usb_interface_descriptor
*piface_desc
;
64 struct usb_host_endpoint
*phost_endp
;
65 struct usb_endpoint_descriptor
*pendp_desc
;
66 struct usb_device
*pusbd
;
69 pdvobjpriv
= kzalloc(sizeof(*pdvobjpriv
), GFP_KERNEL
);
70 if (pdvobjpriv
== NULL
)
73 pdvobjpriv
->pusbintf
= usb_intf
;
74 pusbd
= interface_to_usbdev(usb_intf
);
75 pdvobjpriv
->pusbdev
= pusbd
;
76 usb_set_intfdata(usb_intf
, pdvobjpriv
);
78 pdvobjpriv
->RtNumInPipes
= 0;
79 pdvobjpriv
->RtNumOutPipes
= 0;
81 phost_conf
= pusbd
->actconfig
;
82 pconf_desc
= &phost_conf
->desc
;
84 phost_iface
= &usb_intf
->altsetting
[0];
85 piface_desc
= &phost_iface
->desc
;
87 pdvobjpriv
->NumInterfaces
= pconf_desc
->bNumInterfaces
;
88 pdvobjpriv
->InterfaceNumber
= piface_desc
->bInterfaceNumber
;
89 pdvobjpriv
->nr_endpoint
= piface_desc
->bNumEndpoints
;
91 for (i
= 0; i
< pdvobjpriv
->nr_endpoint
; i
++) {
93 phost_endp
= phost_iface
->endpoint
+ i
;
96 pendp_desc
= &phost_endp
->desc
;
97 ep_num
= usb_endpoint_num(pendp_desc
);
99 if (usb_endpoint_is_bulk_in(pendp_desc
)) {
100 pdvobjpriv
->RtInPipe
[pdvobjpriv
->RtNumInPipes
] = ep_num
;
101 pdvobjpriv
->RtNumInPipes
++;
102 } else if (usb_endpoint_is_int_in(pendp_desc
)) {
103 pdvobjpriv
->RtInPipe
[pdvobjpriv
->RtNumInPipes
] = ep_num
;
104 pdvobjpriv
->RtNumInPipes
++;
105 } else if (usb_endpoint_is_bulk_out(pendp_desc
)) {
106 pdvobjpriv
->RtOutPipe
[pdvobjpriv
->RtNumOutPipes
] = ep_num
;
107 pdvobjpriv
->RtNumOutPipes
++;
109 pdvobjpriv
->ep_num
[i
] = ep_num
;
113 if (pusbd
->speed
== USB_SPEED_HIGH
)
114 pdvobjpriv
->ishighspeed
= true;
116 pdvobjpriv
->ishighspeed
= false;
118 mutex_init(&pdvobjpriv
->usb_vendor_req_mutex
);
119 pdvobjpriv
->usb_vendor_req_buf
= kzalloc(MAX_USB_IO_CTL_SIZE
, GFP_KERNEL
);
121 if (!pdvobjpriv
->usb_vendor_req_buf
)
129 if (status
!= _SUCCESS
&& pdvobjpriv
) {
130 usb_set_intfdata(usb_intf
, NULL
);
138 static void usb_dvobj_deinit(struct usb_interface
*usb_intf
)
140 struct dvobj_priv
*dvobj
= usb_get_intfdata(usb_intf
);
143 usb_set_intfdata(usb_intf
, NULL
);
145 /* Modify condition for 92DU DMDP 2010.11.18, by Thomas */
146 if ((dvobj
->NumInterfaces
!= 2 &&
147 dvobj
->NumInterfaces
!= 3) ||
148 (dvobj
->InterfaceNumber
== 1)) {
149 if (interface_to_usbdev(usb_intf
)->state
!=
150 USB_STATE_NOTATTACHED
) {
151 /* If we didn't unplug usb dongle and
152 * remove/insert module, driver fails
153 * on sitesurvey for the first time when
154 * device is up . Reset usb port for sitesurvey
156 DBG_88E("usb attached..., try to reset usb device\n");
157 usb_reset_device(interface_to_usbdev(usb_intf
));
161 kfree(dvobj
->usb_vendor_req_buf
);
162 mutex_destroy(&dvobj
->usb_vendor_req_mutex
);
166 usb_put_dev(interface_to_usbdev(usb_intf
));
170 static void usb_intf_start(struct adapter
*padapter
)
172 RT_TRACE(_module_hci_intfs_c_
, _drv_err_
, ("+usb_intf_start\n"));
174 rtw_hal_inirp_init(padapter
);
176 RT_TRACE(_module_hci_intfs_c_
, _drv_err_
, ("-usb_intf_start\n"));
179 static void usb_intf_stop(struct adapter
*padapter
)
181 RT_TRACE(_module_hci_intfs_c_
, _drv_err_
, ("+usb_intf_stop\n"));
183 /* disabel_hw_interrupt */
184 if (!padapter
->bSurpriseRemoved
) {
185 /* device still exists, so driver can do i/o operation */
187 RT_TRACE(_module_hci_intfs_c_
, _drv_err_
,
188 ("SurpriseRemoved == false\n"));
192 rtw_hal_inirp_deinit(padapter
);
195 usb_write_port_cancel(padapter
);
197 /* todo:cancel other irps */
199 RT_TRACE(_module_hci_intfs_c_
, _drv_err_
, ("-usb_intf_stop\n"));
202 static void rtw_dev_unload(struct adapter
*padapter
)
204 RT_TRACE(_module_hci_intfs_c_
, _drv_err_
, ("+rtw_dev_unload\n"));
207 DBG_88E("===> rtw_dev_unload\n");
208 padapter
->bDriverStopped
= true;
209 if (padapter
->xmitpriv
.ack_tx
)
210 rtw_ack_tx_done(&padapter
->xmitpriv
, RTW_SCTX_DONE_DRV_STOP
);
212 if (padapter
->intf_stop
)
213 padapter
->intf_stop(padapter
);
215 if (!padapter
->pwrctrlpriv
.bInternalAutoSuspend
)
216 rtw_stop_drv_threads(padapter
);
219 if (!padapter
->bSurpriseRemoved
) {
220 rtw_hal_deinit(padapter
);
221 padapter
->bSurpriseRemoved
= true;
224 padapter
->bup
= false;
226 RT_TRACE(_module_hci_intfs_c_
, _drv_err_
,
227 ("r871x_dev_unload():padapter->bup == false\n"));
230 DBG_88E("<=== rtw_dev_unload\n");
232 RT_TRACE(_module_hci_intfs_c_
, _drv_err_
, ("-rtw_dev_unload\n"));
235 static int rtw_suspend(struct usb_interface
*pusb_intf
, pm_message_t message
)
237 struct dvobj_priv
*dvobj
= usb_get_intfdata(pusb_intf
);
238 struct adapter
*padapter
= dvobj
->if1
;
239 struct net_device
*pnetdev
= padapter
->pnetdev
;
240 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
241 struct pwrctrl_priv
*pwrpriv
= &padapter
->pwrctrlpriv
;
244 u32 start_time
= jiffies
;
247 DBG_88E("==> %s (%s:%d)\n", __func__
, current
->comm
, current
->pid
);
249 if ((!padapter
->bup
) || (padapter
->bDriverStopped
) ||
250 (padapter
->bSurpriseRemoved
)) {
251 DBG_88E("padapter->bup=%d bDriverStopped=%d bSurpriseRemoved = %d\n",
252 padapter
->bup
, padapter
->bDriverStopped
,
253 padapter
->bSurpriseRemoved
);
257 pwrpriv
->bInSuspend
= true;
258 rtw_cancel_all_timer(padapter
);
259 LeaveAllPowerSaveMode(padapter
);
261 _enter_pwrlock(&pwrpriv
->lock
);
264 netif_carrier_off(pnetdev
);
265 netif_tx_stop_all_queues(pnetdev
);
269 rtw_disassoc_cmd(padapter
, 0, false);
271 if (check_fwstate(pmlmepriv
, WIFI_STATION_STATE
) &&
272 check_fwstate(pmlmepriv
, _FW_LINKED
)) {
273 DBG_88E("%s:%d %s(%pM), length:%d assoc_ssid.length:%d\n",
275 pmlmepriv
->cur_network
.network
.Ssid
.Ssid
,
276 pmlmepriv
->cur_network
.network
.MacAddress
,
277 pmlmepriv
->cur_network
.network
.Ssid
.SsidLength
,
278 pmlmepriv
->assoc_ssid
.SsidLength
);
280 pmlmepriv
->to_roaming
= 1;
282 /* s2-2. indicate disconnect to os */
283 rtw_indicate_disconnect(padapter
);
285 rtw_free_assoc_resources(padapter
, 1);
287 rtw_free_network_queue(padapter
, true);
289 rtw_dev_unload(padapter
);
290 _exit_pwrlock(&pwrpriv
->lock
);
292 if (check_fwstate(pmlmepriv
, _FW_UNDER_SURVEY
))
293 rtw_indicate_scan_done(padapter
, 1);
295 if (check_fwstate(pmlmepriv
, _FW_UNDER_LINKING
))
296 rtw_indicate_disconnect(padapter
);
299 DBG_88E("<=== %s return %d.............. in %dms\n", __func__
300 , ret
, rtw_get_passing_time_ms(start_time
));
305 static int rtw_resume(struct usb_interface
*pusb_intf
)
307 struct dvobj_priv
*dvobj
= usb_get_intfdata(pusb_intf
);
308 struct adapter
*padapter
= dvobj
->if1
;
310 return rtw_resume_process(padapter
);
313 int rtw_resume_process(struct adapter
*padapter
)
315 struct net_device
*pnetdev
;
316 struct pwrctrl_priv
*pwrpriv
= NULL
;
318 u32 start_time
= jiffies
;
320 DBG_88E("==> %s (%s:%d)\n", __func__
, current
->comm
, current
->pid
);
323 pnetdev
= padapter
->pnetdev
;
324 pwrpriv
= &padapter
->pwrctrlpriv
;
329 _enter_pwrlock(&pwrpriv
->lock
);
330 rtw_reset_drv_sw(padapter
);
331 pwrpriv
->bkeepfwalive
= false;
333 DBG_88E("bkeepfwalive(%x)\n", pwrpriv
->bkeepfwalive
);
334 if (pm_netdev_open(pnetdev
, true) != 0)
337 netif_device_attach(pnetdev
);
338 netif_carrier_on(pnetdev
);
340 _exit_pwrlock(&pwrpriv
->lock
);
342 if (padapter
->pid
[1] != 0) {
343 DBG_88E("pid[1]:%d\n", padapter
->pid
[1]);
344 rtw_signal_process(padapter
->pid
[1], SIGUSR2
);
347 rtw_roaming(padapter
, NULL
);
352 pwrpriv
->bInSuspend
= false;
353 DBG_88E("<=== %s return %d.............. in %dms\n", __func__
,
354 ret
, rtw_get_passing_time_ms(start_time
));
361 * drv_init() - a device potentially for us
363 * notes: drv_init() is called when the bus driver has located
364 * a card for us to support.
365 * We accept the new device by returning 0.
368 static struct adapter
*rtw_usb_if1_init(struct dvobj_priv
*dvobj
,
369 struct usb_interface
*pusb_intf
, const struct usb_device_id
*pdid
)
371 struct adapter
*padapter
= NULL
;
372 struct net_device
*pnetdev
= NULL
;
375 padapter
= (struct adapter
*)vzalloc(sizeof(*padapter
));
376 if (padapter
== NULL
)
378 padapter
->dvobj
= dvobj
;
379 dvobj
->if1
= padapter
;
381 padapter
->bDriverStopped
= true;
382 mutex_init(&padapter
->hw_init_mutex
);
383 padapter
->chip_type
= RTL8188E
;
385 pnetdev
= rtw_init_netdev(padapter
);
388 SET_NETDEV_DEV(pnetdev
, dvobj_to_dev(dvobj
));
389 padapter
= rtw_netdev_priv(pnetdev
);
391 /* step 2. hook HalFunc, allocate HalData */
392 hal_set_hal_ops(padapter
);
394 padapter
->intf_start
= &usb_intf_start
;
395 padapter
->intf_stop
= &usb_intf_stop
;
397 /* step read_chip_version */
398 rtw_hal_read_chip_version(padapter
);
400 /* step usb endpoint mapping */
401 rtw_hal_chip_configure(padapter
);
403 /* step read efuse/eeprom data and get mac_addr */
404 rtw_hal_read_chip_info(padapter
);
407 if (rtw_init_drv_sw(padapter
) == _FAIL
) {
408 RT_TRACE(_module_hci_intfs_c_
, _drv_err_
,
409 ("Initialize driver software resource Failed!\n"));
414 if (padapter
->pwrctrlpriv
.bSupportRemoteWakeup
) {
415 dvobj
->pusbdev
->do_remote_wakeup
= 1;
416 pusb_intf
->needs_remote_wakeup
= 1;
417 device_init_wakeup(&pusb_intf
->dev
, 1);
418 DBG_88E("\n padapter->pwrctrlpriv.bSupportRemoteWakeup~~~~~~\n");
419 DBG_88E("\n padapter->pwrctrlpriv.bSupportRemoteWakeup~~~[%d]~~~\n",
420 device_may_wakeup(&pusb_intf
->dev
));
424 /* 2012-07-11 Move here to prevent the 8723AS-VAU BT auto
425 * suspend influence */
426 if (usb_autopm_get_interface(pusb_intf
) < 0)
427 DBG_88E("can't get autopm:\n");
429 /* alloc dev name after read efuse. */
430 rtw_init_netdev_name(pnetdev
, padapter
->registrypriv
.ifname
);
431 rtw_macaddr_cfg(padapter
->eeprompriv
.mac_addr
);
432 #ifdef CONFIG_88EU_P2P
433 rtw_init_wifidirect_addrs(padapter
, padapter
->eeprompriv
.mac_addr
,
434 padapter
->eeprompriv
.mac_addr
);
436 memcpy(pnetdev
->dev_addr
, padapter
->eeprompriv
.mac_addr
, ETH_ALEN
);
437 DBG_88E("MAC Address from pnetdev->dev_addr = %pM\n",
440 /* step 6. Tell the network stack we exist */
441 if (register_netdev(pnetdev
) != 0) {
442 RT_TRACE(_module_hci_intfs_c_
, _drv_err_
, ("register_netdev() failed\n"));
446 DBG_88E("bDriverStopped:%d, bSurpriseRemoved:%d, bup:%d, hw_init_completed:%d\n"
447 , padapter
->bDriverStopped
448 , padapter
->bSurpriseRemoved
450 , padapter
->hw_init_completed
456 if (status
!= _SUCCESS
)
457 kfree(padapter
->HalData
);
459 if (status
!= _SUCCESS
) {
461 rtw_free_netdev(pnetdev
);
470 static void rtw_usb_if1_deinit(struct adapter
*if1
)
472 struct net_device
*pnetdev
= if1
->pnetdev
;
473 struct mlme_priv
*pmlmepriv
= &if1
->mlmepriv
;
475 if (check_fwstate(pmlmepriv
, _FW_LINKED
))
476 rtw_disassoc_cmd(if1
, 0, false);
478 #ifdef CONFIG_88EU_AP_MODE
479 free_mlme_ap_info(if1
);
483 /* will call netdev_close() */
484 unregister_netdev(pnetdev
);
485 rtw_proc_remove_one(pnetdev
);
487 rtw_cancel_all_timer(if1
);
490 DBG_88E("+r871xu_dev_remove, hw_init_completed=%d\n",
491 if1
->hw_init_completed
);
492 rtw_free_drv_sw(if1
);
494 rtw_free_netdev(pnetdev
);
497 static int rtw_drv_init(struct usb_interface
*pusb_intf
, const struct usb_device_id
*pdid
)
499 struct adapter
*if1
= NULL
;
501 struct dvobj_priv
*dvobj
;
503 RT_TRACE(_module_hci_intfs_c_
, _drv_err_
, ("+rtw_drv_init\n"));
505 /* Initialize dvobj_priv */
506 dvobj
= usb_dvobj_init(pusb_intf
);
508 RT_TRACE(_module_hci_intfs_c_
, _drv_err_
,
509 ("initialize device object priv Failed!\n"));
513 if1
= rtw_usb_if1_init(dvobj
, pusb_intf
, pdid
);
515 DBG_88E("rtw_init_primarystruct adapter Failed!\n");
519 if (ui_pid
[1] != 0) {
520 DBG_88E("ui_pid[1]:%d\n", ui_pid
[1]);
521 rtw_signal_process(ui_pid
[1], SIGUSR2
);
524 RT_TRACE(_module_hci_intfs_c_
, _drv_err_
, ("-871x_drv - drv_init, success!\n"));
529 if (status
!= _SUCCESS
)
530 usb_dvobj_deinit(pusb_intf
);
532 return status
== _SUCCESS
? 0 : -ENODEV
;
536 * dev_remove() - our device is being removed
538 /* rmmod module & unplug(SurpriseRemoved) will call r871xu_dev_remove() => how to recognize both */
539 static void rtw_dev_remove(struct usb_interface
*pusb_intf
)
541 struct dvobj_priv
*dvobj
= usb_get_intfdata(pusb_intf
);
542 struct adapter
*padapter
= dvobj
->if1
;
545 DBG_88E("+rtw_dev_remove\n");
546 RT_TRACE(_module_hci_intfs_c_
, _drv_err_
, ("+dev_remove()\n"));
548 if (!pusb_intf
->unregistering
)
549 padapter
->bSurpriseRemoved
= true;
551 rtw_pm_set_ips(padapter
, IPS_NONE
);
552 rtw_pm_set_lps(padapter
, PS_MODE_ACTIVE
);
554 LeaveAllPowerSaveMode(padapter
);
556 rtw_usb_if1_deinit(padapter
);
558 usb_dvobj_deinit(pusb_intf
);
560 RT_TRACE(_module_hci_intfs_c_
, _drv_err_
, ("-dev_remove()\n"));
561 DBG_88E("-r871xu_dev_remove, done\n");
566 static struct usb_driver rtl8188e_usb_drv
= {
568 .probe
= rtw_drv_init
,
569 .disconnect
= rtw_dev_remove
,
570 .id_table
= rtw_usb_id_tbl
,
571 .suspend
= rtw_suspend
,
572 .resume
= rtw_resume
,
573 .reset_resume
= rtw_resume
,
576 module_usb_driver(rtl8188e_usb_drv
)