ath9k-htc:respect usb buffer cacheline alignment in reg out path
PATCH v2 3/4 ath9k-htc:respect usb buffer cacheline alignment in reg out path
From: Ming Lei <[email protected]>
In ath9k-htc register out path, ath9k-htc will pass skb->data into usb hcd and usb hcd will do dma mapping and unmapping to the buffer pointed by skb->data, so we should pass a cache-line aligned address.
This patch replace __dev_alloc_skb with alloc_skb to make skb->data pointed to a cacheline aligned address simply since ath9k-htc does not skb_push on the skb and pass it to mac80211, also use kfree_skb to free the skb allocated by alloc_skb(we can use kfree_skb safely in hardirq context since skb->destructor is NULL always in the path).
Signed-off-by Sujith <[email protected]>
Signed-off-by Ming Lei <[email protected]>
--- drivers/net/wireless/ath/ath9k/hif_usb.c | 2 +- drivers/net/wireless/ath/ath9k/htc_hst.c | 21 ++++++++++++--------- drivers/net/wireless/ath/ath9k/wmi.c | 6 +++--- 3 files changed, 16 insertions(+), 13 deletions(-)
drivers/net/wireless/ath/ath9k/hif_usb.c +1 -1
@@ -53,7 +53,7 @@ static void hif_usb_regout_cb(struct urb *urb)return ; free: -dev_kfree_skb_any (cmd->skb); +kfree_skb (cmd->skb);kfree (cmd); }
drivers/net/wireless/ath/ath9k/htc_hst.c +12 -9
@@ -146,7 +146,7 @@ static int htc_config_pipe_credits(struct htc_target *target)struct htc_config_pipe_msg *cp_msg;int ret, time_left; - skb =dev_alloc_skb (50 +sizeof (struct htc_frame_hdr )); + skb =alloc_skb (50 +sizeof (struct htc_frame_hdr ),GFP_ATOMIC );if (!skb) {dev_err (target->dev,"failed to allocate send buffer\n" );return -ENOMEM ;
@@ -174,7 +174,7 @@ static int htc_config_pipe_credits(struct htc_target *target)return 0 ; err: -dev_kfree_skb (skb); +kfree_skb (skb);return -EINVAL ; }
@@ -184,7 +184,7 @@ static int htc_setup_complete(struct htc_target *target)struct htc_comp_msg *comp_msg;int ret =0 , time_left; - skb =dev_alloc_skb (50 +sizeof (struct htc_frame_hdr )); + skb =alloc_skb (50 +sizeof (struct htc_frame_hdr ),GFP_ATOMIC );if (!skb) {dev_err (target->dev,"failed to allocate send buffer\n" );return -ENOMEM ;
@@ -210,7 +210,7 @@ static int htc_setup_complete(struct htc_target *target)return 0 ; err: -dev_kfree_skb (skb); +kfree_skb (skb);return -EINVAL ; }
@@ -250,8 +250,8 @@ int htc_connect_service(struct htc_target *target, endpoint->dl_pipeid =service_to_dlpipe (service_connreq->service_id); endpoint->ep_callbacks = service_connreq->ep_callbacks; - skb =dev_alloc_skb (sizeof (struct htc_conn_svc_msg ) + -sizeof (struct htc_frame_hdr )); + skb =alloc_skb (sizeof (struct htc_conn_svc_msg ) + +sizeof (struct htc_frame_hdr ),GFP_ATOMIC );if (!skb) {dev_err (target->dev,"Failed to allocate buf to send" "service connect req\n" );
@@ -282,7 +282,7 @@ int htc_connect_service(struct htc_target *target, *conn_rsp_epid = target->conn_rsp_epid;return 0 ; err: -dev_kfree_skb (skb); +kfree_skb (skb);return ret; }
@@ -321,7 +321,7 @@ void ath9k_htc_txcompletion_cb(struct htc_target *htc_handle, struct sk_buff *skb, bool txok) {struct htc_endpoint *endpoint; -struct htc_frame_hdr *htc_hdr; +struct htc_frame_hdr *htc_hdr =NULL ;if (htc_handle->htc_flags &HTC_OP_CONFIG_PIPE_CREDITS ) {complete (&htc_handle->cmd_wait);
@@ -349,7 +349,10 @@ void ath9k_htc_txcompletion_cb(struct htc_target *htc_handle,return ; ret:/* HTC-generated packets are freed here. */ -dev_kfree_skb_any (skb); +if (htc_hdr && htc_hdr->endpoint_id !=ENDPOINT0 ) +dev_kfree_skb_any (skb); +else +kfree_skb (skb); }/*
drivers/net/wireless/ath/ath9k/wmi.c +3 -3
@@ -213,7 +213,7 @@ free_skb:static void ath9k_wmi_ctrl_tx (void *priv,struct sk_buff *skb,enum htc_endpoint_id epid,bool txok) { -dev_kfree_skb_any (skb); +kfree_skb (skb); } int ath9k_wmi_connect(struct htc_target *htc, struct wmi *wmi,
@@ -269,7 +269,7 @@ int ath9k_wmi_cmd(struct wmi *wmi, enum wmi_cmd_id cmd_id,if (!wmi)return -EINVAL ; - skb =dev_alloc_skb (headroom + cmd_len); + skb =alloc_skb (headroom + cmd_len,GFP_ATOMIC );if (!skb)return -ENOMEM ;
@@ -313,7 +313,7 @@ out:ath_print (common,ATH_DBG_WMI ,"WMI failure for: %s\n" ,wmi_cmd_to_name (cmd_id));mutex_unlock (&wmi->op_mutex); -dev_kfree_skb_any (skb); +kfree_skb (skb);return ret; }
Signature · 1 line
1.6.2.5