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