@@ -75,6 +75,9 @@ enum qca_flags {
75
75
QCA_HW_ERROR_EVENT
76
76
};
77
77
78
+ enum qca_capabilities {
79
+ QCA_CAP_WIDEBAND_SPEECH = BIT (0 ),
80
+ };
78
81
79
82
/* HCI_IBS transmit side sleep protocol states */
80
83
enum tx_ibs_states {
@@ -111,6 +114,7 @@ struct qca_memdump_data {
111
114
char * memdump_buf_tail ;
112
115
u32 current_seq_no ;
113
116
u32 received_dump ;
117
+ u32 ram_dump_size ;
114
118
};
115
119
116
120
struct qca_memdump_event_hdr {
@@ -187,10 +191,11 @@ struct qca_vreg {
187
191
unsigned int load_uA ;
188
192
};
189
193
190
- struct qca_vreg_data {
194
+ struct qca_device_data {
191
195
enum qca_btsoc_type soc_type ;
192
196
struct qca_vreg * vregs ;
193
197
size_t num_vregs ;
198
+ uint32_t capabilities ;
194
199
};
195
200
196
201
/*
@@ -972,6 +977,8 @@ static void qca_controller_memdump(struct work_struct *work)
972
977
char nullBuff [QCA_DUMP_PACKET_SIZE ] = { 0 };
973
978
u16 seq_no ;
974
979
u32 dump_size ;
980
+ u32 rx_size ;
981
+ enum qca_btsoc_type soc_type = qca_soc_type (hu );
975
982
976
983
while ((skb = skb_dequeue (& qca -> rx_memdump_q ))) {
977
984
@@ -1021,10 +1028,12 @@ static void qca_controller_memdump(struct work_struct *work)
1021
1028
dump_size );
1022
1029
queue_delayed_work (qca -> workqueue ,
1023
1030
& qca -> ctrl_memdump_timeout ,
1024
- msecs_to_jiffies (MEMDUMP_TIMEOUT_MS ));
1031
+ msecs_to_jiffies (MEMDUMP_TIMEOUT_MS )
1032
+ );
1025
1033
1026
1034
skb_pull (skb , sizeof (dump_size ));
1027
1035
memdump_buf = vmalloc (dump_size );
1036
+ qca_memdump -> ram_dump_size = dump_size ;
1028
1037
qca_memdump -> memdump_buf_head = memdump_buf ;
1029
1038
qca_memdump -> memdump_buf_tail = memdump_buf ;
1030
1039
}
@@ -1047,26 +1056,57 @@ static void qca_controller_memdump(struct work_struct *work)
1047
1056
* the controller. In such cases let us store the dummy
1048
1057
* packets in the buffer.
1049
1058
*/
1059
+ /* For QCA6390, controller does not lost packets but
1060
+ * sequence number field of packat sometimes has error
1061
+ * bits, so skip this checking for missing packet.
1062
+ */
1050
1063
while ((seq_no > qca_memdump -> current_seq_no + 1 ) &&
1051
- seq_no != QCA_LAST_SEQUENCE_NUM ) {
1064
+ (soc_type != QCA_QCA6390 ) &&
1065
+ seq_no != QCA_LAST_SEQUENCE_NUM ) {
1052
1066
bt_dev_err (hu -> hdev , "QCA controller missed packet:%d" ,
1053
1067
qca_memdump -> current_seq_no );
1068
+ rx_size = qca_memdump -> received_dump ;
1069
+ rx_size += QCA_DUMP_PACKET_SIZE ;
1070
+ if (rx_size > qca_memdump -> ram_dump_size ) {
1071
+ bt_dev_err (hu -> hdev ,
1072
+ "QCA memdump received %d, no space for missed packet" ,
1073
+ qca_memdump -> received_dump );
1074
+ break ;
1075
+ }
1054
1076
memcpy (memdump_buf , nullBuff , QCA_DUMP_PACKET_SIZE );
1055
1077
memdump_buf = memdump_buf + QCA_DUMP_PACKET_SIZE ;
1056
1078
qca_memdump -> received_dump += QCA_DUMP_PACKET_SIZE ;
1057
1079
qca_memdump -> current_seq_no ++ ;
1058
1080
}
1059
1081
1060
- memcpy (memdump_buf , (unsigned char * ) skb -> data , skb -> len );
1061
- memdump_buf = memdump_buf + skb -> len ;
1062
- qca_memdump -> memdump_buf_tail = memdump_buf ;
1063
- qca_memdump -> current_seq_no = seq_no + 1 ;
1064
- qca_memdump -> received_dump += skb -> len ;
1082
+ rx_size = qca_memdump -> received_dump + skb -> len ;
1083
+ if (rx_size <= qca_memdump -> ram_dump_size ) {
1084
+ if ((seq_no != QCA_LAST_SEQUENCE_NUM ) &&
1085
+ (seq_no != qca_memdump -> current_seq_no ))
1086
+ bt_dev_err (hu -> hdev ,
1087
+ "QCA memdump unexpected packet %d" ,
1088
+ seq_no );
1089
+ bt_dev_dbg (hu -> hdev ,
1090
+ "QCA memdump packet %d with length %d" ,
1091
+ seq_no , skb -> len );
1092
+ memcpy (memdump_buf , (unsigned char * )skb -> data ,
1093
+ skb -> len );
1094
+ memdump_buf = memdump_buf + skb -> len ;
1095
+ qca_memdump -> memdump_buf_tail = memdump_buf ;
1096
+ qca_memdump -> current_seq_no = seq_no + 1 ;
1097
+ qca_memdump -> received_dump += skb -> len ;
1098
+ } else {
1099
+ bt_dev_err (hu -> hdev ,
1100
+ "QCA memdump received %d, no space for packet %d" ,
1101
+ qca_memdump -> received_dump , seq_no );
1102
+ }
1065
1103
qca -> qca_memdump = qca_memdump ;
1066
1104
kfree_skb (skb );
1067
1105
if (seq_no == QCA_LAST_SEQUENCE_NUM ) {
1068
- bt_dev_info (hu -> hdev , "QCA writing crash dump of size %d bytes" ,
1069
- qca_memdump -> received_dump );
1106
+ bt_dev_info (hu -> hdev ,
1107
+ "QCA memdump Done, received %d, total %d" ,
1108
+ qca_memdump -> received_dump ,
1109
+ qca_memdump -> ram_dump_size );
1070
1110
memdump_buf = qca_memdump -> memdump_buf_head ;
1071
1111
dev_coredumpv (& hu -> serdev -> dev , memdump_buf ,
1072
1112
qca_memdump -> received_dump , GFP_KERNEL );
@@ -1691,7 +1731,7 @@ static const struct hci_uart_proto qca_proto = {
1691
1731
.dequeue = qca_dequeue ,
1692
1732
};
1693
1733
1694
- static const struct qca_vreg_data qca_soc_data_wcn3990 = {
1734
+ static const struct qca_device_data qca_soc_data_wcn3990 = {
1695
1735
.soc_type = QCA_WCN3990 ,
1696
1736
.vregs = (struct qca_vreg []) {
1697
1737
{ "vddio" , 15000 },
@@ -1702,7 +1742,7 @@ static const struct qca_vreg_data qca_soc_data_wcn3990 = {
1702
1742
.num_vregs = 4 ,
1703
1743
};
1704
1744
1705
- static const struct qca_vreg_data qca_soc_data_wcn3991 = {
1745
+ static const struct qca_device_data qca_soc_data_wcn3991 = {
1706
1746
.soc_type = QCA_WCN3991 ,
1707
1747
.vregs = (struct qca_vreg []) {
1708
1748
{ "vddio" , 15000 },
@@ -1711,9 +1751,10 @@ static const struct qca_vreg_data qca_soc_data_wcn3991 = {
1711
1751
{ "vddch0" , 450000 },
1712
1752
},
1713
1753
.num_vregs = 4 ,
1754
+ .capabilities = QCA_CAP_WIDEBAND_SPEECH ,
1714
1755
};
1715
1756
1716
- static const struct qca_vreg_data qca_soc_data_wcn3998 = {
1757
+ static const struct qca_device_data qca_soc_data_wcn3998 = {
1717
1758
.soc_type = QCA_WCN3998 ,
1718
1759
.vregs = (struct qca_vreg []) {
1719
1760
{ "vddio" , 10000 },
@@ -1724,7 +1765,7 @@ static const struct qca_vreg_data qca_soc_data_wcn3998 = {
1724
1765
.num_vregs = 4 ,
1725
1766
};
1726
1767
1727
- static const struct qca_vreg_data qca_soc_data_qca6390 = {
1768
+ static const struct qca_device_data qca_soc_data_qca6390 = {
1728
1769
.soc_type = QCA_QCA6390 ,
1729
1770
.num_vregs = 0 ,
1730
1771
};
@@ -1860,7 +1901,7 @@ static int qca_serdev_probe(struct serdev_device *serdev)
1860
1901
{
1861
1902
struct qca_serdev * qcadev ;
1862
1903
struct hci_dev * hdev ;
1863
- const struct qca_vreg_data * data ;
1904
+ const struct qca_device_data * data ;
1864
1905
int err ;
1865
1906
bool power_ctrl_enabled = true;
1866
1907
@@ -1942,12 +1983,19 @@ static int qca_serdev_probe(struct serdev_device *serdev)
1942
1983
}
1943
1984
}
1944
1985
1986
+ hdev = qcadev -> serdev_hu .hdev ;
1987
+
1945
1988
if (power_ctrl_enabled ) {
1946
- hdev = qcadev -> serdev_hu .hdev ;
1947
1989
set_bit (HCI_QUIRK_NON_PERSISTENT_SETUP , & hdev -> quirks );
1948
1990
hdev -> shutdown = qca_power_off ;
1949
1991
}
1950
1992
1993
+ /* Wideband speech support must be set per driver since it can't be
1994
+ * queried via hci.
1995
+ */
1996
+ if (data && (data -> capabilities & QCA_CAP_WIDEBAND_SPEECH ))
1997
+ set_bit (HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED , & hdev -> quirks );
1998
+
1951
1999
return 0 ;
1952
2000
}
1953
2001
@@ -1963,10 +2011,43 @@ static void qca_serdev_remove(struct serdev_device *serdev)
1963
2011
hci_uart_unregister_device (& qcadev -> serdev_hu );
1964
2012
}
1965
2013
2014
+ static void qca_serdev_shutdown (struct device * dev )
2015
+ {
2016
+ int ret ;
2017
+ int timeout = msecs_to_jiffies (CMD_TRANS_TIMEOUT_MS );
2018
+ struct serdev_device * serdev = to_serdev_device (dev );
2019
+ struct qca_serdev * qcadev = serdev_device_get_drvdata (serdev );
2020
+ const u8 ibs_wake_cmd [] = { 0xFD };
2021
+ const u8 edl_reset_soc_cmd [] = { 0x01 , 0x00 , 0xFC , 0x01 , 0x05 };
2022
+
2023
+ if (qcadev -> btsoc_type == QCA_QCA6390 ) {
2024
+ serdev_device_write_flush (serdev );
2025
+ ret = serdev_device_write_buf (serdev , ibs_wake_cmd ,
2026
+ sizeof (ibs_wake_cmd ));
2027
+ if (ret < 0 ) {
2028
+ BT_ERR ("QCA send IBS_WAKE_IND error: %d" , ret );
2029
+ return ;
2030
+ }
2031
+ serdev_device_wait_until_sent (serdev , timeout );
2032
+ usleep_range (8000 , 10000 );
2033
+
2034
+ serdev_device_write_flush (serdev );
2035
+ ret = serdev_device_write_buf (serdev , edl_reset_soc_cmd ,
2036
+ sizeof (edl_reset_soc_cmd ));
2037
+ if (ret < 0 ) {
2038
+ BT_ERR ("QCA send EDL_RESET_REQ error: %d" , ret );
2039
+ return ;
2040
+ }
2041
+ serdev_device_wait_until_sent (serdev , timeout );
2042
+ usleep_range (8000 , 10000 );
2043
+ }
2044
+ }
2045
+
1966
2046
static int __maybe_unused qca_suspend (struct device * dev )
1967
2047
{
1968
- struct hci_dev * hdev = container_of (dev , struct hci_dev , dev );
1969
- struct hci_uart * hu = hci_get_drvdata (hdev );
2048
+ struct serdev_device * serdev = to_serdev_device (dev );
2049
+ struct qca_serdev * qcadev = serdev_device_get_drvdata (serdev );
2050
+ struct hci_uart * hu = & qcadev -> serdev_hu ;
1970
2051
struct qca_data * qca = hu -> priv ;
1971
2052
unsigned long flags ;
1972
2053
int ret = 0 ;
@@ -2045,8 +2126,9 @@ static int __maybe_unused qca_suspend(struct device *dev)
2045
2126
2046
2127
static int __maybe_unused qca_resume (struct device * dev )
2047
2128
{
2048
- struct hci_dev * hdev = container_of (dev , struct hci_dev , dev );
2049
- struct hci_uart * hu = hci_get_drvdata (hdev );
2129
+ struct serdev_device * serdev = to_serdev_device (dev );
2130
+ struct qca_serdev * qcadev = serdev_device_get_drvdata (serdev );
2131
+ struct hci_uart * hu = & qcadev -> serdev_hu ;
2050
2132
struct qca_data * qca = hu -> priv ;
2051
2133
2052
2134
clear_bit (QCA_SUSPENDING , & qca -> flags );
@@ -2088,6 +2170,7 @@ static struct serdev_device_driver qca_serdev_driver = {
2088
2170
.name = "hci_uart_qca" ,
2089
2171
.of_match_table = of_match_ptr (qca_bluetooth_of_match ),
2090
2172
.acpi_match_table = ACPI_PTR (qca_bluetooth_acpi_match ),
2173
+ .shutdown = qca_serdev_shutdown ,
2091
2174
.pm = & qca_pm_ops ,
2092
2175
},
2093
2176
};
0 commit comments