[PATCH v6 03/10] ath10k: htc: move htc ctrl ep connect to htc_init
Erik Stromdahl
erik.stromdahl at gmail.com
Thu Mar 16 09:13:11 PDT 2017
On 2017-03-16 02:06, Ryan Hsu wrote:
> On 03/15/2017 08:45 AM, Kalle Valo wrote:
>
>> From: Erik Stromdahl <erik.stromdahl at gmail.com>
>>
>> This patch moves the HTC ctrl service connect from
>> htc_wait_target to htc_init.
>>
>> This is done in order to make sure the htc ctrl service
>> is setup properly before hif_start is called.
>>
>> The reason for this is that we want the HTC ctrl service
>> callback to be initialized before the target sends the
>> HTC ready message.
>>
>> The ready message will always be transmitted on endpoint 0
>> (which is always assigned to the HTC control service) so it
>> makes more sense if HTC control has been connected before the
>> ready message is received.
>>
>> Since the service to pipe mapping is done as a part of
>> the service connect, the get_default_pipe call is redundant
>> and was removed.
>>
>> Signed-off-by: Erik Stromdahl <erik.stromdahl at gmail.com>
>> Signed-off-by: Kalle Valo <kvalo at qca.qualcomm.com>
>> ---
>> drivers/net/wireless/ath/ath10k/htc.c | 39 ++++++++++++++-------------------
>> 1 file changed, 17 insertions(+), 22 deletions(-)
>>
>> diff --git a/drivers/net/wireless/ath/ath10k/htc.c b/drivers/net/wireless/ath/ath10k/htc.c
>> index fd5be4484984..92d5ac45327a 100644
>> --- a/drivers/net/wireless/ath/ath10k/htc.c
>> +++ b/drivers/net/wireless/ath/ath10k/htc.c
>> @@ -586,8 +586,6 @@ int ath10k_htc_wait_target(struct ath10k_htc *htc)
>> struct ath10k *ar = htc->ar;
>> int i, status = 0;
>> unsigned long time_left;
>> - struct ath10k_htc_svc_conn_req conn_req;
>> - struct ath10k_htc_svc_conn_resp conn_resp;
>> struct ath10k_htc_msg *msg;
>> u16 message_id;
>> u16 credit_count;
>> @@ -650,22 +648,6 @@ int ath10k_htc_wait_target(struct ath10k_htc *htc)
>> return -ECOMM;
>> }
>>
>> - /* setup our pseudo HTC control endpoint connection */
>> - memset(&conn_req, 0, sizeof(conn_req));
>> - memset(&conn_resp, 0, sizeof(conn_resp));
>> - conn_req.ep_ops.ep_tx_complete = ath10k_htc_control_tx_complete;
>> - conn_req.ep_ops.ep_rx_complete = ath10k_htc_control_rx_complete;
>> - conn_req.max_send_queue_depth = ATH10K_NUM_CONTROL_TX_BUFFERS;
>> - conn_req.service_id = ATH10K_HTC_SVC_ID_RSVD_CTRL;
>> -
>> - /* connect fake service */
>> - status = ath10k_htc_connect_service(htc, &conn_req, &conn_resp);
>> - if (status) {
>> - ath10k_err(ar, "could not connect to htc service (%d)\n",
>> - status);
>> - return status;
>> - }
>> -
>> return 0;
>> }
>>
>> @@ -875,8 +857,10 @@ int ath10k_htc_start(struct ath10k_htc *htc)
>> /* registered target arrival callback from the HIF layer */
>> int ath10k_htc_init(struct ath10k *ar)
>> {
>> - struct ath10k_htc_ep *ep = NULL;
>> + int status;
>> struct ath10k_htc *htc = &ar->htc;
>> + struct ath10k_htc_svc_conn_req conn_req;
>> + struct ath10k_htc_svc_conn_resp conn_resp;
>>
>> spin_lock_init(&htc->tx_lock);
>>
>> @@ -884,10 +868,21 @@ int ath10k_htc_init(struct ath10k *ar)
>>
>> htc->ar = ar;
>>
>> - /* Get HIF default pipe for HTC message exchange */
>> - ep = &htc->endpoint[ATH10K_HTC_EP_0];
>> + /* setup our pseudo HTC control endpoint connection */
>> + memset(&conn_req, 0, sizeof(conn_req));
>> + memset(&conn_resp, 0, sizeof(conn_resp));
>> + conn_req.ep_ops.ep_tx_complete = ath10k_htc_control_tx_complete;
>> + conn_req.ep_ops.ep_rx_complete = ath10k_htc_control_rx_complete;
>> + conn_req.max_send_queue_depth = ATH10K_NUM_CONTROL_TX_BUFFERS;
>> + conn_req.service_id = ATH10K_HTC_SVC_ID_RSVD_CTRL;
>>
>> - ath10k_hif_get_default_pipe(ar, &ep->ul_pipe_id, &ep->dl_pipe_id);
>> + /* connect fake service */
>> + status = ath10k_htc_connect_service(htc, &conn_req, &conn_resp);
>> + if (status) {
>> + ath10k_err(ar, "could not connect to htc service (%d)\n",
>> + status);
>> + return status;
>> + }
>>
>
> I haven't tracked down why, but just curious.
> ath10K-htc_connect_service() will use ath10k_htc_send() and ath10k_hif_tx interface to send data down.
> I am not sure if this is proper to just move it before ath10k_hif_init() is called, will have to check further...
>
The service connect of service 1 (ATH10K_HTC_SVC_ID_RSVD_CTRL) will not result in any bus
traffic (no ath10k_htc_send will be invoked).
ath10k_htc_connect_service has a special case for this service that assigns it to endpoint 0
always.
I initially had a comment about this in the commit log, but it "got lost" during some rebase...
>> init_completion(&htc->ctl_resp);
>>
>
> ath10k_htc_connect_service() will expect to use htc->ctrl_resp to synchronize.
> Though there is a reinit_completion() call inside that, but logically, you should still do the init_completion() before using it.
>
>
> _______________________________________________
> ath10k mailing list
> ath10k at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/ath10k
>
More information about the ath10k
mailing list