diff options
Diffstat (limited to 'drivers/net/wireless')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn.c | 4 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-debug.h | 3 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-tx.c | 40 | ||||
-rw-r--r-- | drivers/net/wireless/p54/p54.h | 1 | ||||
-rw-r--r-- | drivers/net/wireless/p54/p54common.c | 18 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00mac.c | 54 |
6 files changed, 76 insertions, 44 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c index b8407d5704a1..ed09e48b1b61 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c | |||
@@ -2719,7 +2719,7 @@ static int iwl4965_mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb) | |||
2719 | { | 2719 | { |
2720 | struct iwl_priv *priv = hw->priv; | 2720 | struct iwl_priv *priv = hw->priv; |
2721 | 2721 | ||
2722 | IWL_DEBUG_MAC80211("enter\n"); | 2722 | IWL_DEBUG_MACDUMP("enter\n"); |
2723 | 2723 | ||
2724 | if (priv->iw_mode == IEEE80211_IF_TYPE_MNTR) { | 2724 | if (priv->iw_mode == IEEE80211_IF_TYPE_MNTR) { |
2725 | IWL_DEBUG_MAC80211("leave - monitor\n"); | 2725 | IWL_DEBUG_MAC80211("leave - monitor\n"); |
@@ -2733,7 +2733,7 @@ static int iwl4965_mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb) | |||
2733 | if (iwl_tx_skb(priv, skb)) | 2733 | if (iwl_tx_skb(priv, skb)) |
2734 | dev_kfree_skb_any(skb); | 2734 | dev_kfree_skb_any(skb); |
2735 | 2735 | ||
2736 | IWL_DEBUG_MAC80211("leave\n"); | 2736 | IWL_DEBUG_MACDUMP("leave\n"); |
2737 | return 0; | 2737 | return 0; |
2738 | } | 2738 | } |
2739 | 2739 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-debug.h b/drivers/net/wireless/iwlwifi/iwl-debug.h index b4ffd33ef98c..d2daa174df22 100644 --- a/drivers/net/wireless/iwlwifi/iwl-debug.h +++ b/drivers/net/wireless/iwlwifi/iwl-debug.h | |||
@@ -114,7 +114,7 @@ static inline void iwl_dbgfs_unregister(struct iwl_priv *priv) | |||
114 | #define IWL_DL_MAC80211 (1 << 1) | 114 | #define IWL_DL_MAC80211 (1 << 1) |
115 | #define IWL_DL_HOST_COMMAND (1 << 2) | 115 | #define IWL_DL_HOST_COMMAND (1 << 2) |
116 | #define IWL_DL_STATE (1 << 3) | 116 | #define IWL_DL_STATE (1 << 3) |
117 | 117 | #define IWL_DL_MACDUMP (1 << 4) | |
118 | #define IWL_DL_RADIO (1 << 7) | 118 | #define IWL_DL_RADIO (1 << 7) |
119 | #define IWL_DL_POWER (1 << 8) | 119 | #define IWL_DL_POWER (1 << 8) |
120 | #define IWL_DL_TEMP (1 << 9) | 120 | #define IWL_DL_TEMP (1 << 9) |
@@ -154,6 +154,7 @@ static inline void iwl_dbgfs_unregister(struct iwl_priv *priv) | |||
154 | #define IWL_DEBUG_INFO(f, a...) IWL_DEBUG(IWL_DL_INFO, f, ## a) | 154 | #define IWL_DEBUG_INFO(f, a...) IWL_DEBUG(IWL_DL_INFO, f, ## a) |
155 | 155 | ||
156 | #define IWL_DEBUG_MAC80211(f, a...) IWL_DEBUG(IWL_DL_MAC80211, f, ## a) | 156 | #define IWL_DEBUG_MAC80211(f, a...) IWL_DEBUG(IWL_DL_MAC80211, f, ## a) |
157 | #define IWL_DEBUG_MACDUMP(f, a...) IWL_DEBUG(IWL_DL_MACDUMP, f, ## a) | ||
157 | #define IWL_DEBUG_TEMP(f, a...) IWL_DEBUG(IWL_DL_TEMP, f, ## a) | 158 | #define IWL_DEBUG_TEMP(f, a...) IWL_DEBUG(IWL_DL_TEMP, f, ## a) |
158 | #define IWL_DEBUG_SCAN(f, a...) IWL_DEBUG(IWL_DL_SCAN, f, ## a) | 159 | #define IWL_DEBUG_SCAN(f, a...) IWL_DEBUG(IWL_DL_SCAN, f, ## a) |
159 | #define IWL_DEBUG_RX(f, a...) IWL_DEBUG(IWL_DL_RX, f, ## a) | 160 | #define IWL_DEBUG_RX(f, a...) IWL_DEBUG(IWL_DL_RX, f, ## a) |
diff --git a/drivers/net/wireless/iwlwifi/iwl-tx.c b/drivers/net/wireless/iwlwifi/iwl-tx.c index aa98c76d8195..4108c7c8f00f 100644 --- a/drivers/net/wireless/iwlwifi/iwl-tx.c +++ b/drivers/net/wireless/iwlwifi/iwl-tx.c | |||
@@ -764,20 +764,19 @@ int iwl_tx_skb(struct iwl_priv *priv, struct sk_buff *skb) | |||
764 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; | 764 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; |
765 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); | 765 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); |
766 | struct iwl_tfd_frame *tfd; | 766 | struct iwl_tfd_frame *tfd; |
767 | u32 *control_flags; | 767 | struct iwl_tx_queue *txq; |
768 | int txq_id = skb_get_queue_mapping(skb); | 768 | struct iwl_queue *q; |
769 | struct iwl_tx_queue *txq = NULL; | 769 | struct iwl_cmd *out_cmd; |
770 | struct iwl_queue *q = NULL; | 770 | struct iwl_tx_cmd *tx_cmd; |
771 | int swq_id, txq_id; | ||
771 | dma_addr_t phys_addr; | 772 | dma_addr_t phys_addr; |
772 | dma_addr_t txcmd_phys; | 773 | dma_addr_t txcmd_phys; |
773 | dma_addr_t scratch_phys; | 774 | dma_addr_t scratch_phys; |
774 | struct iwl_cmd *out_cmd = NULL; | ||
775 | struct iwl_tx_cmd *tx_cmd; | ||
776 | u16 len, idx, len_org; | 775 | u16 len, idx, len_org; |
777 | u16 seq_number = 0; | 776 | u16 seq_number = 0; |
778 | u8 id, hdr_len, unicast; | ||
779 | u8 sta_id; | ||
780 | __le16 fc; | 777 | __le16 fc; |
778 | u8 hdr_len, unicast; | ||
779 | u8 sta_id; | ||
781 | u8 wait_write_ptr = 0; | 780 | u8 wait_write_ptr = 0; |
782 | u8 tid = 0; | 781 | u8 tid = 0; |
783 | u8 *qc = NULL; | 782 | u8 *qc = NULL; |
@@ -802,7 +801,6 @@ int iwl_tx_skb(struct iwl_priv *priv, struct sk_buff *skb) | |||
802 | } | 801 | } |
803 | 802 | ||
804 | unicast = !is_multicast_ether_addr(hdr->addr1); | 803 | unicast = !is_multicast_ether_addr(hdr->addr1); |
805 | id = 0; | ||
806 | 804 | ||
807 | fc = hdr->frame_control; | 805 | fc = hdr->frame_control; |
808 | 806 | ||
@@ -840,14 +838,16 @@ int iwl_tx_skb(struct iwl_priv *priv, struct sk_buff *skb) | |||
840 | 838 | ||
841 | IWL_DEBUG_TX("station Id %d\n", sta_id); | 839 | IWL_DEBUG_TX("station Id %d\n", sta_id); |
842 | 840 | ||
841 | swq_id = skb_get_queue_mapping(skb); | ||
842 | txq_id = swq_id; | ||
843 | if (ieee80211_is_data_qos(fc)) { | 843 | if (ieee80211_is_data_qos(fc)) { |
844 | qc = ieee80211_get_qos_ctl(hdr); | 844 | qc = ieee80211_get_qos_ctl(hdr); |
845 | tid = qc[0] & 0xf; | 845 | tid = qc[0] & 0xf; |
846 | seq_number = priv->stations[sta_id].tid[tid].seq_number & | 846 | seq_number = priv->stations[sta_id].tid[tid].seq_number; |
847 | IEEE80211_SCTL_SEQ; | 847 | seq_number &= IEEE80211_SCTL_SEQ; |
848 | hdr->seq_ctrl = cpu_to_le16(seq_number) | | 848 | hdr->seq_ctrl = hdr->seq_ctrl & |
849 | (hdr->seq_ctrl & | 849 | __constant_cpu_to_le16(IEEE80211_SCTL_FRAG); |
850 | __constant_cpu_to_le16(IEEE80211_SCTL_FRAG)); | 850 | hdr->seq_ctrl |= cpu_to_le16(seq_number); |
851 | seq_number += 0x10; | 851 | seq_number += 0x10; |
852 | /* aggregation is on for this <sta,tid> */ | 852 | /* aggregation is on for this <sta,tid> */ |
853 | if (info->flags & IEEE80211_TX_CTL_AMPDU) | 853 | if (info->flags & IEEE80211_TX_CTL_AMPDU) |
@@ -864,7 +864,6 @@ int iwl_tx_skb(struct iwl_priv *priv, struct sk_buff *skb) | |||
864 | /* Set up first empty TFD within this queue's circular TFD buffer */ | 864 | /* Set up first empty TFD within this queue's circular TFD buffer */ |
865 | tfd = &txq->bd[q->write_ptr]; | 865 | tfd = &txq->bd[q->write_ptr]; |
866 | memset(tfd, 0, sizeof(*tfd)); | 866 | memset(tfd, 0, sizeof(*tfd)); |
867 | control_flags = (u32 *) tfd; | ||
868 | idx = get_cmd_index(q, q->write_ptr, 0); | 867 | idx = get_cmd_index(q, q->write_ptr, 0); |
869 | 868 | ||
870 | /* Set up driver data for this TFD */ | 869 | /* Set up driver data for this TFD */ |
@@ -983,8 +982,7 @@ int iwl_tx_skb(struct iwl_priv *priv, struct sk_buff *skb) | |||
983 | iwl_txq_update_write_ptr(priv, txq); | 982 | iwl_txq_update_write_ptr(priv, txq); |
984 | spin_unlock_irqrestore(&priv->lock, flags); | 983 | spin_unlock_irqrestore(&priv->lock, flags); |
985 | } else { | 984 | } else { |
986 | ieee80211_stop_queue(priv->hw, | 985 | ieee80211_stop_queue(priv->hw, swq_id); |
987 | skb_get_queue_mapping(skb)); | ||
988 | } | 986 | } |
989 | } | 987 | } |
990 | 988 | ||
@@ -1013,13 +1011,12 @@ int iwl_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd) | |||
1013 | struct iwl_tx_queue *txq = &priv->txq[IWL_CMD_QUEUE_NUM]; | 1011 | struct iwl_tx_queue *txq = &priv->txq[IWL_CMD_QUEUE_NUM]; |
1014 | struct iwl_queue *q = &txq->q; | 1012 | struct iwl_queue *q = &txq->q; |
1015 | struct iwl_tfd_frame *tfd; | 1013 | struct iwl_tfd_frame *tfd; |
1016 | u32 *control_flags; | ||
1017 | struct iwl_cmd *out_cmd; | 1014 | struct iwl_cmd *out_cmd; |
1018 | u32 idx; | ||
1019 | u16 fix_size; | ||
1020 | dma_addr_t phys_addr; | 1015 | dma_addr_t phys_addr; |
1021 | int len, ret; | ||
1022 | unsigned long flags; | 1016 | unsigned long flags; |
1017 | int len, ret; | ||
1018 | u32 idx; | ||
1019 | u16 fix_size; | ||
1023 | 1020 | ||
1024 | cmd->len = priv->cfg->ops->utils->get_hcmd_size(cmd->id, cmd->len); | 1021 | cmd->len = priv->cfg->ops->utils->get_hcmd_size(cmd->id, cmd->len); |
1025 | fix_size = (u16)(cmd->len + sizeof(out_cmd->hdr)); | 1022 | fix_size = (u16)(cmd->len + sizeof(out_cmd->hdr)); |
@@ -1045,7 +1042,6 @@ int iwl_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd) | |||
1045 | tfd = &txq->bd[q->write_ptr]; | 1042 | tfd = &txq->bd[q->write_ptr]; |
1046 | memset(tfd, 0, sizeof(*tfd)); | 1043 | memset(tfd, 0, sizeof(*tfd)); |
1047 | 1044 | ||
1048 | control_flags = (u32 *) tfd; | ||
1049 | 1045 | ||
1050 | idx = get_cmd_index(q, q->write_ptr, cmd->meta.flags & CMD_SIZE_HUGE); | 1046 | idx = get_cmd_index(q, q->write_ptr, cmd->meta.flags & CMD_SIZE_HUGE); |
1051 | out_cmd = txq->cmd[idx]; | 1047 | out_cmd = txq->cmd[idx]; |
diff --git a/drivers/net/wireless/p54/p54.h b/drivers/net/wireless/p54/p54.h index cac9a515b82d..4801a363507b 100644 --- a/drivers/net/wireless/p54/p54.h +++ b/drivers/net/wireless/p54/p54.h | |||
@@ -52,6 +52,7 @@ struct p54_common { | |||
52 | int (*open)(struct ieee80211_hw *dev); | 52 | int (*open)(struct ieee80211_hw *dev); |
53 | void (*stop)(struct ieee80211_hw *dev); | 53 | void (*stop)(struct ieee80211_hw *dev); |
54 | int mode; | 54 | int mode; |
55 | u16 seqno; | ||
55 | struct mutex conf_mutex; | 56 | struct mutex conf_mutex; |
56 | u8 mac_addr[ETH_ALEN]; | 57 | u8 mac_addr[ETH_ALEN]; |
57 | u8 bssid[ETH_ALEN]; | 58 | u8 bssid[ETH_ALEN]; |
diff --git a/drivers/net/wireless/p54/p54common.c b/drivers/net/wireless/p54/p54common.c index 4da89ea9b561..83cd85e1f847 100644 --- a/drivers/net/wireless/p54/p54common.c +++ b/drivers/net/wireless/p54/p54common.c | |||
@@ -553,6 +553,7 @@ static int p54_tx(struct ieee80211_hw *dev, struct sk_buff *skb) | |||
553 | struct ieee80211_tx_queue_stats *current_queue; | 553 | struct ieee80211_tx_queue_stats *current_queue; |
554 | struct p54_common *priv = dev->priv; | 554 | struct p54_common *priv = dev->priv; |
555 | struct p54_control_hdr *hdr; | 555 | struct p54_control_hdr *hdr; |
556 | struct ieee80211_hdr *ieee80211hdr = (struct ieee80211_hdr *)skb->data; | ||
556 | struct p54_tx_control_allocdata *txhdr; | 557 | struct p54_tx_control_allocdata *txhdr; |
557 | size_t padding, len; | 558 | size_t padding, len; |
558 | u8 rate; | 559 | u8 rate; |
@@ -605,6 +606,19 @@ static int p54_tx(struct ieee80211_hw *dev, struct sk_buff *skb) | |||
605 | if (padding) | 606 | if (padding) |
606 | txhdr->align[0] = padding; | 607 | txhdr->align[0] = padding; |
607 | 608 | ||
609 | /* FIXME: The sequence that follows is needed for this driver to | ||
610 | * work with mac80211 since "mac80211: fix TX sequence numbers". | ||
611 | * As with the temporary code in rt2x00, changes will be needed | ||
612 | * to get proper sequence numbers on beacons. In addition, this | ||
613 | * patch places the sequence number in the hardware state, which | ||
614 | * limits us to a single virtual state. | ||
615 | */ | ||
616 | if (info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) { | ||
617 | if (info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT) | ||
618 | priv->seqno += 0x10; | ||
619 | ieee80211hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG); | ||
620 | ieee80211hdr->seq_ctrl |= cpu_to_le16(priv->seqno); | ||
621 | } | ||
608 | /* modifies skb->cb and with it info, so must be last! */ | 622 | /* modifies skb->cb and with it info, so must be last! */ |
609 | p54_assign_address(dev, skb, hdr, skb->len); | 623 | p54_assign_address(dev, skb, hdr, skb->len); |
610 | 624 | ||
@@ -803,8 +817,8 @@ static void p54_set_vdcf(struct ieee80211_hw *dev) | |||
803 | 817 | ||
804 | if (dev->conf.flags & IEEE80211_CONF_SHORT_SLOT_TIME) { | 818 | if (dev->conf.flags & IEEE80211_CONF_SHORT_SLOT_TIME) { |
805 | vdcf->slottime = 9; | 819 | vdcf->slottime = 9; |
806 | vdcf->magic1 = 0x00; | 820 | vdcf->magic1 = 0x10; |
807 | vdcf->magic2 = 0x10; | 821 | vdcf->magic2 = 0x00; |
808 | } else { | 822 | } else { |
809 | vdcf->slottime = 20; | 823 | vdcf->slottime = 20; |
810 | vdcf->magic1 = 0x0a; | 824 | vdcf->magic1 = 0x0a; |
diff --git a/drivers/net/wireless/rt2x00/rt2x00mac.c b/drivers/net/wireless/rt2x00/rt2x00mac.c index bd422fd6a894..d06507388635 100644 --- a/drivers/net/wireless/rt2x00/rt2x00mac.c +++ b/drivers/net/wireless/rt2x00/rt2x00mac.c | |||
@@ -203,23 +203,43 @@ int rt2x00mac_add_interface(struct ieee80211_hw *hw, | |||
203 | !test_bit(DEVICE_STARTED, &rt2x00dev->flags)) | 203 | !test_bit(DEVICE_STARTED, &rt2x00dev->flags)) |
204 | return -ENODEV; | 204 | return -ENODEV; |
205 | 205 | ||
206 | /* | 206 | switch (conf->type) { |
207 | * We don't support mixed combinations of sta and ap virtual | 207 | case IEEE80211_IF_TYPE_AP: |
208 | * interfaces. We can only add this interface when the rival | 208 | /* |
209 | * interface count is 0. | 209 | * We don't support mixed combinations of |
210 | */ | 210 | * sta and ap interfaces. |
211 | if ((conf->type == IEEE80211_IF_TYPE_AP && rt2x00dev->intf_sta_count) || | 211 | */ |
212 | (conf->type != IEEE80211_IF_TYPE_AP && rt2x00dev->intf_ap_count)) | 212 | if (rt2x00dev->intf_sta_count) |
213 | return -ENOBUFS; | 213 | return -ENOBUFS; |
214 | 214 | ||
215 | /* | 215 | /* |
216 | * Check if we exceeded the maximum amount of supported interfaces. | 216 | * Check if we exceeded the maximum amount |
217 | */ | 217 | * of supported interfaces. |
218 | if ((conf->type == IEEE80211_IF_TYPE_AP && | 218 | */ |
219 | rt2x00dev->intf_ap_count >= rt2x00dev->ops->max_ap_intf) || | 219 | if (rt2x00dev->intf_ap_count >= rt2x00dev->ops->max_ap_intf) |
220 | (conf->type != IEEE80211_IF_TYPE_AP && | 220 | return -ENOBUFS; |
221 | rt2x00dev->intf_sta_count >= rt2x00dev->ops->max_sta_intf)) | 221 | |
222 | return -ENOBUFS; | 222 | break; |
223 | case IEEE80211_IF_TYPE_STA: | ||
224 | case IEEE80211_IF_TYPE_IBSS: | ||
225 | /* | ||
226 | * We don't support mixed combinations of | ||
227 | * sta and ap interfaces. | ||
228 | */ | ||
229 | if (rt2x00dev->intf_ap_count) | ||
230 | return -ENOBUFS; | ||
231 | |||
232 | /* | ||
233 | * Check if we exceeded the maximum amount | ||
234 | * of supported interfaces. | ||
235 | */ | ||
236 | if (rt2x00dev->intf_sta_count >= rt2x00dev->ops->max_sta_intf) | ||
237 | return -ENOBUFS; | ||
238 | |||
239 | break; | ||
240 | default: | ||
241 | return -EINVAL; | ||
242 | } | ||
223 | 243 | ||
224 | /* | 244 | /* |
225 | * Loop through all beacon queues to find a free | 245 | * Loop through all beacon queues to find a free |