64
64
/* Minimum value for MaxDatagramSize, ch. 6.2.9 */
65
65
#define CDC_NCM_MIN_DATAGRAM_SIZE 1514 /* bytes */
66
66
67
+ /* Minimum value for MaxDatagramSize, ch. 8.1.3 */
68
+ #define CDC_MBIM_MIN_DATAGRAM_SIZE 2048 /* bytes */
69
+
67
70
#define CDC_NCM_MIN_TX_PKT 512 /* bytes */
68
71
69
72
/* Default value for MaxDatagramSize */
@@ -98,6 +101,7 @@ struct cdc_ncm_ctx {
98
101
struct tasklet_struct bh ;
99
102
100
103
const struct usb_cdc_ncm_desc * func_desc ;
104
+ const struct usb_cdc_mbim_desc * mbim_desc ;
101
105
const struct usb_cdc_header_desc * header_desc ;
102
106
const struct usb_cdc_union_desc * union_desc ;
103
107
const struct usb_cdc_ether_desc * ether_desc ;
@@ -158,7 +162,10 @@ static u8 cdc_ncm_setup(struct cdc_ncm_ctx *ctx)
158
162
u8 flags ;
159
163
u8 iface_no ;
160
164
int err ;
165
+ int eth_hlen ;
161
166
u16 ntb_fmt_supported ;
167
+ u32 min_dgram_size ;
168
+ u32 min_hdr_size ;
162
169
163
170
iface_no = ctx -> control -> cur_altsetting -> desc .bInterfaceNumber ;
164
171
@@ -184,10 +191,19 @@ static u8 cdc_ncm_setup(struct cdc_ncm_ctx *ctx)
184
191
ctx -> tx_max_datagrams = le16_to_cpu (ctx -> ncm_parm .wNtbOutMaxDatagrams );
185
192
ntb_fmt_supported = le16_to_cpu (ctx -> ncm_parm .bmNtbFormatsSupported );
186
193
187
- if (ctx -> func_desc != NULL )
194
+ eth_hlen = ETH_HLEN ;
195
+ min_dgram_size = CDC_NCM_MIN_DATAGRAM_SIZE ;
196
+ min_hdr_size = CDC_NCM_MIN_HDR_SIZE ;
197
+ if (ctx -> mbim_desc != NULL ) {
198
+ flags = ctx -> mbim_desc -> bmNetworkCapabilities ;
199
+ eth_hlen = 0 ;
200
+ min_dgram_size = CDC_MBIM_MIN_DATAGRAM_SIZE ;
201
+ min_hdr_size = 0 ;
202
+ } else if (ctx -> func_desc != NULL ) {
188
203
flags = ctx -> func_desc -> bmNetworkCapabilities ;
189
- else
204
+ } else {
190
205
flags = 0 ;
206
+ }
191
207
192
208
pr_debug ("dwNtbInMaxSize=%u dwNtbOutMaxSize=%u "
193
209
"wNdpOutPayloadRemainder=%u wNdpOutDivisor=%u "
@@ -237,7 +253,7 @@ static u8 cdc_ncm_setup(struct cdc_ncm_ctx *ctx)
237
253
238
254
/* verify maximum size of transmitted NTB in bytes */
239
255
if ((ctx -> tx_max <
240
- (CDC_NCM_MIN_HDR_SIZE + CDC_NCM_MIN_DATAGRAM_SIZE )) ||
256
+ (min_hdr_size + min_dgram_size )) ||
241
257
(ctx -> tx_max > CDC_NCM_NTB_MAX_SIZE_TX )) {
242
258
pr_debug ("Using default maximum transmit length=%d\n" ,
243
259
CDC_NCM_NTB_MAX_SIZE_TX );
@@ -279,8 +295,8 @@ static u8 cdc_ncm_setup(struct cdc_ncm_ctx *ctx)
279
295
}
280
296
281
297
/* adjust TX-remainder according to NCM specification. */
282
- ctx -> tx_remainder = ((ctx -> tx_remainder - ETH_HLEN ) &
283
- (ctx -> tx_modulus - 1 ));
298
+ ctx -> tx_remainder = ((ctx -> tx_remainder - eth_hlen ) &
299
+ (ctx -> tx_modulus - 1 ));
284
300
285
301
/* additional configuration */
286
302
@@ -307,12 +323,18 @@ static u8 cdc_ncm_setup(struct cdc_ncm_ctx *ctx)
307
323
pr_debug ("Setting NTB format to 16-bit failed\n" );
308
324
}
309
325
310
- ctx -> max_datagram_size = CDC_NCM_MIN_DATAGRAM_SIZE ;
326
+ ctx -> max_datagram_size = min_dgram_size ;
311
327
312
328
/* set Max Datagram Size (MTU) */
313
329
if (flags & USB_CDC_NCM_NCAP_MAX_DATAGRAM_SIZE ) {
314
330
__le16 * max_datagram_size ;
315
- u16 eth_max_sz = le16_to_cpu (ctx -> ether_desc -> wMaxSegmentSize );
331
+ u16 eth_max_sz ;
332
+ if (ctx -> ether_desc != NULL )
333
+ eth_max_sz = le16_to_cpu (ctx -> ether_desc -> wMaxSegmentSize );
334
+ else if (ctx -> mbim_desc != NULL )
335
+ eth_max_sz = le16_to_cpu (ctx -> mbim_desc -> wMaxSegmentSize );
336
+ else
337
+ goto max_dgram_err ;
316
338
317
339
max_datagram_size = kzalloc (sizeof (* max_datagram_size ),
318
340
GFP_KERNEL );
@@ -329,7 +351,7 @@ static u8 cdc_ncm_setup(struct cdc_ncm_ctx *ctx)
329
351
2 , 1000 );
330
352
if (err < 0 ) {
331
353
pr_debug ("GET_MAX_DATAGRAM_SIZE failed, use size=%u\n" ,
332
- CDC_NCM_MIN_DATAGRAM_SIZE );
354
+ min_dgram_size );
333
355
} else {
334
356
ctx -> max_datagram_size =
335
357
le16_to_cpu (* max_datagram_size );
@@ -338,12 +360,10 @@ static u8 cdc_ncm_setup(struct cdc_ncm_ctx *ctx)
338
360
ctx -> max_datagram_size = eth_max_sz ;
339
361
340
362
if (ctx -> max_datagram_size > CDC_NCM_MAX_DATAGRAM_SIZE )
341
- ctx -> max_datagram_size =
342
- CDC_NCM_MAX_DATAGRAM_SIZE ;
363
+ ctx -> max_datagram_size = CDC_NCM_MAX_DATAGRAM_SIZE ;
343
364
344
- if (ctx -> max_datagram_size < CDC_NCM_MIN_DATAGRAM_SIZE )
345
- ctx -> max_datagram_size =
346
- CDC_NCM_MIN_DATAGRAM_SIZE ;
365
+ if (ctx -> max_datagram_size < min_dgram_size )
366
+ ctx -> max_datagram_size = min_dgram_size ;
347
367
348
368
/* if value changed, update device */
349
369
if (ctx -> max_datagram_size !=
@@ -364,8 +384,8 @@ static u8 cdc_ncm_setup(struct cdc_ncm_ctx *ctx)
364
384
}
365
385
366
386
max_dgram_err :
367
- if (ctx -> netdev -> mtu != (ctx -> max_datagram_size - ETH_HLEN ))
368
- ctx -> netdev -> mtu = ctx -> max_datagram_size - ETH_HLEN ;
387
+ if (ctx -> netdev -> mtu != (ctx -> max_datagram_size - eth_hlen ))
388
+ ctx -> netdev -> mtu = ctx -> max_datagram_size - eth_hlen ;
369
389
370
390
return 0 ;
371
391
}
0 commit comments