cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

gdm_usb.c (22199B)


      1// SPDX-License-Identifier: GPL-2.0
      2/* Copyright (c) 2012 GCT Semiconductor, Inc. All rights reserved. */
      3
      4#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
      5
      6#include <linux/module.h>
      7#include <linux/kernel.h>
      8#include <linux/usb.h>
      9#include <linux/sched.h>
     10#include <linux/kthread.h>
     11#include <linux/usb/cdc.h>
     12#include <linux/wait.h>
     13#include <linux/if_ether.h>
     14#include <linux/pm_runtime.h>
     15
     16#include "gdm_usb.h"
     17#include "gdm_lte.h"
     18#include "hci.h"
     19#include "hci_packet.h"
     20#include "gdm_endian.h"
     21
     22#define USB_DEVICE_CDC_DATA(vid, pid) \
     23	.match_flags = USB_DEVICE_ID_MATCH_DEVICE | \
     24		USB_DEVICE_ID_MATCH_INT_CLASS | \
     25		USB_DEVICE_ID_MATCH_INT_SUBCLASS,\
     26	.idVendor = vid,\
     27	.idProduct = pid,\
     28	.bInterfaceClass = USB_CLASS_COMM,\
     29	.bInterfaceSubClass = USB_CDC_SUBCLASS_ETHERNET
     30
     31#define USB_DEVICE_MASS_DATA(vid, pid) \
     32	.match_flags = USB_DEVICE_ID_MATCH_DEVICE | \
     33		USB_DEVICE_ID_MATCH_INT_INFO,\
     34	.idVendor = vid,\
     35	.idProduct = pid,\
     36	.bInterfaceSubClass = USB_SC_SCSI, \
     37	.bInterfaceClass = USB_CLASS_MASS_STORAGE,\
     38	.bInterfaceProtocol = USB_PR_BULK
     39
     40static const struct usb_device_id id_table[] = {
     41	{ USB_DEVICE_CDC_DATA(VID_GCT, PID_GDM7240) }, /* GCT GDM7240 */
     42	{ USB_DEVICE_CDC_DATA(VID_GCT, PID_GDM7243) }, /* GCT GDM7243 */
     43	{ }
     44};
     45
     46MODULE_DEVICE_TABLE(usb, id_table);
     47
     48static void do_tx(struct work_struct *work);
     49static void do_rx(struct work_struct *work);
     50
     51static int gdm_usb_recv(void *priv_dev,
     52			int (*cb)(void *cb_data,
     53				  void *data, int len, int context),
     54			void *cb_data,
     55			int context);
     56
     57static int request_mac_address(struct lte_udev *udev)
     58{
     59	struct hci_packet *hci;
     60	struct usb_device *usbdev = udev->usbdev;
     61	int actual;
     62	int ret = -1;
     63
     64	hci = kmalloc(struct_size(hci, data, 1), GFP_KERNEL);
     65	if (!hci)
     66		return -ENOMEM;
     67
     68	hci->cmd_evt = gdm_cpu_to_dev16(udev->gdm_ed, LTE_GET_INFORMATION);
     69	hci->len = gdm_cpu_to_dev16(udev->gdm_ed, 1);
     70	hci->data[0] = MAC_ADDRESS;
     71
     72	ret = usb_bulk_msg(usbdev, usb_sndbulkpipe(usbdev, 2), hci, 5,
     73			   &actual, 1000);
     74
     75	udev->request_mac_addr = 1;
     76	kfree(hci);
     77
     78	return ret;
     79}
     80
     81static struct usb_tx *alloc_tx_struct(int len)
     82{
     83	struct usb_tx *t = NULL;
     84	int ret = 0;
     85
     86	t = kzalloc(sizeof(*t), GFP_ATOMIC);
     87	if (!t) {
     88		ret = -ENOMEM;
     89		goto out;
     90	}
     91
     92	t->urb = usb_alloc_urb(0, GFP_ATOMIC);
     93	if (!(len % 512))
     94		len++;
     95
     96	t->buf = kmalloc(len, GFP_ATOMIC);
     97	if (!t->urb || !t->buf) {
     98		ret = -ENOMEM;
     99		goto out;
    100	}
    101
    102out:
    103	if (ret < 0) {
    104		if (t) {
    105			usb_free_urb(t->urb);
    106			kfree(t->buf);
    107			kfree(t);
    108		}
    109		return NULL;
    110	}
    111
    112	return t;
    113}
    114
    115static struct usb_tx_sdu *alloc_tx_sdu_struct(void)
    116{
    117	struct usb_tx_sdu *t_sdu;
    118
    119	t_sdu = kzalloc(sizeof(*t_sdu), GFP_KERNEL);
    120	if (!t_sdu)
    121		return NULL;
    122
    123	t_sdu->buf = kmalloc(SDU_BUF_SIZE, GFP_KERNEL);
    124	if (!t_sdu->buf) {
    125		kfree(t_sdu);
    126		return NULL;
    127	}
    128
    129	return t_sdu;
    130}
    131
    132static void free_tx_struct(struct usb_tx *t)
    133{
    134	if (t) {
    135		usb_free_urb(t->urb);
    136		kfree(t->buf);
    137		kfree(t);
    138	}
    139}
    140
    141static void free_tx_sdu_struct(struct usb_tx_sdu *t_sdu)
    142{
    143	if (t_sdu) {
    144		kfree(t_sdu->buf);
    145		kfree(t_sdu);
    146	}
    147}
    148
    149static struct usb_tx_sdu *get_tx_sdu_struct(struct tx_cxt *tx, int *no_spc)
    150{
    151	struct usb_tx_sdu *t_sdu;
    152
    153	if (list_empty(&tx->free_list))
    154		return NULL;
    155
    156	t_sdu = list_entry(tx->free_list.next, struct usb_tx_sdu, list);
    157	list_del(&t_sdu->list);
    158
    159	tx->avail_count--;
    160
    161	*no_spc = list_empty(&tx->free_list) ? 1 : 0;
    162
    163	return t_sdu;
    164}
    165
    166static void put_tx_struct(struct tx_cxt *tx, struct usb_tx_sdu *t_sdu)
    167{
    168	list_add_tail(&t_sdu->list, &tx->free_list);
    169	tx->avail_count++;
    170}
    171
    172static struct usb_rx *alloc_rx_struct(void)
    173{
    174	struct usb_rx *r = NULL;
    175	int ret = 0;
    176
    177	r = kmalloc(sizeof(*r), GFP_KERNEL);
    178	if (!r) {
    179		ret = -ENOMEM;
    180		goto out;
    181	}
    182
    183	r->urb = usb_alloc_urb(0, GFP_KERNEL);
    184	r->buf = kmalloc(RX_BUF_SIZE, GFP_KERNEL);
    185	if (!r->urb || !r->buf) {
    186		ret = -ENOMEM;
    187		goto out;
    188	}
    189out:
    190
    191	if (ret < 0) {
    192		if (r) {
    193			usb_free_urb(r->urb);
    194			kfree(r->buf);
    195			kfree(r);
    196		}
    197		return NULL;
    198	}
    199
    200	return r;
    201}
    202
    203static void free_rx_struct(struct usb_rx *r)
    204{
    205	if (r) {
    206		usb_free_urb(r->urb);
    207		kfree(r->buf);
    208		kfree(r);
    209	}
    210}
    211
    212static struct usb_rx *get_rx_struct(struct rx_cxt *rx, int *no_spc)
    213{
    214	struct usb_rx *r;
    215	unsigned long flags;
    216
    217	spin_lock_irqsave(&rx->rx_lock, flags);
    218
    219	if (list_empty(&rx->free_list)) {
    220		spin_unlock_irqrestore(&rx->rx_lock, flags);
    221		return NULL;
    222	}
    223
    224	r = list_entry(rx->free_list.next, struct usb_rx, free_list);
    225	list_del(&r->free_list);
    226
    227	rx->avail_count--;
    228
    229	*no_spc = list_empty(&rx->free_list) ? 1 : 0;
    230
    231	spin_unlock_irqrestore(&rx->rx_lock, flags);
    232
    233	return r;
    234}
    235
    236static void put_rx_struct(struct rx_cxt *rx, struct usb_rx *r)
    237{
    238	unsigned long flags;
    239
    240	spin_lock_irqsave(&rx->rx_lock, flags);
    241
    242	list_add_tail(&r->free_list, &rx->free_list);
    243	rx->avail_count++;
    244
    245	spin_unlock_irqrestore(&rx->rx_lock, flags);
    246}
    247
    248static void release_usb(struct lte_udev *udev)
    249{
    250	struct rx_cxt	*rx = &udev->rx;
    251	struct tx_cxt	*tx = &udev->tx;
    252	struct usb_tx	*t, *t_next;
    253	struct usb_rx	*r, *r_next;
    254	struct usb_tx_sdu	*t_sdu, *t_sdu_next;
    255	unsigned long flags;
    256
    257	spin_lock_irqsave(&tx->lock, flags);
    258	list_for_each_entry_safe(t_sdu, t_sdu_next, &tx->sdu_list, list) {
    259		list_del(&t_sdu->list);
    260		free_tx_sdu_struct(t_sdu);
    261	}
    262
    263	list_for_each_entry_safe(t, t_next, &tx->hci_list, list) {
    264		list_del(&t->list);
    265		free_tx_struct(t);
    266	}
    267
    268	list_for_each_entry_safe(t_sdu, t_sdu_next, &tx->free_list, list) {
    269		list_del(&t_sdu->list);
    270		free_tx_sdu_struct(t_sdu);
    271	}
    272	spin_unlock_irqrestore(&tx->lock, flags);
    273
    274	spin_lock_irqsave(&rx->submit_lock, flags);
    275	list_for_each_entry_safe(r, r_next, &rx->rx_submit_list,
    276				 rx_submit_list) {
    277		spin_unlock_irqrestore(&rx->submit_lock, flags);
    278		usb_kill_urb(r->urb);
    279		spin_lock_irqsave(&rx->submit_lock, flags);
    280	}
    281	spin_unlock_irqrestore(&rx->submit_lock, flags);
    282
    283	spin_lock_irqsave(&rx->rx_lock, flags);
    284	list_for_each_entry_safe(r, r_next, &rx->free_list, free_list) {
    285		list_del(&r->free_list);
    286		free_rx_struct(r);
    287	}
    288	spin_unlock_irqrestore(&rx->rx_lock, flags);
    289
    290	spin_lock_irqsave(&rx->to_host_lock, flags);
    291	list_for_each_entry_safe(r, r_next, &rx->to_host_list, to_host_list) {
    292		if (r->index == (void *)udev) {
    293			list_del(&r->to_host_list);
    294			free_rx_struct(r);
    295		}
    296	}
    297	spin_unlock_irqrestore(&rx->to_host_lock, flags);
    298}
    299
    300static int init_usb(struct lte_udev *udev)
    301{
    302	int ret = 0;
    303	int i;
    304	struct tx_cxt *tx = &udev->tx;
    305	struct rx_cxt *rx = &udev->rx;
    306	struct usb_tx_sdu *t_sdu = NULL;
    307	struct usb_rx *r = NULL;
    308
    309	udev->send_complete = 1;
    310	udev->tx_stop = 0;
    311	udev->request_mac_addr = 0;
    312	udev->usb_state = PM_NORMAL;
    313
    314	INIT_LIST_HEAD(&tx->sdu_list);
    315	INIT_LIST_HEAD(&tx->hci_list);
    316	INIT_LIST_HEAD(&tx->free_list);
    317	INIT_LIST_HEAD(&rx->rx_submit_list);
    318	INIT_LIST_HEAD(&rx->free_list);
    319	INIT_LIST_HEAD(&rx->to_host_list);
    320	spin_lock_init(&tx->lock);
    321	spin_lock_init(&rx->rx_lock);
    322	spin_lock_init(&rx->submit_lock);
    323	spin_lock_init(&rx->to_host_lock);
    324
    325	tx->avail_count = 0;
    326	rx->avail_count = 0;
    327
    328	udev->rx_cb = NULL;
    329
    330	for (i = 0; i < MAX_NUM_SDU_BUF; i++) {
    331		t_sdu = alloc_tx_sdu_struct();
    332		if (!t_sdu) {
    333			ret = -ENOMEM;
    334			goto fail;
    335		}
    336
    337		list_add(&t_sdu->list, &tx->free_list);
    338		tx->avail_count++;
    339	}
    340
    341	for (i = 0; i < MAX_RX_SUBMIT_COUNT * 2; i++) {
    342		r = alloc_rx_struct();
    343		if (!r) {
    344			ret = -ENOMEM;
    345			goto fail;
    346		}
    347
    348		list_add(&r->free_list, &rx->free_list);
    349		rx->avail_count++;
    350	}
    351	INIT_DELAYED_WORK(&udev->work_tx, do_tx);
    352	INIT_DELAYED_WORK(&udev->work_rx, do_rx);
    353	return 0;
    354fail:
    355	release_usb(udev);
    356	return ret;
    357}
    358
    359static int set_mac_address(u8 *data, void *arg)
    360{
    361	struct phy_dev *phy_dev = arg;
    362	struct lte_udev *udev = phy_dev->priv_dev;
    363	struct tlv *tlv = (struct tlv *)data;
    364	u8 mac_address[ETH_ALEN] = {0, };
    365
    366	if (tlv->type == MAC_ADDRESS && udev->request_mac_addr) {
    367		memcpy(mac_address, tlv->data, tlv->len);
    368
    369		if (register_lte_device(phy_dev,
    370					&udev->intf->dev, mac_address) < 0)
    371			pr_err("register lte device failed\n");
    372
    373		udev->request_mac_addr = 0;
    374
    375		return 1;
    376	}
    377
    378	return 0;
    379}
    380
    381static void do_rx(struct work_struct *work)
    382{
    383	struct lte_udev *udev =
    384		container_of(work, struct lte_udev, work_rx.work);
    385	struct rx_cxt *rx = &udev->rx;
    386	struct usb_rx *r;
    387	struct hci_packet *hci;
    388	struct phy_dev *phy_dev;
    389	u16 cmd_evt;
    390	int ret;
    391	unsigned long flags;
    392
    393	while (1) {
    394		spin_lock_irqsave(&rx->to_host_lock, flags);
    395		if (list_empty(&rx->to_host_list)) {
    396			spin_unlock_irqrestore(&rx->to_host_lock, flags);
    397			break;
    398		}
    399		r = list_entry(rx->to_host_list.next,
    400			       struct usb_rx, to_host_list);
    401		list_del(&r->to_host_list);
    402		spin_unlock_irqrestore(&rx->to_host_lock, flags);
    403
    404		phy_dev = r->cb_data;
    405		udev = phy_dev->priv_dev;
    406		hci = (struct hci_packet *)r->buf;
    407		cmd_evt = gdm_dev16_to_cpu(udev->gdm_ed, hci->cmd_evt);
    408
    409		switch (cmd_evt) {
    410		case LTE_GET_INFORMATION_RESULT:
    411			if (set_mac_address(hci->data, r->cb_data) == 0) {
    412				r->callback(r->cb_data,
    413					    r->buf,
    414					    r->urb->actual_length,
    415					    KERNEL_THREAD);
    416			}
    417			break;
    418
    419		default:
    420			if (r->callback) {
    421				ret = r->callback(r->cb_data,
    422						  r->buf,
    423						  r->urb->actual_length,
    424						  KERNEL_THREAD);
    425
    426				if (ret == -EAGAIN)
    427					pr_err("failed to send received data\n");
    428			}
    429			break;
    430		}
    431
    432		put_rx_struct(rx, r);
    433
    434		gdm_usb_recv(udev,
    435			     r->callback,
    436			     r->cb_data,
    437			     USB_COMPLETE);
    438	}
    439}
    440
    441static void remove_rx_submit_list(struct usb_rx *r, struct rx_cxt *rx)
    442{
    443	unsigned long flags;
    444	struct usb_rx	*r_remove, *r_remove_next;
    445
    446	spin_lock_irqsave(&rx->submit_lock, flags);
    447	list_for_each_entry_safe(r_remove, r_remove_next,
    448				 &rx->rx_submit_list, rx_submit_list) {
    449		if (r == r_remove) {
    450			list_del(&r->rx_submit_list);
    451			break;
    452		}
    453	}
    454	spin_unlock_irqrestore(&rx->submit_lock, flags);
    455}
    456
    457static void gdm_usb_rcv_complete(struct urb *urb)
    458{
    459	struct usb_rx *r = urb->context;
    460	struct rx_cxt *rx = r->rx;
    461	unsigned long flags;
    462	struct lte_udev *udev = container_of(r->rx, struct lte_udev, rx);
    463	struct usb_device *usbdev = udev->usbdev;
    464
    465	remove_rx_submit_list(r, rx);
    466
    467	if (!urb->status && r->callback) {
    468		spin_lock_irqsave(&rx->to_host_lock, flags);
    469		list_add_tail(&r->to_host_list, &rx->to_host_list);
    470		schedule_work(&udev->work_rx.work);
    471		spin_unlock_irqrestore(&rx->to_host_lock, flags);
    472	} else {
    473		if (urb->status && udev->usb_state == PM_NORMAL)
    474			dev_err(&urb->dev->dev, "%s: urb status error %d\n",
    475				__func__, urb->status);
    476
    477		put_rx_struct(rx, r);
    478	}
    479
    480	usb_mark_last_busy(usbdev);
    481}
    482
    483static int gdm_usb_recv(void *priv_dev,
    484			int (*cb)(void *cb_data,
    485				  void *data, int len, int context),
    486			void *cb_data,
    487			int context)
    488{
    489	struct lte_udev *udev = priv_dev;
    490	struct usb_device *usbdev = udev->usbdev;
    491	struct rx_cxt *rx = &udev->rx;
    492	struct usb_rx *r;
    493	int no_spc;
    494	int ret;
    495	unsigned long flags;
    496
    497	if (!udev->usbdev) {
    498		pr_err("invalid device\n");
    499		return -ENODEV;
    500	}
    501
    502	r = get_rx_struct(rx, &no_spc);
    503	if (!r) {
    504		pr_err("Out of Memory\n");
    505		return -ENOMEM;
    506	}
    507
    508	udev->rx_cb = cb;
    509	r->callback = cb;
    510	r->cb_data = cb_data;
    511	r->index = (void *)udev;
    512	r->rx = rx;
    513
    514	usb_fill_bulk_urb(r->urb,
    515			  usbdev,
    516			  usb_rcvbulkpipe(usbdev, 0x83),
    517			  r->buf,
    518			  RX_BUF_SIZE,
    519			  gdm_usb_rcv_complete,
    520			  r);
    521
    522	spin_lock_irqsave(&rx->submit_lock, flags);
    523	list_add_tail(&r->rx_submit_list, &rx->rx_submit_list);
    524	spin_unlock_irqrestore(&rx->submit_lock, flags);
    525
    526	if (context == KERNEL_THREAD)
    527		ret = usb_submit_urb(r->urb, GFP_KERNEL);
    528	else
    529		ret = usb_submit_urb(r->urb, GFP_ATOMIC);
    530
    531	if (ret) {
    532		spin_lock_irqsave(&rx->submit_lock, flags);
    533		list_del(&r->rx_submit_list);
    534		spin_unlock_irqrestore(&rx->submit_lock, flags);
    535
    536		pr_err("usb_submit_urb failed (%p)\n", r);
    537		put_rx_struct(rx, r);
    538	}
    539
    540	return ret;
    541}
    542
    543static void gdm_usb_send_complete(struct urb *urb)
    544{
    545	struct usb_tx *t = urb->context;
    546	struct tx_cxt *tx = t->tx;
    547	struct lte_udev *udev = container_of(tx, struct lte_udev, tx);
    548	unsigned long flags;
    549
    550	if (urb->status == -ECONNRESET) {
    551		dev_info(&urb->dev->dev, "CONNRESET\n");
    552		return;
    553	}
    554
    555	if (t->callback)
    556		t->callback(t->cb_data);
    557
    558	free_tx_struct(t);
    559
    560	spin_lock_irqsave(&tx->lock, flags);
    561	udev->send_complete = 1;
    562	schedule_work(&udev->work_tx.work);
    563	spin_unlock_irqrestore(&tx->lock, flags);
    564}
    565
    566static int send_tx_packet(struct usb_device *usbdev, struct usb_tx *t, u32 len)
    567{
    568	int ret = 0;
    569
    570	if (!(len % 512))
    571		len++;
    572
    573	usb_fill_bulk_urb(t->urb,
    574			  usbdev,
    575			  usb_sndbulkpipe(usbdev, 2),
    576			  t->buf,
    577			  len,
    578			  gdm_usb_send_complete,
    579			  t);
    580
    581	ret = usb_submit_urb(t->urb, GFP_ATOMIC);
    582
    583	if (ret)
    584		dev_err(&usbdev->dev, "usb_submit_urb failed: %d\n",
    585			ret);
    586
    587	usb_mark_last_busy(usbdev);
    588
    589	return ret;
    590}
    591
    592static u32 packet_aggregation(struct lte_udev *udev, u8 *send_buf)
    593{
    594	struct tx_cxt *tx = &udev->tx;
    595	struct usb_tx_sdu *t_sdu = NULL;
    596	struct multi_sdu *multi_sdu = (struct multi_sdu *)send_buf;
    597	u16 send_len = 0;
    598	u16 num_packet = 0;
    599	unsigned long flags;
    600
    601	multi_sdu->cmd_evt = gdm_cpu_to_dev16(udev->gdm_ed, LTE_TX_MULTI_SDU);
    602
    603	while (num_packet < MAX_PACKET_IN_MULTI_SDU) {
    604		spin_lock_irqsave(&tx->lock, flags);
    605		if (list_empty(&tx->sdu_list)) {
    606			spin_unlock_irqrestore(&tx->lock, flags);
    607			break;
    608		}
    609
    610		t_sdu = list_entry(tx->sdu_list.next, struct usb_tx_sdu, list);
    611		if (send_len + t_sdu->len > MAX_SDU_SIZE) {
    612			spin_unlock_irqrestore(&tx->lock, flags);
    613			break;
    614		}
    615
    616		list_del(&t_sdu->list);
    617		spin_unlock_irqrestore(&tx->lock, flags);
    618
    619		memcpy(multi_sdu->data + send_len, t_sdu->buf, t_sdu->len);
    620
    621		send_len += (t_sdu->len + 3) & 0xfffc;
    622		num_packet++;
    623
    624		if (tx->avail_count > 10)
    625			t_sdu->callback(t_sdu->cb_data);
    626
    627		spin_lock_irqsave(&tx->lock, flags);
    628		put_tx_struct(tx, t_sdu);
    629		spin_unlock_irqrestore(&tx->lock, flags);
    630	}
    631
    632	multi_sdu->len = gdm_cpu_to_dev16(udev->gdm_ed, send_len);
    633	multi_sdu->num_packet = gdm_cpu_to_dev16(udev->gdm_ed, num_packet);
    634
    635	return send_len + offsetof(struct multi_sdu, data);
    636}
    637
    638static void do_tx(struct work_struct *work)
    639{
    640	struct lte_udev *udev =
    641		container_of(work, struct lte_udev, work_tx.work);
    642	struct usb_device *usbdev = udev->usbdev;
    643	struct tx_cxt *tx = &udev->tx;
    644	struct usb_tx *t = NULL;
    645	int is_send = 0;
    646	u32 len = 0;
    647	unsigned long flags;
    648
    649	if (!usb_autopm_get_interface(udev->intf))
    650		usb_autopm_put_interface(udev->intf);
    651
    652	if (udev->usb_state == PM_SUSPEND)
    653		return;
    654
    655	spin_lock_irqsave(&tx->lock, flags);
    656	if (!udev->send_complete) {
    657		spin_unlock_irqrestore(&tx->lock, flags);
    658		return;
    659	}
    660	udev->send_complete = 0;
    661
    662	if (!list_empty(&tx->hci_list)) {
    663		t = list_entry(tx->hci_list.next, struct usb_tx, list);
    664		list_del(&t->list);
    665		len = t->len;
    666		t->is_sdu = 0;
    667		is_send = 1;
    668	} else if (!list_empty(&tx->sdu_list)) {
    669		if (udev->tx_stop) {
    670			udev->send_complete = 1;
    671			spin_unlock_irqrestore(&tx->lock, flags);
    672			return;
    673		}
    674
    675		t = alloc_tx_struct(TX_BUF_SIZE);
    676		if (!t) {
    677			spin_unlock_irqrestore(&tx->lock, flags);
    678			return;
    679		}
    680		t->callback = NULL;
    681		t->tx = tx;
    682		t->is_sdu = 1;
    683		is_send = 1;
    684	}
    685
    686	if (!is_send) {
    687		udev->send_complete = 1;
    688		spin_unlock_irqrestore(&tx->lock, flags);
    689		return;
    690	}
    691	spin_unlock_irqrestore(&tx->lock, flags);
    692
    693	if (t->is_sdu)
    694		len = packet_aggregation(udev, t->buf);
    695
    696	if (send_tx_packet(usbdev, t, len)) {
    697		pr_err("send_tx_packet failed\n");
    698		t->callback = NULL;
    699		gdm_usb_send_complete(t->urb);
    700	}
    701}
    702
    703#define SDU_PARAM_LEN 12
    704static int gdm_usb_sdu_send(void *priv_dev, void *data, int len,
    705			    unsigned int dft_eps_ID, unsigned int eps_ID,
    706			    void (*cb)(void *data), void *cb_data,
    707			    int dev_idx, int nic_type)
    708{
    709	struct lte_udev *udev = priv_dev;
    710	struct tx_cxt *tx = &udev->tx;
    711	struct usb_tx_sdu *t_sdu;
    712	struct sdu *sdu = NULL;
    713	unsigned long flags;
    714	int no_spc = 0;
    715	u16 send_len;
    716
    717	if (!udev->usbdev) {
    718		pr_err("sdu send - invalid device\n");
    719		return TX_NO_DEV;
    720	}
    721
    722	spin_lock_irqsave(&tx->lock, flags);
    723	t_sdu = get_tx_sdu_struct(tx, &no_spc);
    724	spin_unlock_irqrestore(&tx->lock, flags);
    725
    726	if (!t_sdu) {
    727		pr_err("sdu send - free list empty\n");
    728		return TX_NO_SPC;
    729	}
    730
    731	sdu = (struct sdu *)t_sdu->buf;
    732	sdu->cmd_evt = gdm_cpu_to_dev16(udev->gdm_ed, LTE_TX_SDU);
    733	if (nic_type == NIC_TYPE_ARP) {
    734		send_len = len + SDU_PARAM_LEN;
    735		memcpy(sdu->data, data, len);
    736	} else {
    737		send_len = len - ETH_HLEN;
    738		send_len += SDU_PARAM_LEN;
    739		memcpy(sdu->data, data + ETH_HLEN, len - ETH_HLEN);
    740	}
    741
    742	sdu->len = gdm_cpu_to_dev16(udev->gdm_ed, send_len);
    743	sdu->dft_eps_ID = gdm_cpu_to_dev32(udev->gdm_ed, dft_eps_ID);
    744	sdu->bearer_ID = gdm_cpu_to_dev32(udev->gdm_ed, eps_ID);
    745	sdu->nic_type = gdm_cpu_to_dev32(udev->gdm_ed, nic_type);
    746
    747	t_sdu->len = send_len + HCI_HEADER_SIZE;
    748	t_sdu->callback = cb;
    749	t_sdu->cb_data = cb_data;
    750
    751	spin_lock_irqsave(&tx->lock, flags);
    752	list_add_tail(&t_sdu->list, &tx->sdu_list);
    753	schedule_work(&udev->work_tx.work);
    754	spin_unlock_irqrestore(&tx->lock, flags);
    755
    756	if (no_spc)
    757		return TX_NO_BUFFER;
    758
    759	return 0;
    760}
    761
    762static int gdm_usb_hci_send(void *priv_dev, void *data, int len,
    763			    void (*cb)(void *data), void *cb_data)
    764{
    765	struct lte_udev *udev = priv_dev;
    766	struct tx_cxt *tx = &udev->tx;
    767	struct usb_tx *t;
    768	unsigned long flags;
    769
    770	if (!udev->usbdev) {
    771		pr_err("hci send - invalid device\n");
    772		return -ENODEV;
    773	}
    774
    775	t = alloc_tx_struct(len);
    776	if (!t) {
    777		pr_err("hci_send - out of memory\n");
    778		return -ENOMEM;
    779	}
    780
    781	memcpy(t->buf, data, len);
    782	t->callback = cb;
    783	t->cb_data = cb_data;
    784	t->len = len;
    785	t->tx = tx;
    786	t->is_sdu = 0;
    787
    788	spin_lock_irqsave(&tx->lock, flags);
    789	list_add_tail(&t->list, &tx->hci_list);
    790	schedule_work(&udev->work_tx.work);
    791	spin_unlock_irqrestore(&tx->lock, flags);
    792
    793	return 0;
    794}
    795
    796static u8 gdm_usb_get_endian(void *priv_dev)
    797{
    798	struct lte_udev *udev = priv_dev;
    799
    800	return udev->gdm_ed;
    801}
    802
    803static int gdm_usb_probe(struct usb_interface *intf,
    804			 const struct usb_device_id *id)
    805{
    806	int ret = 0;
    807	struct phy_dev *phy_dev = NULL;
    808	struct lte_udev *udev = NULL;
    809	u16 idVendor, idProduct;
    810	int bInterfaceNumber;
    811	struct usb_device *usbdev = interface_to_usbdev(intf);
    812
    813	bInterfaceNumber = intf->cur_altsetting->desc.bInterfaceNumber;
    814	idVendor = __le16_to_cpu(usbdev->descriptor.idVendor);
    815	idProduct = __le16_to_cpu(usbdev->descriptor.idProduct);
    816
    817	pr_info("net vid = 0x%04x pid = 0x%04x\n", idVendor, idProduct);
    818
    819	if (bInterfaceNumber > NETWORK_INTERFACE) {
    820		pr_info("not a network device\n");
    821		return -ENODEV;
    822	}
    823
    824	phy_dev = kzalloc(sizeof(*phy_dev), GFP_KERNEL);
    825	if (!phy_dev)
    826		return -ENOMEM;
    827
    828	udev = kzalloc(sizeof(*udev), GFP_KERNEL);
    829	if (!udev) {
    830		ret = -ENOMEM;
    831		goto err_udev;
    832	}
    833
    834	phy_dev->priv_dev = (void *)udev;
    835	phy_dev->send_hci_func = gdm_usb_hci_send;
    836	phy_dev->send_sdu_func = gdm_usb_sdu_send;
    837	phy_dev->rcv_func = gdm_usb_recv;
    838	phy_dev->get_endian = gdm_usb_get_endian;
    839
    840	udev->usbdev = usbdev;
    841	ret = init_usb(udev);
    842	if (ret < 0) {
    843		dev_err(intf->usb_dev, "init_usb func failed\n");
    844		goto err_init_usb;
    845	}
    846	udev->intf = intf;
    847
    848	intf->needs_remote_wakeup = 1;
    849	usb_enable_autosuspend(usbdev);
    850	pm_runtime_set_autosuspend_delay(&usbdev->dev, AUTO_SUSPEND_TIMER);
    851
    852	/* List up hosts with big endians, otherwise,
    853	 * defaults to little endian
    854	 */
    855	if (idProduct == PID_GDM7243)
    856		udev->gdm_ed = ENDIANNESS_BIG;
    857	else
    858		udev->gdm_ed = ENDIANNESS_LITTLE;
    859
    860	ret = request_mac_address(udev);
    861	if (ret < 0) {
    862		dev_err(intf->usb_dev, "request Mac address failed\n");
    863		goto err_mac_address;
    864	}
    865
    866	start_rx_proc(phy_dev);
    867	usb_get_dev(usbdev);
    868	usb_set_intfdata(intf, phy_dev);
    869
    870	return 0;
    871
    872err_mac_address:
    873	release_usb(udev);
    874err_init_usb:
    875	kfree(udev);
    876err_udev:
    877	kfree(phy_dev);
    878
    879	return ret;
    880}
    881
    882static void gdm_usb_disconnect(struct usb_interface *intf)
    883{
    884	struct phy_dev *phy_dev;
    885	struct lte_udev *udev;
    886	struct usb_device *usbdev;
    887
    888	usbdev = interface_to_usbdev(intf);
    889	phy_dev = usb_get_intfdata(intf);
    890
    891	udev = phy_dev->priv_dev;
    892	unregister_lte_device(phy_dev);
    893
    894	release_usb(udev);
    895
    896	kfree(udev);
    897	udev = NULL;
    898
    899	kfree(phy_dev);
    900	phy_dev = NULL;
    901
    902	usb_put_dev(usbdev);
    903}
    904
    905static int gdm_usb_suspend(struct usb_interface *intf, pm_message_t pm_msg)
    906{
    907	struct phy_dev *phy_dev;
    908	struct lte_udev *udev;
    909	struct rx_cxt *rx;
    910	struct usb_rx *r;
    911	struct usb_rx *r_next;
    912	unsigned long flags;
    913
    914	phy_dev = usb_get_intfdata(intf);
    915	udev = phy_dev->priv_dev;
    916	rx = &udev->rx;
    917	if (udev->usb_state != PM_NORMAL) {
    918		dev_err(intf->usb_dev, "usb suspend - invalid state\n");
    919		return -1;
    920	}
    921
    922	udev->usb_state = PM_SUSPEND;
    923
    924	spin_lock_irqsave(&rx->submit_lock, flags);
    925	list_for_each_entry_safe(r, r_next, &rx->rx_submit_list,
    926				 rx_submit_list) {
    927		spin_unlock_irqrestore(&rx->submit_lock, flags);
    928		usb_kill_urb(r->urb);
    929		spin_lock_irqsave(&rx->submit_lock, flags);
    930	}
    931	spin_unlock_irqrestore(&rx->submit_lock, flags);
    932
    933	cancel_work_sync(&udev->work_tx.work);
    934	cancel_work_sync(&udev->work_rx.work);
    935
    936	return 0;
    937}
    938
    939static int gdm_usb_resume(struct usb_interface *intf)
    940{
    941	struct phy_dev *phy_dev;
    942	struct lte_udev *udev;
    943	struct tx_cxt *tx;
    944	struct rx_cxt *rx;
    945	unsigned long flags;
    946	int issue_count;
    947	int i;
    948
    949	phy_dev = usb_get_intfdata(intf);
    950	udev = phy_dev->priv_dev;
    951	rx = &udev->rx;
    952
    953	if (udev->usb_state != PM_SUSPEND) {
    954		dev_err(intf->usb_dev, "usb resume - invalid state\n");
    955		return -1;
    956	}
    957	udev->usb_state = PM_NORMAL;
    958
    959	spin_lock_irqsave(&rx->rx_lock, flags);
    960	issue_count = rx->avail_count - MAX_RX_SUBMIT_COUNT;
    961	spin_unlock_irqrestore(&rx->rx_lock, flags);
    962
    963	if (issue_count >= 0) {
    964		for (i = 0; i < issue_count; i++)
    965			gdm_usb_recv(phy_dev->priv_dev,
    966				     udev->rx_cb,
    967				     phy_dev,
    968				     USB_COMPLETE);
    969	}
    970
    971	tx = &udev->tx;
    972	spin_lock_irqsave(&tx->lock, flags);
    973	schedule_work(&udev->work_tx.work);
    974	spin_unlock_irqrestore(&tx->lock, flags);
    975
    976	return 0;
    977}
    978
    979static struct usb_driver gdm_usb_lte_driver = {
    980	.name = "gdm_lte",
    981	.probe = gdm_usb_probe,
    982	.disconnect = gdm_usb_disconnect,
    983	.id_table = id_table,
    984	.supports_autosuspend = 1,
    985	.suspend = gdm_usb_suspend,
    986	.resume = gdm_usb_resume,
    987	.reset_resume = gdm_usb_resume,
    988};
    989
    990static int __init gdm_usb_lte_init(void)
    991{
    992	if (gdm_lte_event_init() < 0) {
    993		pr_err("error creating event\n");
    994		return -1;
    995	}
    996
    997	return usb_register(&gdm_usb_lte_driver);
    998}
    999
   1000static void __exit gdm_usb_lte_exit(void)
   1001{
   1002	gdm_lte_event_exit();
   1003
   1004	usb_deregister(&gdm_usb_lte_driver);
   1005}
   1006
   1007module_init(gdm_usb_lte_init);
   1008module_exit(gdm_usb_lte_exit);
   1009
   1010MODULE_VERSION(DRIVER_VERSION);
   1011MODULE_DESCRIPTION("GCT LTE USB Device Driver");
   1012MODULE_LICENSE("GPL");