mirror of
https://github.com/adulau/aha.git
synced 2024-12-27 11:16:11 +00:00
3C359: use request_firmware
Signed-off-by: Jaswinder Singh Rajput <jaswinderrajput@gmail.com>
This commit is contained in:
parent
a7a5eb9d4e
commit
4b6ece97e0
6 changed files with 1651 additions and 1596 deletions
|
@ -62,6 +62,7 @@
|
||||||
#include <linux/pci.h>
|
#include <linux/pci.h>
|
||||||
#include <linux/spinlock.h>
|
#include <linux/spinlock.h>
|
||||||
#include <linux/bitops.h>
|
#include <linux/bitops.h>
|
||||||
|
#include <linux/firmware.h>
|
||||||
|
|
||||||
#include <net/checksum.h>
|
#include <net/checksum.h>
|
||||||
|
|
||||||
|
@ -73,8 +74,10 @@
|
||||||
static char version[] __devinitdata =
|
static char version[] __devinitdata =
|
||||||
"3c359.c v1.2.0 2/17/01 - Mike Phillips (mikep@linuxtr.net)" ;
|
"3c359.c v1.2.0 2/17/01 - Mike Phillips (mikep@linuxtr.net)" ;
|
||||||
|
|
||||||
|
#define FW_NAME "3com/3C359.bin"
|
||||||
MODULE_AUTHOR("Mike Phillips <mikep@linuxtr.net>") ;
|
MODULE_AUTHOR("Mike Phillips <mikep@linuxtr.net>") ;
|
||||||
MODULE_DESCRIPTION("3Com 3C359 Velocity XL Token Ring Adapter Driver \n") ;
|
MODULE_DESCRIPTION("3Com 3C359 Velocity XL Token Ring Adapter Driver \n") ;
|
||||||
|
MODULE_FIRMWARE(FW_NAME);
|
||||||
|
|
||||||
/* Module paramters */
|
/* Module paramters */
|
||||||
|
|
||||||
|
@ -114,8 +117,6 @@ MODULE_PARM_DESC(message_level, "3c359: Level of reported messages") ;
|
||||||
* will be stuck with 1555 lines of hex #'s in the code.
|
* will be stuck with 1555 lines of hex #'s in the code.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "3c359_microcode.h"
|
|
||||||
|
|
||||||
static struct pci_device_id xl_pci_tbl[] =
|
static struct pci_device_id xl_pci_tbl[] =
|
||||||
{
|
{
|
||||||
{PCI_VENDOR_ID_3COM,PCI_DEVICE_ID_3COM_3C359, PCI_ANY_ID, PCI_ANY_ID, },
|
{PCI_VENDOR_ID_3COM,PCI_DEVICE_ID_3COM_3C359, PCI_ANY_ID, PCI_ANY_ID, },
|
||||||
|
@ -364,10 +365,30 @@ static int __devinit xl_probe(struct pci_dev *pdev,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int xl_init_firmware(struct xl_private *xl_priv)
|
||||||
|
{
|
||||||
|
int err;
|
||||||
|
|
||||||
|
err = request_firmware(&xl_priv->fw, FW_NAME, &xl_priv->pdev->dev);
|
||||||
|
if (err) {
|
||||||
|
printk(KERN_ERR "Failed to load firmware \"%s\"\n", FW_NAME);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (xl_priv->fw->size < 16) {
|
||||||
|
printk(KERN_ERR "Bogus length %zu in \"%s\"\n",
|
||||||
|
xl_priv->fw->size, FW_NAME);
|
||||||
|
release_firmware(xl_priv->fw);
|
||||||
|
err = -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
static int __devinit xl_init(struct net_device *dev)
|
static int __devinit xl_init(struct net_device *dev)
|
||||||
{
|
{
|
||||||
struct xl_private *xl_priv = netdev_priv(dev);
|
struct xl_private *xl_priv = netdev_priv(dev);
|
||||||
|
int err;
|
||||||
|
|
||||||
printk(KERN_INFO "%s \n", version);
|
printk(KERN_INFO "%s \n", version);
|
||||||
printk(KERN_INFO "%s: I/O at %hx, MMIO at %p, using irq %d\n",
|
printk(KERN_INFO "%s: I/O at %hx, MMIO at %p, using irq %d\n",
|
||||||
|
@ -375,8 +396,11 @@ static int __devinit xl_init(struct net_device *dev)
|
||||||
|
|
||||||
spin_lock_init(&xl_priv->xl_lock) ;
|
spin_lock_init(&xl_priv->xl_lock) ;
|
||||||
|
|
||||||
return xl_hw_reset(dev) ;
|
err = xl_init_firmware(xl_priv);
|
||||||
|
if (err == 0)
|
||||||
|
err = xl_hw_reset(dev);
|
||||||
|
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -386,7 +410,7 @@ static int __devinit xl_init(struct net_device *dev)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int xl_hw_reset(struct net_device *dev)
|
static int xl_hw_reset(struct net_device *dev)
|
||||||
{
|
{
|
||||||
struct xl_private *xl_priv = netdev_priv(dev);
|
struct xl_private *xl_priv = netdev_priv(dev);
|
||||||
u8 __iomem *xl_mmio = xl_priv->xl_mmio ;
|
u8 __iomem *xl_mmio = xl_priv->xl_mmio ;
|
||||||
unsigned long t ;
|
unsigned long t ;
|
||||||
|
@ -396,6 +420,9 @@ static int xl_hw_reset(struct net_device *dev)
|
||||||
u16 start ;
|
u16 start ;
|
||||||
int j ;
|
int j ;
|
||||||
|
|
||||||
|
if (xl_priv->fw == NULL)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Reset the card. If the card has got the microcode on board, we have
|
* Reset the card. If the card has got the microcode on board, we have
|
||||||
* missed the initialization interrupt, so we must always do this.
|
* missed the initialization interrupt, so we must always do this.
|
||||||
|
@ -458,25 +485,30 @@ static int xl_hw_reset(struct net_device *dev)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Now to write the microcode into the shared ram
|
* Now to write the microcode into the shared ram
|
||||||
* The microcode must finish at position 0xFFFF, so we must subtract
|
* The microcode must finish at position 0xFFFF,
|
||||||
* to get the start position for the code
|
* so we must subtract to get the start position for the code
|
||||||
|
*
|
||||||
|
* Looks strange but ensures compiler only uses
|
||||||
|
* 16 bit unsigned int
|
||||||
*/
|
*/
|
||||||
|
start = (0xFFFF - (xl_priv->fw->size) + 1) ;
|
||||||
|
|
||||||
start = (0xFFFF - (mc_size) + 1 ) ; /* Looks strange but ensures compiler only uses 16 bit unsigned int for this */
|
|
||||||
|
|
||||||
printk(KERN_INFO "3C359: Uploading Microcode: ");
|
printk(KERN_INFO "3C359: Uploading Microcode: ");
|
||||||
|
|
||||||
for (i = start, j = 0; j < mc_size; i++, j++) {
|
for (i = start, j = 0; j < xl_priv->fw->size; i++, j++) {
|
||||||
writel(MEM_BYTE_WRITE | 0XD0000 | i, xl_mmio + MMIO_MAC_ACCESS_CMD) ;
|
writel(MEM_BYTE_WRITE | 0XD0000 | i,
|
||||||
writeb(microcode[j],xl_mmio + MMIO_MACDATA) ;
|
xl_mmio + MMIO_MAC_ACCESS_CMD);
|
||||||
|
writeb(xl_priv->fw->data[j], xl_mmio + MMIO_MACDATA);
|
||||||
if (j % 1024 == 0)
|
if (j % 1024 == 0)
|
||||||
printk(".");
|
printk(".");
|
||||||
}
|
}
|
||||||
printk("\n") ;
|
printk("\n") ;
|
||||||
|
|
||||||
for (i=0;i < 16; i++) {
|
for (i = 0; i < 16; i++) {
|
||||||
writel( (MEM_BYTE_WRITE | 0xDFFF0) + i, xl_mmio + MMIO_MAC_ACCESS_CMD) ;
|
writel((MEM_BYTE_WRITE | 0xDFFF0) + i,
|
||||||
writeb(microcode[mc_size - 16 + i], xl_mmio + MMIO_MACDATA) ;
|
xl_mmio + MMIO_MAC_ACCESS_CMD);
|
||||||
|
writeb(xl_priv->fw->data[xl_priv->fw->size - 16 + i],
|
||||||
|
xl_mmio + MMIO_MACDATA);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1782,6 +1814,7 @@ static void __devexit xl_remove_one (struct pci_dev *pdev)
|
||||||
struct net_device *dev = pci_get_drvdata(pdev);
|
struct net_device *dev = pci_get_drvdata(pdev);
|
||||||
struct xl_private *xl_priv=netdev_priv(dev);
|
struct xl_private *xl_priv=netdev_priv(dev);
|
||||||
|
|
||||||
|
release_firmware(xl_priv->fw);
|
||||||
unregister_netdev(dev);
|
unregister_netdev(dev);
|
||||||
iounmap(xl_priv->xl_mmio) ;
|
iounmap(xl_priv->xl_mmio) ;
|
||||||
pci_release_regions(pdev) ;
|
pci_release_regions(pdev) ;
|
||||||
|
|
|
@ -284,5 +284,8 @@ struct xl_private {
|
||||||
u8 xl_laa[6] ;
|
u8 xl_laa[6] ;
|
||||||
u32 rx_ring_dma_addr ;
|
u32 rx_ring_dma_addr ;
|
||||||
u32 tx_ring_dma_addr ;
|
u32 tx_ring_dma_addr ;
|
||||||
|
|
||||||
|
/* firmware section */
|
||||||
|
const struct firmware *fw;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load diff
1573
firmware/3com/3C359.bin.ihex
Normal file
1573
firmware/3com/3C359.bin.ihex
Normal file
File diff suppressed because it is too large
Load diff
|
@ -26,6 +26,7 @@ fw-shipped- += acenic/tg1.bin
|
||||||
else
|
else
|
||||||
acenic-objs := acenic/tg1.bin acenic/tg2.bin
|
acenic-objs := acenic/tg1.bin acenic/tg2.bin
|
||||||
endif
|
endif
|
||||||
|
fw-shipped-$(CONFIG_3C359) += 3com/3C359.bin
|
||||||
fw-shipped-$(CONFIG_ACENIC) += $(acenic-objs)
|
fw-shipped-$(CONFIG_ACENIC) += $(acenic-objs)
|
||||||
fw-shipped-$(CONFIG_ADAPTEC_STARFIRE) += adaptec/starfire_rx.bin \
|
fw-shipped-$(CONFIG_ADAPTEC_STARFIRE) += adaptec/starfire_rx.bin \
|
||||||
adaptec/starfire_tx.bin
|
adaptec/starfire_tx.bin
|
||||||
|
|
|
@ -505,3 +505,29 @@ Licence:
|
||||||
Found in hex form in kernel source.
|
Found in hex form in kernel source.
|
||||||
|
|
||||||
--------------------------------------------------------------------------
|
--------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Driver: 3C359 - 3Com 3C359 Token Link Velocity XL adapter
|
||||||
|
|
||||||
|
File: 3com/3C359.bin
|
||||||
|
|
||||||
|
Licence:
|
||||||
|
/*
|
||||||
|
* The firmware this driver downloads into the tokenring card is a
|
||||||
|
* separate program and is not GPL'd source code, even though the Linux
|
||||||
|
* side driver and the routine that loads this data into the card are.
|
||||||
|
*
|
||||||
|
* This firmware is licensed to you strictly for use in conjunction
|
||||||
|
* with the use of 3Com 3C359 TokenRing adapters. There is no
|
||||||
|
* waranty expressed or implied about its fitness for any purpose.
|
||||||
|
*/
|
||||||
|
/* 3c359_microcode.mac: 3Com 3C359 Tokenring microcode.
|
||||||
|
*
|
||||||
|
* Notes:
|
||||||
|
* - Loaded from xl_init upon adapter initialization.
|
||||||
|
*
|
||||||
|
* Available from 3Com as part of their standard 3C359 driver.
|
||||||
|
*/
|
||||||
|
|
||||||
|
Found in hex form in kernel source.
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------
|
||||||
|
|
Loading…
Reference in a new issue