1 /* Copyright (c) 2011-2012, Code Aurora Forum. All rights reserved.
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
13 #include <linux/kernel.h>
14 #include <linux/errno.h>
15 #include <linux/init.h>
16 #include <linux/slab.h>
17 #include <linux/module.h>
18 #include <linux/kref.h>
19 #include <linux/debugfs.h>
20 #include <linux/platform_device.h>
21 #include <linux/uaccess.h>
22 #include <linux/ratelimit.h>
23 #include <linux/usb/ch9.h>
24 #include <linux/usb/cdc.h>
25 #include <linux/termios.h>
26 #include <asm/unaligned.h>
27 #include <mach/usb_bridge.h>
28 #include <linux/mdm_hsic_pm.h>
30 static const char const *ctrl_bridge_names[] = {
35 /* polling interval for Interrupt ep */
37 #define FS_LS_INTERVAL 3
39 #define ACM_CTRL_DTR (1 << 0)
40 #define DEFAULT_READ_URB_LENGTH 4096
42 #define SUSPENDED BIT(0)
45 struct usb_device *udev;
46 struct usb_interface *intf;
48 unsigned int int_pipe;
55 struct usb_anchor tx_submitted;
56 struct usb_anchor tx_deferred;
57 struct usb_ctrlrequest *in_ctlreq;
60 struct platform_device *pdev;
64 /* input control lines (DSR, CTS, CD, RI) */
65 unsigned int cbits_tohost;
67 /* output control lines (DTR, RTS) */
68 unsigned int cbits_tomdm;
71 unsigned int snd_encap_cmd;
72 unsigned int get_encap_res;
73 unsigned int resp_avail;
74 unsigned int set_ctrl_line_sts;
75 unsigned int notify_ser_state;
78 static struct ctrl_bridge *__dev[MAX_BRIDGE_DEVICES];
80 /* counter used for indexing ctrl bridge devices */
83 unsigned int ctrl_bridge_get_cbits_tohost(unsigned int id)
85 struct ctrl_bridge *dev;
87 if (id >= MAX_BRIDGE_DEVICES)
94 return dev->cbits_tohost;
96 EXPORT_SYMBOL(ctrl_bridge_get_cbits_tohost);
98 int ctrl_bridge_set_cbits(unsigned int id, unsigned int cbits)
100 struct ctrl_bridge *dev;
104 if (id >= MAX_BRIDGE_DEVICES)
111 pr_debug("%s: dev[id] =%u cbits : %u\n", __func__, id, cbits);
117 dev->cbits_tomdm = cbits;
119 retval = ctrl_bridge_write(id, NULL, 0);
121 /* if DTR is high, update latest modem info to host */
122 if (brdg && (cbits & ACM_CTRL_DTR) && brdg->ops.send_cbits)
123 brdg->ops.send_cbits(brdg->ctx, dev->cbits_tohost);
127 EXPORT_SYMBOL(ctrl_bridge_set_cbits);
129 static void resp_avail_cb(struct urb *urb)
131 struct ctrl_bridge *dev = urb->context;
132 struct usb_device *udev;
134 int resubmit_urb = 1;
135 struct bridge *brdg = dev->brdg;
136 unsigned int iface_num;
138 udev = interface_to_usbdev(dev->intf);
139 iface_num = dev->intf->cur_altsetting->desc.bInterfaceNumber;
141 switch (urb->status) {
145 dev->get_encap_res++;
146 pr_info("[RACB:%d]<\n", iface_num);
147 if (brdg && brdg->ops.send_pkt)
148 brdg->ops.send_pkt(brdg->ctx, urb->transfer_buffer,
162 dev_dbg(&udev->dev, "%s: non zero urb status = %d\n",
163 __func__, urb->status);
166 if (urb->status != -ENOENT && resubmit_urb) {
167 /*re- submit int urb to check response available*/
168 status = usb_submit_urb(dev->inturb, GFP_ATOMIC);
171 "%s: Error re-submitting Int URB %d\n",
174 pr_info("[CHKRA:%d]>\n", iface_num);
178 static void notification_available_cb(struct urb *urb)
181 struct usb_cdc_notification *ctrl;
182 struct usb_device *udev;
183 struct ctrl_bridge *dev = urb->context;
184 struct bridge *brdg = dev->brdg;
185 unsigned int ctrl_bits;
187 unsigned int iface_num;
189 /* if this intf is already disconnected, this urb free-ed before
190 * calling from qh_completions. just return and do nothing */
194 udev = interface_to_usbdev(dev->intf);
195 iface_num = dev->intf->cur_altsetting->desc.bInterfaceNumber;
197 switch (urb->status) {
199 pr_info("[NACB:%d]<\n", iface_num);
209 dev_err(&udev->dev, "%s: stall on int endpoint\n", __func__);
210 /* TBD : halt to be cleared in work */
213 pr_debug_ratelimited("%s: non zero urb status = %d\n",
214 __func__, urb->status);
215 goto resubmit_int_urb;
218 ctrl = (struct usb_cdc_notification *)urb->transfer_buffer;
219 data = (unsigned char *)(ctrl + 1);
221 switch (ctrl->bNotificationType) {
222 case USB_CDC_NOTIFY_RESPONSE_AVAILABLE:
224 usb_fill_control_urb(dev->readurb, udev,
225 usb_rcvctrlpipe(udev, 0),
226 (unsigned char *)dev->in_ctlreq,
228 DEFAULT_READ_URB_LENGTH,
231 status = usb_submit_urb(dev->readurb, GFP_ATOMIC);
234 "%s: Error submitting Read URB %d\n",
236 goto resubmit_int_urb;
238 pr_info("[NRA:%d]>\n", iface_num);
240 case USB_CDC_NOTIFY_NETWORK_CONNECTION:
241 dev_dbg(&udev->dev, "%s network\n", ctrl->wValue ?
242 "connected to" : "disconnected from");
244 case USB_CDC_NOTIFY_SERIAL_STATE:
245 dev->notify_ser_state++;
246 ctrl_bits = get_unaligned_le16(data);
247 dev_dbg(&udev->dev, "serial state: %d\n", ctrl_bits);
248 dev->cbits_tohost = ctrl_bits;
249 if (brdg && brdg->ops.send_cbits)
250 brdg->ops.send_cbits(brdg->ctx, ctrl_bits);
253 dev_err(&udev->dev, "%s: unknown notification %d received:"
254 "index %d len %d data0 %d data1 %d",
255 __func__, ctrl->bNotificationType, ctrl->wIndex,
256 ctrl->wLength, data[0], data[1]);
260 status = usb_submit_urb(urb, GFP_ATOMIC);
262 dev_err(&udev->dev, "%s: Error re-submitting Int URB %d\n",
265 pr_info("[CHKRA:%d]>\n", iface_num);
268 int ctrl_bridge_start_read(struct ctrl_bridge *dev)
271 struct usb_device *udev;
272 unsigned int iface_num;
274 udev = interface_to_usbdev(dev->intf);
275 iface_num = dev->intf->cur_altsetting->desc.bInterfaceNumber;
278 dev_err(&dev->udev->dev, "%s: inturb is NULL\n", __func__);
282 retval = usb_submit_urb(dev->inturb, GFP_KERNEL);
284 dev_err(&dev->udev->dev,
285 "%s error submitting int urb %d\n",
289 pr_info("[CHKRA:%d]>\n", iface_num);
294 void ctrl_bridge_stop_read(struct ctrl_bridge *dev)
296 usb_kill_urb(dev->readurb);
297 usb_kill_urb(dev->inturb);
300 void ctrl_bridge_stop_all(void)
304 for (id = 0; id < MAX_BRIDGE_DEVICES; id++) {
306 ctrl_bridge_stop_read(__dev[id]);
309 EXPORT_SYMBOL(ctrl_bridge_stop_all);
311 int ctrl_bridge_open(struct bridge *brdg)
313 struct ctrl_bridge *dev;
317 err("bridge is null\n");
321 if (brdg->ch_id >= MAX_BRIDGE_DEVICES)
324 dev = __dev[brdg->ch_id];
326 err("dev is null\n");
331 dev->snd_encap_cmd = 0;
332 dev->get_encap_res = 0;
334 dev->set_ctrl_line_sts = 0;
335 dev->notify_ser_state = 0;
337 ret = usb_autopm_get_interface(dev->intf);
339 dev_err(&dev->udev->dev, "%s autopm_get fail: %d\n",
344 ret = ctrl_bridge_start_read(dev);
345 usb_autopm_put_interface(dev->intf);
348 EXPORT_SYMBOL(ctrl_bridge_open);
350 void ctrl_bridge_close(unsigned int id)
352 struct ctrl_bridge *dev;
354 if (id >= MAX_BRIDGE_DEVICES)
358 if (!dev || !dev->brdg)
361 dev_dbg(&dev->udev->dev, "%s:\n", __func__);
363 ctrl_bridge_set_cbits(dev->brdg->ch_id, 0);
364 usb_unlink_anchored_urbs(&dev->tx_submitted);
368 EXPORT_SYMBOL(ctrl_bridge_close);
370 static void ctrl_write_callback(struct urb *urb)
372 struct ctrl_bridge *dev = urb->context;
375 pr_debug("Write status/size %d/%d\n",
376 urb->status, urb->actual_length);
379 kfree(urb->transfer_buffer);
380 kfree(urb->setup_packet);
382 usb_autopm_put_interface_async(dev->intf);
385 int ctrl_bridge_write(unsigned int id, char *data, size_t size)
388 struct urb *writeurb;
389 struct usb_ctrlrequest *out_ctlreq;
390 struct usb_device *udev;
391 struct ctrl_bridge *dev;
393 if (id >= MAX_BRIDGE_DEVICES) {
405 udev = interface_to_usbdev(dev->intf);
407 dev_dbg(&udev->dev, "%s:[id]:%u: write (%d bytes)\n",
410 writeurb = usb_alloc_urb(0, GFP_ATOMIC);
412 dev_err(&udev->dev, "%s: error allocating read urb\n",
418 out_ctlreq = kmalloc(sizeof(*out_ctlreq), GFP_ATOMIC);
421 "%s: error allocating setup packet buffer\n",
427 /* CDC Send Encapsulated Request packet */
428 out_ctlreq->bRequestType = (USB_DIR_OUT | USB_TYPE_CLASS |
429 USB_RECIP_INTERFACE);
430 if (!data && !size) {
431 out_ctlreq->bRequest = USB_CDC_REQ_SET_CONTROL_LINE_STATE;
432 out_ctlreq->wValue = dev->cbits_tomdm;
433 dev->set_ctrl_line_sts++;
435 out_ctlreq->bRequest = USB_CDC_SEND_ENCAPSULATED_COMMAND;
436 out_ctlreq->wValue = 0;
437 dev->snd_encap_cmd++;
440 dev->intf->cur_altsetting->desc.bInterfaceNumber;
441 out_ctlreq->wLength = cpu_to_le16(size);
443 usb_fill_control_urb(writeurb, udev,
444 usb_sndctrlpipe(udev, 0),
445 (unsigned char *)out_ctlreq,
447 ctrl_write_callback, dev);
449 result = usb_autopm_get_interface_async(dev->intf);
451 dev_err(&udev->dev, "%s: unable to resume interface: %d\n",
455 * Revisit: if (result == -EPERM)
456 * bridge_suspend(dev->intf, PMSG_SUSPEND);
462 if (test_bit(SUSPENDED, &dev->flags)) {
463 usb_anchor_urb(writeurb, &dev->tx_deferred);
467 usb_anchor_urb(writeurb, &dev->tx_submitted);
468 result = usb_submit_urb(writeurb, GFP_ATOMIC);
470 dev_err(&udev->dev, "%s: submit URB error %d\n",
472 usb_autopm_put_interface_async(dev->intf);
479 usb_unanchor_urb(writeurb);
483 usb_free_urb(writeurb);
489 EXPORT_SYMBOL(ctrl_bridge_write);
491 int ctrl_bridge_suspend(unsigned int id)
493 struct ctrl_bridge *dev;
495 if (id >= MAX_BRIDGE_DEVICES)
502 set_bit(SUSPENDED, &dev->flags);
503 usb_kill_anchored_urbs(&dev->tx_submitted);
504 ctrl_bridge_stop_read(dev);
509 int ctrl_bridge_resume(unsigned int id)
511 struct ctrl_bridge *dev;
514 if (id >= MAX_BRIDGE_DEVICES)
521 if (!test_and_clear_bit(SUSPENDED, &dev->flags))
524 /* submit pending write requests */
525 while ((urb = usb_get_from_anchor(&dev->tx_deferred))) {
527 usb_anchor_urb(urb, &dev->tx_submitted);
528 ret = usb_submit_urb(urb, GFP_ATOMIC);
530 usb_unanchor_urb(urb);
531 kfree(urb->setup_packet);
532 kfree(urb->transfer_buffer);
534 usb_autopm_put_interface_async(dev->intf);
538 /* if the bridge is open, resume reading */
539 #ifndef CONFIG_MDM_HSIC_PM
541 return ctrl_bridge_start_read(dev);
543 /* if the bridge is open or not, resume to consume mdm request
544 * because this link is not dead, it's alive
546 return ctrl_bridge_start_read(dev);
551 #if defined(CONFIG_DEBUG_FS)
552 #define DEBUG_BUF_SIZE 1024
553 static ssize_t ctrl_bridge_read_stats(struct file *file, char __user *ubuf,
554 size_t count, loff_t *ppos)
556 struct ctrl_bridge *dev;
562 buf = kzalloc(sizeof(char) * DEBUG_BUF_SIZE, GFP_KERNEL);
566 for (i = 0; i < ch_id; i++) {
571 temp += scnprintf(buf + temp, DEBUG_BUF_SIZE - temp,
573 "snd encap cmd cnt: %u\n"
574 "get encap res cnt: %u\n"
575 "res available cnt: %u\n"
576 "set ctrlline sts cnt: %u\n"
577 "notify ser state cnt: %u\n"
581 dev->pdev->name, dev,
585 dev->set_ctrl_line_sts,
586 dev->notify_ser_state,
589 test_bit(SUSPENDED, &dev->flags));
592 ret = simple_read_from_buffer(ubuf, count, ppos, buf, temp);
599 static ssize_t ctrl_bridge_reset_stats(struct file *file,
600 const char __user *buf, size_t count, loff_t *ppos)
602 struct ctrl_bridge *dev;
605 for (i = 0; i < ch_id; i++) {
610 dev->snd_encap_cmd = 0;
611 dev->get_encap_res = 0;
613 dev->set_ctrl_line_sts = 0;
614 dev->notify_ser_state = 0;
619 const struct file_operations ctrl_stats_ops = {
620 .read = ctrl_bridge_read_stats,
621 .write = ctrl_bridge_reset_stats,
624 struct dentry *ctrl_dent;
625 struct dentry *ctrl_dfile;
626 static void ctrl_bridge_debugfs_init(void)
628 ctrl_dent = debugfs_create_dir("ctrl_hsic_bridge", 0);
629 if (IS_ERR(ctrl_dent))
633 debugfs_create_file("status", 0644, ctrl_dent, 0,
635 if (!ctrl_dfile || IS_ERR(ctrl_dfile))
636 debugfs_remove(ctrl_dent);
639 static void ctrl_bridge_debugfs_exit(void)
641 debugfs_remove(ctrl_dfile);
642 debugfs_remove(ctrl_dent);
646 static void ctrl_bridge_debugfs_init(void) { }
647 static void ctrl_bridge_debugfs_exit(void) { }
651 ctrl_bridge_probe(struct usb_interface *ifc, struct usb_host_endpoint *int_in,
654 struct ctrl_bridge *dev;
655 struct usb_device *udev;
656 struct usb_endpoint_descriptor *ep;
661 udev = interface_to_usbdev(ifc);
663 dev = kzalloc(sizeof(*dev), GFP_KERNEL);
665 dev_err(&udev->dev, "%s: unable to allocate dev\n",
669 dev->pdev = platform_device_alloc(ctrl_bridge_names[id], id);
671 dev_err(&dev->udev->dev,
672 "%s: unable to allocate platform device\n", __func__);
678 dev->int_pipe = usb_rcvintpipe(udev,
679 int_in->desc.bEndpointAddress & USB_ENDPOINT_NUMBER_MASK);
682 init_usb_anchor(&dev->tx_submitted);
683 init_usb_anchor(&dev->tx_deferred);
685 /*use max pkt size from ep desc*/
686 ep = &dev->intf->cur_altsetting->endpoint[0].desc;
688 dev->inturb = usb_alloc_urb(0, GFP_KERNEL);
690 dev_err(&udev->dev, "%s: error allocating int urb\n", __func__);
695 wMaxPacketSize = le16_to_cpu(ep->wMaxPacketSize);
697 dev->intbuf = kmalloc(wMaxPacketSize, GFP_KERNEL);
699 dev_err(&udev->dev, "%s: error allocating int buffer\n",
706 (udev->speed == USB_SPEED_HIGH) ? HS_INTERVAL : FS_LS_INTERVAL;
708 usb_fill_int_urb(dev->inturb, udev, dev->int_pipe,
709 dev->intbuf, wMaxPacketSize,
710 notification_available_cb, dev, interval);
712 dev->readurb = usb_alloc_urb(0, GFP_KERNEL);
714 dev_err(&udev->dev, "%s: error allocating read urb\n",
720 dev->readbuf = kmalloc(DEFAULT_READ_URB_LENGTH, GFP_KERNEL);
722 dev_err(&udev->dev, "%s: error allocating read buffer\n",
728 dev->in_ctlreq = kmalloc(sizeof(*dev->in_ctlreq), GFP_KERNEL);
729 if (!dev->in_ctlreq) {
731 "%s:error allocating setup packet buffer\n",
737 dev->in_ctlreq->bRequestType =
738 (USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE);
739 dev->in_ctlreq->bRequest = USB_CDC_GET_ENCAPSULATED_RESPONSE;
740 dev->in_ctlreq->wValue = 0;
741 dev->in_ctlreq->wIndex =
742 dev->intf->cur_altsetting->desc.bInterfaceNumber;
743 dev->in_ctlreq->wLength = cpu_to_le16(DEFAULT_READ_URB_LENGTH);
747 platform_device_add(dev->pdev);
751 #ifdef CONFIG_MDM_HSIC_PM
752 /* if the bridge is open or not, resume to consume mdm request
753 * because this link is not dead, it's alive
755 ctrl_bridge_start_read(dev);
762 usb_free_urb(dev->readurb);
766 usb_free_urb(dev->inturb);
768 platform_device_del(dev->pdev);
775 void ctrl_bridge_disconnect(unsigned int id)
777 struct ctrl_bridge *dev = __dev[id];
779 dev_dbg(&dev->udev->dev, "%s:\n", __func__);
781 platform_device_del(dev->pdev);
784 usb_kill_urb(dev->readurb);
785 usb_kill_urb(dev->inturb);
787 kfree(dev->in_ctlreq);
791 usb_free_urb(dev->readurb);
792 usb_free_urb(dev->inturb);
800 static int __init ctrl_bridge_init(void)
802 ctrl_bridge_debugfs_init();
806 module_init(ctrl_bridge_init);
808 static void __exit ctrl_bridge_exit(void)
810 ctrl_bridge_debugfs_exit();
812 module_exit(ctrl_bridge_exit);
814 MODULE_DESCRIPTION("Qualcomm modem control bridge driver");
815 MODULE_LICENSE("GPL v2");