]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blob - drivers/uwb/i1480/i1480u-wlp/lc.c
HID: split picolcd's operation_mode sysfs attribute
[mirror_ubuntu-bionic-kernel.git] / drivers / uwb / i1480 / i1480u-wlp / lc.c
1 /*
2 * WUSB Wire Adapter: WLP interface
3 * Driver for the Linux Network stack.
4 *
5 * Copyright (C) 2005-2006 Intel Corporation
6 * Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com>
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License version
10 * 2 as published by the Free Software Foundation.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20 * 02110-1301, USA.
21 *
22 *
23 * FIXME: docs
24 *
25 * This implements a very simple network driver for the WLP USB
26 * device that is associated to a UWB (Ultra Wide Band) host.
27 *
28 * This is seen as an interface of a composite device. Once the UWB
29 * host has an association to another WLP capable device, the
30 * networking interface (aka WLP) can start to send packets back and
31 * forth.
32 *
33 * Limitations:
34 *
35 * - Hand cranked; can't ifup the interface until there is an association
36 *
37 * - BW allocation very simplistic [see i1480u_mas_set() and callees].
38 *
39 *
40 * ROADMAP:
41 *
42 * ENTRY POINTS (driver model):
43 *
44 * i1480u_driver_{exit,init}(): initialization of the driver.
45 *
46 * i1480u_probe(): called by the driver code when a device
47 * matching 'i1480u_id_table' is connected.
48 *
49 * This allocs a netdev instance, inits with
50 * i1480u_add(), then registers_netdev().
51 * i1480u_init()
52 * i1480u_add()
53 *
54 * i1480u_disconnect(): device has been disconnected/module
55 * is being removed.
56 * i1480u_rm()
57 */
58 #include <linux/if_arp.h>
59 #include <linux/etherdevice.h>
60
61 #include "i1480u-wlp.h"
62
63
64
65 static inline
66 void i1480u_init(struct i1480u *i1480u)
67 {
68 /* nothing so far... doesn't it suck? */
69 spin_lock_init(&i1480u->lock);
70 INIT_LIST_HEAD(&i1480u->tx_list);
71 spin_lock_init(&i1480u->tx_list_lock);
72 wlp_options_init(&i1480u->options);
73 edc_init(&i1480u->tx_errors);
74 edc_init(&i1480u->rx_errors);
75 #ifdef i1480u_FLOW_CONTROL
76 edc_init(&i1480u->notif_edc);
77 #endif
78 stats_init(&i1480u->lqe_stats);
79 stats_init(&i1480u->rssi_stats);
80 wlp_init(&i1480u->wlp);
81 }
82
83 /**
84 * Fill WLP device information structure
85 *
86 * The structure will contain a few character arrays, each ending with a
87 * null terminated string. Each string has to fit (excluding terminating
88 * character) into a specified range obtained from the WLP substack.
89 *
90 * It is still not clear exactly how this device information should be
91 * obtained. Until we find out we use the USB device descriptor as backup, some
92 * information elements have intuitive mappings, other not.
93 */
94 static
95 void i1480u_fill_device_info(struct wlp *wlp, struct wlp_device_info *dev_info)
96 {
97 struct i1480u *i1480u = container_of(wlp, struct i1480u, wlp);
98 struct usb_device *usb_dev = i1480u->usb_dev;
99 /* Treat device name and model name the same */
100 if (usb_dev->descriptor.iProduct) {
101 usb_string(usb_dev, usb_dev->descriptor.iProduct,
102 dev_info->name, sizeof(dev_info->name));
103 usb_string(usb_dev, usb_dev->descriptor.iProduct,
104 dev_info->model_name, sizeof(dev_info->model_name));
105 }
106 if (usb_dev->descriptor.iManufacturer)
107 usb_string(usb_dev, usb_dev->descriptor.iManufacturer,
108 dev_info->manufacturer,
109 sizeof(dev_info->manufacturer));
110 scnprintf(dev_info->model_nr, sizeof(dev_info->model_nr), "%04x",
111 __le16_to_cpu(usb_dev->descriptor.bcdDevice));
112 if (usb_dev->descriptor.iSerialNumber)
113 usb_string(usb_dev, usb_dev->descriptor.iSerialNumber,
114 dev_info->serial, sizeof(dev_info->serial));
115 /* FIXME: where should we obtain category? */
116 dev_info->prim_dev_type.category = cpu_to_le16(WLP_DEV_CAT_OTHER);
117 /* FIXME: Complete OUI and OUIsubdiv attributes */
118 }
119
120 #ifdef i1480u_FLOW_CONTROL
121 /**
122 * Callback for the notification endpoint
123 *
124 * This mostly controls the xon/xoff protocol. In case of hard error,
125 * we stop the queue. If not, we always retry.
126 */
127 static
128 void i1480u_notif_cb(struct urb *urb, struct pt_regs *regs)
129 {
130 struct i1480u *i1480u = urb->context;
131 struct usb_interface *usb_iface = i1480u->usb_iface;
132 struct device *dev = &usb_iface->dev;
133 int result;
134
135 switch (urb->status) {
136 case 0: /* Got valid data, do xon/xoff */
137 switch (i1480u->notif_buffer[0]) {
138 case 'N':
139 dev_err(dev, "XOFF STOPPING queue at %lu\n", jiffies);
140 netif_stop_queue(i1480u->net_dev);
141 break;
142 case 'A':
143 dev_err(dev, "XON STARTING queue at %lu\n", jiffies);
144 netif_start_queue(i1480u->net_dev);
145 break;
146 default:
147 dev_err(dev, "NEP: unknown data 0x%02hhx\n",
148 i1480u->notif_buffer[0]);
149 }
150 break;
151 case -ECONNRESET: /* Controlled situation ... */
152 case -ENOENT: /* we killed the URB... */
153 dev_err(dev, "NEP: URB reset/noent %d\n", urb->status);
154 goto error;
155 case -ESHUTDOWN: /* going away! */
156 dev_err(dev, "NEP: URB down %d\n", urb->status);
157 goto error;
158 default: /* Retry unless it gets ugly */
159 if (edc_inc(&i1480u->notif_edc, EDC_MAX_ERRORS,
160 EDC_ERROR_TIMEFRAME)) {
161 dev_err(dev, "NEP: URB max acceptable errors "
162 "exceeded; resetting device\n");
163 goto error_reset;
164 }
165 dev_err(dev, "NEP: URB error %d\n", urb->status);
166 break;
167 }
168 result = usb_submit_urb(urb, GFP_ATOMIC);
169 if (result < 0) {
170 dev_err(dev, "NEP: Can't resubmit URB: %d; resetting device\n",
171 result);
172 goto error_reset;
173 }
174 return;
175
176 error_reset:
177 wlp_reset_all(&i1480-wlp);
178 error:
179 netif_stop_queue(i1480u->net_dev);
180 return;
181 }
182 #endif
183
184 static const struct net_device_ops i1480u_netdev_ops = {
185 .ndo_open = i1480u_open,
186 .ndo_stop = i1480u_stop,
187 .ndo_start_xmit = i1480u_hard_start_xmit,
188 .ndo_tx_timeout = i1480u_tx_timeout,
189 .ndo_set_config = i1480u_set_config,
190 .ndo_change_mtu = i1480u_change_mtu,
191 };
192
193 static
194 int i1480u_add(struct i1480u *i1480u, struct usb_interface *iface)
195 {
196 int result = -ENODEV;
197 struct wlp *wlp = &i1480u->wlp;
198 struct usb_device *usb_dev = interface_to_usbdev(iface);
199 struct net_device *net_dev = i1480u->net_dev;
200 struct uwb_rc *rc;
201 struct uwb_dev *uwb_dev;
202 #ifdef i1480u_FLOW_CONTROL
203 struct usb_endpoint_descriptor *epd;
204 #endif
205
206 i1480u->usb_dev = usb_get_dev(usb_dev);
207 i1480u->usb_iface = iface;
208 rc = uwb_rc_get_by_grandpa(&i1480u->usb_dev->dev);
209 if (rc == NULL) {
210 dev_err(&iface->dev, "Cannot get associated UWB Radio "
211 "Controller\n");
212 goto out;
213 }
214 wlp->xmit_frame = i1480u_xmit_frame;
215 wlp->fill_device_info = i1480u_fill_device_info;
216 wlp->stop_queue = i1480u_stop_queue;
217 wlp->start_queue = i1480u_start_queue;
218 result = wlp_setup(wlp, rc, net_dev);
219 if (result < 0) {
220 dev_err(&iface->dev, "Cannot setup WLP\n");
221 goto error_wlp_setup;
222 }
223 result = 0;
224 ether_setup(net_dev); /* make it an etherdevice */
225 uwb_dev = &rc->uwb_dev;
226 /* FIXME: hookup address change notifications? */
227
228 memcpy(net_dev->dev_addr, uwb_dev->mac_addr.data,
229 sizeof(net_dev->dev_addr));
230
231 net_dev->hard_header_len = sizeof(struct untd_hdr_cmp)
232 + sizeof(struct wlp_tx_hdr)
233 + WLP_DATA_HLEN
234 + ETH_HLEN;
235 net_dev->mtu = 3500;
236 net_dev->tx_queue_len = 20; /* FIXME: maybe use 1000? */
237
238 /* net_dev->flags &= ~IFF_BROADCAST; FIXME: BUG in firmware */
239 /* FIXME: multicast disabled */
240 net_dev->flags &= ~IFF_MULTICAST;
241 net_dev->features &= ~NETIF_F_SG;
242 net_dev->features &= ~NETIF_F_FRAGLIST;
243 /* All NETIF_F_*_CSUM disabled */
244 net_dev->features |= NETIF_F_HIGHDMA;
245 net_dev->watchdog_timeo = 5*HZ; /* FIXME: a better default? */
246
247 net_dev->netdev_ops = &i1480u_netdev_ops;
248
249 #ifdef i1480u_FLOW_CONTROL
250 /* Notification endpoint setup (submitted when we open the device) */
251 i1480u->notif_urb = usb_alloc_urb(0, GFP_KERNEL);
252 if (i1480u->notif_urb == NULL) {
253 dev_err(&iface->dev, "Unable to allocate notification URB\n");
254 result = -ENOMEM;
255 goto error_urb_alloc;
256 }
257 epd = &iface->cur_altsetting->endpoint[0].desc;
258 usb_fill_int_urb(i1480u->notif_urb, usb_dev,
259 usb_rcvintpipe(usb_dev, epd->bEndpointAddress),
260 i1480u->notif_buffer, sizeof(i1480u->notif_buffer),
261 i1480u_notif_cb, i1480u, epd->bInterval);
262
263 #endif
264
265 i1480u->tx_inflight.max = i1480u_TX_INFLIGHT_MAX;
266 i1480u->tx_inflight.threshold = i1480u_TX_INFLIGHT_THRESHOLD;
267 i1480u->tx_inflight.restart_ts = jiffies;
268 usb_set_intfdata(iface, i1480u);
269 return result;
270
271 #ifdef i1480u_FLOW_CONTROL
272 error_urb_alloc:
273 #endif
274 wlp_remove(wlp);
275 error_wlp_setup:
276 uwb_rc_put(rc);
277 out:
278 usb_put_dev(i1480u->usb_dev);
279 return result;
280 }
281
282 static void i1480u_rm(struct i1480u *i1480u)
283 {
284 struct uwb_rc *rc = i1480u->wlp.rc;
285 usb_set_intfdata(i1480u->usb_iface, NULL);
286 #ifdef i1480u_FLOW_CONTROL
287 usb_kill_urb(i1480u->notif_urb);
288 usb_free_urb(i1480u->notif_urb);
289 #endif
290 wlp_remove(&i1480u->wlp);
291 uwb_rc_put(rc);
292 usb_put_dev(i1480u->usb_dev);
293 }
294
295 /** Just setup @net_dev's i1480u private data */
296 static void i1480u_netdev_setup(struct net_device *net_dev)
297 {
298 struct i1480u *i1480u = netdev_priv(net_dev);
299 /* Initialize @i1480u */
300 memset(i1480u, 0, sizeof(*i1480u));
301 i1480u_init(i1480u);
302 }
303
304 /**
305 * Probe a i1480u interface and register it
306 *
307 * @iface: USB interface to link to
308 * @id: USB class/subclass/protocol id
309 * @returns: 0 if ok, < 0 errno code on error.
310 *
311 * Does basic housekeeping stuff and then allocs a netdev with space
312 * for the i1480u data. Initializes, registers in i1480u, registers in
313 * netdev, ready to go.
314 */
315 static int i1480u_probe(struct usb_interface *iface,
316 const struct usb_device_id *id)
317 {
318 int result;
319 struct net_device *net_dev;
320 struct device *dev = &iface->dev;
321 struct i1480u *i1480u;
322
323 /* Allocate instance [calls i1480u_netdev_setup() on it] */
324 result = -ENOMEM;
325 net_dev = alloc_netdev(sizeof(*i1480u), "wlp%d", i1480u_netdev_setup);
326 if (net_dev == NULL) {
327 dev_err(dev, "no memory for network device instance\n");
328 goto error_alloc_netdev;
329 }
330 SET_NETDEV_DEV(net_dev, dev);
331 i1480u = netdev_priv(net_dev);
332 i1480u->net_dev = net_dev;
333 result = i1480u_add(i1480u, iface); /* Now setup all the wlp stuff */
334 if (result < 0) {
335 dev_err(dev, "cannot add i1480u device: %d\n", result);
336 goto error_i1480u_add;
337 }
338 result = register_netdev(net_dev); /* Okey dokey, bring it up */
339 if (result < 0) {
340 dev_err(dev, "cannot register network device: %d\n", result);
341 goto error_register_netdev;
342 }
343 i1480u_sysfs_setup(i1480u);
344 if (result < 0)
345 goto error_sysfs_init;
346 return 0;
347
348 error_sysfs_init:
349 unregister_netdev(net_dev);
350 error_register_netdev:
351 i1480u_rm(i1480u);
352 error_i1480u_add:
353 free_netdev(net_dev);
354 error_alloc_netdev:
355 return result;
356 }
357
358
359 /**
360 * Disconect a i1480u from the system.
361 *
362 * i1480u_stop() has been called before, so al the rx and tx contexts
363 * have been taken down already. Make sure the queue is stopped,
364 * unregister netdev and i1480u, free and kill.
365 */
366 static void i1480u_disconnect(struct usb_interface *iface)
367 {
368 struct i1480u *i1480u;
369 struct net_device *net_dev;
370
371 i1480u = usb_get_intfdata(iface);
372 net_dev = i1480u->net_dev;
373 netif_stop_queue(net_dev);
374 #ifdef i1480u_FLOW_CONTROL
375 usb_kill_urb(i1480u->notif_urb);
376 #endif
377 i1480u_sysfs_release(i1480u);
378 unregister_netdev(net_dev);
379 i1480u_rm(i1480u);
380 free_netdev(net_dev);
381 }
382
383 static struct usb_device_id i1480u_id_table[] = {
384 {
385 .match_flags = USB_DEVICE_ID_MATCH_DEVICE \
386 | USB_DEVICE_ID_MATCH_DEV_INFO \
387 | USB_DEVICE_ID_MATCH_INT_INFO,
388 .idVendor = 0x8086,
389 .idProduct = 0x0c3b,
390 .bDeviceClass = 0xef,
391 .bDeviceSubClass = 0x02,
392 .bDeviceProtocol = 0x02,
393 .bInterfaceClass = 0xff,
394 .bInterfaceSubClass = 0xff,
395 .bInterfaceProtocol = 0xff,
396 },
397 {},
398 };
399 MODULE_DEVICE_TABLE(usb, i1480u_id_table);
400
401 static struct usb_driver i1480u_driver = {
402 .name = KBUILD_MODNAME,
403 .probe = i1480u_probe,
404 .disconnect = i1480u_disconnect,
405 .id_table = i1480u_id_table,
406 };
407
408 static int __init i1480u_driver_init(void)
409 {
410 return usb_register(&i1480u_driver);
411 }
412 module_init(i1480u_driver_init);
413
414
415 static void __exit i1480u_driver_exit(void)
416 {
417 usb_deregister(&i1480u_driver);
418 }
419 module_exit(i1480u_driver_exit);
420
421 MODULE_AUTHOR("Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com>");
422 MODULE_DESCRIPTION("i1480 Wireless UWB Link WLP networking for USB");
423 MODULE_LICENSE("GPL");