diff options
author | Sujith Manoharan <Sujith.Manoharan@atheros.com> | 2011-04-13 01:55:35 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2011-04-13 15:23:46 -0400 |
commit | d67ee5339363608adce786ec8fd62a0fb2b66116 (patch) | |
tree | d7e93c33d076806df49a8ec1e349348fc2eb08b9 /drivers/net | |
parent | 8e86a54715c4102a8ed697939de9ebd9715dc59c (diff) |
ath9k_htc: Introduce new HTC API
A new routine that takes an endpoint explicitly is
introduced. The normal htc_send() now retrieves the endpoint
from the packet's private data. This would be useful
in TX completion when the endpoint ID would be required.
While at it, use a helper function to map the queue to endpoint.
Data/mgmt/beacon packets use htc_send(), while WMI comamnds
pass the endpoint to HTC.
Signed-off-by: Sujith Manoharan <Sujith.Manoharan@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/wireless/ath/ath9k/htc.h | 1 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/htc_drv_beacon.c | 3 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/htc_drv_txrx.c | 56 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/htc_hst.c | 12 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/htc_hst.h | 5 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/wmi.c | 2 |
6 files changed, 49 insertions, 30 deletions
diff --git a/drivers/net/wireless/ath/ath9k/htc.h b/drivers/net/wireless/ath/ath9k/htc.h index fc4c466e756..356f49c180b 100644 --- a/drivers/net/wireless/ath/ath9k/htc.h +++ b/drivers/net/wireless/ath/ath9k/htc.h | |||
@@ -276,6 +276,7 @@ struct ath9k_htc_tx { | |||
276 | 276 | ||
277 | struct ath9k_htc_tx_ctl { | 277 | struct ath9k_htc_tx_ctl { |
278 | u8 type; /* ATH9K_HTC_* */ | 278 | u8 type; /* ATH9K_HTC_* */ |
279 | u8 epid; | ||
279 | }; | 280 | }; |
280 | 281 | ||
281 | static inline struct ath9k_htc_tx_ctl *HTC_SKB_CB(struct sk_buff *skb) | 282 | static inline struct ath9k_htc_tx_ctl *HTC_SKB_CB(struct sk_buff *skb) |
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_beacon.c b/drivers/net/wireless/ath/ath9k/htc_drv_beacon.c index de37d46bb0d..97b116fb4e1 100644 --- a/drivers/net/wireless/ath/ath9k/htc_drv_beacon.c +++ b/drivers/net/wireless/ath/ath9k/htc_drv_beacon.c | |||
@@ -391,12 +391,13 @@ static void ath9k_htc_send_beacon(struct ath9k_htc_priv *priv, | |||
391 | memset(tx_ctl, 0, sizeof(*tx_ctl)); | 391 | memset(tx_ctl, 0, sizeof(*tx_ctl)); |
392 | 392 | ||
393 | tx_ctl->type = ATH9K_HTC_BEACON; | 393 | tx_ctl->type = ATH9K_HTC_BEACON; |
394 | tx_ctl->epid = priv->beacon_ep; | ||
394 | 395 | ||
395 | beacon_hdr.vif_index = avp->index; | 396 | beacon_hdr.vif_index = avp->index; |
396 | tx_fhdr = skb_push(beacon, sizeof(beacon_hdr)); | 397 | tx_fhdr = skb_push(beacon, sizeof(beacon_hdr)); |
397 | memcpy(tx_fhdr, (u8 *) &beacon_hdr, sizeof(beacon_hdr)); | 398 | memcpy(tx_fhdr, (u8 *) &beacon_hdr, sizeof(beacon_hdr)); |
398 | 399 | ||
399 | ret = htc_send(priv->htc, beacon, priv->beacon_ep); | 400 | ret = htc_send(priv->htc, beacon); |
400 | if (ret != 0) { | 401 | if (ret != 0) { |
401 | if (ret == -ENOMEM) { | 402 | if (ret == -ENOMEM) { |
402 | ath_dbg(common, ATH_DBG_BSTUCK, | 403 | ath_dbg(common, ATH_DBG_BSTUCK, |
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c index 1cbe194179a..d17662fa604 100644 --- a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c +++ b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c | |||
@@ -76,6 +76,34 @@ void ath9k_htc_check_wake_queues(struct ath9k_htc_priv *priv) | |||
76 | spin_unlock_bh(&priv->tx.tx_lock); | 76 | spin_unlock_bh(&priv->tx.tx_lock); |
77 | } | 77 | } |
78 | 78 | ||
79 | static enum htc_endpoint_id get_htc_epid(struct ath9k_htc_priv *priv, | ||
80 | u16 qnum) | ||
81 | { | ||
82 | enum htc_endpoint_id epid; | ||
83 | |||
84 | switch (qnum) { | ||
85 | case 0: | ||
86 | TX_QSTAT_INC(WME_AC_VO); | ||
87 | epid = priv->data_vo_ep; | ||
88 | break; | ||
89 | case 1: | ||
90 | TX_QSTAT_INC(WME_AC_VI); | ||
91 | epid = priv->data_vi_ep; | ||
92 | break; | ||
93 | case 2: | ||
94 | TX_QSTAT_INC(WME_AC_BE); | ||
95 | epid = priv->data_be_ep; | ||
96 | break; | ||
97 | case 3: | ||
98 | default: | ||
99 | TX_QSTAT_INC(WME_AC_BK); | ||
100 | epid = priv->data_bk_ep; | ||
101 | break; | ||
102 | } | ||
103 | |||
104 | return epid; | ||
105 | } | ||
106 | |||
79 | int ath_htc_txq_update(struct ath9k_htc_priv *priv, int qnum, | 107 | int ath_htc_txq_update(struct ath9k_htc_priv *priv, int qnum, |
80 | struct ath9k_tx_queue_info *qinfo) | 108 | struct ath9k_tx_queue_info *qinfo) |
81 | { | 109 | { |
@@ -113,7 +141,6 @@ int ath9k_htc_tx_start(struct ath9k_htc_priv *priv, | |||
113 | struct ath9k_htc_sta *ista; | 141 | struct ath9k_htc_sta *ista; |
114 | struct ath9k_htc_vif *avp = NULL; | 142 | struct ath9k_htc_vif *avp = NULL; |
115 | struct ath9k_htc_tx_ctl *tx_ctl; | 143 | struct ath9k_htc_tx_ctl *tx_ctl; |
116 | enum htc_endpoint_id epid; | ||
117 | u16 qnum; | 144 | u16 qnum; |
118 | __le16 fc; | 145 | __le16 fc; |
119 | u8 *tx_fhdr; | 146 | u8 *tx_fhdr; |
@@ -197,31 +224,12 @@ int ath9k_htc_tx_start(struct ath9k_htc_priv *priv, | |||
197 | 224 | ||
198 | if (is_cab) { | 225 | if (is_cab) { |
199 | CAB_STAT_INC; | 226 | CAB_STAT_INC; |
200 | epid = priv->cab_ep; | 227 | tx_ctl->epid = priv->cab_ep; |
201 | goto send; | 228 | goto send; |
202 | } | 229 | } |
203 | 230 | ||
204 | qnum = skb_get_queue_mapping(skb); | 231 | qnum = skb_get_queue_mapping(skb); |
205 | 232 | tx_ctl->epid = get_htc_epid(priv, qnum); | |
206 | switch (qnum) { | ||
207 | case 0: | ||
208 | TX_QSTAT_INC(WME_AC_VO); | ||
209 | epid = priv->data_vo_ep; | ||
210 | break; | ||
211 | case 1: | ||
212 | TX_QSTAT_INC(WME_AC_VI); | ||
213 | epid = priv->data_vi_ep; | ||
214 | break; | ||
215 | case 2: | ||
216 | TX_QSTAT_INC(WME_AC_BE); | ||
217 | epid = priv->data_be_ep; | ||
218 | break; | ||
219 | case 3: | ||
220 | default: | ||
221 | TX_QSTAT_INC(WME_AC_BK); | ||
222 | epid = priv->data_bk_ep; | ||
223 | break; | ||
224 | } | ||
225 | } else { | 233 | } else { |
226 | struct tx_mgmt_hdr mgmt_hdr; | 234 | struct tx_mgmt_hdr mgmt_hdr; |
227 | 235 | ||
@@ -251,10 +259,10 @@ int ath9k_htc_tx_start(struct ath9k_htc_priv *priv, | |||
251 | 259 | ||
252 | tx_fhdr = skb_push(skb, sizeof(mgmt_hdr)); | 260 | tx_fhdr = skb_push(skb, sizeof(mgmt_hdr)); |
253 | memcpy(tx_fhdr, (u8 *) &mgmt_hdr, sizeof(mgmt_hdr)); | 261 | memcpy(tx_fhdr, (u8 *) &mgmt_hdr, sizeof(mgmt_hdr)); |
254 | epid = priv->mgmt_ep; | 262 | tx_ctl->epid = priv->mgmt_ep; |
255 | } | 263 | } |
256 | send: | 264 | send: |
257 | return htc_send(priv->htc, skb, epid); | 265 | return htc_send(priv->htc, skb); |
258 | } | 266 | } |
259 | 267 | ||
260 | static bool ath9k_htc_check_tx_aggr(struct ath9k_htc_priv *priv, | 268 | static bool ath9k_htc_check_tx_aggr(struct ath9k_htc_priv *priv, |
diff --git a/drivers/net/wireless/ath/ath9k/htc_hst.c b/drivers/net/wireless/ath/ath9k/htc_hst.c index 6ee53de45c6..be87f4757bf 100644 --- a/drivers/net/wireless/ath/ath9k/htc_hst.c +++ b/drivers/net/wireless/ath/ath9k/htc_hst.c | |||
@@ -286,8 +286,16 @@ err: | |||
286 | return ret; | 286 | return ret; |
287 | } | 287 | } |
288 | 288 | ||
289 | int htc_send(struct htc_target *target, struct sk_buff *skb, | 289 | int htc_send(struct htc_target *target, struct sk_buff *skb) |
290 | enum htc_endpoint_id epid) | 290 | { |
291 | struct ath9k_htc_tx_ctl *tx_ctl; | ||
292 | |||
293 | tx_ctl = HTC_SKB_CB(skb); | ||
294 | return htc_issue_send(target, skb, skb->len, 0, tx_ctl->epid); | ||
295 | } | ||
296 | |||
297 | int htc_send_epid(struct htc_target *target, struct sk_buff *skb, | ||
298 | enum htc_endpoint_id epid) | ||
291 | { | 299 | { |
292 | return htc_issue_send(target, skb, skb->len, 0, epid); | 300 | return htc_issue_send(target, skb, skb->len, 0, epid); |
293 | } | 301 | } |
diff --git a/drivers/net/wireless/ath/ath9k/htc_hst.h b/drivers/net/wireless/ath/ath9k/htc_hst.h index 3531552672e..064a324b522 100644 --- a/drivers/net/wireless/ath/ath9k/htc_hst.h +++ b/drivers/net/wireless/ath/ath9k/htc_hst.h | |||
@@ -204,8 +204,9 @@ int htc_init(struct htc_target *target); | |||
204 | int htc_connect_service(struct htc_target *target, | 204 | int htc_connect_service(struct htc_target *target, |
205 | struct htc_service_connreq *service_connreq, | 205 | struct htc_service_connreq *service_connreq, |
206 | enum htc_endpoint_id *conn_rsp_eid); | 206 | enum htc_endpoint_id *conn_rsp_eid); |
207 | int htc_send(struct htc_target *target, struct sk_buff *skb, | 207 | int htc_send(struct htc_target *target, struct sk_buff *skb); |
208 | enum htc_endpoint_id eid); | 208 | int htc_send_epid(struct htc_target *target, struct sk_buff *skb, |
209 | enum htc_endpoint_id epid); | ||
209 | void htc_stop(struct htc_target *target); | 210 | void htc_stop(struct htc_target *target); |
210 | void htc_start(struct htc_target *target); | 211 | void htc_start(struct htc_target *target); |
211 | 212 | ||
diff --git a/drivers/net/wireless/ath/ath9k/wmi.c b/drivers/net/wireless/ath/ath9k/wmi.c index 83d1e0e5dd8..e66f6c33302 100644 --- a/drivers/net/wireless/ath/ath9k/wmi.c +++ b/drivers/net/wireless/ath/ath9k/wmi.c | |||
@@ -267,7 +267,7 @@ static int ath9k_wmi_cmd_issue(struct wmi *wmi, | |||
267 | hdr->command_id = cpu_to_be16(cmd); | 267 | hdr->command_id = cpu_to_be16(cmd); |
268 | hdr->seq_no = cpu_to_be16(++wmi->tx_seq_id); | 268 | hdr->seq_no = cpu_to_be16(++wmi->tx_seq_id); |
269 | 269 | ||
270 | return htc_send(wmi->htc, skb, wmi->ctrl_epid); | 270 | return htc_send_epid(wmi->htc, skb, wmi->ctrl_epid); |
271 | } | 271 | } |
272 | 272 | ||
273 | int ath9k_wmi_cmd(struct wmi *wmi, enum wmi_cmd_id cmd_id, | 273 | int ath9k_wmi_cmd(struct wmi *wmi, enum wmi_cmd_id cmd_id, |