hc
2023-03-21 4b55d97acc464242bcd6a8ae77b8ff37c22dec58
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
// SPDX-License-Identifier: GPL-2.0
/*
 * Wire Adapter Host Controller Driver
 * Common items to HWA and DWA based HCDs
 *
 * Copyright (C) 2005-2006 Intel Corporation
 * Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com>
 *
 * FIXME: docs
 */
#include <linux/slab.h>
#include <linux/module.h>
#include "wusbhc.h"
#include "wa-hc.h"
 
/**
 * Assumes
 *
 * wa->usb_dev and wa->usb_iface initialized and refcounted,
 * wa->wa_descr initialized.
 */
int wa_create(struct wahc *wa, struct usb_interface *iface,
   kernel_ulong_t quirks)
{
   int result;
   struct device *dev = &iface->dev;
 
   if (iface->cur_altsetting->desc.bNumEndpoints < 3)
       return -ENODEV;
 
   result = wa_rpipes_create(wa);
   if (result < 0)
       goto error_rpipes_create;
   wa->quirks = quirks;
   /* Fill up Data Transfer EP pointers */
   wa->dti_epd = &iface->cur_altsetting->endpoint[1].desc;
   wa->dto_epd = &iface->cur_altsetting->endpoint[2].desc;
   wa->dti_buf_size = usb_endpoint_maxp(wa->dti_epd);
   wa->dti_buf = kmalloc(wa->dti_buf_size, GFP_KERNEL);
   if (wa->dti_buf == NULL) {
       result = -ENOMEM;
       goto error_dti_buf_alloc;
   }
   result = wa_nep_create(wa, iface);
   if (result < 0) {
       dev_err(dev, "WA-CDS: can't initialize notif endpoint: %d\n",
           result);
       goto error_nep_create;
   }
   return 0;
 
error_nep_create:
   kfree(wa->dti_buf);
error_dti_buf_alloc:
   wa_rpipes_destroy(wa);
error_rpipes_create:
   return result;
}
EXPORT_SYMBOL_GPL(wa_create);
 
 
void __wa_destroy(struct wahc *wa)
{
   if (wa->dti_urb) {
       usb_kill_urb(wa->dti_urb);
       usb_put_urb(wa->dti_urb);
   }
   kfree(wa->dti_buf);
   wa_nep_destroy(wa);
   wa_rpipes_destroy(wa);
}
EXPORT_SYMBOL_GPL(__wa_destroy);
 
/**
 * wa_reset_all - reset the WA device
 * @wa: the WA to be reset
 *
 * For HWAs the radio controller and all other PALs are also reset.
 */
void wa_reset_all(struct wahc *wa)
{
   /* FIXME: assuming HWA. */
   wusbhc_reset_all(wa->wusb);
}
 
MODULE_AUTHOR("Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com>");
MODULE_DESCRIPTION("Wireless USB Wire Adapter core");
MODULE_LICENSE("GPL");