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@xxxxxxxxxxxxxxxx> > --- > 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:
signature.asc
Description: OpenPGP digital signature