aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorSujith Manoharan <Sujith.Manoharan@atheros.com>2011-04-13 01:55:35 -0400
committerJohn W. Linville <linville@tuxdriver.com>2011-04-13 15:23:46 -0400
commitd67ee5339363608adce786ec8fd62a0fb2b66116 (patch)
treed7e93c33d076806df49a8ec1e349348fc2eb08b9 /drivers/net
parent8e86a54715c4102a8ed697939de9ebd9715dc59c (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.h1
-rw-r--r--drivers/net/wireless/ath/ath9k/htc_drv_beacon.c3
-rw-r--r--drivers/net/wireless/ath/ath9k/htc_drv_txrx.c56
-rw-r--r--drivers/net/wireless/ath/ath9k/htc_hst.c12
-rw-r--r--drivers/net/wireless/ath/ath9k/htc_hst.h5
-rw-r--r--drivers/net/wireless/ath/ath9k/wmi.c2
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
277struct ath9k_htc_tx_ctl { 277struct ath9k_htc_tx_ctl {
278 u8 type; /* ATH9K_HTC_* */ 278 u8 type; /* ATH9K_HTC_* */
279 u8 epid;
279}; 280};
280 281
281static inline struct ath9k_htc_tx_ctl *HTC_SKB_CB(struct sk_buff *skb) 282static 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
79static 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
79int ath_htc_txq_update(struct ath9k_htc_priv *priv, int qnum, 107int 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 }
256send: 264send:
257 return htc_send(priv->htc, skb, epid); 265 return htc_send(priv->htc, skb);
258} 266}
259 267
260static bool ath9k_htc_check_tx_aggr(struct ath9k_htc_priv *priv, 268static 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
289int htc_send(struct htc_target *target, struct sk_buff *skb, 289int 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
297int 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);
204int htc_connect_service(struct htc_target *target, 204int 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);
207int htc_send(struct htc_target *target, struct sk_buff *skb, 207int htc_send(struct htc_target *target, struct sk_buff *skb);
208 enum htc_endpoint_id eid); 208int htc_send_epid(struct htc_target *target, struct sk_buff *skb,
209 enum htc_endpoint_id epid);
209void htc_stop(struct htc_target *target); 210void htc_stop(struct htc_target *target);
210void htc_start(struct htc_target *target); 211void 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
273int ath9k_wmi_cmd(struct wmi *wmi, enum wmi_cmd_id cmd_id, 273int ath9k_wmi_cmd(struct wmi *wmi, enum wmi_cmd_id cmd_id,