提交 0f805b86 编写于 作者: D David Woodhouse 提交者: David Woodhouse

smctr: use request_firmware()

Signed-off-by: NDavid Woodhouse <dwmw2@infradead.org>
上级 18ee6dfa
...@@ -48,6 +48,7 @@ ...@@ -48,6 +48,7 @@
#include <linux/skbuff.h> #include <linux/skbuff.h>
#include <linux/trdevice.h> #include <linux/trdevice.h>
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/firmware.h>
#include <asm/system.h> #include <asm/system.h>
#include <asm/io.h> #include <asm/io.h>
...@@ -59,7 +60,6 @@ ...@@ -59,7 +60,6 @@
#endif #endif
#include "smctr.h" /* Our Stuff */ #include "smctr.h" /* Our Stuff */
#include "smctr_firmware.h" /* SMC adapter firmware */
static char version[] __initdata = KERN_INFO "smctr.c: v1.4 7/12/00 by jschlst@samba.org\n"; static char version[] __initdata = KERN_INFO "smctr.c: v1.4 7/12/00 by jschlst@samba.org\n";
static const char cardname[] = "smctr"; static const char cardname[] = "smctr";
...@@ -103,7 +103,8 @@ static int smctr_clear_trc_reset(int ioaddr); ...@@ -103,7 +103,8 @@ static int smctr_clear_trc_reset(int ioaddr);
static int smctr_close(struct net_device *dev); static int smctr_close(struct net_device *dev);
/* D */ /* D */
static int smctr_decode_firmware(struct net_device *dev); static int smctr_decode_firmware(struct net_device *dev,
const struct firmware *fw);
static int smctr_disable_16bit(struct net_device *dev); static int smctr_disable_16bit(struct net_device *dev);
static int smctr_disable_adapter_ctrl_store(struct net_device *dev); static int smctr_disable_adapter_ctrl_store(struct net_device *dev);
static int smctr_disable_bic_int(struct net_device *dev); static int smctr_disable_bic_int(struct net_device *dev);
...@@ -748,7 +749,8 @@ static int smctr_close(struct net_device *dev) ...@@ -748,7 +749,8 @@ static int smctr_close(struct net_device *dev)
return (0); return (0);
} }
static int smctr_decode_firmware(struct net_device *dev) static int smctr_decode_firmware(struct net_device *dev,
const struct firmware *fw)
{ {
struct net_local *tp = netdev_priv(dev); struct net_local *tp = netdev_priv(dev);
short bit = 0x80, shift = 12; short bit = 0x80, shift = 12;
...@@ -762,10 +764,10 @@ static int smctr_decode_firmware(struct net_device *dev) ...@@ -762,10 +764,10 @@ static int smctr_decode_firmware(struct net_device *dev)
if(smctr_debug > 10) if(smctr_debug > 10)
printk(KERN_DEBUG "%s: smctr_decode_firmware\n", dev->name); printk(KERN_DEBUG "%s: smctr_decode_firmware\n", dev->name);
weight = *(long *)(tp->ptr_ucode + WEIGHT_OFFSET); weight = *(long *)(fw->data + WEIGHT_OFFSET);
tsize = *(__u8 *)(tp->ptr_ucode + TREE_SIZE_OFFSET); tsize = *(__u8 *)(fw->data + TREE_SIZE_OFFSET);
tree = (DECODE_TREE_NODE *)(tp->ptr_ucode + TREE_OFFSET); tree = (DECODE_TREE_NODE *)(fw->data + TREE_OFFSET);
ucode = (__u8 *)(tp->ptr_ucode + TREE_OFFSET ucode = (__u8 *)(fw->data + TREE_OFFSET
+ (tsize * sizeof(DECODE_TREE_NODE))); + (tsize * sizeof(DECODE_TREE_NODE)));
mem = (__u16 *)(tp->ram_access); mem = (__u16 *)(tp->ram_access);
...@@ -2963,34 +2965,44 @@ static int smctr_link_tx_fcbs_to_bdbs(struct net_device *dev) ...@@ -2963,34 +2965,44 @@ static int smctr_link_tx_fcbs_to_bdbs(struct net_device *dev)
static int smctr_load_firmware(struct net_device *dev) static int smctr_load_firmware(struct net_device *dev)
{ {
struct net_local *tp = netdev_priv(dev); struct net_local *tp = netdev_priv(dev);
const struct firmware *fw;
__u16 i, checksum = 0; __u16 i, checksum = 0;
int err = 0; int err = 0;
if(smctr_debug > 10) if(smctr_debug > 10)
printk(KERN_DEBUG "%s: smctr_load_firmware\n", dev->name); printk(KERN_DEBUG "%s: smctr_load_firmware\n", dev->name);
tp->ptr_ucode = smctr_code; if (request_firmware(&fw, "tr_smctr.bin", &dev->dev)) {
printk(KERN_ERR "%s: firmware not found\n", dev->name);
return (UCODE_NOT_PRESENT);
}
tp->num_of_tx_buffs = 4; tp->num_of_tx_buffs = 4;
tp->mode_bits |= UMAC; tp->mode_bits |= UMAC;
tp->receive_mask = 0; tp->receive_mask = 0;
tp->max_packet_size = 4177; tp->max_packet_size = 4177;
/* Can only upload the firmware once per adapter reset. */ /* Can only upload the firmware once per adapter reset. */
if(tp->microcode_version != 0) if (tp->microcode_version != 0) {
return (UCODE_PRESENT); err = (UCODE_PRESENT);
goto out;
}
/* Verify the firmware exists and is there in the right amount. */ /* Verify the firmware exists and is there in the right amount. */
if (!tp->ptr_ucode if (!fw->data
|| (*(tp->ptr_ucode + UCODE_VERSION_OFFSET) < UCODE_VERSION)) || (*(fw->data + UCODE_VERSION_OFFSET) < UCODE_VERSION))
{ {
return (UCODE_NOT_PRESENT); err = (UCODE_NOT_PRESENT);
goto out;
} }
/* UCODE_SIZE is not included in Checksum. */ /* UCODE_SIZE is not included in Checksum. */
for(i = 0; i < *((__u16 *)(tp->ptr_ucode + UCODE_SIZE_OFFSET)); i += 2) for(i = 0; i < *((__u16 *)(fw->data + UCODE_SIZE_OFFSET)); i += 2)
checksum += *((__u16 *)(tp->ptr_ucode + 2 + i)); checksum += *((__u16 *)(fw->data + 2 + i));
if(checksum) if (checksum) {
return (UCODE_NOT_PRESENT); err = (UCODE_NOT_PRESENT);
goto out;
}
/* At this point we have a valid firmware image, lets kick it on up. */ /* At this point we have a valid firmware image, lets kick it on up. */
smctr_enable_adapter_ram(dev); smctr_enable_adapter_ram(dev);
...@@ -2998,7 +3010,7 @@ static int smctr_load_firmware(struct net_device *dev) ...@@ -2998,7 +3010,7 @@ static int smctr_load_firmware(struct net_device *dev)
smctr_set_page(dev, (__u8 *)tp->ram_access); smctr_set_page(dev, (__u8 *)tp->ram_access);
if((smctr_checksum_firmware(dev)) if((smctr_checksum_firmware(dev))
|| (*(tp->ptr_ucode + UCODE_VERSION_OFFSET) || (*(fw->data + UCODE_VERSION_OFFSET)
> tp->microcode_version)) > tp->microcode_version))
{ {
smctr_enable_adapter_ctrl_store(dev); smctr_enable_adapter_ctrl_store(dev);
...@@ -3007,9 +3019,9 @@ static int smctr_load_firmware(struct net_device *dev) ...@@ -3007,9 +3019,9 @@ static int smctr_load_firmware(struct net_device *dev)
for(i = 0; i < CS_RAM_SIZE; i += 2) for(i = 0; i < CS_RAM_SIZE; i += 2)
*((__u16 *)(tp->ram_access + i)) = 0; *((__u16 *)(tp->ram_access + i)) = 0;
smctr_decode_firmware(dev); smctr_decode_firmware(dev, fw);
tp->microcode_version = *(tp->ptr_ucode + UCODE_VERSION_OFFSET); *((__u16 *)(tp->ram_access + CS_RAM_VERSION_OFFSET)) tp->microcode_version = *(fw->data + UCODE_VERSION_OFFSET); *((__u16 *)(tp->ram_access + CS_RAM_VERSION_OFFSET))
= (tp->microcode_version << 8); = (tp->microcode_version << 8);
*((__u16 *)(tp->ram_access + CS_RAM_CHECKSUM_OFFSET)) *((__u16 *)(tp->ram_access + CS_RAM_CHECKSUM_OFFSET))
= ~(tp->microcode_version << 8) + 1; = ~(tp->microcode_version << 8) + 1;
...@@ -3023,7 +3035,8 @@ static int smctr_load_firmware(struct net_device *dev) ...@@ -3023,7 +3035,8 @@ static int smctr_load_firmware(struct net_device *dev)
err = UCODE_PRESENT; err = UCODE_PRESENT;
smctr_disable_16bit(dev); smctr_disable_16bit(dev);
out:
release_firmware(fw);
return (err); return (err);
} }
...@@ -5651,6 +5664,7 @@ static int io[SMCTR_MAX_ADAPTERS]; ...@@ -5651,6 +5664,7 @@ static int io[SMCTR_MAX_ADAPTERS];
static int irq[SMCTR_MAX_ADAPTERS]; static int irq[SMCTR_MAX_ADAPTERS];
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_FIRMWARE("tr_smctr.bin");
module_param_array(io, int, NULL, 0); module_param_array(io, int, NULL, 0);
module_param_array(irq, int, NULL, 0); module_param_array(irq, int, NULL, 0);
......
...@@ -1042,8 +1042,6 @@ typedef struct net_local { ...@@ -1042,8 +1042,6 @@ typedef struct net_local {
__u16 functional_address[2]; __u16 functional_address[2];
__u16 bitwise_group_address[2]; __u16 bitwise_group_address[2];
const __u8 *ptr_ucode;
__u8 cleanup; __u8 cleanup;
struct sk_buff_head SendSkbQueue; struct sk_buff_head SendSkbQueue;
......
此差异已折叠。
...@@ -20,6 +20,7 @@ fw-external-y := $(subst ",,$(CONFIG_EXTRA_FIRMWARE)) ...@@ -20,6 +20,7 @@ fw-external-y := $(subst ",,$(CONFIG_EXTRA_FIRMWARE))
# accurate. In the latter case it doesn't matter -- it'll use $(fw-shipped-all). # accurate. In the latter case it doesn't matter -- it'll use $(fw-shipped-all).
# But be aware that the config file might not be included at all. # But be aware that the config file might not be included at all.
fw-shipped-$(CONFIG_SMCTR) += tr_smctr.bin
fw-shipped-$(CONFIG_SND_KORG1212) += korg/k1212.dsp fw-shipped-$(CONFIG_SND_KORG1212) += korg/k1212.dsp
fw-shipped-$(CONFIG_SND_MAESTRO3) += ess/maestro3_assp_kernel.fw \ fw-shipped-$(CONFIG_SND_MAESTRO3) += ess/maestro3_assp_kernel.fw \
ess/maestro3_assp_minisrc.fw ess/maestro3_assp_minisrc.fw
......
...@@ -44,3 +44,16 @@ Found alsa-firmware package in hex form, with the following comment: ...@@ -44,3 +44,16 @@ Found alsa-firmware package in hex form, with the following comment:
Copyright (c) 1997-1999 Yamaha Corporation. All Rights Reserved. Copyright (c) 1997-1999 Yamaha Corporation. All Rights Reserved.
-------------------------------------------------------------------------- --------------------------------------------------------------------------
Driver: smctr -- SMC ISA/MCA Token Ring adapter
File: tr_smctr.bin
Info: MCT.BIN v6.3C1 03/01/95
Original licence info:
* This firmware is licensed to you strictly for use in conjunction
* with the use of SMC TokenRing adapters. There is no waranty
* expressed or implied about its fitness for any purpose.
--------------------------------------------------------------------------
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册