diff options
| author | Tomas Winkler <tomas.winkler@intel.com> | 2008-05-15 01:54:06 -0400 |
|---|---|---|
| committer | John W. Linville <linville@tuxdriver.com> | 2008-05-21 21:47:59 -0400 |
| commit | 54dbb525e7b8580b86af352cf60b27cc889c2ae4 (patch) | |
| tree | cd791dd579945e8db57de6328f8cd8933b9760d4 | |
| parent | 83d527d9e8f9aff92cbd33f208f77c055dabb499 (diff) | |
iwlwifi: refactor ieee80211_get_qos_ctrl
This patch refactors ieee80211_get_qos_ctrl function and its usage
in iwlwifi drivers. Function is moved as inline into iwl-helpers.h.
Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-4965-rs.c | 17 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-dev.h | 1 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-helpers.h | 19 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl3945-base.c | 35 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl4965-base.c | 51 |
5 files changed, 63 insertions, 60 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965-rs.c b/drivers/net/wireless/iwlwifi/iwl-4965-rs.c index ce70f2b29b61..071c7b6ebef2 100644 --- a/drivers/net/wireless/iwlwifi/iwl-4965-rs.c +++ b/drivers/net/wireless/iwlwifi/iwl-4965-rs.c | |||
| @@ -282,14 +282,20 @@ static void rs_tl_rm_old_stats(struct iwl4965_traffic_load *tl, u32 curr_time) | |||
| 282 | * increment traffic load value for tid and also remove | 282 | * increment traffic load value for tid and also remove |
| 283 | * any old values if passed the certain time period | 283 | * any old values if passed the certain time period |
| 284 | */ | 284 | */ |
| 285 | static void rs_tl_add_packet(struct iwl4965_lq_sta *lq_data, u8 tid) | 285 | static void rs_tl_add_packet(struct iwl4965_lq_sta *lq_data, |
| 286 | struct ieee80211_hdr *hdr) | ||
| 286 | { | 287 | { |
| 287 | u32 curr_time = jiffies_to_msecs(jiffies); | 288 | u32 curr_time = jiffies_to_msecs(jiffies); |
| 288 | u32 time_diff; | 289 | u32 time_diff; |
| 289 | s32 index; | 290 | s32 index; |
| 290 | struct iwl4965_traffic_load *tl = NULL; | 291 | struct iwl4965_traffic_load *tl = NULL; |
| 292 | u16 fc = le16_to_cpu(hdr->frame_control); | ||
| 293 | u8 tid; | ||
| 291 | 294 | ||
| 292 | if (tid >= TID_MAX_LOAD_COUNT) | 295 | if (ieee80211_is_qos_data(fc)) { |
| 296 | u8 *qc = ieee80211_get_qos_ctrl(hdr, ieee80211_get_hdrlen(fc)); | ||
| 297 | tid = qc[0] & 0xf; | ||
| 298 | } else | ||
| 293 | return; | 299 | return; |
| 294 | 300 | ||
| 295 | tl = &lq_data->load[tid]; | 301 | tl = &lq_data->load[tid]; |
| @@ -1670,7 +1676,6 @@ static void rs_rate_scale_perform(struct iwl_priv *priv, | |||
| 1670 | u16 high_low; | 1676 | u16 high_low; |
| 1671 | #ifdef CONFIG_IWL4965_HT | 1677 | #ifdef CONFIG_IWL4965_HT |
| 1672 | u8 tid = MAX_TID_COUNT; | 1678 | u8 tid = MAX_TID_COUNT; |
| 1673 | __le16 *qc; | ||
| 1674 | #endif | 1679 | #endif |
| 1675 | 1680 | ||
| 1676 | IWL_DEBUG_RATE("rate scale calculate new rate for skb\n"); | 1681 | IWL_DEBUG_RATE("rate scale calculate new rate for skb\n"); |
| @@ -1693,11 +1698,7 @@ static void rs_rate_scale_perform(struct iwl_priv *priv, | |||
| 1693 | lq_sta = (struct iwl4965_lq_sta *)sta->rate_ctrl_priv; | 1698 | lq_sta = (struct iwl4965_lq_sta *)sta->rate_ctrl_priv; |
| 1694 | 1699 | ||
| 1695 | #ifdef CONFIG_IWL4965_HT | 1700 | #ifdef CONFIG_IWL4965_HT |
| 1696 | qc = ieee80211_get_qos_ctrl(hdr); | 1701 | rs_tl_add_packet(lq_sta, hdr); |
| 1697 | if (qc) { | ||
| 1698 | tid = (u8)(le16_to_cpu(*qc) & 0xf); | ||
| 1699 | rs_tl_add_packet(lq_sta, tid); | ||
| 1700 | } | ||
| 1701 | #endif | 1702 | #endif |
| 1702 | /* | 1703 | /* |
| 1703 | * Select rate-scale / modulation-mode table to work with in | 1704 | * Select rate-scale / modulation-mode table to work with in |
diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h index ddb950ee25b6..7bd99f942f10 100644 --- a/drivers/net/wireless/iwlwifi/iwl-dev.h +++ b/drivers/net/wireless/iwlwifi/iwl-dev.h | |||
| @@ -650,7 +650,6 @@ extern int iwl4965_calc_sig_qual(int rssi_dbm, int noise_dbm); | |||
| 650 | extern unsigned int iwl4965_fill_beacon_frame(struct iwl_priv *priv, | 650 | extern unsigned int iwl4965_fill_beacon_frame(struct iwl_priv *priv, |
| 651 | struct ieee80211_hdr *hdr, | 651 | struct ieee80211_hdr *hdr, |
| 652 | const u8 *dest, int left); | 652 | const u8 *dest, int left); |
| 653 | extern __le16 *ieee80211_get_qos_ctrl(struct ieee80211_hdr *hdr); | ||
| 654 | extern void iwl4965_update_chain_flags(struct iwl_priv *priv); | 653 | extern void iwl4965_update_chain_flags(struct iwl_priv *priv); |
| 655 | int iwl4965_set_pwr_src(struct iwl_priv *priv, enum iwl_pwr_src src); | 654 | int iwl4965_set_pwr_src(struct iwl_priv *priv, enum iwl_pwr_src src); |
| 656 | 655 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-helpers.h b/drivers/net/wireless/iwlwifi/iwl-helpers.h index a443472bea62..e4c3f84f530a 100644 --- a/drivers/net/wireless/iwlwifi/iwl-helpers.h +++ b/drivers/net/wireless/iwlwifi/iwl-helpers.h | |||
| @@ -235,6 +235,25 @@ static inline int ieee80211_is_reassoc_response(u16 fc) | |||
| 235 | ((fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_REASSOC_RESP); | 235 | ((fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_REASSOC_RESP); |
| 236 | } | 236 | } |
| 237 | 237 | ||
| 238 | static inline int ieee80211_is_qos_data(u16 fc) | ||
| 239 | { | ||
| 240 | return ((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA) && | ||
| 241 | ((fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_QOS_DATA); | ||
| 242 | } | ||
| 243 | /** | ||
| 244 | * ieee80211_get_qos_ctrl - get pointer to the QoS control field | ||
| 245 | * | ||
| 246 | * This function returns the pointer to 802.11 header QoS field (2 bytes) | ||
| 247 | * This function doesn't check whether hdr is a QoS hdr, use with care | ||
| 248 | * @hdr: struct ieee80211_hdr *hdr | ||
| 249 | * @hdr_len: header length | ||
| 250 | */ | ||
| 251 | |||
| 252 | static inline u8 *ieee80211_get_qos_ctrl(struct ieee80211_hdr *hdr, int hdr_len) | ||
| 253 | { | ||
| 254 | return ((u8 *) hdr + hdr_len - QOS_CONTROL_LEN); | ||
| 255 | } | ||
| 256 | |||
| 238 | static inline int iwl_check_bits(unsigned long field, unsigned long mask) | 257 | static inline int iwl_check_bits(unsigned long field, unsigned long mask) |
| 239 | { | 258 | { |
| 240 | return ((field & mask) == mask) ? 1 : 0; | 259 | return ((field & mask) == mask) ? 1 : 0; |
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c index c1234ff4fc98..b8fb8d8d95ff 100644 --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c | |||
| @@ -102,16 +102,6 @@ MODULE_VERSION(DRV_VERSION); | |||
| 102 | MODULE_AUTHOR(DRV_COPYRIGHT); | 102 | MODULE_AUTHOR(DRV_COPYRIGHT); |
| 103 | MODULE_LICENSE("GPL"); | 103 | MODULE_LICENSE("GPL"); |
| 104 | 104 | ||
| 105 | static __le16 *ieee80211_get_qos_ctrl(struct ieee80211_hdr *hdr) | ||
| 106 | { | ||
| 107 | u16 fc = le16_to_cpu(hdr->frame_control); | ||
| 108 | int hdr_len = ieee80211_get_hdrlen(fc); | ||
| 109 | |||
| 110 | if ((fc & 0x00cc) == (IEEE80211_STYPE_QOS_DATA | IEEE80211_FTYPE_DATA)) | ||
| 111 | return (__le16 *) ((u8 *) hdr + hdr_len - QOS_CONTROL_LEN); | ||
| 112 | return NULL; | ||
| 113 | } | ||
| 114 | |||
| 115 | static const struct ieee80211_supported_band *iwl3945_get_band( | 105 | static const struct ieee80211_supported_band *iwl3945_get_band( |
| 116 | struct iwl3945_priv *priv, enum ieee80211_band band) | 106 | struct iwl3945_priv *priv, enum ieee80211_band band) |
| 117 | { | 107 | { |
| @@ -2441,7 +2431,6 @@ static void iwl3945_build_tx_cmd_basic(struct iwl3945_priv *priv, | |||
| 2441 | struct ieee80211_hdr *hdr, | 2431 | struct ieee80211_hdr *hdr, |
| 2442 | int is_unicast, u8 std_id) | 2432 | int is_unicast, u8 std_id) |
| 2443 | { | 2433 | { |
| 2444 | __le16 *qc; | ||
| 2445 | u16 fc = le16_to_cpu(hdr->frame_control); | 2434 | u16 fc = le16_to_cpu(hdr->frame_control); |
| 2446 | __le32 tx_flags = cmd->cmd.tx.tx_flags; | 2435 | __le32 tx_flags = cmd->cmd.tx.tx_flags; |
| 2447 | 2436 | ||
| @@ -2462,12 +2451,13 @@ static void iwl3945_build_tx_cmd_basic(struct iwl3945_priv *priv, | |||
| 2462 | if (ieee80211_get_morefrag(hdr)) | 2451 | if (ieee80211_get_morefrag(hdr)) |
| 2463 | tx_flags |= TX_CMD_FLG_MORE_FRAG_MSK; | 2452 | tx_flags |= TX_CMD_FLG_MORE_FRAG_MSK; |
| 2464 | 2453 | ||
| 2465 | qc = ieee80211_get_qos_ctrl(hdr); | 2454 | if (ieee80211_is_qos_data(fc)) { |
| 2466 | if (qc) { | 2455 | u8 *qc = ieee80211_get_qos_ctrl(hdr, ieee80211_get_hdrlen(fc)); |
| 2467 | cmd->cmd.tx.tid_tspec = (u8) (le16_to_cpu(*qc) & 0xf); | 2456 | cmd->cmd.tx.tid_tspec = qc[0] & 0xf; |
| 2468 | tx_flags &= ~TX_CMD_FLG_SEQ_CTL_MSK; | 2457 | tx_flags &= ~TX_CMD_FLG_SEQ_CTL_MSK; |
| 2469 | } else | 2458 | } else { |
| 2470 | tx_flags |= TX_CMD_FLG_SEQ_CTL_MSK; | 2459 | tx_flags |= TX_CMD_FLG_SEQ_CTL_MSK; |
| 2460 | } | ||
| 2471 | 2461 | ||
| 2472 | if (ctrl->flags & IEEE80211_TXCTL_USE_RTS_CTS) { | 2462 | if (ctrl->flags & IEEE80211_TXCTL_USE_RTS_CTS) { |
| 2473 | tx_flags |= TX_CMD_FLG_RTS_MSK; | 2463 | tx_flags |= TX_CMD_FLG_RTS_MSK; |
| @@ -2568,13 +2558,15 @@ static int iwl3945_tx_skb(struct iwl3945_priv *priv, | |||
| 2568 | dma_addr_t phys_addr; | 2558 | dma_addr_t phys_addr; |
| 2569 | dma_addr_t txcmd_phys; | 2559 | dma_addr_t txcmd_phys; |
| 2570 | struct iwl3945_cmd *out_cmd = NULL; | 2560 | struct iwl3945_cmd *out_cmd = NULL; |
| 2571 | u16 len, idx, len_org; | 2561 | u16 len, idx, len_org, hdr_len; |
| 2572 | u8 id, hdr_len, unicast; | 2562 | u8 id; |
| 2563 | u8 unicast; | ||
| 2573 | u8 sta_id; | 2564 | u8 sta_id; |
| 2565 | u8 tid = 0; | ||
| 2574 | u16 seq_number = 0; | 2566 | u16 seq_number = 0; |
| 2575 | u16 fc; | 2567 | u16 fc; |
| 2576 | __le16 *qc; | ||
| 2577 | u8 wait_write_ptr = 0; | 2568 | u8 wait_write_ptr = 0; |
| 2569 | u8 *qc = NULL; | ||
| 2578 | unsigned long flags; | 2570 | unsigned long flags; |
| 2579 | int rc; | 2571 | int rc; |
| 2580 | 2572 | ||
| @@ -2632,9 +2624,9 @@ static int iwl3945_tx_skb(struct iwl3945_priv *priv, | |||
| 2632 | 2624 | ||
| 2633 | IWL_DEBUG_RATE("station Id %d\n", sta_id); | 2625 | IWL_DEBUG_RATE("station Id %d\n", sta_id); |
| 2634 | 2626 | ||
| 2635 | qc = ieee80211_get_qos_ctrl(hdr); | 2627 | if (ieee80211_is_qos_data(fc)) { |
| 2636 | if (qc) { | 2628 | qc = ieee80211_get_qos_ctrl(hdr, hdr_len); |
| 2637 | u8 tid = (u8)(le16_to_cpu(*qc) & 0xf); | 2629 | tid = qc[0] & 0xf; |
| 2638 | seq_number = priv->stations[sta_id].tid[tid].seq_number & | 2630 | seq_number = priv->stations[sta_id].tid[tid].seq_number & |
| 2639 | IEEE80211_SCTL_SEQ; | 2631 | IEEE80211_SCTL_SEQ; |
| 2640 | hdr->seq_ctrl = cpu_to_le16(seq_number) | | 2632 | hdr->seq_ctrl = cpu_to_le16(seq_number) | |
| @@ -2745,7 +2737,6 @@ static int iwl3945_tx_skb(struct iwl3945_priv *priv, | |||
| 2745 | if (!ieee80211_get_morefrag(hdr)) { | 2737 | if (!ieee80211_get_morefrag(hdr)) { |
| 2746 | txq->need_update = 1; | 2738 | txq->need_update = 1; |
| 2747 | if (qc) { | 2739 | if (qc) { |
| 2748 | u8 tid = (u8)(le16_to_cpu(*qc) & 0xf); | ||
| 2749 | priv->stations[sta_id].tid[tid].seq_number = seq_number; | 2740 | priv->stations[sta_id].tid[tid].seq_number = seq_number; |
| 2750 | } | 2741 | } |
| 2751 | } else { | 2742 | } else { |
diff --git a/drivers/net/wireless/iwlwifi/iwl4965-base.c b/drivers/net/wireless/iwlwifi/iwl4965-base.c index 6d5b58f88aaa..e3f872e3381d 100644 --- a/drivers/net/wireless/iwlwifi/iwl4965-base.c +++ b/drivers/net/wireless/iwlwifi/iwl4965-base.c | |||
| @@ -89,16 +89,6 @@ MODULE_VERSION(DRV_VERSION); | |||
| 89 | MODULE_AUTHOR(DRV_COPYRIGHT); | 89 | MODULE_AUTHOR(DRV_COPYRIGHT); |
| 90 | MODULE_LICENSE("GPL"); | 90 | MODULE_LICENSE("GPL"); |
| 91 | 91 | ||
| 92 | __le16 *ieee80211_get_qos_ctrl(struct ieee80211_hdr *hdr) | ||
| 93 | { | ||
| 94 | u16 fc = le16_to_cpu(hdr->frame_control); | ||
| 95 | int hdr_len = ieee80211_get_hdrlen(fc); | ||
| 96 | |||
| 97 | if ((fc & 0x00cc) == (IEEE80211_STYPE_QOS_DATA | IEEE80211_FTYPE_DATA)) | ||
| 98 | return (__le16 *) ((u8 *) hdr + hdr_len - QOS_CONTROL_LEN); | ||
| 99 | return NULL; | ||
| 100 | } | ||
| 101 | |||
| 102 | static const struct ieee80211_supported_band *iwl_get_hw_mode( | 92 | static const struct ieee80211_supported_band *iwl_get_hw_mode( |
| 103 | struct iwl_priv *priv, enum ieee80211_band band) | 93 | struct iwl_priv *priv, enum ieee80211_band band) |
| 104 | { | 94 | { |
| @@ -1532,7 +1522,6 @@ static void iwl4965_build_tx_cmd_basic(struct iwl_priv *priv, | |||
| 1532 | struct ieee80211_hdr *hdr, | 1522 | struct ieee80211_hdr *hdr, |
| 1533 | int is_unicast, u8 std_id) | 1523 | int is_unicast, u8 std_id) |
| 1534 | { | 1524 | { |
| 1535 | __le16 *qc; | ||
| 1536 | u16 fc = le16_to_cpu(hdr->frame_control); | 1525 | u16 fc = le16_to_cpu(hdr->frame_control); |
| 1537 | __le32 tx_flags = cmd->cmd.tx.tx_flags; | 1526 | __le32 tx_flags = cmd->cmd.tx.tx_flags; |
| 1538 | 1527 | ||
| @@ -1557,12 +1546,13 @@ static void iwl4965_build_tx_cmd_basic(struct iwl_priv *priv, | |||
| 1557 | if (ieee80211_get_morefrag(hdr)) | 1546 | if (ieee80211_get_morefrag(hdr)) |
| 1558 | tx_flags |= TX_CMD_FLG_MORE_FRAG_MSK; | 1547 | tx_flags |= TX_CMD_FLG_MORE_FRAG_MSK; |
| 1559 | 1548 | ||
| 1560 | qc = ieee80211_get_qos_ctrl(hdr); | 1549 | if (ieee80211_is_qos_data(fc)) { |
| 1561 | if (qc) { | 1550 | u8 *qc = ieee80211_get_qos_ctrl(hdr, ieee80211_get_hdrlen(fc)); |
| 1562 | cmd->cmd.tx.tid_tspec = (u8) (le16_to_cpu(*qc) & 0xf); | 1551 | cmd->cmd.tx.tid_tspec = qc[0] & 0xf; |
| 1563 | tx_flags &= ~TX_CMD_FLG_SEQ_CTL_MSK; | 1552 | tx_flags &= ~TX_CMD_FLG_SEQ_CTL_MSK; |
| 1564 | } else | 1553 | } else { |
| 1565 | tx_flags |= TX_CMD_FLG_SEQ_CTL_MSK; | 1554 | tx_flags |= TX_CMD_FLG_SEQ_CTL_MSK; |
| 1555 | } | ||
| 1566 | 1556 | ||
| 1567 | if (ctrl->flags & IEEE80211_TXCTL_USE_RTS_CTS) { | 1557 | if (ctrl->flags & IEEE80211_TXCTL_USE_RTS_CTS) { |
| 1568 | tx_flags |= TX_CMD_FLG_RTS_MSK; | 1558 | tx_flags |= TX_CMD_FLG_RTS_MSK; |
| @@ -1614,12 +1604,15 @@ static int iwl4965_tx_skb(struct iwl_priv *priv, | |||
| 1614 | dma_addr_t scratch_phys; | 1604 | dma_addr_t scratch_phys; |
| 1615 | struct iwl_cmd *out_cmd = NULL; | 1605 | struct iwl_cmd *out_cmd = NULL; |
| 1616 | u16 len, idx, len_org; | 1606 | u16 len, idx, len_org; |
| 1617 | u8 id, hdr_len, unicast; | 1607 | u8 hdr_len; |
| 1608 | u8 id; | ||
| 1609 | u8 unicast; | ||
| 1618 | u8 sta_id; | 1610 | u8 sta_id; |
| 1611 | u8 tid = 0; | ||
| 1612 | u8 wait_write_ptr = 0; | ||
| 1619 | u16 seq_number = 0; | 1613 | u16 seq_number = 0; |
| 1620 | u16 fc; | 1614 | u16 fc; |
| 1621 | __le16 *qc; | 1615 | u8 *qc = NULL; |
| 1622 | u8 wait_write_ptr = 0; | ||
| 1623 | unsigned long flags; | 1616 | unsigned long flags; |
| 1624 | int rc; | 1617 | int rc; |
| 1625 | 1618 | ||
| @@ -1678,9 +1671,9 @@ static int iwl4965_tx_skb(struct iwl_priv *priv, | |||
| 1678 | 1671 | ||
| 1679 | IWL_DEBUG_TX("station Id %d\n", sta_id); | 1672 | IWL_DEBUG_TX("station Id %d\n", sta_id); |
| 1680 | 1673 | ||
| 1681 | qc = ieee80211_get_qos_ctrl(hdr); | 1674 | if (ieee80211_is_qos_data(fc)) { |
| 1682 | if (qc) { | 1675 | qc = ieee80211_get_qos_ctrl(hdr, hdr_len); |
| 1683 | u8 tid = (u8)(le16_to_cpu(*qc) & 0xf); | 1676 | tid = qc[0] & 0xf; |
| 1684 | seq_number = priv->stations[sta_id].tid[tid].seq_number & | 1677 | seq_number = priv->stations[sta_id].tid[tid].seq_number & |
| 1685 | IEEE80211_SCTL_SEQ; | 1678 | IEEE80211_SCTL_SEQ; |
| 1686 | hdr->seq_ctrl = cpu_to_le16(seq_number) | | 1679 | hdr->seq_ctrl = cpu_to_le16(seq_number) | |
| @@ -1795,10 +1788,8 @@ static int iwl4965_tx_skb(struct iwl_priv *priv, | |||
| 1795 | 1788 | ||
| 1796 | if (!ieee80211_get_morefrag(hdr)) { | 1789 | if (!ieee80211_get_morefrag(hdr)) { |
| 1797 | txq->need_update = 1; | 1790 | txq->need_update = 1; |
| 1798 | if (qc) { | 1791 | if (qc) |
| 1799 | u8 tid = (u8)(le16_to_cpu(*qc) & 0xf); | ||
| 1800 | priv->stations[sta_id].tid[tid].seq_number = seq_number; | 1792 | priv->stations[sta_id].tid[tid].seq_number = seq_number; |
| 1801 | } | ||
| 1802 | } else { | 1793 | } else { |
| 1803 | wait_write_ptr = 1; | 1794 | wait_write_ptr = 1; |
| 1804 | txq->need_update = 0; | 1795 | txq->need_update = 0; |
| @@ -2377,8 +2368,9 @@ static void iwl4965_rx_reply_tx(struct iwl_priv *priv, | |||
| 2377 | u32 status = le32_to_cpu(tx_resp->status); | 2368 | u32 status = le32_to_cpu(tx_resp->status); |
| 2378 | #ifdef CONFIG_IWL4965_HT | 2369 | #ifdef CONFIG_IWL4965_HT |
| 2379 | int tid = MAX_TID_COUNT, sta_id = IWL_INVALID_STATION; | 2370 | int tid = MAX_TID_COUNT, sta_id = IWL_INVALID_STATION; |
| 2371 | u16 fc; | ||
| 2380 | struct ieee80211_hdr *hdr; | 2372 | struct ieee80211_hdr *hdr; |
| 2381 | __le16 *qc; | 2373 | u8 *qc = NULL; |
| 2382 | #endif | 2374 | #endif |
| 2383 | 2375 | ||
| 2384 | if ((index >= txq->q.n_bd) || (iwl_queue_used(&txq->q, index) == 0)) { | 2376 | if ((index >= txq->q.n_bd) || (iwl_queue_used(&txq->q, index) == 0)) { |
| @@ -2391,10 +2383,11 @@ static void iwl4965_rx_reply_tx(struct iwl_priv *priv, | |||
| 2391 | 2383 | ||
| 2392 | #ifdef CONFIG_IWL4965_HT | 2384 | #ifdef CONFIG_IWL4965_HT |
| 2393 | hdr = iwl4965_tx_queue_get_hdr(priv, txq_id, index); | 2385 | hdr = iwl4965_tx_queue_get_hdr(priv, txq_id, index); |
| 2394 | qc = ieee80211_get_qos_ctrl(hdr); | 2386 | fc = le16_to_cpu(hdr->frame_control); |
| 2395 | 2387 | if (ieee80211_is_qos_data(fc)) { | |
| 2396 | if (qc) | 2388 | qc = ieee80211_get_qos_ctrl(hdr, ieee80211_get_hdrlen(fc)); |
| 2397 | tid = le16_to_cpu(*qc) & 0xf; | 2389 | tid = qc[0] & 0xf; |
| 2390 | } | ||
| 2398 | 2391 | ||
| 2399 | sta_id = iwl4965_get_ra_sta_id(priv, hdr); | 2392 | sta_id = iwl4965_get_ra_sta_id(priv, hdr); |
| 2400 | if (txq->sched_retry && unlikely(sta_id == IWL_INVALID_STATION)) { | 2393 | if (txq->sched_retry && unlikely(sta_id == IWL_INVALID_STATION)) { |
