|
@@ -55,6 +55,10 @@ MODULE_FIRMWARE("ar9170.fw");
|
|
|
MODULE_FIRMWARE("ar9170-1.fw");
|
|
|
MODULE_FIRMWARE("ar9170-2.fw");
|
|
|
|
|
|
+enum ar9170_requirements {
|
|
|
+ AR9170_REQ_FW1_ONLY = 1,
|
|
|
+};
|
|
|
+
|
|
|
static struct usb_device_id ar9170_usb_ids[] = {
|
|
|
/* Atheros 9170 */
|
|
|
{ USB_DEVICE(0x0cf3, 0x9170) },
|
|
@@ -82,6 +86,10 @@ static struct usb_device_id ar9170_usb_ids[] = {
|
|
|
{ USB_DEVICE(0x2019, 0x5304) },
|
|
|
/* IO-Data WNGDNUS2 */
|
|
|
{ USB_DEVICE(0x04bb, 0x093f) },
|
|
|
+ /* AVM FRITZ!WLAN USB Stick N */
|
|
|
+ { USB_DEVICE(0x057C, 0x8401) },
|
|
|
+ /* AVM FRITZ!WLAN USB Stick N 2.4 */
|
|
|
+ { USB_DEVICE(0x057C, 0x8402), .driver_info = AR9170_REQ_FW1_ONLY },
|
|
|
|
|
|
/* terminate */
|
|
|
{}
|
|
@@ -512,6 +520,12 @@ static int ar9170_usb_request_firmware(struct ar9170_usb *aru)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+ if (aru->req_one_stage_fw) {
|
|
|
+ dev_err(&aru->udev->dev, "ar9170.fw firmware file "
|
|
|
+ "not found and is required for this device\n");
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
dev_err(&aru->udev->dev, "ar9170.fw firmware file "
|
|
|
"not found, trying old firmware...\n");
|
|
|
|
|
@@ -668,6 +682,15 @@ err_out:
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
+static bool ar9170_requires_one_stage(const struct usb_device_id *id)
|
|
|
+{
|
|
|
+ if (!id->driver_info)
|
|
|
+ return false;
|
|
|
+ if (id->driver_info == AR9170_REQ_FW1_ONLY)
|
|
|
+ return true;
|
|
|
+ return false;
|
|
|
+}
|
|
|
+
|
|
|
static int ar9170_usb_probe(struct usb_interface *intf,
|
|
|
const struct usb_device_id *id)
|
|
|
{
|
|
@@ -688,6 +711,8 @@ static int ar9170_usb_probe(struct usb_interface *intf,
|
|
|
aru->intf = intf;
|
|
|
ar = &aru->common;
|
|
|
|
|
|
+ aru->req_one_stage_fw = ar9170_requires_one_stage(id);
|
|
|
+
|
|
|
usb_set_intfdata(intf, aru);
|
|
|
SET_IEEE80211_DEV(ar->hw, &udev->dev);
|
|
|
|