ar9300_xmit.c (250008) | ar9300_xmit.c (278741) |
---|---|
1/* 2 * Copyright (c) 2013 Qualcomm Atheros, Inc. 3 * 4 * Permission to use, copy, modify, and/or distribute this software for any 5 * purpose with or without fee is hereby granted, provided that the above 6 * copyright notice and this permission notice appear in all copies. 7 * 8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH --- 569 unchanged lines hidden (view full) --- 578} 579 580/* 581 * Stop transmit on the specified queue 582 */ 583HAL_BOOL 584ar9300_stop_tx_dma(struct ath_hal *ah, u_int q, u_int timeout) 585{ | 1/* 2 * Copyright (c) 2013 Qualcomm Atheros, Inc. 3 * 4 * Permission to use, copy, modify, and/or distribute this software for any 5 * purpose with or without fee is hereby granted, provided that the above 6 * copyright notice and this permission notice appear in all copies. 7 * 8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH --- 569 unchanged lines hidden (view full) --- 578} 579 580/* 581 * Stop transmit on the specified queue 582 */ 583HAL_BOOL 584ar9300_stop_tx_dma(struct ath_hal *ah, u_int q, u_int timeout) 585{ |
586 struct ath_hal_9300 *ahp = AH9300(ah); 587 |
|
586 /* | 588 /* |
589 * If we call abort txdma instead, no need to stop RX. 590 * Otherwise, the RX logic might not be restarted properly. 591 */ 592 ahp->ah_abort_txdma_norx = AH_FALSE; 593 594 /* |
|
587 * Directly call abort. It is better, hardware-wise, to stop all 588 * queues at once than individual ones. 589 */ 590 return ar9300_abort_tx_dma(ah); 591 592#if 0 593#define AH_TX_STOP_DMA_TIMEOUT 4000 /* usec */ 594#define AH_TIME_QUANTUM 100 /* usec */ --- 198 unchanged lines hidden (view full) --- 793#undef AH_TIME_QUANTUM 794} 795 796/* 797 * Abort transmit on all queues 798 */ 799#define AR9300_ABORT_LOOPS 1000 800#define AR9300_ABORT_WAIT 5 | 595 * Directly call abort. It is better, hardware-wise, to stop all 596 * queues at once than individual ones. 597 */ 598 return ar9300_abort_tx_dma(ah); 599 600#if 0 601#define AH_TX_STOP_DMA_TIMEOUT 4000 /* usec */ 602#define AH_TIME_QUANTUM 100 /* usec */ --- 198 unchanged lines hidden (view full) --- 801#undef AH_TIME_QUANTUM 802} 803 804/* 805 * Abort transmit on all queues 806 */ 807#define AR9300_ABORT_LOOPS 1000 808#define AR9300_ABORT_WAIT 5 |
809#define NEXT_TBTT_NOW 10 |
|
801HAL_BOOL 802ar9300_abort_tx_dma(struct ath_hal *ah) 803{ | 810HAL_BOOL 811ar9300_abort_tx_dma(struct ath_hal *ah) 812{ |
813 struct ath_hal_9300 *ahp = AH9300(ah); |
|
804 int i, q; | 814 int i, q; |
815 u_int32_t nexttbtt, nextdba, tsf_tbtt, tbtt, dba; 816 HAL_BOOL stopped; 817 HAL_BOOL status = AH_TRUE; |
|
805 | 818 |
819 if (ahp->ah_abort_txdma_norx) { 820 /* 821 * First of all, make sure RX has been stopped 822 */ 823 if (ar9300_get_power_mode(ah) != HAL_PM_FULL_SLEEP) { 824 /* Need to stop RX DMA before reset otherwise chip might hang */ 825 stopped = ar9300_set_rx_abort(ah, AH_TRUE); /* abort and disable PCU */ 826 ar9300_set_rx_filter(ah, 0); 827 stopped &= ar9300_stop_dma_receive(ah, 0); /* stop and disable RX DMA */ 828 if (!stopped) { 829 /* 830 * During the transition from full sleep to reset, 831 * recv DMA regs are not available to be read 832 */ 833 HALDEBUG(ah, HAL_DEBUG_UNMASKABLE, 834 "%s[%d]: ar9300_stop_dma_receive failed\n", __func__, __LINE__); 835 //We still continue to stop TX dma 836 //return AH_FALSE; 837 } 838 } else { 839 HALDEBUG(ah, HAL_DEBUG_UNMASKABLE, 840 "%s[%d]: Chip is already in full sleep\n", __func__, __LINE__); 841 } 842 } 843 |
|
806 /* 807 * set txd on all queues 808 */ 809 OS_REG_WRITE(ah, AR_Q_TXD, AR_Q_TXD_M); 810 811 /* 812 * set tx abort bits (also disable rx) 813 */ 814 OS_REG_SET_BIT(ah, AR_PCU_MISC, AR_PCU_FORCE_QUIET_COLL | AR_PCU_CLEAR_VMF); | 844 /* 845 * set txd on all queues 846 */ 847 OS_REG_WRITE(ah, AR_Q_TXD, AR_Q_TXD_M); 848 849 /* 850 * set tx abort bits (also disable rx) 851 */ 852 OS_REG_SET_BIT(ah, AR_PCU_MISC, AR_PCU_FORCE_QUIET_COLL | AR_PCU_CLEAR_VMF); |
815 OS_REG_SET_BIT(ah, AR_DIAG_SW, (AR_DIAG_FORCE_CH_IDLE_HIGH | AR_DIAG_RX_DIS | 816 AR_DIAG_RX_ABORT | AR_DIAG_FORCE_RX_CLEAR)); | 853 /* Add a new receipe from K31 code */ 854 OS_REG_SET_BIT(ah, AR_DIAG_SW, AR_DIAG_FORCE_CH_IDLE_HIGH | AR_DIAG_RX_DIS | 855 AR_DIAG_RX_ABORT | AR_DIAG_FORCE_RX_CLEAR); 856 /* beacon Q flush */ 857 nexttbtt = OS_REG_READ(ah, AR_NEXT_TBTT_TIMER); 858 nextdba = OS_REG_READ(ah, AR_NEXT_DMA_BEACON_ALERT); 859 //printk("%s[%d]:dba: %d, nt: %d \n", __func__, __LINE__, nextdba, nexttbtt); 860 tsf_tbtt = OS_REG_READ(ah, AR_TSF_L32); 861 tbtt = tsf_tbtt + NEXT_TBTT_NOW; 862 dba = tsf_tbtt; 863 OS_REG_WRITE(ah, AR_NEXT_DMA_BEACON_ALERT, dba); 864 OS_REG_WRITE(ah, AR_NEXT_TBTT_TIMER, tbtt); |
817 OS_REG_SET_BIT(ah, AR_D_GBL_IFS_MISC, AR_D_GBL_IFS_MISC_IGNORE_BACKOFF); 818 | 865 OS_REG_SET_BIT(ah, AR_D_GBL_IFS_MISC, AR_D_GBL_IFS_MISC_IGNORE_BACKOFF); 866 |
819 /* Let TXE (all queues) clear before waiting on any pending frames */ 820 for (i = 0; i < AR9300_ABORT_LOOPS; i++) { 821 if (OS_REG_READ(ah, AR_Q_TXE) == 0) { | 867 /* 868 * Let TXE (all queues) clear before waiting for any pending frames 869 * This is needed before starting the RF_BUS GRANT sequence other wise causes kernel 870 * panic 871 */ 872 for(i = 0; i < AR9300_ABORT_LOOPS; i++) { 873 if(OS_REG_READ(ah, AR_Q_TXE) == 0) { |
822 break; 823 } 824 OS_DELAY(AR9300_ABORT_WAIT); 825 } 826 if (i == AR9300_ABORT_LOOPS) { 827 HALDEBUG(ah, HAL_DEBUG_TX, "%s[%d] reached max wait on TXE\n", 828 __func__, __LINE__); 829 } 830 831 /* 832 * wait on all tx queues | 874 break; 875 } 876 OS_DELAY(AR9300_ABORT_WAIT); 877 } 878 if (i == AR9300_ABORT_LOOPS) { 879 HALDEBUG(ah, HAL_DEBUG_TX, "%s[%d] reached max wait on TXE\n", 880 __func__, __LINE__); 881 } 882 883 /* 884 * wait on all tx queues |
885 * This need to be checked in the last to gain extra 50 usec. on avg. 886 * Currently checked first since we dont have a previous channel information currently. 887 * Which is needed to revert the rf changes. |
|
833 */ | 888 */ |
834 for (q = 0; q < AR_NUM_QCU; q++) { | 889 for (q = AR_NUM_QCU - 1; q >= 0; q--) { |
835 for (i = 0; i < AR9300_ABORT_LOOPS; i++) { | 890 for (i = 0; i < AR9300_ABORT_LOOPS; i++) { |
836 if (!ar9300_num_tx_pending(ah, q)) { | 891 if (!(ar9300_num_tx_pending(ah, q))) { |
837 break; 838 } 839 OS_DELAY(AR9300_ABORT_WAIT); 840 } 841 if (i == AR9300_ABORT_LOOPS) { | 892 break; 893 } 894 OS_DELAY(AR9300_ABORT_WAIT); 895 } 896 if (i == AR9300_ABORT_LOOPS) { |
842 HALDEBUG(ah, HAL_DEBUG_TX, 843 "%s[%d] reached max wait on pending tx, q %d\n", 844 __func__, __LINE__, q); 845 return AH_FALSE; | 897 status = AH_FALSE; 898 HALDEBUG(ah, HAL_DEBUG_UNMASKABLE, 899 "ABORT LOOP finsihsed for Q: %d, num_pending: %d \n", 900 q, ar9300_num_tx_pending(ah, q)); 901 goto exit; |
846 } 847 } 848 | 902 } 903 } 904 |
905 /* Updating the beacon alert register with correct value */ 906 OS_REG_WRITE(ah, AR_NEXT_DMA_BEACON_ALERT, nextdba); 907 OS_REG_WRITE(ah, AR_NEXT_TBTT_TIMER, nexttbtt); 908 909exit: |
|
849 /* 850 * clear tx abort bits 851 */ 852 OS_REG_CLR_BIT(ah, AR_PCU_MISC, AR_PCU_FORCE_QUIET_COLL | AR_PCU_CLEAR_VMF); | 910 /* 911 * clear tx abort bits 912 */ 913 OS_REG_CLR_BIT(ah, AR_PCU_MISC, AR_PCU_FORCE_QUIET_COLL | AR_PCU_CLEAR_VMF); |
853 OS_REG_CLR_BIT(ah, AR_DIAG_SW, (AR_DIAG_FORCE_CH_IDLE_HIGH | AR_DIAG_RX_DIS | 854 AR_DIAG_RX_ABORT | AR_DIAG_FORCE_RX_CLEAR)); | 914 /* Added a new receipe from K31 code */ 915 OS_REG_CLR_BIT(ah, AR_DIAG_SW, AR_DIAG_FORCE_CH_IDLE_HIGH | AR_DIAG_RX_DIS | 916 AR_DIAG_RX_ABORT | AR_DIAG_FORCE_RX_CLEAR); |
855 OS_REG_CLR_BIT(ah, AR_D_GBL_IFS_MISC, AR_D_GBL_IFS_MISC_IGNORE_BACKOFF); 856 857 /* 858 * clear txd 859 */ 860 OS_REG_WRITE(ah, AR_Q_TXD, 0); 861 | 917 OS_REG_CLR_BIT(ah, AR_D_GBL_IFS_MISC, AR_D_GBL_IFS_MISC_IGNORE_BACKOFF); 918 919 /* 920 * clear txd 921 */ 922 OS_REG_WRITE(ah, AR_Q_TXD, 0); 923 |
862 return AH_TRUE; | 924 ahp->ah_abort_txdma_norx = AH_TRUE; 925 926 return status; |
863} 864 865/* 866 * Determine which tx queues need interrupt servicing. 867 */ 868void 869ar9300_get_tx_intr_queue(struct ath_hal *ah, u_int32_t *txqs) 870{ --- 39 unchanged lines hidden --- | 927} 928 929/* 930 * Determine which tx queues need interrupt servicing. 931 */ 932void 933ar9300_get_tx_intr_queue(struct ath_hal *ah, u_int32_t *txqs) 934{ --- 39 unchanged lines hidden --- |