rndis uses naive_mmap to allocate memory during connect.

This commit is contained in:
songyanguang 2024-07-16 18:25:50 +08:00
parent f1f533cdc1
commit 6504f11f00
1 changed files with 39 additions and 73 deletions

View File

@ -27,7 +27,11 @@ Modification: rndis uses naive_mmap to assign virtual and physical addresses and
#define DEV_FORMAT "/dev/rndis"
USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_rndis_buf[4096];
//USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_rndis_buf[4096];
uint8_t *g_rndis_buf;
uint8_t *g_rndis_buf_phy;
uint8_t *g_rndis_keepalive_buf;
uint8_t *g_rndis_keepalive_buf_phy;
static struct usbh_rndis g_rndis_class;
@ -39,17 +43,9 @@ static int usbh_rndis_init_msg_transfer(struct usbh_rndis *rndis_class)
rndis_initialize_cmplt_t *resp;
rndis_initialize_msg_t *cmd_phy;
rndis_initialize_cmplt_t *resp_phy;
uintptr_t vaddr;
uintptr_t paddr;
//cmd = (rndis_initialize_msg_t *)g_rndis_buf;
ret = naive_mmap(&vaddr, &paddr, sizeof(rndis_initialize_msg_t), false);
if(ret != 0){
USB_LOG_ERR("rndis_initialize_msg_t allocate error, ret: %d\r\n", ret);
return -ENOMEM;
}
cmd = (rndis_initialize_msg_t *)vaddr;
cmd_phy = (rndis_initialize_msg_t *)paddr;
cmd = (rndis_initialize_msg_t *)g_rndis_buf;
cmd_phy = (rndis_initialize_msg_t *)g_rndis_buf_phy;
cmd->MessageType = REMOTE_NDIS_INITIALIZE_MSG;
cmd->MessageLength = sizeof(rndis_initialize_msg_t);
@ -72,14 +68,8 @@ static int usbh_rndis_init_msg_transfer(struct usbh_rndis *rndis_class)
//ret = usbh_ep_intr_transfer()
//resp = (rndis_initialize_cmplt_t *)g_rndis_buf;
ret = naive_mmap(&vaddr, &paddr, 4096, false); // Parameter len is consistent with setup->wLength.
if(ret != 0){
USB_LOG_ERR("rndis_initialize_cmplt_t allocate error, ret: %d\r\n", ret);
return -ENOMEM;
}
resp = (rndis_initialize_cmplt_t *)vaddr;
resp_phy = (rndis_initialize_cmplt_t *)paddr;
resp = (rndis_initialize_cmplt_t *)g_rndis_buf;
resp_phy = (rndis_initialize_cmplt_t *)g_rndis_buf_phy;
setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE;
setup->bRequest = CDC_REQUEST_GET_ENCAPSULATED_RESPONSE;
@ -104,17 +94,9 @@ int usbh_rndis_query_msg_transfer(struct usbh_rndis *rndis_class, uint32_t oid,
rndis_query_cmplt_t *resp;
rndis_query_msg_t *cmd_phy;
rndis_query_cmplt_t *resp_phy;
uintptr_t vaddr;
uintptr_t paddr;
//cmd = (rndis_query_msg_t *)g_rndis_buf;
ret = naive_mmap(&vaddr, &paddr, query_len + sizeof(rndis_query_msg_t), false);
if(ret != 0){
USB_LOG_ERR("rndis_query_msg_t allocate error, ret: %d\r\n", ret);
return -ENOMEM;
}
cmd = (rndis_query_msg_t *)vaddr;
cmd_phy = (rndis_query_msg_t *)paddr;
cmd = (rndis_query_msg_t *)g_rndis_buf;
cmd_phy = (rndis_query_msg_t *)g_rndis_buf_phy;
cmd->MessageType = REMOTE_NDIS_QUERY_MSG;
cmd->MessageLength = query_len + sizeof(rndis_query_msg_t);
@ -138,14 +120,8 @@ int usbh_rndis_query_msg_transfer(struct usbh_rndis *rndis_class, uint32_t oid,
//ret = usbh_ep_intr_transfer()
//resp = (rndis_query_cmplt_t *)g_rndis_buf;
ret = naive_mmap(&vaddr, &paddr, 4096, false);
if(ret != 0){
USB_LOG_ERR("rndis_query_cmplt_t allocate error, ret: %d\r\n", ret);
return -ENOMEM;
}
resp = (rndis_query_cmplt_t *)vaddr;
resp_phy = (rndis_query_cmplt_t *)paddr;
resp = (rndis_query_cmplt_t *)g_rndis_buf;
resp_phy = (rndis_query_cmplt_t *)g_rndis_buf_phy;
setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE;
setup->bRequest = CDC_REQUEST_GET_ENCAPSULATED_RESPONSE;
@ -173,17 +149,9 @@ static int usbh_rndis_set_msg_transfer(struct usbh_rndis *rndis_class, uint32_t
rndis_set_cmplt_t *resp;
rndis_set_msg_t *cmd_phy;
rndis_set_cmplt_t *resp_phy;
uintptr_t vaddr;
uintptr_t paddr;
//cmd = (rndis_set_msg_t *)g_rndis_buf;
ret = naive_mmap(&vaddr, &paddr, info_len + sizeof(rndis_set_msg_t), false);
if(ret != 0){
USB_LOG_ERR("rndis_set_msg_t allocate error, ret: %d\r\n", ret);
return -ENOMEM;
}
cmd = (rndis_set_msg_t *)vaddr;
cmd_phy = (rndis_set_msg_t *)paddr;
cmd = (rndis_set_msg_t *)g_rndis_buf;
cmd_phy = (rndis_set_msg_t *)g_rndis_buf_phy;
cmd->MessageType = REMOTE_NDIS_SET_MSG;
cmd->MessageLength = info_len + sizeof(rndis_set_msg_t);
@ -208,14 +176,8 @@ static int usbh_rndis_set_msg_transfer(struct usbh_rndis *rndis_class, uint32_t
//ret = usbh_ep_intr_transfer(rndis_class->hport->intin,buf,len,500);
//resp = (rndis_set_cmplt_t *)g_rndis_buf;
ret = naive_mmap(&vaddr, &paddr, 4096, false);
if(ret != 0){
USB_LOG_ERR("rndis_set_cmplt_t allocate error, ret: %d\r\n", ret);
return -ENOMEM;
}
resp = (rndis_set_cmplt_t *)vaddr;
resp_phy = (rndis_set_cmplt_t *)paddr;
resp = (rndis_set_cmplt_t *)g_rndis_buf;
resp_phy = (rndis_set_cmplt_t *)g_rndis_buf_phy;
setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE;
setup->bRequest = CDC_REQUEST_GET_ENCAPSULATED_RESPONSE;
@ -268,17 +230,9 @@ int usbh_rndis_keepalive(struct usbh_rndis *rndis_class)
rndis_keepalive_cmplt_t *resp;
rndis_keepalive_msg_t *cmd_phy;
rndis_keepalive_cmplt_t *resp_phy;
uintptr_t vaddr;
uintptr_t paddr;
//cmd = (rndis_keepalive_msg_t *)g_rndis_buf;
ret = naive_mmap(&vaddr, &paddr, sizeof(rndis_keepalive_msg_t), false);
if(ret != 0){
USB_LOG_ERR("rndis_keepalive_msg_t allocate error, ret: %d\r\n", ret);
return -ENOMEM;
}
cmd = (rndis_keepalive_msg_t *)vaddr;
cmd_phy = (rndis_keepalive_msg_t *)paddr;
cmd = (rndis_keepalive_msg_t *)g_rndis_keepalive_buf;
cmd_phy = (rndis_keepalive_msg_t *)g_rndis_keepalive_buf_phy;
cmd->MessageType = REMOTE_NDIS_KEEPALIVE_MSG;
cmd->MessageLength = sizeof(rndis_keepalive_msg_t);
@ -298,14 +252,8 @@ int usbh_rndis_keepalive(struct usbh_rndis *rndis_class)
//ret = usbh_ep_intr_transfer(rndis_class->hport->intin,buf,len,500);
//resp = (rndis_keepalive_cmplt_t *)g_rndis_buf;
ret = naive_mmap(&vaddr, &paddr, 4096, false);
if(ret != 0){
USB_LOG_ERR("rndis_keepalive_cmplt_t allocate error, ret: %d\r\n", ret);
return -ENOMEM;
}
resp = (rndis_keepalive_cmplt_t *)vaddr;
resp_phy = (rndis_keepalive_cmplt_t *)paddr;
resp = (rndis_keepalive_cmplt_t *)g_rndis_keepalive_buf;
resp_phy = (rndis_keepalive_cmplt_t *)g_rndis_keepalive_buf_phy;
setup->bmRequestType = USB_REQUEST_DIR_IN | USB_REQUEST_CLASS | USB_REQUEST_RECIPIENT_INTERFACE;
setup->bRequest = CDC_REQUEST_GET_ENCAPSULATED_RESPONSE;
@ -332,6 +280,7 @@ static int usbh_rndis_connect(struct usbh_hubport *hport, uint8_t intf)
uint32_t data_len;
uint8_t tmp_buffer[512];
uint8_t data[32];
uintptr_t vaddr, paddr;
struct usbh_rndis *rndis_class = &g_rndis_class;
@ -341,6 +290,23 @@ static int usbh_rndis_connect(struct usbh_hubport *hport, uint8_t intf)
rndis_class->ctrl_intf = intf;
rndis_class->data_intf = intf + 1;
/* allocate virtual address and physical address*/
ret = naive_mmap(&vaddr, &paddr, 4096, false);
if(ret != 0){
USB_LOG_ERR("g_rndis_buf allocate error, ret: %d\n", ret);
return -ENOMEM;
}
g_rndis_buf = (uint8_t *)vaddr;
g_rndis_buf_phy = (uint8_t *)paddr;
ret = naive_mmap(&vaddr, &paddr, 4096, false);
if(ret != 0){
USB_LOG_ERR("g_rndis_keepalive_buf allocate error, ret: %d\n", ret);
return -ENOMEM;
}
g_rndis_keepalive_buf = (uint8_t *)vaddr;
g_rndis_keepalive_buf_phy = (uint8_t *)paddr;
hport->config.intf[intf].priv = rndis_class;
hport->config.intf[intf + 1].priv = NULL;