From patchwork Wed Jun 23 10:57:15 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ondrej Zary X-Patchwork-Id: 107614 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter.kernel.org (8.14.4/8.14.3) with ESMTP id o5NAvQeJ010006 for ; Wed, 23 Jun 2010 10:57:27 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752294Ab0FWK5Z (ORCPT ); Wed, 23 Jun 2010 06:57:25 -0400 Received: from mail1-out1.atlantis.sk ([80.94.52.55]:38908 "EHLO mail.atlantis.sk" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751940Ab0FWK5Y (ORCPT ); Wed, 23 Jun 2010 06:57:24 -0400 Received: (qmail 28438 invoked from network); 23 Jun 2010 10:57:20 -0000 Received: from unknown (HELO ?192.168.0.3?) (rainbow@rainbow-software.org@62.176.172.51) by mail.atlantis.sk with AES256-SHA encrypted SMTP; 23 Jun 2010 10:57:20 -0000 From: Ondrej Zary To: Gertjan van Wingerde Subject: [PATCH] rt2500usb: fallback to SW encryption for TKIP+AES Date: Wed, 23 Jun 2010 12:57:15 +0200 User-Agent: KMail/1.9.10 Cc: Ivo Van Doorn , rt2x00 Users List , linux-wireless@vger.kernel.org References: <201006221238.32745.linux@rainbow-software.org> <4C211076.9060804@gmail.com> <201006222346.06150.linux@rainbow-software.org> In-Reply-To: <201006222346.06150.linux@rainbow-software.org> MIME-Version: 1.0 Content-Disposition: inline Message-Id: <201006231257.17684.linux@rainbow-software.org> Sender: linux-wireless-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter.kernel.org [140.211.167.41]); Wed, 23 Jun 2010 10:57:27 +0000 (UTC) diff -urp linux-2.6.35-rc3-orig/drivers/net/wireless/rt2x00/rt2500usb.c linux-2.6.35-rc3/drivers/net/wireless/rt2x00/rt2500usb.c --- linux-2.6.35-rc3-orig/drivers/net/wireless/rt2x00/rt2500usb.c 2010-06-12 04:14:04.000000000 +0200 +++ linux-2.6.35-rc3/drivers/net/wireless/rt2x00/rt2500usb.c 2010-06-23 12:18:43.000000000 +0200 @@ -348,6 +348,7 @@ static int rt2500usb_config_key(struct r int timeout; u32 mask; u16 reg; + enum cipher curr_cipher; if (crypto->cmd == SET_KEY) { /* @@ -358,6 +359,7 @@ static int rt2500usb_config_key(struct r mask = TXRX_CSR0_KEY_ID.bit_mask; rt2500usb_register_read(rt2x00dev, TXRX_CSR0, ®); + curr_cipher = rt2x00_get_field16(reg, TXRX_CSR0_ALGORITHM); reg &= mask; if (reg && reg == mask) @@ -366,6 +368,14 @@ static int rt2500usb_config_key(struct r reg = rt2x00_get_field16(reg, TXRX_CSR0_KEY_ID); key->hw_key_idx += reg ? ffz(reg) : 0; + /* + * Hardware requires that all keys use the same cipher + * (e.g. TKIP-only, AES-only, but not TKIP+AES). + * If this is not the first key, compare the cipher with the + * first one and fall back to SW crypto if not the same. + */ + if (key->hw_key_idx > 0 && crypto->cipher != curr_cipher) + return -EOPNOTSUPP; /* * The encryption key doesn't fit within the CSR cache,