diff options
| author | John W. Linville <linville@tuxdriver.com> | 2010-04-23 14:43:45 -0400 |
|---|---|---|
| committer | John W. Linville <linville@tuxdriver.com> | 2010-04-23 14:43:45 -0400 |
| commit | 3b51cc996e81d8a113416d8094fa4a88f8360a51 (patch) | |
| tree | e75b98b228bb4e456c30673fcc4b56ffa1d09cf5 /drivers/net/wireless/iwlwifi/iwl3945-base.c | |
| parent | c68ed255265968c3948fa2678bf59d15c471b055 (diff) | |
| parent | 672724403b42da1d276c6cf811e8e34d15efd964 (diff) | |
Merge branch 'master' into for-davem
Conflicts:
drivers/net/wireless/ath/ath9k/phy.c
drivers/net/wireless/iwlwifi/iwl-6000.c
drivers/net/wireless/iwlwifi/iwl-debugfs.c
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl3945-base.c')
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl3945-base.c | 87 |
1 files changed, 15 insertions, 72 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c index 9f362024a29c..a41ba72ceb00 100644 --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c | |||
| @@ -2527,7 +2527,7 @@ static void iwl3945_alive_start(struct iwl_priv *priv) | |||
| 2527 | } | 2527 | } |
| 2528 | 2528 | ||
| 2529 | /* Configure Bluetooth device coexistence support */ | 2529 | /* Configure Bluetooth device coexistence support */ |
| 2530 | iwl_send_bt_config(priv); | 2530 | priv->cfg->ops->hcmd->send_bt_config(priv); |
| 2531 | 2531 | ||
| 2532 | /* Configure the adapter for unassociated operation */ | 2532 | /* Configure the adapter for unassociated operation */ |
| 2533 | iwlcore_commit_rxon(priv); | 2533 | iwlcore_commit_rxon(priv); |
| @@ -2791,11 +2791,8 @@ static void iwl3945_rfkill_poll(struct work_struct *data) | |||
| 2791 | 2791 | ||
| 2792 | } | 2792 | } |
| 2793 | 2793 | ||
| 2794 | #define IWL_SCAN_CHECK_WATCHDOG (7 * HZ) | 2794 | void iwl3945_request_scan(struct iwl_priv *priv) |
| 2795 | static void iwl3945_bg_request_scan(struct work_struct *data) | ||
| 2796 | { | 2795 | { |
| 2797 | struct iwl_priv *priv = | ||
| 2798 | container_of(data, struct iwl_priv, request_scan); | ||
| 2799 | struct iwl_host_cmd cmd = { | 2796 | struct iwl_host_cmd cmd = { |
| 2800 | .id = REPLY_SCAN_CMD, | 2797 | .id = REPLY_SCAN_CMD, |
| 2801 | .len = sizeof(struct iwl3945_scan_cmd), | 2798 | .len = sizeof(struct iwl3945_scan_cmd), |
| @@ -2809,8 +2806,6 @@ static void iwl3945_bg_request_scan(struct work_struct *data) | |||
| 2809 | 2806 | ||
| 2810 | conf = ieee80211_get_hw_conf(priv->hw); | 2807 | conf = ieee80211_get_hw_conf(priv->hw); |
| 2811 | 2808 | ||
| 2812 | mutex_lock(&priv->mutex); | ||
| 2813 | |||
| 2814 | cancel_delayed_work(&priv->scan_check); | 2809 | cancel_delayed_work(&priv->scan_check); |
| 2815 | 2810 | ||
| 2816 | if (!iwl_is_ready(priv)) { | 2811 | if (!iwl_is_ready(priv)) { |
| @@ -2853,20 +2848,15 @@ static void iwl3945_bg_request_scan(struct work_struct *data) | |||
| 2853 | goto done; | 2848 | goto done; |
| 2854 | } | 2849 | } |
| 2855 | 2850 | ||
| 2856 | if (!priv->scan_bands) { | 2851 | if (!priv->scan_cmd) { |
| 2857 | IWL_DEBUG_HC(priv, "Aborting scan due to no requested bands\n"); | 2852 | priv->scan_cmd = kmalloc(sizeof(struct iwl3945_scan_cmd) + |
| 2858 | goto done; | 2853 | IWL_MAX_SCAN_SIZE, GFP_KERNEL); |
| 2859 | } | 2854 | if (!priv->scan_cmd) { |
| 2860 | |||
| 2861 | if (!priv->scan) { | ||
| 2862 | priv->scan = kmalloc(sizeof(struct iwl3945_scan_cmd) + | ||
| 2863 | IWL_MAX_SCAN_SIZE, GFP_KERNEL); | ||
| 2864 | if (!priv->scan) { | ||
| 2865 | IWL_DEBUG_SCAN(priv, "Fail to allocate scan memory\n"); | 2855 | IWL_DEBUG_SCAN(priv, "Fail to allocate scan memory\n"); |
| 2866 | goto done; | 2856 | goto done; |
| 2867 | } | 2857 | } |
| 2868 | } | 2858 | } |
| 2869 | scan = priv->scan; | 2859 | scan = priv->scan_cmd; |
| 2870 | memset(scan, 0, sizeof(struct iwl3945_scan_cmd) + IWL_MAX_SCAN_SIZE); | 2860 | memset(scan, 0, sizeof(struct iwl3945_scan_cmd) + IWL_MAX_SCAN_SIZE); |
| 2871 | 2861 | ||
| 2872 | scan->quiet_plcp_th = IWL_PLCP_QUIET_THRESH; | 2862 | scan->quiet_plcp_th = IWL_PLCP_QUIET_THRESH; |
| @@ -2935,12 +2925,14 @@ static void iwl3945_bg_request_scan(struct work_struct *data) | |||
| 2935 | 2925 | ||
| 2936 | /* flags + rate selection */ | 2926 | /* flags + rate selection */ |
| 2937 | 2927 | ||
| 2938 | if (priv->scan_bands & BIT(IEEE80211_BAND_2GHZ)) { | 2928 | switch (priv->scan_band) { |
| 2929 | case IEEE80211_BAND_2GHZ: | ||
| 2939 | scan->flags = RXON_FLG_BAND_24G_MSK | RXON_FLG_AUTO_DETECT_MSK; | 2930 | scan->flags = RXON_FLG_BAND_24G_MSK | RXON_FLG_AUTO_DETECT_MSK; |
| 2940 | scan->tx_cmd.rate = IWL_RATE_1M_PLCP; | 2931 | scan->tx_cmd.rate = IWL_RATE_1M_PLCP; |
| 2941 | scan->good_CRC_th = 0; | 2932 | scan->good_CRC_th = 0; |
| 2942 | band = IEEE80211_BAND_2GHZ; | 2933 | band = IEEE80211_BAND_2GHZ; |
| 2943 | } else if (priv->scan_bands & BIT(IEEE80211_BAND_5GHZ)) { | 2934 | break; |
| 2935 | case IEEE80211_BAND_5GHZ: | ||
| 2944 | scan->tx_cmd.rate = IWL_RATE_6M_PLCP; | 2936 | scan->tx_cmd.rate = IWL_RATE_6M_PLCP; |
| 2945 | /* | 2937 | /* |
| 2946 | * If active scaning is requested but a certain channel | 2938 | * If active scaning is requested but a certain channel |
| @@ -2949,8 +2941,9 @@ static void iwl3945_bg_request_scan(struct work_struct *data) | |||
| 2949 | */ | 2941 | */ |
| 2950 | scan->good_CRC_th = is_active ? IWL_GOOD_CRC_TH : 0; | 2942 | scan->good_CRC_th = is_active ? IWL_GOOD_CRC_TH : 0; |
| 2951 | band = IEEE80211_BAND_5GHZ; | 2943 | band = IEEE80211_BAND_5GHZ; |
| 2952 | } else { | 2944 | break; |
| 2953 | IWL_WARN(priv, "Invalid scan band count\n"); | 2945 | default: |
| 2946 | IWL_WARN(priv, "Invalid scan band\n"); | ||
| 2954 | goto done; | 2947 | goto done; |
| 2955 | } | 2948 | } |
| 2956 | 2949 | ||
| @@ -2971,9 +2964,6 @@ static void iwl3945_bg_request_scan(struct work_struct *data) | |||
| 2971 | /* select Rx antennas */ | 2964 | /* select Rx antennas */ |
| 2972 | scan->flags |= iwl3945_get_antenna_flags(priv); | 2965 | scan->flags |= iwl3945_get_antenna_flags(priv); |
| 2973 | 2966 | ||
| 2974 | if (iwl_is_monitor_mode(priv)) | ||
| 2975 | scan->filter_flags = RXON_FILTER_PROMISC_MSK; | ||
| 2976 | |||
| 2977 | scan->channel_count = | 2967 | scan->channel_count = |
| 2978 | iwl3945_get_channels_for_scan(priv, band, is_active, n_probes, | 2968 | iwl3945_get_channels_for_scan(priv, band, is_active, n_probes, |
| 2979 | (void *)&scan->data[le16_to_cpu(scan->tx_cmd.len)]); | 2969 | (void *)&scan->data[le16_to_cpu(scan->tx_cmd.len)]); |
| @@ -2995,7 +2985,6 @@ static void iwl3945_bg_request_scan(struct work_struct *data) | |||
| 2995 | queue_delayed_work(priv->workqueue, &priv->scan_check, | 2985 | queue_delayed_work(priv->workqueue, &priv->scan_check, |
| 2996 | IWL_SCAN_CHECK_WATCHDOG); | 2986 | IWL_SCAN_CHECK_WATCHDOG); |
| 2997 | 2987 | ||
| 2998 | mutex_unlock(&priv->mutex); | ||
| 2999 | return; | 2988 | return; |
| 3000 | 2989 | ||
| 3001 | done: | 2990 | done: |
| @@ -3009,7 +2998,6 @@ static void iwl3945_bg_request_scan(struct work_struct *data) | |||
| 3009 | 2998 | ||
| 3010 | /* inform mac80211 scan aborted */ | 2999 | /* inform mac80211 scan aborted */ |
| 3011 | queue_work(priv->workqueue, &priv->scan_completed); | 3000 | queue_work(priv->workqueue, &priv->scan_completed); |
| 3012 | mutex_unlock(&priv->mutex); | ||
| 3013 | } | 3001 | } |
| 3014 | 3002 | ||
| 3015 | static void iwl3945_bg_restart(struct work_struct *data) | 3003 | static void iwl3945_bg_restart(struct work_struct *data) |
| @@ -3051,8 +3039,6 @@ static void iwl3945_bg_rx_replenish(struct work_struct *data) | |||
| 3051 | mutex_unlock(&priv->mutex); | 3039 | mutex_unlock(&priv->mutex); |
| 3052 | } | 3040 | } |
| 3053 | 3041 | ||
| 3054 | #define IWL_DELAY_NEXT_SCAN (HZ*2) | ||
| 3055 | |||
| 3056 | void iwl3945_post_associate(struct iwl_priv *priv) | 3042 | void iwl3945_post_associate(struct iwl_priv *priv) |
| 3057 | { | 3043 | { |
| 3058 | int rc = 0; | 3044 | int rc = 0; |
| @@ -3137,9 +3123,6 @@ void iwl3945_post_associate(struct iwl_priv *priv) | |||
| 3137 | __func__, priv->iw_mode); | 3123 | __func__, priv->iw_mode); |
| 3138 | break; | 3124 | break; |
| 3139 | } | 3125 | } |
| 3140 | |||
| 3141 | /* we have just associated, don't start scan too early */ | ||
| 3142 | priv->next_scan_jiffies = jiffies + IWL_DELAY_NEXT_SCAN; | ||
| 3143 | } | 3126 | } |
| 3144 | 3127 | ||
| 3145 | /***************************************************************************** | 3128 | /***************************************************************************** |
| @@ -3672,44 +3655,6 @@ static ssize_t show_channels(struct device *d, | |||
| 3672 | 3655 | ||
| 3673 | static DEVICE_ATTR(channels, S_IRUSR, show_channels, NULL); | 3656 | static DEVICE_ATTR(channels, S_IRUSR, show_channels, NULL); |
| 3674 | 3657 | ||
| 3675 | static ssize_t show_statistics(struct device *d, | ||
| 3676 | struct device_attribute *attr, char *buf) | ||
| 3677 | { | ||
| 3678 | struct iwl_priv *priv = dev_get_drvdata(d); | ||
| 3679 | u32 size = sizeof(struct iwl3945_notif_statistics); | ||
| 3680 | u32 len = 0, ofs = 0; | ||
| 3681 | u8 *data = (u8 *)&priv->_3945.statistics; | ||
| 3682 | int rc = 0; | ||
| 3683 | |||
| 3684 | if (!iwl_is_alive(priv)) | ||
| 3685 | return -EAGAIN; | ||
| 3686 | |||
| 3687 | mutex_lock(&priv->mutex); | ||
| 3688 | rc = iwl_send_statistics_request(priv, CMD_SYNC, false); | ||
| 3689 | mutex_unlock(&priv->mutex); | ||
| 3690 | |||
| 3691 | if (rc) { | ||
| 3692 | len = sprintf(buf, | ||
| 3693 | "Error sending statistics request: 0x%08X\n", rc); | ||
| 3694 | return len; | ||
| 3695 | } | ||
| 3696 | |||
| 3697 | while (size && (PAGE_SIZE - len)) { | ||
| 3698 | hex_dump_to_buffer(data + ofs, size, 16, 1, buf + len, | ||
| 3699 | PAGE_SIZE - len, 1); | ||
| 3700 | len = strlen(buf); | ||
| 3701 | if (PAGE_SIZE - len) | ||
| 3702 | buf[len++] = '\n'; | ||
| 3703 | |||
| 3704 | ofs += 16; | ||
| 3705 | size -= min(size, 16U); | ||
| 3706 | } | ||
| 3707 | |||
| 3708 | return len; | ||
| 3709 | } | ||
| 3710 | |||
| 3711 | static DEVICE_ATTR(statistics, S_IRUGO, show_statistics, NULL); | ||
| 3712 | |||
| 3713 | static ssize_t show_antenna(struct device *d, | 3658 | static ssize_t show_antenna(struct device *d, |
| 3714 | struct device_attribute *attr, char *buf) | 3659 | struct device_attribute *attr, char *buf) |
| 3715 | { | 3660 | { |
| @@ -3793,7 +3738,6 @@ static void iwl3945_setup_deferred_work(struct iwl_priv *priv) | |||
| 3793 | INIT_DELAYED_WORK(&priv->alive_start, iwl3945_bg_alive_start); | 3738 | INIT_DELAYED_WORK(&priv->alive_start, iwl3945_bg_alive_start); |
| 3794 | INIT_DELAYED_WORK(&priv->_3945.rfkill_poll, iwl3945_rfkill_poll); | 3739 | INIT_DELAYED_WORK(&priv->_3945.rfkill_poll, iwl3945_rfkill_poll); |
| 3795 | INIT_WORK(&priv->scan_completed, iwl_bg_scan_completed); | 3740 | INIT_WORK(&priv->scan_completed, iwl_bg_scan_completed); |
| 3796 | INIT_WORK(&priv->request_scan, iwl3945_bg_request_scan); | ||
| 3797 | INIT_WORK(&priv->abort_scan, iwl_bg_abort_scan); | 3741 | INIT_WORK(&priv->abort_scan, iwl_bg_abort_scan); |
| 3798 | INIT_DELAYED_WORK(&priv->scan_check, iwl_bg_scan_check); | 3742 | INIT_DELAYED_WORK(&priv->scan_check, iwl_bg_scan_check); |
| 3799 | 3743 | ||
| @@ -3830,7 +3774,6 @@ static struct attribute *iwl3945_sysfs_entries[] = { | |||
| 3830 | &dev_attr_filter_flags.attr, | 3774 | &dev_attr_filter_flags.attr, |
| 3831 | &dev_attr_measurement.attr, | 3775 | &dev_attr_measurement.attr, |
| 3832 | &dev_attr_retry_rate.attr, | 3776 | &dev_attr_retry_rate.attr, |
| 3833 | &dev_attr_statistics.attr, | ||
| 3834 | &dev_attr_status.attr, | 3777 | &dev_attr_status.attr, |
| 3835 | &dev_attr_temperature.attr, | 3778 | &dev_attr_temperature.attr, |
| 3836 | &dev_attr_tx_power.attr, | 3779 | &dev_attr_tx_power.attr, |
| @@ -4253,7 +4196,7 @@ static void __devexit iwl3945_pci_remove(struct pci_dev *pdev) | |||
| 4253 | 4196 | ||
| 4254 | iwl_free_channel_map(priv); | 4197 | iwl_free_channel_map(priv); |
| 4255 | iwlcore_free_geos(priv); | 4198 | iwlcore_free_geos(priv); |
| 4256 | kfree(priv->scan); | 4199 | kfree(priv->scan_cmd); |
| 4257 | if (priv->ibss_beacon) | 4200 | if (priv->ibss_beacon) |
| 4258 | dev_kfree_skb(priv->ibss_beacon); | 4201 | dev_kfree_skb(priv->ibss_beacon); |
| 4259 | 4202 | ||
