1 /*=====================================================
2  * CopyRight (C) 2007 Qualcomm Inc. All Rights Reserved.
3  *
4  *
5  * This file is part of Express Card USB Driver
6  *
7  * $Id:
8  *====================================================
9  */
10 
11 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
12 
13 #include <linux/kernel.h>
14 #include <linux/module.h>
15 #include <linux/usb.h>
16 #include <linux/netdevice.h>
17 #include <linux/etherdevice.h>
18 #include <linux/firmware.h>
19 #include "ft1000_usb.h"
20 
21 #include <linux/kthread.h>
22 
23 MODULE_DESCRIPTION("FT1000 EXPRESS CARD DRIVER");
24 MODULE_LICENSE("Dual MPL/GPL");
25 MODULE_SUPPORTED_DEVICE("QFT FT1000 Express Cards");
26 
27 void *pFileStart;
28 size_t FileLength;
29 
30 #define VENDOR_ID 0x1291	/* Qualcomm vendor id */
31 #define PRODUCT_ID 0x11		/* fake product id */
32 
33 /* table of devices that work with this driver */
34 static struct usb_device_id id_table[] = {
35 	{USB_DEVICE(VENDOR_ID, PRODUCT_ID)},
36 	{},
37 };
38 
39 MODULE_DEVICE_TABLE(usb, id_table);
40 
41 static bool gPollingfailed;
ft1000_poll_thread(void * arg)42 static int ft1000_poll_thread(void *arg)
43 {
44 	int ret;
45 
46 	while (!kthread_should_stop()) {
47 		usleep_range(10000, 11000);
48 		if (!gPollingfailed) {
49 			ret = ft1000_poll(arg);
50 			if (ret != 0) {
51 				pr_debug("polling failed\n");
52 				gPollingfailed = true;
53 			}
54 		}
55 	}
56 	return 0;
57 }
58 
ft1000_probe(struct usb_interface * interface,const struct usb_device_id * id)59 static int ft1000_probe(struct usb_interface *interface,
60 			const struct usb_device_id *id)
61 {
62 	struct usb_host_interface *iface_desc;
63 	struct usb_endpoint_descriptor *endpoint;
64 	struct usb_device *dev;
65 	unsigned numaltsetting;
66 	int i, ret = 0, size;
67 
68 	struct ft1000_usb *ft1000dev;
69 	struct ft1000_info *pft1000info = NULL;
70 	const struct firmware *dsp_fw;
71 
72 	ft1000dev = kzalloc(sizeof(struct ft1000_usb), GFP_KERNEL);
73 	if (!ft1000dev)
74 		return -ENOMEM;
75 
76 	dev = interface_to_usbdev(interface);
77 	pr_debug("usb device descriptor info - number of configuration is %d\n",
78 		 dev->descriptor.bNumConfigurations);
79 
80 	ft1000dev->dev = dev;
81 	ft1000dev->status = 0;
82 	ft1000dev->net = NULL;
83 	ft1000dev->tx_urb = usb_alloc_urb(0, GFP_KERNEL);
84 	ft1000dev->rx_urb = usb_alloc_urb(0, GFP_KERNEL);
85 	if (!ft1000dev->tx_urb || !ft1000dev->rx_urb) {
86 		ret = -ENOMEM;
87 		goto err_fw;
88 	}
89 
90 	numaltsetting = interface->num_altsetting;
91 	pr_debug("number of alt settings is: %d\n", numaltsetting);
92 	iface_desc = interface->cur_altsetting;
93 	pr_debug("number of endpoints is: %d\n",
94 		 iface_desc->desc.bNumEndpoints);
95 	pr_debug("descriptor type is: %d\n", iface_desc->desc.bDescriptorType);
96 	pr_debug("interface number is: %d\n",
97 		 iface_desc->desc.bInterfaceNumber);
98 	pr_debug("alternatesetting is: %d\n",
99 		 iface_desc->desc.bAlternateSetting);
100 	pr_debug("interface class is: %d\n", iface_desc->desc.bInterfaceClass);
101 	pr_debug("control endpoint info:\n");
102 	pr_debug("descriptor0 type -- %d\n",
103 		 iface_desc->endpoint[0].desc.bmAttributes);
104 	pr_debug("descriptor1 type -- %d\n",
105 		 iface_desc->endpoint[1].desc.bmAttributes);
106 	pr_debug("descriptor2 type -- %d\n",
107 		 iface_desc->endpoint[2].desc.bmAttributes);
108 
109 	for (i = 0; i < iface_desc->desc.bNumEndpoints; i++) {
110 		endpoint =
111 			(struct usb_endpoint_descriptor *)&iface_desc->
112 			endpoint[i].desc;
113 		pr_debug("endpoint %d\n", i);
114 		pr_debug("bEndpointAddress=%x, bmAttributes=%x\n",
115 			 endpoint->bEndpointAddress, endpoint->bmAttributes);
116 		if ((endpoint->bEndpointAddress & USB_DIR_IN)
117 		    && ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
118 			USB_ENDPOINT_XFER_BULK)) {
119 			ft1000dev->bulk_in_endpointAddr =
120 				endpoint->bEndpointAddress;
121 			pr_debug("in: %d\n", endpoint->bEndpointAddress);
122 		}
123 
124 		if (!(endpoint->bEndpointAddress & USB_DIR_IN)
125 		    && ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
126 			USB_ENDPOINT_XFER_BULK)) {
127 			ft1000dev->bulk_out_endpointAddr =
128 				endpoint->bEndpointAddress;
129 			pr_debug("out: %d\n", endpoint->bEndpointAddress);
130 		}
131 	}
132 
133 	pr_debug("bulk_in=%d, bulk_out=%d\n",
134 		 ft1000dev->bulk_in_endpointAddr,
135 		 ft1000dev->bulk_out_endpointAddr);
136 
137 	ret = request_firmware(&dsp_fw, "ft3000.img", &dev->dev);
138 	if (ret < 0) {
139 		dev_err(interface->usb_dev, "Error request_firmware()\n");
140 		goto err_fw;
141 	}
142 
143 	size = max_t(uint, dsp_fw->size, 4096);
144 	pFileStart = kmalloc(size, GFP_KERNEL);
145 
146 	if (!pFileStart) {
147 		release_firmware(dsp_fw);
148 		ret = -ENOMEM;
149 		goto err_fw;
150 	}
151 
152 	memcpy(pFileStart, dsp_fw->data, dsp_fw->size);
153 	FileLength = dsp_fw->size;
154 	release_firmware(dsp_fw);
155 
156 	pr_debug("start downloading dsp image...\n");
157 
158 	ret = init_ft1000_netdev(ft1000dev);
159 	if (ret)
160 		goto err_load;
161 
162 	pft1000info = netdev_priv(ft1000dev->net);
163 
164 	pr_debug("pft1000info=%p\n", pft1000info);
165 	ret = dsp_reload(ft1000dev);
166 	if (ret) {
167 		dev_err(interface->usb_dev,
168 			"Problem with DSP image loading\n");
169 		goto err_load;
170 	}
171 
172 	gPollingfailed = false;
173 	ft1000dev->pPollThread =
174 		kthread_run(ft1000_poll_thread, ft1000dev, "ft1000_poll");
175 
176 	if (IS_ERR(ft1000dev->pPollThread)) {
177 		ret = PTR_ERR(ft1000dev->pPollThread);
178 		goto err_load;
179 	}
180 
181 	msleep(500);
182 
183 	while (!pft1000info->CardReady) {
184 		if (gPollingfailed) {
185 			ret = -EIO;
186 			goto err_thread;
187 		}
188 		msleep(100);
189 		pr_debug("Waiting for Card Ready\n");
190 	}
191 
192 	pr_debug("Card Ready!!!! Registering network device\n");
193 
194 	ret = reg_ft1000_netdev(ft1000dev, interface);
195 	if (ret)
196 		goto err_thread;
197 
198 	ft1000dev->NetDevRegDone = 1;
199 
200 	return 0;
201 
202 err_thread:
203 	kthread_stop(ft1000dev->pPollThread);
204 err_load:
205 	kfree(pFileStart);
206 err_fw:
207 	usb_free_urb(ft1000dev->rx_urb);
208 	usb_free_urb(ft1000dev->tx_urb);
209 	kfree(ft1000dev);
210 	return ret;
211 }
212 
ft1000_disconnect(struct usb_interface * interface)213 static void ft1000_disconnect(struct usb_interface *interface)
214 {
215 	struct ft1000_info *pft1000info;
216 	struct ft1000_usb *ft1000dev;
217 
218 	pft1000info = (struct ft1000_info *)usb_get_intfdata(interface);
219 	pr_debug("In disconnect pft1000info=%p\n", pft1000info);
220 
221 	if (pft1000info) {
222 		ft1000dev = pft1000info->priv;
223 		if (ft1000dev->pPollThread)
224 			kthread_stop(ft1000dev->pPollThread);
225 
226 		pr_debug("threads are terminated\n");
227 
228 		if (ft1000dev->net) {
229 			pr_debug("destroy char driver\n");
230 			ft1000_destroy_dev(ft1000dev->net);
231 			unregister_netdev(ft1000dev->net);
232 			pr_debug("network device unregistered\n");
233 			free_netdev(ft1000dev->net);
234 
235 		}
236 
237 		usb_free_urb(ft1000dev->rx_urb);
238 		usb_free_urb(ft1000dev->tx_urb);
239 
240 		pr_debug("urb freed\n");
241 
242 		kfree(ft1000dev);
243 	}
244 	kfree(pFileStart);
245 }
246 
247 static struct usb_driver ft1000_usb_driver = {
248 	.name = "ft1000usb",
249 	.probe = ft1000_probe,
250 	.disconnect = ft1000_disconnect,
251 	.id_table = id_table,
252 };
253 
254 module_usb_driver(ft1000_usb_driver);
255