diff --git a/cherryusb_config_template.h b/cherryusb_config_template.h index f515099b..26725143 100644 --- a/cherryusb_config_template.h +++ b/cherryusb_config_template.h @@ -86,8 +86,9 @@ #define CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE 156 #endif +/* rndis transfer buffer size, must be a multiple of (1536 + 44)*/ #ifndef CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE -#define CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE 2048 +#define CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE 1580 #endif #ifndef CONFIG_USBDEV_RNDIS_VENDOR_ID diff --git a/class/wireless/usbd_rndis.c b/class/wireless/usbd_rndis.c index 293fbe12..a40fd293 100644 --- a/class/wireless/usbd_rndis.c +++ b/class/wireless/usbd_rndis.c @@ -45,8 +45,13 @@ struct usbd_rndis_priv { #define CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE 156 #endif -static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_rndis_rx_buffer[CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE + 44]; -static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_rndis_tx_buffer[CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE + 44]; +#if CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE < 1580 +#undef CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE +#define CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE 1580 +#endif + +static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_rndis_rx_buffer[CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE]; +static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_rndis_tx_buffer[CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE]; USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t rndis_encapsulated_resp_buffer[CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE]; USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t NOTIFY_RESPONSE_AVAILABLE[8]; @@ -169,8 +174,8 @@ static int rndis_init_cmd_handler(uint8_t *data, uint32_t len) resp->Status = RNDIS_STATUS_SUCCESS; resp->DeviceFlags = RNDIS_DF_CONNECTIONLESS; resp->Medium = RNDIS_MEDIUM_802_3; - resp->MaxPacketsPerTransfer = 1; - resp->MaxTransferSize = CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE + sizeof(rndis_data_packet_t); + resp->MaxPacketsPerTransfer = CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE / 1580; + resp->MaxTransferSize = CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE; resp->PacketAlignmentFactor = 0; resp->AfListOffset = 0; resp->AfListSize = 0; @@ -225,7 +230,7 @@ static int rndis_query_cmd_handler(uint8_t *data, uint32_t len) case OID_GEN_MAXIMUM_FRAME_SIZE: case OID_GEN_TRANSMIT_BLOCK_SIZE: case OID_GEN_RECEIVE_BLOCK_SIZE: - RNDIS_INQUIRY_PUT_LE32(CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE); + RNDIS_INQUIRY_PUT_LE32(0x05DC); infomation_len = 4; break; case OID_GEN_VENDOR_ID: