diff options
author | Takashi Iwai <tiwai@suse.de> | 2007-08-21 09:20:26 -0400 |
---|---|---|
committer | Jaroslav Kysela <perex@perex.cz> | 2007-10-16 09:59:22 -0400 |
commit | c2b1239a9f22f19c53543b460b24507d0e21ea0c (patch) | |
tree | 6378247be17a1cf8884b03ea189f25d3ebb3a7a9 /sound/isa/wavefront | |
parent | 33bf17abf98087d7a6eec9476cd767c6e998fc05 (diff) |
[ALSA] wavefront - Use standard firmware loader
Use the standard firmware loader for loading ICS2115 OS firmware file.
This is the last old bad guy that is still using sys_open() and sys_read()
calls, and now all should be gone.
The patch also adds the missing description of module options related
with wavefront_synth.c.
Due to this rewrite, user will have to copy or make symlink the firmware
file appropriately to the standard firmware path such as /lib/firmware.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Jaroslav Kysela <perex@suse.cz>
Diffstat (limited to 'sound/isa/wavefront')
-rw-r--r-- | sound/isa/wavefront/wavefront_synth.c | 120 |
1 files changed, 43 insertions, 77 deletions
diff --git a/sound/isa/wavefront/wavefront_synth.c b/sound/isa/wavefront/wavefront_synth.c index bacc51c86587..2da11e8337dd 100644 --- a/sound/isa/wavefront/wavefront_synth.c +++ b/sound/isa/wavefront/wavefront_synth.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <linux/delay.h> | 27 | #include <linux/delay.h> |
28 | #include <linux/time.h> | 28 | #include <linux/time.h> |
29 | #include <linux/wait.h> | 29 | #include <linux/wait.h> |
30 | #include <linux/firmware.h> | ||
30 | #include <linux/moduleparam.h> | 31 | #include <linux/moduleparam.h> |
31 | #include <sound/core.h> | 32 | #include <sound/core.h> |
32 | #include <sound/snd_wavefront.h> | 33 | #include <sound/snd_wavefront.h> |
@@ -53,9 +54,8 @@ static int debug_default = 0; /* you can set this to control debugging | |||
53 | 54 | ||
54 | /* XXX this needs to be made firmware and hardware version dependent */ | 55 | /* XXX this needs to be made firmware and hardware version dependent */ |
55 | 56 | ||
56 | static char *ospath = "/etc/sound/wavefront.os"; /* where to find a processed | 57 | #define DEFAULT_OSPATH "wavefront.os" |
57 | version of the WaveFront OS | 58 | static char *ospath = DEFAULT_OSPATH; /* the firmware file name */ |
58 | */ | ||
59 | 59 | ||
60 | static int wait_usecs = 150; /* This magic number seems to give pretty optimal | 60 | static int wait_usecs = 150; /* This magic number seems to give pretty optimal |
61 | throughput based on my limited experimentation. | 61 | throughput based on my limited experimentation. |
@@ -97,7 +97,7 @@ MODULE_PARM_DESC(sleep_interval, "how long to sleep when waiting for reply"); | |||
97 | module_param(sleep_tries, int, 0444); | 97 | module_param(sleep_tries, int, 0444); |
98 | MODULE_PARM_DESC(sleep_tries, "how many times to try sleeping during a wait"); | 98 | MODULE_PARM_DESC(sleep_tries, "how many times to try sleeping during a wait"); |
99 | module_param(ospath, charp, 0444); | 99 | module_param(ospath, charp, 0444); |
100 | MODULE_PARM_DESC(ospath, "full pathname to processed ICS2115 OS firmware"); | 100 | MODULE_PARM_DESC(ospath, "pathname to processed ICS2115 OS firmware"); |
101 | module_param(reset_time, int, 0444); | 101 | module_param(reset_time, int, 0444); |
102 | MODULE_PARM_DESC(reset_time, "how long to wait for a reset to take effect"); | 102 | MODULE_PARM_DESC(reset_time, "how long to wait for a reset to take effect"); |
103 | module_param(ramcheck_time, int, 0444); | 103 | module_param(ramcheck_time, int, 0444); |
@@ -1938,111 +1938,75 @@ wavefront_reset_to_cleanliness (snd_wavefront_t *dev) | |||
1938 | return (1); | 1938 | return (1); |
1939 | } | 1939 | } |
1940 | 1940 | ||
1941 | #include <linux/fs.h> | ||
1942 | #include <linux/mm.h> | ||
1943 | #include <linux/slab.h> | ||
1944 | #include <linux/unistd.h> | ||
1945 | #include <linux/syscalls.h> | ||
1946 | #include <asm/uaccess.h> | ||
1947 | |||
1948 | |||
1949 | static int __devinit | 1941 | static int __devinit |
1950 | wavefront_download_firmware (snd_wavefront_t *dev, char *path) | 1942 | wavefront_download_firmware (snd_wavefront_t *dev, char *path) |
1951 | 1943 | ||
1952 | { | 1944 | { |
1953 | unsigned char section[WF_SECTION_MAX]; | 1945 | unsigned char *buf; |
1954 | signed char section_length; /* yes, just a char; max value is WF_SECTION_MAX */ | 1946 | int len, err; |
1955 | int section_cnt_downloaded = 0; | 1947 | int section_cnt_downloaded = 0; |
1956 | int fd; | 1948 | const struct firmware *firmware; |
1957 | int c; | ||
1958 | int i; | ||
1959 | mm_segment_t fs; | ||
1960 | |||
1961 | /* This tries to be a bit cleverer than the stuff Alan Cox did for | ||
1962 | the generic sound firmware, in that it actually knows | ||
1963 | something about the structure of the Motorola firmware. In | ||
1964 | particular, it uses a version that has been stripped of the | ||
1965 | 20K of useless header information, and had section lengths | ||
1966 | added, making it possible to load the entire OS without any | ||
1967 | [kv]malloc() activity, since the longest entity we ever read is | ||
1968 | 42 bytes (well, WF_SECTION_MAX) long. | ||
1969 | */ | ||
1970 | |||
1971 | fs = get_fs(); | ||
1972 | set_fs (get_ds()); | ||
1973 | 1949 | ||
1974 | if ((fd = sys_open ((char __user *) path, 0, 0)) < 0) { | 1950 | err = request_firmware(&firmware, path, dev->card->dev); |
1975 | snd_printk ("Unable to load \"%s\".\n", | 1951 | if (err < 0) { |
1976 | path); | 1952 | snd_printk(KERN_ERR "firmware (%s) download failed!!!\n", path); |
1977 | return 1; | 1953 | return 1; |
1978 | } | 1954 | } |
1979 | 1955 | ||
1980 | while (1) { | 1956 | len = 0; |
1981 | int x; | 1957 | buf = firmware->data; |
1982 | 1958 | for (;;) { | |
1983 | if ((x = sys_read (fd, (char __user *) §ion_length, sizeof (section_length))) != | 1959 | int section_length = *(signed char *)buf; |
1984 | sizeof (section_length)) { | 1960 | if (section_length == 0) |
1985 | snd_printk ("firmware read error.\n"); | ||
1986 | goto failure; | ||
1987 | } | ||
1988 | |||
1989 | if (section_length == 0) { | ||
1990 | break; | 1961 | break; |
1991 | } | ||
1992 | |||
1993 | if (section_length < 0 || section_length > WF_SECTION_MAX) { | 1962 | if (section_length < 0 || section_length > WF_SECTION_MAX) { |
1994 | snd_printk ("invalid firmware section length %d\n", | 1963 | snd_printk(KERN_ERR |
1995 | section_length); | 1964 | "invalid firmware section length %d\n", |
1965 | section_length); | ||
1996 | goto failure; | 1966 | goto failure; |
1997 | } | 1967 | } |
1968 | buf++; | ||
1969 | len++; | ||
1998 | 1970 | ||
1999 | if (sys_read (fd, (char __user *) section, section_length) != section_length) { | 1971 | if (firmware->size < len + section_length) { |
2000 | snd_printk ("firmware section " | 1972 | snd_printk(KERN_ERR "firmware section read error.\n"); |
2001 | "read error.\n"); | ||
2002 | goto failure; | 1973 | goto failure; |
2003 | } | 1974 | } |
2004 | 1975 | ||
2005 | /* Send command */ | 1976 | /* Send command */ |
2006 | 1977 | if (wavefront_write(dev, WFC_DOWNLOAD_OS)) | |
2007 | if (wavefront_write (dev, WFC_DOWNLOAD_OS)) { | ||
2008 | goto failure; | 1978 | goto failure; |
2009 | } | ||
2010 | 1979 | ||
2011 | for (i = 0; i < section_length; i++) { | 1980 | for (; section_length; section_length--) { |
2012 | if (wavefront_write (dev, section[i])) { | 1981 | if (wavefront_write(dev, *buf)) |
2013 | goto failure; | 1982 | goto failure; |
2014 | } | 1983 | buf++; |
1984 | len++; | ||
2015 | } | 1985 | } |
2016 | 1986 | ||
2017 | /* get ACK */ | 1987 | /* get ACK */ |
2018 | 1988 | if (!wavefront_wait(dev, STAT_CAN_READ)) { | |
2019 | if (wavefront_wait (dev, STAT_CAN_READ)) { | 1989 | snd_printk(KERN_ERR "time out for firmware ACK.\n"); |
2020 | 1990 | goto failure; | |
2021 | if ((c = inb (dev->data_port)) != WF_ACK) { | 1991 | } |
2022 | 1992 | err = inb(dev->data_port); | |
2023 | snd_printk ("download " | 1993 | if (err != WF_ACK) { |
2024 | "of section #%d not " | 1994 | snd_printk(KERN_ERR |
2025 | "acknowledged, ack = 0x%x\n", | 1995 | "download of section #%d not " |
2026 | section_cnt_downloaded + 1, c); | 1996 | "acknowledged, ack = 0x%x\n", |
2027 | goto failure; | 1997 | section_cnt_downloaded + 1, err); |
2028 | |||
2029 | } | ||
2030 | |||
2031 | } else { | ||
2032 | snd_printk ("time out for firmware ACK.\n"); | ||
2033 | goto failure; | 1998 | goto failure; |
2034 | } | 1999 | } |
2035 | 2000 | ||
2001 | section_cnt_downloaded++; | ||
2036 | } | 2002 | } |
2037 | 2003 | ||
2038 | sys_close (fd); | 2004 | release_firmware(firmware); |
2039 | set_fs (fs); | ||
2040 | return 0; | 2005 | return 0; |
2041 | 2006 | ||
2042 | failure: | 2007 | failure: |
2043 | sys_close (fd); | 2008 | release_firmware(firmware); |
2044 | set_fs (fs); | 2009 | snd_printk(KERN_ERR "firmware download failed!!!\n"); |
2045 | snd_printk ("firmware download failed!!!\n"); | ||
2046 | return 1; | 2010 | return 1; |
2047 | } | 2011 | } |
2048 | 2012 | ||
@@ -2232,3 +2196,5 @@ snd_wavefront_detect (snd_wavefront_card_t *card) | |||
2232 | 2196 | ||
2233 | return 0; | 2197 | return 0; |
2234 | } | 2198 | } |
2199 | |||
2200 | MODULE_FIRMWARE(DEFAULT_OSPATH); | ||