diff options
author | Ming Lei <ming.lei@canonical.com> | 2012-10-24 15:46:57 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-10-26 03:36:50 -0400 |
commit | 24b1042c4eb20980a689a0440590a61a0842021f (patch) | |
tree | d3bfbf46a340cf209fbc1915f122bb513aba2d1e /drivers/net/usb/dm9601.c | |
parent | 90b8b037f72d482bc8b95c2bbf8aa47d712ee9fb (diff) |
usbnet: dm9601: apply introduced usb command APIs
Acked-by: Oliver Neukum <oneukum@suse.de>
Signed-off-by: Ming Lei <ming.lei@canonical.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/usb/dm9601.c')
-rw-r--r-- | drivers/net/usb/dm9601.c | 107 |
1 files changed, 15 insertions, 92 deletions
diff --git a/drivers/net/usb/dm9601.c b/drivers/net/usb/dm9601.c index e0433ce6ced7..3f554c1149f3 100644 --- a/drivers/net/usb/dm9601.c +++ b/drivers/net/usb/dm9601.c | |||
@@ -56,27 +56,12 @@ | |||
56 | 56 | ||
57 | static int dm_read(struct usbnet *dev, u8 reg, u16 length, void *data) | 57 | static int dm_read(struct usbnet *dev, u8 reg, u16 length, void *data) |
58 | { | 58 | { |
59 | void *buf; | 59 | int err; |
60 | int err = -ENOMEM; | 60 | err = usbnet_read_cmd(dev, DM_READ_REGS, |
61 | 61 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | |
62 | netdev_dbg(dev->net, "dm_read() reg=0x%02x length=%d\n", reg, length); | 62 | 0, reg, data, length); |
63 | 63 | if(err != length && err >= 0) | |
64 | buf = kmalloc(length, GFP_KERNEL); | ||
65 | if (!buf) | ||
66 | goto out; | ||
67 | |||
68 | err = usb_control_msg(dev->udev, | ||
69 | usb_rcvctrlpipe(dev->udev, 0), | ||
70 | DM_READ_REGS, | ||
71 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | ||
72 | 0, reg, buf, length, USB_CTRL_SET_TIMEOUT); | ||
73 | if (err == length) | ||
74 | memcpy(data, buf, length); | ||
75 | else if (err >= 0) | ||
76 | err = -EINVAL; | 64 | err = -EINVAL; |
77 | kfree(buf); | ||
78 | |||
79 | out: | ||
80 | return err; | 65 | return err; |
81 | } | 66 | } |
82 | 67 | ||
@@ -87,91 +72,29 @@ static int dm_read_reg(struct usbnet *dev, u8 reg, u8 *value) | |||
87 | 72 | ||
88 | static int dm_write(struct usbnet *dev, u8 reg, u16 length, void *data) | 73 | static int dm_write(struct usbnet *dev, u8 reg, u16 length, void *data) |
89 | { | 74 | { |
90 | void *buf = NULL; | 75 | int err; |
91 | int err = -ENOMEM; | 76 | err = usbnet_write_cmd(dev, DM_WRITE_REGS, |
92 | 77 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | |
93 | netdev_dbg(dev->net, "dm_write() reg=0x%02x, length=%d\n", reg, length); | 78 | 0, reg, data, length); |
94 | 79 | ||
95 | if (data) { | ||
96 | buf = kmemdup(data, length, GFP_KERNEL); | ||
97 | if (!buf) | ||
98 | goto out; | ||
99 | } | ||
100 | |||
101 | err = usb_control_msg(dev->udev, | ||
102 | usb_sndctrlpipe(dev->udev, 0), | ||
103 | DM_WRITE_REGS, | ||
104 | USB_DIR_OUT | USB_TYPE_VENDOR |USB_RECIP_DEVICE, | ||
105 | 0, reg, buf, length, USB_CTRL_SET_TIMEOUT); | ||
106 | kfree(buf); | ||
107 | if (err >= 0 && err < length) | 80 | if (err >= 0 && err < length) |
108 | err = -EINVAL; | 81 | err = -EINVAL; |
109 | out: | ||
110 | return err; | 82 | return err; |
111 | } | 83 | } |
112 | 84 | ||
113 | static int dm_write_reg(struct usbnet *dev, u8 reg, u8 value) | 85 | static int dm_write_reg(struct usbnet *dev, u8 reg, u8 value) |
114 | { | 86 | { |
115 | netdev_dbg(dev->net, "dm_write_reg() reg=0x%02x, value=0x%02x\n", | 87 | return usbnet_write_cmd(dev, DM_WRITE_REGS, |
116 | reg, value); | 88 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
117 | return usb_control_msg(dev->udev, | 89 | value, reg, NULL, 0); |
118 | usb_sndctrlpipe(dev->udev, 0), | ||
119 | DM_WRITE_REG, | ||
120 | USB_DIR_OUT | USB_TYPE_VENDOR |USB_RECIP_DEVICE, | ||
121 | value, reg, NULL, 0, USB_CTRL_SET_TIMEOUT); | ||
122 | } | ||
123 | |||
124 | static void dm_write_async_callback(struct urb *urb) | ||
125 | { | ||
126 | struct usb_ctrlrequest *req = (struct usb_ctrlrequest *)urb->context; | ||
127 | int status = urb->status; | ||
128 | |||
129 | if (status < 0) | ||
130 | printk(KERN_DEBUG "dm_write_async_callback() failed with %d\n", | ||
131 | status); | ||
132 | |||
133 | kfree(req); | ||
134 | usb_free_urb(urb); | ||
135 | } | 90 | } |
136 | 91 | ||
137 | static void dm_write_async_helper(struct usbnet *dev, u8 reg, u8 value, | 92 | static void dm_write_async_helper(struct usbnet *dev, u8 reg, u8 value, |
138 | u16 length, void *data) | 93 | u16 length, void *data) |
139 | { | 94 | { |
140 | struct usb_ctrlrequest *req; | 95 | usbnet_write_cmd_async(dev, DM_WRITE_REGS, |
141 | struct urb *urb; | 96 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
142 | int status; | 97 | value, reg, data, length); |
143 | |||
144 | urb = usb_alloc_urb(0, GFP_ATOMIC); | ||
145 | if (!urb) { | ||
146 | netdev_err(dev->net, "Error allocating URB in dm_write_async_helper!\n"); | ||
147 | return; | ||
148 | } | ||
149 | |||
150 | req = kmalloc(sizeof(struct usb_ctrlrequest), GFP_ATOMIC); | ||
151 | if (!req) { | ||
152 | netdev_err(dev->net, "Failed to allocate memory for control request\n"); | ||
153 | usb_free_urb(urb); | ||
154 | return; | ||
155 | } | ||
156 | |||
157 | req->bRequestType = USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE; | ||
158 | req->bRequest = length ? DM_WRITE_REGS : DM_WRITE_REG; | ||
159 | req->wValue = cpu_to_le16(value); | ||
160 | req->wIndex = cpu_to_le16(reg); | ||
161 | req->wLength = cpu_to_le16(length); | ||
162 | |||
163 | usb_fill_control_urb(urb, dev->udev, | ||
164 | usb_sndctrlpipe(dev->udev, 0), | ||
165 | (void *)req, data, length, | ||
166 | dm_write_async_callback, req); | ||
167 | |||
168 | status = usb_submit_urb(urb, GFP_ATOMIC); | ||
169 | if (status < 0) { | ||
170 | netdev_err(dev->net, "Error submitting the control message: status=%d\n", | ||
171 | status); | ||
172 | kfree(req); | ||
173 | usb_free_urb(urb); | ||
174 | } | ||
175 | } | 98 | } |
176 | 99 | ||
177 | static void dm_write_async(struct usbnet *dev, u8 reg, u16 length, void *data) | 100 | static void dm_write_async(struct usbnet *dev, u8 reg, u16 length, void *data) |