@@ -121,6 +121,91 @@ static const struct file_operations fops_debug = {
121121
122122#endif
123123
124+ static ssize_t read_file_dirtyts (struct file * file , char __user * user_buf , size_t count , loff_t * ppos ) {
125+ struct ath_softc * sc = file -> private_data ;
126+ u8 buf [sizeof (u64 )];
127+
128+ memcpy (buf , & sc -> ptp_dirtyts , sizeof buf );
129+ return simple_read_from_buffer (user_buf , count , ppos , buf , sizeof buf );
130+ }
131+
132+ static ssize_t write_file_dirtyts (struct file * file , const char __user * user_buf ,
133+ size_t count , loff_t * ppos ) {
134+ struct ath_softc * sc = file -> private_data ;
135+ u8 buf [sizeof (u64 )];
136+ ssize_t len ;
137+ u64 dirty_cycle ;
138+ u32 raw_tsf ;
139+ s64 delta ;
140+ s64 dirty_ns ;
141+ unsigned long flags ;
142+ u32 remain ;
143+
144+ len = simple_write_to_buffer (buf , sizeof buf , ppos , user_buf , count );
145+ if (len < 0 ) {
146+ return len ;
147+ }
148+ if (len < sizeof buf ) {
149+ return - EINVAL ;
150+ }
151+
152+ memcpy (& dirty_cycle , buf , sizeof buf );
153+ raw_tsf = (dirty_cycle >> 32 );
154+ remain = dirty_cycle & 0xffffffffU ;
155+
156+ spin_lock_irqsave (& sc -> systim_lock , flags );
157+ dirty_ns = timecounter_cyc2time (& sc -> tc , raw_tsf );
158+ delta = 0 ;
159+ if (remain ) {
160+ u64 frac = 0 ;
161+ delta = cyclecounter_cyc2ns (& sc -> cc , 1 , sc -> cc .mask , & frac );
162+ delta = delta * remain / 1000 ;
163+ }
164+ spin_unlock_irqrestore (& sc -> systim_lock , flags );
165+
166+ dirty_ns += delta ;
167+ sc -> ptp_dirtyts = dirty_ns ;
168+
169+ return len ;
170+ }
171+
172+ static const struct file_operations fops_dirtyts = {
173+ .read = read_file_dirtyts ,
174+ .write = write_file_dirtyts ,
175+ .open = simple_open ,
176+ .owner = THIS_MODULE ,
177+ .llseek = default_llseek ,
178+ };
179+
180+ static ssize_t read_file_trigger_cbr (struct file * file , char __user * user_buf , size_t count , loff_t * ppos ) {
181+ return - EINVAL ;
182+ }
183+
184+ static ssize_t write_file_trigger_cbr (struct file * file , const char __user * user_buf ,
185+ size_t count , loff_t * ppos ) {
186+ struct ath_softc * sc = file -> private_data ;
187+ struct ath_hw * ah = sc -> sc_ah ;
188+
189+ if (count & 1 ) {
190+ printk ("ath9k: cbr open\n" );
191+ // REG_RMW(ah, AR_QMISC(ATH_TXQ_AC_VI), AR_Q_MISC_FSP_CBR, AR_Q_MISC_FSP);
192+ REG_WRITE (ah , AR_QCBRCFG (ATH_TXQ_AC_VI ), 0xc350 );
193+ } else {
194+ printk ("ath9k: cbr gated\n" );
195+ // REG_RMW(ah, AR_QMISC(ATH_TXQ_AC_VI), 0x4, AR_Q_MISC_FSP);
196+ }
197+
198+ return count ;
199+ }
200+
201+ static const struct file_operations fops_trigger_cbr = {
202+ .read = read_file_trigger_cbr ,
203+ .write = write_file_trigger_cbr ,
204+ .open = simple_open ,
205+ .owner = THIS_MODULE ,
206+ .llseek = default_llseek ,
207+ };
208+
124209#define DMA_BUF_LEN 1024
125210
126211
@@ -1427,6 +1512,12 @@ int ath9k_init_debug(struct ath_hw *ah)
14271512 sc -> debug .debugfs_phy ,
14281513 read_file_dump_nfcal );
14291514
1515+ debugfs_create_file ("dirtyts" , 0600 , sc -> debug .debugfs_phy ,
1516+ sc , & fops_dirtyts );
1517+
1518+ debugfs_create_file ("trigger_cbr" , 0600 , sc -> debug .debugfs_phy ,
1519+ sc , & fops_trigger_cbr );
1520+
14301521 ath9k_cmn_debug_base_eeprom (sc -> debug .debugfs_phy , sc -> sc_ah );
14311522 ath9k_cmn_debug_modal_eeprom (sc -> debug .debugfs_phy , sc -> sc_ah );
14321523
0 commit comments