Return-path: Received: from mail-qw0-f46.google.com ([209.85.216.46]:39710 "EHLO mail-qw0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753303Ab1DKOgn (ORCPT ); Mon, 11 Apr 2011 10:36:43 -0400 Received: by qwk3 with SMTP id 3so3277636qwk.19 for ; Mon, 11 Apr 2011 07:36:42 -0700 (PDT) Message-ID: <4DA311F3.6010007@gmail.com> Date: Mon, 11 Apr 2011 10:36:35 -0400 From: Richard Farina MIME-Version: 1.0 To: Sujith CC: wireless Subject: Re: ath9k_htc oddity References: <4D9FCC70.1020805@gmail.com> <19871.62035.829719.402615@gargle.gargle.HOWL> In-Reply-To: <19871.62035.829719.402615@gargle.gargle.HOWL> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Sender: linux-wireless-owner@vger.kernel.org List-ID: On 04/09/11 01:44, Sujith wrote: > Richard Farina wrote: >> I've been using the ethool -i output a lot recently and have been very >> much enjoying it, however I've noticed some oddity. My ath9k_htc card, >> Ubiquiti Wifistation-EXT, doesn't have good output while using >> compat-wireless stable 2.6.39-rc1. >> >> flea scripts # ethtool -i wlan15 >> driver: usb >> version: 2.6.37-pentoo-r6-grsec >> firmware-version: N/A >> bus-info: 2-5 >> >> >> Not only is the driver listed incorrectly, but the firmware-version is >> not listed at all. Is it just me? > The driver name/bus-info is wrong because the wrong device pointer is used > when registering the wireless device. > > The firmware version is N/A because, well, the FW has no version. :) > > I have a patch queued up and ethtool show this now: > (This requires a FW update ...) > > sujith@atheros-dev ~ $ ethtool -i wlan0 > driver: ath9k_htc > version: 2.6.39-rc2-wl > firmware-version: 1.0 > bus-info: 1-3:1.0 The following commit causes extreme sadness: [ 4094.241243] usb 2-5: new high speed USB device using ehci_hcd and address 3 [ 4095.550452] usb 2-5: ath9k_htc: Transferred FW: ar9271.fw, size: 51312 [ 4095.816072] ath9k_htc 2-5:1.0: ath9k_htc: HTC initialized with 33 credits [ 4159.812888] usb 2-5: USB disconnect, address 3 [ 4159.929317] ath: Couldn't reset chip [ 4159.929321] ath: Unable to initialize hardware; initialization status: -5 [ 4159.929323] ath: Unable to initialize hardware; initialization status: -5 [ 4159.929340] Failed to initialize the device [ 4160.012603] ath9k_htc: probe of 2-5:1.0 failed with error -22 [ 4160.012771] usbcore: registered new interface driver ath9k_htc [ 4163.595059] usb 2-5: new high speed USB device using ehci_hcd and address 4 [ 4164.018920] usb 2-5: ath9k_htc: Transferred FW: ar9271.fw, size: 51312 [ 4164.284420] ath9k_htc 2-5:1.0: ath9k_htc: HTC initialized with 33 credits I'm guessing because I need the mentioned firmware update? Where can I get it? Or better yet can you (this is almost laughable considering the ralink thread right now) get it into linux-firmware? Or is the needed firmware update an unstable thing? Either way I can wait on the firmware-version fix but where can I find the patch that shows fixes the "driver: usb" issue? Your obviously shows properly :-) Thanks, Rick Farina > commit d3ce084bd9ce550d80fc0e92dd91393ca02d3429 > Author: Sujith Manoharan > Date: Wed Apr 6 09:23:50 2011 +0530 > > ath9k_htc: Add a WMI command to get the firmware version > > Also, update the wiphy information and use the correct > device pointer when registering. This would fix ethtool. > > Signed-off-by: Sujith Manoharan > > diff --git a/drivers/net/wireless/ath/ath9k/hif_usb.c b/drivers/net/wireless/ath/ath9k/hif_usb.c > index 23094b7..c81b2da 100644 > --- a/drivers/net/wireless/ath/ath9k/hif_usb.c > +++ b/drivers/net/wireless/ath/ath9k/hif_usb.c > @@ -1035,7 +1035,7 @@ static int ath9k_hif_usb_probe(struct usb_interface *interface, > } > > ret = ath9k_htc_hw_init(hif_dev->htc_handle, > - &hif_dev->udev->dev, hif_dev->device_id, > + &interface->dev, hif_dev->device_id, > hif_dev->udev->product, id->driver_info); > if (ret) { > ret = -EINVAL; > @@ -1153,7 +1153,7 @@ fail_resume: > #endif > > static struct usb_driver ath9k_hif_usb_driver = { > - .name = "ath9k_hif_usb", > + .name = KBUILD_MODNAME, > .probe = ath9k_hif_usb_probe, > .disconnect = ath9k_hif_usb_disconnect, > #ifdef CONFIG_PM > diff --git a/drivers/net/wireless/ath/ath9k/htc.h b/drivers/net/wireless/ath/ath9k/htc.h > index ec47be9..9544cd7 100644 > --- a/drivers/net/wireless/ath/ath9k/htc.h > +++ b/drivers/net/wireless/ath/ath9k/htc.h > @@ -388,6 +388,9 @@ struct ath9k_htc_priv { > struct htc_target *htc; > struct wmi *wmi; > > + u16 fw_version_major; > + u16 fw_version_minor; > + > enum htc_endpoint_id wmi_cmd_ep; > enum htc_endpoint_id beacon_ep; > enum htc_endpoint_id cab_ep; > diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_init.c b/drivers/net/wireless/ath/ath9k/htc_drv_init.c > index 8303b34..6bbfca5 100644 > --- a/drivers/net/wireless/ath/ath9k/htc_drv_init.c > +++ b/drivers/net/wireless/ath/ath9k/htc_drv_init.c > @@ -782,6 +782,32 @@ static void ath9k_set_hw_capab(struct ath9k_htc_priv *priv, > SET_IEEE80211_PERM_ADDR(hw, common->macaddr); > } > > +static int ath9k_init_firmware_version(struct ath9k_htc_priv *priv) > +{ > + struct ieee80211_hw *hw = priv->hw; > + struct wmi_fw_version cmd_rsp; > + int ret; > + > + memset(&cmd_rsp, 0, sizeof(cmd_rsp)); > + > + WMI_CMD(WMI_GET_FW_VERSION); > + if (ret) > + return -EINVAL; > + > + priv->fw_version_major = be16_to_cpu(cmd_rsp.major); > + priv->fw_version_minor = be16_to_cpu(cmd_rsp.minor); > + > + snprintf(hw->wiphy->fw_version, ETHTOOL_BUSINFO_LEN, "%d.%d", > + priv->fw_version_major, > + priv->fw_version_minor); > + > + dev_info(priv->dev, "ath9k_htc: FW Version: %d.%d\n", > + priv->fw_version_major, > + priv->fw_version_minor); > + > + return 0; > +} > + > static int ath9k_init_device(struct ath9k_htc_priv *priv, > u16 devid, char *product, u32 drv_info) > { > @@ -801,6 +827,10 @@ static int ath9k_init_device(struct ath9k_htc_priv *priv, > common = ath9k_hw_common(ah); > ath9k_set_hw_capab(priv, hw); > > + error = ath9k_init_firmware_version(priv); > + if (error != 0) > + goto err_fw; > + > /* Initialize regulatory */ > error = ath_regd_init(&common->regulatory, priv->hw->wiphy, > ath9k_reg_notifier); > @@ -861,6 +891,8 @@ err_rx: > err_tx: > /* Nothing */ > err_regd: > + /* Nothing */ > +err_fw: > ath9k_deinit_priv(priv); > err_init: > return error; > diff --git a/drivers/net/wireless/ath/ath9k/wmi.c b/drivers/net/wireless/ath/ath9k/wmi.c > index d3d2490..267a98f 100644 > --- a/drivers/net/wireless/ath/ath9k/wmi.c > +++ b/drivers/net/wireless/ath/ath9k/wmi.c > @@ -23,6 +23,8 @@ static const char *wmi_cmd_to_name(enum wmi_cmd_id wmi_cmd) > return "WMI_ECHO_CMDID"; > case WMI_ACCESS_MEMORY_CMDID: > return "WMI_ACCESS_MEMORY_CMDID"; > + case WMI_GET_FW_VERSION: > + return "WMI_GET_FW_VERSION"; > case WMI_DISABLE_INTR_CMDID: > return "WMI_DISABLE_INTR_CMDID"; > case WMI_ENABLE_INTR_CMDID: > diff --git a/drivers/net/wireless/ath/ath9k/wmi.h b/drivers/net/wireless/ath/ath9k/wmi.h > index 4208427..6a36572 100644 > --- a/drivers/net/wireless/ath/ath9k/wmi.h > +++ b/drivers/net/wireless/ath/ath9k/wmi.h > @@ -31,11 +31,17 @@ struct wmi_cmd_hdr { > __be16 seq_no; > } __packed; > > +struct wmi_fw_version { > + __be16 major; > + __be16 minor; > + > +} __packed; > enum wmi_cmd_id { > WMI_ECHO_CMDID = 0x0001, > WMI_ACCESS_MEMORY_CMDID, > > /* Commands to Target */ > + WMI_GET_FW_VERSION, > WMI_DISABLE_INTR_CMDID, > WMI_ENABLE_INTR_CMDID, > WMI_RX_LINK_CMDID, > > >