From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-10.0 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 414F8C433DF for ; Tue, 21 Jul 2020 10:04:20 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id C10AF20729 for ; Tue, 21 Jul 2020 10:04:19 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=alsa-project.org header.i=@alsa-project.org header.b="UmviLHmK" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org C10AF20729 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 2CCD31688; Tue, 21 Jul 2020 12:03:28 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 2CCD31688 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1595325858; bh=vSn2SjimUxnO8HGjGx5JNaW/jcxf8Ob78UcsbbicTIM=; h=Date:From:To:Subject:In-Reply-To:References:Cc:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=UmviLHmKgDsLhVma7fLGBlPJAy3pa1jX67/abIDi1rAM6xv25oct6eyXZ3NPBqCQ5 zV024gO9MRZIF7p63n9dKBnSPZhfl98PxAu3DUXn5C3SRxzg1MLA3HWb5Dg4GcW/Y/ 7GdRb74Ppl1AFYrJnzpuuUVsyG/uKbWuE+1L7KKY= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id AA2F1F80212; Tue, 21 Jul 2020 12:03:27 +0200 (CEST) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 5600EF80117; Tue, 21 Jul 2020 12:03:26 +0200 (CEST) Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id CD853F80117 for ; Tue, 21 Jul 2020 12:03:19 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz CD853F80117 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.221.27]) by mx2.suse.de (Postfix) with ESMTP id 93A17AD04; Tue, 21 Jul 2020 10:03:25 +0000 (UTC) Date: Tue, 21 Jul 2020 12:03:18 +0200 Message-ID: From: Takashi Iwai To: =?UTF-8?B?UmVuw6k=?= Herman Subject: Re: [PATCH v2 1/2] Move DMA-buffer off the stack In-Reply-To: <20200721095748.16224-2-rene.herman@gmail.com> References: <20200721095748.16224-1-rene.herman@gmail.com> <20200721095748.16224-2-rene.herman@gmail.com> User-Agent: Wanderlust/2.15.9 (Almost Unreal) SEMI/1.14.6 (Maruoka) FLIM/1.14.9 (=?UTF-8?B?R29qxY0=?=) APEL/10.8 Emacs/25.3 (x86_64-suse-linux-gnu) MULE/6.0 (HANACHIRUSATO) MIME-Version: 1.0 (generated by SEMI 1.14.6 - "Maruoka") Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: alsa-devel@alsa-project.org, Torsten Schenk X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: "Alsa-devel mailing list for ALSA developers - http://www.alsa-project.org" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" On Tue, 21 Jul 2020 11:57:47 +0200, René Herman wrote: > > snd-usb-fire currently fails its firmware load with "transfer buffer not dma > capable". Move said buffer off of the stack. > > Signed-off-by: René Herman > --- > sound/usb/6fire/firmware.c | 95 ++++++++++++++++++-------------------- > 1 file changed, 46 insertions(+), 49 deletions(-) > > diff --git a/sound/usb/6fire/firmware.c b/sound/usb/6fire/firmware.c > index 69137c14d0dc..502653a89f01 100644 > --- a/sound/usb/6fire/firmware.c > +++ b/sound/usb/6fire/firmware.c > @@ -355,63 +355,60 @@ static int usb6fire_fw_check(struct usb_interface *intf, const u8 *version) > > int usb6fire_fw_init(struct usb_interface *intf) > { > - int i; > - int ret; > struct usb_device *device = interface_to_usbdev(intf); > + int ret, i; > + Don't put a blank line here. > /* buffer: 8 receiving bytes from device and > * sizeof(EP_W_MAX_PACKET_SIZE) bytes for non-const copy */ > - u8 buffer[12]; > + u8 *buffer = kmalloc(12, GFP_KERNEL); > + > + if (!buffer) > + return -ENOMEM; > > ret = usb6fire_fw_ezusb_read(device, 1, 0, buffer, 8); > if (ret < 0) { > dev_err(&intf->dev, > "unable to receive device firmware state.\n"); > - return ret; > - } > - if (buffer[0] != 0xeb || buffer[1] != 0xaa || buffer[2] != 0x55) { > - dev_err(&intf->dev, > - "unknown device firmware state received from device:"); > - for (i = 0; i < 8; i++) > - printk(KERN_CONT "%02x ", buffer[i]); > - printk(KERN_CONT "\n"); > - return -EIO; > - } > - /* do we need fpga loader ezusb firmware? */ > - if (buffer[3] == 0x01) { > - ret = usb6fire_fw_ezusb_upload(intf, > - "6fire/dmx6firel2.ihx", 0, NULL, 0); > - if (ret < 0) > - return ret; > - return FW_NOT_READY; > + goto out; > } > - /* do we need fpga firmware and application ezusb firmware? */ > - else if (buffer[3] == 0x02) { > - ret = usb6fire_fw_check(intf, buffer + 4); > - if (ret < 0) > - return ret; > - ret = usb6fire_fw_fpga_upload(intf, "6fire/dmx6firecf.bin"); > - if (ret < 0) > - return ret; > - memcpy(buffer, ep_w_max_packet_size, > - sizeof(ep_w_max_packet_size)); > - ret = usb6fire_fw_ezusb_upload(intf, "6fire/dmx6fireap.ihx", > - 0x0003, buffer, sizeof(ep_w_max_packet_size)); > - if (ret < 0) > - return ret; > - return FW_NOT_READY; > - } > - /* all fw loaded? */ > - else if (buffer[3] == 0x03) > - return usb6fire_fw_check(intf, buffer + 4); > - /* unknown data? */ > - else { > - dev_err(&intf->dev, > - "unknown device firmware state received from device: "); > - for (i = 0; i < 8; i++) > - printk(KERN_CONT "%02x ", buffer[i]); > - printk(KERN_CONT "\n"); > - return -EIO; > + if (buffer[0] == 0xeb && buffer[1] == 0xaa && buffer[2] == 0x55) { > + /* do we need fpga loader ezusb firmware? */ > + if (buffer[3] == 1) { > + ret = usb6fire_fw_ezusb_upload(intf, > + "6fire/dmx6firel2.ihx", 0, NULL, 0); > + if (ret >= 0) > + ret = FW_NOT_READY; > + goto out; > + } > + /* do we need fpga firmware and application ezusb firmware? */ > + if (buffer[3] == 2) { > + ret = usb6fire_fw_check(intf, buffer + 4); > + if (ret < 0) > + goto out; > + ret = usb6fire_fw_fpga_upload(intf, "6fire/dmx6firecf.bin"); > + if (ret < 0) > + goto out; > + memcpy(buffer, ep_w_max_packet_size, > + sizeof(ep_w_max_packet_size)); > + ret = usb6fire_fw_ezusb_upload(intf, "6fire/dmx6fireap.ihx", > + 0x0003, buffer, sizeof(ep_w_max_packet_size)); > + if (ret >= 0) > + ret = FW_NOT_READY; > + goto out; > + } > + /* all fw loaded? */ > + if (buffer[3] == 3) { > + ret = usb6fire_fw_check(intf, buffer + 4); > + goto out; > + } > } > - return 0; > + dev_err(&intf->dev, > + "unknown device firmware state received from device: "); > + for (i = 0; i < 8; i++) > + printk(KERN_CONT "%02x ", buffer[i]); > + printk(KERN_CONT "\n"); > + ret = -EIO; > + > +out: kfree(buffer); > + return ret; Erm, please don't change the code so much. You need to replace *only* the buffer allocation / free and the error path using goto instead of the direct return. If you need to modify other code, do it in another patch. In that way, it'll be clearer what each change means. thanks, Takashi