You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'for-2.6.27' of git://git.infradead.org/users/dwmw2/firmware-2.6
* 'for-2.6.27' of git://git.infradead.org/users/dwmw2/firmware-2.6: (64 commits) firmware: convert sb16_csp driver to use firmware loader exclusively dsp56k: use request_firmware edgeport-ti: use request_firmware() edgeport: use request_firmware() vicam: use request_firmware() dabusb: use request_firmware() cpia2: use request_firmware() ip2: use request_firmware() firmware: convert Ambassador ATM driver to request_firmware() whiteheat: use request_firmware() ti_usb_3410_5052: use request_firmware() emi62: use request_firmware() emi26: use request_firmware() keyspan_pda: use request_firmware() keyspan: use request_firmware() ttusb-budget: use request_firmware() kaweth: use request_firmware() smctr: use request_firmware() firmware: convert ymfpci driver to use firmware loader exclusively firmware: convert maestro3 driver to use firmware loader exclusively ... Fix up trivial conflicts with BKL removal in drivers/char/dsp56k.c and drivers/char/ip2/ip2main.c manually.
This commit is contained in:
@@ -450,7 +450,7 @@ scripts: scripts_basic include/config/auto.conf
|
||||
|
||||
# Objects we will link into vmlinux / subdirs we need to visit
|
||||
init-y := init/
|
||||
drivers-y := drivers/ sound/
|
||||
drivers-y := drivers/ sound/ firmware/
|
||||
net-y := net/
|
||||
libs-y := lib/
|
||||
core-y := usr/
|
||||
@@ -998,6 +998,16 @@ PHONY += depend dep
|
||||
depend dep:
|
||||
@echo '*** Warning: make $@ is unnecessary now.'
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Firmware install
|
||||
INSTALL_FW_PATH=$(INSTALL_MOD_PATH)/lib/firmware
|
||||
export INSTALL_FW_PATH
|
||||
|
||||
PHONY += firmware_install
|
||||
firmware_install: FORCE
|
||||
@mkdir -p $(objtree)/firmware
|
||||
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.fwinst obj=firmware __fw_install
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Kernel headers
|
||||
INSTALL_HDR_PATH=$(objtree)/usr
|
||||
@@ -1084,6 +1094,7 @@ _modinst_:
|
||||
# boot script depmod is the master version.
|
||||
PHONY += _modinst_post
|
||||
_modinst_post: _modinst_
|
||||
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.fwinst obj=firmware __fw_modinst
|
||||
$(call cmd,depmod)
|
||||
|
||||
else # CONFIG_MODULES
|
||||
@@ -1201,6 +1212,8 @@ help:
|
||||
@echo '* vmlinux - Build the bare kernel'
|
||||
@echo '* modules - Build all modules'
|
||||
@echo ' modules_install - Install all modules to INSTALL_MOD_PATH (default: /)'
|
||||
@echo ' firmware_install- Install all firmware to INSTALL_FW_PATH'
|
||||
@echo ' (default: $$(INSTALL_MOD_PATH)/lib/firmware)'
|
||||
@echo ' dir/ - Build all files in dir and below'
|
||||
@echo ' dir/file.[ois] - Build specified target only'
|
||||
@echo ' dir/file.ko - Build module including final link'
|
||||
|
||||
@@ -491,7 +491,7 @@ MODULE_ALIAS_MISCDEV(MICROCODE_MINOR);
|
||||
#define microcode_dev_exit() do { } while(0)
|
||||
#endif
|
||||
|
||||
static long get_next_ucode_from_buffer(void **mc, void *buf,
|
||||
static long get_next_ucode_from_buffer(void **mc, const u8 *buf,
|
||||
unsigned long size, long offset)
|
||||
{
|
||||
microcode_header_t *mc_header;
|
||||
@@ -525,7 +525,7 @@ static int cpu_request_microcode(int cpu)
|
||||
char name[30];
|
||||
struct cpuinfo_x86 *c = &cpu_data(cpu);
|
||||
const struct firmware *firmware;
|
||||
void *buf;
|
||||
const u8 *buf;
|
||||
unsigned long size;
|
||||
long offset = 0;
|
||||
int error;
|
||||
|
||||
@@ -6,9 +6,9 @@ fore_200e-objs := fore200e.o
|
||||
hostprogs-y := fore200e_mkfirm
|
||||
|
||||
# Files generated that shall be removed upon make clean
|
||||
clean-files := atmsar11.bin atmsar11.bin1 atmsar11.bin2 pca200e.bin \
|
||||
pca200e.bin1 pca200e.bin2 pca200e_ecd.bin pca200e_ecd.bin1 \
|
||||
pca200e_ecd.bin2 sba200e_ecd.bin sba200e_ecd.bin1 sba200e_ecd.bin2
|
||||
clean-files := pca200e.bin pca200e.bin1 pca200e.bin2 pca200e_ecd.bin \
|
||||
pca200e_ecd.bin1 pca200e_ecd.bin2 sba200e_ecd.bin sba200e_ecd.bin1 \
|
||||
sba200e_ecd.bin2
|
||||
# Firmware generated that shall be removed upon make clean
|
||||
clean-files += fore200e_pca_fw.c fore200e_sba_fw.c
|
||||
|
||||
|
||||
+57
-83
@@ -34,6 +34,8 @@
|
||||
#include <linux/poison.h>
|
||||
#include <linux/bitrev.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/firmware.h>
|
||||
#include <linux/ihex.h>
|
||||
|
||||
#include <asm/atomic.h>
|
||||
#include <asm/io.h>
|
||||
@@ -290,29 +292,6 @@ static inline void __init show_version (void) {
|
||||
|
||||
*/
|
||||
|
||||
/********** microcode **********/
|
||||
|
||||
#ifdef AMB_NEW_MICROCODE
|
||||
#define UCODE(x) UCODE2(atmsar12.x)
|
||||
#else
|
||||
#define UCODE(x) UCODE2(atmsar11.x)
|
||||
#endif
|
||||
#define UCODE2(x) #x
|
||||
|
||||
static u32 __devinitdata ucode_start =
|
||||
#include UCODE(start)
|
||||
;
|
||||
|
||||
static region __devinitdata ucode_regions[] = {
|
||||
#include UCODE(regions)
|
||||
{ 0, 0 }
|
||||
};
|
||||
|
||||
static u32 __devinitdata ucode_data[] = {
|
||||
#include UCODE(data)
|
||||
0xdeadbeef
|
||||
};
|
||||
|
||||
static void do_housekeeping (unsigned long arg);
|
||||
/********** globals **********/
|
||||
|
||||
@@ -1841,45 +1820,34 @@ static int __devinit get_loader_version (loader_block * lb,
|
||||
|
||||
/* loader: write memory data blocks */
|
||||
|
||||
static int __devinit loader_write (loader_block * lb,
|
||||
const amb_dev * dev, const u32 * data,
|
||||
u32 address, unsigned int count) {
|
||||
unsigned int i;
|
||||
static int __devinit loader_write (loader_block* lb,
|
||||
const amb_dev *dev,
|
||||
const struct ihex_binrec *rec) {
|
||||
transfer_block * tb = &lb->payload.transfer;
|
||||
|
||||
PRINTD (DBG_FLOW|DBG_LOAD, "loader_write");
|
||||
|
||||
if (count > MAX_TRANSFER_DATA)
|
||||
return -EINVAL;
|
||||
tb->address = cpu_to_be32 (address);
|
||||
tb->count = cpu_to_be32 (count);
|
||||
for (i = 0; i < count; ++i)
|
||||
tb->data[i] = cpu_to_be32 (data[i]);
|
||||
|
||||
tb->address = rec->addr;
|
||||
tb->count = cpu_to_be32(be16_to_cpu(rec->len) / 4);
|
||||
memcpy(tb->data, rec->data, be16_to_cpu(rec->len));
|
||||
return do_loader_command (lb, dev, write_adapter_memory);
|
||||
}
|
||||
|
||||
/* loader: verify memory data blocks */
|
||||
|
||||
static int __devinit loader_verify (loader_block * lb,
|
||||
const amb_dev * dev, const u32 * data,
|
||||
u32 address, unsigned int count) {
|
||||
unsigned int i;
|
||||
const amb_dev *dev,
|
||||
const struct ihex_binrec *rec) {
|
||||
transfer_block * tb = &lb->payload.transfer;
|
||||
int res;
|
||||
|
||||
PRINTD (DBG_FLOW|DBG_LOAD, "loader_verify");
|
||||
|
||||
if (count > MAX_TRANSFER_DATA)
|
||||
return -EINVAL;
|
||||
tb->address = cpu_to_be32 (address);
|
||||
tb->count = cpu_to_be32 (count);
|
||||
tb->address = rec->addr;
|
||||
tb->count = cpu_to_be32(be16_to_cpu(rec->len) / 4);
|
||||
res = do_loader_command (lb, dev, read_adapter_memory);
|
||||
if (!res)
|
||||
for (i = 0; i < count; ++i)
|
||||
if (tb->data[i] != cpu_to_be32 (data[i])) {
|
||||
res = -EINVAL;
|
||||
break;
|
||||
}
|
||||
if (!res && memcmp(tb->data, rec->data, be16_to_cpu(rec->len)))
|
||||
res = -EINVAL;
|
||||
return res;
|
||||
}
|
||||
|
||||
@@ -1962,47 +1930,53 @@ static int amb_reset (amb_dev * dev, int diags) {
|
||||
/********** transfer and start the microcode **********/
|
||||
|
||||
static int __devinit ucode_init (loader_block * lb, amb_dev * dev) {
|
||||
unsigned int i = 0;
|
||||
unsigned int total = 0;
|
||||
const u32 * pointer = ucode_data;
|
||||
u32 address;
|
||||
unsigned int count;
|
||||
const struct firmware *fw;
|
||||
unsigned long start_address;
|
||||
const struct ihex_binrec *rec;
|
||||
int res;
|
||||
|
||||
res = request_ihex_firmware(&fw, "atmsar11.fw", &dev->pci_dev->dev);
|
||||
if (res) {
|
||||
PRINTK (KERN_ERR, "Cannot load microcode data");
|
||||
return res;
|
||||
}
|
||||
|
||||
/* First record contains just the start address */
|
||||
rec = (const struct ihex_binrec *)fw->data;
|
||||
if (be16_to_cpu(rec->len) != sizeof(__be32) || be32_to_cpu(rec->addr)) {
|
||||
PRINTK (KERN_ERR, "Bad microcode data (no start record)");
|
||||
return -EINVAL;
|
||||
}
|
||||
start_address = be32_to_cpup((__be32 *)rec->data);
|
||||
|
||||
rec = ihex_next_binrec(rec);
|
||||
|
||||
PRINTD (DBG_FLOW|DBG_LOAD, "ucode_init");
|
||||
|
||||
while (address = ucode_regions[i].start,
|
||||
count = ucode_regions[i].count) {
|
||||
PRINTD (DBG_LOAD, "starting region (%x, %u)", address, count);
|
||||
while (count) {
|
||||
unsigned int words;
|
||||
if (count <= MAX_TRANSFER_DATA)
|
||||
words = count;
|
||||
else
|
||||
words = MAX_TRANSFER_DATA;
|
||||
total += words;
|
||||
res = loader_write (lb, dev, pointer, address, words);
|
||||
if (res)
|
||||
return res;
|
||||
res = loader_verify (lb, dev, pointer, address, words);
|
||||
if (res)
|
||||
return res;
|
||||
count -= words;
|
||||
address += sizeof(u32) * words;
|
||||
pointer += words;
|
||||
|
||||
while (rec) {
|
||||
PRINTD (DBG_LOAD, "starting region (%x, %u)", be32_to_cpu(rec->addr),
|
||||
be16_to_cpu(rec->len));
|
||||
if (be16_to_cpu(rec->len) > 4 * MAX_TRANSFER_DATA) {
|
||||
PRINTK (KERN_ERR, "Bad microcode data (record too long)");
|
||||
return -EINVAL;
|
||||
}
|
||||
i += 1;
|
||||
}
|
||||
if (*pointer == ATM_POISON) {
|
||||
return loader_start (lb, dev, ucode_start);
|
||||
} else {
|
||||
// cast needed as there is no %? for pointer differnces
|
||||
PRINTD (DBG_LOAD|DBG_ERR,
|
||||
"offset=%li, *pointer=%x, address=%x, total=%u",
|
||||
(long) (pointer - ucode_data), *pointer, address, total);
|
||||
PRINTK (KERN_ERR, "incorrect microcode data");
|
||||
return -ENOMEM;
|
||||
if (be16_to_cpu(rec->len) & 3) {
|
||||
PRINTK (KERN_ERR, "Bad microcode data (odd number of bytes)");
|
||||
return -EINVAL;
|
||||
}
|
||||
res = loader_write(lb, dev, rec);
|
||||
if (res)
|
||||
break;
|
||||
|
||||
res = loader_verify(lb, dev, rec);
|
||||
if (res)
|
||||
break;
|
||||
}
|
||||
release_firmware(fw);
|
||||
if (!res)
|
||||
res = loader_start(lb, dev, start_address);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
/********** give adapter parameters **********/
|
||||
|
||||
@@ -656,17 +656,6 @@ typedef struct amb_dev amb_dev;
|
||||
#define AMB_DEV(atm_dev) ((amb_dev *) (atm_dev)->dev_data)
|
||||
#define AMB_VCC(atm_vcc) ((amb_vcc *) (atm_vcc)->dev_data)
|
||||
|
||||
/* the microcode */
|
||||
|
||||
typedef struct {
|
||||
u32 start;
|
||||
unsigned int count;
|
||||
} region;
|
||||
|
||||
static region ucode_regions[];
|
||||
static u32 ucode_data[];
|
||||
static u32 ucode_start;
|
||||
|
||||
/* rate rounding */
|
||||
|
||||
typedef enum {
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,6 +0,0 @@
|
||||
/*
|
||||
See copyright and licensing conditions in ambassador.* files.
|
||||
*/
|
||||
{ 0x00000080, 993, },
|
||||
{ 0xa0d0d500, 80, },
|
||||
{ 0xa0d0f000, 978, },
|
||||
@@ -1,4 +0,0 @@
|
||||
/*
|
||||
See copyright and licensing conditions in ambassador.* files.
|
||||
*/
|
||||
0xa0d0f000
|
||||
@@ -34,6 +34,70 @@ config FW_LOADER
|
||||
require userspace firmware loading support, but a module built outside
|
||||
the kernel tree does.
|
||||
|
||||
config FIRMWARE_IN_KERNEL
|
||||
bool "Include in-kernel firmware blobs in kernel binary"
|
||||
depends on FW_LOADER
|
||||
default y
|
||||
help
|
||||
The kernel source tree includes a number of firmware 'blobs'
|
||||
which are used by various drivers. The recommended way to
|
||||
use these is to run "make firmware_install" and to copy the
|
||||
resulting binary files created in usr/lib/firmware directory
|
||||
of the kernel tree to the /lib/firmware on your system so
|
||||
that they can be loaded by userspace helpers on request.
|
||||
|
||||
Enabling this option will build each required firmware blob
|
||||
into the kernel directly, where request_firmware() will find
|
||||
them without having to call out to userspace. This may be
|
||||
useful if your root file system requires a device which uses
|
||||
such firmware, and do not wish to use an initrd.
|
||||
|
||||
This single option controls the inclusion of firmware for
|
||||
every driver which usees request_firmare() and ships its
|
||||
firmware in the kernel source tree, to avoid a proliferation
|
||||
of 'Include firmware for xxx device' options.
|
||||
|
||||
Say 'N' and let firmware be loaded from userspace.
|
||||
|
||||
config EXTRA_FIRMWARE
|
||||
string "External firmware blobs to build into the kernel binary"
|
||||
depends on FW_LOADER
|
||||
help
|
||||
This option allows firmware to be built into the kernel, for the
|
||||
cases where the user either cannot or doesn't want to provide it from
|
||||
userspace at runtime (for example, when the firmware in question is
|
||||
required for accessing the boot device, and the user doesn't want to
|
||||
use an initrd).
|
||||
|
||||
This option is a string, and takes the (space-separated) names of the
|
||||
firmware files -- the same names which appear in MODULE_FIRMWARE()
|
||||
and request_firmware() in the source. These files should exist under
|
||||
the directory specified by the EXTRA_FIRMWARE_DIR option, which is
|
||||
by default the firmware/ subdirectory of the kernel source tree.
|
||||
|
||||
So, for example, you might set CONFIG_EXTRA_FIRMWARE="usb8388.bin",
|
||||
copy the usb8388.bin file into the firmware/ directory, and build the
|
||||
kernel. Then any request_firmware("usb8388.bin") will be
|
||||
satisfied internally without needing to call out to userspace.
|
||||
|
||||
WARNING: If you include additional firmware files into your binary
|
||||
kernel image which are not available under the terms of the GPL,
|
||||
then it may be a violation of the GPL to distribute the resulting
|
||||
image -- since it combines both GPL and non-GPL work. You should
|
||||
consult a lawyer of your own before distributing such an image.
|
||||
|
||||
config EXTRA_FIRMWARE_DIR
|
||||
string "Firmware blobs root directory"
|
||||
depends on EXTRA_FIRMWARE != ""
|
||||
default "firmware"
|
||||
help
|
||||
This option controls the directory in which the kernel build system
|
||||
looks for the firmware files listed in the EXTRA_FIRMWARE option.
|
||||
The default is the firmware/ directory in the kernel source tree,
|
||||
but by changing this option you can point it elsewhere, such as
|
||||
the /lib/firmware/ directory or another separate directory
|
||||
containing firmware files.
|
||||
|
||||
config DEBUG_DRIVER
|
||||
bool "Driver Core verbose debug messages"
|
||||
depends on DEBUG_KERNEL
|
||||
|
||||
@@ -49,6 +49,14 @@ struct firmware_priv {
|
||||
struct timer_list timeout;
|
||||
};
|
||||
|
||||
#ifdef CONFIG_FW_LOADER
|
||||
extern struct builtin_fw __start_builtin_fw[];
|
||||
extern struct builtin_fw __end_builtin_fw[];
|
||||
#else /* Module case. Avoid ifdefs later; it'll all optimise out */
|
||||
static struct builtin_fw *__start_builtin_fw;
|
||||
static struct builtin_fw *__end_builtin_fw;
|
||||
#endif
|
||||
|
||||
static void
|
||||
fw_load_abort(struct firmware_priv *fw_priv)
|
||||
{
|
||||
@@ -257,7 +265,7 @@ firmware_data_write(struct kobject *kobj, struct bin_attribute *bin_attr,
|
||||
if (retval)
|
||||
goto out;
|
||||
|
||||
memcpy(fw->data + offset, buffer, count);
|
||||
memcpy((u8 *)fw->data + offset, buffer, count);
|
||||
|
||||
fw->size = max_t(size_t, offset + count, fw->size);
|
||||
retval = count;
|
||||
@@ -391,13 +399,12 @@ _request_firmware(const struct firmware **firmware_p, const char *name,
|
||||
struct device *f_dev;
|
||||
struct firmware_priv *fw_priv;
|
||||
struct firmware *firmware;
|
||||
struct builtin_fw *builtin;
|
||||
int retval;
|
||||
|
||||
if (!firmware_p)
|
||||
return -EINVAL;
|
||||
|
||||
printk(KERN_INFO "firmware: requesting %s\n", name);
|
||||
|
||||
*firmware_p = firmware = kzalloc(sizeof(*firmware), GFP_KERNEL);
|
||||
if (!firmware) {
|
||||
printk(KERN_ERR "%s: kmalloc(struct firmware) failed\n",
|
||||
@@ -406,6 +413,20 @@ _request_firmware(const struct firmware **firmware_p, const char *name,
|
||||
goto out;
|
||||
}
|
||||
|
||||
for (builtin = __start_builtin_fw; builtin != __end_builtin_fw;
|
||||
builtin++) {
|
||||
if (strcmp(name, builtin->name))
|
||||
continue;
|
||||
printk(KERN_INFO "firmware: using built-in firmware %s\n",
|
||||
name);
|
||||
firmware->size = builtin->size;
|
||||
firmware->data = builtin->data;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (uevent)
|
||||
printk(KERN_INFO "firmware: requesting %s\n", name);
|
||||
|
||||
retval = fw_setup_device(firmware, &f_dev, name, device, uevent);
|
||||
if (retval)
|
||||
goto error_kfree_fw;
|
||||
@@ -473,8 +494,16 @@ request_firmware(const struct firmware **firmware_p, const char *name,
|
||||
void
|
||||
release_firmware(const struct firmware *fw)
|
||||
{
|
||||
struct builtin_fw *builtin;
|
||||
|
||||
if (fw) {
|
||||
for (builtin = __start_builtin_fw; builtin != __end_builtin_fw;
|
||||
builtin++) {
|
||||
if (fw->data == builtin->data)
|
||||
goto free_fw;
|
||||
}
|
||||
vfree(fw->data);
|
||||
free_fw:
|
||||
kfree(fw);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -566,7 +566,8 @@ static int bfusb_ioctl(struct hci_dev *hdev, unsigned int cmd, unsigned long arg
|
||||
return -ENOIOCTLCMD;
|
||||
}
|
||||
|
||||
static int bfusb_load_firmware(struct bfusb_data *data, unsigned char *firmware, int count)
|
||||
static int bfusb_load_firmware(struct bfusb_data *data,
|
||||
const unsigned char *firmware, int count)
|
||||
{
|
||||
unsigned char *buf;
|
||||
int err, pipe, len, size, sent = 0;
|
||||
|
||||
@@ -470,7 +470,8 @@ static int bt3c_hci_ioctl(struct hci_dev *hdev, unsigned int cmd, unsigned long
|
||||
/* ======================== Card services HCI interaction ======================== */
|
||||
|
||||
|
||||
static int bt3c_load_firmware(bt3c_info_t *info, unsigned char *firmware, int count)
|
||||
static int bt3c_load_firmware(bt3c_info_t *info, const unsigned char *firmware,
|
||||
int count)
|
||||
{
|
||||
char *ptr = (char *) firmware;
|
||||
char b[9];
|
||||
|
||||
@@ -4668,7 +4668,7 @@ static inline int __devinit cyc_isfwstr(const char *str, unsigned int size)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void __devinit cyz_fpga_copy(void __iomem *fpga, u8 *data,
|
||||
static inline void __devinit cyz_fpga_copy(void __iomem *fpga, const u8 *data,
|
||||
unsigned int size)
|
||||
{
|
||||
for (; size > 0; size--) {
|
||||
@@ -4701,10 +4701,10 @@ static int __devinit __cyz_load_fw(const struct firmware *fw,
|
||||
const char *name, const u32 mailbox, void __iomem *base,
|
||||
void __iomem *fpga)
|
||||
{
|
||||
void *ptr = fw->data;
|
||||
struct zfile_header *h = ptr;
|
||||
struct zfile_config *c, *cs;
|
||||
struct zfile_block *b, *bs;
|
||||
const void *ptr = fw->data;
|
||||
const struct zfile_header *h = ptr;
|
||||
const struct zfile_config *c, *cs;
|
||||
const struct zfile_block *b, *bs;
|
||||
unsigned int a, tmp, len = fw->size;
|
||||
#define BAD_FW KERN_ERR "Bad firmware: "
|
||||
if (len < sizeof(*h)) {
|
||||
|
||||
+34
-52
@@ -34,6 +34,8 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/smp_lock.h>
|
||||
#include <linux/firmware.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include <asm/atarihw.h>
|
||||
#include <asm/traps.h>
|
||||
@@ -93,49 +95,6 @@
|
||||
} \
|
||||
}
|
||||
|
||||
/* DSP56001 bootstrap code */
|
||||
static char bootstrap[] = {
|
||||
0x0c, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x60, 0xf4, 0x00, 0x00, 0x00, 0x4f, 0x61, 0xf4,
|
||||
0x00, 0x00, 0x7e, 0xa9, 0x06, 0x2e, 0x80, 0x00, 0x00, 0x47,
|
||||
0x07, 0xd8, 0x84, 0x07, 0x59, 0x84, 0x08, 0xf4, 0xa8, 0x00,
|
||||
0x00, 0x04, 0x08, 0xf4, 0xbf, 0x00, 0x0c, 0x00, 0x00, 0xfe,
|
||||
0xb8, 0x0a, 0xf0, 0x80, 0x00, 0x7e, 0xa9, 0x08, 0xf4, 0xa0,
|
||||
0x00, 0x00, 0x01, 0x08, 0xf4, 0xbe, 0x00, 0x00, 0x00, 0x0a,
|
||||
0xa9, 0x80, 0x00, 0x7e, 0xad, 0x08, 0x4e, 0x2b, 0x44, 0xf4,
|
||||
0x00, 0x00, 0x00, 0x03, 0x44, 0xf4, 0x45, 0x00, 0x00, 0x01,
|
||||
0x0e, 0xa0, 0x00, 0x0a, 0xa9, 0x80, 0x00, 0x7e, 0xb5, 0x08,
|
||||
0x50, 0x2b, 0x0a, 0xa9, 0x80, 0x00, 0x7e, 0xb8, 0x08, 0x46,
|
||||
0x2b, 0x44, 0xf4, 0x45, 0x00, 0x00, 0x02, 0x0a, 0xf0, 0xaa,
|
||||
0x00, 0x7e, 0xc9, 0x20, 0x00, 0x45, 0x0a, 0xf0, 0xaa, 0x00,
|
||||
0x7e, 0xd0, 0x06, 0xc6, 0x00, 0x00, 0x7e, 0xc6, 0x0a, 0xa9,
|
||||
0x80, 0x00, 0x7e, 0xc4, 0x08, 0x58, 0x6b, 0x0a, 0xf0, 0x80,
|
||||
0x00, 0x7e, 0xad, 0x06, 0xc6, 0x00, 0x00, 0x7e, 0xcd, 0x0a,
|
||||
0xa9, 0x80, 0x00, 0x7e, 0xcb, 0x08, 0x58, 0xab, 0x0a, 0xf0,
|
||||
0x80, 0x00, 0x7e, 0xad, 0x06, 0xc6, 0x00, 0x00, 0x7e, 0xd4,
|
||||
0x0a, 0xa9, 0x80, 0x00, 0x7e, 0xd2, 0x08, 0x58, 0xeb, 0x0a,
|
||||
0xf0, 0x80, 0x00, 0x7e, 0xad};
|
||||
static int sizeof_bootstrap = 375;
|
||||
|
||||
|
||||
static struct dsp56k_device {
|
||||
unsigned long in_use;
|
||||
long maxio, timeout;
|
||||
@@ -165,18 +124,40 @@ static int dsp56k_reset(void)
|
||||
|
||||
static int dsp56k_upload(u_char __user *bin, int len)
|
||||
{
|
||||
struct platform_device *pdev;
|
||||
const struct firmware *fw;
|
||||
const char fw_name[] = "dsp56k/bootstrap.bin";
|
||||
int err;
|
||||
int i;
|
||||
u_char *p;
|
||||
|
||||
|
||||
dsp56k_reset();
|
||||
|
||||
p = bootstrap;
|
||||
for (i = 0; i < sizeof_bootstrap/3; i++) {
|
||||
/* tx_wait(10); */
|
||||
dsp56k_host_interface.data.b[1] = *p++;
|
||||
dsp56k_host_interface.data.b[2] = *p++;
|
||||
dsp56k_host_interface.data.b[3] = *p++;
|
||||
|
||||
pdev = platform_device_register_simple("dsp56k", 0, NULL, 0);
|
||||
if (IS_ERR(pdev)) {
|
||||
printk(KERN_ERR "Failed to register device for \"%s\"\n",
|
||||
fw_name);
|
||||
return -EINVAL;
|
||||
}
|
||||
err = request_firmware(&fw, fw_name, &pdev->dev);
|
||||
platform_device_unregister(pdev);
|
||||
if (err) {
|
||||
printk(KERN_ERR "Failed to load image \"%s\" err %d\n",
|
||||
fw_name, err);
|
||||
return err;
|
||||
}
|
||||
if (fw->size % 3) {
|
||||
printk(KERN_ERR "Bogus length %d in image \"%s\"\n",
|
||||
fw->size, fw_name);
|
||||
release_firmware(fw);
|
||||
return -EINVAL;
|
||||
}
|
||||
for (i = 0; i < fw->size; i = i + 3) {
|
||||
/* tx_wait(10); */
|
||||
dsp56k_host_interface.data.b[1] = fw->data[i];
|
||||
dsp56k_host_interface.data.b[2] = fw->data[i + 1];
|
||||
dsp56k_host_interface.data.b[3] = fw->data[i + 2];
|
||||
}
|
||||
release_firmware(fw);
|
||||
for (; i < 512; i++) {
|
||||
/* tx_wait(10); */
|
||||
dsp56k_host_interface.data.b[1] = 0;
|
||||
@@ -540,3 +521,4 @@ static void __exit dsp56k_cleanup_driver(void)
|
||||
module_exit(dsp56k_cleanup_driver);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_FIRMWARE("dsp56k/bootstrap.bin");
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -21,10 +21,9 @@
|
||||
#endif
|
||||
|
||||
#include "ip2types.h"
|
||||
#include "fip_firm.h" // the meat
|
||||
|
||||
int
|
||||
ip2_loadmain(int *, int *, unsigned char *, int ); // ref into ip2main.c
|
||||
ip2_loadmain(int *, int *); // ref into ip2main.c
|
||||
|
||||
/* Note: Add compiled in defaults to these arrays, not to the structure
|
||||
in ip2.h any longer. That structure WILL get overridden
|
||||
@@ -52,7 +51,7 @@ static int __init ip2_init(void)
|
||||
irq[0] = irq[1] = irq[2] = irq[3] = 0;
|
||||
}
|
||||
|
||||
return ip2_loadmain(io,irq,(unsigned char *)fip_firm,sizeof(fip_firm));
|
||||
return ip2_loadmain(io, irq);
|
||||
}
|
||||
module_init(ip2_init);
|
||||
|
||||
|
||||
+36
-11
@@ -99,6 +99,8 @@
|
||||
#include <linux/wait.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/smp_lock.h>
|
||||
#include <linux/firmware.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include <linux/tty.h>
|
||||
#include <linux/tty_flip.h>
|
||||
@@ -156,9 +158,7 @@ static char *pcDriver_name = "ip2";
|
||||
static char *pcIpl = "ip2ipl";
|
||||
|
||||
// cheezy kludge or genius - you decide?
|
||||
int ip2_loadmain(int *, int *, unsigned char *, int);
|
||||
static unsigned char *Fip_firmware;
|
||||
static int Fip_firmware_size;
|
||||
int ip2_loadmain(int *, int *);
|
||||
|
||||
/***********************/
|
||||
/* Function Prototypes */
|
||||
@@ -209,7 +209,7 @@ static int ip2_ipl_open(struct inode *, struct file *);
|
||||
static int DumpTraceBuffer(char __user *, int);
|
||||
static int DumpFifoBuffer( char __user *, int);
|
||||
|
||||
static void ip2_init_board(int);
|
||||
static void ip2_init_board(int, const struct firmware *);
|
||||
static unsigned short find_eisa_board(int);
|
||||
|
||||
/***************/
|
||||
@@ -475,8 +475,27 @@ static const struct tty_operations ip2_ops = {
|
||||
/* SA_RANDOM - can be source for cert. random number generators */
|
||||
#define IP2_SA_FLAGS 0
|
||||
|
||||
|
||||
static const struct firmware *ip2_request_firmware(void)
|
||||
{
|
||||
struct platform_device *pdev;
|
||||
const struct firmware *fw;
|
||||
|
||||
pdev = platform_device_register_simple("ip2", 0, NULL, 0);
|
||||
if (IS_ERR(pdev)) {
|
||||
printk(KERN_ERR "Failed to register platform device for ip2\n");
|
||||
return NULL;
|
||||
}
|
||||
if (request_firmware(&fw, "intelliport2.bin", &pdev->dev)) {
|
||||
printk(KERN_ERR "Failed to load firmware 'intelliport2.bin'\n");
|
||||
fw = NULL;
|
||||
}
|
||||
platform_device_unregister(pdev);
|
||||
return fw;
|
||||
}
|
||||
|
||||
int
|
||||
ip2_loadmain(int *iop, int *irqp, unsigned char *firmware, int firmsize)
|
||||
ip2_loadmain(int *iop, int *irqp)
|
||||
{
|
||||
int i, j, box;
|
||||
int err = 0;
|
||||
@@ -484,6 +503,7 @@ ip2_loadmain(int *iop, int *irqp, unsigned char *firmware, int firmsize)
|
||||
i2eBordStrPtr pB = NULL;
|
||||
int rc = -1;
|
||||
static struct pci_dev *pci_dev_i = NULL;
|
||||
const struct firmware *fw = NULL;
|
||||
|
||||
ip2trace (ITRC_NO_PORT, ITRC_INIT, ITRC_ENTER, 0 );
|
||||
|
||||
@@ -517,9 +537,6 @@ ip2_loadmain(int *iop, int *irqp, unsigned char *firmware, int firmsize)
|
||||
}
|
||||
poll_only = !poll_only;
|
||||
|
||||
Fip_firmware = firmware;
|
||||
Fip_firmware_size = firmsize;
|
||||
|
||||
/* Announce our presence */
|
||||
printk( KERN_INFO "%s version %s\n", pcName, pcVersion );
|
||||
|
||||
@@ -639,10 +656,18 @@ ip2_loadmain(int *iop, int *irqp, unsigned char *firmware, int firmsize)
|
||||
}
|
||||
}
|
||||
for ( i = 0; i < IP2_MAX_BOARDS; ++i ) {
|
||||
/* We don't want to request the firmware unless we have at
|
||||
least one board */
|
||||
if ( i2BoardPtrTable[i] != NULL ) {
|
||||
ip2_init_board( i );
|
||||
if (!fw)
|
||||
fw = ip2_request_firmware();
|
||||
if (!fw)
|
||||
break;
|
||||
ip2_init_board(i, fw);
|
||||
}
|
||||
}
|
||||
if (fw)
|
||||
release_firmware(fw);
|
||||
|
||||
ip2trace (ITRC_NO_PORT, ITRC_INIT, 2, 0 );
|
||||
|
||||
@@ -770,7 +795,7 @@ out:
|
||||
/* are reported on the console. */
|
||||
/******************************************************************************/
|
||||
static void
|
||||
ip2_init_board( int boardnum )
|
||||
ip2_init_board(int boardnum, const struct firmware *fw)
|
||||
{
|
||||
int i;
|
||||
int nports = 0, nboxes = 0;
|
||||
@@ -790,7 +815,7 @@ ip2_init_board( int boardnum )
|
||||
goto err_initialize;
|
||||
}
|
||||
|
||||
if ( iiDownloadAll ( pB, (loadHdrStrPtr)Fip_firmware, 1, Fip_firmware_size )
|
||||
if ( iiDownloadAll ( pB, (loadHdrStrPtr)fw->data, 1, fw->size )
|
||||
!= II_DOWN_GOOD ) {
|
||||
printk ( KERN_ERR "IP2: failed to download loadware\n" );
|
||||
goto err_release_region;
|
||||
|
||||
+2
-2
@@ -721,7 +721,7 @@ static int moxa_load_code(struct moxa_board_conf *brd, const void *ptr,
|
||||
|
||||
static int moxa_load_fw(struct moxa_board_conf *brd, const struct firmware *fw)
|
||||
{
|
||||
void *ptr = fw->data;
|
||||
const void *ptr = fw->data;
|
||||
char rsn[64];
|
||||
u16 lens[5];
|
||||
size_t len;
|
||||
@@ -734,7 +734,7 @@ static int moxa_load_fw(struct moxa_board_conf *brd, const struct firmware *fw)
|
||||
u8 model; /* C218T=1, C320T=2, CP204=3 */
|
||||
u8 reserved2[8];
|
||||
__le16 len[5];
|
||||
} *hdr = ptr;
|
||||
} const *hdr = ptr;
|
||||
|
||||
BUILD_BUG_ON(ARRAY_SIZE(hdr->len) != ARRAY_SIZE(lens));
|
||||
|
||||
|
||||
@@ -220,7 +220,7 @@ out_noalloc:
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int packetize_data(void *data, size_t length)
|
||||
static int packetize_data(const u8 *data, size_t length)
|
||||
{
|
||||
int rc = 0;
|
||||
int done = 0;
|
||||
|
||||
@@ -254,7 +254,7 @@ static int load_all_firmwares(struct dvb_frontend *fe)
|
||||
{
|
||||
struct xc2028_data *priv = fe->tuner_priv;
|
||||
const struct firmware *fw = NULL;
|
||||
unsigned char *p, *endp;
|
||||
const unsigned char *p, *endp;
|
||||
int rc = 0;
|
||||
int n, n_array;
|
||||
char name[33];
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user