0001
0002
0003
0004
0005
0006
0007 #include <linux/module.h>
0008 #include <linux/kernel.h>
0009 #include <linux/init.h>
0010 #include <linux/slab.h>
0011 #include <linux/types.h>
0012 #include <linux/errno.h>
0013 #include <linux/firmware.h>
0014 #include <linux/usb.h>
0015 #include <asm/unaligned.h>
0016 #include <net/bluetooth/bluetooth.h>
0017
0018 #define VERSION "1.0"
0019 #define ATH3K_FIRMWARE "ath3k-1.fw"
0020
0021 #define ATH3K_DNLOAD 0x01
0022 #define ATH3K_GETSTATE 0x05
0023 #define ATH3K_SET_NORMAL_MODE 0x07
0024 #define ATH3K_GETVERSION 0x09
0025 #define USB_REG_SWITCH_VID_PID 0x0a
0026
0027 #define ATH3K_MODE_MASK 0x3F
0028 #define ATH3K_NORMAL_MODE 0x0E
0029
0030 #define ATH3K_PATCH_UPDATE 0x80
0031 #define ATH3K_SYSCFG_UPDATE 0x40
0032
0033 #define ATH3K_XTAL_FREQ_26M 0x00
0034 #define ATH3K_XTAL_FREQ_40M 0x01
0035 #define ATH3K_XTAL_FREQ_19P2 0x02
0036 #define ATH3K_NAME_LEN 0xFF
0037
0038 struct ath3k_version {
0039 __le32 rom_version;
0040 __le32 build_version;
0041 __le32 ram_version;
0042 __u8 ref_clock;
0043 __u8 reserved[7];
0044 } __packed;
0045
0046 static const struct usb_device_id ath3k_table[] = {
0047
0048 { USB_DEVICE(0x0CF3, 0x3000) },
0049
0050
0051 { USB_DEVICE(0x0489, 0xE027) },
0052 { USB_DEVICE(0x0489, 0xE03D) },
0053 { USB_DEVICE(0x04F2, 0xAFF1) },
0054 { USB_DEVICE(0x0930, 0x0215) },
0055 { USB_DEVICE(0x0CF3, 0x3002) },
0056 { USB_DEVICE(0x0CF3, 0xE019) },
0057 { USB_DEVICE(0x13d3, 0x3304) },
0058
0059
0060 { USB_DEVICE(0x03F0, 0x311D) },
0061
0062
0063 { USB_DEVICE(0x0489, 0xe04d) },
0064 { USB_DEVICE(0x0489, 0xe04e) },
0065 { USB_DEVICE(0x0489, 0xe057) },
0066 { USB_DEVICE(0x0489, 0xe056) },
0067 { USB_DEVICE(0x0489, 0xe05f) },
0068 { USB_DEVICE(0x0489, 0xe076) },
0069 { USB_DEVICE(0x0489, 0xe078) },
0070 { USB_DEVICE(0x0489, 0xe095) },
0071 { USB_DEVICE(0x04c5, 0x1330) },
0072 { USB_DEVICE(0x04CA, 0x3004) },
0073 { USB_DEVICE(0x04CA, 0x3005) },
0074 { USB_DEVICE(0x04CA, 0x3006) },
0075 { USB_DEVICE(0x04CA, 0x3007) },
0076 { USB_DEVICE(0x04CA, 0x3008) },
0077 { USB_DEVICE(0x04CA, 0x300b) },
0078 { USB_DEVICE(0x04CA, 0x300d) },
0079 { USB_DEVICE(0x04CA, 0x300f) },
0080 { USB_DEVICE(0x04CA, 0x3010) },
0081 { USB_DEVICE(0x04CA, 0x3014) },
0082 { USB_DEVICE(0x04CA, 0x3018) },
0083 { USB_DEVICE(0x0930, 0x0219) },
0084 { USB_DEVICE(0x0930, 0x021c) },
0085 { USB_DEVICE(0x0930, 0x0220) },
0086 { USB_DEVICE(0x0930, 0x0227) },
0087 { USB_DEVICE(0x0b05, 0x17d0) },
0088 { USB_DEVICE(0x0CF3, 0x0036) },
0089 { USB_DEVICE(0x0CF3, 0x3004) },
0090 { USB_DEVICE(0x0CF3, 0x3008) },
0091 { USB_DEVICE(0x0CF3, 0x311D) },
0092 { USB_DEVICE(0x0CF3, 0x311E) },
0093 { USB_DEVICE(0x0CF3, 0x311F) },
0094 { USB_DEVICE(0x0cf3, 0x3121) },
0095 { USB_DEVICE(0x0CF3, 0x817a) },
0096 { USB_DEVICE(0x0CF3, 0x817b) },
0097 { USB_DEVICE(0x0cf3, 0xe003) },
0098 { USB_DEVICE(0x0CF3, 0xE004) },
0099 { USB_DEVICE(0x0CF3, 0xE005) },
0100 { USB_DEVICE(0x0CF3, 0xE006) },
0101 { USB_DEVICE(0x13d3, 0x3362) },
0102 { USB_DEVICE(0x13d3, 0x3375) },
0103 { USB_DEVICE(0x13d3, 0x3393) },
0104 { USB_DEVICE(0x13d3, 0x3395) },
0105 { USB_DEVICE(0x13d3, 0x3402) },
0106 { USB_DEVICE(0x13d3, 0x3408) },
0107 { USB_DEVICE(0x13d3, 0x3423) },
0108 { USB_DEVICE(0x13d3, 0x3432) },
0109 { USB_DEVICE(0x13d3, 0x3472) },
0110 { USB_DEVICE(0x13d3, 0x3474) },
0111 { USB_DEVICE(0x13d3, 0x3487) },
0112 { USB_DEVICE(0x13d3, 0x3490) },
0113
0114
0115 { USB_DEVICE(0x0489, 0xE02C) },
0116
0117
0118 { USB_DEVICE(0x0489, 0xE036) },
0119 { USB_DEVICE(0x0489, 0xE03C) },
0120
0121 { }
0122 };
0123
0124 MODULE_DEVICE_TABLE(usb, ath3k_table);
0125
0126 #define BTUSB_ATH3012 0x80
0127
0128
0129
0130 static const struct usb_device_id ath3k_blist_tbl[] = {
0131
0132
0133 { USB_DEVICE(0x0489, 0xe04e), .driver_info = BTUSB_ATH3012 },
0134 { USB_DEVICE(0x0489, 0xe04d), .driver_info = BTUSB_ATH3012 },
0135 { USB_DEVICE(0x0489, 0xe056), .driver_info = BTUSB_ATH3012 },
0136 { USB_DEVICE(0x0489, 0xe057), .driver_info = BTUSB_ATH3012 },
0137 { USB_DEVICE(0x0489, 0xe05f), .driver_info = BTUSB_ATH3012 },
0138 { USB_DEVICE(0x0489, 0xe076), .driver_info = BTUSB_ATH3012 },
0139 { USB_DEVICE(0x0489, 0xe078), .driver_info = BTUSB_ATH3012 },
0140 { USB_DEVICE(0x0489, 0xe095), .driver_info = BTUSB_ATH3012 },
0141 { USB_DEVICE(0x04c5, 0x1330), .driver_info = BTUSB_ATH3012 },
0142 { USB_DEVICE(0x04ca, 0x3004), .driver_info = BTUSB_ATH3012 },
0143 { USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 },
0144 { USB_DEVICE(0x04ca, 0x3006), .driver_info = BTUSB_ATH3012 },
0145 { USB_DEVICE(0x04ca, 0x3007), .driver_info = BTUSB_ATH3012 },
0146 { USB_DEVICE(0x04ca, 0x3008), .driver_info = BTUSB_ATH3012 },
0147 { USB_DEVICE(0x04ca, 0x300b), .driver_info = BTUSB_ATH3012 },
0148 { USB_DEVICE(0x04ca, 0x300d), .driver_info = BTUSB_ATH3012 },
0149 { USB_DEVICE(0x04ca, 0x300f), .driver_info = BTUSB_ATH3012 },
0150 { USB_DEVICE(0x04ca, 0x3010), .driver_info = BTUSB_ATH3012 },
0151 { USB_DEVICE(0x04ca, 0x3014), .driver_info = BTUSB_ATH3012 },
0152 { USB_DEVICE(0x04ca, 0x3018), .driver_info = BTUSB_ATH3012 },
0153 { USB_DEVICE(0x0930, 0x0219), .driver_info = BTUSB_ATH3012 },
0154 { USB_DEVICE(0x0930, 0x021c), .driver_info = BTUSB_ATH3012 },
0155 { USB_DEVICE(0x0930, 0x0220), .driver_info = BTUSB_ATH3012 },
0156 { USB_DEVICE(0x0930, 0x0227), .driver_info = BTUSB_ATH3012 },
0157 { USB_DEVICE(0x0b05, 0x17d0), .driver_info = BTUSB_ATH3012 },
0158 { USB_DEVICE(0x0CF3, 0x0036), .driver_info = BTUSB_ATH3012 },
0159 { USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_ATH3012 },
0160 { USB_DEVICE(0x0cf3, 0x3008), .driver_info = BTUSB_ATH3012 },
0161 { USB_DEVICE(0x0cf3, 0x311D), .driver_info = BTUSB_ATH3012 },
0162 { USB_DEVICE(0x0cf3, 0x311E), .driver_info = BTUSB_ATH3012 },
0163 { USB_DEVICE(0x0cf3, 0x311F), .driver_info = BTUSB_ATH3012 },
0164 { USB_DEVICE(0x0cf3, 0x3121), .driver_info = BTUSB_ATH3012 },
0165 { USB_DEVICE(0x0CF3, 0x817a), .driver_info = BTUSB_ATH3012 },
0166 { USB_DEVICE(0x0CF3, 0x817b), .driver_info = BTUSB_ATH3012 },
0167 { USB_DEVICE(0x0cf3, 0xe004), .driver_info = BTUSB_ATH3012 },
0168 { USB_DEVICE(0x0cf3, 0xe005), .driver_info = BTUSB_ATH3012 },
0169 { USB_DEVICE(0x0cf3, 0xe006), .driver_info = BTUSB_ATH3012 },
0170 { USB_DEVICE(0x0cf3, 0xe003), .driver_info = BTUSB_ATH3012 },
0171 { USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 },
0172 { USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 },
0173 { USB_DEVICE(0x13d3, 0x3393), .driver_info = BTUSB_ATH3012 },
0174 { USB_DEVICE(0x13d3, 0x3395), .driver_info = BTUSB_ATH3012 },
0175 { USB_DEVICE(0x13d3, 0x3402), .driver_info = BTUSB_ATH3012 },
0176 { USB_DEVICE(0x13d3, 0x3408), .driver_info = BTUSB_ATH3012 },
0177 { USB_DEVICE(0x13d3, 0x3423), .driver_info = BTUSB_ATH3012 },
0178 { USB_DEVICE(0x13d3, 0x3432), .driver_info = BTUSB_ATH3012 },
0179 { USB_DEVICE(0x13d3, 0x3472), .driver_info = BTUSB_ATH3012 },
0180 { USB_DEVICE(0x13d3, 0x3474), .driver_info = BTUSB_ATH3012 },
0181 { USB_DEVICE(0x13d3, 0x3487), .driver_info = BTUSB_ATH3012 },
0182 { USB_DEVICE(0x13d3, 0x3490), .driver_info = BTUSB_ATH3012 },
0183
0184
0185 { USB_DEVICE(0x0489, 0xE036), .driver_info = BTUSB_ATH3012 },
0186 { USB_DEVICE(0x0489, 0xE03C), .driver_info = BTUSB_ATH3012 },
0187
0188 { }
0189 };
0190
0191 static inline void ath3k_log_failed_loading(int err, int len, int size,
0192 int count)
0193 {
0194 BT_ERR("Firmware loading err = %d, len = %d, size = %d, count = %d",
0195 err, len, size, count);
0196 }
0197
0198 #define USB_REQ_DFU_DNLOAD 1
0199 #define BULK_SIZE 4096
0200 #define FW_HDR_SIZE 20
0201 #define TIMEGAP_USEC_MIN 50
0202 #define TIMEGAP_USEC_MAX 100
0203
0204 static int ath3k_load_firmware(struct usb_device *udev,
0205 const struct firmware *firmware)
0206 {
0207 u8 *send_buf;
0208 int len = 0;
0209 int err, pipe, size, sent = 0;
0210 int count = firmware->size;
0211
0212 BT_DBG("udev %p", udev);
0213
0214 send_buf = kmalloc(BULK_SIZE, GFP_KERNEL);
0215 if (!send_buf) {
0216 BT_ERR("Can't allocate memory chunk for firmware");
0217 return -ENOMEM;
0218 }
0219
0220 err = usb_control_msg_send(udev, 0, USB_REQ_DFU_DNLOAD, USB_TYPE_VENDOR,
0221 0, 0, firmware->data, FW_HDR_SIZE,
0222 USB_CTRL_SET_TIMEOUT, GFP_KERNEL);
0223 if (err) {
0224 BT_ERR("Can't change to loading configuration err");
0225 goto error;
0226 }
0227 sent += FW_HDR_SIZE;
0228 count -= FW_HDR_SIZE;
0229
0230 pipe = usb_sndbulkpipe(udev, 0x02);
0231
0232 while (count) {
0233
0234 usleep_range(TIMEGAP_USEC_MIN, TIMEGAP_USEC_MAX);
0235
0236 size = min_t(uint, count, BULK_SIZE);
0237 memcpy(send_buf, firmware->data + sent, size);
0238
0239 err = usb_bulk_msg(udev, pipe, send_buf, size,
0240 &len, 3000);
0241
0242 if (err || (len != size)) {
0243 ath3k_log_failed_loading(err, len, size, count);
0244 goto error;
0245 }
0246
0247 sent += size;
0248 count -= size;
0249 }
0250
0251 error:
0252 kfree(send_buf);
0253 return err;
0254 }
0255
0256 static int ath3k_get_state(struct usb_device *udev, unsigned char *state)
0257 {
0258 return usb_control_msg_recv(udev, 0, ATH3K_GETSTATE,
0259 USB_TYPE_VENDOR | USB_DIR_IN, 0, 0,
0260 state, 1, USB_CTRL_SET_TIMEOUT,
0261 GFP_KERNEL);
0262 }
0263
0264 static int ath3k_get_version(struct usb_device *udev,
0265 struct ath3k_version *version)
0266 {
0267 return usb_control_msg_recv(udev, 0, ATH3K_GETVERSION,
0268 USB_TYPE_VENDOR | USB_DIR_IN, 0, 0,
0269 version, sizeof(*version), USB_CTRL_SET_TIMEOUT,
0270 GFP_KERNEL);
0271 }
0272
0273 static int ath3k_load_fwfile(struct usb_device *udev,
0274 const struct firmware *firmware)
0275 {
0276 u8 *send_buf;
0277 int len = 0;
0278 int err, pipe, size, count, sent = 0;
0279 int ret;
0280
0281 count = firmware->size;
0282
0283 send_buf = kmalloc(BULK_SIZE, GFP_KERNEL);
0284 if (!send_buf) {
0285 BT_ERR("Can't allocate memory chunk for firmware");
0286 return -ENOMEM;
0287 }
0288
0289 size = min_t(uint, count, FW_HDR_SIZE);
0290
0291 ret = usb_control_msg_send(udev, 0, ATH3K_DNLOAD, USB_TYPE_VENDOR, 0, 0,
0292 firmware->data, size, USB_CTRL_SET_TIMEOUT,
0293 GFP_KERNEL);
0294 if (ret) {
0295 BT_ERR("Can't change to loading configuration err");
0296 kfree(send_buf);
0297 return ret;
0298 }
0299
0300 sent += size;
0301 count -= size;
0302
0303 pipe = usb_sndbulkpipe(udev, 0x02);
0304
0305 while (count) {
0306
0307 usleep_range(TIMEGAP_USEC_MIN, TIMEGAP_USEC_MAX);
0308
0309 size = min_t(uint, count, BULK_SIZE);
0310 memcpy(send_buf, firmware->data + sent, size);
0311
0312 err = usb_bulk_msg(udev, pipe, send_buf, size,
0313 &len, 3000);
0314 if (err || (len != size)) {
0315 ath3k_log_failed_loading(err, len, size, count);
0316 kfree(send_buf);
0317 return err;
0318 }
0319 sent += size;
0320 count -= size;
0321 }
0322
0323 kfree(send_buf);
0324 return 0;
0325 }
0326
0327 static void ath3k_switch_pid(struct usb_device *udev)
0328 {
0329 usb_control_msg_send(udev, 0, USB_REG_SWITCH_VID_PID, USB_TYPE_VENDOR,
0330 0, 0, NULL, 0, USB_CTRL_SET_TIMEOUT, GFP_KERNEL);
0331 }
0332
0333 static int ath3k_set_normal_mode(struct usb_device *udev)
0334 {
0335 unsigned char fw_state;
0336 int ret;
0337
0338 ret = ath3k_get_state(udev, &fw_state);
0339 if (ret) {
0340 BT_ERR("Can't get state to change to normal mode err");
0341 return ret;
0342 }
0343
0344 if ((fw_state & ATH3K_MODE_MASK) == ATH3K_NORMAL_MODE) {
0345 BT_DBG("firmware was already in normal mode");
0346 return 0;
0347 }
0348
0349 return usb_control_msg_send(udev, 0, ATH3K_SET_NORMAL_MODE,
0350 USB_TYPE_VENDOR, 0, 0, NULL, 0,
0351 USB_CTRL_SET_TIMEOUT, GFP_KERNEL);
0352 }
0353
0354 static int ath3k_load_patch(struct usb_device *udev)
0355 {
0356 unsigned char fw_state;
0357 char filename[ATH3K_NAME_LEN];
0358 const struct firmware *firmware;
0359 struct ath3k_version fw_version;
0360 __u32 pt_rom_version, pt_build_version;
0361 int ret;
0362
0363 ret = ath3k_get_state(udev, &fw_state);
0364 if (ret) {
0365 BT_ERR("Can't get state to change to load ram patch err");
0366 return ret;
0367 }
0368
0369 if (fw_state & ATH3K_PATCH_UPDATE) {
0370 BT_DBG("Patch was already downloaded");
0371 return 0;
0372 }
0373
0374 ret = ath3k_get_version(udev, &fw_version);
0375 if (ret) {
0376 BT_ERR("Can't get version to change to load ram patch err");
0377 return ret;
0378 }
0379
0380 snprintf(filename, ATH3K_NAME_LEN, "ar3k/AthrBT_0x%08x.dfu",
0381 le32_to_cpu(fw_version.rom_version));
0382
0383 ret = request_firmware(&firmware, filename, &udev->dev);
0384 if (ret < 0) {
0385 BT_ERR("Patch file not found %s", filename);
0386 return ret;
0387 }
0388
0389 pt_rom_version = get_unaligned_le32(firmware->data +
0390 firmware->size - 8);
0391 pt_build_version = get_unaligned_le32(firmware->data +
0392 firmware->size - 4);
0393
0394 if (pt_rom_version != le32_to_cpu(fw_version.rom_version) ||
0395 pt_build_version <= le32_to_cpu(fw_version.build_version)) {
0396 BT_ERR("Patch file version did not match with firmware");
0397 release_firmware(firmware);
0398 return -EINVAL;
0399 }
0400
0401 ret = ath3k_load_fwfile(udev, firmware);
0402 release_firmware(firmware);
0403
0404 return ret;
0405 }
0406
0407 static int ath3k_load_syscfg(struct usb_device *udev)
0408 {
0409 unsigned char fw_state;
0410 char filename[ATH3K_NAME_LEN];
0411 const struct firmware *firmware;
0412 struct ath3k_version fw_version;
0413 int clk_value, ret;
0414
0415 ret = ath3k_get_state(udev, &fw_state);
0416 if (ret) {
0417 BT_ERR("Can't get state to change to load configuration err");
0418 return -EBUSY;
0419 }
0420
0421 ret = ath3k_get_version(udev, &fw_version);
0422 if (ret) {
0423 BT_ERR("Can't get version to change to load ram patch err");
0424 return ret;
0425 }
0426
0427 switch (fw_version.ref_clock) {
0428
0429 case ATH3K_XTAL_FREQ_26M:
0430 clk_value = 26;
0431 break;
0432 case ATH3K_XTAL_FREQ_40M:
0433 clk_value = 40;
0434 break;
0435 case ATH3K_XTAL_FREQ_19P2:
0436 clk_value = 19;
0437 break;
0438 default:
0439 clk_value = 0;
0440 break;
0441 }
0442
0443 snprintf(filename, ATH3K_NAME_LEN, "ar3k/ramps_0x%08x_%d%s",
0444 le32_to_cpu(fw_version.rom_version), clk_value, ".dfu");
0445
0446 ret = request_firmware(&firmware, filename, &udev->dev);
0447 if (ret < 0) {
0448 BT_ERR("Configuration file not found %s", filename);
0449 return ret;
0450 }
0451
0452 ret = ath3k_load_fwfile(udev, firmware);
0453 release_firmware(firmware);
0454
0455 return ret;
0456 }
0457
0458 static int ath3k_probe(struct usb_interface *intf,
0459 const struct usb_device_id *id)
0460 {
0461 const struct firmware *firmware;
0462 struct usb_device *udev = interface_to_usbdev(intf);
0463 int ret;
0464
0465 BT_DBG("intf %p id %p", intf, id);
0466
0467 if (intf->cur_altsetting->desc.bInterfaceNumber != 0)
0468 return -ENODEV;
0469
0470
0471 if (!id->driver_info) {
0472 const struct usb_device_id *match;
0473
0474 match = usb_match_id(intf, ath3k_blist_tbl);
0475 if (match)
0476 id = match;
0477 }
0478
0479
0480 if (id->driver_info & BTUSB_ATH3012) {
0481
0482 if (le16_to_cpu(udev->descriptor.bcdDevice) > 0x0001)
0483 return -ENODEV;
0484
0485 ret = ath3k_load_patch(udev);
0486 if (ret < 0) {
0487 BT_ERR("Loading patch file failed");
0488 return ret;
0489 }
0490 ret = ath3k_load_syscfg(udev);
0491 if (ret < 0) {
0492 BT_ERR("Loading sysconfig file failed");
0493 return ret;
0494 }
0495 ret = ath3k_set_normal_mode(udev);
0496 if (ret) {
0497 BT_ERR("Set normal mode failed");
0498 return ret;
0499 }
0500 ath3k_switch_pid(udev);
0501 return 0;
0502 }
0503
0504 ret = request_firmware(&firmware, ATH3K_FIRMWARE, &udev->dev);
0505 if (ret < 0) {
0506 if (ret == -ENOENT)
0507 BT_ERR("Firmware file \"%s\" not found",
0508 ATH3K_FIRMWARE);
0509 else
0510 BT_ERR("Firmware file \"%s\" request failed (err=%d)",
0511 ATH3K_FIRMWARE, ret);
0512 return ret;
0513 }
0514
0515 ret = ath3k_load_firmware(udev, firmware);
0516 release_firmware(firmware);
0517
0518 return ret;
0519 }
0520
0521 static void ath3k_disconnect(struct usb_interface *intf)
0522 {
0523 BT_DBG("%s intf %p", __func__, intf);
0524 }
0525
0526 static struct usb_driver ath3k_driver = {
0527 .name = "ath3k",
0528 .probe = ath3k_probe,
0529 .disconnect = ath3k_disconnect,
0530 .id_table = ath3k_table,
0531 .disable_hub_initiated_lpm = 1,
0532 };
0533
0534 module_usb_driver(ath3k_driver);
0535
0536 MODULE_AUTHOR("Atheros Communications");
0537 MODULE_DESCRIPTION("Atheros AR30xx firmware driver");
0538 MODULE_VERSION(VERSION);
0539 MODULE_LICENSE("GPL");
0540 MODULE_FIRMWARE(ATH3K_FIRMWARE);