From patchwork Wed Aug 7 13:26:29 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jussi Kivilinna X-Patchwork-Id: 265507 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id DE6362C0248 for ; Wed, 7 Aug 2013 23:26:40 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933029Ab3HGN0h (ORCPT ); Wed, 7 Aug 2013 09:26:37 -0400 Received: from tulikuusama.dnainternet.net ([83.102.40.132]:45283 "EHLO tulikuusama.dnainternet.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932921Ab3HGN0g (ORCPT ); Wed, 7 Aug 2013 09:26:36 -0400 Received: from localhost (localhost [127.0.0.1]) by tulikuusama.dnainternet.net (Postfix) with ESMTP id D26133FC23; Wed, 7 Aug 2013 16:26:34 +0300 (EEST) X-Virus-Scanned: DNA Postiturva at dnainternet.net X-Spam-Flag: NO X-Spam-Score: -1 X-Spam-Level: X-Spam-Status: No, score=-1 tagged_above=-9999 required=6 tests=[ALL_TRUSTED=-1] autolearn=disabled Received: from tulikuusama.dnainternet.net ([83.102.40.132]) by localhost (tulikuusama.dnainternet.net [127.0.0.1]) (DNA Postiturva, port 10041) with ESMTP id Cx31z7D9cdBS; Wed, 7 Aug 2013 16:26:34 +0300 (EEST) Received: from kirsikkapuu.dnainternet.net (kirsikkapuu.dnainternet.net [83.102.40.214]) by tulikuusama.dnainternet.net (Postfix) with ESMTP id 22E483FC33; Wed, 7 Aug 2013 16:26:34 +0300 (EEST) Received: from hayate.dalek.fi (dyn2-212-50-133-197.psoas.suomi.net [212.50.133.197]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by kirsikkapuu.dnainternet.net (Postfix) with ESMTPS id E3A665FA9A; Wed, 7 Aug 2013 16:26:29 +0300 (EEST) Received: from fate.lan ([10.0.0.10] helo=fate) by hayate.dalek.fi with esmtp (Exim 4.80) (envelope-from ) id 1V73kz-0007wt-FH; Wed, 07 Aug 2013 16:26:29 +0300 Received: from localhost6.localdomain6 (unknown [127.0.0.1]) by fate (Postfix) with ESMTP id 6F0792008DA; Wed, 7 Aug 2013 16:26:29 +0300 (EEST) Subject: [PATCH 1/2] net/usb: catc: allocate URB setup_packet as separate buffer To: netdev@vger.kernel.org From: Jussi Kivilinna Cc: Greg Kroah-Hartman , linux-usb@vger.kernel.org, "David S. Miller" Date: Wed, 07 Aug 2013 16:26:29 +0300 Message-ID: <20130807132629.14001.2370.stgit@localhost6.localdomain6> User-Agent: StGit/0.16 MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org URB setup packet must not be allocated as part of larger structure because DMA coherence issues. Patch changes catc to allocate ctrl_dr member as separate buffer. Patch is only compile tested. Cc: Signed-off-by: Jussi Kivilinna --- drivers/net/usb/catc.c | 40 +++++++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 15 deletions(-) -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/drivers/net/usb/catc.c b/drivers/net/usb/catc.c index 8d5cac2..a7d3c1b 100644 --- a/drivers/net/usb/catc.c +++ b/drivers/net/usb/catc.c @@ -173,7 +173,7 @@ struct catc { u8 rx_buf[RX_MAX_BURST * (PKT_SZ + 2)]; u8 irq_buf[2]; u8 ctrl_buf[64]; - struct usb_ctrlrequest ctrl_dr; + struct usb_ctrlrequest *ctrl_dr; struct timer_list timer; u8 stats_buf[8]; @@ -485,7 +485,7 @@ static void catc_ctrl_run(struct catc *catc) struct ctrl_queue *q = catc->ctrl_queue + catc->ctrl_tail; struct usb_device *usbdev = catc->usbdev; struct urb *urb = catc->ctrl_urb; - struct usb_ctrlrequest *dr = &catc->ctrl_dr; + struct usb_ctrlrequest *dr = catc->ctrl_dr; int status; dr->bRequest = q->request; @@ -779,7 +779,7 @@ static int catc_probe(struct usb_interface *intf, const struct usb_device_id *id struct net_device *netdev; struct catc *catc; u8 broadcast[6]; - int i, pktsz; + int i, pktsz, err; if (usb_set_interface(usbdev, intf->altsetting->desc.bInterfaceNumber, 1)) { @@ -793,6 +793,12 @@ static int catc_probe(struct usb_interface *intf, const struct usb_device_id *id catc = netdev_priv(netdev); + catc->ctrl_dr = kzalloc(sizeof(*catc->ctrl_dr), GFP_KERNEL); + if (!catc->ctrl_dr) { + err = -ENOMEM; + goto err_free_dev; + } + netdev->netdev_ops = &catc_netdev_ops; netdev->watchdog_timeo = TX_TIMEOUT; SET_ETHTOOL_OPS(netdev, &ops); @@ -814,12 +820,8 @@ static int catc_probe(struct usb_interface *intf, const struct usb_device_id *id if ((!catc->ctrl_urb) || (!catc->tx_urb) || (!catc->rx_urb) || (!catc->irq_urb)) { dev_err(&intf->dev, "No free urbs available.\n"); - usb_free_urb(catc->ctrl_urb); - usb_free_urb(catc->tx_urb); - usb_free_urb(catc->rx_urb); - usb_free_urb(catc->irq_urb); - free_netdev(netdev); - return -ENOMEM; + err = -ENOMEM; + goto err_free; } /* The F5U011 has the same vendor/product as the netmate but a device version of 0x130 */ @@ -918,14 +920,21 @@ static int catc_probe(struct usb_interface *intf, const struct usb_device_id *id SET_NETDEV_DEV(netdev, &intf->dev); if (register_netdev(netdev) != 0) { usb_set_intfdata(intf, NULL); - usb_free_urb(catc->ctrl_urb); - usb_free_urb(catc->tx_urb); - usb_free_urb(catc->rx_urb); - usb_free_urb(catc->irq_urb); - free_netdev(netdev); - return -EIO; + err = -EIO; + goto err_free; } return 0; + +err_free: + usb_free_urb(catc->ctrl_urb); + usb_free_urb(catc->tx_urb); + usb_free_urb(catc->rx_urb); + usb_free_urb(catc->irq_urb); + kfree(catc->ctrl_dr); +err_free_dev: + free_netdev(netdev); + + return err; } static void catc_disconnect(struct usb_interface *intf) @@ -939,6 +948,7 @@ static void catc_disconnect(struct usb_interface *intf) usb_free_urb(catc->tx_urb); usb_free_urb(catc->rx_urb); usb_free_urb(catc->irq_urb); + kfree(catc->ctrl_dr); free_netdev(catc->netdev); } }