aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/usb
diff options
context:
space:
mode:
authorMing Lei <ming.lei@canonical.com>2012-10-24 15:47:04 -0400
committerDavid S. Miller <davem@davemloft.net>2012-10-26 03:36:52 -0400
commit72108fd26b4bea58762d266d7da6dffa5003648e (patch)
tree68ab71c6440a81e7eddb1c32eccd5d71ecae0c81 /drivers/net/usb
parent2b2e41e37fd313fafed642f0231d18a2493ce433 (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')
-rw-r--r--drivers/net/usb/smsc95xx.c115
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
68struct usb_context {
69 struct usb_ctrlrequest req;
70 struct usbnet *dev;
71};
72
73static bool turbo_mode = true; 68static bool turbo_mode = true;
74module_param(turbo_mode, bool, 0644); 69module_param(turbo_mode, bool, 0644);
75MODULE_PARM_DESC(turbo_mode, "Enable multiple frames per Rx transaction"); 70MODULE_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");
77static int __must_check smsc95xx_read_reg(struct usbnet *dev, u32 index, 72static 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,
103static int __must_check smsc95xx_write_reg(struct usbnet *dev, u32 index, 93static 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
142static int smsc95xx_clear_feature(struct usbnet *dev, u32 feature) 124static 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
353static 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
365static int __must_check smsc95xx_write_reg_async(struct usbnet *dev, u16 index, 332static 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