linux-wireless.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Oleksij Rempel <linux@rempel-privat.de>
To: ath9k-devel@qca.qualcomm.com, kvalo@codeaurora.org,
	linux-wireless@vger.kernel.org
Subject: Re: [PATCH v2] ath9k_htc: introduce support for different fw versions
Date: Fri, 03 Jul 2015 06:07:29 +0200	[thread overview]
Message-ID: <55960A81.1040200@rempel-privat.de> (raw)
In-Reply-To: <1434394689-18781-1-git-send-email-linux@rempel-privat.de>

[-- Attachment #1: Type: text/plain, Size: 7287 bytes --]

Any updates here?

Am 15.06.2015 um 20:58 schrieb Oleksij Rempel:
> Current kernel support only one fw name with theoretically only one
> fw version. By replacing fw with other version we will break compatibility
> with older kernels.
> 
> To avoid this kind of regression this patch will reuse fw version model
> from iwlwifi driver.
> 
> Signed-off-by: Oleksij Rempel <linux@rempel-privat.de>
> ---
>  drivers/net/wireless/ath/ath9k/hif_usb.c      | 106 ++++++++++++++++++++------
>  drivers/net/wireless/ath/ath9k/hif_usb.h      |  21 ++++-
>  drivers/net/wireless/ath/ath9k/htc_drv_init.c |   4 +
>  3 files changed, 105 insertions(+), 26 deletions(-)
> 
> diff --git a/drivers/net/wireless/ath/ath9k/hif_usb.c b/drivers/net/wireless/ath/ath9k/hif_usb.c
> index 10c02f5..165dd20 100644
> --- a/drivers/net/wireless/ath/ath9k/hif_usb.c
> +++ b/drivers/net/wireless/ath/ath9k/hif_usb.c
> @@ -17,12 +17,8 @@
>  #include <asm/unaligned.h>
>  #include "htc.h"
>  
> -/* identify firmware images */
> -#define FIRMWARE_AR7010_1_1     "htc_7010.fw"
> -#define FIRMWARE_AR9271         "htc_9271.fw"
> -
> -MODULE_FIRMWARE(FIRMWARE_AR7010_1_1);
> -MODULE_FIRMWARE(FIRMWARE_AR9271);
> +MODULE_FIRMWARE(HTC_7010_MODULE_FW);
> +MODULE_FIRMWARE(HTC_9271_MODULE_FW);
>  
>  static struct usb_device_id ath9k_hif_usb_ids[] = {
>  	{ USB_DEVICE(0x0cf3, 0x9271) }, /* Atheros */
> @@ -1080,12 +1076,88 @@ static void ath9k_hif_usb_firmware_fail(struct hif_device_usb *hif_dev)
>  		device_unlock(parent);
>  }
>  
> +static void ath9k_hif_usb_firmware_cb(const struct firmware *fw, void *context);
> +
> +/* taken from iwlwifi */
> +static int ath9k_hif_request_firmware(struct hif_device_usb *hif_dev,
> +				      bool first)
> +{
> +	char index[8], *chip;
> +	int ret;
> +
> +	if (first) {
> +		if (htc_use_dev_fw) {
> +			hif_dev->fw_minor_index = FIRMWARE_MINOR_IDX_MAX + 1;
> +			sprintf(index, "%s", "dev");
> +		} else {
> +			hif_dev->fw_minor_index = FIRMWARE_MINOR_IDX_MAX;
> +			sprintf(index, "%d", hif_dev->fw_minor_index);
> +		}
> +	} else {
> +		hif_dev->fw_minor_index--;
> +		sprintf(index, "%d", hif_dev->fw_minor_index);
> +	}
> +
> +	/* test for FW 1.3 */
> +	if (MAJOR_VERSION_REQ == 1 && hif_dev->fw_minor_index == 3) {
> +		const char *filename;
> +
> +		if (IS_AR7010_DEVICE(hif_dev->usb_device_id->driver_info))
> +			filename = FIRMWARE_AR7010_1_1;
> +		else
> +			filename = FIRMWARE_AR9271;
> +
> +		/* expected fw locations:
> +		 * - htc_9271.fw   (stable version 1.3, depricated)
> +		 */
> +		snprintf(hif_dev->fw_name, sizeof(hif_dev->fw_name),
> +			 "%s", filename);
> +
> +	} else if (hif_dev->fw_minor_index < FIRMWARE_MINOR_IDX_MIN) {
> +		dev_err(&hif_dev->udev->dev, "no suitable firmware found!\n");
> +
> +		return -ENOENT;
> +	} else {
> +		if (IS_AR7010_DEVICE(hif_dev->usb_device_id->driver_info))
> +			chip = "7010";
> +		else
> +			chip = "9271";
> +
> +		/* expected fw locations:
> +		 * - ath9k_htc/htc_9271-1.dev.0.fw (development version)
> +		 * - ath9k_htc/htc_9271-1.4.0.fw   (stable version)
> +		 */
> +		snprintf(hif_dev->fw_name, sizeof(hif_dev->fw_name),
> +			 "%s/htc_%s-%d.%s.0.fw", HTC_FW_PATH,
> +			 chip, MAJOR_VERSION_REQ, index);
> +	}
> +
> +	ret = request_firmware_nowait(THIS_MODULE, true, hif_dev->fw_name,
> +				      &hif_dev->udev->dev, GFP_KERNEL,
> +				      hif_dev, ath9k_hif_usb_firmware_cb);
> +	if (ret) {
> +		dev_err(&hif_dev->udev->dev,
> +			"ath9k_htc: Async request for firmware %s failed\n",
> +			hif_dev->fw_name);
> +		return ret;
> +	}
> +
> +	dev_info(&hif_dev->udev->dev, "ath9k_htc: Firmware %s requested\n",
> +		 hif_dev->fw_name);
> +
> +	return ret;
> +}
> +
>  static void ath9k_hif_usb_firmware_cb(const struct firmware *fw, void *context)
>  {
>  	struct hif_device_usb *hif_dev = context;
>  	int ret;
>  
>  	if (!fw) {
> +		ret = ath9k_hif_request_firmware(hif_dev, false);
> +		if (!ret)
> +			return;
> +
>  		dev_err(&hif_dev->udev->dev,
>  			"ath9k_htc: Failed to get firmware %s\n",
>  			hif_dev->fw_name);
> @@ -1215,27 +1287,11 @@ static int ath9k_hif_usb_probe(struct usb_interface *interface,
>  
>  	init_completion(&hif_dev->fw_done);
>  
> -	/* Find out which firmware to load */
> -
> -	if (IS_AR7010_DEVICE(id->driver_info))
> -		hif_dev->fw_name = FIRMWARE_AR7010_1_1;
> -	else
> -		hif_dev->fw_name = FIRMWARE_AR9271;
> -
> -	ret = request_firmware_nowait(THIS_MODULE, true, hif_dev->fw_name,
> -				      &hif_dev->udev->dev, GFP_KERNEL,
> -				      hif_dev, ath9k_hif_usb_firmware_cb);
> -	if (ret) {
> -		dev_err(&hif_dev->udev->dev,
> -			"ath9k_htc: Async request for firmware %s failed\n",
> -			hif_dev->fw_name);
> +	ret = ath9k_hif_request_firmware(hif_dev, true);
> +	if (ret)
>  		goto err_fw_req;
> -	}
>  
> -	dev_info(&hif_dev->udev->dev, "ath9k_htc: Firmware %s requested\n",
> -		 hif_dev->fw_name);
> -
> -	return 0;
> +	return ret;
>  
>  err_fw_req:
>  	usb_set_intfdata(interface, NULL);
> diff --git a/drivers/net/wireless/ath/ath9k/hif_usb.h b/drivers/net/wireless/ath/ath9k/hif_usb.h
> index 51496e7..7c2ef7e 100644
> --- a/drivers/net/wireless/ath/ath9k/hif_usb.h
> +++ b/drivers/net/wireless/ath/ath9k/hif_usb.h
> @@ -17,8 +17,26 @@
>  #ifndef HTC_USB_H
>  #define HTC_USB_H
>  
> +/* old firmware images */
> +#define FIRMWARE_AR7010_1_1     "htc_7010.fw"
> +#define FIRMWARE_AR9271         "htc_9271.fw"
> +
> +/* supported Major FW version */
>  #define MAJOR_VERSION_REQ 1
>  #define MINOR_VERSION_REQ 3
> +/* minimal and maximal supported Minor FW version. */
> +#define FIRMWARE_MINOR_IDX_MAX  4
> +#define FIRMWARE_MINOR_IDX_MIN  3
> +#define HTC_FW_PATH	"ath9k_htc"
> +
> +#define HTC_9271_MODULE_FW  HTC_FW_PATH "/htc_9271-" \
> +			__stringify(MAJOR_VERSION_REQ) \
> +			"." __stringify(FIRMWARE_MINOR_IDX_MAX) ".0.fw"
> +#define HTC_7010_MODULE_FW  HTC_FW_PATH "/htc_7010-" \
> +			__stringify(MAJOR_VERSION_REQ) \
> +			"." __stringify(FIRMWARE_MINOR_IDX_MAX) ".0.fw"
> +
> +extern int htc_use_dev_fw;
>  
>  #define IS_AR7010_DEVICE(_v) (((_v) == AR9280_USB) || ((_v) == AR9287_USB))
>  
> @@ -101,7 +119,8 @@ struct hif_device_usb {
>  	struct usb_anchor reg_in_submitted;
>  	struct usb_anchor mgmt_submitted;
>  	struct sk_buff *remain_skb;
> -	const char *fw_name;
> +	char fw_name[32];
> +	int fw_minor_index;
>  	int rx_remain_len;
>  	int rx_pkt_len;
>  	int rx_transfer_len;
> diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_init.c b/drivers/net/wireless/ath/ath9k/htc_drv_init.c
> index 7468562..57ca9b6 100644
> --- a/drivers/net/wireless/ath/ath9k/htc_drv_init.c
> +++ b/drivers/net/wireless/ath/ath9k/htc_drv_init.c
> @@ -38,6 +38,10 @@ static int ath9k_ps_enable;
>  module_param_named(ps_enable, ath9k_ps_enable, int, 0444);
>  MODULE_PARM_DESC(ps_enable, "Enable WLAN PowerSave");
>  
> +int htc_use_dev_fw = 0;
> +module_param_named(use_dev_fw, htc_use_dev_fw, int, 0444);
> +MODULE_PARM_DESC(use_dev_fw, "Use development FW version");
> +
>  #ifdef CONFIG_MAC80211_LEDS
>  int ath9k_htc_led_blink = 1;
>  module_param_named(blink, ath9k_htc_led_blink, int, 0444);
> 


-- 
Regards,
Oleksij


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 213 bytes --]

  reply	other threads:[~2015-07-03  4:07 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-06-14 16:12 [PATCH] ath9k_htc: introduce support for different fw versions Oleksij Rempel
2015-06-14 23:27 ` Julian Calaby
2015-06-15 18:55   ` Oleksij Rempel
2015-06-15 18:57   ` Oleksij Rempel
2015-06-15 18:58   ` [PATCH v2] " Oleksij Rempel
2015-07-03  4:07     ` Oleksij Rempel [this message]
2015-07-03 10:53       ` Kalle Valo
2015-07-03 17:43         ` Oleksij Rempel
2015-07-12 12:17     ` Kalle Valo
2015-07-12 17:42       ` [PATCH v3] " Oleksij Rempel
2015-08-14  5:12       ` Oleksij Rempel
2015-09-06 10:55         ` Kalle Valo
2015-09-06 11:01           ` Oleksij Rempel
2015-09-06 13:16             ` Kalle Valo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=55960A81.1040200@rempel-privat.de \
    --to=linux@rempel-privat.de \
    --cc=ath9k-devel@qca.qualcomm.com \
    --cc=kvalo@codeaurora.org \
    --cc=linux-wireless@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).