Bluetooth: Adding USB device 13d3:3375 as an Atheros AR3012.
[pandora-kernel.git] / drivers / bluetooth / ath3k.c
1 /*
2  * Copyright (c) 2008-2009 Atheros Communications Inc.
3  *
4  *  This program is free software; you can redistribute it and/or modify
5  *  it under the terms of the GNU General Public License as published by
6  *  the Free Software Foundation; either version 2 of the License, or
7  *  (at your option) any later version.
8  *
9  *  This program is distributed in the hope that it will be useful,
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  *  GNU General Public License for more details.
13  *
14  *  You should have received a copy of the GNU General Public License
15  *  along with this program; if not, write to the Free Software
16  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17  *
18  */
19
20
21 #include <linux/module.h>
22 #include <linux/kernel.h>
23 #include <linux/init.h>
24 #include <linux/slab.h>
25 #include <linux/types.h>
26 #include <linux/errno.h>
27 #include <linux/device.h>
28 #include <linux/firmware.h>
29 #include <linux/usb.h>
30 #include <net/bluetooth/bluetooth.h>
31
32 #define VERSION "1.0"
33
34 #define ATH3K_DNLOAD                            0x01
35 #define ATH3K_GETSTATE                          0x05
36 #define ATH3K_SET_NORMAL_MODE                   0x07
37 #define ATH3K_GETVERSION                        0x09
38 #define USB_REG_SWITCH_VID_PID                  0x0a
39
40 #define ATH3K_MODE_MASK                         0x3F
41 #define ATH3K_NORMAL_MODE                       0x0E
42
43 #define ATH3K_PATCH_UPDATE                      0x80
44 #define ATH3K_SYSCFG_UPDATE                     0x40
45
46 #define ATH3K_XTAL_FREQ_26M                     0x00
47 #define ATH3K_XTAL_FREQ_40M                     0x01
48 #define ATH3K_XTAL_FREQ_19P2                    0x02
49 #define ATH3K_NAME_LEN                          0xFF
50
51 struct ath3k_version {
52         unsigned int    rom_version;
53         unsigned int    build_version;
54         unsigned int    ram_version;
55         unsigned char   ref_clock;
56         unsigned char   reserved[0x07];
57 };
58
59 static struct usb_device_id ath3k_table[] = {
60         /* Atheros AR3011 */
61         { USB_DEVICE(0x0CF3, 0x3000) },
62
63         /* Atheros AR3011 with sflash firmware*/
64         { USB_DEVICE(0x0CF3, 0x3002) },
65         { USB_DEVICE(0x13d3, 0x3304) },
66         { USB_DEVICE(0x0930, 0x0215) },
67         { USB_DEVICE(0x0489, 0xE03D) },
68
69         /* Atheros AR9285 Malbec with sflash firmware */
70         { USB_DEVICE(0x03F0, 0x311D) },
71
72         /* Atheros AR3012 with sflash firmware*/
73         { USB_DEVICE(0x0CF3, 0x3004) },
74         { USB_DEVICE(0x13d3, 0x3375) },
75
76         /* Atheros AR5BBU12 with sflash firmware */
77         { USB_DEVICE(0x0489, 0xE02C) },
78
79         { }     /* Terminating entry */
80 };
81
82 MODULE_DEVICE_TABLE(usb, ath3k_table);
83
84 #define BTUSB_ATH3012           0x80
85 /* This table is to load patch and sysconfig files
86  * for AR3012 */
87 static struct usb_device_id ath3k_blist_tbl[] = {
88
89         /* Atheros AR3012 with sflash firmware*/
90         { USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_ATH3012 },
91         { USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 },
92
93         { }     /* Terminating entry */
94 };
95
96 #define USB_REQ_DFU_DNLOAD      1
97 #define BULK_SIZE               4096
98 #define FW_HDR_SIZE             20
99
100 static int ath3k_load_firmware(struct usb_device *udev,
101                                 const struct firmware *firmware)
102 {
103         u8 *send_buf;
104         int err, pipe, len, size, sent = 0;
105         int count = firmware->size;
106
107         BT_DBG("udev %p", udev);
108
109         pipe = usb_sndctrlpipe(udev, 0);
110
111         send_buf = kmalloc(BULK_SIZE, GFP_KERNEL);
112         if (!send_buf) {
113                 BT_ERR("Can't allocate memory chunk for firmware");
114                 return -ENOMEM;
115         }
116
117         memcpy(send_buf, firmware->data, 20);
118         if ((err = usb_control_msg(udev, pipe,
119                                 USB_REQ_DFU_DNLOAD,
120                                 USB_TYPE_VENDOR, 0, 0,
121                                 send_buf, 20, USB_CTRL_SET_TIMEOUT)) < 0) {
122                 BT_ERR("Can't change to loading configuration err");
123                 goto error;
124         }
125         sent += 20;
126         count -= 20;
127
128         while (count) {
129                 size = min_t(uint, count, BULK_SIZE);
130                 pipe = usb_sndbulkpipe(udev, 0x02);
131                 memcpy(send_buf, firmware->data + sent, size);
132
133                 err = usb_bulk_msg(udev, pipe, send_buf, size,
134                                         &len, 3000);
135
136                 if (err || (len != size)) {
137                         BT_ERR("Error in firmware loading err = %d,"
138                                 "len = %d, size = %d", err, len, size);
139                         goto error;
140                 }
141
142                 sent  += size;
143                 count -= size;
144         }
145
146 error:
147         kfree(send_buf);
148         return err;
149 }
150
151 static int ath3k_get_state(struct usb_device *udev, unsigned char *state)
152 {
153         int pipe = 0;
154
155         pipe = usb_rcvctrlpipe(udev, 0);
156         return usb_control_msg(udev, pipe, ATH3K_GETSTATE,
157                         USB_TYPE_VENDOR | USB_DIR_IN, 0, 0,
158                         state, 0x01, USB_CTRL_SET_TIMEOUT);
159 }
160
161 static int ath3k_get_version(struct usb_device *udev,
162                         struct ath3k_version *version)
163 {
164         int pipe = 0;
165
166         pipe = usb_rcvctrlpipe(udev, 0);
167         return usb_control_msg(udev, pipe, ATH3K_GETVERSION,
168                         USB_TYPE_VENDOR | USB_DIR_IN, 0, 0, version,
169                         sizeof(struct ath3k_version),
170                         USB_CTRL_SET_TIMEOUT);
171 }
172
173 static int ath3k_load_fwfile(struct usb_device *udev,
174                 const struct firmware *firmware)
175 {
176         u8 *send_buf;
177         int err, pipe, len, size, count, sent = 0;
178         int ret;
179
180         count = firmware->size;
181
182         send_buf = kmalloc(BULK_SIZE, GFP_KERNEL);
183         if (!send_buf) {
184                 BT_ERR("Can't allocate memory chunk for firmware");
185                 return -ENOMEM;
186         }
187
188         size = min_t(uint, count, FW_HDR_SIZE);
189         memcpy(send_buf, firmware->data, size);
190
191         pipe = usb_sndctrlpipe(udev, 0);
192         ret = usb_control_msg(udev, pipe, ATH3K_DNLOAD,
193                         USB_TYPE_VENDOR, 0, 0, send_buf,
194                         size, USB_CTRL_SET_TIMEOUT);
195         if (ret < 0) {
196                 BT_ERR("Can't change to loading configuration err");
197                 kfree(send_buf);
198                 return ret;
199         }
200
201         sent += size;
202         count -= size;
203
204         while (count) {
205                 size = min_t(uint, count, BULK_SIZE);
206                 pipe = usb_sndbulkpipe(udev, 0x02);
207
208                 memcpy(send_buf, firmware->data + sent, size);
209
210                 err = usb_bulk_msg(udev, pipe, send_buf, size,
211                                         &len, 3000);
212                 if (err || (len != size)) {
213                         BT_ERR("Error in firmware loading err = %d,"
214                                 "len = %d, size = %d", err, len, size);
215                         kfree(send_buf);
216                         return err;
217                 }
218                 sent  += size;
219                 count -= size;
220         }
221
222         kfree(send_buf);
223         return 0;
224 }
225
226 static int ath3k_switch_pid(struct usb_device *udev)
227 {
228         int pipe = 0;
229
230         pipe = usb_sndctrlpipe(udev, 0);
231         return usb_control_msg(udev, pipe, USB_REG_SWITCH_VID_PID,
232                         USB_TYPE_VENDOR, 0, 0,
233                         NULL, 0, USB_CTRL_SET_TIMEOUT);
234 }
235
236 static int ath3k_set_normal_mode(struct usb_device *udev)
237 {
238         unsigned char fw_state;
239         int pipe = 0, ret;
240
241         ret = ath3k_get_state(udev, &fw_state);
242         if (ret < 0) {
243                 BT_ERR("Can't get state to change to normal mode err");
244                 return ret;
245         }
246
247         if ((fw_state & ATH3K_MODE_MASK) == ATH3K_NORMAL_MODE) {
248                 BT_DBG("firmware was already in normal mode");
249                 return 0;
250         }
251
252         pipe = usb_sndctrlpipe(udev, 0);
253         return usb_control_msg(udev, pipe, ATH3K_SET_NORMAL_MODE,
254                         USB_TYPE_VENDOR, 0, 0,
255                         NULL, 0, USB_CTRL_SET_TIMEOUT);
256 }
257
258 static int ath3k_load_patch(struct usb_device *udev)
259 {
260         unsigned char fw_state;
261         char filename[ATH3K_NAME_LEN] = {0};
262         const struct firmware *firmware;
263         struct ath3k_version fw_version, pt_version;
264         int ret;
265
266         ret = ath3k_get_state(udev, &fw_state);
267         if (ret < 0) {
268                 BT_ERR("Can't get state to change to load ram patch err");
269                 return ret;
270         }
271
272         if (fw_state & ATH3K_PATCH_UPDATE) {
273                 BT_DBG("Patch was already downloaded");
274                 return 0;
275         }
276
277         ret = ath3k_get_version(udev, &fw_version);
278         if (ret < 0) {
279                 BT_ERR("Can't get version to change to load ram patch err");
280                 return ret;
281         }
282
283         snprintf(filename, ATH3K_NAME_LEN, "ar3k/AthrBT_0x%08x.dfu",
284                 fw_version.rom_version);
285
286         ret = request_firmware(&firmware, filename, &udev->dev);
287         if (ret < 0) {
288                 BT_ERR("Patch file not found %s", filename);
289                 return ret;
290         }
291
292         pt_version.rom_version = *(int *)(firmware->data + firmware->size - 8);
293         pt_version.build_version = *(int *)
294                 (firmware->data + firmware->size - 4);
295
296         if ((pt_version.rom_version != fw_version.rom_version) ||
297                 (pt_version.build_version <= fw_version.build_version)) {
298                 BT_ERR("Patch file version did not match with firmware");
299                 release_firmware(firmware);
300                 return -EINVAL;
301         }
302
303         ret = ath3k_load_fwfile(udev, firmware);
304         release_firmware(firmware);
305
306         return ret;
307 }
308
309 static int ath3k_load_syscfg(struct usb_device *udev)
310 {
311         unsigned char fw_state;
312         char filename[ATH3K_NAME_LEN] = {0};
313         const struct firmware *firmware;
314         struct ath3k_version fw_version;
315         int clk_value, ret;
316
317         ret = ath3k_get_state(udev, &fw_state);
318         if (ret < 0) {
319                 BT_ERR("Can't get state to change to load configration err");
320                 return -EBUSY;
321         }
322
323         ret = ath3k_get_version(udev, &fw_version);
324         if (ret < 0) {
325                 BT_ERR("Can't get version to change to load ram patch err");
326                 return ret;
327         }
328
329         switch (fw_version.ref_clock) {
330
331         case ATH3K_XTAL_FREQ_26M:
332                 clk_value = 26;
333                 break;
334         case ATH3K_XTAL_FREQ_40M:
335                 clk_value = 40;
336                 break;
337         case ATH3K_XTAL_FREQ_19P2:
338                 clk_value = 19;
339                 break;
340         default:
341                 clk_value = 0;
342                 break;
343         }
344
345         snprintf(filename, ATH3K_NAME_LEN, "ar3k/ramps_0x%08x_%d%s",
346                 fw_version.rom_version, clk_value, ".dfu");
347
348         ret = request_firmware(&firmware, filename, &udev->dev);
349         if (ret < 0) {
350                 BT_ERR("Configuration file not found %s", filename);
351                 return ret;
352         }
353
354         ret = ath3k_load_fwfile(udev, firmware);
355         release_firmware(firmware);
356
357         return ret;
358 }
359
360 static int ath3k_probe(struct usb_interface *intf,
361                         const struct usb_device_id *id)
362 {
363         const struct firmware *firmware;
364         struct usb_device *udev = interface_to_usbdev(intf);
365         int ret;
366
367         BT_DBG("intf %p id %p", intf, id);
368
369         if (intf->cur_altsetting->desc.bInterfaceNumber != 0)
370                 return -ENODEV;
371
372         /* match device ID in ath3k blacklist table */
373         if (!id->driver_info) {
374                 const struct usb_device_id *match;
375                 match = usb_match_id(intf, ath3k_blist_tbl);
376                 if (match)
377                         id = match;
378         }
379
380         /* load patch and sysconfig files for AR3012 */
381         if (id->driver_info & BTUSB_ATH3012) {
382
383                 /* New firmware with patch and sysconfig files already loaded */
384                 if (le16_to_cpu(udev->descriptor.bcdDevice) > 0x0001)
385                         return -ENODEV;
386
387                 ret = ath3k_load_patch(udev);
388                 if (ret < 0) {
389                         BT_ERR("Loading patch file failed");
390                         return ret;
391                 }
392                 ret = ath3k_load_syscfg(udev);
393                 if (ret < 0) {
394                         BT_ERR("Loading sysconfig file failed");
395                         return ret;
396                 }
397                 ret = ath3k_set_normal_mode(udev);
398                 if (ret < 0) {
399                         BT_ERR("Set normal mode failed");
400                         return ret;
401                 }
402                 ath3k_switch_pid(udev);
403                 return 0;
404         }
405
406         if (request_firmware(&firmware, "ath3k-1.fw", &udev->dev) < 0) {
407                 BT_ERR("Error loading firmware");
408                 return -EIO;
409         }
410
411         ret = ath3k_load_firmware(udev, firmware);
412         release_firmware(firmware);
413
414         return ret;
415 }
416
417 static void ath3k_disconnect(struct usb_interface *intf)
418 {
419         BT_DBG("ath3k_disconnect intf %p", intf);
420 }
421
422 static struct usb_driver ath3k_driver = {
423         .name           = "ath3k",
424         .probe          = ath3k_probe,
425         .disconnect     = ath3k_disconnect,
426         .id_table       = ath3k_table,
427 };
428
429 static int __init ath3k_init(void)
430 {
431         BT_INFO("Atheros AR30xx firmware driver ver %s", VERSION);
432         return usb_register(&ath3k_driver);
433 }
434
435 static void __exit ath3k_exit(void)
436 {
437         usb_deregister(&ath3k_driver);
438 }
439
440 module_init(ath3k_init);
441 module_exit(ath3k_exit);
442
443 MODULE_AUTHOR("Atheros Communications");
444 MODULE_DESCRIPTION("Atheros AR30xx firmware driver");
445 MODULE_VERSION(VERSION);
446 MODULE_LICENSE("GPL");
447 MODULE_FIRMWARE("ath3k-1.fw");