diff options
author | Michael Buesch <mb@bu3sch.de> | 2008-05-17 17:43:57 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2008-05-21 21:48:16 -0400 |
commit | 6821783271aaf541504ff8a138184fcc83fa282b (patch) | |
tree | b072058ab48ae1aac079697872054700cd5bb4db /drivers/net/wireless/b43/main.c | |
parent | e48b0eeb0ab508021b654a45f332b30cac2163b9 (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.c | 47 |
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 | ||
1909 | static int do_request_fw(struct b43_wldev *dev, | 1909 | static 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: |