On Mon, Jun 10, 2013 at 08:55:56AM +0200, Oleksij Rempel wrote:
> Hello all,
> 
> i'm working on usb_autosuspend for ath9k_htc and triggered this
> oops. Currently i do not know if real bug is in ath9k_htc or in
> xhci. Same adapter with same kernel and my patches work fine on ehci
> host... so may be it is xhci.

Which kernel version is this oops on?  I suspect it's an xHCI issue.

Please turn on CONFIG_USB_XHCI_HCD_DEBUGGING and CONFIG_USB_DEBUG and
send me dmesg, from the beginning of connecting the device to when it is
suspended and then resumed.  That will be a lot of output, so feel free
to compress it.

Sarah Sharp

> i get oops on this line:
> 426   static void ring_doorbell_for_active_rings(struct xhci_hcd *xhci,
> 427                   unsigned int slot_id,
> 428                   unsigned int ep_index)
> 429   {
> 430           unsigned int stream_id;
> 431           struct xhci_virt_ep *ep;
> 432   
> 433           ep = &xhci->devs[slot_id]->eps[ep_index];
> ^^^             ^^^^^^^^^^^^^^^^^^^^^^^
> 
> changes for ath9k_htc are in attachment and photo of oops here:
> https://plus.google.com/u/0/102032716864870215256/posts/a9d8nFsLhYK
> -- 
> Regards,
> Oleksij

> diff --git a/drivers/net/wireless/ath/ath9k/hif_usb.c 
> b/drivers/net/wireless/ath/ath9k/hif_usb.c
> index f5dda84..3d74575 100644
> --- a/drivers/net/wireless/ath/ath9k/hif_usb.c
> +++ b/drivers/net/wireless/ath/ath9k/hif_usb.c
> @@ -1368,6 +1368,7 @@ static struct usb_driver ath9k_hif_usb_driver = {
>       .suspend = ath9k_hif_usb_suspend,
>       .resume = ath9k_hif_usb_resume,
>       .reset_resume = ath9k_hif_usb_resume,
> +     .supports_autosuspend = 1,
>  #endif
>       .id_table = ath9k_hif_usb_ids,
>       .soft_unbind = 1,
> diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_main.c 
> b/drivers/net/wireless/ath/ath9k/htc_drv_main.c
> index 0743a47..20be8a1 100644
> --- a/drivers/net/wireless/ath/ath9k/htc_drv_main.c
> +++ b/drivers/net/wireless/ath/ath9k/htc_drv_main.c
> @@ -905,6 +905,7 @@ static int ath9k_htc_start(struct ieee80211_hw *hw)
>       struct ath_hw *ah = priv->ah;
>       struct ath_common *common = ath9k_hw_common(ah);
>       struct ieee80211_channel *curchan = hw->conf.chandef.chan;
> +     struct hif_device_usb *hif_dev = priv->htc->hif_dev;
>       struct ath9k_channel *init_channel;
>       int ret = 0;
>       enum htc_phymode mode;
> @@ -917,6 +918,14 @@ static int ath9k_htc_start(struct ieee80211_hw *hw)
>               "Starting driver with initial channel: %d MHz\n",
>               curchan->center_freq);
>  
> +     ret = usb_autopm_get_interface(hif_dev->interface);
> +     if (ret < 0) {
> +             ath_err(common,
> +                     "Unable wake up hardware\n");
> +             mutex_unlock(&priv->mutex);
> +             return ret;
> +     }
> +
>       /* Ensure that HW is awake before flushing RX */
>       ath9k_htc_setpower(priv, ATH9K_PM_AWAKE);
>       WMI_CMD(WMI_FLUSH_RECV_CMDID);
> @@ -972,6 +981,7 @@ static void ath9k_htc_stop(struct ieee80211_hw *hw)
>  {
>       struct ath9k_htc_priv *priv = hw->priv;
>       struct ath_hw *ah = priv->ah;
> +     struct hif_device_usb *hif_dev = priv->htc->hif_dev;
>       struct ath_common *common = ath9k_hw_common(ah);
>       int ret __attribute__ ((unused));
>       u8 cmd_rsp;
> @@ -1022,6 +1032,8 @@ static void ath9k_htc_stop(struct ieee80211_hw *hw)
>  
>       set_bit(OP_INVALID, &priv->op_flags);
>  
> +     usb_autopm_put_interface(hif_dev->interface);
> +
>       ath_dbg(common, CONFIG, "Driver halt\n");
>       mutex_unlock(&priv->mutex);
>  }
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to