|
@@ -1611,8 +1611,8 @@ void usbnet_device_suggests_idle(struct usbnet *dev)
|
|
|
EXPORT_SYMBOL(usbnet_device_suggests_idle);
|
|
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
|
-int usbnet_read_cmd(struct usbnet *dev, u8 cmd, u8 reqtype,
|
|
|
- u16 value, u16 index, void *data, u16 size)
|
|
|
+static int __usbnet_read_cmd(struct usbnet *dev, u8 cmd, u8 reqtype,
|
|
|
+ u16 value, u16 index, void *data, u16 size)
|
|
|
{
|
|
|
void *buf = NULL;
|
|
|
int err = -ENOMEM;
|
|
@@ -1636,10 +1636,10 @@ int usbnet_read_cmd(struct usbnet *dev, u8 cmd, u8 reqtype,
|
|
|
out:
|
|
|
return err;
|
|
|
}
|
|
|
-EXPORT_SYMBOL_GPL(usbnet_read_cmd);
|
|
|
|
|
|
-int usbnet_write_cmd(struct usbnet *dev, u8 cmd, u8 reqtype,
|
|
|
- u16 value, u16 index, const void *data, u16 size)
|
|
|
+static int __usbnet_write_cmd(struct usbnet *dev, u8 cmd, u8 reqtype,
|
|
|
+ u16 value, u16 index, const void *data,
|
|
|
+ u16 size)
|
|
|
{
|
|
|
void *buf = NULL;
|
|
|
int err = -ENOMEM;
|
|
@@ -1662,8 +1662,56 @@ int usbnet_write_cmd(struct usbnet *dev, u8 cmd, u8 reqtype,
|
|
|
out:
|
|
|
return err;
|
|
|
}
|
|
|
+
|
|
|
+/*
|
|
|
+ * The function can't be called inside suspend/resume callback,
|
|
|
+ * otherwise deadlock will be caused.
|
|
|
+ */
|
|
|
+int usbnet_read_cmd(struct usbnet *dev, u8 cmd, u8 reqtype,
|
|
|
+ u16 value, u16 index, void *data, u16 size)
|
|
|
+{
|
|
|
+ return __usbnet_read_cmd(dev, cmd, reqtype, value, index,
|
|
|
+ data, size);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(usbnet_read_cmd);
|
|
|
+
|
|
|
+/*
|
|
|
+ * The function can't be called inside suspend/resume callback,
|
|
|
+ * otherwise deadlock will be caused.
|
|
|
+ */
|
|
|
+int usbnet_write_cmd(struct usbnet *dev, u8 cmd, u8 reqtype,
|
|
|
+ u16 value, u16 index, const void *data, u16 size)
|
|
|
+{
|
|
|
+ return __usbnet_write_cmd(dev, cmd, reqtype, value, index,
|
|
|
+ data, size);
|
|
|
+}
|
|
|
EXPORT_SYMBOL_GPL(usbnet_write_cmd);
|
|
|
|
|
|
+/*
|
|
|
+ * The function can be called inside suspend/resume callback safely
|
|
|
+ * and should only be called by suspend/resume callback generally.
|
|
|
+ */
|
|
|
+int usbnet_read_cmd_nopm(struct usbnet *dev, u8 cmd, u8 reqtype,
|
|
|
+ u16 value, u16 index, void *data, u16 size)
|
|
|
+{
|
|
|
+ return __usbnet_read_cmd(dev, cmd, reqtype, value, index,
|
|
|
+ data, size);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(usbnet_read_cmd_nopm);
|
|
|
+
|
|
|
+/*
|
|
|
+ * The function can be called inside suspend/resume callback safely
|
|
|
+ * and should only be called by suspend/resume callback generally.
|
|
|
+ */
|
|
|
+int usbnet_write_cmd_nopm(struct usbnet *dev, u8 cmd, u8 reqtype,
|
|
|
+ u16 value, u16 index, const void *data,
|
|
|
+ u16 size)
|
|
|
+{
|
|
|
+ return __usbnet_write_cmd(dev, cmd, reqtype, value, index,
|
|
|
+ data, size);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(usbnet_write_cmd_nopm);
|
|
|
+
|
|
|
static void usbnet_async_cmd_cb(struct urb *urb)
|
|
|
{
|
|
|
struct usb_ctrlrequest *req = (struct usb_ctrlrequest *)urb->context;
|
|
@@ -1677,6 +1725,10 @@ static void usbnet_async_cmd_cb(struct urb *urb)
|
|
|
usb_free_urb(urb);
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * The caller must make sure that device can't be put into suspend
|
|
|
+ * state until the control URB completes.
|
|
|
+ */
|
|
|
int usbnet_write_cmd_async(struct usbnet *dev, u8 cmd, u8 reqtype,
|
|
|
u16 value, u16 index, const void *data, u16 size)
|
|
|
{
|