diff options
author | David S. Miller <davem@davemloft.net> | 2011-08-20 13:39:12 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-08-20 13:39:12 -0400 |
commit | 823dcd2506fa369aeb8cbd26da5663efe2fda9a9 (patch) | |
tree | 853b3e3c05f0b9ee1b5df8464db19b7acc57150c /drivers/net/usb | |
parent | eaa36660de7e174498618d69d7277d44a2f24c3d (diff) | |
parent | 98e77438aed3cd3343cbb86825127b1d9d2bea33 (diff) |
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net
Diffstat (limited to 'drivers/net/usb')
-rw-r--r-- | drivers/net/usb/cdc_ncm.c | 47 |
1 files changed, 38 insertions, 9 deletions
diff --git a/drivers/net/usb/cdc_ncm.c b/drivers/net/usb/cdc_ncm.c index a03336e086d5..f06fb78383a1 100644 --- a/drivers/net/usb/cdc_ncm.c +++ b/drivers/net/usb/cdc_ncm.c | |||
@@ -228,23 +228,40 @@ static u8 cdc_ncm_setup(struct cdc_ncm_ctx *ctx) | |||
228 | if (ctx->rx_max != le32_to_cpu(ctx->ncm_parm.dwNtbInMaxSize)) { | 228 | if (ctx->rx_max != le32_to_cpu(ctx->ncm_parm.dwNtbInMaxSize)) { |
229 | 229 | ||
230 | if (flags & USB_CDC_NCM_NCAP_NTB_INPUT_SIZE) { | 230 | if (flags & USB_CDC_NCM_NCAP_NTB_INPUT_SIZE) { |
231 | struct usb_cdc_ncm_ndp_input_size ndp_in_sz; | 231 | struct usb_cdc_ncm_ndp_input_size *ndp_in_sz; |
232 | |||
233 | ndp_in_sz = kzalloc(sizeof(*ndp_in_sz), GFP_KERNEL); | ||
234 | if (!ndp_in_sz) { | ||
235 | err = -ENOMEM; | ||
236 | goto size_err; | ||
237 | } | ||
238 | |||
232 | err = usb_control_msg(ctx->udev, | 239 | err = usb_control_msg(ctx->udev, |
233 | usb_sndctrlpipe(ctx->udev, 0), | 240 | usb_sndctrlpipe(ctx->udev, 0), |
234 | USB_CDC_SET_NTB_INPUT_SIZE, | 241 | USB_CDC_SET_NTB_INPUT_SIZE, |
235 | USB_TYPE_CLASS | USB_DIR_OUT | 242 | USB_TYPE_CLASS | USB_DIR_OUT |
236 | | USB_RECIP_INTERFACE, | 243 | | USB_RECIP_INTERFACE, |
237 | 0, iface_no, &ndp_in_sz, 8, 1000); | 244 | 0, iface_no, ndp_in_sz, 8, 1000); |
245 | kfree(ndp_in_sz); | ||
238 | } else { | 246 | } else { |
239 | __le32 dwNtbInMaxSize = cpu_to_le32(ctx->rx_max); | 247 | __le32 *dwNtbInMaxSize; |
248 | dwNtbInMaxSize = kzalloc(sizeof(*dwNtbInMaxSize), | ||
249 | GFP_KERNEL); | ||
250 | if (!dwNtbInMaxSize) { | ||
251 | err = -ENOMEM; | ||
252 | goto size_err; | ||
253 | } | ||
254 | *dwNtbInMaxSize = cpu_to_le32(ctx->rx_max); | ||
255 | |||
240 | err = usb_control_msg(ctx->udev, | 256 | err = usb_control_msg(ctx->udev, |
241 | usb_sndctrlpipe(ctx->udev, 0), | 257 | usb_sndctrlpipe(ctx->udev, 0), |
242 | USB_CDC_SET_NTB_INPUT_SIZE, | 258 | USB_CDC_SET_NTB_INPUT_SIZE, |
243 | USB_TYPE_CLASS | USB_DIR_OUT | 259 | USB_TYPE_CLASS | USB_DIR_OUT |
244 | | USB_RECIP_INTERFACE, | 260 | | USB_RECIP_INTERFACE, |
245 | 0, iface_no, &dwNtbInMaxSize, 4, 1000); | 261 | 0, iface_no, dwNtbInMaxSize, 4, 1000); |
262 | kfree(dwNtbInMaxSize); | ||
246 | } | 263 | } |
247 | 264 | size_err: | |
248 | if (err < 0) | 265 | if (err < 0) |
249 | pr_debug("Setting NTB Input Size failed\n"); | 266 | pr_debug("Setting NTB Input Size failed\n"); |
250 | } | 267 | } |
@@ -325,19 +342,29 @@ static u8 cdc_ncm_setup(struct cdc_ncm_ctx *ctx) | |||
325 | 342 | ||
326 | /* set Max Datagram Size (MTU) */ | 343 | /* set Max Datagram Size (MTU) */ |
327 | if (flags & USB_CDC_NCM_NCAP_MAX_DATAGRAM_SIZE) { | 344 | if (flags & USB_CDC_NCM_NCAP_MAX_DATAGRAM_SIZE) { |
328 | __le16 max_datagram_size; | 345 | __le16 *max_datagram_size; |
329 | u16 eth_max_sz = le16_to_cpu(ctx->ether_desc->wMaxSegmentSize); | 346 | u16 eth_max_sz = le16_to_cpu(ctx->ether_desc->wMaxSegmentSize); |
347 | |||
348 | max_datagram_size = kzalloc(sizeof(*max_datagram_size), | ||
349 | GFP_KERNEL); | ||
350 | if (!max_datagram_size) { | ||
351 | err = -ENOMEM; | ||
352 | goto max_dgram_err; | ||
353 | } | ||
354 | |||
330 | err = usb_control_msg(ctx->udev, usb_rcvctrlpipe(ctx->udev, 0), | 355 | err = usb_control_msg(ctx->udev, usb_rcvctrlpipe(ctx->udev, 0), |
331 | USB_CDC_GET_MAX_DATAGRAM_SIZE, | 356 | USB_CDC_GET_MAX_DATAGRAM_SIZE, |
332 | USB_TYPE_CLASS | USB_DIR_IN | 357 | USB_TYPE_CLASS | USB_DIR_IN |
333 | | USB_RECIP_INTERFACE, | 358 | | USB_RECIP_INTERFACE, |
334 | 0, iface_no, &max_datagram_size, | 359 | 0, iface_no, max_datagram_size, |
335 | 2, 1000); | 360 | 2, 1000); |
336 | if (err < 0) { | 361 | if (err < 0) { |
337 | pr_debug("GET_MAX_DATAGRAM_SIZE failed, use size=%u\n", | 362 | pr_debug("GET_MAX_DATAGRAM_SIZE failed, use size=%u\n", |
338 | CDC_NCM_MIN_DATAGRAM_SIZE); | 363 | CDC_NCM_MIN_DATAGRAM_SIZE); |
364 | kfree(max_datagram_size); | ||
339 | } else { | 365 | } else { |
340 | ctx->max_datagram_size = le16_to_cpu(max_datagram_size); | 366 | ctx->max_datagram_size = |
367 | le16_to_cpu(*max_datagram_size); | ||
341 | /* Check Eth descriptor value */ | 368 | /* Check Eth descriptor value */ |
342 | if (eth_max_sz < CDC_NCM_MAX_DATAGRAM_SIZE) { | 369 | if (eth_max_sz < CDC_NCM_MAX_DATAGRAM_SIZE) { |
343 | if (ctx->max_datagram_size > eth_max_sz) | 370 | if (ctx->max_datagram_size > eth_max_sz) |
@@ -360,8 +387,10 @@ static u8 cdc_ncm_setup(struct cdc_ncm_ctx *ctx) | |||
360 | USB_TYPE_CLASS | USB_DIR_OUT | 387 | USB_TYPE_CLASS | USB_DIR_OUT |
361 | | USB_RECIP_INTERFACE, | 388 | | USB_RECIP_INTERFACE, |
362 | 0, | 389 | 0, |
363 | iface_no, &max_datagram_size, | 390 | iface_no, max_datagram_size, |
364 | 2, 1000); | 391 | 2, 1000); |
392 | kfree(max_datagram_size); | ||
393 | max_dgram_err: | ||
365 | if (err < 0) | 394 | if (err < 0) |
366 | pr_debug("SET_MAX_DATAGRAM_SIZE failed\n"); | 395 | pr_debug("SET_MAX_DATAGRAM_SIZE failed\n"); |
367 | } | 396 | } |