diff options
author | Ming Lei <ming.lei@canonical.com> | 2012-10-24 15:47:04 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-10-26 03:36:52 -0400 |
commit | 72108fd26b4bea58762d266d7da6dffa5003648e (patch) | |
tree | 68ab71c6440a81e7eddb1c32eccd5d71ecae0c81 /drivers/net/usb/smsc95xx.c | |
parent | 2b2e41e37fd313fafed642f0231d18a2493ce433 (diff) |
usbnet: smsc95xx: 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/smsc95xx.c')
-rw-r--r-- | drivers/net/usb/smsc95xx.c | 115 |
1 files changed, 27 insertions, 88 deletions
diff --git a/drivers/net/usb/smsc95xx.c b/drivers/net/usb/smsc95xx.c index 7479a5761d0d..1730f753d062 100644 --- a/drivers/net/usb/smsc95xx.c +++ b/drivers/net/usb/smsc95xx.c | |||
@@ -65,11 +65,6 @@ struct smsc95xx_priv { | |||
65 | spinlock_t mac_cr_lock; | 65 | spinlock_t mac_cr_lock; |
66 | }; | 66 | }; |
67 | 67 | ||
68 | struct usb_context { | ||
69 | struct usb_ctrlrequest req; | ||
70 | struct usbnet *dev; | ||
71 | }; | ||
72 | |||
73 | static bool turbo_mode = true; | 68 | static bool turbo_mode = true; |
74 | module_param(turbo_mode, bool, 0644); | 69 | module_param(turbo_mode, bool, 0644); |
75 | MODULE_PARM_DESC(turbo_mode, "Enable multiple frames per Rx transaction"); | 70 | MODULE_PARM_DESC(turbo_mode, "Enable multiple frames per Rx transaction"); |
@@ -77,25 +72,20 @@ MODULE_PARM_DESC(turbo_mode, "Enable multiple frames per Rx transaction"); | |||
77 | static int __must_check smsc95xx_read_reg(struct usbnet *dev, u32 index, | 72 | static int __must_check smsc95xx_read_reg(struct usbnet *dev, u32 index, |
78 | u32 *data) | 73 | u32 *data) |
79 | { | 74 | { |
80 | u32 *buf = kmalloc(4, GFP_KERNEL); | 75 | u32 buf; |
81 | int ret; | 76 | int ret; |
82 | 77 | ||
83 | BUG_ON(!dev); | 78 | BUG_ON(!dev); |
84 | 79 | ||
85 | if (!buf) | 80 | ret = usbnet_read_cmd(dev, USB_VENDOR_REQUEST_READ_REGISTER, |
86 | return -ENOMEM; | 81 | USB_DIR_IN | USB_TYPE_VENDOR | |
87 | 82 | USB_RECIP_DEVICE, | |
88 | ret = usb_control_msg(dev->udev, usb_rcvctrlpipe(dev->udev, 0), | 83 | 0, index, &buf, 4); |
89 | USB_VENDOR_REQUEST_READ_REGISTER, | ||
90 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | ||
91 | 00, index, buf, 4, USB_CTRL_GET_TIMEOUT); | ||
92 | |||
93 | if (unlikely(ret < 0)) | 84 | if (unlikely(ret < 0)) |
94 | netdev_warn(dev->net, "Failed to read register index 0x%08x\n", index); | 85 | netdev_warn(dev->net, "Failed to read register index 0x%08x\n", index); |
95 | 86 | ||
96 | le32_to_cpus(buf); | 87 | le32_to_cpus(&buf); |
97 | *data = *buf; | 88 | *data = buf; |
98 | kfree(buf); | ||
99 | 89 | ||
100 | return ret; | 90 | return ret; |
101 | } | 91 | } |
@@ -103,27 +93,22 @@ static int __must_check smsc95xx_read_reg(struct usbnet *dev, u32 index, | |||
103 | static int __must_check smsc95xx_write_reg(struct usbnet *dev, u32 index, | 93 | static int __must_check smsc95xx_write_reg(struct usbnet *dev, u32 index, |
104 | u32 data) | 94 | u32 data) |
105 | { | 95 | { |
106 | u32 *buf = kmalloc(4, GFP_KERNEL); | 96 | u32 buf; |
107 | int ret; | 97 | int ret; |
108 | 98 | ||
109 | BUG_ON(!dev); | 99 | BUG_ON(!dev); |
110 | 100 | ||
111 | if (!buf) | 101 | buf = data; |
112 | return -ENOMEM; | 102 | cpu_to_le32s(&buf); |
113 | |||
114 | *buf = data; | ||
115 | cpu_to_le32s(buf); | ||
116 | 103 | ||
117 | ret = usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, 0), | ||
118 | USB_VENDOR_REQUEST_WRITE_REGISTER, | ||
119 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | ||
120 | 00, index, buf, 4, USB_CTRL_SET_TIMEOUT); | ||
121 | 104 | ||
105 | ret = usbnet_write_cmd(dev, USB_VENDOR_REQUEST_WRITE_REGISTER, | ||
106 | USB_DIR_OUT | USB_TYPE_VENDOR | | ||
107 | USB_RECIP_DEVICE, | ||
108 | 0, index, &buf, 4); | ||
122 | if (unlikely(ret < 0)) | 109 | if (unlikely(ret < 0)) |
123 | netdev_warn(dev->net, "Failed to write register index 0x%08x\n", index); | 110 | netdev_warn(dev->net, "Failed to write register index 0x%08x\n", index); |
124 | 111 | ||
125 | kfree(buf); | ||
126 | |||
127 | return ret; | 112 | return ret; |
128 | } | 113 | } |
129 | 114 | ||
@@ -132,11 +117,8 @@ static int smsc95xx_set_feature(struct usbnet *dev, u32 feature) | |||
132 | if (WARN_ON_ONCE(!dev)) | 117 | if (WARN_ON_ONCE(!dev)) |
133 | return -EINVAL; | 118 | return -EINVAL; |
134 | 119 | ||
135 | cpu_to_le32s(&feature); | 120 | return usbnet_write_cmd(dev, USB_REQ_SET_FEATURE, |
136 | 121 | USB_RECIP_DEVICE, feature, 0, NULL, 0); | |
137 | return usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, 0), | ||
138 | USB_REQ_SET_FEATURE, USB_RECIP_DEVICE, feature, 0, NULL, 0, | ||
139 | USB_CTRL_SET_TIMEOUT); | ||
140 | } | 122 | } |
141 | 123 | ||
142 | static int smsc95xx_clear_feature(struct usbnet *dev, u32 feature) | 124 | static int smsc95xx_clear_feature(struct usbnet *dev, u32 feature) |
@@ -144,11 +126,8 @@ static int smsc95xx_clear_feature(struct usbnet *dev, u32 feature) | |||
144 | if (WARN_ON_ONCE(!dev)) | 126 | if (WARN_ON_ONCE(!dev)) |
145 | return -EINVAL; | 127 | return -EINVAL; |
146 | 128 | ||
147 | cpu_to_le32s(&feature); | 129 | return usbnet_write_cmd(dev, USB_REQ_CLEAR_FEATURE, |
148 | 130 | USB_RECIP_DEVICE, feature, 0, NULL, 0); | |
149 | return usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, 0), | ||
150 | USB_REQ_CLEAR_FEATURE, USB_RECIP_DEVICE, feature, 0, NULL, 0, | ||
151 | USB_CTRL_SET_TIMEOUT); | ||
152 | } | 131 | } |
153 | 132 | ||
154 | /* Loop until the read is completed with timeout | 133 | /* Loop until the read is completed with timeout |
@@ -350,60 +329,20 @@ static int smsc95xx_write_eeprom(struct usbnet *dev, u32 offset, u32 length, | |||
350 | return 0; | 329 | return 0; |
351 | } | 330 | } |
352 | 331 | ||
353 | static void smsc95xx_async_cmd_callback(struct urb *urb) | ||
354 | { | ||
355 | struct usb_context *usb_context = urb->context; | ||
356 | struct usbnet *dev = usb_context->dev; | ||
357 | int status = urb->status; | ||
358 | |||
359 | check_warn(status, "async callback failed with %d\n", status); | ||
360 | |||
361 | kfree(usb_context); | ||
362 | usb_free_urb(urb); | ||
363 | } | ||
364 | |||
365 | static int __must_check smsc95xx_write_reg_async(struct usbnet *dev, u16 index, | 332 | static int __must_check smsc95xx_write_reg_async(struct usbnet *dev, u16 index, |
366 | u32 *data) | 333 | u32 *data) |
367 | { | 334 | { |
368 | struct usb_context *usb_context; | ||
369 | int status; | ||
370 | struct urb *urb; | ||
371 | const u16 size = 4; | 335 | const u16 size = 4; |
336 | int ret; | ||
372 | 337 | ||
373 | urb = usb_alloc_urb(0, GFP_ATOMIC); | 338 | ret = usbnet_write_cmd_async(dev, USB_VENDOR_REQUEST_WRITE_REGISTER, |
374 | if (!urb) { | 339 | USB_DIR_OUT | USB_TYPE_VENDOR | |
375 | netdev_warn(dev->net, "Error allocating URB\n"); | 340 | USB_RECIP_DEVICE, |
376 | return -ENOMEM; | 341 | 0, index, data, size); |
377 | } | 342 | if (ret < 0) |
378 | 343 | netdev_warn(dev->net, "Error write async cmd, sts=%d\n", | |
379 | usb_context = kmalloc(sizeof(struct usb_context), GFP_ATOMIC); | 344 | ret); |
380 | if (usb_context == NULL) { | 345 | return ret; |
381 | netdev_warn(dev->net, "Error allocating control msg\n"); | ||
382 | usb_free_urb(urb); | ||
383 | return -ENOMEM; | ||
384 | } | ||
385 | |||
386 | usb_context->req.bRequestType = | ||
387 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE; | ||
388 | usb_context->req.bRequest = USB_VENDOR_REQUEST_WRITE_REGISTER; | ||
389 | usb_context->req.wValue = 00; | ||
390 | usb_context->req.wIndex = cpu_to_le16(index); | ||
391 | usb_context->req.wLength = cpu_to_le16(size); | ||
392 | |||
393 | usb_fill_control_urb(urb, dev->udev, usb_sndctrlpipe(dev->udev, 0), | ||
394 | (void *)&usb_context->req, data, size, | ||
395 | smsc95xx_async_cmd_callback, | ||
396 | (void *)usb_context); | ||
397 | |||
398 | status = usb_submit_urb(urb, GFP_ATOMIC); | ||
399 | if (status < 0) { | ||
400 | netdev_warn(dev->net, "Error submitting control msg, sts=%d\n", | ||
401 | status); | ||
402 | kfree(usb_context); | ||
403 | usb_free_urb(urb); | ||
404 | } | ||
405 | |||
406 | return status; | ||
407 | } | 346 | } |
408 | 347 | ||
409 | /* returns hash bit number for given MAC address | 348 | /* returns hash bit number for given MAC address |