aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/b43/main.c
diff options
context:
space:
mode:
authorMichael Buesch <mb@bu3sch.de>2008-05-17 17:43:57 -0400
committerJohn W. Linville <linville@tuxdriver.com>2008-05-21 21:48:16 -0400
commit6821783271aaf541504ff8a138184fcc83fa282b (patch)
treeb072058ab48ae1aac079697872054700cd5bb4db /drivers/net/wireless/b43/main.c
parente48b0eeb0ab508021b654a45f332b30cac2163b9 (diff)
b43: Allow running without PCM firmware
This patch adds code to allow running the device without PCM firmware loaded. Without PCM firmware we don't have hardware accelerated crypto on devices with a core rev <= 10. Signed-off-by: Michael Buesch <mb@bu3sch.de> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/b43/main.c')
-rw-r--r--drivers/net/wireless/b43/main.c47
1 files changed, 36 insertions, 11 deletions
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c
index 656a1f04ad6e..6011747bb3b9 100644
--- a/drivers/net/wireless/b43/main.c
+++ b/drivers/net/wireless/b43/main.c
@@ -1908,7 +1908,8 @@ static void b43_print_fw_helptext(struct b43_wl *wl, bool error)
1908 1908
1909static int do_request_fw(struct b43_wldev *dev, 1909static int do_request_fw(struct b43_wldev *dev,
1910 const char *name, 1910 const char *name,
1911 struct b43_firmware_file *fw) 1911 struct b43_firmware_file *fw,
1912 bool silent)
1912{ 1913{
1913 char path[sizeof(modparam_fwpostfix) + 32]; 1914 char path[sizeof(modparam_fwpostfix) + 32];
1914 const struct firmware *blob; 1915 const struct firmware *blob;
@@ -1932,9 +1933,15 @@ static int do_request_fw(struct b43_wldev *dev,
1932 "b43%s/%s.fw", 1933 "b43%s/%s.fw",
1933 modparam_fwpostfix, name); 1934 modparam_fwpostfix, name);
1934 err = request_firmware(&blob, path, dev->dev->dev); 1935 err = request_firmware(&blob, path, dev->dev->dev);
1935 if (err) { 1936 if (err == -ENOENT) {
1936 b43err(dev->wl, "Firmware file \"%s\" not found " 1937 if (!silent) {
1937 "or load failed.\n", path); 1938 b43err(dev->wl, "Firmware file \"%s\" not found\n",
1939 path);
1940 }
1941 return err;
1942 } else if (err) {
1943 b43err(dev->wl, "Firmware file \"%s\" request failed (err=%d)\n",
1944 path, err);
1938 return err; 1945 return err;
1939 } 1946 }
1940 if (blob->size < sizeof(struct b43_fw_header)) 1947 if (blob->size < sizeof(struct b43_fw_header))
@@ -1985,7 +1992,7 @@ static int b43_request_firmware(struct b43_wldev *dev)
1985 filename = "ucode13"; 1992 filename = "ucode13";
1986 else 1993 else
1987 goto err_no_ucode; 1994 goto err_no_ucode;
1988 err = do_request_fw(dev, filename, &fw->ucode); 1995 err = do_request_fw(dev, filename, &fw->ucode, 0);
1989 if (err) 1996 if (err)
1990 goto err_load; 1997 goto err_load;
1991 1998
@@ -1996,8 +2003,13 @@ static int b43_request_firmware(struct b43_wldev *dev)
1996 filename = NULL; 2003 filename = NULL;
1997 else 2004 else
1998 goto err_no_pcm; 2005 goto err_no_pcm;
1999 err = do_request_fw(dev, filename, &fw->pcm); 2006 fw->pcm_request_failed = 0;
2000 if (err) 2007 err = do_request_fw(dev, filename, &fw->pcm, 1);
2008 if (err == -ENOENT) {
2009 /* We did not find a PCM file? Not fatal, but
2010 * core rev <= 10 must do without hwcrypto then. */
2011 fw->pcm_request_failed = 1;
2012 } else if (err)
2001 goto err_load; 2013 goto err_load;
2002 2014
2003 /* Get initvals */ 2015 /* Get initvals */
@@ -2028,7 +2040,7 @@ static int b43_request_firmware(struct b43_wldev *dev)
2028 default: 2040 default:
2029 goto err_no_initvals; 2041 goto err_no_initvals;
2030 } 2042 }
2031 err = do_request_fw(dev, filename, &fw->initvals); 2043 err = do_request_fw(dev, filename, &fw->initvals, 0);
2032 if (err) 2044 if (err)
2033 goto err_load; 2045 goto err_load;
2034 2046
@@ -2062,7 +2074,7 @@ static int b43_request_firmware(struct b43_wldev *dev)
2062 default: 2074 default:
2063 goto err_no_initvals; 2075 goto err_no_initvals;
2064 } 2076 }
2065 err = do_request_fw(dev, filename, &fw->initvals_band); 2077 err = do_request_fw(dev, filename, &fw->initvals_band, 0);
2066 if (err) 2078 if (err)
2067 goto err_load; 2079 goto err_load;
2068 2080
@@ -2186,14 +2198,20 @@ static int b43_upload_microcode(struct b43_wldev *dev)
2186 if (dev->fw.opensource) { 2198 if (dev->fw.opensource) {
2187 /* Patchlevel info is encoded in the "time" field. */ 2199 /* Patchlevel info is encoded in the "time" field. */
2188 dev->fw.patch = fwtime; 2200 dev->fw.patch = fwtime;
2189 b43info(dev->wl, "Loading OpenSource firmware version %u.%u\n", 2201 b43info(dev->wl, "Loading OpenSource firmware version %u.%u%s\n",
2190 dev->fw.rev, dev->fw.patch); 2202 dev->fw.rev, dev->fw.patch,
2203 dev->fw.pcm_request_failed ? " (Hardware crypto not supported)" : "");
2191 } else { 2204 } else {
2192 b43info(dev->wl, "Loading firmware version %u.%u " 2205 b43info(dev->wl, "Loading firmware version %u.%u "
2193 "(20%.2i-%.2i-%.2i %.2i:%.2i:%.2i)\n", 2206 "(20%.2i-%.2i-%.2i %.2i:%.2i:%.2i)\n",
2194 fwrev, fwpatch, 2207 fwrev, fwpatch,
2195 (fwdate >> 12) & 0xF, (fwdate >> 8) & 0xF, fwdate & 0xFF, 2208 (fwdate >> 12) & 0xF, (fwdate >> 8) & 0xF, fwdate & 0xFF,
2196 (fwtime >> 11) & 0x1F, (fwtime >> 5) & 0x3F, fwtime & 0x1F); 2209 (fwtime >> 11) & 0x1F, (fwtime >> 5) & 0x3F, fwtime & 0x1F);
2210 if (dev->fw.pcm_request_failed) {
2211 b43warn(dev->wl, "No \"pcm5.fw\" firmware file found. "
2212 "Hardware accelerated cryptography is disabled.\n");
2213 b43_print_fw_helptext(dev->wl, 0);
2214 }
2197 } 2215 }
2198 2216
2199 if (b43_is_old_txhdr_format(dev)) { 2217 if (b43_is_old_txhdr_format(dev)) {
@@ -3358,6 +3376,13 @@ static int b43_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
3358 if (!dev || b43_status(dev) < B43_STAT_INITIALIZED) 3376 if (!dev || b43_status(dev) < B43_STAT_INITIALIZED)
3359 goto out_unlock; 3377 goto out_unlock;
3360 3378
3379 if (dev->fw.pcm_request_failed) {
3380 /* We don't have firmware for the crypto engine.
3381 * Must use software-crypto. */
3382 err = -EOPNOTSUPP;
3383 goto out_unlock;
3384 }
3385
3361 err = -EINVAL; 3386 err = -EINVAL;
3362 switch (key->alg) { 3387 switch (key->alg) {
3363 case ALG_WEP: 3388 case ALG_WEP: