forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-14 bedbef8ad3e75a304af6361af235302bcc61d06b
kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dbus_usb_linux.c
old mode 100644new mode 100755
....@@ -1,3 +1,4 @@
1
+/* SPDX-License-Identifier: GPL-2.0 */
12 /*
23 * Dongle BUS interface
34 * USB Linux Implementation
....@@ -476,7 +477,7 @@
476477
477478 /** functions called by the Linux kernel USB subsystem */
478479 static struct usb_driver dbus_usbdev = {
479
- name: "dbus_usbdev"BUS_TYPE,
480
+ name: "dbus_usbdev",
480481 probe: dbus_usbos_probe,
481482 disconnect: dbus_usbos_disconnect,
482483 id_table: devid_table,
....@@ -510,9 +511,6 @@
510511 enum usbos_suspend_state suspend_state;
511512 struct usb_interface *intf;
512513 } probe_info_t;
513
-
514
-/* driver info, initialized when bcmsdh_register is called */
515
-static dbus_driver_t drvinfo = {NULL, NULL, NULL, NULL};
516514
517515 /*
518516 * USB Linux dbus_intf_t
....@@ -591,6 +589,9 @@
591589 };
592590
593591 static probe_info_t g_probe_info;
592
+static probe_cb_t probe_cb = NULL;
593
+static disconnect_cb_t disconnect_cb = NULL;
594
+static void *probe_arg = NULL;
594595 static void *disc_arg = NULL;
595596
596597
....@@ -1232,46 +1233,26 @@
12321233 dbus_usbos_suspend(struct usb_interface *intf,
12331234 pm_message_t message)
12341235 {
1235
- usbos_info_t *usbos_info = (usbos_info_t *) g_probe_info.usbos_info;
1236
- int err = 0;
1237
-
1238
- printf("%s Enter\n", __FUNCTION__);
1239
-
1236
+ DBUSERR(("%s suspend state: %d\n", __FUNCTION__, g_probe_info.suspend_state));
12401237 /* DHD for full dongle model */
12411238 g_probe_info.suspend_state = USBOS_SUSPEND_STATE_SUSPEND_PENDING;
1242
- if (drvinfo.suspend && disc_arg)
1243
- err = drvinfo.suspend(disc_arg);
1244
- if (err) {
1245
- printf("%s: err=%d\n", __FUNCTION__, err);
1246
-// g_probe_info.suspend_state = USBOS_SUSPEND_STATE_DEVICE_ACTIVE;
1247
-// return err;
1248
- }
1249
- usbos_info->pub->busstate = DBUS_STATE_SLEEP;
1250
-
1239
+ dbus_usbos_state_change((usbos_info_t*)g_probe_info.usbos_info, DBUS_STATE_SLEEP);
12511240 dbus_usbos_cancel_all_urbs((usbos_info_t*)g_probe_info.usbos_info);
12521241 g_probe_info.suspend_state = USBOS_SUSPEND_STATE_SUSPENDED;
12531242
1254
- printf("%s Exit err=%d\n", __FUNCTION__, err);
1255
- return err;
1243
+ return 0;
12561244 }
12571245
12581246 /**
12591247 * The resume method is called to tell the driver that the device has been resumed and the driver
12601248 * can return to normal operation. URBs may once more be submitted.
12611249 */
1262
-static int
1263
-dbus_usbos_resume(struct usb_interface *intf)
1250
+static int dbus_usbos_resume(struct usb_interface *intf)
12641251 {
1265
- usbos_info_t *usbos_info = (usbos_info_t *) g_probe_info.usbos_info;
1252
+ DBUSERR(("%s Device resumed\n", __FUNCTION__));
12661253
1267
- printf("%s Enter\n", __FUNCTION__);
1268
-
1254
+ dbus_usbos_state_change((usbos_info_t*)g_probe_info.usbos_info, DBUS_STATE_UP);
12691255 g_probe_info.suspend_state = USBOS_SUSPEND_STATE_DEVICE_ACTIVE;
1270
- if (drvinfo.resume && disc_arg)
1271
- drvinfo.resume(disc_arg);
1272
- usbos_info->pub->busstate = DBUS_STATE_UP;
1273
-
1274
- printf("%s Exit\n", __FUNCTION__);
12751256 return 0;
12761257 }
12771258
....@@ -1279,16 +1260,13 @@
12791260 * This function is directly called by the Linux kernel, when the suspended device has been reset
12801261 * instead of being resumed
12811262 */
1282
-static int
1283
-dbus_usbos_reset_resume(struct usb_interface *intf)
1263
+static int dbus_usbos_reset_resume(struct usb_interface *intf)
12841264 {
1285
- printf("%s Enter\n", __FUNCTION__);
1265
+ DBUSERR(("%s Device reset resumed\n", __FUNCTION__));
12861266
1267
+ /* The device may have lost power, so a firmware download may be required */
1268
+ dbus_usbos_state_change((usbos_info_t*)g_probe_info.usbos_info, DBUS_STATE_DL_NEEDED);
12871269 g_probe_info.suspend_state = USBOS_SUSPEND_STATE_DEVICE_ACTIVE;
1288
- if (drvinfo.resume && disc_arg)
1289
- drvinfo.resume(disc_arg);
1290
-
1291
- printf("%s Exit\n", __FUNCTION__);
12921270 return 0;
12931271 }
12941272
....@@ -1332,7 +1310,6 @@
13321310 usb->portnum, WIFI_STATUS_POWER_ON);
13331311 if (adapter == NULL) {
13341312 DBUSERR(("%s: can't find adapter info for this chip\n", __FUNCTION__));
1335
- ret = -ENOMEM;
13361313 goto fail;
13371314 }
13381315
....@@ -1578,8 +1555,8 @@
15781555 g_probe_info.device_speed = FULL_SPEED;
15791556 DBUSERR(("full speed device detected\n"));
15801557 }
1581
- if (g_probe_info.dereged == FALSE && drvinfo.probe) {
1582
- disc_arg = drvinfo.probe(usb->bus->busnum, usb->portnum, 0);
1558
+ if (g_probe_info.dereged == FALSE && probe_cb) {
1559
+ disc_arg = probe_cb(probe_arg, "", USB_BUS, usb->bus->busnum, usb->portnum, 0);
15831560 }
15841561
15851562 g_probe_info.disc_cb_done = FALSE;
....@@ -1640,8 +1617,8 @@
16401617 if (probe_usb_init_data) {
16411618 usbos_info = (usbos_info_t *) probe_usb_init_data->usbos_info;
16421619 if (usbos_info) {
1643
- if ((probe_usb_init_data->dereged == FALSE) && drvinfo.remove && disc_arg) {
1644
- drvinfo.remove(disc_arg);
1620
+ if ((probe_usb_init_data->dereged == FALSE) && disconnect_cb && disc_arg) {
1621
+ disconnect_cb(disc_arg);
16451622 disc_arg = NULL;
16461623 probe_usb_init_data->disc_cb_done = TRUE;
16471624 }
....@@ -2578,11 +2555,18 @@
25782555 }
25792556
25802557 int
2581
-dbus_bus_osl_register(dbus_driver_t *driver, dbus_intf_t **intf)
2558
+dbus_bus_osl_register(int vid, int pid, probe_cb_t prcb,
2559
+ disconnect_cb_t discb, void *prarg, dbus_intf_t **intf, void *param1, void *param2)
25822560 {
25832561 bzero(&g_probe_info, sizeof(probe_info_t));
25842562
2585
- drvinfo = *driver;
2563
+ probe_cb = prcb;
2564
+ disconnect_cb = discb;
2565
+ probe_arg = prarg;
2566
+
2567
+ devid_table[0].idVendor = vid;
2568
+ devid_table[0].idProduct = pid;
2569
+
25862570 *intf = &dbus_usbos_intf;
25872571
25882572 USB_REGISTER();
....@@ -2596,8 +2580,8 @@
25962580 g_probe_info.dereged = TRUE;
25972581
25982582 DHD_MUTEX_LOCK();
2599
- if (drvinfo.remove && disc_arg && (g_probe_info.disc_cb_done == FALSE)) {
2600
- drvinfo.remove(disc_arg);
2583
+ if (disconnect_cb && disc_arg && (g_probe_info.disc_cb_done == FALSE)) {
2584
+ disconnect_cb(disc_arg);
26012585 disc_arg = NULL;
26022586 }
26032587 DHD_MUTEX_UNLOCK();
....@@ -2649,13 +2633,8 @@
26492633 }
26502634
26512635 if (usbos_info->tx_pipe)
2652
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 0))
2653
- usbos_info->maxps = usb_maxpacket(usbos_info->usb,
2654
- usbos_info->tx_pipe);
2655
-#else
26562636 usbos_info->maxps = usb_maxpacket(usbos_info->usb,
26572637 usbos_info->tx_pipe, usb_pipeout(usbos_info->tx_pipe));
2658
-#endif /* #if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 19, 0)) */
26592638
26602639 INIT_LIST_HEAD(&usbos_info->req_rxfreeq);
26612640 INIT_LIST_HEAD(&usbos_info->req_txfreeq);
....@@ -3204,10 +3183,8 @@
32043183 return *firmware != NULL ? 0 : -ENOENT;
32053184 }
32063185
3207
-#ifndef DHD_LINUX_STD_FW_API
32083186 static void *
3209
-dbus_get_fwfile(int devid, int chiprev, uint8 **fw, int *fwlen,
3210
- uint16 boardtype, uint16 boardrev, char *path)
3187
+dbus_get_fwfile(int devid, int chiprev, uint8 **fw, int *fwlen, uint16 boardtype, uint16 boardrev)
32113188 {
32123189 const struct firmware *firmware = NULL;
32133190 #ifndef OEM_ANDROID
....@@ -3270,12 +3247,11 @@
32703247 snprintf(file_name, sizeof(file_name), "%s", CONFIG_ANDROID_BCMDHD_FW_PATH);
32713248 #endif /* OEM_ANDROID */
32723249
3273
- ret = dbus_request_firmware(path, &firmware);
3250
+ ret = dbus_request_firmware(file_name, &firmware);
32743251 if (ret) {
3275
- DBUSERR(("fail to request firmware %s\n", path));
3252
+ DBUSERR(("fail to request firmware %s\n", file_name));
32763253 return NULL;
3277
- } else
3278
- DBUSERR(("%s: %s (%zu bytes) open success\n", __FUNCTION__, path, firmware->size));
3254
+ }
32793255
32803256 *fwlen = firmware->size;
32813257 *fw = (uint8 *)firmware->data;
....@@ -3284,8 +3260,7 @@
32843260 }
32853261
32863262 static void *
3287
-dbus_get_nvfile(int devid, int chiprev, uint8 **fw, int *fwlen,
3288
- uint16 boardtype, uint16 boardrev, char *path)
3263
+dbus_get_nvfile(int devid, int chiprev, uint8 **fw, int *fwlen, uint16 boardtype, uint16 boardrev)
32893264 {
32903265 const struct firmware *firmware = NULL;
32913266 #ifndef OEM_ANDROID
....@@ -3353,9 +3328,9 @@
33533328 snprintf(file_name, sizeof(file_name), "%s", CONFIG_ANDROID_BCMDHD_NVRAM_PATH);
33543329 #endif /* OEM_ANDROID */
33553330
3356
- ret = dbus_request_firmware(path, &firmware);
3331
+ ret = dbus_request_firmware(file_name, &firmware);
33573332 if (ret) {
3358
- DBUSERR(("fail to request nvram %s\n", path));
3333
+ DBUSERR(("fail to request nvram %s\n", file_name));
33593334
33603335 #ifndef OEM_ANDROID
33613336 /* Load generic nvram file */
....@@ -3366,11 +3341,10 @@
33663341 #endif /* OEM_ANDROID */
33673342
33683343 if (ret) {
3369
- DBUSERR(("fail to request nvram %s\n", path));
3344
+ DBUSERR(("fail to request nvram %s\n", file_name));
33703345 return NULL;
33713346 }
3372
- } else
3373
- DBUSERR(("%s: %s (%zu bytes) open success\n", __FUNCTION__, path, firmware->size));
3347
+ }
33743348
33753349 *fwlen = firmware->size;
33763350 *fw = (uint8 *)firmware->data;
....@@ -3379,39 +3353,17 @@
33793353
33803354 void *
33813355 dbus_get_fw_nvfile(int devid, int chiprev, uint8 **fw, int *fwlen, int type, uint16 boardtype,
3382
- uint16 boardrev, char *path)
3356
+ uint16 boardrev)
33833357 {
33843358 switch (type) {
33853359 case DBUS_FIRMWARE:
3386
- return dbus_get_fwfile(devid, chiprev, fw, fwlen, boardtype, boardrev, path);
3360
+ return dbus_get_fwfile(devid, chiprev, fw, fwlen, boardtype, boardrev);
33873361 case DBUS_NVFILE:
3388
- return dbus_get_nvfile(devid, chiprev, fw, fwlen, boardtype, boardrev, path);
3362
+ return dbus_get_nvfile(devid, chiprev, fw, fwlen, boardtype, boardrev);
33893363 default:
33903364 return NULL;
33913365 }
33923366 }
3393
-#else
3394
-void *
3395
-dbus_get_fw_nvfile(int devid, int chiprev, uint8 **fw, int *fwlen, int type, uint16 boardtype,
3396
- uint16 boardrev, char *path)
3397
-{
3398
- const struct firmware *firmware = NULL;
3399
- int err = DBUS_OK;
3400
-
3401
- err = dbus_request_firmware(path, &firmware);
3402
- if (err) {
3403
- DBUSERR(("fail to request firmware %s\n", path));
3404
- return NULL;
3405
- } else {
3406
- DBUSERR(("%s: %s (%zu bytes) open success\n",
3407
- __FUNCTION__, path, firmware->size));
3408
- }
3409
-
3410
- *fwlen = firmware->size;
3411
- *fw = (uint8 *)firmware->data;
3412
- return (void *)firmware;
3413
-}
3414
-#endif
34153367
34163368 void
34173369 dbus_release_fw_nvfile(void *firmware)
....@@ -3452,10 +3404,3 @@
34523404 return intf_wlan;
34533405 }
34543406 #endif /* BCMUSBDEV_COMPOSITE */
3455
-
3456
-#ifdef LINUX
3457
-struct device * dbus_get_dev(void)
3458
-{
3459
- return &g_probe_info.usb->dev;
3460
-}
3461
-#endif /* LINUX */