1
2
3
4
5
6
7
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
23MODULE_DESCRIPTION("FT1000 EXPRESS CARD DRIVER");
24MODULE_LICENSE("Dual MPL/GPL");
25MODULE_SUPPORTED_DEVICE("QFT FT1000 Express Cards");
26
27void *pFileStart;
28size_t FileLength;
29
30#define VENDOR_ID 0x1291
31#define PRODUCT_ID 0x11
32
33
34static struct usb_device_id id_table[] = {
35 {USB_DEVICE(VENDOR_ID, PRODUCT_ID)},
36 {},
37};
38
39MODULE_DEVICE_TABLE(usb, id_table);
40
41static bool gPollingfailed;
42static 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
59static 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
202err_thread:
203 kthread_stop(ft1000dev->pPollThread);
204err_load:
205 kfree(pFileStart);
206err_fw:
207 usb_free_urb(ft1000dev->rx_urb);
208 usb_free_urb(ft1000dev->tx_urb);
209 kfree(ft1000dev);
210 return ret;
211}
212
213static 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
247static struct usb_driver ft1000_usb_driver = {
248 .name = "ft1000usb",
249 .probe = ft1000_probe,
250 .disconnect = ft1000_disconnect,
251 .id_table = id_table,
252};
253
254module_usb_driver(ft1000_usb_driver);
255