Commit 3f658cde authored by Alexey Orishko's avatar Alexey Orishko Committed by David S. Miller

cdc_ncm: fix MTU and max_datagram_size handling

Changes/fixes:
- inform device if max_datagram_size was changed by host
- max_datagram_size can't be bigger MTU in ETH func descr
- fix constants definitions to enable running CAIF service over NCM

Tested on Intel/ARM.
Reviewed-by: default avatarSjur Brændeland <sjur.brandeland@stericsson.com>
Tested-by: default avatarDmitry Tarnyagin <Dmitry.Tarnyagin@stericsson.com>
Signed-off-by: default avatarAlexey Orishko <alexey.orishko@stericsson.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent c84ff1d6
...@@ -58,8 +58,8 @@ ...@@ -58,8 +58,8 @@
#define USB_CDC_NCM_NDP16_LENGTH_MIN 0x10 #define USB_CDC_NCM_NDP16_LENGTH_MIN 0x10
/* Maximum NTB length */ /* Maximum NTB length */
#define CDC_NCM_NTB_MAX_SIZE_TX 16384 /* bytes */ #define CDC_NCM_NTB_MAX_SIZE_TX 32768 /* bytes */
#define CDC_NCM_NTB_MAX_SIZE_RX 16384 /* bytes */ #define CDC_NCM_NTB_MAX_SIZE_RX 32768 /* bytes */
/* Minimum value for MaxDatagramSize, ch. 6.2.9 */ /* Minimum value for MaxDatagramSize, ch. 6.2.9 */
#define CDC_NCM_MIN_DATAGRAM_SIZE 1514 /* bytes */ #define CDC_NCM_MIN_DATAGRAM_SIZE 1514 /* bytes */
...@@ -67,13 +67,13 @@ ...@@ -67,13 +67,13 @@
#define CDC_NCM_MIN_TX_PKT 512 /* bytes */ #define CDC_NCM_MIN_TX_PKT 512 /* bytes */
/* Default value for MaxDatagramSize */ /* Default value for MaxDatagramSize */
#define CDC_NCM_MAX_DATAGRAM_SIZE 2048 /* bytes */ #define CDC_NCM_MAX_DATAGRAM_SIZE 8192 /* bytes */
/* /*
* Maximum amount of datagrams in NCM Datagram Pointer Table, not counting * Maximum amount of datagrams in NCM Datagram Pointer Table, not counting
* the last NULL entry. Any additional datagrams in NTB would be discarded. * the last NULL entry. Any additional datagrams in NTB would be discarded.
*/ */
#define CDC_NCM_DPT_DATAGRAMS_MAX 32 #define CDC_NCM_DPT_DATAGRAMS_MAX 40
/* Maximum amount of IN datagrams in NTB */ /* Maximum amount of IN datagrams in NTB */
#define CDC_NCM_DPT_DATAGRAMS_IN_MAX 0 /* unlimited */ #define CDC_NCM_DPT_DATAGRAMS_IN_MAX 0 /* unlimited */
...@@ -366,27 +366,25 @@ static u8 cdc_ncm_setup(struct cdc_ncm_ctx *ctx) ...@@ -366,27 +366,25 @@ static u8 cdc_ncm_setup(struct cdc_ncm_ctx *ctx)
if (err < 0) { if (err < 0) {
pr_debug("GET_MAX_DATAGRAM_SIZE failed, use size=%u\n", pr_debug("GET_MAX_DATAGRAM_SIZE failed, use size=%u\n",
CDC_NCM_MIN_DATAGRAM_SIZE); CDC_NCM_MIN_DATAGRAM_SIZE);
kfree(max_datagram_size);
} else { } else {
ctx->max_datagram_size = ctx->max_datagram_size =
le16_to_cpu(*max_datagram_size); le16_to_cpu(*max_datagram_size);
/* Check Eth descriptor value */ /* Check Eth descriptor value */
if (eth_max_sz < CDC_NCM_MAX_DATAGRAM_SIZE) { if (ctx->max_datagram_size > eth_max_sz)
if (ctx->max_datagram_size > eth_max_sz)
ctx->max_datagram_size = eth_max_sz; ctx->max_datagram_size = eth_max_sz;
} else {
if (ctx->max_datagram_size > if (ctx->max_datagram_size > CDC_NCM_MAX_DATAGRAM_SIZE)
CDC_NCM_MAX_DATAGRAM_SIZE) ctx->max_datagram_size =
ctx->max_datagram_size =
CDC_NCM_MAX_DATAGRAM_SIZE; CDC_NCM_MAX_DATAGRAM_SIZE;
}
if (ctx->max_datagram_size < CDC_NCM_MIN_DATAGRAM_SIZE) if (ctx->max_datagram_size < CDC_NCM_MIN_DATAGRAM_SIZE)
ctx->max_datagram_size = ctx->max_datagram_size =
CDC_NCM_MIN_DATAGRAM_SIZE; CDC_NCM_MIN_DATAGRAM_SIZE;
/* if value changed, update device */ /* if value changed, update device */
err = usb_control_msg(ctx->udev, if (ctx->max_datagram_size !=
le16_to_cpu(*max_datagram_size)) {
err = usb_control_msg(ctx->udev,
usb_sndctrlpipe(ctx->udev, 0), usb_sndctrlpipe(ctx->udev, 0),
USB_CDC_SET_MAX_DATAGRAM_SIZE, USB_CDC_SET_MAX_DATAGRAM_SIZE,
USB_TYPE_CLASS | USB_DIR_OUT USB_TYPE_CLASS | USB_DIR_OUT
...@@ -394,14 +392,14 @@ static u8 cdc_ncm_setup(struct cdc_ncm_ctx *ctx) ...@@ -394,14 +392,14 @@ static u8 cdc_ncm_setup(struct cdc_ncm_ctx *ctx)
0, 0,
iface_no, max_datagram_size, iface_no, max_datagram_size,
2, 1000); 2, 1000);
kfree(max_datagram_size); if (err < 0)
max_dgram_err: pr_debug("SET_MAX_DGRAM_SIZE failed\n");
if (err < 0) }
pr_debug("SET_MAX_DATAGRAM_SIZE failed\n");
} }
kfree(max_datagram_size);
} }
max_dgram_err:
if (ctx->netdev->mtu != (ctx->max_datagram_size - ETH_HLEN)) if (ctx->netdev->mtu != (ctx->max_datagram_size - ETH_HLEN))
ctx->netdev->mtu = ctx->max_datagram_size - ETH_HLEN; ctx->netdev->mtu = ctx->max_datagram_size - ETH_HLEN;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment