summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsakumisu <[email protected]>2023-11-13 19:54:05 +0800
committersakumisu <[email protected]>2023-11-13 20:03:35 +0800
commit9ce7b0ceb7a73d932a0d3280b26946ecd7a7780a (patch)
treeb159cab52c6026e1e15eada2217cd18b37bcc412
parent1c31156a37f0466fa3791a78ce70f081ee141dd5 (diff)
fix rndis query & set msg wLength, only support one rndis device
-rw-r--r--cherryusb_config_template.h1
-rw-r--r--class/wireless/usbh_rndis.c46
2 files changed, 9 insertions, 38 deletions
diff --git a/cherryusb_config_template.h b/cherryusb_config_template.h
index 1d1f0556..074cedb8 100644
--- a/cherryusb_config_template.h
+++ b/cherryusb_config_template.h
@@ -102,7 +102,6 @@
#define CONFIG_USBHOST_MAX_MSC_CLASS 2
#define CONFIG_USBHOST_MAX_AUDIO_CLASS 1
#define CONFIG_USBHOST_MAX_VIDEO_CLASS 1
-#define CONFIG_USBHOST_MAX_RNDIS_CLASS 1
#define CONFIG_USBHOST_DEV_NAMELEN 16
diff --git a/class/wireless/usbh_rndis.c b/class/wireless/usbh_rndis.c
index 36c56839..762fc6e9 100644
--- a/class/wireless/usbh_rndis.c
+++ b/class/wireless/usbh_rndis.c
@@ -7,37 +7,11 @@
#include "usbh_rndis.h"
#include "rndis_protocol.h"
-#define DEV_FORMAT "/dev/rndis%d"
+#define DEV_FORMAT "/dev/rndis"
USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_rndis_buf[4096];
-static struct usbh_rndis g_rndis_class[CONFIG_USBHOST_MAX_RNDIS_CLASS];
-static uint32_t g_devinuse = 0;
-
-static struct usbh_rndis *usbh_rndis_class_alloc(void)
-{
- int devno;
-
- for (devno = 0; devno < CONFIG_USBHOST_MAX_RNDIS_CLASS; devno++) {
- if ((g_devinuse & (1 << devno)) == 0) {
- g_devinuse |= (1 << devno);
- memset(&g_rndis_class[devno], 0, sizeof(struct usbh_rndis));
- g_rndis_class[devno].minor = devno;
- return &g_rndis_class[devno];
- }
- }
- return NULL;
-}
-
-static void usbh_rndis_class_free(struct usbh_rndis *rndis_class)
-{
- int devno = rndis_class->minor;
-
- if (devno >= 0 && devno < 32) {
- g_devinuse &= ~(1 << devno);
- }
- memset(rndis_class, 0, sizeof(struct usbh_rndis));
-}
+static struct usbh_rndis g_rndis_class;
static int usbh_rndis_init_msg_transfer(struct usbh_rndis *rndis_class)
{
@@ -107,7 +81,7 @@ int usbh_rndis_query_msg_transfer(struct usbh_rndis *rndis_class, uint32_t oid,
setup->bRequest = CDC_REQUEST_SEND_ENCAPSULATED_COMMAND;
setup->wValue = 0;
setup->wIndex = 0;
- setup->wLength = sizeof(rndis_query_msg_t);
+ setup->wLength = query_len + sizeof(rndis_query_msg_t);
ret = usbh_control_transfer(rndis_class->hport->ep0, setup, (uint8_t *)cmd);
if (ret < 0) {
@@ -159,7 +133,7 @@ static int usbh_rndis_set_msg_transfer(struct usbh_rndis *rndis_class, uint32_t
setup->bRequest = CDC_REQUEST_SEND_ENCAPSULATED_COMMAND;
setup->wValue = 0;
setup->wIndex = 0;
- setup->wLength = sizeof(rndis_set_msg_t);
+ setup->wLength = info_len + sizeof(rndis_set_msg_t);
ret = usbh_control_transfer(rndis_class->hport->ep0, setup, (uint8_t *)cmd);
if (ret < 0) {
@@ -269,11 +243,9 @@ static int usbh_rndis_connect(struct usbh_hubport *hport, uint8_t intf)
uint8_t tmp_buffer[512];
uint8_t data[32];
- struct usbh_rndis *rndis_class = usbh_rndis_class_alloc();
- if (rndis_class == NULL) {
- USB_LOG_ERR("Fail to alloc rndis_class\r\n");
- return -ENOMEM;
- }
+ struct usbh_rndis *rndis_class = &g_rndis_class;
+
+ memset(rndis_class, 0, sizeof(struct usbh_rndis));
rndis_class->hport = hport;
rndis_class->ctrl_intf = intf;
@@ -388,7 +360,7 @@ static int usbh_rndis_connect(struct usbh_hubport *hport, uint8_t intf)
}
USB_LOG_INFO("rndis set OID_802_3_MULTICAST_LIST success\r\n");
- snprintf(hport->config.intf[intf].devname, CONFIG_USBHOST_DEV_NAMELEN, DEV_FORMAT, rndis_class->minor);
+ memcpy(hport->config.intf[intf].devname, DEV_FORMAT, CONFIG_USBHOST_DEV_NAMELEN);
USB_LOG_INFO("Register RNDIS Class:%s\r\n", hport->config.intf[intf].devname);
usbh_rndis_run(rndis_class);
@@ -418,7 +390,7 @@ static int usbh_rndis_disconnect(struct usbh_hubport *hport, uint8_t intf)
usbh_rndis_stop(rndis_class);
}
- usbh_rndis_class_free(rndis_class);
+ memset(rndis_class, 0, sizeof(struct usbh_rndis));
}
return ret;