usbnet.c (dd84cfff3cc3b79c9d616f85bd1178df135cbd1a) usbnet.c (b55a21b764c1e182014630fa5486d717484ac58f)
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * USB Network driver infrastructure
4 * Copyright (C) 2000-2005 by David Brownell
5 * Copyright (C) 2003-2005 David Hollis <dhollis@davehollis.com>
6 */
7
8/*

--- 1990 unchanged lines hidden (view full) ---

1999 void *buf = NULL;
2000 int err = -ENOMEM;
2001
2002 netdev_dbg(dev->net, "usbnet_read_cmd cmd=0x%02x reqtype=%02x"
2003 " value=0x%04x index=0x%04x size=%d\n",
2004 cmd, reqtype, value, index, size);
2005
2006 if (size) {
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * USB Network driver infrastructure
4 * Copyright (C) 2000-2005 by David Brownell
5 * Copyright (C) 2003-2005 David Hollis <dhollis@davehollis.com>
6 */
7
8/*

--- 1990 unchanged lines hidden (view full) ---

1999 void *buf = NULL;
2000 int err = -ENOMEM;
2001
2002 netdev_dbg(dev->net, "usbnet_read_cmd cmd=0x%02x reqtype=%02x"
2003 " value=0x%04x index=0x%04x size=%d\n",
2004 cmd, reqtype, value, index, size);
2005
2006 if (size) {
2007 buf = kmalloc(size, GFP_KERNEL);
2007 buf = kmalloc(size, GFP_NOIO);
2008 if (!buf)
2009 goto out;
2010 }
2011
2012 err = usb_control_msg(dev->udev, usb_rcvctrlpipe(dev->udev, 0),
2013 cmd, reqtype, value, index, buf, size,
2014 USB_CTRL_GET_TIMEOUT);
2015 if (err > 0 && err <= size) {

--- 15 unchanged lines hidden (view full) ---

2031 void *buf = NULL;
2032 int err = -ENOMEM;
2033
2034 netdev_dbg(dev->net, "usbnet_write_cmd cmd=0x%02x reqtype=%02x"
2035 " value=0x%04x index=0x%04x size=%d\n",
2036 cmd, reqtype, value, index, size);
2037
2038 if (data) {
2008 if (!buf)
2009 goto out;
2010 }
2011
2012 err = usb_control_msg(dev->udev, usb_rcvctrlpipe(dev->udev, 0),
2013 cmd, reqtype, value, index, buf, size,
2014 USB_CTRL_GET_TIMEOUT);
2015 if (err > 0 && err <= size) {

--- 15 unchanged lines hidden (view full) ---

2031 void *buf = NULL;
2032 int err = -ENOMEM;
2033
2034 netdev_dbg(dev->net, "usbnet_write_cmd cmd=0x%02x reqtype=%02x"
2035 " value=0x%04x index=0x%04x size=%d\n",
2036 cmd, reqtype, value, index, size);
2037
2038 if (data) {
2039 buf = kmemdup(data, size, GFP_KERNEL);
2039 buf = kmemdup(data, size, GFP_NOIO);
2040 if (!buf)
2041 goto out;
2042 } else {
2043 if (size) {
2044 WARN_ON_ONCE(1);
2045 err = -EINVAL;
2046 goto out;
2047 }

--- 84 unchanged lines hidden (view full) ---

2132
2133/*
2134 * The caller must make sure that device can't be put into suspend
2135 * state until the control URB completes.
2136 */
2137int usbnet_write_cmd_async(struct usbnet *dev, u8 cmd, u8 reqtype,
2138 u16 value, u16 index, const void *data, u16 size)
2139{
2040 if (!buf)
2041 goto out;
2042 } else {
2043 if (size) {
2044 WARN_ON_ONCE(1);
2045 err = -EINVAL;
2046 goto out;
2047 }

--- 84 unchanged lines hidden (view full) ---

2132
2133/*
2134 * The caller must make sure that device can't be put into suspend
2135 * state until the control URB completes.
2136 */
2137int usbnet_write_cmd_async(struct usbnet *dev, u8 cmd, u8 reqtype,
2138 u16 value, u16 index, const void *data, u16 size)
2139{
2140 struct usb_ctrlrequest *req = NULL;
2140 struct usb_ctrlrequest *req;
2141 struct urb *urb;
2142 int err = -ENOMEM;
2143 void *buf = NULL;
2144
2145 netdev_dbg(dev->net, "usbnet_write_cmd cmd=0x%02x reqtype=%02x"
2146 " value=0x%04x index=0x%04x size=%d\n",
2147 cmd, reqtype, value, index, size);
2148
2149 urb = usb_alloc_urb(0, GFP_ATOMIC);
2150 if (!urb)
2151 goto fail;
2152
2153 if (data) {
2154 buf = kmemdup(data, size, GFP_ATOMIC);
2155 if (!buf) {
2156 netdev_err(dev->net, "Error allocating buffer"
2157 " in %s!\n", __func__);
2141 struct urb *urb;
2142 int err = -ENOMEM;
2143 void *buf = NULL;
2144
2145 netdev_dbg(dev->net, "usbnet_write_cmd cmd=0x%02x reqtype=%02x"
2146 " value=0x%04x index=0x%04x size=%d\n",
2147 cmd, reqtype, value, index, size);
2148
2149 urb = usb_alloc_urb(0, GFP_ATOMIC);
2150 if (!urb)
2151 goto fail;
2152
2153 if (data) {
2154 buf = kmemdup(data, size, GFP_ATOMIC);
2155 if (!buf) {
2156 netdev_err(dev->net, "Error allocating buffer"
2157 " in %s!\n", __func__);
2158 goto fail_free;
2158 goto fail_free_urb;
2159 }
2160 }
2161
2162 req = kmalloc(sizeof(struct usb_ctrlrequest), GFP_ATOMIC);
2163 if (!req)
2164 goto fail_free_buf;
2165
2166 req->bRequestType = reqtype;

--- 7 unchanged lines hidden (view full) ---

2174 (void *)req, buf, size,
2175 usbnet_async_cmd_cb, req);
2176 urb->transfer_flags |= URB_FREE_BUFFER;
2177
2178 err = usb_submit_urb(urb, GFP_ATOMIC);
2179 if (err < 0) {
2180 netdev_err(dev->net, "Error submitting the control"
2181 " message: status=%d\n", err);
2159 }
2160 }
2161
2162 req = kmalloc(sizeof(struct usb_ctrlrequest), GFP_ATOMIC);
2163 if (!req)
2164 goto fail_free_buf;
2165
2166 req->bRequestType = reqtype;

--- 7 unchanged lines hidden (view full) ---

2174 (void *)req, buf, size,
2175 usbnet_async_cmd_cb, req);
2176 urb->transfer_flags |= URB_FREE_BUFFER;
2177
2178 err = usb_submit_urb(urb, GFP_ATOMIC);
2179 if (err < 0) {
2180 netdev_err(dev->net, "Error submitting the control"
2181 " message: status=%d\n", err);
2182 goto fail_free;
2182 goto fail_free_all;
2183 }
2184 return 0;
2185
2183 }
2184 return 0;
2185
2186fail_free_all:
2187 kfree(req);
2186fail_free_buf:
2187 kfree(buf);
2188fail_free_buf:
2189 kfree(buf);
2188fail_free:
2189 kfree(req);
2190 /*
2191 * avoid a double free
2192 * needed because the flag can be set only
2193 * after filling the URB
2194 */
2195 urb->transfer_flags = 0;
2196fail_free_urb:
2190 usb_free_urb(urb);
2191fail:
2192 return err;
2193
2194}
2195EXPORT_SYMBOL_GPL(usbnet_write_cmd_async);
2196/*-------------------------------------------------------------------------*/
2197

--- 19 unchanged lines hidden ---
2197 usb_free_urb(urb);
2198fail:
2199 return err;
2200
2201}
2202EXPORT_SYMBOL_GPL(usbnet_write_cmd_async);
2203/*-------------------------------------------------------------------------*/
2204

--- 19 unchanged lines hidden ---