diff options
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl-3945.c')
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-3945.c | 208 | 
1 files changed, 30 insertions, 178 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945.c b/drivers/net/wireless/iwlwifi/iwl-3945.c index c44a303e62e..a07310fefcf 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945.c +++ b/drivers/net/wireless/iwlwifi/iwl-3945.c @@ -279,8 +279,8 @@ static void iwl3945_tx_queue_reclaim(struct iwl_priv *priv,  		q->read_ptr = iwl_queue_inc_wrap(q->read_ptr, q->n_bd)) {  		tx_info = &txq->txb[txq->q.read_ptr]; -		ieee80211_tx_status_irqsafe(priv->hw, tx_info->skb[0]); -		tx_info->skb[0] = NULL; +		ieee80211_tx_status_irqsafe(priv->hw, tx_info->skb); +		tx_info->skb = NULL;  		priv->cfg->ops->lib->txq_free_tfd(priv, txq);  	} @@ -315,7 +315,7 @@ static void iwl3945_rx_reply_tx(struct iwl_priv *priv,  		return;  	} -	info = IEEE80211_SKB_CB(txq->txb[txq->q.read_ptr].skb[0]); +	info = IEEE80211_SKB_CB(txq->txb[txq->q.read_ptr].skb);  	ieee80211_tx_info_clear_status(info);  	/* Fill the MRR chain with some info about on-chip retransmissions */ @@ -352,7 +352,7 @@ static void iwl3945_rx_reply_tx(struct iwl_priv *priv,   *  RX handler implementations   *   *****************************************************************************/ -#ifdef CONFIG_IWLWIFI_DEBUG +#ifdef CONFIG_IWLWIFI_DEBUGFS  /*   *  based on the assumption of all statistics counter are in DWORD   *  FIXME: This function is for debugging, do not deal with @@ -406,6 +406,11 @@ static bool iwl3945_good_plcp_health(struct iwl_priv *priv,  	unsigned int plcp_msec;  	unsigned long plcp_received_jiffies; +	if (priv->cfg->plcp_delta_threshold == +	    IWL_MAX_PLCP_ERR_THRESHOLD_DISABLE) { +		IWL_DEBUG_RADIO(priv, "plcp_err check disabled\n"); +		return rc; +	}  	memcpy(¤t_stat, pkt->u.raw, sizeof(struct  			iwl3945_notif_statistics));  	/* @@ -460,7 +465,7 @@ void iwl3945_hw_rx_statistics(struct iwl_priv *priv,  	IWL_DEBUG_RX(priv, "Statistics notification received (%d vs %d).\n",  		     (int)sizeof(struct iwl3945_notif_statistics),  		     le32_to_cpu(pkt->len_n_flags) & FH_RSCSR_FRAME_SIZE_MSK); -#ifdef CONFIG_IWLWIFI_DEBUG +#ifdef CONFIG_IWLWIFI_DEBUGFS  	iwl3945_accumulative_statistics(priv, (__le32 *)&pkt->u.raw);  #endif  	iwl_recover_from_statistics(priv, pkt); @@ -475,7 +480,7 @@ void iwl3945_reply_statistics(struct iwl_priv *priv,  	__le32 *flag = (__le32 *)&pkt->u.raw;  	if (le32_to_cpu(*flag) & UCODE_STATISTICS_CLEAR_MSK) { -#ifdef CONFIG_IWLWIFI_DEBUG +#ifdef CONFIG_IWLWIFI_DEBUGFS  		memset(&priv->_3945.accum_statistics, 0,  			sizeof(struct iwl3945_notif_statistics));  		memset(&priv->_3945.delta_statistics, 0, @@ -494,158 +499,6 @@ void iwl3945_reply_statistics(struct iwl_priv *priv,   * Misc. internal state and helper functions   *   ******************************************************************************/ -#ifdef CONFIG_IWLWIFI_DEBUG - -/** - * iwl3945_report_frame - dump frame to syslog during debug sessions - * - * You may hack this function to show different aspects of received frames, - * including selective frame dumps. - * group100 parameter selects whether to show 1 out of 100 good frames. - */ -static void _iwl3945_dbg_report_frame(struct iwl_priv *priv, -		      struct iwl_rx_packet *pkt, -		      struct ieee80211_hdr *header, int group100) -{ -	u32 to_us; -	u32 print_summary = 0; -	u32 print_dump = 0;	/* set to 1 to dump all frames' contents */ -	u32 hundred = 0; -	u32 dataframe = 0; -	__le16 fc; -	u16 seq_ctl; -	u16 channel; -	u16 phy_flags; -	u16 length; -	u16 status; -	u16 bcn_tmr; -	u32 tsf_low; -	u64 tsf; -	u8 rssi; -	u8 agc; -	u16 sig_avg; -	u16 noise_diff; -	struct iwl3945_rx_frame_stats *rx_stats = IWL_RX_STATS(pkt); -	struct iwl3945_rx_frame_hdr *rx_hdr = IWL_RX_HDR(pkt); -	struct iwl3945_rx_frame_end *rx_end = IWL_RX_END(pkt); -	u8 *data = IWL_RX_DATA(pkt); - -	/* MAC header */ -	fc = header->frame_control; -	seq_ctl = le16_to_cpu(header->seq_ctrl); - -	/* metadata */ -	channel = le16_to_cpu(rx_hdr->channel); -	phy_flags = le16_to_cpu(rx_hdr->phy_flags); -	length = le16_to_cpu(rx_hdr->len); - -	/* end-of-frame status and timestamp */ -	status = le32_to_cpu(rx_end->status); -	bcn_tmr = le32_to_cpu(rx_end->beacon_timestamp); -	tsf_low = le64_to_cpu(rx_end->timestamp) & 0x0ffffffff; -	tsf = le64_to_cpu(rx_end->timestamp); - -	/* signal statistics */ -	rssi = rx_stats->rssi; -	agc = rx_stats->agc; -	sig_avg = le16_to_cpu(rx_stats->sig_avg); -	noise_diff = le16_to_cpu(rx_stats->noise_diff); - -	to_us = !compare_ether_addr(header->addr1, priv->mac_addr); - -	/* if data frame is to us and all is good, -	 *   (optionally) print summary for only 1 out of every 100 */ -	if (to_us && (fc & ~cpu_to_le16(IEEE80211_FCTL_PROTECTED)) == -	    cpu_to_le16(IEEE80211_FCTL_FROMDS | IEEE80211_FTYPE_DATA)) { -		dataframe = 1; -		if (!group100) -			print_summary = 1;	/* print each frame */ -		else if (priv->framecnt_to_us < 100) { -			priv->framecnt_to_us++; -			print_summary = 0; -		} else { -			priv->framecnt_to_us = 0; -			print_summary = 1; -			hundred = 1; -		} -	} else { -		/* print summary for all other frames */ -		print_summary = 1; -	} - -	if (print_summary) { -		char *title; -		int rate; - -		if (hundred) -			title = "100Frames"; -		else if (ieee80211_has_retry(fc)) -			title = "Retry"; -		else if (ieee80211_is_assoc_resp(fc)) -			title = "AscRsp"; -		else if (ieee80211_is_reassoc_resp(fc)) -			title = "RasRsp"; -		else if (ieee80211_is_probe_resp(fc)) { -			title = "PrbRsp"; -			print_dump = 1;	/* dump frame contents */ -		} else if (ieee80211_is_beacon(fc)) { -			title = "Beacon"; -			print_dump = 1;	/* dump frame contents */ -		} else if (ieee80211_is_atim(fc)) -			title = "ATIM"; -		else if (ieee80211_is_auth(fc)) -			title = "Auth"; -		else if (ieee80211_is_deauth(fc)) -			title = "DeAuth"; -		else if (ieee80211_is_disassoc(fc)) -			title = "DisAssoc"; -		else -			title = "Frame"; - -		rate = iwl3945_hwrate_to_plcp_idx(rx_hdr->rate); -		if (rate == -1) -			rate = 0; -		else -			rate = iwl3945_rates[rate].ieee / 2; - -		/* print frame summary. -		 * MAC addresses show just the last byte (for brevity), -		 *    but you can hack it to show more, if you'd like to. */ -		if (dataframe) -			IWL_DEBUG_RX(priv, "%s: mhd=0x%04x, dst=0x%02x, " -				     "len=%u, rssi=%d, chnl=%d, rate=%d,\n", -				     title, le16_to_cpu(fc), header->addr1[5], -				     length, rssi, channel, rate); -		else { -			/* src/dst addresses assume managed mode */ -			IWL_DEBUG_RX(priv, "%s: 0x%04x, dst=0x%02x, " -				     "src=0x%02x, rssi=%u, tim=%lu usec, " -				     "phy=0x%02x, chnl=%d\n", -				     title, le16_to_cpu(fc), header->addr1[5], -				     header->addr3[5], rssi, -				     tsf_low - priv->scan_start_tsf, -				     phy_flags, channel); -		} -	} -	if (print_dump) -		iwl_print_hex_dump(priv, IWL_DL_RX, data, length); -} - -static void iwl3945_dbg_report_frame(struct iwl_priv *priv, -		      struct iwl_rx_packet *pkt, -		      struct ieee80211_hdr *header, int group100) -{ -	if (iwl_get_debug_level(priv) & IWL_DL_RX) -		_iwl3945_dbg_report_frame(priv, pkt, header, group100); -} - -#else -static inline void iwl3945_dbg_report_frame(struct iwl_priv *priv, -		      struct iwl_rx_packet *pkt, -		      struct ieee80211_hdr *header, int group100) -{ -} -#endif  /* This is necessary only for a number of statistics, see the caller. */  static int iwl3945_is_network_packet(struct iwl_priv *priv, @@ -777,8 +630,6 @@ static void iwl3945_rx_reply_rx(struct iwl_priv *priv,  			      rx_status.signal, rx_status.signal,  			      rx_status.rate_idx); -	/* Set "1" to report good data frames in groups of 100 */ -	iwl3945_dbg_report_frame(priv, pkt, header, 1);  	iwl_dbg_log_rx_data_frame(priv, le16_to_cpu(rx_hdr->len), header);  	if (network_packet) { @@ -850,25 +701,28 @@ void iwl3945_hw_txq_free_tfd(struct iwl_priv *priv, struct iwl_tx_queue *txq)  	/* Unmap tx_cmd */  	if (counter)  		pci_unmap_single(dev, -				pci_unmap_addr(&txq->meta[index], mapping), -				pci_unmap_len(&txq->meta[index], len), +				dma_unmap_addr(&txq->meta[index], mapping), +				dma_unmap_len(&txq->meta[index], len),  				PCI_DMA_TODEVICE);  	/* unmap chunks if any */ -	for (i = 1; i < counter; i++) { +	for (i = 1; i < counter; i++)  		pci_unmap_single(dev, le32_to_cpu(tfd->tbs[i].addr),  			 le32_to_cpu(tfd->tbs[i].len), PCI_DMA_TODEVICE); -		if (txq->txb[txq->q.read_ptr].skb[0]) { -			struct sk_buff *skb = txq->txb[txq->q.read_ptr].skb[0]; -			if (txq->txb[txq->q.read_ptr].skb[0]) { -				/* Can be called from interrupt context */ -				dev_kfree_skb_any(skb); -				txq->txb[txq->q.read_ptr].skb[0] = NULL; -			} + +	/* free SKB */ +	if (txq->txb) { +		struct sk_buff *skb; + +		skb = txq->txb[txq->q.read_ptr].skb; + +		/* can be called from irqs-disabled context */ +		if (skb) { +			dev_kfree_skb_any(skb); +			txq->txb[txq->q.read_ptr].skb = NULL;  		}  	} -	return ;  }  /** @@ -947,8 +801,7 @@ void iwl3945_hw_build_tx_cmd_rate(struct iwl_priv *priv,  		       tx_cmd->supp_rates[1], tx_cmd->supp_rates[0]);  } -static u8 iwl3945_sync_sta(struct iwl_priv *priv, int sta_id, -			   u16 tx_rate, u8 flags) +static u8 iwl3945_sync_sta(struct iwl_priv *priv, int sta_id, u16 tx_rate)  {  	unsigned long flags_spin;  	struct iwl_station_entry *station; @@ -962,10 +815,9 @@ static u8 iwl3945_sync_sta(struct iwl_priv *priv, int sta_id,  	station->sta.sta.modify_mask = STA_MODIFY_TX_RATE_MSK;  	station->sta.rate_n_flags = cpu_to_le16(tx_rate);  	station->sta.mode = STA_CONTROL_MODIFY_MSK; - +	iwl_send_add_sta(priv, &station->sta, CMD_ASYNC);  	spin_unlock_irqrestore(&priv->sta_lock, flags_spin); -	iwl_send_add_sta(priv, &station->sta, flags);  	IWL_DEBUG_RATE(priv, "SCALE sync station %d to rate %d\n",  			sta_id, tx_rate);  	return sta_id; @@ -997,7 +849,7 @@ static int iwl3945_set_pwr_src(struct iwl_priv *priv, enum iwl_pwr_src src)  static int iwl3945_rx_init(struct iwl_priv *priv, struct iwl_rx_queue *rxq)  { -	iwl_write_direct32(priv, FH39_RCSR_RBD_BASE(0), rxq->dma_addr); +	iwl_write_direct32(priv, FH39_RCSR_RBD_BASE(0), rxq->bd_dma);  	iwl_write_direct32(priv, FH39_RCSR_RPTR_ADDR(0), rxq->rb_stts_dma);  	iwl_write_direct32(priv, FH39_RCSR_WPTR(0), 0);  	iwl_write_direct32(priv, FH39_RCSR_CONFIG(0), @@ -2473,8 +2325,7 @@ static int iwl3945_manage_ibss_station(struct iwl_priv *priv,  		iwl3945_sync_sta(priv, vif_priv->ibss_bssid_sta_id,  				 (priv->band == IEEE80211_BAND_5GHZ) ? -				 IWL_RATE_6M_PLCP : IWL_RATE_1M_PLCP, -				 CMD_ASYNC); +				 IWL_RATE_6M_PLCP : IWL_RATE_1M_PLCP);  		iwl3945_rate_scale_init(priv->hw, vif_priv->ibss_bssid_sta_id);  		return 0; @@ -2590,6 +2441,7 @@ int iwl3945_hw_set_hw_params(struct iwl_priv *priv)  	priv->hw_params.rx_wrt_ptr_reg = FH39_RSCSR_CHNL0_WPTR;  	priv->hw_params.max_beacon_itrvl = IWL39_MAX_UCODE_BEACON_INTERVAL; +	priv->hw_params.beacon_time_tsf_bits = IWL3945_EXT_BEACON_TIME_POS;  	return 0;  }  |