Commit d67ee533 authored by Sujith Manoharan's avatar Sujith Manoharan Committed by John W. Linville

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: default avatarSujith Manoharan <Sujith.Manoharan@atheros.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 8e86a547
...@@ -276,6 +276,7 @@ struct ath9k_htc_tx { ...@@ -276,6 +276,7 @@ struct ath9k_htc_tx {
struct ath9k_htc_tx_ctl { struct ath9k_htc_tx_ctl {
u8 type; /* ATH9K_HTC_* */ u8 type; /* ATH9K_HTC_* */
u8 epid;
}; };
static inline struct ath9k_htc_tx_ctl *HTC_SKB_CB(struct sk_buff *skb) static inline struct ath9k_htc_tx_ctl *HTC_SKB_CB(struct sk_buff *skb)
......
...@@ -391,12 +391,13 @@ static void ath9k_htc_send_beacon(struct ath9k_htc_priv *priv, ...@@ -391,12 +391,13 @@ static void ath9k_htc_send_beacon(struct ath9k_htc_priv *priv,
memset(tx_ctl, 0, sizeof(*tx_ctl)); memset(tx_ctl, 0, sizeof(*tx_ctl));
tx_ctl->type = ATH9K_HTC_BEACON; tx_ctl->type = ATH9K_HTC_BEACON;
tx_ctl->epid = priv->beacon_ep;
beacon_hdr.vif_index = avp->index; beacon_hdr.vif_index = avp->index;
tx_fhdr = skb_push(beacon, sizeof(beacon_hdr)); tx_fhdr = skb_push(beacon, sizeof(beacon_hdr));
memcpy(tx_fhdr, (u8 *) &beacon_hdr, sizeof(beacon_hdr)); memcpy(tx_fhdr, (u8 *) &beacon_hdr, sizeof(beacon_hdr));
ret = htc_send(priv->htc, beacon, priv->beacon_ep); ret = htc_send(priv->htc, beacon);
if (ret != 0) { if (ret != 0) {
if (ret == -ENOMEM) { if (ret == -ENOMEM) {
ath_dbg(common, ATH_DBG_BSTUCK, ath_dbg(common, ATH_DBG_BSTUCK,
......
...@@ -76,6 +76,34 @@ void ath9k_htc_check_wake_queues(struct ath9k_htc_priv *priv) ...@@ -76,6 +76,34 @@ void ath9k_htc_check_wake_queues(struct ath9k_htc_priv *priv)
spin_unlock_bh(&priv->tx.tx_lock); spin_unlock_bh(&priv->tx.tx_lock);
} }
static enum htc_endpoint_id get_htc_epid(struct ath9k_htc_priv *priv,
u16 qnum)
{
enum htc_endpoint_id epid;
switch (qnum) {
case 0:
TX_QSTAT_INC(WME_AC_VO);
epid = priv->data_vo_ep;
break;
case 1:
TX_QSTAT_INC(WME_AC_VI);
epid = priv->data_vi_ep;
break;
case 2:
TX_QSTAT_INC(WME_AC_BE);
epid = priv->data_be_ep;
break;
case 3:
default:
TX_QSTAT_INC(WME_AC_BK);
epid = priv->data_bk_ep;
break;
}
return epid;
}
int ath_htc_txq_update(struct ath9k_htc_priv *priv, int qnum, int ath_htc_txq_update(struct ath9k_htc_priv *priv, int qnum,
struct ath9k_tx_queue_info *qinfo) struct ath9k_tx_queue_info *qinfo)
{ {
...@@ -113,7 +141,6 @@ int ath9k_htc_tx_start(struct ath9k_htc_priv *priv, ...@@ -113,7 +141,6 @@ int ath9k_htc_tx_start(struct ath9k_htc_priv *priv,
struct ath9k_htc_sta *ista; struct ath9k_htc_sta *ista;
struct ath9k_htc_vif *avp = NULL; struct ath9k_htc_vif *avp = NULL;
struct ath9k_htc_tx_ctl *tx_ctl; struct ath9k_htc_tx_ctl *tx_ctl;
enum htc_endpoint_id epid;
u16 qnum; u16 qnum;
__le16 fc; __le16 fc;
u8 *tx_fhdr; u8 *tx_fhdr;
...@@ -197,31 +224,12 @@ int ath9k_htc_tx_start(struct ath9k_htc_priv *priv, ...@@ -197,31 +224,12 @@ int ath9k_htc_tx_start(struct ath9k_htc_priv *priv,
if (is_cab) { if (is_cab) {
CAB_STAT_INC; CAB_STAT_INC;
epid = priv->cab_ep; tx_ctl->epid = priv->cab_ep;
goto send; goto send;
} }
qnum = skb_get_queue_mapping(skb); qnum = skb_get_queue_mapping(skb);
tx_ctl->epid = get_htc_epid(priv, qnum);
switch (qnum) {
case 0:
TX_QSTAT_INC(WME_AC_VO);
epid = priv->data_vo_ep;
break;
case 1:
TX_QSTAT_INC(WME_AC_VI);
epid = priv->data_vi_ep;
break;
case 2:
TX_QSTAT_INC(WME_AC_BE);
epid = priv->data_be_ep;
break;
case 3:
default:
TX_QSTAT_INC(WME_AC_BK);
epid = priv->data_bk_ep;
break;
}
} else { } else {
struct tx_mgmt_hdr mgmt_hdr; struct tx_mgmt_hdr mgmt_hdr;
...@@ -251,10 +259,10 @@ int ath9k_htc_tx_start(struct ath9k_htc_priv *priv, ...@@ -251,10 +259,10 @@ int ath9k_htc_tx_start(struct ath9k_htc_priv *priv,
tx_fhdr = skb_push(skb, sizeof(mgmt_hdr)); tx_fhdr = skb_push(skb, sizeof(mgmt_hdr));
memcpy(tx_fhdr, (u8 *) &mgmt_hdr, sizeof(mgmt_hdr)); memcpy(tx_fhdr, (u8 *) &mgmt_hdr, sizeof(mgmt_hdr));
epid = priv->mgmt_ep; tx_ctl->epid = priv->mgmt_ep;
} }
send: send:
return htc_send(priv->htc, skb, epid); return htc_send(priv->htc, skb);
} }
static bool ath9k_htc_check_tx_aggr(struct ath9k_htc_priv *priv, static bool ath9k_htc_check_tx_aggr(struct ath9k_htc_priv *priv,
......
...@@ -286,7 +286,15 @@ int htc_connect_service(struct htc_target *target, ...@@ -286,7 +286,15 @@ int htc_connect_service(struct htc_target *target,
return ret; return ret;
} }
int htc_send(struct htc_target *target, struct sk_buff *skb, int htc_send(struct htc_target *target, struct sk_buff *skb)
{
struct ath9k_htc_tx_ctl *tx_ctl;
tx_ctl = HTC_SKB_CB(skb);
return htc_issue_send(target, skb, skb->len, 0, tx_ctl->epid);
}
int htc_send_epid(struct htc_target *target, struct sk_buff *skb,
enum htc_endpoint_id epid) enum htc_endpoint_id epid)
{ {
return htc_issue_send(target, skb, skb->len, 0, epid); return htc_issue_send(target, skb, skb->len, 0, epid);
......
...@@ -204,8 +204,9 @@ int htc_init(struct htc_target *target); ...@@ -204,8 +204,9 @@ int htc_init(struct htc_target *target);
int htc_connect_service(struct htc_target *target, int htc_connect_service(struct htc_target *target,
struct htc_service_connreq *service_connreq, struct htc_service_connreq *service_connreq,
enum htc_endpoint_id *conn_rsp_eid); enum htc_endpoint_id *conn_rsp_eid);
int htc_send(struct htc_target *target, struct sk_buff *skb, int htc_send(struct htc_target *target, struct sk_buff *skb);
enum htc_endpoint_id eid); int htc_send_epid(struct htc_target *target, struct sk_buff *skb,
enum htc_endpoint_id epid);
void htc_stop(struct htc_target *target); void htc_stop(struct htc_target *target);
void htc_start(struct htc_target *target); void htc_start(struct htc_target *target);
......
...@@ -267,7 +267,7 @@ static int ath9k_wmi_cmd_issue(struct wmi *wmi, ...@@ -267,7 +267,7 @@ static int ath9k_wmi_cmd_issue(struct wmi *wmi,
hdr->command_id = cpu_to_be16(cmd); hdr->command_id = cpu_to_be16(cmd);
hdr->seq_no = cpu_to_be16(++wmi->tx_seq_id); hdr->seq_no = cpu_to_be16(++wmi->tx_seq_id);
return htc_send(wmi->htc, skb, wmi->ctrl_epid); return htc_send_epid(wmi->htc, skb, wmi->ctrl_epid);
} }
int ath9k_wmi_cmd(struct wmi *wmi, enum wmi_cmd_id cmd_id, int ath9k_wmi_cmd(struct wmi *wmi, enum wmi_cmd_id cmd_id,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment