Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^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);