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