diff options
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl-3945.c')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-3945.c | 131 |
1 files changed, 67 insertions, 64 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945.c b/drivers/net/wireless/iwlwifi/iwl-3945.c index 55ac850744b3..c2a76785b665 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945.c +++ b/drivers/net/wireless/iwlwifi/iwl-3945.c | |||
@@ -283,8 +283,7 @@ static void iwl3945_tx_queue_reclaim(struct iwl3945_priv *priv, | |||
283 | q->read_ptr = iwl_queue_inc_wrap(q->read_ptr, q->n_bd)) { | 283 | q->read_ptr = iwl_queue_inc_wrap(q->read_ptr, q->n_bd)) { |
284 | 284 | ||
285 | tx_info = &txq->txb[txq->q.read_ptr]; | 285 | tx_info = &txq->txb[txq->q.read_ptr]; |
286 | ieee80211_tx_status_irqsafe(priv->hw, tx_info->skb[0], | 286 | ieee80211_tx_status_irqsafe(priv->hw, tx_info->skb[0]); |
287 | &tx_info->status); | ||
288 | tx_info->skb[0] = NULL; | 287 | tx_info->skb[0] = NULL; |
289 | iwl3945_hw_txq_free_tfd(priv, txq); | 288 | iwl3945_hw_txq_free_tfd(priv, txq); |
290 | } | 289 | } |
@@ -306,7 +305,7 @@ static void iwl3945_rx_reply_tx(struct iwl3945_priv *priv, | |||
306 | int txq_id = SEQ_TO_QUEUE(sequence); | 305 | int txq_id = SEQ_TO_QUEUE(sequence); |
307 | int index = SEQ_TO_INDEX(sequence); | 306 | int index = SEQ_TO_INDEX(sequence); |
308 | struct iwl3945_tx_queue *txq = &priv->txq[txq_id]; | 307 | struct iwl3945_tx_queue *txq = &priv->txq[txq_id]; |
309 | struct ieee80211_tx_status *tx_status; | 308 | struct ieee80211_tx_info *info; |
310 | struct iwl3945_tx_resp *tx_resp = (void *)&pkt->u.raw[0]; | 309 | struct iwl3945_tx_resp *tx_resp = (void *)&pkt->u.raw[0]; |
311 | u32 status = le32_to_cpu(tx_resp->status); | 310 | u32 status = le32_to_cpu(tx_resp->status); |
312 | int rate_idx; | 311 | int rate_idx; |
@@ -319,19 +318,22 @@ static void iwl3945_rx_reply_tx(struct iwl3945_priv *priv, | |||
319 | return; | 318 | return; |
320 | } | 319 | } |
321 | 320 | ||
322 | tx_status = &(txq->txb[txq->q.read_ptr].status); | 321 | info = IEEE80211_SKB_CB(txq->txb[txq->q.read_ptr].skb[0]); |
322 | memset(&info->status, 0, sizeof(info->status)); | ||
323 | 323 | ||
324 | tx_status->retry_count = tx_resp->failure_frame; | 324 | info->status.retry_count = tx_resp->failure_frame; |
325 | /* tx_status->rts_retry_count = tx_resp->failure_rts; */ | 325 | /* tx_status->rts_retry_count = tx_resp->failure_rts; */ |
326 | tx_status->flags = ((status & TX_STATUS_MSK) == TX_STATUS_SUCCESS) ? | 326 | info->flags |= ((status & TX_STATUS_MSK) == TX_STATUS_SUCCESS) ? |
327 | IEEE80211_TX_STATUS_ACK : 0; | 327 | IEEE80211_TX_STAT_ACK : 0; |
328 | 328 | ||
329 | IWL_DEBUG_TX("Tx queue %d Status %s (0x%08x) plcp rate %d retries %d\n", | 329 | IWL_DEBUG_TX("Tx queue %d Status %s (0x%08x) plcp rate %d retries %d\n", |
330 | txq_id, iwl3945_get_tx_fail_reason(status), status, | 330 | txq_id, iwl3945_get_tx_fail_reason(status), status, |
331 | tx_resp->rate, tx_resp->failure_frame); | 331 | tx_resp->rate, tx_resp->failure_frame); |
332 | 332 | ||
333 | rate_idx = iwl3945_hwrate_to_plcp_idx(tx_resp->rate); | 333 | rate_idx = iwl3945_hwrate_to_plcp_idx(tx_resp->rate); |
334 | tx_status->control.tx_rate = &priv->ieee_rates[rate_idx]; | 334 | if (info->band == IEEE80211_BAND_5GHZ) |
335 | rate_idx -= IWL_FIRST_OFDM_RATE; | ||
336 | info->tx_rate_idx = rate_idx; | ||
335 | IWL_DEBUG_TX_REPLY("Tx queue reclaim %d\n", index); | 337 | IWL_DEBUG_TX_REPLY("Tx queue reclaim %d\n", index); |
336 | iwl3945_tx_queue_reclaim(priv, txq_id, index); | 338 | iwl3945_tx_queue_reclaim(priv, txq_id, index); |
337 | 339 | ||
@@ -386,7 +388,7 @@ static void iwl3945_dbg_report_frame(struct iwl3945_priv *priv, | |||
386 | u32 print_dump = 0; /* set to 1 to dump all frames' contents */ | 388 | u32 print_dump = 0; /* set to 1 to dump all frames' contents */ |
387 | u32 hundred = 0; | 389 | u32 hundred = 0; |
388 | u32 dataframe = 0; | 390 | u32 dataframe = 0; |
389 | u16 fc; | 391 | __le16 fc; |
390 | u16 seq_ctl; | 392 | u16 seq_ctl; |
391 | u16 channel; | 393 | u16 channel; |
392 | u16 phy_flags; | 394 | u16 phy_flags; |
@@ -405,7 +407,7 @@ static void iwl3945_dbg_report_frame(struct iwl3945_priv *priv, | |||
405 | u8 *data = IWL_RX_DATA(pkt); | 407 | u8 *data = IWL_RX_DATA(pkt); |
406 | 408 | ||
407 | /* MAC header */ | 409 | /* MAC header */ |
408 | fc = le16_to_cpu(header->frame_control); | 410 | fc = header->frame_control; |
409 | seq_ctl = le16_to_cpu(header->seq_ctrl); | 411 | seq_ctl = le16_to_cpu(header->seq_ctrl); |
410 | 412 | ||
411 | /* metadata */ | 413 | /* metadata */ |
@@ -429,8 +431,8 @@ static void iwl3945_dbg_report_frame(struct iwl3945_priv *priv, | |||
429 | 431 | ||
430 | /* if data frame is to us and all is good, | 432 | /* if data frame is to us and all is good, |
431 | * (optionally) print summary for only 1 out of every 100 */ | 433 | * (optionally) print summary for only 1 out of every 100 */ |
432 | if (to_us && (fc & ~IEEE80211_FCTL_PROTECTED) == | 434 | if (to_us && (fc & ~cpu_to_le16(IEEE80211_FCTL_PROTECTED)) == |
433 | (IEEE80211_FCTL_FROMDS | IEEE80211_FTYPE_DATA)) { | 435 | cpu_to_le16(IEEE80211_FCTL_FROMDS | IEEE80211_FTYPE_DATA)) { |
434 | dataframe = 1; | 436 | dataframe = 1; |
435 | if (!group100) | 437 | if (!group100) |
436 | print_summary = 1; /* print each frame */ | 438 | print_summary = 1; /* print each frame */ |
@@ -453,13 +455,13 @@ static void iwl3945_dbg_report_frame(struct iwl3945_priv *priv, | |||
453 | 455 | ||
454 | if (hundred) | 456 | if (hundred) |
455 | title = "100Frames"; | 457 | title = "100Frames"; |
456 | else if (fc & IEEE80211_FCTL_RETRY) | 458 | else if (ieee80211_has_retry(fc)) |
457 | title = "Retry"; | 459 | title = "Retry"; |
458 | else if (ieee80211_is_assoc_response(fc)) | 460 | else if (ieee80211_is_assoc_resp(fc)) |
459 | title = "AscRsp"; | 461 | title = "AscRsp"; |
460 | else if (ieee80211_is_reassoc_response(fc)) | 462 | else if (ieee80211_is_reassoc_resp(fc)) |
461 | title = "RasRsp"; | 463 | title = "RasRsp"; |
462 | else if (ieee80211_is_probe_response(fc)) { | 464 | else if (ieee80211_is_probe_resp(fc)) { |
463 | title = "PrbRsp"; | 465 | title = "PrbRsp"; |
464 | print_dump = 1; /* dump frame contents */ | 466 | print_dump = 1; /* dump frame contents */ |
465 | } else if (ieee80211_is_beacon(fc)) { | 467 | } else if (ieee80211_is_beacon(fc)) { |
@@ -488,14 +490,14 @@ static void iwl3945_dbg_report_frame(struct iwl3945_priv *priv, | |||
488 | if (dataframe) | 490 | if (dataframe) |
489 | IWL_DEBUG_RX("%s: mhd=0x%04x, dst=0x%02x, " | 491 | IWL_DEBUG_RX("%s: mhd=0x%04x, dst=0x%02x, " |
490 | "len=%u, rssi=%d, chnl=%d, rate=%d, \n", | 492 | "len=%u, rssi=%d, chnl=%d, rate=%d, \n", |
491 | title, fc, header->addr1[5], | 493 | title, le16_to_cpu(fc), header->addr1[5], |
492 | length, rssi, channel, rate); | 494 | length, rssi, channel, rate); |
493 | else { | 495 | else { |
494 | /* src/dst addresses assume managed mode */ | 496 | /* src/dst addresses assume managed mode */ |
495 | IWL_DEBUG_RX("%s: 0x%04x, dst=0x%02x, " | 497 | IWL_DEBUG_RX("%s: 0x%04x, dst=0x%02x, " |
496 | "src=0x%02x, rssi=%u, tim=%lu usec, " | 498 | "src=0x%02x, rssi=%u, tim=%lu usec, " |
497 | "phy=0x%02x, chnl=%d\n", | 499 | "phy=0x%02x, chnl=%d\n", |
498 | title, fc, header->addr1[5], | 500 | title, le16_to_cpu(fc), header->addr1[5], |
499 | header->addr3[5], rssi, | 501 | header->addr3[5], rssi, |
500 | tsf_low - priv->scan_start_tsf, | 502 | tsf_low - priv->scan_start_tsf, |
501 | phy_flags, channel); | 503 | phy_flags, channel); |
@@ -512,6 +514,23 @@ static inline void iwl3945_dbg_report_frame(struct iwl3945_priv *priv, | |||
512 | } | 514 | } |
513 | #endif | 515 | #endif |
514 | 516 | ||
517 | /* This is necessary only for a number of statistics, see the caller. */ | ||
518 | static int iwl3945_is_network_packet(struct iwl3945_priv *priv, | ||
519 | struct ieee80211_hdr *header) | ||
520 | { | ||
521 | /* Filter incoming packets to determine if they are targeted toward | ||
522 | * this network, discarding packets coming from ourselves */ | ||
523 | switch (priv->iw_mode) { | ||
524 | case IEEE80211_IF_TYPE_IBSS: /* Header: Dest. | Source | BSSID */ | ||
525 | /* packets to our IBSS update information */ | ||
526 | return !compare_ether_addr(header->addr3, priv->bssid); | ||
527 | case IEEE80211_IF_TYPE_STA: /* Header: Dest. | AP{BSSID} | Source */ | ||
528 | /* packets to our IBSS update information */ | ||
529 | return !compare_ether_addr(header->addr2, priv->bssid); | ||
530 | default: | ||
531 | return 1; | ||
532 | } | ||
533 | } | ||
515 | 534 | ||
516 | static void iwl3945_add_radiotap(struct iwl3945_priv *priv, | 535 | static void iwl3945_add_radiotap(struct iwl3945_priv *priv, |
517 | struct sk_buff *skb, | 536 | struct sk_buff *skb, |
@@ -520,7 +539,7 @@ static void iwl3945_add_radiotap(struct iwl3945_priv *priv, | |||
520 | { | 539 | { |
521 | /* First cache any information we need before we overwrite | 540 | /* First cache any information we need before we overwrite |
522 | * the information provided in the skb from the hardware */ | 541 | * the information provided in the skb from the hardware */ |
523 | s8 signal = stats->ssi; | 542 | s8 signal = stats->signal; |
524 | s8 noise = 0; | 543 | s8 noise = 0; |
525 | int rate = stats->rate_idx; | 544 | int rate = stats->rate_idx; |
526 | u64 tsf = stats->mactime; | 545 | u64 tsf = stats->mactime; |
@@ -606,12 +625,12 @@ static void iwl3945_add_radiotap(struct iwl3945_priv *priv, | |||
606 | stats->flag |= RX_FLAG_RADIOTAP; | 625 | stats->flag |= RX_FLAG_RADIOTAP; |
607 | } | 626 | } |
608 | 627 | ||
609 | static void iwl3945_handle_data_packet(struct iwl3945_priv *priv, int is_data, | 628 | static void iwl3945_pass_packet_to_mac80211(struct iwl3945_priv *priv, |
610 | struct iwl3945_rx_mem_buffer *rxb, | 629 | struct iwl3945_rx_mem_buffer *rxb, |
611 | struct ieee80211_rx_status *stats) | 630 | struct ieee80211_rx_status *stats) |
612 | { | 631 | { |
613 | struct ieee80211_hdr *hdr; | ||
614 | struct iwl3945_rx_packet *pkt = (struct iwl3945_rx_packet *)rxb->skb->data; | 632 | struct iwl3945_rx_packet *pkt = (struct iwl3945_rx_packet *)rxb->skb->data; |
633 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)IWL_RX_DATA(pkt); | ||
615 | struct iwl3945_rx_frame_hdr *rx_hdr = IWL_RX_HDR(pkt); | 634 | struct iwl3945_rx_frame_hdr *rx_hdr = IWL_RX_HDR(pkt); |
616 | struct iwl3945_rx_frame_end *rx_end = IWL_RX_END(pkt); | 635 | struct iwl3945_rx_frame_end *rx_end = IWL_RX_END(pkt); |
617 | short len = le16_to_cpu(rx_hdr->len); | 636 | short len = le16_to_cpu(rx_hdr->len); |
@@ -633,8 +652,6 @@ static void iwl3945_handle_data_packet(struct iwl3945_priv *priv, int is_data, | |||
633 | /* Set the size of the skb to the size of the frame */ | 652 | /* Set the size of the skb to the size of the frame */ |
634 | skb_put(rxb->skb, le16_to_cpu(rx_hdr->len)); | 653 | skb_put(rxb->skb, le16_to_cpu(rx_hdr->len)); |
635 | 654 | ||
636 | hdr = (void *)rxb->skb->data; | ||
637 | |||
638 | if (iwl3945_param_hwcrypto) | 655 | if (iwl3945_param_hwcrypto) |
639 | iwl3945_set_decrypted_flag(priv, rxb->skb, | 656 | iwl3945_set_decrypted_flag(priv, rxb->skb, |
640 | le32_to_cpu(rx_end->status), stats); | 657 | le32_to_cpu(rx_end->status), stats); |
@@ -643,7 +660,7 @@ static void iwl3945_handle_data_packet(struct iwl3945_priv *priv, int is_data, | |||
643 | iwl3945_add_radiotap(priv, rxb->skb, rx_hdr, stats); | 660 | iwl3945_add_radiotap(priv, rxb->skb, rx_hdr, stats); |
644 | 661 | ||
645 | #ifdef CONFIG_IWL3945_LEDS | 662 | #ifdef CONFIG_IWL3945_LEDS |
646 | if (is_data) | 663 | if (ieee80211_is_data(hdr->frame_control)) |
647 | priv->rxtxpackets += len; | 664 | priv->rxtxpackets += len; |
648 | #endif | 665 | #endif |
649 | ieee80211_rx_irqsafe(priv->hw, rxb->skb, stats); | 666 | ieee80211_rx_irqsafe(priv->hw, rxb->skb, stats); |
@@ -692,12 +709,12 @@ static void iwl3945_rx_reply_rx(struct iwl3945_priv *priv, | |||
692 | } | 709 | } |
693 | 710 | ||
694 | if (priv->iw_mode == IEEE80211_IF_TYPE_MNTR) { | 711 | if (priv->iw_mode == IEEE80211_IF_TYPE_MNTR) { |
695 | iwl3945_handle_data_packet(priv, 1, rxb, &rx_status); | 712 | iwl3945_pass_packet_to_mac80211(priv, rxb, &rx_status); |
696 | return; | 713 | return; |
697 | } | 714 | } |
698 | 715 | ||
699 | /* Convert 3945's rssi indicator to dBm */ | 716 | /* Convert 3945's rssi indicator to dBm */ |
700 | rx_status.ssi = rx_stats->rssi - IWL_RSSI_OFFSET; | 717 | rx_status.signal = rx_stats->rssi - IWL_RSSI_OFFSET; |
701 | 718 | ||
702 | /* Set default noise value to -127 */ | 719 | /* Set default noise value to -127 */ |
703 | if (priv->last_rx_noise == 0) | 720 | if (priv->last_rx_noise == 0) |
@@ -716,21 +733,21 @@ static void iwl3945_rx_reply_rx(struct iwl3945_priv *priv, | |||
716 | * Calculate rx_status.signal (quality indicator in %) based on SNR. */ | 733 | * Calculate rx_status.signal (quality indicator in %) based on SNR. */ |
717 | if (rx_stats_noise_diff) { | 734 | if (rx_stats_noise_diff) { |
718 | snr = rx_stats_sig_avg / rx_stats_noise_diff; | 735 | snr = rx_stats_sig_avg / rx_stats_noise_diff; |
719 | rx_status.noise = rx_status.ssi - | 736 | rx_status.noise = rx_status.signal - |
720 | iwl3945_calc_db_from_ratio(snr); | 737 | iwl3945_calc_db_from_ratio(snr); |
721 | rx_status.signal = iwl3945_calc_sig_qual(rx_status.ssi, | 738 | rx_status.qual = iwl3945_calc_sig_qual(rx_status.signal, |
722 | rx_status.noise); | 739 | rx_status.noise); |
723 | 740 | ||
724 | /* If noise info not available, calculate signal quality indicator (%) | 741 | /* If noise info not available, calculate signal quality indicator (%) |
725 | * using just the dBm signal level. */ | 742 | * using just the dBm signal level. */ |
726 | } else { | 743 | } else { |
727 | rx_status.noise = priv->last_rx_noise; | 744 | rx_status.noise = priv->last_rx_noise; |
728 | rx_status.signal = iwl3945_calc_sig_qual(rx_status.ssi, 0); | 745 | rx_status.qual = iwl3945_calc_sig_qual(rx_status.signal, 0); |
729 | } | 746 | } |
730 | 747 | ||
731 | 748 | ||
732 | IWL_DEBUG_STATS("Rssi %d noise %d qual %d sig_avg %d noise_diff %d\n", | 749 | IWL_DEBUG_STATS("Rssi %d noise %d qual %d sig_avg %d noise_diff %d\n", |
733 | rx_status.ssi, rx_status.noise, rx_status.signal, | 750 | rx_status.signal, rx_status.noise, rx_status.qual, |
734 | rx_stats_sig_avg, rx_stats_noise_diff); | 751 | rx_stats_sig_avg, rx_stats_noise_diff); |
735 | 752 | ||
736 | header = (struct ieee80211_hdr *)IWL_RX_DATA(pkt); | 753 | header = (struct ieee80211_hdr *)IWL_RX_DATA(pkt); |
@@ -740,8 +757,8 @@ static void iwl3945_rx_reply_rx(struct iwl3945_priv *priv, | |||
740 | IWL_DEBUG_STATS_LIMIT("[%c] %d RSSI:%d Signal:%u, Noise:%u, Rate:%u\n", | 757 | IWL_DEBUG_STATS_LIMIT("[%c] %d RSSI:%d Signal:%u, Noise:%u, Rate:%u\n", |
741 | network_packet ? '*' : ' ', | 758 | network_packet ? '*' : ' ', |
742 | le16_to_cpu(rx_hdr->channel), | 759 | le16_to_cpu(rx_hdr->channel), |
743 | rx_status.ssi, rx_status.ssi, | 760 | rx_status.signal, rx_status.signal, |
744 | rx_status.ssi, rx_status.rate_idx); | 761 | rx_status.noise, rx_status.rate_idx); |
745 | 762 | ||
746 | #ifdef CONFIG_IWL3945_DEBUG | 763 | #ifdef CONFIG_IWL3945_DEBUG |
747 | if (iwl3945_debug_level & (IWL_DL_RX)) | 764 | if (iwl3945_debug_level & (IWL_DL_RX)) |
@@ -752,7 +769,7 @@ static void iwl3945_rx_reply_rx(struct iwl3945_priv *priv, | |||
752 | if (network_packet) { | 769 | if (network_packet) { |
753 | priv->last_beacon_time = le32_to_cpu(rx_end->beacon_timestamp); | 770 | priv->last_beacon_time = le32_to_cpu(rx_end->beacon_timestamp); |
754 | priv->last_tsf = le64_to_cpu(rx_end->timestamp); | 771 | priv->last_tsf = le64_to_cpu(rx_end->timestamp); |
755 | priv->last_rx_rssi = rx_status.ssi; | 772 | priv->last_rx_rssi = rx_status.signal; |
756 | priv->last_rx_noise = rx_status.noise; | 773 | priv->last_rx_noise = rx_status.noise; |
757 | } | 774 | } |
758 | 775 | ||
@@ -840,27 +857,12 @@ static void iwl3945_rx_reply_rx(struct iwl3945_priv *priv, | |||
840 | } | 857 | } |
841 | } | 858 | } |
842 | 859 | ||
843 | iwl3945_handle_data_packet(priv, 0, rxb, &rx_status); | 860 | case IEEE80211_FTYPE_DATA: |
844 | break; | 861 | /* fall through */ |
845 | 862 | default: | |
846 | case IEEE80211_FTYPE_CTL: | 863 | iwl3945_pass_packet_to_mac80211(priv, rxb, &rx_status); |
847 | break; | ||
848 | |||
849 | case IEEE80211_FTYPE_DATA: { | ||
850 | DECLARE_MAC_BUF(mac1); | ||
851 | DECLARE_MAC_BUF(mac2); | ||
852 | DECLARE_MAC_BUF(mac3); | ||
853 | |||
854 | if (unlikely(iwl3945_is_duplicate_packet(priv, header))) | ||
855 | IWL_DEBUG_DROP("Dropping (dup): %s, %s, %s\n", | ||
856 | print_mac(mac1, header->addr1), | ||
857 | print_mac(mac2, header->addr2), | ||
858 | print_mac(mac3, header->addr3)); | ||
859 | else | ||
860 | iwl3945_handle_data_packet(priv, 1, rxb, &rx_status); | ||
861 | break; | 864 | break; |
862 | } | 865 | } |
863 | } | ||
864 | } | 866 | } |
865 | 867 | ||
866 | int iwl3945_hw_txq_attach_buf_to_tfd(struct iwl3945_priv *priv, void *ptr, | 868 | int iwl3945_hw_txq_attach_buf_to_tfd(struct iwl3945_priv *priv, void *ptr, |
@@ -962,23 +964,24 @@ u8 iwl3945_hw_find_station(struct iwl3945_priv *priv, const u8 *addr) | |||
962 | */ | 964 | */ |
963 | void iwl3945_hw_build_tx_cmd_rate(struct iwl3945_priv *priv, | 965 | void iwl3945_hw_build_tx_cmd_rate(struct iwl3945_priv *priv, |
964 | struct iwl3945_cmd *cmd, | 966 | struct iwl3945_cmd *cmd, |
965 | struct ieee80211_tx_control *ctrl, | 967 | struct ieee80211_tx_info *info, |
966 | struct ieee80211_hdr *hdr, int sta_id, int tx_id) | 968 | struct ieee80211_hdr *hdr, int sta_id, int tx_id) |
967 | { | 969 | { |
968 | unsigned long flags; | 970 | unsigned long flags; |
969 | u16 rate_index = min(ctrl->tx_rate->hw_value & 0xffff, IWL_RATE_COUNT - 1); | 971 | u16 hw_value = ieee80211_get_tx_rate(priv->hw, info)->hw_value; |
972 | u16 rate_index = min(hw_value & 0xffff, IWL_RATE_COUNT - 1); | ||
970 | u16 rate_mask; | 973 | u16 rate_mask; |
971 | int rate; | 974 | int rate; |
972 | u8 rts_retry_limit; | 975 | u8 rts_retry_limit; |
973 | u8 data_retry_limit; | 976 | u8 data_retry_limit; |
974 | __le32 tx_flags; | 977 | __le32 tx_flags; |
975 | u16 fc = le16_to_cpu(hdr->frame_control); | 978 | __le16 fc = hdr->frame_control; |
976 | 979 | ||
977 | rate = iwl3945_rates[rate_index].plcp; | 980 | rate = iwl3945_rates[rate_index].plcp; |
978 | tx_flags = cmd->cmd.tx.tx_flags; | 981 | tx_flags = cmd->cmd.tx.tx_flags; |
979 | 982 | ||
980 | /* We need to figure out how to get the sta->supp_rates while | 983 | /* We need to figure out how to get the sta->supp_rates while |
981 | * in this running context; perhaps encoding into ctrl->tx_rate? */ | 984 | * in this running context */ |
982 | rate_mask = IWL_RATES_MASK; | 985 | rate_mask = IWL_RATES_MASK; |
983 | 986 | ||
984 | spin_lock_irqsave(&priv->sta_lock, flags); | 987 | spin_lock_irqsave(&priv->sta_lock, flags); |
@@ -997,7 +1000,7 @@ void iwl3945_hw_build_tx_cmd_rate(struct iwl3945_priv *priv, | |||
997 | else | 1000 | else |
998 | rts_retry_limit = 7; | 1001 | rts_retry_limit = 7; |
999 | 1002 | ||
1000 | if (ieee80211_is_probe_response(fc)) { | 1003 | if (ieee80211_is_probe_resp(fc)) { |
1001 | data_retry_limit = 3; | 1004 | data_retry_limit = 3; |
1002 | if (data_retry_limit < rts_retry_limit) | 1005 | if (data_retry_limit < rts_retry_limit) |
1003 | rts_retry_limit = data_retry_limit; | 1006 | rts_retry_limit = data_retry_limit; |
@@ -1007,12 +1010,12 @@ void iwl3945_hw_build_tx_cmd_rate(struct iwl3945_priv *priv, | |||
1007 | if (priv->data_retry_limit != -1) | 1010 | if (priv->data_retry_limit != -1) |
1008 | data_retry_limit = priv->data_retry_limit; | 1011 | data_retry_limit = priv->data_retry_limit; |
1009 | 1012 | ||
1010 | if ((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_MGMT) { | 1013 | if (ieee80211_is_mgmt(fc)) { |
1011 | switch (fc & IEEE80211_FCTL_STYPE) { | 1014 | switch (fc & cpu_to_le16(IEEE80211_FCTL_STYPE)) { |
1012 | case IEEE80211_STYPE_AUTH: | 1015 | case cpu_to_le16(IEEE80211_STYPE_AUTH): |
1013 | case IEEE80211_STYPE_DEAUTH: | 1016 | case cpu_to_le16(IEEE80211_STYPE_DEAUTH): |
1014 | case IEEE80211_STYPE_ASSOC_REQ: | 1017 | case cpu_to_le16(IEEE80211_STYPE_ASSOC_REQ): |
1015 | case IEEE80211_STYPE_REASSOC_REQ: | 1018 | case cpu_to_le16(IEEE80211_STYPE_REASSOC_REQ): |
1016 | if (tx_flags & TX_CMD_FLG_RTS_MSK) { | 1019 | if (tx_flags & TX_CMD_FLG_RTS_MSK) { |
1017 | tx_flags &= ~TX_CMD_FLG_RTS_MSK; | 1020 | tx_flags &= ~TX_CMD_FLG_RTS_MSK; |
1018 | tx_flags |= TX_CMD_FLG_CTS_MSK; | 1021 | tx_flags |= TX_CMD_FLG_CTS_MSK; |
@@ -1233,7 +1236,7 @@ int iwl3945_hw_nic_init(struct iwl3945_priv *priv) | |||
1233 | iwl3945_power_init_handle(priv); | 1236 | iwl3945_power_init_handle(priv); |
1234 | 1237 | ||
1235 | spin_lock_irqsave(&priv->lock, flags); | 1238 | spin_lock_irqsave(&priv->lock, flags); |
1236 | iwl3945_set_bit(priv, CSR_ANA_PLL_CFG, (1 << 24)); | 1239 | iwl3945_set_bit(priv, CSR_ANA_PLL_CFG, CSR39_ANA_PLL_CFG_VAL); |
1237 | iwl3945_set_bit(priv, CSR_GIO_CHICKEN_BITS, | 1240 | iwl3945_set_bit(priv, CSR_GIO_CHICKEN_BITS, |
1238 | CSR_GIO_CHICKEN_BITS_REG_BIT_L1A_NO_L0S_RX); | 1241 | CSR_GIO_CHICKEN_BITS_REG_BIT_L1A_NO_L0S_RX); |
1239 | 1242 | ||