diff options
author | Josh Boyer <jwboyer@redhat.com> | 2011-08-02 12:47:04 -0400 |
---|---|---|
committer | Josh Boyer <jwboyer@redhat.com> | 2011-08-02 12:49:07 -0400 |
commit | c2057797f6b2fc390fb32241372177d79d544276 (patch) | |
tree | 431911d3920fce22fa0deb7121e0801e4a6057c0 /fix-cdc-ncm-dma-stack-vars.patch | |
parent | 502500759d247e7cfddc2717f9a770f522e6f5fc (diff) | |
download | kernel-c2057797f6b2fc390fb32241372177d79d544276.tar.gz kernel-c2057797f6b2fc390fb32241372177d79d544276.tar.xz kernel-c2057797f6b2fc390fb32241372177d79d544276.zip |
3.0-git17 snapshot
Add changes for rhbz 720128,720054,708314
Diffstat (limited to 'fix-cdc-ncm-dma-stack-vars.patch')
-rw-r--r-- | fix-cdc-ncm-dma-stack-vars.patch | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/fix-cdc-ncm-dma-stack-vars.patch b/fix-cdc-ncm-dma-stack-vars.patch new file mode 100644 index 000000000..6d7f5b888 --- /dev/null +++ b/fix-cdc-ncm-dma-stack-vars.patch @@ -0,0 +1,124 @@ +From 1717b6b8b1de95ed4ca53b74d2ccb563fae9b898 Mon Sep 17 00:00:00 2001 +From: Josh Boyer <jwboyer@redhat.com> +Date: Tue, 2 Aug 2011 08:09:56 -0400 +Subject: [PATCH] usbnet/cdc_ncm: Don't use stack variables for DMA buffers + +The cdc_ncm driver still has a few places where stack variables are passed +to the cdc_ncm_do_request function. This triggers a stack trace in +lib/dma-debug.c if the CONFIG_DEBUG_DMA_API option is set. + +Adjust these calls to pass parameters that have been allocated with kzalloc. + +Signed-off-by: Josh Boyer <jwboyer@redhat.com> +--- + drivers/net/usb/cdc_ncm.c | 54 +++++++++++++++++++++++++++++++++++---------- + 1 files changed, 42 insertions(+), 12 deletions(-) + +diff --git a/drivers/net/usb/cdc_ncm.c b/drivers/net/usb/cdc_ncm.c +index fd622a6..bbcb133 100644 +--- a/drivers/net/usb/cdc_ncm.c ++++ b/drivers/net/usb/cdc_ncm.c +@@ -260,23 +260,39 @@ static u8 cdc_ncm_setup(struct cdc_ncm_ctx *ctx) + req.wIndex = cpu_to_le16(iface_no); + + if (flags & USB_CDC_NCM_NCAP_NTB_INPUT_SIZE) { +- struct usb_cdc_ncm_ndp_input_size ndp_in_sz; ++ struct usb_cdc_ncm_ndp_input_size *ndp_in_sz; ++ ++ ndp_in_sz = kzalloc(sizeof(*ndp_in_sz), GFP_KERNEL); ++ if (!ndp_in_sz) { ++ err = -ENOMEM; ++ goto size_err; ++ } + + req.wLength = 8; +- ndp_in_sz.dwNtbInMaxSize = cpu_to_le32(ctx->rx_max); +- ndp_in_sz.wNtbInMaxDatagrams = ++ ndp_in_sz->dwNtbInMaxSize = cpu_to_le32(ctx->rx_max); ++ ndp_in_sz->wNtbInMaxDatagrams = + cpu_to_le16(CDC_NCM_DPT_DATAGRAMS_MAX); +- ndp_in_sz.wReserved = 0; +- err = cdc_ncm_do_request(ctx, &req, &ndp_in_sz, 0, NULL, ++ ndp_in_sz->wReserved = 0; ++ err = cdc_ncm_do_request(ctx, &req, ndp_in_sz, 0, NULL, + 1000); ++ kfree(ndp_in_sz); + } else { +- __le32 dwNtbInMaxSize = cpu_to_le32(ctx->rx_max); ++ __le32 *dwNtbInMaxSize; ++ dwNtbInMaxSize = kzalloc(sizeof(*dwNtbInMaxSize), ++ GFP_KERNEL); ++ if (!dwNtbInMaxSize) { ++ err = -ENOMEM; ++ goto size_err; ++ } ++ *dwNtbInMaxSize = cpu_to_le32(ctx->rx_max); + + req.wLength = 4; +- err = cdc_ncm_do_request(ctx, &req, &dwNtbInMaxSize, 0, ++ err = cdc_ncm_do_request(ctx, &req, dwNtbInMaxSize, 0, + NULL, 1000); ++ kfree(dwNtbInMaxSize); + } + ++size_err: + if (err) + pr_debug("Setting NTB Input Size failed\n"); + } +@@ -362,9 +378,16 @@ static u8 cdc_ncm_setup(struct cdc_ncm_ctx *ctx) + + /* set Max Datagram Size (MTU) */ + if (flags & USB_CDC_NCM_NCAP_MAX_DATAGRAM_SIZE) { +- __le16 max_datagram_size; ++ __le16 *max_datagram_size; + u16 eth_max_sz = le16_to_cpu(ctx->ether_desc->wMaxSegmentSize); + ++ max_datagram_size = kzalloc(sizeof(*max_datagram_size), ++ GFP_KERNEL); ++ if (!max_datagram_size) { ++ err = -ENOMEM; ++ goto max_dgram_err; ++ } ++ + req.bmRequestType = USB_TYPE_CLASS | USB_DIR_IN | + USB_RECIP_INTERFACE; + req.bNotificationType = USB_CDC_GET_MAX_DATAGRAM_SIZE; +@@ -372,13 +395,17 @@ static u8 cdc_ncm_setup(struct cdc_ncm_ctx *ctx) + req.wIndex = cpu_to_le16(iface_no); + req.wLength = cpu_to_le16(2); + +- err = cdc_ncm_do_request(ctx, &req, &max_datagram_size, 0, NULL, ++ err = cdc_ncm_do_request(ctx, &req, max_datagram_size, 0, NULL, + 1000); ++ + if (err) { + pr_debug("GET_MAX_DATAGRAM_SIZE failed, use size=%u\n", + CDC_NCM_MIN_DATAGRAM_SIZE); ++ kfree(max_datagram_size); + } else { +- ctx->max_datagram_size = le16_to_cpu(max_datagram_size); ++ ctx->max_datagram_size = ++ le16_to_cpu(*max_datagram_size); ++ + /* Check Eth descriptor value */ + if (eth_max_sz < CDC_NCM_MAX_DATAGRAM_SIZE) { + if (ctx->max_datagram_size > eth_max_sz) +@@ -401,10 +428,13 @@ static u8 cdc_ncm_setup(struct cdc_ncm_ctx *ctx) + req.wValue = 0; + req.wIndex = cpu_to_le16(iface_no); + req.wLength = 2; +- max_datagram_size = cpu_to_le16(ctx->max_datagram_size); ++ *max_datagram_size = ++ cpu_to_le16(ctx->max_datagram_size); + +- err = cdc_ncm_do_request(ctx, &req, &max_datagram_size, ++ err = cdc_ncm_do_request(ctx, &req, max_datagram_size, + 0, NULL, 1000); ++ kfree(max_datagram_size); ++max_dgram_err: + if (err) + pr_debug("SET_MAX_DATAGRAM_SIZE failed\n"); + } +-- +1.7.6 + |