1/*
2 * Copyright (c) 2012 GCT Semiconductor, Inc. All rights reserved.
3 *
4 * This software is licensed under the terms of the GNU General Public
5 * License version 2, as published by the Free Software Foundation, and
6 * may be copied, distributed, and modified under those terms.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 */
13
14#include <linux/module.h>
15#include <linux/kernel.h>
16#include <linux/usb.h>
17#include <asm/byteorder.h>
18#include <linux/kthread.h>
19
20#include "gdm_usb.h"
21#include "gdm_wimax.h"
22#include "usb_boot.h"
23#include "hci.h"
24
25#include "usb_ids.h"
26
27MODULE_DEVICE_TABLE(usb, id_table);
28
29#define TX_BUF_SIZE		2048
30
31#if defined(CONFIG_WIMAX_GDM72XX_WIMAX2)
32#define RX_BUF_SIZE		(128*1024)	/* For packet aggregation */
33#else
34#define RX_BUF_SIZE		2048
35#endif
36
37#define GDM7205_PADDING		256
38
39#define DOWNLOAD_CONF_VALUE	0x21
40
41#ifdef CONFIG_WIMAX_GDM72XX_K_MODE
42
43static DECLARE_WAIT_QUEUE_HEAD(k_wait);
44static LIST_HEAD(k_list);
45static DEFINE_SPINLOCK(k_lock);
46static int k_mode_stop;
47
48#define K_WAIT_TIME		(2 * HZ / 100)
49
50#endif /* CONFIG_WIMAX_GDM72XX_K_MODE */
51
52static struct usb_tx *alloc_tx_struct(struct tx_cxt *tx)
53{
54	struct usb_tx *t = kzalloc(sizeof(*t), GFP_ATOMIC);
55
56	if (!t)
57		return NULL;
58
59	t->urb = usb_alloc_urb(0, GFP_ATOMIC);
60	t->buf = kmalloc(TX_BUF_SIZE, GFP_ATOMIC);
61	if (!t->urb || !t->buf) {
62		usb_free_urb(t->urb);
63		kfree(t->buf);
64		kfree(t);
65		return NULL;
66	}
67
68	t->tx_cxt = tx;
69
70	return t;
71}
72
73static void free_tx_struct(struct usb_tx *t)
74{
75	if (t) {
76		usb_free_urb(t->urb);
77		kfree(t->buf);
78		kfree(t);
79	}
80}
81
82static struct usb_rx *alloc_rx_struct(struct rx_cxt *rx)
83{
84	struct usb_rx *r = kzalloc(sizeof(*r), GFP_ATOMIC);
85
86	if (!r)
87		return NULL;
88
89	r->urb = usb_alloc_urb(0, GFP_ATOMIC);
90	r->buf = kmalloc(RX_BUF_SIZE, GFP_ATOMIC);
91	if (!r->urb || !r->buf) {
92		usb_free_urb(r->urb);
93		kfree(r->buf);
94		kfree(r);
95		return NULL;
96	}
97
98	r->rx_cxt = rx;
99	return r;
100}
101
102static void free_rx_struct(struct usb_rx *r)
103{
104	if (r) {
105		usb_free_urb(r->urb);
106		kfree(r->buf);
107		kfree(r);
108	}
109}
110
111/* Before this function is called, spin lock should be locked. */
112static struct usb_tx *get_tx_struct(struct tx_cxt *tx, int *no_spc)
113{
114	struct usb_tx *t;
115
116	if (list_empty(&tx->free_list)) {
117		*no_spc = 1;
118		return NULL;
119	}
120
121	t = list_entry(tx->free_list.next, struct usb_tx, list);
122	list_del(&t->list);
123
124	*no_spc = list_empty(&tx->free_list) ? 1 : 0;
125
126	return t;
127}
128
129/* Before this function is called, spin lock should be locked. */
130static void put_tx_struct(struct tx_cxt *tx, struct usb_tx *t)
131{
132	list_add_tail(&t->list, &tx->free_list);
133}
134
135/* Before this function is called, spin lock should be locked. */
136static struct usb_rx *get_rx_struct(struct rx_cxt *rx)
137{
138	struct usb_rx *r;
139
140	if (list_empty(&rx->free_list)) {
141		r = alloc_rx_struct(rx);
142		if (r == NULL)
143			return NULL;
144
145		list_add(&r->list, &rx->free_list);
146	}
147
148	r = list_entry(rx->free_list.next, struct usb_rx, list);
149	list_move_tail(&r->list, &rx->used_list);
150
151	return r;
152}
153
154/* Before this function is called, spin lock should be locked. */
155static void put_rx_struct(struct rx_cxt *rx, struct usb_rx *r)
156{
157	list_move(&r->list, &rx->free_list);
158}
159
160static void release_usb(struct usbwm_dev *udev)
161{
162	struct tx_cxt *tx = &udev->tx;
163	struct rx_cxt *rx = &udev->rx;
164	struct usb_tx *t, *t_next;
165	struct usb_rx *r, *r_next;
166	unsigned long flags;
167
168	spin_lock_irqsave(&tx->lock, flags);
169
170	list_for_each_entry_safe(t, t_next, &tx->sdu_list, list) {
171		list_del(&t->list);
172		free_tx_struct(t);
173	}
174
175	list_for_each_entry_safe(t, t_next, &tx->hci_list, list) {
176		list_del(&t->list);
177		free_tx_struct(t);
178	}
179
180	list_for_each_entry_safe(t, t_next, &tx->free_list, list) {
181		list_del(&t->list);
182		free_tx_struct(t);
183	}
184
185	spin_unlock_irqrestore(&tx->lock, flags);
186
187	spin_lock_irqsave(&rx->lock, flags);
188
189	list_for_each_entry_safe(r, r_next, &rx->free_list, list) {
190		list_del(&r->list);
191		free_rx_struct(r);
192	}
193
194	list_for_each_entry_safe(r, r_next, &rx->used_list, list) {
195		list_del(&r->list);
196		free_rx_struct(r);
197	}
198
199	spin_unlock_irqrestore(&rx->lock, flags);
200}
201
202static int init_usb(struct usbwm_dev *udev)
203{
204	int ret = 0, i;
205	struct tx_cxt *tx = &udev->tx;
206	struct rx_cxt *rx = &udev->rx;
207	struct usb_tx *t;
208	struct usb_rx *r;
209	unsigned long flags;
210
211	INIT_LIST_HEAD(&tx->free_list);
212	INIT_LIST_HEAD(&tx->sdu_list);
213	INIT_LIST_HEAD(&tx->hci_list);
214#if defined(CONFIG_WIMAX_GDM72XX_USB_PM) || defined(CONFIG_WIMAX_GDM72XX_K_MODE)
215	INIT_LIST_HEAD(&tx->pending_list);
216#endif
217
218	INIT_LIST_HEAD(&rx->free_list);
219	INIT_LIST_HEAD(&rx->used_list);
220
221	spin_lock_init(&tx->lock);
222	spin_lock_init(&rx->lock);
223
224	spin_lock_irqsave(&tx->lock, flags);
225	for (i = 0; i < MAX_NR_SDU_BUF; i++) {
226		t = alloc_tx_struct(tx);
227		if (t == NULL) {
228			spin_unlock_irqrestore(&tx->lock, flags);
229			ret = -ENOMEM;
230			goto fail;
231		}
232		list_add(&t->list, &tx->free_list);
233	}
234	spin_unlock_irqrestore(&tx->lock, flags);
235
236	r = alloc_rx_struct(rx);
237	if (r == NULL) {
238		ret = -ENOMEM;
239		goto fail;
240	}
241
242	spin_lock_irqsave(&rx->lock, flags);
243	list_add(&r->list, &rx->free_list);
244	spin_unlock_irqrestore(&rx->lock, flags);
245	return ret;
246
247fail:
248	release_usb(udev);
249	return ret;
250}
251
252static void __gdm_usb_send_complete(struct urb *urb)
253{
254	struct usb_tx *t = urb->context;
255	struct tx_cxt *tx = t->tx_cxt;
256	u8 *pkt = t->buf;
257	u16 cmd_evt;
258
259	/* Completion by usb_unlink_urb */
260	if (urb->status == -ECONNRESET)
261		return;
262
263	if (t->callback)
264		t->callback(t->cb_data);
265
266	/* Delete from sdu list or hci list. */
267	list_del(&t->list);
268
269	cmd_evt = (pkt[0] << 8) | pkt[1];
270	if (cmd_evt == WIMAX_TX_SDU)
271		put_tx_struct(tx, t);
272	else
273		free_tx_struct(t);
274}
275
276static void gdm_usb_send_complete(struct urb *urb)
277{
278	struct usb_tx *t = urb->context;
279	struct tx_cxt *tx = t->tx_cxt;
280	unsigned long flags;
281
282	spin_lock_irqsave(&tx->lock, flags);
283	__gdm_usb_send_complete(urb);
284	spin_unlock_irqrestore(&tx->lock, flags);
285}
286
287static int gdm_usb_send(void *priv_dev, void *data, int len,
288			void (*cb)(void *data), void *cb_data)
289{
290	struct usbwm_dev *udev = priv_dev;
291	struct usb_device *usbdev = udev->usbdev;
292	struct tx_cxt *tx = &udev->tx;
293	struct usb_tx *t;
294	int padding = udev->padding;
295	int no_spc = 0, ret;
296	u8 *pkt = data;
297	u16 cmd_evt;
298	unsigned long flags;
299#ifdef CONFIG_WIMAX_GDM72XX_K_MODE
300	unsigned long flags2;
301#endif /* CONFIG_WIMAX_GDM72XX_K_MODE */
302
303	if (!udev->usbdev) {
304		dev_err(&usbdev->dev, "%s: No such device\n", __func__);
305		return -ENODEV;
306	}
307
308	if (len > TX_BUF_SIZE - padding - 1)
309		return -EINVAL;
310
311	spin_lock_irqsave(&tx->lock, flags);
312
313	cmd_evt = (pkt[0] << 8) | pkt[1];
314	if (cmd_evt == WIMAX_TX_SDU) {
315		t = get_tx_struct(tx, &no_spc);
316		if (t == NULL) {
317			/* This case must not happen. */
318			spin_unlock_irqrestore(&tx->lock, flags);
319			return -ENOSPC;
320		}
321		list_add_tail(&t->list, &tx->sdu_list);
322	} else {
323		t = alloc_tx_struct(tx);
324		if (t == NULL) {
325			spin_unlock_irqrestore(&tx->lock, flags);
326			return -ENOMEM;
327		}
328		list_add_tail(&t->list, &tx->hci_list);
329	}
330
331	memcpy(t->buf + padding, data, len);
332	t->callback = cb;
333	t->cb_data = cb_data;
334
335	/* In some cases, USB Module of WiMax is blocked when data size is
336	 * the multiple of 512. So, increment length by one in that case.
337	 */
338	if ((len % 512) == 0)
339		len++;
340
341	usb_fill_bulk_urb(t->urb, usbdev, usb_sndbulkpipe(usbdev, 1), t->buf,
342			  len + padding, gdm_usb_send_complete, t);
343
344	dev_dbg(&usbdev->dev, "usb_send: %*ph\n", len + padding, t->buf);
345
346#ifdef CONFIG_WIMAX_GDM72XX_USB_PM
347	if (usbdev->state & USB_STATE_SUSPENDED) {
348		list_add_tail(&t->p_list, &tx->pending_list);
349		schedule_work(&udev->pm_ws);
350		goto out;
351	}
352#endif /* CONFIG_WIMAX_GDM72XX_USB_PM */
353
354#ifdef CONFIG_WIMAX_GDM72XX_K_MODE
355	if (udev->bw_switch) {
356		list_add_tail(&t->p_list, &tx->pending_list);
357		goto out;
358	} else if (cmd_evt == WIMAX_SCAN) {
359		struct rx_cxt *rx;
360		struct usb_rx *r;
361
362		rx = &udev->rx;
363
364		spin_lock_irqsave(&rx->lock, flags2);
365		list_for_each_entry(r, &rx->used_list, list)
366			usb_unlink_urb(r->urb);
367		spin_unlock_irqrestore(&rx->lock, flags2);
368
369		udev->bw_switch = 1;
370
371		spin_lock_irqsave(&k_lock, flags2);
372		list_add_tail(&udev->list, &k_list);
373		spin_unlock_irqrestore(&k_lock, flags2);
374
375		wake_up(&k_wait);
376	}
377#endif /* CONFIG_WIMAX_GDM72XX_K_MODE */
378
379	ret = usb_submit_urb(t->urb, GFP_ATOMIC);
380	if (ret)
381		goto send_fail;
382
383#ifdef CONFIG_WIMAX_GDM72XX_USB_PM
384	usb_mark_last_busy(usbdev);
385#endif /* CONFIG_WIMAX_GDM72XX_USB_PM */
386
387#if defined(CONFIG_WIMAX_GDM72XX_USB_PM) || defined(CONFIG_WIMAX_GDM72XX_K_MODE)
388out:
389#endif
390	spin_unlock_irqrestore(&tx->lock, flags);
391
392	if (no_spc)
393		return -ENOSPC;
394
395	return 0;
396
397send_fail:
398	t->callback = NULL;
399	__gdm_usb_send_complete(t->urb);
400	spin_unlock_irqrestore(&tx->lock, flags);
401	return ret;
402}
403
404static void gdm_usb_rcv_complete(struct urb *urb)
405{
406	struct usb_rx *r = urb->context;
407	struct rx_cxt *rx = r->rx_cxt;
408	struct usbwm_dev *udev = container_of(r->rx_cxt, struct usbwm_dev, rx);
409	struct tx_cxt *tx = &udev->tx;
410	struct usb_tx *t;
411	u16 cmd_evt;
412	unsigned long flags, flags2;
413	struct usb_device *dev = urb->dev;
414
415	/* Completion by usb_unlink_urb */
416	if (urb->status == -ECONNRESET)
417		return;
418
419	spin_lock_irqsave(&tx->lock, flags);
420
421	if (!urb->status) {
422		cmd_evt = (r->buf[0] << 8) | (r->buf[1]);
423
424		dev_dbg(&dev->dev, "usb_receive: %*ph\n", urb->actual_length,
425			r->buf);
426
427		if (cmd_evt == WIMAX_SDU_TX_FLOW) {
428			if (r->buf[4] == 0) {
429				dev_dbg(&dev->dev, "WIMAX ==> STOP SDU TX\n");
430				list_for_each_entry(t, &tx->sdu_list, list)
431					usb_unlink_urb(t->urb);
432			} else if (r->buf[4] == 1) {
433				dev_dbg(&dev->dev, "WIMAX ==> START SDU TX\n");
434				list_for_each_entry(t, &tx->sdu_list, list) {
435					usb_submit_urb(t->urb, GFP_ATOMIC);
436				}
437				/* If free buffer for sdu tx doesn't
438				 * exist, then tx queue should not be
439				 * woken. For this reason, don't pass
440				 * the command, START_SDU_TX.
441				 */
442				if (list_empty(&tx->free_list))
443					urb->actual_length = 0;
444			}
445		}
446	}
447
448	if (!urb->status && r->callback)
449		r->callback(r->cb_data, r->buf, urb->actual_length);
450
451	spin_lock_irqsave(&rx->lock, flags2);
452	put_rx_struct(rx, r);
453	spin_unlock_irqrestore(&rx->lock, flags2);
454
455	spin_unlock_irqrestore(&tx->lock, flags);
456
457#ifdef CONFIG_WIMAX_GDM72XX_USB_PM
458	usb_mark_last_busy(dev);
459#endif
460}
461
462static int gdm_usb_receive(void *priv_dev,
463			   void (*cb)(void *cb_data, void *data, int len),
464			   void *cb_data)
465{
466	struct usbwm_dev *udev = priv_dev;
467	struct usb_device *usbdev = udev->usbdev;
468	struct rx_cxt *rx = &udev->rx;
469	struct usb_rx *r;
470	unsigned long flags;
471
472	if (!udev->usbdev) {
473		dev_err(&usbdev->dev, "%s: No such device\n", __func__);
474		return -ENODEV;
475	}
476
477	spin_lock_irqsave(&rx->lock, flags);
478	r = get_rx_struct(rx);
479	spin_unlock_irqrestore(&rx->lock, flags);
480
481	if (r == NULL)
482		return -ENOMEM;
483
484	r->callback = cb;
485	r->cb_data = cb_data;
486
487	usb_fill_bulk_urb(r->urb, usbdev, usb_rcvbulkpipe(usbdev, 0x82), r->buf,
488			  RX_BUF_SIZE, gdm_usb_rcv_complete, r);
489
490	return usb_submit_urb(r->urb, GFP_ATOMIC);
491}
492
493#ifdef CONFIG_WIMAX_GDM72XX_USB_PM
494static void do_pm_control(struct work_struct *work)
495{
496	struct usbwm_dev *udev = container_of(work, struct usbwm_dev, pm_ws);
497	struct tx_cxt *tx = &udev->tx;
498	int ret;
499	unsigned long flags;
500
501	ret = usb_autopm_get_interface(udev->intf);
502	if (!ret)
503		usb_autopm_put_interface(udev->intf);
504
505	spin_lock_irqsave(&tx->lock, flags);
506	if (!(udev->usbdev->state & USB_STATE_SUSPENDED) &&
507	    (!list_empty(&tx->hci_list) || !list_empty(&tx->sdu_list))) {
508		struct usb_tx *t, *temp;
509
510		list_for_each_entry_safe(t, temp, &tx->pending_list, p_list) {
511			list_del(&t->p_list);
512			ret =  usb_submit_urb(t->urb, GFP_ATOMIC);
513
514			if (ret) {
515				t->callback = NULL;
516				__gdm_usb_send_complete(t->urb);
517			}
518		}
519	}
520	spin_unlock_irqrestore(&tx->lock, flags);
521}
522#endif /* CONFIG_WIMAX_GDM72XX_USB_PM */
523
524static int gdm_usb_probe(struct usb_interface *intf,
525			 const struct usb_device_id *id)
526{
527	int ret = 0;
528	u8 bConfigurationValue;
529	struct phy_dev *phy_dev = NULL;
530	struct usbwm_dev *udev = NULL;
531	u16 idVendor, idProduct, bcdDevice;
532
533	struct usb_device *usbdev = interface_to_usbdev(intf);
534
535	usb_get_dev(usbdev);
536	bConfigurationValue = usbdev->actconfig->desc.bConfigurationValue;
537
538	/*USB description is set up with Little-Endian*/
539	idVendor = le16_to_cpu(usbdev->descriptor.idVendor);
540	idProduct = le16_to_cpu(usbdev->descriptor.idProduct);
541	bcdDevice = le16_to_cpu(usbdev->descriptor.bcdDevice);
542
543	dev_info(&intf->dev, "Found GDM USB VID = 0x%04x PID = 0x%04x...\n",
544		 idVendor, idProduct);
545	dev_info(&intf->dev, "GCT WiMax driver version %s\n", DRIVER_VERSION);
546
547
548	if (idProduct == EMERGENCY_PID) {
549		ret = usb_emergency(usbdev);
550		goto out;
551	}
552
553	/* Support for EEPROM bootloader */
554	if (bConfigurationValue == DOWNLOAD_CONF_VALUE ||
555	    idProduct & B_DOWNLOAD) {
556		ret = usb_boot(usbdev, bcdDevice);
557		goto out;
558	}
559
560	phy_dev = kzalloc(sizeof(*phy_dev), GFP_KERNEL);
561	if (phy_dev == NULL) {
562		ret = -ENOMEM;
563		goto out;
564	}
565	udev = kzalloc(sizeof(*udev), GFP_KERNEL);
566	if (udev == NULL) {
567		ret = -ENOMEM;
568		goto out;
569	}
570
571	if (idProduct == 0x7205 || idProduct == 0x7206)
572		udev->padding = GDM7205_PADDING;
573	else
574		udev->padding = 0;
575
576	phy_dev->priv_dev = (void *)udev;
577	phy_dev->send_func = gdm_usb_send;
578	phy_dev->rcv_func = gdm_usb_receive;
579
580	ret = init_usb(udev);
581	if (ret < 0)
582		goto out;
583
584	udev->usbdev = usbdev;
585
586#ifdef CONFIG_WIMAX_GDM72XX_USB_PM
587	udev->intf = intf;
588
589	intf->needs_remote_wakeup = 1;
590	device_init_wakeup(&intf->dev, 1);
591
592	pm_runtime_set_autosuspend_delay(&usbdev->dev, 10 * 1000); /* msec */
593
594	INIT_WORK(&udev->pm_ws, do_pm_control);
595#endif /* CONFIG_WIMAX_GDM72XX_USB_PM */
596
597	ret = register_wimax_device(phy_dev, &intf->dev);
598	if (ret)
599		release_usb(udev);
600
601out:
602	if (ret) {
603		kfree(phy_dev);
604		kfree(udev);
605		usb_put_dev(usbdev);
606	} else {
607		usb_set_intfdata(intf, phy_dev);
608	}
609	return ret;
610}
611
612static void gdm_usb_disconnect(struct usb_interface *intf)
613{
614	u8 bConfigurationValue;
615	struct phy_dev *phy_dev;
616	struct usbwm_dev *udev;
617	u16 idProduct;
618	struct usb_device *usbdev = interface_to_usbdev(intf);
619
620	bConfigurationValue = usbdev->actconfig->desc.bConfigurationValue;
621	phy_dev = usb_get_intfdata(intf);
622
623	/*USB description is set up with Little-Endian*/
624	idProduct = le16_to_cpu(usbdev->descriptor.idProduct);
625
626	if (idProduct != EMERGENCY_PID &&
627	    bConfigurationValue != DOWNLOAD_CONF_VALUE &&
628	    (idProduct & B_DOWNLOAD) == 0) {
629		udev = phy_dev->priv_dev;
630		udev->usbdev = NULL;
631
632		unregister_wimax_device(phy_dev);
633		release_usb(udev);
634		kfree(udev);
635		kfree(phy_dev);
636	}
637
638	usb_put_dev(usbdev);
639}
640
641#ifdef CONFIG_WIMAX_GDM72XX_USB_PM
642static int gdm_suspend(struct usb_interface *intf, pm_message_t pm_msg)
643{
644	struct phy_dev *phy_dev;
645	struct usbwm_dev *udev;
646	struct rx_cxt *rx;
647	struct usb_rx *r;
648	unsigned long flags;
649
650	phy_dev = usb_get_intfdata(intf);
651	if (!phy_dev)
652		return 0;
653
654	udev = phy_dev->priv_dev;
655	rx = &udev->rx;
656
657	spin_lock_irqsave(&rx->lock, flags);
658
659	list_for_each_entry(r, &rx->used_list, list)
660		usb_unlink_urb(r->urb);
661
662	spin_unlock_irqrestore(&rx->lock, flags);
663
664	return 0;
665}
666
667static int gdm_resume(struct usb_interface *intf)
668{
669	struct phy_dev *phy_dev;
670	struct usbwm_dev *udev;
671	struct rx_cxt *rx;
672	struct usb_rx *r;
673	unsigned long flags;
674
675	phy_dev = usb_get_intfdata(intf);
676	if (!phy_dev)
677		return 0;
678
679	udev = phy_dev->priv_dev;
680	rx = &udev->rx;
681
682	spin_lock_irqsave(&rx->lock, flags);
683
684	list_for_each_entry(r, &rx->used_list, list)
685		usb_submit_urb(r->urb, GFP_ATOMIC);
686
687	spin_unlock_irqrestore(&rx->lock, flags);
688
689	return 0;
690}
691
692#endif /* CONFIG_WIMAX_GDM72XX_USB_PM */
693
694#ifdef CONFIG_WIMAX_GDM72XX_K_MODE
695static int k_mode_thread(void *arg)
696{
697	struct usbwm_dev *udev;
698	struct tx_cxt *tx;
699	struct rx_cxt *rx;
700	struct usb_tx *t, *temp;
701	struct usb_rx *r;
702	unsigned long flags, flags2, expire;
703	int ret;
704
705	while (!k_mode_stop) {
706		spin_lock_irqsave(&k_lock, flags2);
707		while (!list_empty(&k_list)) {
708			udev = list_entry(k_list.next, struct usbwm_dev, list);
709			tx = &udev->tx;
710			rx = &udev->rx;
711
712			list_del(&udev->list);
713			spin_unlock_irqrestore(&k_lock, flags2);
714
715			expire = jiffies + K_WAIT_TIME;
716			while (time_before(jiffies, expire))
717				schedule_timeout(K_WAIT_TIME);
718
719			spin_lock_irqsave(&rx->lock, flags);
720
721			list_for_each_entry(r, &rx->used_list, list)
722				usb_submit_urb(r->urb, GFP_ATOMIC);
723
724			spin_unlock_irqrestore(&rx->lock, flags);
725
726			spin_lock_irqsave(&tx->lock, flags);
727
728			list_for_each_entry_safe(t, temp, &tx->pending_list,
729						 p_list) {
730				list_del(&t->p_list);
731				ret = usb_submit_urb(t->urb, GFP_ATOMIC);
732
733				if (ret) {
734					t->callback = NULL;
735					__gdm_usb_send_complete(t->urb);
736				}
737			}
738
739			udev->bw_switch = 0;
740			spin_unlock_irqrestore(&tx->lock, flags);
741
742			spin_lock_irqsave(&k_lock, flags2);
743		}
744		wait_event_interruptible_lock_irq(k_wait,
745						  !list_empty(&k_list) ||
746						  k_mode_stop, k_lock);
747		spin_unlock_irqrestore(&k_lock, flags2);
748	}
749	return 0;
750}
751#endif /* CONFIG_WIMAX_GDM72XX_K_MODE */
752
753static struct usb_driver gdm_usb_driver = {
754	.name = "gdm_wimax",
755	.probe = gdm_usb_probe,
756	.disconnect = gdm_usb_disconnect,
757	.id_table = id_table,
758#ifdef CONFIG_WIMAX_GDM72XX_USB_PM
759	.supports_autosuspend = 1,
760	.suspend = gdm_suspend,
761	.resume = gdm_resume,
762	.reset_resume = gdm_resume,
763#endif
764};
765
766static int __init usb_gdm_wimax_init(void)
767{
768#ifdef CONFIG_WIMAX_GDM72XX_K_MODE
769	kthread_run(k_mode_thread, NULL, "k_mode_wimax");
770#endif /* CONFIG_WIMAX_GDM72XX_K_MODE */
771	return usb_register(&gdm_usb_driver);
772}
773
774static void __exit usb_gdm_wimax_exit(void)
775{
776#ifdef CONFIG_WIMAX_GDM72XX_K_MODE
777	k_mode_stop = 1;
778	wake_up(&k_wait);
779#endif
780	usb_deregister(&gdm_usb_driver);
781}
782
783module_init(usb_gdm_wimax_init);
784module_exit(usb_gdm_wimax_exit);
785
786MODULE_VERSION(DRIVER_VERSION);
787MODULE_DESCRIPTION("GCT WiMax Device Driver");
788MODULE_AUTHOR("Ethan Park");
789MODULE_LICENSE("GPL");
790