mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-11-03 22:44:27 -05:00 
			
		
		
		
	mac80211: more patch reorganization, merge an upstream performance optimization patch
SVN-Revision: 30865
This commit is contained in:
		
							parent
							
								
									1812fe63b2
								
							
						
					
					
						commit
						7dff84b670
					
				@ -29,7 +29,34 @@
 | 
				
			|||||||
 	ts->desc_id = MS(ads->status1, AR_TxDescId);
 | 
					 	ts->desc_id = MS(ads->status1, AR_TxDescId);
 | 
				
			||||||
 	ts->ts_tstamp = ads->status4;
 | 
					 	ts->ts_tstamp = ads->status4;
 | 
				
			||||||
 	ts->ts_status = 0;
 | 
					 	ts->ts_status = 0;
 | 
				
			||||||
@@ -510,7 +506,11 @@ int ath9k_hw_process_rxdesc_edma(struct 
 | 
					@@ -440,20 +436,14 @@ int ath9k_hw_process_rxdesc_edma(struct 
 | 
				
			||||||
 | 
					 	struct ar9003_rxs *rxsp = (struct ar9003_rxs *) buf_addr;
 | 
				
			||||||
 | 
					 	unsigned int phyerr;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-	/* TODO: byte swap on big endian for ar9300_10 */
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					-	if (!rxs) {
 | 
				
			||||||
 | 
					-		if ((rxsp->status11 & AR_RxDone) == 0)
 | 
				
			||||||
 | 
					-			return -EINPROGRESS;
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					-		if (MS(rxsp->ds_info, AR_DescId) != 0x168c)
 | 
				
			||||||
 | 
					-			return -EINVAL;
 | 
				
			||||||
 | 
					+	if ((rxsp->status11 & AR_RxDone) == 0)
 | 
				
			||||||
 | 
					+		return -EINPROGRESS;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-		if ((rxsp->ds_info & (AR_TxRxDesc | AR_CtrlStat)) != 0)
 | 
				
			||||||
 | 
					-			return -EINPROGRESS;
 | 
				
			||||||
 | 
					+	if (MS(rxsp->ds_info, AR_DescId) != 0x168c)
 | 
				
			||||||
 | 
					+		return -EINVAL;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-		return 0;
 | 
				
			||||||
 | 
					-	}
 | 
				
			||||||
 | 
					+	if ((rxsp->ds_info & (AR_TxRxDesc | AR_CtrlStat)) != 0)
 | 
				
			||||||
 | 
					+		return -EINPROGRESS;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	rxs->rs_status = 0;
 | 
				
			||||||
 | 
					 	rxs->rs_flags =  0;
 | 
				
			||||||
 | 
					@@ -510,7 +500,11 @@ int ath9k_hw_process_rxdesc_edma(struct 
 | 
				
			||||||
 		 */
 | 
					 		 */
 | 
				
			||||||
 		if (rxsp->status11 & AR_CRCErr)
 | 
					 		if (rxsp->status11 & AR_CRCErr)
 | 
				
			||||||
 			rxs->rs_status |= ATH9K_RXERR_CRC;
 | 
					 			rxs->rs_status |= ATH9K_RXERR_CRC;
 | 
				
			||||||
@ -42,7 +69,7 @@
 | 
				
			|||||||
 			phyerr = MS(rxsp->status11, AR_PHYErrCode);
 | 
					 			phyerr = MS(rxsp->status11, AR_PHYErrCode);
 | 
				
			||||||
 			/*
 | 
					 			/*
 | 
				
			||||||
 			 * If we reach a point here where AR_PostDelimCRCErr is
 | 
					 			 * If we reach a point here where AR_PostDelimCRCErr is
 | 
				
			||||||
@@ -532,11 +532,7 @@ int ath9k_hw_process_rxdesc_edma(struct 
 | 
					@@ -532,11 +526,7 @@ int ath9k_hw_process_rxdesc_edma(struct 
 | 
				
			||||||
 				rxs->rs_status |= ATH9K_RXERR_PHY;
 | 
					 				rxs->rs_status |= ATH9K_RXERR_PHY;
 | 
				
			||||||
 				rxs->rs_phyerr = phyerr;
 | 
					 				rxs->rs_phyerr = phyerr;
 | 
				
			||||||
 			}
 | 
					 			}
 | 
				
			||||||
@ -1099,15 +1126,53 @@
 | 
				
			|||||||
 
 | 
					 
 | 
				
			||||||
 #undef TX_SAMP_DBG
 | 
					 #undef TX_SAMP_DBG
 | 
				
			||||||
 }
 | 
					 }
 | 
				
			||||||
@@ -1019,6 +1021,7 @@ void ath_debug_stat_rx(struct ath_softc 
 | 
					@@ -942,27 +944,6 @@ static ssize_t read_file_recv(struct fil
 | 
				
			||||||
 | 
					 	PHY_ERR("HT-RATE ERR", ATH9K_PHYERR_HT_RATE_ILLEGAL);
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 	sc->debug.stats.rxstats.rs_antenna = rs->rs_antenna;
 | 
					 	len += snprintf(buf + len, size - len,
 | 
				
			||||||
 | 
					-			"%22s : %10d\n", "RSSI-CTL0",
 | 
				
			||||||
 | 
					-			sc->debug.stats.rxstats.rs_rssi_ctl0);
 | 
				
			||||||
 | 
					-	len += snprintf(buf + len, size - len,
 | 
				
			||||||
 | 
					-			"%22s : %10d\n", "RSSI-CTL1",
 | 
				
			||||||
 | 
					-			sc->debug.stats.rxstats.rs_rssi_ctl1);
 | 
				
			||||||
 | 
					-	len += snprintf(buf + len, size - len,
 | 
				
			||||||
 | 
					-			"%22s : %10d\n", "RSSI-CTL2",
 | 
				
			||||||
 | 
					-			sc->debug.stats.rxstats.rs_rssi_ctl2);
 | 
				
			||||||
 | 
					-	len += snprintf(buf + len, size - len,
 | 
				
			||||||
 | 
					-			"%22s : %10d\n", "RSSI-EXT0",
 | 
				
			||||||
 | 
					-			sc->debug.stats.rxstats.rs_rssi_ext0);
 | 
				
			||||||
 | 
					-	len += snprintf(buf + len, size - len,
 | 
				
			||||||
 | 
					-			"%22s : %10d\n", "RSSI-EXT1",
 | 
				
			||||||
 | 
					-			sc->debug.stats.rxstats.rs_rssi_ext1);
 | 
				
			||||||
 | 
					-	len += snprintf(buf + len, size - len,
 | 
				
			||||||
 | 
					-			"%22s : %10d\n", "RSSI-EXT2",
 | 
				
			||||||
 | 
					-			sc->debug.stats.rxstats.rs_rssi_ext2);
 | 
				
			||||||
 | 
					-	len += snprintf(buf + len, size - len,
 | 
				
			||||||
 | 
					-			"%22s : %10d\n", "Rx Antenna",
 | 
				
			||||||
 | 
					-			sc->debug.stats.rxstats.rs_antenna);
 | 
				
			||||||
 | 
					-	len += snprintf(buf + len, size - len,
 | 
				
			||||||
 | 
					 			"%22s : %10u\n", "RX-Pkts-All",
 | 
				
			||||||
 | 
					 			sc->debug.stats.rxstats.rx_pkts_all);
 | 
				
			||||||
 | 
					 	len += snprintf(buf + len, size - len,
 | 
				
			||||||
 | 
					@@ -1009,16 +990,7 @@ void ath_debug_stat_rx(struct ath_softc 
 | 
				
			||||||
 | 
					 			RX_PHY_ERR_INC(rs->rs_phyerr);
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 | 
					-	sc->debug.stats.rxstats.rs_rssi_ctl0 = rs->rs_rssi_ctl0;
 | 
				
			||||||
 | 
					-	sc->debug.stats.rxstats.rs_rssi_ctl1 = rs->rs_rssi_ctl1;
 | 
				
			||||||
 | 
					-	sc->debug.stats.rxstats.rs_rssi_ctl2 = rs->rs_rssi_ctl2;
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					-	sc->debug.stats.rxstats.rs_rssi_ext0 = rs->rs_rssi_ext0;
 | 
				
			||||||
 | 
					-	sc->debug.stats.rxstats.rs_rssi_ext1 = rs->rs_rssi_ext1;
 | 
				
			||||||
 | 
					-	sc->debug.stats.rxstats.rs_rssi_ext2 = rs->rs_rssi_ext2;
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					-	sc->debug.stats.rxstats.rs_antenna = rs->rs_antenna;
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
+#ifdef CONFIG_ATH9K_MAC_DEBUG
 | 
					+#ifdef CONFIG_ATH9K_MAC_DEBUG
 | 
				
			||||||
 	spin_lock(&sc->debug.samp_lock);
 | 
					 	spin_lock(&sc->debug.samp_lock);
 | 
				
			||||||
 	RX_SAMP_DBG(jiffies) = jiffies;
 | 
					 	RX_SAMP_DBG(jiffies) = jiffies;
 | 
				
			||||||
 	RX_SAMP_DBG(rssi_ctl0) = rs->rs_rssi_ctl0;
 | 
					 	RX_SAMP_DBG(rssi_ctl0) = rs->rs_rssi_ctl0;
 | 
				
			||||||
@@ -1035,6 +1038,8 @@ void ath_debug_stat_rx(struct ath_softc 
 | 
					@@ -1035,6 +1007,8 @@ void ath_debug_stat_rx(struct ath_softc 
 | 
				
			||||||
 	sc->debug.rsidx = (sc->debug.rsidx + 1) % ATH_DBG_MAX_SAMPLES;
 | 
					 	sc->debug.rsidx = (sc->debug.rsidx + 1) % ATH_DBG_MAX_SAMPLES;
 | 
				
			||||||
 	spin_unlock(&sc->debug.samp_lock);
 | 
					 	spin_unlock(&sc->debug.samp_lock);
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@ -1116,7 +1181,7 @@
 | 
				
			|||||||
 #undef RX_STAT_INC
 | 
					 #undef RX_STAT_INC
 | 
				
			||||||
 #undef RX_PHY_ERR_INC
 | 
					 #undef RX_PHY_ERR_INC
 | 
				
			||||||
 #undef RX_SAMP_DBG
 | 
					 #undef RX_SAMP_DBG
 | 
				
			||||||
@@ -1278,6 +1283,8 @@ static const struct file_operations fops
 | 
					@@ -1278,6 +1252,8 @@ static const struct file_operations fops
 | 
				
			||||||
 	.llseek = default_llseek,
 | 
					 	.llseek = default_llseek,
 | 
				
			||||||
 };
 | 
					 };
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@ -1125,7 +1190,7 @@
 | 
				
			|||||||
 void ath9k_debug_samp_bb_mac(struct ath_softc *sc)
 | 
					 void ath9k_debug_samp_bb_mac(struct ath_softc *sc)
 | 
				
			||||||
 {
 | 
					 {
 | 
				
			||||||
 #define ATH_SAMP_DBG(c) (sc->debug.bb_mac_samp[sc->debug.sampidx].c)
 | 
					 #define ATH_SAMP_DBG(c) (sc->debug.bb_mac_samp[sc->debug.sampidx].c)
 | 
				
			||||||
@@ -1551,6 +1558,7 @@ static const struct file_operations fops
 | 
					@@ -1551,6 +1527,7 @@ static const struct file_operations fops
 | 
				
			||||||
 	.llseek = default_llseek,
 | 
					 	.llseek = default_llseek,
 | 
				
			||||||
 };
 | 
					 };
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@ -1133,7 +1198,7 @@
 | 
				
			|||||||
 
 | 
					 
 | 
				
			||||||
 int ath9k_init_debug(struct ath_hw *ah)
 | 
					 int ath9k_init_debug(struct ath_hw *ah)
 | 
				
			||||||
 {
 | 
					 {
 | 
				
			||||||
@@ -1604,8 +1612,10 @@ int ath9k_init_debug(struct ath_hw *ah)
 | 
					@@ -1604,8 +1581,10 @@ int ath9k_init_debug(struct ath_hw *ah)
 | 
				
			||||||
 			    &fops_base_eeprom);
 | 
					 			    &fops_base_eeprom);
 | 
				
			||||||
 	debugfs_create_file("modal_eeprom", S_IRUSR, sc->debug.debugfs_phy, sc,
 | 
					 	debugfs_create_file("modal_eeprom", S_IRUSR, sc->debug.debugfs_phy, sc,
 | 
				
			||||||
 			    &fops_modal_eeprom);
 | 
					 			    &fops_modal_eeprom);
 | 
				
			||||||
@ -1146,7 +1211,21 @@
 | 
				
			|||||||
 			   sc->debug.debugfs_phy, &sc->sc_ah->gpio_mask);
 | 
					 			   sc->debug.debugfs_phy, &sc->sc_ah->gpio_mask);
 | 
				
			||||||
--- a/drivers/net/wireless/ath/ath9k/debug.h
 | 
					--- a/drivers/net/wireless/ath/ath9k/debug.h
 | 
				
			||||||
+++ b/drivers/net/wireless/ath/ath9k/debug.h
 | 
					+++ b/drivers/net/wireless/ath/ath9k/debug.h
 | 
				
			||||||
@@ -235,16 +235,17 @@ struct ath9k_debug {
 | 
					@@ -165,13 +165,6 @@ struct ath_rx_stats {
 | 
				
			||||||
 | 
					 	u32 post_delim_crc_err;
 | 
				
			||||||
 | 
					 	u32 decrypt_busy_err;
 | 
				
			||||||
 | 
					 	u32 phy_err_stats[ATH9K_PHYERR_MAX];
 | 
				
			||||||
 | 
					-	int8_t rs_rssi_ctl0;
 | 
				
			||||||
 | 
					-	int8_t rs_rssi_ctl1;
 | 
				
			||||||
 | 
					-	int8_t rs_rssi_ctl2;
 | 
				
			||||||
 | 
					-	int8_t rs_rssi_ext0;
 | 
				
			||||||
 | 
					-	int8_t rs_rssi_ext1;
 | 
				
			||||||
 | 
					-	int8_t rs_rssi_ext2;
 | 
				
			||||||
 | 
					-	u8 rs_antenna;
 | 
				
			||||||
 | 
					 };
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 enum ath_reset_type {
 | 
				
			||||||
 | 
					@@ -235,16 +228,17 @@ struct ath9k_debug {
 | 
				
			||||||
 	struct dentry *debugfs_phy;
 | 
					 	struct dentry *debugfs_phy;
 | 
				
			||||||
 	u32 regidx;
 | 
					 	u32 regidx;
 | 
				
			||||||
 	struct ath_stats stats;
 | 
					 	struct ath_stats stats;
 | 
				
			||||||
@ -1165,7 +1244,7 @@
 | 
				
			|||||||
 void ath_debug_stat_interrupt(struct ath_softc *sc, enum ath9k_int status);
 | 
					 void ath_debug_stat_interrupt(struct ath_softc *sc, enum ath9k_int status);
 | 
				
			||||||
 void ath_debug_stat_tx(struct ath_softc *sc, struct ath_buf *bf,
 | 
					 void ath_debug_stat_tx(struct ath_softc *sc, struct ath_buf *bf,
 | 
				
			||||||
 		       struct ath_tx_status *ts, struct ath_txq *txq,
 | 
					 		       struct ath_tx_status *ts, struct ath_txq *txq,
 | 
				
			||||||
@@ -258,10 +259,6 @@ static inline int ath9k_init_debug(struc
 | 
					@@ -258,10 +252,6 @@ static inline int ath9k_init_debug(struc
 | 
				
			||||||
 	return 0;
 | 
					 	return 0;
 | 
				
			||||||
 }
 | 
					 }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@ -1176,7 +1255,7 @@
 | 
				
			|||||||
 static inline void ath_debug_stat_interrupt(struct ath_softc *sc,
 | 
					 static inline void ath_debug_stat_interrupt(struct ath_softc *sc,
 | 
				
			||||||
 					    enum ath9k_int status)
 | 
					 					    enum ath9k_int status)
 | 
				
			||||||
 {
 | 
					 {
 | 
				
			||||||
@@ -282,4 +279,17 @@ static inline void ath_debug_stat_rx(str
 | 
					@@ -282,4 +272,17 @@ static inline void ath_debug_stat_rx(str
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 #endif /* CONFIG_ATH9K_DEBUGFS */
 | 
					 #endif /* CONFIG_ATH9K_DEBUGFS */
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@ -1307,7 +1386,93 @@
 | 
				
			|||||||
 
 | 
					 
 | 
				
			||||||
--- a/drivers/net/wireless/ath/ath9k/recv.c
 | 
					--- a/drivers/net/wireless/ath/ath9k/recv.c
 | 
				
			||||||
+++ b/drivers/net/wireless/ath/ath9k/recv.c
 | 
					+++ b/drivers/net/wireless/ath/ath9k/recv.c
 | 
				
			||||||
@@ -954,6 +954,7 @@ static void ath9k_process_rssi(struct at
 | 
					@@ -232,7 +232,6 @@ static void ath_rx_edma_cleanup(struct a
 | 
				
			||||||
 | 
					 static void ath_rx_edma_init_queue(struct ath_rx_edma *rx_edma, int size)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					 	skb_queue_head_init(&rx_edma->rx_fifo);
 | 
				
			||||||
 | 
					-	skb_queue_head_init(&rx_edma->rx_buffers);
 | 
				
			||||||
 | 
					 	rx_edma->rx_fifo_hwsize = size;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -658,7 +657,9 @@ static void ath_rx_ps(struct ath_softc *
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 static bool ath_edma_get_buffers(struct ath_softc *sc,
 | 
				
			||||||
 | 
					-				 enum ath9k_rx_qtype qtype)
 | 
				
			||||||
 | 
					+				 enum ath9k_rx_qtype qtype,
 | 
				
			||||||
 | 
					+				 struct ath_rx_status *rs,
 | 
				
			||||||
 | 
					+				 struct ath_buf **dest)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					 	struct ath_rx_edma *rx_edma = &sc->rx.rx_edma[qtype];
 | 
				
			||||||
 | 
					 	struct ath_hw *ah = sc->sc_ah;
 | 
				
			||||||
 | 
					@@ -677,7 +678,7 @@ static bool ath_edma_get_buffers(struct 
 | 
				
			||||||
 | 
					 	dma_sync_single_for_cpu(sc->dev, bf->bf_buf_addr,
 | 
				
			||||||
 | 
					 				common->rx_bufsize, DMA_FROM_DEVICE);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-	ret = ath9k_hw_process_rxdesc_edma(ah, NULL, skb->data);
 | 
				
			||||||
 | 
					+	ret = ath9k_hw_process_rxdesc_edma(ah, rs, skb->data);
 | 
				
			||||||
 | 
					 	if (ret == -EINPROGRESS) {
 | 
				
			||||||
 | 
					 		/*let device gain the buffer again*/
 | 
				
			||||||
 | 
					 		dma_sync_single_for_device(sc->dev, bf->bf_buf_addr,
 | 
				
			||||||
 | 
					@@ -690,20 +691,21 @@ static bool ath_edma_get_buffers(struct 
 | 
				
			||||||
 | 
					 		/* corrupt descriptor, skip this one and the following one */
 | 
				
			||||||
 | 
					 		list_add_tail(&bf->list, &sc->rx.rxbuf);
 | 
				
			||||||
 | 
					 		ath_rx_edma_buf_link(sc, qtype);
 | 
				
			||||||
 | 
					-		skb = skb_peek(&rx_edma->rx_fifo);
 | 
				
			||||||
 | 
					-		if (!skb)
 | 
				
			||||||
 | 
					-			return true;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-		bf = SKB_CB_ATHBUF(skb);
 | 
				
			||||||
 | 
					-		BUG_ON(!bf);
 | 
				
			||||||
 | 
					+		skb = skb_peek(&rx_edma->rx_fifo);
 | 
				
			||||||
 | 
					+		if (skb) {
 | 
				
			||||||
 | 
					+			bf = SKB_CB_ATHBUF(skb);
 | 
				
			||||||
 | 
					+			BUG_ON(!bf);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-		__skb_unlink(skb, &rx_edma->rx_fifo);
 | 
				
			||||||
 | 
					-		list_add_tail(&bf->list, &sc->rx.rxbuf);
 | 
				
			||||||
 | 
					-		ath_rx_edma_buf_link(sc, qtype);
 | 
				
			||||||
 | 
					-		return true;
 | 
				
			||||||
 | 
					+			__skb_unlink(skb, &rx_edma->rx_fifo);
 | 
				
			||||||
 | 
					+			list_add_tail(&bf->list, &sc->rx.rxbuf);
 | 
				
			||||||
 | 
					+			ath_rx_edma_buf_link(sc, qtype);
 | 
				
			||||||
 | 
					+		} else {
 | 
				
			||||||
 | 
					+			bf = NULL;
 | 
				
			||||||
 | 
					+		}
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					-	skb_queue_tail(&rx_edma->rx_buffers, skb);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+	*dest = bf;
 | 
				
			||||||
 | 
					 	return true;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -711,18 +713,15 @@ static struct ath_buf *ath_edma_get_next
 | 
				
			||||||
 | 
					 						struct ath_rx_status *rs,
 | 
				
			||||||
 | 
					 						enum ath9k_rx_qtype qtype)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					-	struct ath_rx_edma *rx_edma = &sc->rx.rx_edma[qtype];
 | 
				
			||||||
 | 
					-	struct sk_buff *skb;
 | 
				
			||||||
 | 
					-	struct ath_buf *bf;
 | 
				
			||||||
 | 
					+	struct ath_buf *bf = NULL;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-	while (ath_edma_get_buffers(sc, qtype));
 | 
				
			||||||
 | 
					-	skb = __skb_dequeue(&rx_edma->rx_buffers);
 | 
				
			||||||
 | 
					-	if (!skb)
 | 
				
			||||||
 | 
					-		return NULL;
 | 
				
			||||||
 | 
					+	while (ath_edma_get_buffers(sc, qtype, rs, &bf)) {
 | 
				
			||||||
 | 
					+		if (!bf)
 | 
				
			||||||
 | 
					+			continue;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-	bf = SKB_CB_ATHBUF(skb);
 | 
				
			||||||
 | 
					-	ath9k_hw_process_rxdesc_edma(sc->sc_ah, rs, skb->data);
 | 
				
			||||||
 | 
					-	return bf;
 | 
				
			||||||
 | 
					+		return bf;
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+	return NULL;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 static struct ath_buf *ath_get_next_rx_buf(struct ath_softc *sc,
 | 
				
			||||||
 | 
					@@ -954,6 +953,7 @@ static void ath9k_process_rssi(struct at
 | 
				
			||||||
 	struct ath_softc *sc = hw->priv;
 | 
					 	struct ath_softc *sc = hw->priv;
 | 
				
			||||||
 	struct ath_hw *ah = common->ah;
 | 
					 	struct ath_hw *ah = common->ah;
 | 
				
			||||||
 	int last_rssi;
 | 
					 	int last_rssi;
 | 
				
			||||||
@ -1315,7 +1480,7 @@
 | 
				
			|||||||
 
 | 
					 
 | 
				
			||||||
 	if (!rx_stats->is_mybeacon ||
 | 
					 	if (!rx_stats->is_mybeacon ||
 | 
				
			||||||
 	    ((ah->opmode != NL80211_IFTYPE_STATION) &&
 | 
					 	    ((ah->opmode != NL80211_IFTYPE_STATION) &&
 | 
				
			||||||
@@ -965,13 +966,12 @@ static void ath9k_process_rssi(struct at
 | 
					@@ -965,13 +965,12 @@ static void ath9k_process_rssi(struct at
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 	last_rssi = sc->last_rssi;
 | 
					 	last_rssi = sc->last_rssi;
 | 
				
			||||||
 	if (likely(last_rssi != ATH_RSSI_DUMMY_MARKER))
 | 
					 	if (likely(last_rssi != ATH_RSSI_DUMMY_MARKER))
 | 
				
			||||||
@ -1333,7 +1498,7 @@
 | 
				
			|||||||
 }
 | 
					 }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 /*
 | 
					 /*
 | 
				
			||||||
@@ -1011,6 +1011,8 @@ static int ath9k_rx_skb_preprocess(struc
 | 
					@@ -1011,6 +1010,8 @@ static int ath9k_rx_skb_preprocess(struc
 | 
				
			||||||
 	rx_status->signal = ah->noise + rx_stats->rs_rssi;
 | 
					 	rx_status->signal = ah->noise + rx_stats->rs_rssi;
 | 
				
			||||||
 	rx_status->antenna = rx_stats->rs_antenna;
 | 
					 	rx_status->antenna = rx_stats->rs_antenna;
 | 
				
			||||||
 	rx_status->flag |= RX_FLAG_MACTIME_MPDU;
 | 
					 	rx_status->flag |= RX_FLAG_MACTIME_MPDU;
 | 
				
			||||||
@ -1443,3 +1608,13 @@
 | 
				
			|||||||
 
 | 
					 
 | 
				
			||||||
 		txq = &sc->tx.txq[ts.qid];
 | 
					 		txq = &sc->tx.txq[ts.qid];
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 | 
					--- a/drivers/net/wireless/ath/ath9k/ath9k.h
 | 
				
			||||||
 | 
					+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
 | 
				
			||||||
 | 
					@@ -299,7 +299,6 @@ struct ath_tx {
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 struct ath_rx_edma {
 | 
				
			||||||
 | 
					 	struct sk_buff_head rx_fifo;
 | 
				
			||||||
 | 
					-	struct sk_buff_head rx_buffers;
 | 
				
			||||||
 | 
					 	u32 rx_fifo_hwsize;
 | 
				
			||||||
 | 
					 };
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,6 @@
 | 
				
			|||||||
--- a/drivers/net/wireless/ath/ath9k/debug.c
 | 
					--- a/drivers/net/wireless/ath/ath9k/debug.c
 | 
				
			||||||
+++ b/drivers/net/wireless/ath/ath9k/debug.c
 | 
					+++ b/drivers/net/wireless/ath/ath9k/debug.c
 | 
				
			||||||
@@ -1560,6 +1560,53 @@ static const struct file_operations fops
 | 
					@@ -1529,6 +1529,53 @@ static const struct file_operations fops
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 #endif
 | 
					 #endif
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@ -54,7 +54,7 @@
 | 
				
			|||||||
 int ath9k_init_debug(struct ath_hw *ah)
 | 
					 int ath9k_init_debug(struct ath_hw *ah)
 | 
				
			||||||
 {
 | 
					 {
 | 
				
			||||||
 	struct ath_common *common = ath9k_hw_common(ah);
 | 
					 	struct ath_common *common = ath9k_hw_common(ah);
 | 
				
			||||||
@@ -1623,5 +1670,8 @@ int ath9k_init_debug(struct ath_hw *ah)
 | 
					@@ -1592,5 +1639,8 @@ int ath9k_init_debug(struct ath_hw *ah)
 | 
				
			||||||
 	debugfs_create_u32("gpio_val", S_IRUSR | S_IWUSR,
 | 
					 	debugfs_create_u32("gpio_val", S_IRUSR | S_IWUSR,
 | 
				
			||||||
 			   sc->debug.debugfs_phy, &sc->sc_ah->gpio_val);
 | 
					 			   sc->debug.debugfs_phy, &sc->sc_ah->gpio_val);
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,6 @@
 | 
				
			|||||||
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
 | 
					--- a/drivers/net/wireless/ath/ath9k/ath9k.h
 | 
				
			||||||
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
 | 
					+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
 | 
				
			||||||
@@ -370,7 +370,7 @@ struct ath_vif {
 | 
					@@ -369,7 +369,7 @@ struct ath_vif {
 | 
				
			||||||
  * number of beacon intervals, the game's up.
 | 
					  * number of beacon intervals, the game's up.
 | 
				
			||||||
  */
 | 
					  */
 | 
				
			||||||
 #define BSTUCK_THRESH           	9
 | 
					 #define BSTUCK_THRESH           	9
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,6 @@
 | 
				
			|||||||
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
 | 
					--- a/drivers/net/wireless/ath/ath9k/ath9k.h
 | 
				
			||||||
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
 | 
					+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
 | 
				
			||||||
@@ -625,6 +625,7 @@ struct ath_softc {
 | 
					@@ -624,6 +624,7 @@ struct ath_softc {
 | 
				
			||||||
 	struct ieee80211_hw *hw;
 | 
					 	struct ieee80211_hw *hw;
 | 
				
			||||||
 	struct device *dev;
 | 
					 	struct device *dev;
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@ -8,7 +8,7 @@
 | 
				
			|||||||
 	int chan_idx;
 | 
					 	int chan_idx;
 | 
				
			||||||
 	int chan_is_ht;
 | 
					 	int chan_is_ht;
 | 
				
			||||||
 	struct survey_info *cur_survey;
 | 
					 	struct survey_info *cur_survey;
 | 
				
			||||||
@@ -692,6 +693,7 @@ struct ath_softc {
 | 
					@@ -691,6 +692,7 @@ struct ath_softc {
 | 
				
			||||||
 	u8 ant_tx, ant_rx;
 | 
					 	u8 ant_tx, ant_rx;
 | 
				
			||||||
 };
 | 
					 };
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@ -18,7 +18,7 @@
 | 
				
			|||||||
 
 | 
					 
 | 
				
			||||||
--- a/drivers/net/wireless/ath/ath9k/debug.c
 | 
					--- a/drivers/net/wireless/ath/ath9k/debug.c
 | 
				
			||||||
+++ b/drivers/net/wireless/ath/ath9k/debug.c
 | 
					+++ b/drivers/net/wireless/ath/ath9k/debug.c
 | 
				
			||||||
@@ -1607,6 +1607,50 @@ static const struct file_operations fops
 | 
					@@ -1576,6 +1576,50 @@ static const struct file_operations fops
 | 
				
			||||||
 	.owner = THIS_MODULE
 | 
					 	.owner = THIS_MODULE
 | 
				
			||||||
 };
 | 
					 };
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@ -69,7 +69,7 @@
 | 
				
			|||||||
 int ath9k_init_debug(struct ath_hw *ah)
 | 
					 int ath9k_init_debug(struct ath_hw *ah)
 | 
				
			||||||
 {
 | 
					 {
 | 
				
			||||||
 	struct ath_common *common = ath9k_hw_common(ah);
 | 
					 	struct ath_common *common = ath9k_hw_common(ah);
 | 
				
			||||||
@@ -1673,5 +1717,8 @@ int ath9k_init_debug(struct ath_hw *ah)
 | 
					@@ -1642,5 +1686,8 @@ int ath9k_init_debug(struct ath_hw *ah)
 | 
				
			||||||
 	debugfs_create_file("eeprom", S_IRUSR, sc->debug.debugfs_phy, sc,
 | 
					 	debugfs_create_file("eeprom", S_IRUSR, sc->debug.debugfs_phy, sc,
 | 
				
			||||||
 			    &fops_eeprom);
 | 
					 			    &fops_eeprom);
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 | 
				
			|||||||
@ -20,7 +20,7 @@
 | 
				
			|||||||
 	spinlock_t txbuflock;
 | 
					 	spinlock_t txbuflock;
 | 
				
			||||||
--- a/drivers/net/wireless/ath/ath9k/debug.c
 | 
					--- a/drivers/net/wireless/ath/ath9k/debug.c
 | 
				
			||||||
+++ b/drivers/net/wireless/ath/ath9k/debug.c
 | 
					+++ b/drivers/net/wireless/ath/ath9k/debug.c
 | 
				
			||||||
@@ -1674,6 +1674,10 @@ int ath9k_init_debug(struct ath_hw *ah)
 | 
					@@ -1643,6 +1643,10 @@ int ath9k_init_debug(struct ath_hw *ah)
 | 
				
			||||||
 			    &fops_interrupt);
 | 
					 			    &fops_interrupt);
 | 
				
			||||||
 	debugfs_create_file("xmit", S_IRUSR, sc->debug.debugfs_phy, sc,
 | 
					 	debugfs_create_file("xmit", S_IRUSR, sc->debug.debugfs_phy, sc,
 | 
				
			||||||
 			    &fops_xmit);
 | 
					 			    &fops_xmit);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,63 +0,0 @@
 | 
				
			|||||||
--- a/drivers/net/wireless/ath/ath9k/debug.c
 | 
					 | 
				
			||||||
+++ b/drivers/net/wireless/ath/ath9k/debug.c
 | 
					 | 
				
			||||||
@@ -944,27 +944,6 @@ static ssize_t read_file_recv(struct fil
 | 
					 | 
				
			||||||
 	PHY_ERR("HT-RATE ERR", ATH9K_PHYERR_HT_RATE_ILLEGAL);
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
 	len += snprintf(buf + len, size - len,
 | 
					 | 
				
			||||||
-			"%22s : %10d\n", "RSSI-CTL0",
 | 
					 | 
				
			||||||
-			sc->debug.stats.rxstats.rs_rssi_ctl0);
 | 
					 | 
				
			||||||
-	len += snprintf(buf + len, size - len,
 | 
					 | 
				
			||||||
-			"%22s : %10d\n", "RSSI-CTL1",
 | 
					 | 
				
			||||||
-			sc->debug.stats.rxstats.rs_rssi_ctl1);
 | 
					 | 
				
			||||||
-	len += snprintf(buf + len, size - len,
 | 
					 | 
				
			||||||
-			"%22s : %10d\n", "RSSI-CTL2",
 | 
					 | 
				
			||||||
-			sc->debug.stats.rxstats.rs_rssi_ctl2);
 | 
					 | 
				
			||||||
-	len += snprintf(buf + len, size - len,
 | 
					 | 
				
			||||||
-			"%22s : %10d\n", "RSSI-EXT0",
 | 
					 | 
				
			||||||
-			sc->debug.stats.rxstats.rs_rssi_ext0);
 | 
					 | 
				
			||||||
-	len += snprintf(buf + len, size - len,
 | 
					 | 
				
			||||||
-			"%22s : %10d\n", "RSSI-EXT1",
 | 
					 | 
				
			||||||
-			sc->debug.stats.rxstats.rs_rssi_ext1);
 | 
					 | 
				
			||||||
-	len += snprintf(buf + len, size - len,
 | 
					 | 
				
			||||||
-			"%22s : %10d\n", "RSSI-EXT2",
 | 
					 | 
				
			||||||
-			sc->debug.stats.rxstats.rs_rssi_ext2);
 | 
					 | 
				
			||||||
-	len += snprintf(buf + len, size - len,
 | 
					 | 
				
			||||||
-			"%22s : %10d\n", "Rx Antenna",
 | 
					 | 
				
			||||||
-			sc->debug.stats.rxstats.rs_antenna);
 | 
					 | 
				
			||||||
-	len += snprintf(buf + len, size - len,
 | 
					 | 
				
			||||||
 			"%22s : %10u\n", "RX-Pkts-All",
 | 
					 | 
				
			||||||
 			sc->debug.stats.rxstats.rx_pkts_all);
 | 
					 | 
				
			||||||
 	len += snprintf(buf + len, size - len,
 | 
					 | 
				
			||||||
@@ -1011,16 +990,6 @@ void ath_debug_stat_rx(struct ath_softc 
 | 
					 | 
				
			||||||
 			RX_PHY_ERR_INC(rs->rs_phyerr);
 | 
					 | 
				
			||||||
 	}
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
-	sc->debug.stats.rxstats.rs_rssi_ctl0 = rs->rs_rssi_ctl0;
 | 
					 | 
				
			||||||
-	sc->debug.stats.rxstats.rs_rssi_ctl1 = rs->rs_rssi_ctl1;
 | 
					 | 
				
			||||||
-	sc->debug.stats.rxstats.rs_rssi_ctl2 = rs->rs_rssi_ctl2;
 | 
					 | 
				
			||||||
-
 | 
					 | 
				
			||||||
-	sc->debug.stats.rxstats.rs_rssi_ext0 = rs->rs_rssi_ext0;
 | 
					 | 
				
			||||||
-	sc->debug.stats.rxstats.rs_rssi_ext1 = rs->rs_rssi_ext1;
 | 
					 | 
				
			||||||
-	sc->debug.stats.rxstats.rs_rssi_ext2 = rs->rs_rssi_ext2;
 | 
					 | 
				
			||||||
-
 | 
					 | 
				
			||||||
-	sc->debug.stats.rxstats.rs_antenna = rs->rs_antenna;
 | 
					 | 
				
			||||||
-
 | 
					 | 
				
			||||||
 #ifdef CONFIG_ATH9K_MAC_DEBUG
 | 
					 | 
				
			||||||
 	spin_lock(&sc->debug.samp_lock);
 | 
					 | 
				
			||||||
 	RX_SAMP_DBG(jiffies) = jiffies;
 | 
					 | 
				
			||||||
--- a/drivers/net/wireless/ath/ath9k/debug.h
 | 
					 | 
				
			||||||
+++ b/drivers/net/wireless/ath/ath9k/debug.h
 | 
					 | 
				
			||||||
@@ -165,13 +165,6 @@ struct ath_rx_stats {
 | 
					 | 
				
			||||||
 	u32 post_delim_crc_err;
 | 
					 | 
				
			||||||
 	u32 decrypt_busy_err;
 | 
					 | 
				
			||||||
 	u32 phy_err_stats[ATH9K_PHYERR_MAX];
 | 
					 | 
				
			||||||
-	int8_t rs_rssi_ctl0;
 | 
					 | 
				
			||||||
-	int8_t rs_rssi_ctl1;
 | 
					 | 
				
			||||||
-	int8_t rs_rssi_ctl2;
 | 
					 | 
				
			||||||
-	int8_t rs_rssi_ext0;
 | 
					 | 
				
			||||||
-	int8_t rs_rssi_ext1;
 | 
					 | 
				
			||||||
-	int8_t rs_rssi_ext2;
 | 
					 | 
				
			||||||
-	u8 rs_antenna;
 | 
					 | 
				
			||||||
 };
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
 enum ath_reset_type {
 | 
					 | 
				
			||||||
@ -139,7 +139,7 @@
 | 
				
			|||||||
 	u8 rs_num_delims;
 | 
					 	u8 rs_num_delims;
 | 
				
			||||||
--- a/drivers/net/wireless/ath/ath9k/recv.c
 | 
					--- a/drivers/net/wireless/ath/ath9k/recv.c
 | 
				
			||||||
+++ b/drivers/net/wireless/ath/ath9k/recv.c
 | 
					+++ b/drivers/net/wireless/ath/ath9k/recv.c
 | 
				
			||||||
@@ -987,6 +987,7 @@ static int ath9k_rx_skb_preprocess(struc
 | 
					@@ -986,6 +986,7 @@ static int ath9k_rx_skb_preprocess(struc
 | 
				
			||||||
 				   bool *decrypt_error)
 | 
					 				   bool *decrypt_error)
 | 
				
			||||||
 {
 | 
					 {
 | 
				
			||||||
 	struct ath_hw *ah = common->ah;
 | 
					 	struct ath_hw *ah = common->ah;
 | 
				
			||||||
@ -147,7 +147,7 @@
 | 
				
			|||||||
 
 | 
					 
 | 
				
			||||||
 	memset(rx_status, 0, sizeof(struct ieee80211_rx_status));
 | 
					 	memset(rx_status, 0, sizeof(struct ieee80211_rx_status));
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -1014,6 +1015,20 @@ static int ath9k_rx_skb_preprocess(struc
 | 
					@@ -1013,6 +1014,20 @@ static int ath9k_rx_skb_preprocess(struc
 | 
				
			||||||
 	if (rx_stats->rs_moreaggr)
 | 
					 	if (rx_stats->rs_moreaggr)
 | 
				
			||||||
 		rx_status->flag |= RX_FLAG_NO_SIGNAL_VAL;
 | 
					 		rx_status->flag |= RX_FLAG_NO_SIGNAL_VAL;
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@ -168,7 +168,7 @@
 | 
				
			|||||||
 	return 0;
 | 
					 	return 0;
 | 
				
			||||||
 }
 | 
					 }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -1544,14 +1559,14 @@ static void ath_ant_comb_scan(struct ath
 | 
					@@ -1543,14 +1558,14 @@ static void ath_ant_comb_scan(struct ath
 | 
				
			||||||
 	struct ath_ant_comb *antcomb = &sc->ant_comb;
 | 
					 	struct ath_ant_comb *antcomb = &sc->ant_comb;
 | 
				
			||||||
 	int alt_ratio = 0, alt_rssi_avg = 0, main_rssi_avg = 0, curr_alt_set;
 | 
					 	int alt_ratio = 0, alt_rssi_avg = 0, main_rssi_avg = 0, curr_alt_set;
 | 
				
			||||||
 	int curr_main_set;
 | 
					 	int curr_main_set;
 | 
				
			||||||
@ -189,7 +189,7 @@
 | 
				
			|||||||
 	/* Record packet only when both main_rssi and  alt_rssi is positive */
 | 
					 	/* Record packet only when both main_rssi and  alt_rssi is positive */
 | 
				
			||||||
--- a/drivers/net/wireless/ath/ath9k/ar9003_mac.c
 | 
					--- a/drivers/net/wireless/ath/ath9k/ar9003_mac.c
 | 
				
			||||||
+++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.c
 | 
					+++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.c
 | 
				
			||||||
@@ -459,12 +459,12 @@ int ath9k_hw_process_rxdesc_edma(struct 
 | 
					@@ -453,12 +453,12 @@ int ath9k_hw_process_rxdesc_edma(struct 
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 	/* XXX: Keycache */
 | 
					 	/* XXX: Keycache */
 | 
				
			||||||
 	rxs->rs_rssi = MS(rxsp->status5, AR_RxRSSICombined);
 | 
					 	rxs->rs_rssi = MS(rxsp->status5, AR_RxRSSICombined);
 | 
				
			||||||
@ -1,6 +1,6 @@
 | 
				
			|||||||
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
 | 
					--- a/drivers/net/wireless/ath/ath9k/ath9k.h
 | 
				
			||||||
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
 | 
					+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
 | 
				
			||||||
@@ -505,6 +505,9 @@ static inline u16 ath9k_btcoex_aggr_limi
 | 
					@@ -504,6 +504,9 @@ static inline u16 ath9k_btcoex_aggr_limi
 | 
				
			||||||
 #ifdef CONFIG_MAC80211_LEDS
 | 
					 #ifdef CONFIG_MAC80211_LEDS
 | 
				
			||||||
 void ath_init_leds(struct ath_softc *sc);
 | 
					 void ath_init_leds(struct ath_softc *sc);
 | 
				
			||||||
 void ath_deinit_leds(struct ath_softc *sc);
 | 
					 void ath_deinit_leds(struct ath_softc *sc);
 | 
				
			||||||
@ -10,7 +10,7 @@
 | 
				
			|||||||
 #else
 | 
					 #else
 | 
				
			||||||
 static inline void ath_init_leds(struct ath_softc *sc)
 | 
					 static inline void ath_init_leds(struct ath_softc *sc)
 | 
				
			||||||
 {
 | 
					 {
 | 
				
			||||||
@@ -625,6 +628,13 @@ struct ath9k_vif_iter_data {
 | 
					@@ -624,6 +627,13 @@ struct ath9k_vif_iter_data {
 | 
				
			||||||
 	int nothers;   /* number of vifs not specified above. */
 | 
					 	int nothers;   /* number of vifs not specified above. */
 | 
				
			||||||
 };
 | 
					 };
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@ -24,7 +24,7 @@
 | 
				
			|||||||
 struct ath_softc {
 | 
					 struct ath_softc {
 | 
				
			||||||
 	struct ieee80211_hw *hw;
 | 
					 	struct ieee80211_hw *hw;
 | 
				
			||||||
 	struct device *dev;
 | 
					 	struct device *dev;
 | 
				
			||||||
@@ -668,9 +678,8 @@ struct ath_softc {
 | 
					@@ -667,9 +677,8 @@ struct ath_softc {
 | 
				
			||||||
 	struct ieee80211_supported_band sbands[IEEE80211_NUM_BANDS];
 | 
					 	struct ieee80211_supported_band sbands[IEEE80211_NUM_BANDS];
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 #ifdef CONFIG_MAC80211_LEDS
 | 
					 #ifdef CONFIG_MAC80211_LEDS
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user