0001
0002
0003
0004 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
0005
0006 #include <linux/module.h>
0007 #include <linux/kernel.h>
0008 #include <linux/usb.h>
0009 #include <linux/errno.h>
0010 #include <linux/init.h>
0011 #include <linux/tty.h>
0012 #include <linux/tty_driver.h>
0013 #include <linux/tty_flip.h>
0014 #include <linux/slab.h>
0015 #include <linux/usb/cdc.h>
0016
0017 #include "gdm_mux.h"
0018
0019 static u16 packet_type_for_tty_index[TTY_MAX_COUNT] = {0xF011, 0xF010};
0020
0021 #define USB_DEVICE_CDC_DATA(vid, pid) \
0022 .match_flags = \
0023 USB_DEVICE_ID_MATCH_DEVICE |\
0024 USB_DEVICE_ID_MATCH_INT_CLASS |\
0025 USB_DEVICE_ID_MATCH_INT_SUBCLASS,\
0026 .idVendor = vid,\
0027 .idProduct = pid,\
0028 .bInterfaceClass = USB_CLASS_COMM,\
0029 .bInterfaceSubClass = USB_CDC_SUBCLASS_ACM
0030
0031 static const struct usb_device_id id_table[] = {
0032 { USB_DEVICE_CDC_DATA(0x1076, 0x8000) },
0033 { USB_DEVICE_CDC_DATA(0x1076, 0x8f00) },
0034 { USB_DEVICE_CDC_DATA(0x1076, 0x9000) },
0035 { USB_DEVICE_CDC_DATA(0x1d74, 0x2300) },
0036 {}
0037 };
0038
0039 MODULE_DEVICE_TABLE(usb, id_table);
0040
0041 static int packet_type_to_tty_index(u16 packet_type)
0042 {
0043 int i;
0044
0045 for (i = 0; i < TTY_MAX_COUNT; i++) {
0046 if (packet_type_for_tty_index[i] == packet_type)
0047 return i;
0048 }
0049
0050 return -1;
0051 }
0052
0053 static struct mux_tx *alloc_mux_tx(int len)
0054 {
0055 struct mux_tx *t;
0056
0057 t = kzalloc(sizeof(*t), GFP_ATOMIC);
0058 if (!t)
0059 return NULL;
0060
0061 t->urb = usb_alloc_urb(0, GFP_ATOMIC);
0062 t->buf = kmalloc(MUX_TX_MAX_SIZE, GFP_ATOMIC);
0063 if (!t->urb || !t->buf) {
0064 usb_free_urb(t->urb);
0065 kfree(t->buf);
0066 kfree(t);
0067 return NULL;
0068 }
0069
0070 return t;
0071 }
0072
0073 static void free_mux_tx(struct mux_tx *t)
0074 {
0075 if (t) {
0076 usb_free_urb(t->urb);
0077 kfree(t->buf);
0078 kfree(t);
0079 }
0080 }
0081
0082 static struct mux_rx *alloc_mux_rx(void)
0083 {
0084 struct mux_rx *r;
0085
0086 r = kzalloc(sizeof(*r), GFP_KERNEL);
0087 if (!r)
0088 return NULL;
0089
0090 r->urb = usb_alloc_urb(0, GFP_KERNEL);
0091 r->buf = kmalloc(MUX_RX_MAX_SIZE, GFP_KERNEL);
0092 if (!r->urb || !r->buf) {
0093 usb_free_urb(r->urb);
0094 kfree(r->buf);
0095 kfree(r);
0096 return NULL;
0097 }
0098
0099 return r;
0100 }
0101
0102 static void free_mux_rx(struct mux_rx *r)
0103 {
0104 if (r) {
0105 usb_free_urb(r->urb);
0106 kfree(r->buf);
0107 kfree(r);
0108 }
0109 }
0110
0111 static struct mux_rx *get_rx_struct(struct rx_cxt *rx)
0112 {
0113 struct mux_rx *r;
0114 unsigned long flags;
0115
0116 spin_lock_irqsave(&rx->free_list_lock, flags);
0117
0118 if (list_empty(&rx->rx_free_list)) {
0119 spin_unlock_irqrestore(&rx->free_list_lock, flags);
0120 return NULL;
0121 }
0122
0123 r = list_entry(rx->rx_free_list.prev, struct mux_rx, free_list);
0124 list_del(&r->free_list);
0125
0126 spin_unlock_irqrestore(&rx->free_list_lock, flags);
0127
0128 return r;
0129 }
0130
0131 static void put_rx_struct(struct rx_cxt *rx, struct mux_rx *r)
0132 {
0133 unsigned long flags;
0134
0135 spin_lock_irqsave(&rx->free_list_lock, flags);
0136 list_add_tail(&r->free_list, &rx->rx_free_list);
0137 spin_unlock_irqrestore(&rx->free_list_lock, flags);
0138 }
0139
0140 static int up_to_host(struct mux_rx *r)
0141 {
0142 struct mux_dev *mux_dev = r->mux_dev;
0143 struct mux_pkt_header *mux_header;
0144 unsigned int start_flag;
0145 unsigned int payload_size;
0146 unsigned short packet_type;
0147 int total_len;
0148 u32 packet_size_sum = r->offset;
0149 int index;
0150 int ret = TO_HOST_INVALID_PACKET;
0151 int len = r->len;
0152
0153 while (1) {
0154 mux_header = (struct mux_pkt_header *)(r->buf +
0155 packet_size_sum);
0156 start_flag = __le32_to_cpu(mux_header->start_flag);
0157 payload_size = __le32_to_cpu(mux_header->payload_size);
0158 packet_type = __le16_to_cpu(mux_header->packet_type);
0159
0160 if (start_flag != START_FLAG) {
0161 pr_err("invalid START_FLAG %x\n", start_flag);
0162 break;
0163 }
0164
0165 total_len = ALIGN(MUX_HEADER_SIZE + payload_size, 4);
0166
0167 if (len - packet_size_sum < total_len) {
0168 pr_err("invalid payload : %d %d %04x\n",
0169 payload_size, len, packet_type);
0170 break;
0171 }
0172
0173 index = packet_type_to_tty_index(packet_type);
0174 if (index < 0) {
0175 pr_err("invalid index %d\n", index);
0176 break;
0177 }
0178
0179 ret = r->callback(mux_header->data,
0180 payload_size,
0181 index,
0182 mux_dev->tty_dev,
0183 RECV_PACKET_PROCESS_CONTINUE
0184 );
0185 if (ret == TO_HOST_BUFFER_REQUEST_FAIL) {
0186 r->offset += packet_size_sum;
0187 break;
0188 }
0189
0190 packet_size_sum += total_len;
0191 if (len - packet_size_sum <= MUX_HEADER_SIZE + 2) {
0192 ret = r->callback(NULL,
0193 0,
0194 index,
0195 mux_dev->tty_dev,
0196 RECV_PACKET_PROCESS_COMPLETE
0197 );
0198 break;
0199 }
0200 }
0201
0202 return ret;
0203 }
0204
0205 static void do_rx(struct work_struct *work)
0206 {
0207 struct mux_dev *mux_dev =
0208 container_of(work, struct mux_dev, work_rx.work);
0209 struct mux_rx *r;
0210 struct rx_cxt *rx = &mux_dev->rx;
0211 unsigned long flags;
0212 int ret = 0;
0213
0214 while (1) {
0215 spin_lock_irqsave(&rx->to_host_lock, flags);
0216 if (list_empty(&rx->to_host_list)) {
0217 spin_unlock_irqrestore(&rx->to_host_lock, flags);
0218 break;
0219 }
0220 r = list_entry(rx->to_host_list.next, struct mux_rx,
0221 to_host_list);
0222 list_del(&r->to_host_list);
0223 spin_unlock_irqrestore(&rx->to_host_lock, flags);
0224
0225 ret = up_to_host(r);
0226 if (ret == TO_HOST_BUFFER_REQUEST_FAIL)
0227 pr_err("failed to send mux data to host\n");
0228 else
0229 put_rx_struct(rx, r);
0230 }
0231 }
0232
0233 static void remove_rx_submit_list(struct mux_rx *r, struct rx_cxt *rx)
0234 {
0235 unsigned long flags;
0236 struct mux_rx *r_remove, *r_remove_next;
0237
0238 spin_lock_irqsave(&rx->submit_list_lock, flags);
0239 list_for_each_entry_safe(r_remove, r_remove_next, &rx->rx_submit_list,
0240 rx_submit_list) {
0241 if (r == r_remove)
0242 list_del(&r->rx_submit_list);
0243 }
0244 spin_unlock_irqrestore(&rx->submit_list_lock, flags);
0245 }
0246
0247 static void gdm_mux_rcv_complete(struct urb *urb)
0248 {
0249 struct mux_rx *r = urb->context;
0250 struct mux_dev *mux_dev = r->mux_dev;
0251 struct rx_cxt *rx = &mux_dev->rx;
0252 unsigned long flags;
0253
0254 remove_rx_submit_list(r, rx);
0255
0256 if (urb->status) {
0257 if (mux_dev->usb_state == PM_NORMAL)
0258 dev_err(&urb->dev->dev, "%s: urb status error %d\n",
0259 __func__, urb->status);
0260 put_rx_struct(rx, r);
0261 } else {
0262 r->len = r->urb->actual_length;
0263 spin_lock_irqsave(&rx->to_host_lock, flags);
0264 list_add_tail(&r->to_host_list, &rx->to_host_list);
0265 schedule_work(&mux_dev->work_rx.work);
0266 spin_unlock_irqrestore(&rx->to_host_lock, flags);
0267 }
0268 }
0269
0270 static int gdm_mux_recv(void *priv_dev,
0271 int (*cb)(void *data, int len, int tty_index,
0272 struct tty_dev *tty_dev, int complete))
0273 {
0274 struct mux_dev *mux_dev = priv_dev;
0275 struct usb_device *usbdev = mux_dev->usbdev;
0276 struct mux_rx *r;
0277 struct rx_cxt *rx = &mux_dev->rx;
0278 unsigned long flags;
0279 int ret;
0280
0281 if (!usbdev) {
0282 pr_err("device is disconnected\n");
0283 return -ENODEV;
0284 }
0285
0286 r = get_rx_struct(rx);
0287 if (!r) {
0288 pr_err("get_rx_struct fail\n");
0289 return -ENOMEM;
0290 }
0291
0292 r->offset = 0;
0293 r->mux_dev = (void *)mux_dev;
0294 r->callback = cb;
0295 mux_dev->rx_cb = cb;
0296
0297 usb_fill_bulk_urb(r->urb,
0298 usbdev,
0299 usb_rcvbulkpipe(usbdev, 0x86),
0300 r->buf,
0301 MUX_RX_MAX_SIZE,
0302 gdm_mux_rcv_complete,
0303 r);
0304
0305 spin_lock_irqsave(&rx->submit_list_lock, flags);
0306 list_add_tail(&r->rx_submit_list, &rx->rx_submit_list);
0307 spin_unlock_irqrestore(&rx->submit_list_lock, flags);
0308
0309 ret = usb_submit_urb(r->urb, GFP_KERNEL);
0310
0311 if (ret) {
0312 spin_lock_irqsave(&rx->submit_list_lock, flags);
0313 list_del(&r->rx_submit_list);
0314 spin_unlock_irqrestore(&rx->submit_list_lock, flags);
0315
0316 put_rx_struct(rx, r);
0317
0318 pr_err("usb_submit_urb ret=%d\n", ret);
0319 }
0320
0321 usb_mark_last_busy(usbdev);
0322
0323 return ret;
0324 }
0325
0326 static void gdm_mux_send_complete(struct urb *urb)
0327 {
0328 struct mux_tx *t = urb->context;
0329
0330 if (urb->status == -ECONNRESET) {
0331 dev_info(&urb->dev->dev, "CONNRESET\n");
0332 free_mux_tx(t);
0333 return;
0334 }
0335
0336 if (t->callback)
0337 t->callback(t->cb_data);
0338
0339 free_mux_tx(t);
0340 }
0341
0342 static int gdm_mux_send(void *priv_dev, void *data, int len, int tty_index,
0343 void (*cb)(void *data), void *cb_data)
0344 {
0345 struct mux_dev *mux_dev = priv_dev;
0346 struct usb_device *usbdev = mux_dev->usbdev;
0347 struct mux_pkt_header *mux_header;
0348 struct mux_tx *t = NULL;
0349 static u32 seq_num = 1;
0350 int total_len;
0351 int ret;
0352 unsigned long flags;
0353
0354 if (mux_dev->usb_state == PM_SUSPEND) {
0355 ret = usb_autopm_get_interface(mux_dev->intf);
0356 if (!ret)
0357 usb_autopm_put_interface(mux_dev->intf);
0358 }
0359
0360 spin_lock_irqsave(&mux_dev->write_lock, flags);
0361
0362 total_len = ALIGN(MUX_HEADER_SIZE + len, 4);
0363
0364 t = alloc_mux_tx(total_len);
0365 if (!t) {
0366 pr_err("alloc_mux_tx fail\n");
0367 spin_unlock_irqrestore(&mux_dev->write_lock, flags);
0368 return -ENOMEM;
0369 }
0370
0371 mux_header = (struct mux_pkt_header *)t->buf;
0372 mux_header->start_flag = __cpu_to_le32(START_FLAG);
0373 mux_header->seq_num = __cpu_to_le32(seq_num++);
0374 mux_header->payload_size = __cpu_to_le32((u32)len);
0375 mux_header->packet_type = __cpu_to_le16(packet_type_for_tty_index[tty_index]);
0376
0377 memcpy(t->buf + MUX_HEADER_SIZE, data, len);
0378 memset(t->buf + MUX_HEADER_SIZE + len, 0,
0379 total_len - MUX_HEADER_SIZE - len);
0380
0381 t->len = total_len;
0382 t->callback = cb;
0383 t->cb_data = cb_data;
0384
0385 usb_fill_bulk_urb(t->urb,
0386 usbdev,
0387 usb_sndbulkpipe(usbdev, 5),
0388 t->buf,
0389 total_len,
0390 gdm_mux_send_complete,
0391 t);
0392
0393 ret = usb_submit_urb(t->urb, GFP_ATOMIC);
0394
0395 spin_unlock_irqrestore(&mux_dev->write_lock, flags);
0396
0397 if (ret)
0398 pr_err("usb_submit_urb Error: %d\n", ret);
0399
0400 usb_mark_last_busy(usbdev);
0401
0402 return ret;
0403 }
0404
0405 static int gdm_mux_send_control(void *priv_dev, int request, int value,
0406 void *buf, int len)
0407 {
0408 struct mux_dev *mux_dev = priv_dev;
0409 struct usb_device *usbdev = mux_dev->usbdev;
0410 int ret;
0411
0412 ret = usb_control_msg(usbdev,
0413 usb_sndctrlpipe(usbdev, 0),
0414 request,
0415 USB_RT_ACM,
0416 value,
0417 2,
0418 buf,
0419 len,
0420 5000
0421 );
0422
0423 if (ret < 0)
0424 pr_err("usb_control_msg error: %d\n", ret);
0425
0426 return min(ret, 0);
0427 }
0428
0429 static void release_usb(struct mux_dev *mux_dev)
0430 {
0431 struct rx_cxt *rx = &mux_dev->rx;
0432 struct mux_rx *r, *r_next;
0433 unsigned long flags;
0434
0435 cancel_delayed_work(&mux_dev->work_rx);
0436
0437 spin_lock_irqsave(&rx->submit_list_lock, flags);
0438 list_for_each_entry_safe(r, r_next, &rx->rx_submit_list,
0439 rx_submit_list) {
0440 spin_unlock_irqrestore(&rx->submit_list_lock, flags);
0441 usb_kill_urb(r->urb);
0442 spin_lock_irqsave(&rx->submit_list_lock, flags);
0443 }
0444 spin_unlock_irqrestore(&rx->submit_list_lock, flags);
0445
0446 spin_lock_irqsave(&rx->free_list_lock, flags);
0447 list_for_each_entry_safe(r, r_next, &rx->rx_free_list, free_list) {
0448 list_del(&r->free_list);
0449 free_mux_rx(r);
0450 }
0451 spin_unlock_irqrestore(&rx->free_list_lock, flags);
0452
0453 spin_lock_irqsave(&rx->to_host_lock, flags);
0454 list_for_each_entry_safe(r, r_next, &rx->to_host_list, to_host_list) {
0455 if (r->mux_dev == (void *)mux_dev) {
0456 list_del(&r->to_host_list);
0457 free_mux_rx(r);
0458 }
0459 }
0460 spin_unlock_irqrestore(&rx->to_host_lock, flags);
0461 }
0462
0463 static int init_usb(struct mux_dev *mux_dev)
0464 {
0465 struct mux_rx *r;
0466 struct rx_cxt *rx = &mux_dev->rx;
0467 int ret = 0;
0468 int i;
0469
0470 spin_lock_init(&mux_dev->write_lock);
0471 INIT_LIST_HEAD(&rx->to_host_list);
0472 INIT_LIST_HEAD(&rx->rx_submit_list);
0473 INIT_LIST_HEAD(&rx->rx_free_list);
0474 spin_lock_init(&rx->to_host_lock);
0475 spin_lock_init(&rx->submit_list_lock);
0476 spin_lock_init(&rx->free_list_lock);
0477
0478 for (i = 0; i < MAX_ISSUE_NUM * 2; i++) {
0479 r = alloc_mux_rx();
0480 if (!r) {
0481 ret = -ENOMEM;
0482 break;
0483 }
0484
0485 list_add(&r->free_list, &rx->rx_free_list);
0486 }
0487
0488 INIT_DELAYED_WORK(&mux_dev->work_rx, do_rx);
0489
0490 return ret;
0491 }
0492
0493 static int gdm_mux_probe(struct usb_interface *intf,
0494 const struct usb_device_id *id)
0495 {
0496 struct mux_dev *mux_dev;
0497 struct tty_dev *tty_dev;
0498 u16 idVendor, idProduct;
0499 int bInterfaceNumber;
0500 int ret;
0501 int i;
0502 struct usb_device *usbdev = interface_to_usbdev(intf);
0503
0504 bInterfaceNumber = intf->cur_altsetting->desc.bInterfaceNumber;
0505
0506 idVendor = __le16_to_cpu(usbdev->descriptor.idVendor);
0507 idProduct = __le16_to_cpu(usbdev->descriptor.idProduct);
0508
0509 pr_info("mux vid = 0x%04x pid = 0x%04x\n", idVendor, idProduct);
0510
0511 if (bInterfaceNumber != 2)
0512 return -ENODEV;
0513
0514 mux_dev = kzalloc(sizeof(*mux_dev), GFP_KERNEL);
0515 if (!mux_dev)
0516 return -ENOMEM;
0517
0518 tty_dev = kzalloc(sizeof(*tty_dev), GFP_KERNEL);
0519 if (!tty_dev) {
0520 ret = -ENOMEM;
0521 goto err_free_mux;
0522 }
0523
0524 mux_dev->usbdev = usbdev;
0525 mux_dev->control_intf = intf;
0526
0527 ret = init_usb(mux_dev);
0528 if (ret)
0529 goto err_free_usb;
0530
0531 tty_dev->priv_dev = (void *)mux_dev;
0532 tty_dev->send_func = gdm_mux_send;
0533 tty_dev->recv_func = gdm_mux_recv;
0534 tty_dev->send_control = gdm_mux_send_control;
0535
0536 ret = register_lte_tty_device(tty_dev, &intf->dev);
0537 if (ret)
0538 goto err_unregister_tty;
0539
0540 for (i = 0; i < TTY_MAX_COUNT; i++)
0541 mux_dev->tty_dev = tty_dev;
0542
0543 mux_dev->intf = intf;
0544 mux_dev->usb_state = PM_NORMAL;
0545
0546 usb_get_dev(usbdev);
0547 usb_set_intfdata(intf, tty_dev);
0548
0549 return 0;
0550
0551 err_unregister_tty:
0552 unregister_lte_tty_device(tty_dev);
0553 err_free_usb:
0554 release_usb(mux_dev);
0555 kfree(tty_dev);
0556 err_free_mux:
0557 kfree(mux_dev);
0558
0559 return ret;
0560 }
0561
0562 static void gdm_mux_disconnect(struct usb_interface *intf)
0563 {
0564 struct tty_dev *tty_dev;
0565 struct mux_dev *mux_dev;
0566 struct usb_device *usbdev = interface_to_usbdev(intf);
0567
0568 tty_dev = usb_get_intfdata(intf);
0569
0570 mux_dev = tty_dev->priv_dev;
0571
0572 release_usb(mux_dev);
0573 unregister_lte_tty_device(tty_dev);
0574
0575 kfree(mux_dev);
0576 kfree(tty_dev);
0577
0578 usb_put_dev(usbdev);
0579 }
0580
0581 static int gdm_mux_suspend(struct usb_interface *intf, pm_message_t pm_msg)
0582 {
0583 struct tty_dev *tty_dev;
0584 struct mux_dev *mux_dev;
0585 struct rx_cxt *rx;
0586 struct mux_rx *r, *r_next;
0587 unsigned long flags;
0588
0589 tty_dev = usb_get_intfdata(intf);
0590 mux_dev = tty_dev->priv_dev;
0591 rx = &mux_dev->rx;
0592
0593 cancel_work_sync(&mux_dev->work_rx.work);
0594
0595 if (mux_dev->usb_state != PM_NORMAL) {
0596 dev_err(intf->usb_dev, "usb suspend - invalid state\n");
0597 return -1;
0598 }
0599
0600 mux_dev->usb_state = PM_SUSPEND;
0601
0602 spin_lock_irqsave(&rx->submit_list_lock, flags);
0603 list_for_each_entry_safe(r, r_next, &rx->rx_submit_list,
0604 rx_submit_list) {
0605 spin_unlock_irqrestore(&rx->submit_list_lock, flags);
0606 usb_kill_urb(r->urb);
0607 spin_lock_irqsave(&rx->submit_list_lock, flags);
0608 }
0609 spin_unlock_irqrestore(&rx->submit_list_lock, flags);
0610
0611 return 0;
0612 }
0613
0614 static int gdm_mux_resume(struct usb_interface *intf)
0615 {
0616 struct tty_dev *tty_dev;
0617 struct mux_dev *mux_dev;
0618 u8 i;
0619
0620 tty_dev = usb_get_intfdata(intf);
0621 mux_dev = tty_dev->priv_dev;
0622
0623 if (mux_dev->usb_state != PM_SUSPEND) {
0624 dev_err(intf->usb_dev, "usb resume - invalid state\n");
0625 return -1;
0626 }
0627
0628 mux_dev->usb_state = PM_NORMAL;
0629
0630 for (i = 0; i < MAX_ISSUE_NUM; i++)
0631 gdm_mux_recv(mux_dev, mux_dev->rx_cb);
0632
0633 return 0;
0634 }
0635
0636 static struct usb_driver gdm_mux_driver = {
0637 .name = "gdm_mux",
0638 .probe = gdm_mux_probe,
0639 .disconnect = gdm_mux_disconnect,
0640 .id_table = id_table,
0641 .supports_autosuspend = 1,
0642 .suspend = gdm_mux_suspend,
0643 .resume = gdm_mux_resume,
0644 .reset_resume = gdm_mux_resume,
0645 };
0646
0647 static int __init gdm_usb_mux_init(void)
0648 {
0649 int ret;
0650
0651 ret = register_lte_tty_driver();
0652 if (ret)
0653 return ret;
0654
0655 return usb_register(&gdm_mux_driver);
0656 }
0657
0658 static void __exit gdm_usb_mux_exit(void)
0659 {
0660 usb_deregister(&gdm_mux_driver);
0661 unregister_lte_tty_driver();
0662 }
0663
0664 module_init(gdm_usb_mux_init);
0665 module_exit(gdm_usb_mux_exit);
0666
0667 MODULE_DESCRIPTION("GCT LTE TTY Device Driver");
0668 MODULE_LICENSE("GPL");