ar9170: add AVM FRITZ devices
authorLuis R. Rodriguez <lrodriguez@atheros.com>
Thu, 28 May 2009 21:36:05 +0000 (17:36 -0400)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 3 Jun 2009 18:05:11 +0000 (14:05 -0400)
This adds:

USB 0x057C:0x8401       AVM FRITZ!WLAN USB Stick N
USB 0x057C:0x8402       AVM FRITZ!WLAN USB Stick N 2.4

These devices require the 1-stage firmware, if not present we
don't continue.

Cc: Peter Grabienski <Peter.Grabienski@Atheros.com>
Cc: Stephen Chen <Stephen.Chen@Atheros.com>
Cc: Michael Fortin <Michael.Fortin@Atheros.com>
Cc: Johnny Cheng <Johnny.Cheng@Atheros.com>
Cc: Yuan-Gu Wei <Yuan-Gu.Wei@atheros.com>
Cc: Joerg Albert <jal2@gmx.de>
Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ar9170/usb.c
drivers/net/wireless/ath/ar9170/usb.h

index 3c97c0985e2a7849772872e2065b0a992c75942c..71579e4d2fce6b8d6f608746d515aa8f40afce51 100644 (file)
@@ -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);
 
index ac42586495d8b5d32cfd6b2f052b26d82fd596f5..69f4bceb0af303d65c5cb221fa686e8a8b885f7e 100644 (file)
@@ -62,6 +62,8 @@ struct ar9170_usb {
        struct usb_anchor rx_submitted;
        struct usb_anchor tx_submitted;
 
+       bool req_one_stage_fw;
+
        spinlock_t cmdlock;
        struct completion cmd_wait;
        int readlen;