From patchwork Thu Oct 1 14:54:10 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Lamparter X-Patchwork-Id: 50977 Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by demeter.kernel.org (8.14.2/8.14.2) with ESMTP id n91EsRUo019300 for ; Thu, 1 Oct 2009 14:54:27 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751956AbZJAOyW (ORCPT ); Thu, 1 Oct 2009 10:54:22 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1751570AbZJAOyW (ORCPT ); Thu, 1 Oct 2009 10:54:22 -0400 Received: from mail-fx0-f227.google.com ([209.85.220.227]:39311 "EHLO mail-fx0-f227.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750706AbZJAOyV (ORCPT ); Thu, 1 Oct 2009 10:54:21 -0400 Received: by fxm27 with SMTP id 27so134407fxm.17 for ; Thu, 01 Oct 2009 07:54:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=gamma; h=domainkey-signature:received:received:received:from:to:subject:date :user-agent:cc:mime-version:content-type:content-transfer-encoding :message-id; bh=4C2Fx5zpPCaFI1T5/qhnq3TMOF91iU7WSUiIAoRS3KM=; b=J3c4K+g/05Lbm3dl+QTZJ8gGd/j2cuHrIp0i3X6H4S43boXA72sd1woDJqVjKztxp9 5obA5fsrPCMyVAP+uyfeYky2thIcnKdjOGUZUgvHO3hysGOgpxEpmTXyeutnPkfY066S YuShW11p6heVJQex2ELK3ConTkviSpgG/40Vo= DomainKey-Signature: a=rsa-sha1; c=nofws; d=googlemail.com; s=gamma; h=from:to:subject:date:user-agent:cc:mime-version:content-type :content-transfer-encoding:message-id; b=JnJ0KR1AVjIhQJePTpgv0DVBJEGMuqxiiC2dmA3zrCUoozEHxYzPV3Xqa8J8hGv3eV 07d0K9WCq3qCnJ05U0ZvQXCHcQb15QuyBLE0rywPaftXG7jBSc6IH/Oo+WaNlgwcwAUq zbx/fBMSNzPdEehYak6qrMtCtgTVBvpbBZOEM= Received: by 10.86.230.30 with SMTP id c30mr1248906fgh.68.1254408863169; Thu, 01 Oct 2009 07:54:23 -0700 (PDT) Received: from debian64.daheim (p5B16FCDC.dip.t-dialin.net [91.22.252.220]) by mx.google.com with ESMTPS id e11sm139104fga.18.2009.10.01.07.54.21 (version=TLSv1/SSLv3 cipher=RC4-MD5); Thu, 01 Oct 2009 07:54:22 -0700 (PDT) Received: from debian64.daheim ([192.168.0.4] helo=debian64.localnet ident=chuck) by debian64.daheim with esmtpsa (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.69) (envelope-from ) id 1MtN2x-0003A0-4i; Thu, 01 Oct 2009 16:54:19 +0200 From: Christian Lamparter To: Malte Gell Subject: Re: [PATCH] ar9170usb: LEDs are confused Date: Thu, 1 Oct 2009 16:54:10 +0200 User-Agent: KMail/1.12.1 (Linux/2.6.32-rc2-wl; KDE/4.3.1; x86_64; ; ) Cc: linux-wireless@vger.kernel.org, "Luis R. Rodriguez" , linville@tuxdriver.com MIME-Version: 1.0 Message-Id: <200910011654.10963.chunkeey@googlemail.com> Sender: linux-wireless-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org diff --git a/drivers/net/wireless/ath/ar9170/ar9170.h b/drivers/net/wireless/ath/ar9170/ar9170.h index ec034af..a451bb1 100644 --- a/drivers/net/wireless/ath/ar9170/ar9170.h +++ b/drivers/net/wireless/ath/ar9170/ar9170.h @@ -155,6 +155,12 @@ struct ar9170_sta_tid { #define AR9170_NUM_TX_STATUS 128 #define AR9170_NUM_TX_AGG_MAX 30 +enum ar9170_quirks { + AR9170_REQ_FW1_ONLY = BIT(0), + AR9170_ONLY_ONE_LED = BIT(1), + AR9170_SWAPPED_LEDS = BIT(2), +}; + struct ar9170 { struct ieee80211_hw *hw; struct ath_common common; @@ -241,6 +247,9 @@ struct ar9170 { /* (cached) HW A-MPDU settings */ u8 global_ampdu_density; u8 global_ampdu_factor; + + /* device quirks */ + unsigned long quirks; }; struct ar9170_sta_info { diff --git a/drivers/net/wireless/ath/ar9170/led.c b/drivers/net/wireless/ath/ar9170/led.c index 86c4e79..36ab738 100644 --- a/drivers/net/wireless/ath/ar9170/led.c +++ b/drivers/net/wireless/ath/ar9170/led.c @@ -155,18 +155,30 @@ void ar9170_unregister_leds(struct ar9170 *ar) cancel_delayed_work_sync(&ar->led_work); } +const static int std_led_map[AR9170_NUM_LEDS] = { 0, 1 }; +const static int avm_led_map[AR9170_NUM_LEDS] = { 1, 0 }; + int ar9170_register_leds(struct ar9170 *ar) { + const int *led_map; int err; + if (ar->quirks & AR9170_SWAPPED_LEDS) + led_map = avm_led_map; + else + led_map = std_led_map; + INIT_DELAYED_WORK(&ar->led_work, ar9170_update_leds); - err = ar9170_register_led(ar, 0, "tx", + err = ar9170_register_led(ar, led_map[0], "tx", ieee80211_get_tx_led_name(ar->hw)); if (err) goto fail; - err = ar9170_register_led(ar, 1, "assoc", + if (ar->quirks & AR9170_ONLY_ONE_LED) + return 0; + + err = ar9170_register_led(ar, led_map[1], "assoc", ieee80211_get_assoc_led_name(ar->hw)); if (err) goto fail; diff --git a/drivers/net/wireless/ath/ar9170/usb.c b/drivers/net/wireless/ath/ar9170/usb.c index e974e58..3be19e4 100644 --- a/drivers/net/wireless/ath/ar9170/usb.c +++ b/drivers/net/wireless/ath/ar9170/usb.c @@ -55,10 +55,6 @@ 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) }, @@ -73,7 +69,7 @@ static struct usb_device_id ar9170_usb_ids[] = { /* Netgear WNDA3100 */ { USB_DEVICE(0x0846, 0x9010) }, /* Netgear WN111 v2 */ - { USB_DEVICE(0x0846, 0x9001) }, + { USB_DEVICE(0x0846, 0x9001), .driver_info = AR9170_ONLY_ONE_LED }, /* Zydas ZD1221 */ { USB_DEVICE(0x0ace, 0x1221) }, /* ZyXEL NWD271N */ @@ -89,7 +85,7 @@ static struct usb_device_id ar9170_usb_ids[] = { /* IO-Data WNGDNUS2 */ { USB_DEVICE(0x04bb, 0x093f) }, /* AVM FRITZ!WLAN USB Stick N */ - { USB_DEVICE(0x057C, 0x8401) }, + { USB_DEVICE(0x057C, 0x8401), .driver_info = AR9170_SWAPPED_LEDS }, /* AVM FRITZ!WLAN USB Stick N 2.4 */ { USB_DEVICE(0x057C, 0x8402), .driver_info = AR9170_REQ_FW1_ONLY }, @@ -589,7 +585,7 @@ static int ar9170_usb_request_firmware(struct ar9170_usb *aru) return 0; } - if (aru->req_one_stage_fw) { + if (aru->common.quirks & AR9170_REQ_FW1_ONLY) { dev_err(&aru->udev->dev, "ar9170.fw firmware file " "not found and is required for this device\n"); return -EINVAL; @@ -753,15 +749,6 @@ 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) { @@ -781,8 +768,7 @@ static int ar9170_usb_probe(struct usb_interface *intf, aru->udev = udev; aru->intf = intf; ar = &aru->common; - - aru->req_one_stage_fw = ar9170_requires_one_stage(id); + ar->quirks = id->driver_info; usb_set_intfdata(intf, aru); SET_IEEE80211_DEV(ar->hw, &intf->dev); diff --git a/drivers/net/wireless/ath/ar9170/usb.h b/drivers/net/wireless/ath/ar9170/usb.h index d098f4d..714436d 100644 --- a/drivers/net/wireless/ath/ar9170/usb.h +++ b/drivers/net/wireless/ath/ar9170/usb.h @@ -64,8 +64,6 @@ struct ar9170_usb { struct usb_anchor tx_pending; struct usb_anchor tx_submitted; - bool req_one_stage_fw; - spinlock_t tx_urb_lock; unsigned int tx_submitted_urbs; unsigned int tx_pending_urbs;