^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright (c) 2008-2009 Atheros Communications Inc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/errno.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/firmware.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/usb.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <asm/unaligned.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <net/bluetooth/bluetooth.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #define VERSION "1.0"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #define ATH3K_FIRMWARE "ath3k-1.fw"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #define ATH3K_DNLOAD 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #define ATH3K_GETSTATE 0x05
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #define ATH3K_SET_NORMAL_MODE 0x07
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #define ATH3K_GETVERSION 0x09
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #define USB_REG_SWITCH_VID_PID 0x0a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #define ATH3K_MODE_MASK 0x3F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #define ATH3K_NORMAL_MODE 0x0E
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define ATH3K_PATCH_UPDATE 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #define ATH3K_SYSCFG_UPDATE 0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #define ATH3K_XTAL_FREQ_26M 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #define ATH3K_XTAL_FREQ_40M 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #define ATH3K_XTAL_FREQ_19P2 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #define ATH3K_NAME_LEN 0xFF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) struct ath3k_version {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) __le32 rom_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) __le32 build_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) __le32 ram_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) __u8 ref_clock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) __u8 reserved[7];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) static const struct usb_device_id ath3k_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) /* Atheros AR3011 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) { USB_DEVICE(0x0CF3, 0x3000) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) /* Atheros AR3011 with sflash firmware*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) { USB_DEVICE(0x0489, 0xE027) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) { USB_DEVICE(0x0489, 0xE03D) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) { USB_DEVICE(0x04F2, 0xAFF1) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) { USB_DEVICE(0x0930, 0x0215) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) { USB_DEVICE(0x0CF3, 0x3002) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) { USB_DEVICE(0x0CF3, 0xE019) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) { USB_DEVICE(0x13d3, 0x3304) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) /* Atheros AR9285 Malbec with sflash firmware */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) { USB_DEVICE(0x03F0, 0x311D) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) /* Atheros AR3012 with sflash firmware*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) { USB_DEVICE(0x0489, 0xe04d) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) { USB_DEVICE(0x0489, 0xe04e) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) { USB_DEVICE(0x0489, 0xe057) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) { USB_DEVICE(0x0489, 0xe056) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) { USB_DEVICE(0x0489, 0xe05f) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) { USB_DEVICE(0x0489, 0xe076) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) { USB_DEVICE(0x0489, 0xe078) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) { USB_DEVICE(0x0489, 0xe095) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) { USB_DEVICE(0x04c5, 0x1330) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) { USB_DEVICE(0x04CA, 0x3004) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) { USB_DEVICE(0x04CA, 0x3005) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) { USB_DEVICE(0x04CA, 0x3006) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) { USB_DEVICE(0x04CA, 0x3007) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) { USB_DEVICE(0x04CA, 0x3008) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) { USB_DEVICE(0x04CA, 0x300b) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) { USB_DEVICE(0x04CA, 0x300d) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) { USB_DEVICE(0x04CA, 0x300f) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) { USB_DEVICE(0x04CA, 0x3010) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) { USB_DEVICE(0x04CA, 0x3014) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) { USB_DEVICE(0x04CA, 0x3018) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) { USB_DEVICE(0x0930, 0x0219) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) { USB_DEVICE(0x0930, 0x021c) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) { USB_DEVICE(0x0930, 0x0220) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) { USB_DEVICE(0x0930, 0x0227) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) { USB_DEVICE(0x0b05, 0x17d0) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) { USB_DEVICE(0x0CF3, 0x0036) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) { USB_DEVICE(0x0CF3, 0x3004) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) { USB_DEVICE(0x0CF3, 0x3008) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) { USB_DEVICE(0x0CF3, 0x311D) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) { USB_DEVICE(0x0CF3, 0x311E) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) { USB_DEVICE(0x0CF3, 0x311F) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) { USB_DEVICE(0x0cf3, 0x3121) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) { USB_DEVICE(0x0CF3, 0x817a) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) { USB_DEVICE(0x0CF3, 0x817b) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) { USB_DEVICE(0x0cf3, 0xe003) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) { USB_DEVICE(0x0CF3, 0xE004) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) { USB_DEVICE(0x0CF3, 0xE005) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) { USB_DEVICE(0x0CF3, 0xE006) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) { USB_DEVICE(0x13d3, 0x3362) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) { USB_DEVICE(0x13d3, 0x3375) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) { USB_DEVICE(0x13d3, 0x3393) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) { USB_DEVICE(0x13d3, 0x3395) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) { USB_DEVICE(0x13d3, 0x3402) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) { USB_DEVICE(0x13d3, 0x3408) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) { USB_DEVICE(0x13d3, 0x3423) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) { USB_DEVICE(0x13d3, 0x3432) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) { USB_DEVICE(0x13d3, 0x3472) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) { USB_DEVICE(0x13d3, 0x3474) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) { USB_DEVICE(0x13d3, 0x3487) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) { USB_DEVICE(0x13d3, 0x3490) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) /* Atheros AR5BBU12 with sflash firmware */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) { USB_DEVICE(0x0489, 0xE02C) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) /* Atheros AR5BBU22 with sflash firmware */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) { USB_DEVICE(0x0489, 0xE036) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) { USB_DEVICE(0x0489, 0xE03C) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) { } /* Terminating entry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) MODULE_DEVICE_TABLE(usb, ath3k_table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) #define BTUSB_ATH3012 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) /* This table is to load patch and sysconfig files
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) * for AR3012
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) static const struct usb_device_id ath3k_blist_tbl[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) /* Atheros AR3012 with sflash firmware*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) { USB_DEVICE(0x0489, 0xe04e), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) { USB_DEVICE(0x0489, 0xe04d), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) { USB_DEVICE(0x0489, 0xe056), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) { USB_DEVICE(0x0489, 0xe057), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) { USB_DEVICE(0x0489, 0xe05f), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) { USB_DEVICE(0x0489, 0xe076), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) { USB_DEVICE(0x0489, 0xe078), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) { USB_DEVICE(0x0489, 0xe095), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) { USB_DEVICE(0x04c5, 0x1330), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) { USB_DEVICE(0x04ca, 0x3004), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) { USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) { USB_DEVICE(0x04ca, 0x3006), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) { USB_DEVICE(0x04ca, 0x3007), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) { USB_DEVICE(0x04ca, 0x3008), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) { USB_DEVICE(0x04ca, 0x300b), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) { USB_DEVICE(0x04ca, 0x300d), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) { USB_DEVICE(0x04ca, 0x300f), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) { USB_DEVICE(0x04ca, 0x3010), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) { USB_DEVICE(0x04ca, 0x3014), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) { USB_DEVICE(0x04ca, 0x3018), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) { USB_DEVICE(0x0930, 0x0219), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) { USB_DEVICE(0x0930, 0x021c), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) { USB_DEVICE(0x0930, 0x0220), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) { USB_DEVICE(0x0930, 0x0227), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) { USB_DEVICE(0x0b05, 0x17d0), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) { USB_DEVICE(0x0CF3, 0x0036), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) { USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) { USB_DEVICE(0x0cf3, 0x3008), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) { USB_DEVICE(0x0cf3, 0x311D), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) { USB_DEVICE(0x0cf3, 0x311E), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) { USB_DEVICE(0x0cf3, 0x311F), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) { USB_DEVICE(0x0cf3, 0x3121), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) { USB_DEVICE(0x0CF3, 0x817a), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) { USB_DEVICE(0x0CF3, 0x817b), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) { USB_DEVICE(0x0cf3, 0xe004), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) { USB_DEVICE(0x0cf3, 0xe005), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) { USB_DEVICE(0x0cf3, 0xe006), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) { USB_DEVICE(0x0cf3, 0xe003), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) { USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) { USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) { USB_DEVICE(0x13d3, 0x3393), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) { USB_DEVICE(0x13d3, 0x3395), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) { USB_DEVICE(0x13d3, 0x3402), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) { USB_DEVICE(0x13d3, 0x3408), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) { USB_DEVICE(0x13d3, 0x3423), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) { USB_DEVICE(0x13d3, 0x3432), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) { USB_DEVICE(0x13d3, 0x3472), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) { USB_DEVICE(0x13d3, 0x3474), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) { USB_DEVICE(0x13d3, 0x3487), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) { USB_DEVICE(0x13d3, 0x3490), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) /* Atheros AR5BBU22 with sflash firmware */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) { USB_DEVICE(0x0489, 0xE036), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) { USB_DEVICE(0x0489, 0xE03C), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) { } /* Terminating entry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) static inline void ath3k_log_failed_loading(int err, int len, int size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) int count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) BT_ERR("Firmware loading err = %d, len = %d, size = %d, count = %d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) err, len, size, count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) #define USB_REQ_DFU_DNLOAD 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) #define BULK_SIZE 4096
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) #define FW_HDR_SIZE 20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) #define TIMEGAP_USEC_MIN 50
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) #define TIMEGAP_USEC_MAX 100
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) static int ath3k_load_firmware(struct usb_device *udev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) const struct firmware *firmware)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) u8 *send_buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) int len = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) int err, pipe, size, sent = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) int count = firmware->size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) BT_DBG("udev %p", udev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) send_buf = kmalloc(BULK_SIZE, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) if (!send_buf) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) BT_ERR("Can't allocate memory chunk for firmware");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) err = usb_control_msg_send(udev, 0, USB_REQ_DFU_DNLOAD, USB_TYPE_VENDOR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) 0, 0, firmware->data, FW_HDR_SIZE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) USB_CTRL_SET_TIMEOUT, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) BT_ERR("Can't change to loading configuration err");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) sent += FW_HDR_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) count -= FW_HDR_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) pipe = usb_sndbulkpipe(udev, 0x02);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) while (count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) /* workaround the compatibility issue with xHCI controller*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) usleep_range(TIMEGAP_USEC_MIN, TIMEGAP_USEC_MAX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) size = min_t(uint, count, BULK_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) memcpy(send_buf, firmware->data + sent, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) err = usb_bulk_msg(udev, pipe, send_buf, size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) &len, 3000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) if (err || (len != size)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) ath3k_log_failed_loading(err, len, size, count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) sent += size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) count -= size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) kfree(send_buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) static int ath3k_get_state(struct usb_device *udev, unsigned char *state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) return usb_control_msg_recv(udev, 0, ATH3K_GETSTATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) USB_TYPE_VENDOR | USB_DIR_IN, 0, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) state, 1, USB_CTRL_SET_TIMEOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) static int ath3k_get_version(struct usb_device *udev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) struct ath3k_version *version)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) return usb_control_msg_recv(udev, 0, ATH3K_GETVERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) USB_TYPE_VENDOR | USB_DIR_IN, 0, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) version, sizeof(*version), USB_CTRL_SET_TIMEOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) static int ath3k_load_fwfile(struct usb_device *udev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) const struct firmware *firmware)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) u8 *send_buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) int len = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) int err, pipe, size, count, sent = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) count = firmware->size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) send_buf = kmalloc(BULK_SIZE, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) if (!send_buf) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) BT_ERR("Can't allocate memory chunk for firmware");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) size = min_t(uint, count, FW_HDR_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) ret = usb_control_msg_send(udev, 0, ATH3K_DNLOAD, USB_TYPE_VENDOR, 0, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) firmware->data, size, USB_CTRL_SET_TIMEOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) BT_ERR("Can't change to loading configuration err");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) kfree(send_buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) sent += size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) count -= size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) pipe = usb_sndbulkpipe(udev, 0x02);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) while (count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) /* workaround the compatibility issue with xHCI controller*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) usleep_range(TIMEGAP_USEC_MIN, TIMEGAP_USEC_MAX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) size = min_t(uint, count, BULK_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) memcpy(send_buf, firmware->data + sent, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) err = usb_bulk_msg(udev, pipe, send_buf, size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) &len, 3000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) if (err || (len != size)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) ath3k_log_failed_loading(err, len, size, count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) kfree(send_buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) sent += size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) count -= size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) kfree(send_buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) static void ath3k_switch_pid(struct usb_device *udev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) usb_control_msg_send(udev, 0, USB_REG_SWITCH_VID_PID, USB_TYPE_VENDOR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) 0, 0, NULL, 0, USB_CTRL_SET_TIMEOUT, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) static int ath3k_set_normal_mode(struct usb_device *udev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) unsigned char fw_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) ret = ath3k_get_state(udev, &fw_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) BT_ERR("Can't get state to change to normal mode err");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) if ((fw_state & ATH3K_MODE_MASK) == ATH3K_NORMAL_MODE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) BT_DBG("firmware was already in normal mode");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) return usb_control_msg_send(udev, 0, ATH3K_SET_NORMAL_MODE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) USB_TYPE_VENDOR, 0, 0, NULL, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) USB_CTRL_SET_TIMEOUT, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) static int ath3k_load_patch(struct usb_device *udev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) unsigned char fw_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) char filename[ATH3K_NAME_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) const struct firmware *firmware;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) struct ath3k_version fw_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) __u32 pt_rom_version, pt_build_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) ret = ath3k_get_state(udev, &fw_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) BT_ERR("Can't get state to change to load ram patch err");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) if (fw_state & ATH3K_PATCH_UPDATE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) BT_DBG("Patch was already downloaded");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) ret = ath3k_get_version(udev, &fw_version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) BT_ERR("Can't get version to change to load ram patch err");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) snprintf(filename, ATH3K_NAME_LEN, "ar3k/AthrBT_0x%08x.dfu",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) le32_to_cpu(fw_version.rom_version));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) ret = request_firmware(&firmware, filename, &udev->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) BT_ERR("Patch file not found %s", filename);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) pt_rom_version = get_unaligned_le32(firmware->data +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) firmware->size - 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) pt_build_version = get_unaligned_le32(firmware->data +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) firmware->size - 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) if (pt_rom_version != le32_to_cpu(fw_version.rom_version) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) pt_build_version <= le32_to_cpu(fw_version.build_version)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) BT_ERR("Patch file version did not match with firmware");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) release_firmware(firmware);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) ret = ath3k_load_fwfile(udev, firmware);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) release_firmware(firmware);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) static int ath3k_load_syscfg(struct usb_device *udev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) unsigned char fw_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) char filename[ATH3K_NAME_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) const struct firmware *firmware;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) struct ath3k_version fw_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) int clk_value, ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) ret = ath3k_get_state(udev, &fw_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) BT_ERR("Can't get state to change to load configuration err");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) ret = ath3k_get_version(udev, &fw_version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) BT_ERR("Can't get version to change to load ram patch err");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) switch (fw_version.ref_clock) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) case ATH3K_XTAL_FREQ_26M:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) clk_value = 26;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) case ATH3K_XTAL_FREQ_40M:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) clk_value = 40;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) case ATH3K_XTAL_FREQ_19P2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) clk_value = 19;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) clk_value = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) snprintf(filename, ATH3K_NAME_LEN, "ar3k/ramps_0x%08x_%d%s",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) le32_to_cpu(fw_version.rom_version), clk_value, ".dfu");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) ret = request_firmware(&firmware, filename, &udev->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) BT_ERR("Configuration file not found %s", filename);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) ret = ath3k_load_fwfile(udev, firmware);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) release_firmware(firmware);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) static int ath3k_probe(struct usb_interface *intf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) const struct usb_device_id *id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) const struct firmware *firmware;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) struct usb_device *udev = interface_to_usbdev(intf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) BT_DBG("intf %p id %p", intf, id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) if (intf->cur_altsetting->desc.bInterfaceNumber != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) /* match device ID in ath3k blacklist table */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) if (!id->driver_info) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) const struct usb_device_id *match;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) match = usb_match_id(intf, ath3k_blist_tbl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) if (match)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) id = match;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) /* load patch and sysconfig files for AR3012 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) if (id->driver_info & BTUSB_ATH3012) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) /* New firmware with patch and sysconfig files already loaded */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) if (le16_to_cpu(udev->descriptor.bcdDevice) > 0x0001)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) ret = ath3k_load_patch(udev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) BT_ERR("Loading patch file failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) ret = ath3k_load_syscfg(udev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) BT_ERR("Loading sysconfig file failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) ret = ath3k_set_normal_mode(udev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) BT_ERR("Set normal mode failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) ath3k_switch_pid(udev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) ret = request_firmware(&firmware, ATH3K_FIRMWARE, &udev->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) if (ret == -ENOENT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) BT_ERR("Firmware file \"%s\" not found",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) ATH3K_FIRMWARE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) BT_ERR("Firmware file \"%s\" request failed (err=%d)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) ATH3K_FIRMWARE, ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) ret = ath3k_load_firmware(udev, firmware);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) release_firmware(firmware);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) static void ath3k_disconnect(struct usb_interface *intf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) BT_DBG("%s intf %p", __func__, intf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) static struct usb_driver ath3k_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) .name = "ath3k",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) .probe = ath3k_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) .disconnect = ath3k_disconnect,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) .id_table = ath3k_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) .disable_hub_initiated_lpm = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) module_usb_driver(ath3k_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) MODULE_AUTHOR("Atheros Communications");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) MODULE_DESCRIPTION("Atheros AR30xx firmware driver");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) MODULE_VERSION(VERSION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) MODULE_LICENSE("GPL");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) MODULE_FIRMWARE(ATH3K_FIRMWARE);