提交 15b06690 编写于 作者: L Linus Torvalds

Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6

* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (44 commits)
  qlge: Fix sparse warnings for tx ring indexes.
  qlge: Fix sparse warning regarding rx buffer queues.
  qlge: Fix sparse endian warning in ql_hw_csum_setup().
  qlge: Fix sparse endian warning for inbound packet control block flags.
  qlge: Fix sparse warnings for byte swapping in qlge_ethool.c
  myri10ge: print MAC and serial number on probe failure
  pkt_sched: cls_u32: Fix locking in u32_change()
  iucv: fix cpu hotplug
  af_iucv: Free iucv path/socket in path_pending callback
  af_iucv: avoid left over IUCV connections from failing connects
  af_iucv: New error return codes for connect()
  net/ehea: bitops work on unsigned longs
  Revert "net: Fix for initial link state in 2.6.28"
  tcp: Kill extraneous SPLICE_F_NONBLOCK checks.
  tcp: don't mask EOF and socket errors on nonblocking splice receive
  dccp: Integrate the TFRC library with DCCP
  dccp: Clean up ccid.c after integration of CCID plugins
  dccp: Lockless integration of CCID congestion-control plugins
  qeth: get rid of extra argument after printk to dev_* conversion
  qeth: No large send using EDDP for HiperSockets.
  ...
......@@ -1519,7 +1519,7 @@ static int decodeFVteln(char *teln, unsigned long *bmaskp, int *activep)
int digit2 = 0;
if (!isdigit(*s)) return -3;
while (isdigit(*s)) { digit1 = digit1*10 + (*s - '0'); s++; }
if (digit1 <= 0 && digit1 > 30) return -4;
if (digit1 <= 0 || digit1 > 30) return -4;
if (*s == 0 || *s == ',' || *s == ' ') {
bmask |= (1 << digit1);
digit1 = 0;
......@@ -1530,7 +1530,7 @@ static int decodeFVteln(char *teln, unsigned long *bmaskp, int *activep)
s++;
if (!isdigit(*s)) return -3;
while (isdigit(*s)) { digit2 = digit2*10 + (*s - '0'); s++; }
if (digit2 <= 0 && digit2 > 30) return -4;
if (digit2 <= 0 || digit2 > 30) return -4;
if (*s == 0 || *s == ',' || *s == ' ') {
if (digit1 > digit2)
for (i = digit2; i <= digit1 ; i++)
......
......@@ -66,6 +66,7 @@
#include <linux/mm.h>
#include <linux/highmem.h>
#include <linux/sockios.h>
#include <linux/firmware.h>
#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
#include <linux/if_vlan.h>
......@@ -186,8 +187,6 @@ MODULE_DEVICE_TABLE(pci, acenic_pci_tbl);
#define MAX_RODATA_LEN 8*1024
#define MAX_DATA_LEN 2*1024
#include "acenic_firmware.h"
#ifndef tigon2FwReleaseLocal
#define tigon2FwReleaseLocal 0
#endif
......@@ -417,6 +416,10 @@ static int dis_pci_mem_inval[ACE_MAX_MOD_PARMS] = {1, 1, 1, 1, 1, 1, 1, 1};
MODULE_AUTHOR("Jes Sorensen <jes@trained-monkey.org>");
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("AceNIC/3C985/GA620 Gigabit Ethernet driver");
#ifndef CONFIG_ACENIC_OMIT_TIGON_I
MODULE_FIRMWARE("acenic/tg1.bin");
#endif
MODULE_FIRMWARE("acenic/tg2.bin");
module_param_array_named(link, link_state, int, NULL, 0);
module_param_array(trace, int, NULL, 0);
......@@ -943,8 +946,8 @@ static int __devinit ace_init(struct net_device *dev)
case 4:
case 5:
printk(KERN_INFO " Tigon I (Rev. %i), Firmware: %i.%i.%i, ",
tig_ver, tigonFwReleaseMajor, tigonFwReleaseMinor,
tigonFwReleaseFix);
tig_ver, ap->firmware_major, ap->firmware_minor,
ap->firmware_fix);
writel(0, &regs->LocalCtrl);
ap->version = 1;
ap->tx_ring_entries = TIGON_I_TX_RING_ENTRIES;
......@@ -952,8 +955,8 @@ static int __devinit ace_init(struct net_device *dev)
#endif
case 6:
printk(KERN_INFO " Tigon II (Rev. %i), Firmware: %i.%i.%i, ",
tig_ver, tigon2FwReleaseMajor, tigon2FwReleaseMinor,
tigon2FwReleaseFix);
tig_ver, ap->firmware_major, ap->firmware_minor,
ap->firmware_fix);
writel(readl(&regs->CpuBCtrl) | CPU_HALT, &regs->CpuBCtrl);
readl(&regs->CpuBCtrl); /* PCI write posting */
/*
......@@ -1205,7 +1208,9 @@ static int __devinit ace_init(struct net_device *dev)
memset(ap->info, 0, sizeof(struct ace_info));
memset(ap->skb, 0, sizeof(struct ace_skb));
ace_load_firmware(dev);
if (ace_load_firmware(dev))
goto init_error;
ap->fw_running = 0;
tmp_ptr = ap->info_dma;
......@@ -1441,10 +1446,7 @@ static int __devinit ace_init(struct net_device *dev)
if (ap->version >= 2)
writel(tmp, &regs->TuneFastLink);
if (ACE_IS_TIGON_I(ap))
writel(tigonFwStartAddr, &regs->Pc);
if (ap->version == 2)
writel(tigon2FwStartAddr, &regs->Pc);
writel(ap->firmware_start, &regs->Pc);
writel(0, &regs->Mb0Lo);
......@@ -2761,8 +2763,8 @@ static void ace_get_drvinfo(struct net_device *dev,
strlcpy(info->driver, "acenic", sizeof(info->driver));
snprintf(info->version, sizeof(info->version), "%i.%i.%i",
tigonFwReleaseMajor, tigonFwReleaseMinor,
tigonFwReleaseFix);
ap->firmware_major, ap->firmware_minor,
ap->firmware_fix);
if (ap->pdev)
strlcpy(info->bus_info, pci_name(ap->pdev),
......@@ -2869,11 +2871,10 @@ static struct net_device_stats *ace_get_stats(struct net_device *dev)
}
static void __devinit ace_copy(struct ace_regs __iomem *regs, void *src,
u32 dest, int size)
static void __devinit ace_copy(struct ace_regs __iomem *regs, const __be32 *src,
u32 dest, int size)
{
void __iomem *tdest;
u32 *wsrc;
short tsize, i;
if (size <= 0)
......@@ -2885,20 +2886,15 @@ static void __devinit ace_copy(struct ace_regs __iomem *regs, void *src,
tdest = (void __iomem *) &regs->Window +
(dest & (ACE_WINDOW_SIZE - 1));
writel(dest & ~(ACE_WINDOW_SIZE - 1), &regs->WinBase);
/*
* This requires byte swapping on big endian, however
* writel does that for us
*/
wsrc = src;
for (i = 0; i < (tsize / 4); i++) {
writel(wsrc[i], tdest + i*4);
/* Firmware is big-endian */
writel(be32_to_cpup(src), tdest);
src++;
tdest += 4;
dest += 4;
size -= 4;
}
dest += tsize;
src += tsize;
size -= tsize;
}
return;
}
......@@ -2937,8 +2933,13 @@ static void __devinit ace_clear(struct ace_regs __iomem *regs, u32 dest, int siz
*/
static int __devinit ace_load_firmware(struct net_device *dev)
{
const struct firmware *fw;
const char *fw_name = "acenic/tg2.bin";
struct ace_private *ap = netdev_priv(dev);
struct ace_regs __iomem *regs = ap->regs;
const __be32 *fw_data;
u32 load_addr;
int ret;
if (!(readl(&regs->CpuCtrl) & CPU_HALTED)) {
printk(KERN_ERR "%s: trying to download firmware while the "
......@@ -2946,28 +2947,52 @@ static int __devinit ace_load_firmware(struct net_device *dev)
return -EFAULT;
}
if (ACE_IS_TIGON_I(ap))
fw_name = "acenic/tg1.bin";
ret = request_firmware(&fw, fw_name, &ap->pdev->dev);
if (ret) {
printk(KERN_ERR "%s: Failed to load firmware \"%s\"\n",
ap->name, fw_name);
return ret;
}
fw_data = (void *)fw->data;
/* Firmware blob starts with version numbers, followed by
load and start address. Remainder is the blob to be loaded
contiguously from load address. We don't bother to represent
the BSS/SBSS sections any more, since we were clearing the
whole thing anyway. */
ap->firmware_major = fw->data[0];
ap->firmware_minor = fw->data[1];
ap->firmware_fix = fw->data[2];
ap->firmware_start = be32_to_cpu(fw_data[1]);
if (ap->firmware_start < 0x4000 || ap->firmware_start >= 0x80000) {
printk(KERN_ERR "%s: bogus load address %08x in \"%s\"\n",
ap->name, ap->firmware_start, fw_name);
ret = -EINVAL;
goto out;
}
load_addr = be32_to_cpu(fw_data[2]);
if (load_addr < 0x4000 || load_addr >= 0x80000) {
printk(KERN_ERR "%s: bogus load address %08x in \"%s\"\n",
ap->name, load_addr, fw_name);
ret = -EINVAL;
goto out;
}
/*
* Do not try to clear more than 512KB or we end up seeing
* funny things on NICs with only 512KB SRAM
* Do not try to clear more than 512KiB or we end up seeing
* funny things on NICs with only 512KiB SRAM
*/
ace_clear(regs, 0x2000, 0x80000-0x2000);
if (ACE_IS_TIGON_I(ap)) {
ace_copy(regs, tigonFwText, tigonFwTextAddr, tigonFwTextLen);
ace_copy(regs, tigonFwData, tigonFwDataAddr, tigonFwDataLen);
ace_copy(regs, tigonFwRodata, tigonFwRodataAddr,
tigonFwRodataLen);
ace_clear(regs, tigonFwBssAddr, tigonFwBssLen);
ace_clear(regs, tigonFwSbssAddr, tigonFwSbssLen);
}else if (ap->version == 2) {
ace_clear(regs, tigon2FwBssAddr, tigon2FwBssLen);
ace_clear(regs, tigon2FwSbssAddr, tigon2FwSbssLen);
ace_copy(regs, tigon2FwText, tigon2FwTextAddr,tigon2FwTextLen);
ace_copy(regs, tigon2FwRodata, tigon2FwRodataAddr,
tigon2FwRodataLen);
ace_copy(regs, tigon2FwData, tigon2FwDataAddr,tigon2FwDataLen);
}
return 0;
ace_copy(regs, &fw_data[3], load_addr, fw->size-12);
out:
release_firmware(fw);
return ret;
}
......
......@@ -694,6 +694,10 @@ struct ace_private
u32 last_tx, last_std_rx, last_mini_rx;
#endif
int pci_using_dac;
u8 firmware_major;
u8 firmware_minor;
u8 firmware_fix;
u32 firmware_start;
};
......
此差异已折叠。
......@@ -478,7 +478,7 @@ struct ehea_port {
int num_add_tx_qps;
int num_mcs;
int resets;
u64 flags;
unsigned long flags;
u64 mac_addr;
u32 logical_port_id;
u32 port_speed;
......@@ -510,7 +510,6 @@ void ehea_set_ethtool_ops(struct net_device *netdev);
int ehea_sense_port_attr(struct ehea_port *port);
int ehea_set_portspeed(struct ehea_port *port, u32 port_speed);
extern u64 ehea_driver_flags;
extern struct work_struct ehea_rereg_mr_task;
#endif /* __EHEA_H__ */
......@@ -99,7 +99,7 @@ MODULE_PARM_DESC(use_lro, " Large Receive Offload, 1: enable, 0: disable, "
static int port_name_cnt;
static LIST_HEAD(adapter_list);
u64 ehea_driver_flags;
static unsigned long ehea_driver_flags;
struct work_struct ehea_rereg_mr_task;
static DEFINE_MUTEX(dlpar_mem_lock);
struct ehea_fw_handle_array ehea_fw_handles;
......
......@@ -944,7 +944,7 @@ static void enc28j60_hw_rx(struct net_device *ndev)
if (netif_msg_rx_status(priv))
enc28j60_dump_rsv(priv, __func__, next_packet, len, rxstat);
if (!RSV_GETBIT(rxstat, RSV_RXOK)) {
if (!RSV_GETBIT(rxstat, RSV_RXOK) || len > MAX_FRAMELEN) {
if (netif_msg_rx_err(priv))
dev_err(&ndev->dev, "Rx Error (%04x)\n", rxstat);
ndev->stats.rx_errors++;
......@@ -952,6 +952,8 @@ static void enc28j60_hw_rx(struct net_device *ndev)
ndev->stats.rx_crc_errors++;
if (RSV_GETBIT(rxstat, RSV_LENCHECKERR))
ndev->stats.rx_frame_errors++;
if (len > MAX_FRAMELEN)
ndev->stats.rx_over_errors++;
} else {
skb = dev_alloc_skb(len + NET_IP_ALIGN);
if (!skb) {
......
......@@ -75,7 +75,7 @@
#include "myri10ge_mcp.h"
#include "myri10ge_mcp_gen_header.h"
#define MYRI10GE_VERSION_STR "1.4.4-1.395"
#define MYRI10GE_VERSION_STR "1.4.4-1.398"
MODULE_DESCRIPTION("Myricom 10G driver (10GbE)");
MODULE_AUTHOR("Maintainer: help@myri.com");
......@@ -3929,6 +3929,10 @@ static int myri10ge_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
myri10ge_dummy_rdma(mgp, 0);
abort_with_ioremap:
if (mgp->mac_addr_string != NULL)
dev_err(&pdev->dev,
"myri10ge_probe() failed: MAC=%s, SN=%ld\n",
mgp->mac_addr_string, mgp->serial_number);
iounmap(mgp->sram);
abort_with_mtrr:
......
......@@ -818,15 +818,6 @@ struct tx_doorbell_context {
};
/* DATA STRUCTURES SHARED WITH HARDWARE. */
struct bq_element {
u32 addr_lo;
#define BQ_END 0x00000001
#define BQ_CONT 0x00000002
#define BQ_MASK 0x00000003
u32 addr_hi;
} __attribute((packed));
struct tx_buf_desc {
__le64 addr;
__le32 len;
......@@ -860,8 +851,8 @@ struct ob_mac_iocb_req {
__le16 frame_len;
#define OB_MAC_IOCB_LEN_MASK 0x3ffff
__le16 reserved2;
__le32 tid;
__le32 txq_idx;
u32 tid;
u32 txq_idx;
__le32 reserved3;
__le16 vlan_tci;
__le16 reserved4;
......@@ -880,8 +871,8 @@ struct ob_mac_iocb_rsp {
u8 flags2; /* */
u8 flags3; /* */
#define OB_MAC_IOCB_RSP_B 0x80 /* */
__le32 tid;
__le32 txq_idx;
u32 tid;
u32 txq_idx;
__le32 reserved[13];
} __attribute((packed));
......@@ -903,8 +894,8 @@ struct ob_mac_tso_iocb_req {
#define OB_MAC_TSO_IOCB_V 0x04
__le32 reserved1[2];
__le32 frame_len;
__le32 tid;
__le32 txq_idx;
u32 tid;
u32 txq_idx;
__le16 total_hdrs_len;
__le16 net_trans_offset;
#define OB_MAC_TRANSPORT_HDR_SHIFT 6
......@@ -925,8 +916,8 @@ struct ob_mac_tso_iocb_rsp {
u8 flags2; /* */
u8 flags3; /* */
#define OB_MAC_TSO_IOCB_RSP_B 0x8000
__le32 tid;
__le32 txq_idx;
u32 tid;
u32 txq_idx;
__le32 reserved2[13];
} __attribute((packed));
......@@ -979,10 +970,11 @@ struct ib_mac_iocb_rsp {
__le16 reserved1;
__le32 reserved2[6];
__le32 flags4;
#define IB_MAC_IOCB_RSP_HV 0x20000000 /* */
#define IB_MAC_IOCB_RSP_HS 0x40000000 /* */
#define IB_MAC_IOCB_RSP_HL 0x80000000 /* */
u8 reserved3[3];
u8 flags4;
#define IB_MAC_IOCB_RSP_HV 0x20
#define IB_MAC_IOCB_RSP_HS 0x40
#define IB_MAC_IOCB_RSP_HL 0x80
__le32 hdr_len; /* */
__le32 hdr_addr_lo; /* */
__le32 hdr_addr_hi; /* */
......@@ -1126,7 +1118,7 @@ struct map_list {
struct tx_ring_desc {
struct sk_buff *skb;
struct ob_mac_iocb_req *queue_entry;
int index;
u32 index;
struct oal oal;
struct map_list map[MAX_SKB_FRAGS + 1];
int map_cnt;
......@@ -1138,8 +1130,8 @@ struct bq_desc {
struct page *lbq_page;
struct sk_buff *skb;
} p;
struct bq_element *bq;
int index;
__le64 *addr;
u32 index;
DECLARE_PCI_UNMAP_ADDR(mapaddr);
DECLARE_PCI_UNMAP_LEN(maplen);
};
......@@ -1189,7 +1181,7 @@ struct rx_ring {
u32 cq_size;
u32 cq_len;
u16 cq_id;
u32 *prod_idx_sh_reg; /* Shadowed producer register. */
volatile __le32 *prod_idx_sh_reg; /* Shadowed producer register. */
dma_addr_t prod_idx_sh_reg_dma;
void __iomem *cnsmr_idx_db_reg; /* PCI doorbell mem area + 0 */
u32 cnsmr_idx; /* current sw idx */
......@@ -1467,21 +1459,6 @@ static inline void ql_write_db_reg(u32 val, void __iomem *addr)
mmiowb();
}
/*
* Shadow Registers:
* Outbound queues have a consumer index that is maintained by the chip.
* Inbound queues have a producer index that is maintained by the chip.
* For lower overhead, these registers are "shadowed" to host memory
* which allows the device driver to track the queue progress without
* PCI reads. When an entry is placed on an inbound queue, the chip will
* update the relevant index register and then copy the value to the
* shadow register in host memory.
*/
static inline unsigned int ql_read_sh_reg(const volatile void *addr)
{
return *(volatile unsigned int __force *)addr;
}
extern char qlge_driver_name[];
extern const char qlge_driver_version[];
extern const struct ethtool_ops qlge_ethtool_ops;
......
......@@ -821,14 +821,11 @@ void ql_dump_ib_mac_rsp(struct ib_mac_iocb_rsp *ib_mac_rsp)
le16_to_cpu(ib_mac_rsp->vlan_id));
printk(KERN_ERR PFX "flags4 = %s%s%s.\n",
le32_to_cpu(ib_mac_rsp->
flags4) & IB_MAC_IOCB_RSP_HV ? "HV " : "",
le32_to_cpu(ib_mac_rsp->
flags4) & IB_MAC_IOCB_RSP_HS ? "HS " : "",
le32_to_cpu(ib_mac_rsp->
flags4) & IB_MAC_IOCB_RSP_HL ? "HL " : "");
if (le32_to_cpu(ib_mac_rsp->flags4) & IB_MAC_IOCB_RSP_HV) {
ib_mac_rsp->flags4 & IB_MAC_IOCB_RSP_HV ? "HV " : "",
ib_mac_rsp->flags4 & IB_MAC_IOCB_RSP_HS ? "HS " : "",
ib_mac_rsp->flags4 & IB_MAC_IOCB_RSP_HL ? "HL " : "");
if (ib_mac_rsp->flags4 & IB_MAC_IOCB_RSP_HV) {
printk(KERN_ERR PFX "hdr length = %d.\n",
le32_to_cpu(ib_mac_rsp->hdr_len));
printk(KERN_ERR PFX "hdr addr_hi = 0x%x.\n",
......
......@@ -56,9 +56,9 @@ static int ql_update_ring_coalescing(struct ql_adapter *qdev)
for (i = 1; i < qdev->rss_ring_first_cq_id; i++, rx_ring++) {
rx_ring = &qdev->rx_ring[i];
cqicb = (struct cqicb *)rx_ring;
cqicb->irq_delay = le16_to_cpu(qdev->tx_coalesce_usecs);
cqicb->irq_delay = cpu_to_le16(qdev->tx_coalesce_usecs);
cqicb->pkt_delay =
le16_to_cpu(qdev->tx_max_coalesced_frames);
cpu_to_le16(qdev->tx_max_coalesced_frames);
cqicb->flags = FLAGS_LI;
status = ql_write_cfg(qdev, cqicb, sizeof(cqicb),
CFG_LCQ, rx_ring->cq_id);
......@@ -79,9 +79,9 @@ static int ql_update_ring_coalescing(struct ql_adapter *qdev)
i++) {
rx_ring = &qdev->rx_ring[i];
cqicb = (struct cqicb *)rx_ring;
cqicb->irq_delay = le16_to_cpu(qdev->rx_coalesce_usecs);
cqicb->irq_delay = cpu_to_le16(qdev->rx_coalesce_usecs);
cqicb->pkt_delay =
le16_to_cpu(qdev->rx_max_coalesced_frames);
cpu_to_le16(qdev->rx_max_coalesced_frames);
cqicb->flags = FLAGS_LI;
status = ql_write_cfg(qdev, cqicb, sizeof(cqicb),
CFG_LCQ, rx_ring->cq_id);
......
......@@ -257,7 +257,7 @@ int ql_get_mac_addr_reg(struct ql_adapter *qdev, u32 type, u16 index,
{
status =
ql_wait_reg_rdy(qdev,
MAC_ADDR_IDX, MAC_ADDR_MW, MAC_ADDR_E);
MAC_ADDR_IDX, MAC_ADDR_MW, 0);
if (status)
goto exit;
ql_write32(qdev, MAC_ADDR_IDX, (offset++) | /* offset */
......@@ -265,13 +265,13 @@ int ql_get_mac_addr_reg(struct ql_adapter *qdev, u32 type, u16 index,
MAC_ADDR_ADR | MAC_ADDR_RS | type); /* type */
status =
ql_wait_reg_rdy(qdev,
MAC_ADDR_IDX, MAC_ADDR_MR, MAC_ADDR_E);
MAC_ADDR_IDX, MAC_ADDR_MR, 0);
if (status)
goto exit;
*value++ = ql_read32(qdev, MAC_ADDR_DATA);
status =
ql_wait_reg_rdy(qdev,
MAC_ADDR_IDX, MAC_ADDR_MW, MAC_ADDR_E);
MAC_ADDR_IDX, MAC_ADDR_MW, 0);
if (status)
goto exit;
ql_write32(qdev, MAC_ADDR_IDX, (offset++) | /* offset */
......@@ -279,14 +279,14 @@ int ql_get_mac_addr_reg(struct ql_adapter *qdev, u32 type, u16 index,
MAC_ADDR_ADR | MAC_ADDR_RS | type); /* type */
status =
ql_wait_reg_rdy(qdev,
MAC_ADDR_IDX, MAC_ADDR_MR, MAC_ADDR_E);
MAC_ADDR_IDX, MAC_ADDR_MR, 0);
if (status)
goto exit;
*value++ = ql_read32(qdev, MAC_ADDR_DATA);
if (type == MAC_ADDR_TYPE_CAM_MAC) {
status =
ql_wait_reg_rdy(qdev,
MAC_ADDR_IDX, MAC_ADDR_MW, MAC_ADDR_E);
MAC_ADDR_IDX, MAC_ADDR_MW, 0);
if (status)
goto exit;
ql_write32(qdev, MAC_ADDR_IDX, (offset++) | /* offset */
......@@ -294,7 +294,7 @@ int ql_get_mac_addr_reg(struct ql_adapter *qdev, u32 type, u16 index,
MAC_ADDR_ADR | MAC_ADDR_RS | type); /* type */
status =
ql_wait_reg_rdy(qdev, MAC_ADDR_IDX,
MAC_ADDR_MR, MAC_ADDR_E);
MAC_ADDR_MR, 0);
if (status)
goto exit;
*value++ = ql_read32(qdev, MAC_ADDR_DATA);
......@@ -344,7 +344,7 @@ static int ql_set_mac_addr_reg(struct ql_adapter *qdev, u8 *addr, u32 type,
status =
ql_wait_reg_rdy(qdev,
MAC_ADDR_IDX, MAC_ADDR_MW, MAC_ADDR_E);
MAC_ADDR_IDX, MAC_ADDR_MW, 0);
if (status)
goto exit;
ql_write32(qdev, MAC_ADDR_IDX, (offset++) | /* offset */
......@@ -353,7 +353,7 @@ static int ql_set_mac_addr_reg(struct ql_adapter *qdev, u8 *addr, u32 type,
ql_write32(qdev, MAC_ADDR_DATA, lower);
status =
ql_wait_reg_rdy(qdev,
MAC_ADDR_IDX, MAC_ADDR_MW, MAC_ADDR_E);
MAC_ADDR_IDX, MAC_ADDR_MW, 0);
if (status)
goto exit;
ql_write32(qdev, MAC_ADDR_IDX, (offset++) | /* offset */
......@@ -362,7 +362,7 @@ static int ql_set_mac_addr_reg(struct ql_adapter *qdev, u8 *addr, u32 type,
ql_write32(qdev, MAC_ADDR_DATA, upper);
status =
ql_wait_reg_rdy(qdev,
MAC_ADDR_IDX, MAC_ADDR_MW, MAC_ADDR_E);
MAC_ADDR_IDX, MAC_ADDR_MW, 0);
if (status)
goto exit;
ql_write32(qdev, MAC_ADDR_IDX, (offset) | /* offset */
......@@ -400,7 +400,7 @@ static int ql_set_mac_addr_reg(struct ql_adapter *qdev, u8 *addr, u32 type,
status =
ql_wait_reg_rdy(qdev,
MAC_ADDR_IDX, MAC_ADDR_MW, MAC_ADDR_E);
MAC_ADDR_IDX, MAC_ADDR_MW, 0);
if (status)
goto exit;
ql_write32(qdev, MAC_ADDR_IDX, offset | /* offset */
......@@ -431,13 +431,13 @@ int ql_get_routing_reg(struct ql_adapter *qdev, u32 index, u32 *value)
if (status)
goto exit;
status = ql_wait_reg_rdy(qdev, RT_IDX, RT_IDX_MW, RT_IDX_E);
status = ql_wait_reg_rdy(qdev, RT_IDX, RT_IDX_MW, 0);
if (status)
goto exit;
ql_write32(qdev, RT_IDX,
RT_IDX_TYPE_NICQ | RT_IDX_RS | (index << RT_IDX_IDX_SHIFT));
status = ql_wait_reg_rdy(qdev, RT_IDX, RT_IDX_MR, RT_IDX_E);
status = ql_wait_reg_rdy(qdev, RT_IDX, RT_IDX_MR, 0);
if (status)
goto exit;
*value = ql_read32(qdev, RT_DATA);
......@@ -874,7 +874,6 @@ static void ql_update_lbq(struct ql_adapter *qdev, struct rx_ring *rx_ring)
{
int clean_idx = rx_ring->lbq_clean_idx;
struct bq_desc *lbq_desc;
struct bq_element *bq;
u64 map;
int i;
......@@ -884,7 +883,6 @@ static void ql_update_lbq(struct ql_adapter *qdev, struct rx_ring *rx_ring)
"lbq: try cleaning clean_idx = %d.\n",
clean_idx);
lbq_desc = &rx_ring->lbq[clean_idx];
bq = lbq_desc->bq;
if (lbq_desc->p.lbq_page == NULL) {
QPRINTK(qdev, RX_STATUS, DEBUG,
"lbq: getting new page for index %d.\n",
......@@ -906,10 +904,7 @@ static void ql_update_lbq(struct ql_adapter *qdev, struct rx_ring *rx_ring)
}
pci_unmap_addr_set(lbq_desc, mapaddr, map);
pci_unmap_len_set(lbq_desc, maplen, PAGE_SIZE);
bq->addr_lo = /*lbq_desc->addr_lo = */
cpu_to_le32(map);
bq->addr_hi = /*lbq_desc->addr_hi = */
cpu_to_le32(map >> 32);
*lbq_desc->addr = cpu_to_le64(map);
}
clean_idx++;
if (clean_idx == rx_ring->lbq_len)
......@@ -934,7 +929,6 @@ static void ql_update_sbq(struct ql_adapter *qdev, struct rx_ring *rx_ring)
{
int clean_idx = rx_ring->sbq_clean_idx;
struct bq_desc *sbq_desc;
struct bq_element *bq;
u64 map;
int i;
......@@ -944,7 +938,6 @@ static void ql_update_sbq(struct ql_adapter *qdev, struct rx_ring *rx_ring)
QPRINTK(qdev, RX_STATUS, DEBUG,
"sbq: try cleaning clean_idx = %d.\n",
clean_idx);
bq = sbq_desc->bq;
if (sbq_desc->p.skb == NULL) {
QPRINTK(qdev, RX_STATUS, DEBUG,
"sbq: getting new skb for index %d.\n",
......@@ -963,11 +956,15 @@ static void ql_update_sbq(struct ql_adapter *qdev, struct rx_ring *rx_ring)
sbq_desc->p.skb->data,
rx_ring->sbq_buf_size /
2, PCI_DMA_FROMDEVICE);
if (pci_dma_mapping_error(qdev->pdev, map)) {
QPRINTK(qdev, IFUP, ERR, "PCI mapping failed.\n");
rx_ring->sbq_clean_idx = clean_idx;
return;
}
pci_unmap_addr_set(sbq_desc, mapaddr, map);
pci_unmap_len_set(sbq_desc, maplen,
rx_ring->sbq_buf_size / 2);
bq->addr_lo = cpu_to_le32(map);
bq->addr_hi = cpu_to_le32(map >> 32);
*sbq_desc->addr = cpu_to_le64(map);
}
clean_idx++;
......@@ -1303,6 +1300,11 @@ static struct sk_buff *ql_build_rx_skb(struct ql_adapter *qdev,
"No skb available, drop the packet.\n");
return NULL;
}
pci_unmap_page(qdev->pdev,
pci_unmap_addr(lbq_desc,
mapaddr),
pci_unmap_len(lbq_desc, maplen),
PCI_DMA_FROMDEVICE);
skb_reserve(skb, NET_IP_ALIGN);
QPRINTK(qdev, RX_STATUS, DEBUG,
"%d bytes of headers and data in large. Chain page to new skb and pull tail.\n", length);
......@@ -1330,7 +1332,7 @@ static struct sk_buff *ql_build_rx_skb(struct ql_adapter *qdev,
* eventually be in trouble.
*/
int size, offset, i = 0;
struct bq_element *bq, bq_array[8];
__le64 *bq, bq_array[8];
sbq_desc = ql_get_curr_sbuf(rx_ring);
pci_unmap_single(qdev->pdev,
pci_unmap_addr(sbq_desc, mapaddr),
......@@ -1356,16 +1358,10 @@ static struct sk_buff *ql_build_rx_skb(struct ql_adapter *qdev,
} else {
QPRINTK(qdev, RX_STATUS, DEBUG,
"Headers in small, %d bytes of data in chain of large.\n", length);
bq = (struct bq_element *)sbq_desc->p.skb->data;
bq = (__le64 *)sbq_desc->p.skb->data;
}
while (length > 0) {
lbq_desc = ql_get_curr_lbuf(rx_ring);
if ((bq->addr_lo & ~BQ_MASK) != lbq_desc->bq->addr_lo) {
QPRINTK(qdev, RX_STATUS, ERR,
"Panic!!! bad large buffer address, expected 0x%.08x, got 0x%.08x.\n",
lbq_desc->bq->addr_lo, bq->addr_lo);
return NULL;
}
pci_unmap_page(qdev->pdev,
pci_unmap_addr(lbq_desc,
mapaddr),
......@@ -1549,7 +1545,7 @@ static void ql_process_chip_ae_intr(struct ql_adapter *qdev,
static int ql_clean_outbound_rx_ring(struct rx_ring *rx_ring)
{
struct ql_adapter *qdev = rx_ring->qdev;
u32 prod = ql_read_sh_reg(rx_ring->prod_idx_sh_reg);
u32 prod = le32_to_cpu(*rx_ring->prod_idx_sh_reg);
struct ob_mac_iocb_rsp *net_rsp = NULL;
int count = 0;
......@@ -1575,7 +1571,7 @@ static int ql_clean_outbound_rx_ring(struct rx_ring *rx_ring)
}
count++;
ql_update_cq(rx_ring);
prod = ql_read_sh_reg(rx_ring->prod_idx_sh_reg);
prod = le32_to_cpu(*rx_ring->prod_idx_sh_reg);
}
ql_write_cq_idx(rx_ring);
if (netif_queue_stopped(qdev->ndev) && net_rsp != NULL) {
......@@ -1595,7 +1591,7 @@ static int ql_clean_outbound_rx_ring(struct rx_ring *rx_ring)
static int ql_clean_inbound_rx_ring(struct rx_ring *rx_ring, int budget)
{
struct ql_adapter *qdev = rx_ring->qdev;
u32 prod = ql_read_sh_reg(rx_ring->prod_idx_sh_reg);
u32 prod = le32_to_cpu(*rx_ring->prod_idx_sh_reg);
struct ql_net_rsp_iocb *net_rsp;
int count = 0;
......@@ -1628,7 +1624,7 @@ static int ql_clean_inbound_rx_ring(struct rx_ring *rx_ring, int budget)
}
count++;
ql_update_cq(rx_ring);
prod = ql_read_sh_reg(rx_ring->prod_idx_sh_reg);
prod = le32_to_cpu(*rx_ring->prod_idx_sh_reg);
if (count == budget)
break;
}
......@@ -1791,7 +1787,7 @@ static irqreturn_t qlge_isr(int irq, void *dev_id)
* Check the default queue and wake handler if active.
*/
rx_ring = &qdev->rx_ring[0];
if (ql_read_sh_reg(rx_ring->prod_idx_sh_reg) != rx_ring->cnsmr_idx) {
if (le32_to_cpu(*rx_ring->prod_idx_sh_reg) != rx_ring->cnsmr_idx) {
QPRINTK(qdev, INTR, INFO, "Waking handler for rx_ring[0].\n");
ql_disable_completion_interrupt(qdev, intr_context->intr);
queue_delayed_work_on(smp_processor_id(), qdev->q_workqueue,
......@@ -1805,7 +1801,7 @@ static irqreturn_t qlge_isr(int irq, void *dev_id)
*/
for (i = 1; i < qdev->rx_ring_count; i++) {
rx_ring = &qdev->rx_ring[i];
if (ql_read_sh_reg(rx_ring->prod_idx_sh_reg) !=
if (le32_to_cpu(*rx_ring->prod_idx_sh_reg) !=
rx_ring->cnsmr_idx) {
QPRINTK(qdev, INTR, INFO,
"Waking handler for rx_ring[%d].\n", i);
......@@ -1874,7 +1870,7 @@ static void ql_hw_csum_setup(struct sk_buff *skb,
{
int len;
struct iphdr *iph = ip_hdr(skb);
u16 *check;
__sum16 *check;
mac_iocb_ptr->opcode = OPCODE_OB_MAC_TSO_IOCB;
mac_iocb_ptr->frame_len = cpu_to_le32((u32) skb->len);
mac_iocb_ptr->net_trans_offset =
......@@ -2083,8 +2079,6 @@ static void ql_free_lbq_buffers(struct ql_adapter *qdev, struct rx_ring *rx_ring
put_page(lbq_desc->p.lbq_page);
lbq_desc->p.lbq_page = NULL;
}
lbq_desc->bq->addr_lo = 0;
lbq_desc->bq->addr_hi = 0;
}
}
......@@ -2097,12 +2091,12 @@ static int ql_alloc_lbq_buffers(struct ql_adapter *qdev,
int i;
struct bq_desc *lbq_desc;
u64 map;
struct bq_element *bq = rx_ring->lbq_base;
__le64 *bq = rx_ring->lbq_base;
for (i = 0; i < rx_ring->lbq_len; i++) {
lbq_desc = &rx_ring->lbq[i];
memset(lbq_desc, 0, sizeof(lbq_desc));
lbq_desc->bq = bq;
lbq_desc->addr = bq;
lbq_desc->index = i;
lbq_desc->p.lbq_page = alloc_page(GFP_ATOMIC);
if (unlikely(!lbq_desc->p.lbq_page)) {
......@@ -2119,8 +2113,7 @@ static int ql_alloc_lbq_buffers(struct ql_adapter *qdev,
}
pci_unmap_addr_set(lbq_desc, mapaddr, map);
pci_unmap_len_set(lbq_desc, maplen, PAGE_SIZE);
bq->addr_lo = cpu_to_le32(map);
bq->addr_hi = cpu_to_le32(map >> 32);
*lbq_desc->addr = cpu_to_le64(map);
}
bq++;
}
......@@ -2149,13 +2142,6 @@ static void ql_free_sbq_buffers(struct ql_adapter *qdev, struct rx_ring *rx_ring
dev_kfree_skb(sbq_desc->p.skb);
sbq_desc->p.skb = NULL;
}
if (sbq_desc->bq == NULL) {
QPRINTK(qdev, IFUP, ERR, "sbq_desc->bq %d is NULL.\n",
i);
return;
}
sbq_desc->bq->addr_lo = 0;
sbq_desc->bq->addr_hi = 0;
}
}
......@@ -2167,13 +2153,13 @@ static int ql_alloc_sbq_buffers(struct ql_adapter *qdev,
struct bq_desc *sbq_desc;
struct sk_buff *skb;
u64 map;
struct bq_element *bq = rx_ring->sbq_base;
__le64 *bq = rx_ring->sbq_base;
for (i = 0; i < rx_ring->sbq_len; i++) {
sbq_desc = &rx_ring->sbq[i];
memset(sbq_desc, 0, sizeof(sbq_desc));
sbq_desc->index = i;
sbq_desc->bq = bq;
sbq_desc->addr = bq;
skb = netdev_alloc_skb(qdev->ndev, rx_ring->sbq_buf_size);
if (unlikely(!skb)) {
/* Better luck next round */
......@@ -2199,10 +2185,7 @@ static int ql_alloc_sbq_buffers(struct ql_adapter *qdev,
}
pci_unmap_addr_set(sbq_desc, mapaddr, map);
pci_unmap_len_set(sbq_desc, maplen, rx_ring->sbq_buf_size / 2);
bq->addr_lo = /*sbq_desc->addr_lo = */
cpu_to_le32(map);
bq->addr_hi = /*sbq_desc->addr_hi = */
cpu_to_le32(map >> 32);
*sbq_desc->addr = cpu_to_le64(map);
bq++;
}
return 0;
......@@ -2481,7 +2464,8 @@ static int ql_start_rx_ring(struct ql_adapter *qdev, struct rx_ring *rx_ring)
memset((void *)cqicb, 0, sizeof(struct cqicb));
cqicb->msix_vect = rx_ring->irq;
cqicb->len = cpu_to_le16(rx_ring->cq_len | LEN_V | LEN_CPP_CONT);
bq_len = (rx_ring->cq_len == 65536) ? 0 : (u16) rx_ring->cq_len;
cqicb->len = cpu_to_le16(bq_len | LEN_V | LEN_CPP_CONT);
cqicb->addr_lo = cpu_to_le32(rx_ring->cq_base_dma);
cqicb->addr_hi = cpu_to_le32((u64) rx_ring->cq_base_dma >> 32);
......@@ -2503,8 +2487,11 @@ static int ql_start_rx_ring(struct ql_adapter *qdev, struct rx_ring *rx_ring)
cpu_to_le32(rx_ring->lbq_base_indirect_dma);
cqicb->lbq_addr_hi =
cpu_to_le32((u64) rx_ring->lbq_base_indirect_dma >> 32);
cqicb->lbq_buf_size = cpu_to_le32(rx_ring->lbq_buf_size);
bq_len = (u16) rx_ring->lbq_len;
bq_len = (rx_ring->lbq_buf_size == 65536) ? 0 :
(u16) rx_ring->lbq_buf_size;
cqicb->lbq_buf_size = cpu_to_le16(bq_len);
bq_len = (rx_ring->lbq_len == 65536) ? 0 :
(u16) rx_ring->lbq_len;
cqicb->lbq_len = cpu_to_le16(bq_len);
rx_ring->lbq_prod_idx = rx_ring->lbq_len - 16;
rx_ring->lbq_curr_idx = 0;
......@@ -2520,7 +2507,8 @@ static int ql_start_rx_ring(struct ql_adapter *qdev, struct rx_ring *rx_ring)
cpu_to_le32((u64) rx_ring->sbq_base_indirect_dma >> 32);
cqicb->sbq_buf_size =
cpu_to_le16(((rx_ring->sbq_buf_size / 2) + 8) & 0xfffffff8);
bq_len = (u16) rx_ring->sbq_len;
bq_len = (rx_ring->sbq_len == 65536) ? 0 :
(u16) rx_ring->sbq_len;
cqicb->sbq_len = cpu_to_le16(bq_len);
rx_ring->sbq_prod_idx = rx_ring->sbq_len - 16;
rx_ring->sbq_curr_idx = 0;
......@@ -3341,11 +3329,11 @@ static int ql_configure_rings(struct ql_adapter *qdev)
rx_ring->cq_len * sizeof(struct ql_net_rsp_iocb);
rx_ring->lbq_len = NUM_LARGE_BUFFERS;
rx_ring->lbq_size =
rx_ring->lbq_len * sizeof(struct bq_element);
rx_ring->lbq_len * sizeof(__le64);
rx_ring->lbq_buf_size = LARGE_BUFFER_SIZE;
rx_ring->sbq_len = NUM_SMALL_BUFFERS;
rx_ring->sbq_size =
rx_ring->sbq_len * sizeof(struct bq_element);
rx_ring->sbq_len * sizeof(__le64);
rx_ring->sbq_buf_size = SMALL_BUFFER_SIZE * 2;
rx_ring->type = DEFAULT_Q;
} else if (i < qdev->rss_ring_first_cq_id) {
......@@ -3372,11 +3360,11 @@ static int ql_configure_rings(struct ql_adapter *qdev)
rx_ring->cq_len * sizeof(struct ql_net_rsp_iocb);
rx_ring->lbq_len = NUM_LARGE_BUFFERS;
rx_ring->lbq_size =
rx_ring->lbq_len * sizeof(struct bq_element);
rx_ring->lbq_len * sizeof(__le64);
rx_ring->lbq_buf_size = LARGE_BUFFER_SIZE;
rx_ring->sbq_len = NUM_SMALL_BUFFERS;
rx_ring->sbq_size =
rx_ring->sbq_len * sizeof(struct bq_element);
rx_ring->sbq_len * sizeof(__le64);
rx_ring->sbq_buf_size = SMALL_BUFFER_SIZE * 2;
rx_ring->type = RX_Q;
}
......
......@@ -42,11 +42,11 @@
#include <linux/mii.h>
#include <linux/if_vlan.h>
#include <linux/mm.h>
#include <linux/firmware.h>
#include <asm/processor.h> /* Processor type for cache alignment. */
#include <asm/uaccess.h>
#include <asm/io.h>
#include "starfire_firmware.h"
/*
* The current frame processor firmware fails to checksum a fragment
* of length 1. If and when this is fixed, the #define below can be removed.
......@@ -173,6 +173,10 @@ static int full_duplex[MAX_UNITS] = {0, };
#define skb_first_frag_len(skb) skb_headlen(skb)
#define skb_num_frags(skb) (skb_shinfo(skb)->nr_frags + 1)
/* Firmware names */
#define FIRMWARE_RX "adaptec/starfire_rx.bin"
#define FIRMWARE_TX "adaptec/starfire_tx.bin"
/* These identify the driver base version and may not be removed. */
static char version[] =
KERN_INFO "starfire.c:v1.03 7/26/2000 Written by Donald Becker <becker@scyld.com>\n"
......@@ -182,6 +186,8 @@ MODULE_AUTHOR("Donald Becker <becker@scyld.com>");
MODULE_DESCRIPTION("Adaptec Starfire Ethernet driver");
MODULE_LICENSE("GPL");
MODULE_VERSION(DRV_VERSION);
MODULE_FIRMWARE(FIRMWARE_RX);
MODULE_FIRMWARE(FIRMWARE_TX);
module_param(max_interrupt_work, int, 0);
module_param(mtu, int, 0);
......@@ -902,9 +908,12 @@ static void mdio_write(struct net_device *dev, int phy_id, int location, int val
static int netdev_open(struct net_device *dev)
{
const struct firmware *fw_rx, *fw_tx;
const __be32 *fw_rx_data, *fw_tx_data;
struct netdev_private *np = netdev_priv(dev);
void __iomem *ioaddr = np->base;
int i, retval;
size_t tx_size, rx_size;
size_t tx_done_q_size, rx_done_q_size, tx_ring_size, rx_ring_size;
/* Do we ever need to reset the chip??? */
......@@ -1040,11 +1049,40 @@ static int netdev_open(struct net_device *dev)
writel(ETH_P_8021Q, ioaddr + VlanType);
#endif /* VLAN_SUPPORT */
retval = request_firmware(&fw_rx, FIRMWARE_RX, &np->pci_dev->dev);
if (retval) {
printk(KERN_ERR "starfire: Failed to load firmware \"%s\"\n",
FIRMWARE_RX);
return retval;
}
if (fw_rx->size % 4) {
printk(KERN_ERR "starfire: bogus length %zu in \"%s\"\n",
fw_rx->size, FIRMWARE_RX);
retval = -EINVAL;
goto out_rx;
}
retval = request_firmware(&fw_tx, FIRMWARE_TX, &np->pci_dev->dev);
if (retval) {
printk(KERN_ERR "starfire: Failed to load firmware \"%s\"\n",
FIRMWARE_TX);
goto out_rx;
}
if (fw_tx->size % 4) {
printk(KERN_ERR "starfire: bogus length %zu in \"%s\"\n",
fw_tx->size, FIRMWARE_TX);
retval = -EINVAL;
goto out_tx;
}
fw_rx_data = (const __be32 *)&fw_rx->data[0];
fw_tx_data = (const __be32 *)&fw_tx->data[0];
rx_size = fw_rx->size / 4;
tx_size = fw_tx->size / 4;
/* Load Rx/Tx firmware into the frame processors */
for (i = 0; i < FIRMWARE_RX_SIZE * 2; i++)
writel(firmware_rx[i], ioaddr + RxGfpMem + i * 4);
for (i = 0; i < FIRMWARE_TX_SIZE * 2; i++)
writel(firmware_tx[i], ioaddr + TxGfpMem + i * 4);
for (i = 0; i < rx_size; i++)
writel(be32_to_cpup(&fw_rx_data[i]), ioaddr + RxGfpMem + i * 4);
for (i = 0; i < tx_size; i++)
writel(be32_to_cpup(&fw_tx_data[i]), ioaddr + TxGfpMem + i * 4);
if (enable_hw_cksum)
/* Enable the Rx and Tx units, and the Rx/Tx frame processors. */
writel(TxEnable|TxGFPEnable|RxEnable|RxGFPEnable, ioaddr + GenCtrl);
......@@ -1056,7 +1094,11 @@ static int netdev_open(struct net_device *dev)
printk(KERN_DEBUG "%s: Done netdev_open().\n",
dev->name);
return 0;
out_tx:
release_firmware(fw_tx);
out_rx:
release_firmware(fw_rx);
return retval;
}
......
/*
* Copyright 2003 Adaptec, Inc.
*
* Please read the following license before using the Adaptec Software
* ("Program"). If you do not agree to the license terms, do not use the
* Program:
*
* You agree to be bound by version 2 of the General Public License ("GPL")
* dated June 1991, which can be found at http://www.fsf.org/licenses/gpl.html.
* If the link is broken, write to Free Software Foundation, 59 Temple Place,
* Boston, Massachusetts 02111-1307.
*
* BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE IT IS LICENSED "AS IS" AND
* THERE IS NO WARRANTY FOR THE PROGRAM, INCLUDING BUT NOT LIMITED TO THE
* IMPLIED WARRANTIES OF MERCHANTIBILITY OR FITNESS FOR A PARTICULAR PURPOSE
* (TO THE EXTENT PERMITTED BY APPLICABLE LAW). USE OF THE PROGRAM IS AT YOUR
* OWN RISK. IN NO EVENT WILL ADAPTEC OR ITS LICENSORS BE LIABLE TO YOU FOR
* DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES
* ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM.
*
*/
static const u32 firmware_rx[] = {
0x010003dc, 0x00000000,
0x04000421, 0x00000086,
0x80000015, 0x0000180e,
0x81000015, 0x00006664,
0x1a0040ab, 0x00000b06,
0x14200011, 0x00000000,
0x14204022, 0x0000aaaa,
0x14204022, 0x00000300,
0x14204022, 0x00000000,
0x1a0040ab, 0x00000b14,
0x14200011, 0x00000000,
0x83000015, 0x00000002,
0x04000021, 0x00000000,
0x00000010, 0x00000000,
0x04000421, 0x00000087,
0x00000010, 0x00000000,
0x00000010, 0x00000000,
0x00008015, 0x00000000,
0x0000003e, 0x00000000,
0x00000010, 0x00000000,
0x82000015, 0x00004000,
0x009e8050, 0x00000000,
0x03008015, 0x00000000,
0x86008015, 0x00000000,
0x82000015, 0x00008000,
0x0100001c, 0x00000000,
0x000050a0, 0x0000010c,
0x4e20d011, 0x00006008,
0x1420d012, 0x00004008,
0x0000f090, 0x00007000,
0x0000c8b0, 0x00003000,
0x00004040, 0x00000000,
0x00108015, 0x00000000,
0x00a2c150, 0x00004000,
0x00a400b0, 0x00000014,
0x00000020, 0x00000000,
0x2500400d, 0x00002525,
0x00047220, 0x00003100,
0x00934070, 0x00000000,
0x00000020, 0x00000000,
0x00924460, 0x00000184,
0x2b20c011, 0x00000000,
0x0000c420, 0x00000540,
0x36014018, 0x0000422d,
0x14200011, 0x00000000,
0x00924460, 0x00000183,
0x3200001f, 0x00000034,
0x02ac0015, 0x00000002,
0x00a60110, 0x00000008,
0x42200011, 0x00000000,
0x00924060, 0x00000103,
0x0000001e, 0x00000000,
0x00000020, 0x00000100,
0x0000001e, 0x00000000,
0x00924460, 0x00000086,
0x00004080, 0x00000000,
0x0092c070, 0x00000000,
0x00924060, 0x00000100,
0x0000c890, 0x00005000,
0x00a6c110, 0x00000000,
0x00b0c090, 0x00000012,
0x021c0015, 0x00000000,
0x3200001f, 0x00000034,
0x00924460, 0x00000510,
0x44210011, 0x00000000,
0x42000011, 0x00000000,
0x83000015, 0x00000040,
0x00924460, 0x00000508,
0x45014018, 0x00004545,
0x00808050, 0x00000000,
0x62208012, 0x00000000,
0x82000015, 0x00000800,
0x15200011, 0x00000000,
0x00000010, 0x00000000,
0x00000010, 0x00000000,
0x00000010, 0x00000000,
0x00000010, 0x00000000,
0x00000010, 0x00000000,
0x80000015, 0x0000eea4,
0x81000015, 0x0000005f,
0x00000060, 0x00000000,
0x00004120, 0x00000000,
0x00004a00, 0x00004000,
0x00924460, 0x00000190,
0x5601401a, 0x00005956,
0x14000011, 0x00000000,
0x00934050, 0x00000018,
0x00930050, 0x00000018,
0x3601403a, 0x0000002d,
0x000643a9, 0x00000000,
0x0000c420, 0x00000140,
0x5601401a, 0x00005956,
0x14000011, 0x00000000,
0x00000010, 0x00000000,
0x00000010, 0x00000000,
0x000642a9, 0x00000000,
0x00024420, 0x00000183,
0x5601401a, 0x00005956,
0x82000015, 0x00002000,
0x15200011, 0x00000000,
0x82000015, 0x00000010,
0x15200011, 0x00000000,
0x82000015, 0x00000010,
0x15200011, 0x00000000,
}; /* 104 Rx instructions */
#define FIRMWARE_RX_SIZE 104
static const u32 firmware_tx[] = {
0x010003dc, 0x00000000,
0x04000421, 0x00000086,
0x80000015, 0x0000180e,
0x81000015, 0x00006664,
0x1a0040ab, 0x00000b06,
0x14200011, 0x00000000,
0x14204022, 0x0000aaaa,
0x14204022, 0x00000300,
0x14204022, 0x00000000,
0x1a0040ab, 0x00000b14,
0x14200011, 0x00000000,
0x83000015, 0x00000002,
0x04000021, 0x00000000,
0x00000010, 0x00000000,
0x04000421, 0x00000087,
0x00000010, 0x00000000,
0x00000010, 0x00000000,
0x00008015, 0x00000000,
0x0000003e, 0x00000000,
0x00000010, 0x00000000,
0x82000015, 0x00004000,
0x009e8050, 0x00000000,
0x03008015, 0x00000000,
0x86008015, 0x00000000,
0x82000015, 0x00008000,
0x0100001c, 0x00000000,
0x000050a0, 0x0000010c,
0x4e20d011, 0x00006008,
0x1420d012, 0x00004008,
0x0000f090, 0x00007000,
0x0000c8b0, 0x00003000,
0x00004040, 0x00000000,
0x00108015, 0x00000000,
0x00a2c150, 0x00004000,
0x00a400b0, 0x00000014,
0x00000020, 0x00000000,
0x2500400d, 0x00002525,
0x00047220, 0x00003100,
0x00934070, 0x00000000,
0x00000020, 0x00000000,
0x00924460, 0x00000184,
0x2b20c011, 0x00000000,
0x0000c420, 0x00000540,
0x36014018, 0x0000422d,
0x14200011, 0x00000000,
0x00924460, 0x00000183,
0x3200001f, 0x00000034,
0x02ac0015, 0x00000002,
0x00a60110, 0x00000008,
0x42200011, 0x00000000,
0x00924060, 0x00000103,
0x0000001e, 0x00000000,
0x00000020, 0x00000100,
0x0000001e, 0x00000000,
0x00924460, 0x00000086,
0x00004080, 0x00000000,
0x0092c070, 0x00000000,
0x00924060, 0x00000100,
0x0000c890, 0x00005000,
0x00a6c110, 0x00000000,
0x00b0c090, 0x00000012,
0x021c0015, 0x00000000,
0x3200001f, 0x00000034,
0x00924460, 0x00000510,
0x44210011, 0x00000000,
0x42000011, 0x00000000,
0x83000015, 0x00000040,
0x00924460, 0x00000508,
0x45014018, 0x00004545,
0x00808050, 0x00000000,
0x62208012, 0x00000000,
0x82000015, 0x00000800,
0x15200011, 0x00000000,
0x00000010, 0x00000000,
0x00000010, 0x00000000,
0x00000010, 0x00000000,
0x00000010, 0x00000000,
0x00000010, 0x00000000,
0x80000015, 0x0000eea4,
0x81000015, 0x0000005f,
0x00000060, 0x00000000,
0x00004120, 0x00000000,
0x00004a00, 0x00004000,
0x00924460, 0x00000190,
0x5601401a, 0x00005956,
0x14000011, 0x00000000,
0x00934050, 0x00000018,
0x00930050, 0x00000018,
0x3601403a, 0x0000002d,
0x000643a9, 0x00000000,
0x0000c420, 0x00000140,
0x5601401a, 0x00005956,
0x14000011, 0x00000000,
0x00000010, 0x00000000,
0x00000010, 0x00000000,
0x000642a9, 0x00000000,
0x00024420, 0x00000183,
0x5601401a, 0x00005956,
0x82000015, 0x00002000,
0x15200011, 0x00000000,
0x82000015, 0x00000010,
0x15200011, 0x00000000,
0x82000015, 0x00000010,
0x15200011, 0x00000000,
}; /* 104 Tx instructions */
#define FIRMWARE_TX_SIZE 104
#if 0
static const u32 firmware_wol[] = {
0x010003dc, 0x00000000,
0x19000421, 0x00000087,
0x80000015, 0x00001a1a,
0x81000015, 0x00001a1a,
0x1a0040ab, 0x00000b06,
0x15200011, 0x00000000,
0x15204022, 0x0000aaaa,
0x15204022, 0x00000300,
0x15204022, 0x00000000,
0x1a0040ab, 0x00000b15,
0x15200011, 0x00000000,
0x83000015, 0x00000002,
0x04000021, 0x00000000,
0x00000010, 0x00000000,
0x04000421, 0x00000087,
0x00000010, 0x00000000,
0x00000010, 0x00000000,
0x00008015, 0x00000000,
0x0000003e, 0x00000000,
0x00000010, 0x00000000,
0x00000010, 0x00000000,
0x82000015, 0x00004000,
0x82000015, 0x00008000,
0x0000000c, 0x00000000,
0x00000010, 0x00000000,
0x00004080, 0x00000100,
0x1f20c011, 0x00001122,
0x2720f011, 0x00003011,
0x19200071, 0x00000000,
0x1a200051, 0x00000000,
0x00000010, 0x00000000,
0x00000010, 0x00000000,
0x1d2040a4, 0x00003344,
0x1d2040a2, 0x00005566,
0x000040a0, 0x00000100,
0x00108050, 0x00000001,
0x1a208012, 0x00000006,
0x82000015, 0x00008080,
0x010003dc, 0x00000000,
0x1d2040a4, 0x00002233,
0x1d2040a4, 0x00004455,
0x2d208011, 0x00000005,
0x1d2040a4, 0x00006611,
0x00108050, 0x00000001,
0x27200011, 0x00000000,
0x1d2050a4, 0x00006600,
0x82000015, 0x00008080,
0x010003dc, 0x00000000,
0x00000050, 0x00000000,
0x1b200031, 0x00000000,
0x0000001e, 0x00000000,
0x0000001e, 0x00000000,
0x0000001e, 0x00000000,
0x0000001e, 0x00000000,
0x00924460, 0x00000086,
0x00004080, 0x00000000,
0x0092c070, 0x00000000,
0x00924060, 0x00000100,
0x0000c890, 0x00005000,
0x00a6c110, 0x00000000,
0x00b0c090, 0x00000012,
0x021c0015, 0x00000000,
0x3200001f, 0x00000034,
0x00924460, 0x00000510,
0x44210011, 0x00000000,
0x42000011, 0x00000000,
0x83000015, 0x00000040,
0x00924460, 0x00000508,
0x476a0012, 0x00000100,
0x83000015, 0x00000008,
0x16200011, 0x00000000,
0x001e8050, 0x00000000,
0x001e8050, 0x00000000,
0x00808050, 0x00000000,
0x03008015, 0x00000000,
0x62208012, 0x00000000,
0x82000015, 0x00000800,
0x16200011, 0x00000000,
0x80000015, 0x0000eea4,
0x81000015, 0x0000005f,
0x00000020, 0x00000000,
0x00004120, 0x00000000,
0x00004a00, 0x00004000,
0x00924460, 0x00000190,
0x5c01401a, 0x0000595c,
0x15000011, 0x00000000,
0x00934050, 0x00000018,
0x00930050, 0x00000018,
0x3601403a, 0x0000002d,
0x00064029, 0x00000000,
0x0000c420, 0x00000140,
0x5c01401a, 0x0000595c,
0x15000011, 0x00000000,
0x00000010, 0x00000000,
0x00000010, 0x00000000,
0x00064029, 0x00000000,
0x00024420, 0x00000183,
0x5c01401a, 0x0000595c,
0x82000015, 0x00002000,
0x16200011, 0x00000000,
0x82000015, 0x00000010,
0x16200011, 0x00000000,
0x82000015, 0x00000010,
0x16200011, 0x00000000,
}; /* 104 WoL instructions */
#define FIRMWARE_WOL_SIZE 104
#endif
#!/usr/bin/perl
# This script can be used to generate a new starfire_firmware.h
# from GFP_RX.DAT and GFP_TX.DAT, files included with the DDK
# and also with the Novell drivers.
open FW, "GFP_RX.DAT" || die;
open FWH, ">starfire_firmware.h" || die;
printf(FWH "static u32 firmware_rx[] = {\n");
$counter = 0;
while ($foo = <FW>) {
chomp;
printf(FWH " 0x%s, 0x0000%s,\n", substr($foo, 4, 8), substr($foo, 0, 4));
$counter++;
}
close FW;
open FW, "GFP_TX.DAT" || die;
printf(FWH "};\t/* %d Rx instructions */\n#define FIRMWARE_RX_SIZE %d\n\nstatic u32 firmware_tx[] = {\n", $counter, $counter);
$counter = 0;
while ($foo = <FW>) {
chomp;
printf(FWH " 0x%s, 0x0000%s,\n", substr($foo, 4, 8), substr($foo, 0, 4));
$counter++;
}
close FW;
printf(FWH "};\t/* %d Tx instructions */\n#define FIRMWARE_TX_SIZE %d\n", $counter, $counter);
close(FWH);
此差异已折叠。
......@@ -2762,6 +2762,10 @@ struct tg3 {
#define SST_25VF0X0_PAGE_SIZE 4098
struct ethtool_coalesce coal;
/* firmware info */
const struct firmware *fw;
u32 fw_len; /* includes BSS */
};
#endif /* !(_T3_H) */
......@@ -213,7 +213,7 @@ static int check_filter(struct tap_filter *filter, const struct sk_buff *skb)
/* Network device part of the driver */
static unsigned int tun_net_id;
static int tun_net_id;
struct tun_net {
struct list_head dev_list;
};
......
......@@ -643,7 +643,6 @@ struct qeth_card_options {
int macaddr_mode;
int fake_broadcast;
int add_hhlen;
int fake_ll;
int layer2;
enum qeth_large_send_types large_send;
int performance_stats;
......
......@@ -287,8 +287,15 @@ int qeth_set_large_send(struct qeth_card *card,
card->options.large_send = type;
switch (card->options.large_send) {
case QETH_LARGE_SEND_EDDP:
card->dev->features |= NETIF_F_TSO | NETIF_F_SG |
if (card->info.type != QETH_CARD_TYPE_IQD) {
card->dev->features |= NETIF_F_TSO | NETIF_F_SG |
NETIF_F_HW_CSUM;
} else {
card->dev->features &= ~(NETIF_F_TSO | NETIF_F_SG |
NETIF_F_HW_CSUM);
card->options.large_send = QETH_LARGE_SEND_NO;
rc = -EOPNOTSUPP;
}
break;
case QETH_LARGE_SEND_TSO:
if (qeth_is_supported(card, IPA_OUTBOUND_TSO)) {
......@@ -572,6 +579,10 @@ static void qeth_send_control_data_cb(struct qeth_channel *channel,
card = CARD_FROM_CDEV(channel->ccwdev);
if (qeth_check_idx_response(iob->data)) {
qeth_clear_ipacmd_list(card);
if (((iob->data[2] & 0xc0) == 0xc0) && iob->data[4] == 0xf6)
dev_err(&card->gdev->dev,
"The qeth device is not configured "
"for the OSI layer required by z/VM\n");
qeth_schedule_recovery(card);
goto out;
}
......@@ -1072,7 +1083,6 @@ static void qeth_set_intial_options(struct qeth_card *card)
card->options.macaddr_mode = QETH_TR_MACADDR_NONCANONICAL;
card->options.fake_broadcast = 0;
card->options.add_hhlen = DEFAULT_ADD_HHLEN;
card->options.fake_ll = 0;
card->options.performance_stats = 0;
card->options.rx_sg_cb = QETH_RX_SG_CB;
}
......@@ -1682,6 +1692,7 @@ int qeth_send_control_data(struct qeth_card *card, int len,
unsigned long flags;
struct qeth_reply *reply = NULL;
unsigned long timeout;
struct qeth_ipa_cmd *cmd;
QETH_DBF_TEXT(TRACE, 2, "sendctl");
......@@ -1728,17 +1739,34 @@ int qeth_send_control_data(struct qeth_card *card, int len,
wake_up(&card->wait_q);
return rc;
}
while (!atomic_read(&reply->received)) {
if (time_after(jiffies, timeout)) {
spin_lock_irqsave(&reply->card->lock, flags);
list_del_init(&reply->list);
spin_unlock_irqrestore(&reply->card->lock, flags);
reply->rc = -ETIME;
atomic_inc(&reply->received);
wake_up(&reply->wait_q);
}
cpu_relax();
};
/* we have only one long running ipassist, since we can ensure
process context of this command we can sleep */
cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
if ((cmd->hdr.command == IPA_CMD_SETIP) &&
(cmd->hdr.prot_version == QETH_PROT_IPV4)) {
if (!wait_event_timeout(reply->wait_q,
atomic_read(&reply->received), timeout))
goto time_err;
} else {
while (!atomic_read(&reply->received)) {
if (time_after(jiffies, timeout))
goto time_err;
cpu_relax();
};
}
rc = reply->rc;
qeth_put_reply(reply);
return rc;
time_err:
spin_lock_irqsave(&reply->card->lock, flags);
list_del_init(&reply->list);
spin_unlock_irqrestore(&reply->card->lock, flags);
reply->rc = -ETIME;
atomic_inc(&reply->received);
wake_up(&reply->wait_q);
rc = reply->rc;
qeth_put_reply(reply);
return rc;
......@@ -2250,7 +2278,8 @@ void qeth_print_status_message(struct qeth_card *card)
}
/* fallthrough */
case QETH_CARD_TYPE_IQD:
if (card->info.guestlan) {
if ((card->info.guestlan) ||
(card->info.mcl_level[0] & 0x80)) {
card->info.mcl_level[0] = (char) _ebcasc[(__u8)
card->info.mcl_level[0]];
card->info.mcl_level[1] = (char) _ebcasc[(__u8)
......
......@@ -1126,9 +1126,11 @@ static int qeth_l2_recover(void *ptr)
dev_info(&card->gdev->dev,
"Device successfully recovered!\n");
else {
rtnl_lock();
dev_close(card->dev);
rtnl_unlock();
if (card->dev) {
rtnl_lock();
dev_close(card->dev);
rtnl_unlock();
}
dev_warn(&card->gdev->dev, "The qeth device driver "
"failed to recover an error on the device\n");
}
......
......@@ -1047,7 +1047,7 @@ static int qeth_l3_setadapter_parms(struct qeth_card *card)
rc = qeth_setadpparms_change_macaddr(card);
if (rc)
dev_warn(&card->gdev->dev, "Reading the adapter MAC"
" address failed\n", rc);
" address failed\n");
}
if ((card->info.link_type == QETH_LINK_TYPE_HSTR) ||
......@@ -1207,12 +1207,9 @@ static int qeth_l3_start_ipa_source_mac(struct qeth_card *card)
QETH_DBF_TEXT(TRACE, 3, "stsrcmac");
if (!card->options.fake_ll)
return -EOPNOTSUPP;
if (!qeth_is_supported(card, IPA_SOURCE_MAC)) {
dev_info(&card->gdev->dev,
"Inbound source address not supported on %s\n",
"Inbound source MAC-address not supported on %s\n",
QETH_CARD_IFNAME(card));
return -EOPNOTSUPP;
}
......@@ -1221,7 +1218,7 @@ static int qeth_l3_start_ipa_source_mac(struct qeth_card *card)
IPA_CMD_ASS_START, 0);
if (rc)
dev_warn(&card->gdev->dev,
"Starting proxy ARP support for %s failed\n",
"Starting source MAC-address support for %s failed\n",
QETH_CARD_IFNAME(card));
return rc;
}
......@@ -1921,8 +1918,13 @@ static inline __u16 qeth_l3_rebuild_skb(struct qeth_card *card,
memcpy(tg_addr, card->dev->dev_addr,
card->dev->addr_len);
}
card->dev->header_ops->create(skb, card->dev, prot, tg_addr,
"FAKELL", card->dev->addr_len);
if (hdr->hdr.l3.ext_flags & QETH_HDR_EXT_SRC_MAC_ADDR)
card->dev->header_ops->create(skb, card->dev, prot,
tg_addr, &hdr->hdr.l3.dest_addr[2],
card->dev->addr_len);
else
card->dev->header_ops->create(skb, card->dev, prot,
tg_addr, "FAKELL", card->dev->addr_len);
}
#ifdef CONFIG_TR
......@@ -2080,9 +2082,11 @@ static int qeth_l3_stop_card(struct qeth_card *card, int recovery_mode)
if (recovery_mode)
qeth_l3_stop(card->dev);
else {
rtnl_lock();
dev_close(card->dev);
rtnl_unlock();
if (card->dev) {
rtnl_lock();
dev_close(card->dev);
rtnl_unlock();
}
}
if (!card->use_hard_stop) {
rc = qeth_send_stoplan(card);
......
......@@ -20,6 +20,15 @@ fw-external-y := $(subst ",,$(CONFIG_EXTRA_FIRMWARE))
# 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.
ifdef CONFIG_ACENIC_OMIT_TIGON_I
acenic-objs := acenic/tg2.bin
fw-shipped- += acenic/tg1.bin
else
acenic-objs := acenic/tg1.bin acenic/tg2.bin
endif
fw-shipped-$(CONFIG_ACENIC) += $(acenic-objs)
fw-shipped-$(CONFIG_ADAPTEC_STARFIRE) += adaptec/starfire_rx.bin \
adaptec/starfire_tx.bin
fw-shipped-$(CONFIG_ATARI_DSP56K) += dsp56k/bootstrap.bin
fw-shipped-$(CONFIG_ATM_AMBASSADOR) += atmsar11.fw
fw-shipped-$(CONFIG_CASSINI) += sun/cassini.bin
......@@ -38,6 +47,8 @@ fw-shipped-$(CONFIG_SND_SB16_CSP) += sb16/mulaw_main.csp sb16/alaw_main.csp \
sb16/ima_adpcm_capture.csp
fw-shipped-$(CONFIG_SND_YMFPCI) += yamaha/ds1_ctrl.fw yamaha/ds1_dsp.fw \
yamaha/ds1e_ctrl.fw
fw-shipped-$(CONFIG_TIGON3) += tigon/tg3.bin tigon/tg3_tso.bin \
tigon/tg3_tso5.bin
fw-shipped-$(CONFIG_USB_DABUSB) += dabusb/firmware.fw dabusb/bitstream.bin
fw-shipped-$(CONFIG_USB_EMI26) += emi26/loader.fw emi26/firmware.fw \
emi26/bitstream.fw
......
......@@ -360,3 +360,52 @@ License: GPLv2 or OpenIB.org BSD license, no source visible
--------------------------------------------------------------------------
Driver: acenic -- Alteon AceNIC Gigabit Ethernet card
File: acenic/tg1.bin
File: acenic/tg2.bin
Licence: Unknown
Found in hex form in kernel source, but source allegedly available at
http://alteon.shareable.org/
--------------------------------------------------------------------------
Driver: tigon3 -- Broadcom Tigon3 based gigabit Ethernet cards
File: tigon/tg3.bin
File: tigon/tg3_tso.bin
File: tigon/tg3_tso5.bin
Licence:
* Firmware is:
* Derived from proprietary unpublished source code,
* Copyright (C) 2000-2003 Broadcom Corporation.
*
* Permission is hereby granted for the distribution of this firmware
* data in hexadecimal or equivalent format, provided this copyright
* notice is accompanying it.
Found in hex form in kernel source.
--------------------------------------------------------------------------
Driver: ADAPTEC_STARFIRE - Adaptec Starfire/DuraLAN support
File: adaptec/starfire_rx.bin
File: adaptec/starfire_tx.bin
Licence: Allegedly GPLv2, but no source visible.
Found in hex form in kernel source, with the following notice:
BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE IT IS LICENSED "AS IS" AND
THERE IS NO WARRANTY FOR THE PROGRAM, INCLUDING BUT NOT LIMITED TO THE
IMPLIED WARRANTIES OF MERCHANTIBILITY OR FITNESS FOR A PARTICULAR PURPOSE
(TO THE EXTENT PERMITTED BY APPLICABLE LAW). USE OF THE PROGRAM IS AT YOUR
OWN RISK. IN NO EVENT WILL ADAPTEC OR ITS LICENSORS BE LIABLE TO YOU FOR
DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES
ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM.
--------------------------------------------------------------------------
此差异已折叠。
此差异已折叠。
:10000000010003DC00000000040004210000008661
:10001000800000150000180E8100001500006664C5
:100020001A0040AB00000B06142000110000000075
:10003000142040220000AAAA14204022000003003D
:1000400014204022000000001A0040AB00000B14F6
:1000500014200011000000008300001500000002C1
:10006000040000210000000000000010000000005B
:1000700004000421000000870000001000000000C0
:1000800000000010000000000000801500000000CB
:100090000000003E00000000000000100000000012
:1000A0008200001500004000009E8050000000000B
:1000B000030080150000000086008015000000008D
:1000C00082000015000080000100001C00000000FC
:1000D000000050A00000010C4E20D011000060086C
:1000E0001420D012000040080000F09000007000C2
:1000F0000000C8B0000030000000404000000000D8
:10010000001080150000000000A2C1500000400057
:1001100000A400B000000014000000200000000057
:100120002500400D0000252500047220000031004C
:10013000009340700000000000000020000000005C
:1001400000924460000001842B20C01100000000D8
:100150000000C42000000540360140180000422D78
:100160001420001100000000009244600000018390
:100170003200001F0000003402AC00150000000235
:1001800000A601100000000842200011000000003D
:1001900000924060000001030000001E000000000B
:1001A00000000020000001000000001E0000000010
:1001B00000924460000000860000408000000000C3
:1001C0000092C0700000000000924060000001003A
:1001D0000000C8900000500000A6C1100000000000
:1001E00000B0C09000000012021C001500000000CA
:1001F0003200001F0000003400924460000005102F
:100200004421001100000000420000110000000025
:1002100083000015000000400092446000000508C3
:100220004501401800004545008080500000000056
:10023000622080120000000082000015000008000B
:100240001520001100000000000000100000000058
:10025000000000100000000000000010000000007E
:10026000000000100000000000000010000000006E
:10027000800000150000EEA4810000150000005F62
:1002800000000060000000000000412000000000AD
:1002900000004A000000400000924460000001900D
:1002A0005601401A000059561400001100000000C9
:1002B0000093405000000018009300500000001808
:1002C0003601403A0000002D000643A9000000005E
:1002D0000000C420000001405601401A0000595699
:1002E00014000011000000000000001000000000D9
:1002F0000000001000000000000642A900000000FD
:1003000000024420000001835601401A00005956A3
:1003100082000015000020001520001100000000E0
:1003200082000015000000101520001100000000E0
:1003300082000015000000101520001100000000D0
:00000001FF
:10000000010003DC00000000040004210000008661
:10001000800000150000180E8100001500006664C5
:100020001A0040AB00000B06142000110000000075
:10003000142040220000AAAA14204022000003003D
:1000400014204022000000001A0040AB00000B14F6
:1000500014200011000000008300001500000002C1
:10006000040000210000000000000010000000005B
:1000700004000421000000870000001000000000C0
:1000800000000010000000000000801500000000CB
:100090000000003E00000000000000100000000012
:1000A0008200001500004000009E8050000000000B
:1000B000030080150000000086008015000000008D
:1000C00082000015000080000100001C00000000FC
:1000D000000050A00000010C4E20D011000060086C
:1000E0001420D012000040080000F09000007000C2
:1000F0000000C8B0000030000000404000000000D8
:10010000001080150000000000A2C1500000400057
:1001100000A400B000000014000000200000000057
:100120002500400D0000252500047220000031004C
:10013000009340700000000000000020000000005C
:1001400000924460000001842B20C01100000000D8
:100150000000C42000000540360140180000422D78
:100160001420001100000000009244600000018390
:100170003200001F0000003402AC00150000000235
:1001800000A601100000000842200011000000003D
:1001900000924060000001030000001E000000000B
:1001A00000000020000001000000001E0000000010
:1001B00000924460000000860000408000000000C3
:1001C0000092C0700000000000924060000001003A
:1001D0000000C8900000500000A6C1100000000000
:1001E00000B0C09000000012021C001500000000CA
:1001F0003200001F0000003400924460000005102F
:100200004421001100000000420000110000000025
:1002100083000015000000400092446000000508C3
:100220004501401800004545008080500000000056
:10023000622080120000000082000015000008000B
:100240001520001100000000000000100000000058
:10025000000000100000000000000010000000007E
:10026000000000100000000000000010000000006E
:10027000800000150000EEA4810000150000005F62
:1002800000000060000000000000412000000000AD
:1002900000004A000000400000924460000001900D
:1002A0005601401A000059561400001100000000C9
:1002B0000093405000000018009300500000001808
:1002C0003601403A0000002D000643A9000000005E
:1002D0000000C420000001405601401A0000595699
:1002E00014000011000000000000001000000000D9
:1002F0000000001000000000000642A900000000FD
:1003000000024420000001835601401A00005956A3
:1003100082000015000020001520001100000000E0
:1003200082000015000000101520001100000000E0
:1003300082000015000000101520001100000000D0
:00000001FF
:10000000000000000800000000000A80000000005E
:1000100010000003000000000000000D0000000DB3
:100020003C1D080037BD3FFC03A0F0213C10080038
:10003000261000000E000018000000000000000D57
:100040003C1D080037BD3FFC03A0F0213C10080018
:10005000261000340E00021C000000000000000DFD
:1000600000000000000000000000000027BDFFE0CD
:100070003C1CC000AFBF0018AF80680C0E00004CE5
:10008000241B210597850000978700029782002C8A
:100090009783002E3C040800248409C0AFA00014FC
:1000A000000214000062182500052C00AFA3001008
:1000B0008F86001000E528250E000060240701024D
:1000C0003C02AC00344201003C03AC01346301004B
:1000D000AF8204903C02FFFFAF820494AF83049888
:1000E000AF82049C24020001AF825CE00E00003F5E
:1000F000AF825D000E000140000000008FBF0018BD
:1001000003E0000827BD00202402FFFFAF82540453
:100110008F83540034630400AF835400AF825404CF
:100120003C02080024420034AF82541C03E0000863
:10013000AF80540000000000000000003C020800F6
:10014000344230003C030800346330003C040800B3
:10015000348437FF3C010800AC220A6424020040CA
:100160003C010800AC220A683C010800AC200A608F
:10017000AC600000246300040083102B5040FFFD9E
:10018000AC60000003E0000800000000008048218F
:100190008FAA00103C0208008C420A603C04080050
:1001A0008C840A688FAB0014244300010044102B98
:1001B0003C010800AC230A60144000030000402109
:1001C0003C010800AC200A603C0208008C420A6036
:1001D0003C0308008C630A64912400000002114073
:1001E000004310210048102125080001A044000010
:1001F000290200081440FFF4252900013C020800F0
:100200008C420A603C0308008C630A648F84680C8B
:100210000002114000431021AC440008AC45000C22
:10022000AC460010AC470014AC4A001803E00008CC
:10023000AC4B001C000000000000000000000000AB
:1002400000000000000000000000000000000000AE
:10025000000000000000000000000000000000009E
:10026000000000000000000000000000000000008E
:10027000000000000000000000000000000000007E
:10028000000000000000000000000000000000006E
:10029000000000000000000000000000000000005E
:1002A000000000000000000000000000000000004E
:1002B000000000000000000000000000000000003E
:1002C000000000000000000000000000000000002E
:1002D000000000000000000000000000000000001E
:1002E000000000000000000000000000000000000E
:1002F00000000000000000000000000000000000FE
:1003000000000000000000000000000002000008E3
:10031000000000000A0001E33C0A00010A0001E3BA
:100320003C0A00020A0001E3000000000A0001E3A9
:10033000000000000A0001E3000000000A0001E3E1
:10034000000000000A0001E3000000000A0001E3D1
:10035000000000000A0001E3000000000A0001E3C1
:10036000000000000A0001E3000000000A0001E3B1
:100370003C0A00070A0001E33C0A00080A0001E306
:100380003C0A00090A0001E3000000000A0001E342
:10039000000000000A0001E33C0A000B0A0001E330
:1003A0003C0A000C0A0001E33C0A000D0A0001E3CC
:1003B000000000000A0001E3000000000A0001E361
:1003C0003C0A000E0A0001E3000000000A0001E3FD
:1003D000000000000A0001E3000000000A0001E341
:1003E000000000000A0001E3000000000A0001E331
:1003F000000000000A0001E3000000000A0001E321
:10040000000000000A0001E33C0A00130A0001E3B7
:100410003C0A001400000000000000000000000082
:1004200000000000000000000000000000000000CC
:1004300000000000000000000000000000000000BC
:1004400000000000000000000000000000000000AC
:10045000000000000000000000000000000000009C
:10046000000000000000000000000000000000008C
:10047000000000000000000000000000000000007C
:10048000000000000000000000000000000000006C
:10049000000000000000000000000000000000005C
:1004A000000000000000000000000000000000004C
:1004B000000000000000000000000000000000003C
:1004C000000000000000000000000000000000002C
:1004D000000000000000000000000000000000001C
:1004E000000000000000000000000000000000000C
:1004F00000000000000000000000000000000000FC
:1005000000000000000000000000000027BDFFE028
:100510000000182100001021AFBF0018AFB1001477
:10052000AFB000103C01080000220821AC200A7086
:100530003C01080000220821AC200A743C0108009C
:1005400000220821AC200A78246300011860FFF51E
:100550002442000C241100018F9068103202000424
:1005600014400005240400013C0208008C420A7873
:1005700018400003000020210E000182000000004E
:100580003202000110400003000000000E0001696B
:10059000000000000A000153AF9150288FBF0018DF
:1005A0008FB100148FB0001003E0000827BD0020B9
:1005B0003C0508008CA50A703C0608008CC60A8021
:1005C0003C0708008CE70A7827BDFFE03C040800E0
:1005D000248409D0AFBF0018AFA000100E00006047
:1005E000AFA000140E00017B000020218FBF001877
:1005F00003E0000827BD0020240200018F8368105B
:1006000000821004000210270062182403E0000892
:10061000AF83681027BDFFD8AFBF00241080002E25
:10062000AFB000208F825CECAFA200188F825CEC30
:100630003C10080026100A78AFA2001C340280008B
:10064000AF825CEC8E020000184000160000000033
:100650003C02080094420A748FA3001C000221C0CF
:10066000AC8300048FA2001C3C0108000E000201B4
:10067000AC220A7410400005000000008E02000049
:10068000244200010A0001DFAE0200003C02080023
:100690008C420A7000021C02000321C00A0001C53E
:1006A000AFA2001C0E000201000000001040001F5D
:1006B000000000008E0200008FA3001C24420001F5
:1006C0003C010800AC230A703C010800AC230A740A
:1006D0000A0001DFAE0200003C10080026100A7874
:1006E0008E02000018400028000000000E000201E9
:1006F0000000000014400024000000008E020000F2
:100700003C0308008C630A702442FFFFAFA3001C67
:1007100018400006AE02000000031402000221C0CF
:100720008C8200043C010800AC220A7097A2001ED3
:100730002442FF002C4203001440000B240240001E
:100740003C040800248409DCAFA00010AFA0001412
:100750008FA6001C240500080E0000600000382150
:100760000A0001DF00000000AF825CF83C020800D4
:100770008C420A408FA3001C24420001AF835CF826
:100780003C010800AC220A408FBF00248FB000203B
:1007900003E0000827BD002827BDFFE03C04080057
:1007A000248409E8000028210000302100003821BD
:1007B000AFBF0018AFA000100E000060AFA0001483
:1007C0008FBF001803E0000827BD00208F82680C4F
:1007D0008F85680C000218270003182B00031823CC
:1007E000004310240044102100A2282B10A0000672
:1007F00000000000004018218F82680C0043102B7D
:100800001440FFFD0000000003E0000800000000AD
:100810003C0408008C8400003C0308008C630A4000
:100820000064102B54400002008310230064102346
:100830002C42000803E000083842000127BDFFE019
:10084000008028213C04080024840A000000302194
:1008500000003821AFBF0018AFA000100E000060EC
:10086000AFA000140A000216000000008FBF00189D
:1008700003E0000827BD00200000000027BDFFE0C6
:100880003C1CC000AFBF00180E00004CAF80680CCD
:100890003C04080024840A10038028210000302131
:1008A00000003821AFA000100E000060AFA00014BF
:1008B0002402FFFFAF8254043C0200AA0E0002345F
:1008C000AF8254348FBF001803E0000827BD00201A
:1008D00000000000000000000000000027BDFFE84D
:1008E000AFB0001024100001AFBF00143C01C003E2
:1008F000AC2000008F8268103042200010400003BE
:10090000000000000E000246000000000A00023A4B
:10091000AF9054288FBF00148FB0001003E0000880
:1009200027BD001827BDFFF88F845D0C3C0200FF37
:100930003C0308008C630A503442FFF80082102404
:100940001043001E3C0500FF34A5FFF83C06C00321
:100950003C074000008518248C6200103C01080010
:10096000AC230A50304200081040000500871025D3
:100970008CC2000024420001ACC200000087102598
:10098000AF825D0C8FA2000024420001AFA20000E4
:100990008FA200008FA2000024420001AFA200003D
:1009A0008FA200008F845D0C3C0308008C630A500A
:1009B000008510241443FFE80085182427BD000893
:1009C00003E000080000000000000000353730316F
:1009D000726C734100000000000000005377457600
:1009E000656E743000000000726C704576656E7440
:1009F00031000000556E6B6E45766E74000000008D
:100A0000000000000000000000000000666174614A
:100A10006C45727200000000000000004D61696EBC
:100A2000437075420000000000000000000000005C
:100A300000000000000000000000000000000000B6
:100A400000000000000000000000000000000000A6
:100A50000000000000000000000000000000000096
:0C0A60000000000000000000000000008A
:00000001FF
* Firmware is:
* Derived from proprietary unpublished source code,
* Copyright (C) 2000-2003 Broadcom Corporation.
*
* Permission is hereby granted for the distribution of this firmware
* data in hexadecimal or equivalent format, provided this copyright
* notice is accompanying it.
:100000000106000008000000000024140E00000398
:100010000000000008001B24000000001000000386
:10002000000000000000000D0000000D3C1D080055
:1000300037BD400003A0F0213C100800261000004E
:100040000E000010000000000000000D27BDFFE0C2
:100050003C04FEFEAFBF00180E0005D83484000239
:100060000E000668000000003C03080090631B6857
:10007000240200023C04080024841AAC1462000329
:10008000240500013C04080024841AA0240600066C
:1000900000003821AFA000100E00067CAFA00014B5
:1000A0008F625C5034420001AF625C508F625C90A2
:1000B00034420001AF625C902402FFFF0E00003466
:1000C000AF6254048FBF001803E0000827BD002072
:1000D00000000000000000000000000027BDFFE05D
:1000E000AFBF001CAFB20018AFB100140E00005B30
:1000F000AFB0001024120002241100018F7068209C
:100100003202010010400003000000000E0000BB9E
:10011000000000008F7068203202200010400004B0
:10012000320200010E0001F024040001320200013D
:1001300010400003000000000E0000A300000000BB
:100140003C02080090421B9814520003000000007B
:100150000E0004C0000000000A00003CAF715028EF
:100160008FBF001C8FB200188FB100148FB0001029
:1001700003E0000827BD002027BDFFE03C04080085
:1001800024841AC0000028210000302100003821FA
:10019000AFBF0018AFA000100E00067CAFA0001487
:1001A0003C040800248423D8A48000003C010800FB
:1001B000A0201B983C010800AC201B9C3C010800BF
:1001C000AC201BA03C010800AC201BA43C01080093
:1001D000AC201BAC3C010800AC201BB83C01080063
:1001E000AC201BBC8F6244343C010800AC221B884D
:1001F0008F6244383C010800AC221B8C8F62441093
:10020000AC80F7A83C010800AC201B843C0108002E
:10021000AC2023E03C010800AC2023C83C010800CE
:10022000AC2023CC3C010800AC2024003C01080099
:10023000AC221B908F6200682403000700021702A3
:1002400010430005000000008F62006800021702E2
:1002500014400004240200013C0108000A00009739
:10026000AC20240CAC8200343C04080024841ACC5A
:100270003C0508008CA5240C00003021000038212A
:10028000AFA000100E00067CAFA000148FBF0018B6
:1002900003E0000827BD002027BDFFE03C04080064
:1002A00024841AD8000028210000302100003821C1
:1002B000AFBF0018AFA000100E00067CAFA0001466
:1002C0000E00005B000000000E0000B400002021C2
:1002D0008FBF001803E0000827BD002024020001A2
:1002E0008F63682000821004000210270062182427
:1002F00003E00008AF63682027BDFFD0AFBF002C2C
:10030000AFB60028AFB50024AFB40020AFB3001CD7
:10031000AFB20018AFB10014AFB000108F675C5CD3
:100320003C03080024631BBC8C62000014470005DA
:100330003C0200FF3C02080090421B981440011947
:100340003C0200FF3442FFF800E28824AC67000062
:1003500000111902306300FF30E20003000211C0F7
:100360000062282500A04021000716023C03080077
:1003700090631B983044000F1460003600804821C1
:10038000240200013C010800A0221B980005110076
:10039000008210253C010800AC201B9C3C01080099
:1003A000AC201BA03C010800AC201BA43C010800B1
:1003B000AC201BAC3C010800AC201BB83C01080081
:1003C000AC201BB03C010800AC201BB43C01080071
:1003D000A42223D89622000C30437FFF3C01080062
:1003E000A4222410304280003C010800A4231BC634
:1003F00010400005240200013C010800AC2223F457
:100400000A0001022406003E240600363C010800D2
:10041000AC2023F49622000A3C03080094631BC618
:100420003C010800AC2023F03C010800AC2023F87C
:10043000000213020002108000C210210062182185
:100440003C010800A42223D03C0108000A00011549
:10045000A4231B969622000C3C010800A42223EC46
:100460003C04080024841B9C8C82000000021100C4
:100470003C01080000220821AC311BC88C8200001E
:10048000000211003C01080000220821AC271BCC0F
:100490008C82000025030001306601FF000211007C
:1004A0003C01080000220821AC261BD08C820000F1
:1004B000000211003C01080000220821AC291BD4D5
:1004C000962300083C0208008C421BAC0043282104
:1004D0003C010800AC251BAC9622000A3042000407
:1004E00014400018000611008F630C143063000FD5
:1004F0002C6200021440000B3C02C0008F630C14FD
:100500003C0208008C421B403063000F2442000173
:100510003C010800AC221B402C6200021040FFF797
:100520003C02C00000E21825AF635C5C8F625C5047
:100530003042000210400014000000000A00014791
:10054000000000003C0308008C631B803C04080092
:1005500094841B94012210253C010800A42223DA74
:10056000240200013C010800AC221BB824630001F6
:100570000085202A3C01080010800003AC231B806A
:100580003C010800A4251B943C06080024C61B9CC3
:100590008CC2000024420001ACC20000284200804E
:1005A00014400005000000000E000656240400025E
:1005B0000A0001E6000000003C0208008C421BB863
:1005C00010400078240200013C05080090A51B980B
:1005D00014A20072000000003C15080096B51B969E
:1005E0003C0408008C841BAC32A3FFFF0083102A5C
:1005F0001440006C000000001483000300000000A1
:100600003C010800AC2523F01060005C0000902144
:1006100024D600040060A02124D300148EC2000060
:10062000000281003C110800023088210E000625DE
:100630008E311BC80040282110A00054000000008B
:100640009628000A31020040104000052407180CCB
:100650008E22000C2407188C00021400ACA2001893
:100660003C030800007018218C631BD03C0208007A
:10067000005010218C421BD400031D000002140006
:1006800000621825ACA300148EC300049622000853
:10069000004320233242FFFF3083FFFF004310213D
:1006A0000282102A1440000202B23023008030215E
:1006B0008E62000030C4FFFF00441021AE620000D3
:1006C0008E220000ACA200008E2200048E63FFF494
:1006D00000431021ACA20004A4A6000E8E62FFF419
:1006E00000441021AE62FFF4962300080043102A54
:1006F00014400005024690218E62FFF0AE60FFF4C8
:1007000024420001AE62FFF0ACA000083242FFFFBD
:1007100014540008240203053102008054400001F3
:1007200034E7001024020905A4A2000C0A0001CB42
:1007300034E70020A4A2000C3C0208008C4223F005
:10074000104000033C024B650A0001D3344276544A
:100750003C02B49A344289ABACA2001C30E2FFFFE9
:10076000ACA200100E0005A200A020213242FFFF23
:100770000054102B1440FFA90000000024020002C6
:100780003C0108000A0001E6A0221B988EC2083C2A
:10079000244200010A0001E6AEC2083C0E0004C07B
:1007A000000000008FBF002C8FB600288FB50024FA
:1007B0008FB400208FB3001C8FB200188FB10014CB
:1007C0008FB0001003E0000827BD003027BDFFD028
:1007D000AFBF0028AFB30024AFB20020AFB1001C00
:1007E000AFB000188F725C9C3C0200FF3442FFF8EF
:1007F0003C07080024E71BB4024288249623000E1D
:100800008CE2000000431021ACE200008E220010B8
:100810003042002014400011008098210E00063B59
:10082000022020213C02C00002421825AF635C9CDC
:100830008F625C90304200021040011E00000000F8
:10084000AF635C9C8F625C903042000210400119E3
:10085000000000000A00020D000000008E240008C5
:100860008E23001400041402000231C0000315029C
:10087000304201FF2442FFFF3042007F0003194253
:1008800030637800000211002442400000624821D9
:100890009522000A3084FFFF30420008104000B06B
:1008A000000429C03C0208008C42240014400024AB
:1008B00024C5000894C200143C010800A42223D0DF
:1008C0008CC40010000414023C010800A42223D2AE
:1008D0003C010800A42423D494C2000E3083FFFFFF
:1008E000004310233C010800AC22240894C2001AE3
:1008F0003C010800AC2624003C010800AC32240472
:100900003C010800AC2223FC3C02C0000242182536
:10091000AF635C9C8F625C9030420002104000E547
:1009200000000000AF635C9C8F625C90304200026C
:10093000104000E0000000000A0002460000000035
:1009400094C2000E3C030800946323D40043402368
:100950003103FFFF2C6200081040001C0000000063
:1009600094C200142442002800A22821000310424F
:100970001840000B0000202124E6084800403821E0
:1009800094A300008CC200002484000100431021C5
:10099000ACC200000087102A1440FFF924A5000211
:1009A000310200011040001F3C0240003C040800DE
:1009B000248423FCA0A0000194A300008C820000EA
:1009C000004310210A000285AC8200008F6268009B
:1009D0003C030010004310241040000900000000F8
:1009E00094C2001A3C0308008C6323FC00431021CE
:1009F0003C010800AC2223FC0A0002863C024000B5
:100A000094C2001A94C4001C3C0308008C6323FCAD
:100A100000441023006218213C010800AC2323FC91
:100A20003C02400002421825AF635C9C8F625C90E0
:100A3000304200021440FFFC000000009522000A32
:100A4000304200101040009B000000003C030800F2
:100A5000946323D43C07080024E724008CE40000BE
:100A60008F62680024630030008328213C0300105B
:100A7000004310241440000A0000000094A2000467
:100A80003C0408008C8424083C0308008C6323FC8D
:100A900000441023006218213C010800AC2323FC11
:100AA0003C0408008C8423FC00041C023082FFFFFD
:100AB000006220210004140200822021000410277B
:100AC000A4A200063C0308008C6324043C0200FF3F
:100AD0003442FFF8006288249622000824050001B1
:100AE00024034000000231C000801021A4C2001A7B
:100AF000A4C0001CACE000003C010800AC251B6059
:100B0000AF635CB88F625CB03042000210400003FB
:100B1000000000003C010800AC201B608E22000891
:100B2000AF625CB88F625CB03042000210400003DC
:100B3000000000003C010800AC201B603C020800E3
:100B40008C421B601040FFEC000000003C040800D9
:100B50000E00063B8C8424040A00032A00000000D7
:100B60003C03080090631B982402000214620003F7
:100B70003C034B650A0002E1000080218E22001C2C
:100B80003463765410430002241000022410000144
:100B900000C020210E000350020030212402000377
:100BA0003C010800A0221B98240200021202000A45
:100BB000240200013C0308008C6323F0106200064D
:100BC000000000003C020800944223D800021400F8
:100BD0000A00031FAE2200143C040800248423DA18
:100BE0009482000000021400AE2200143C020800AF
:100BF0008C421BBC3C03C0003C010800A0201B9899
:100C000000431025AF625C5C8F625C503042000292
:100C100010400009000000002484F7E28C820000EC
:100C200000431025AF625C5C8F625C503042000272
:100C30001440FFFA000000003C02080024421B841C
:100C40008C43000024630001AC4300008F630C144C
:100C50003063000F2C6200021440000C3C02400084
:100C60008F630C143C0208008C421B403063000F61
:100C7000244200013C010800AC221B402C6200020F
:100C80001040FFF7000000003C024000024218251F
:100C9000AF635C9C8F625C90304200021440FFFCAA
:100CA0000000000012600003000000000E0004C0FD
:100CB000000000008FBF00288FB300248FB20020F7
:100CC0008FB1001C8FB0001803E0000827BD003072
:100CD0008F6344503C04080024841B888C820000ED
:100CE00000031C020043102B144000073C0380004B
:100CF0008C8400048F62445000021C020083102B7D
:100D00001040FFFC3C038000AF6344448F624444C6
:100D1000004310241440FFFD000000008F6244488F
:100D200003E000083042FFFF3C0240000082202523
:100D3000AF645C388F625C30304200021440FFFCCC
:100D40000000000003E000080000000027BDFFE0F5
:100D50000080582114C00011256E00083C020800D4
:100D60008C4223F410400007240200163C010800C6
:100D7000A42223D22402002A3C0108000A000364B2
:100D8000A42223D48D670010000714023C01080040
:100D9000A42223D23C010800A42723D43C04080049
:100DA000948423D43C030800946323D295CF000697
:100DB0003C020800944223D00083202301E2C02398
:100DC0003065FFFF24A2002801C248213082FFFFC6
:100DD00014C0001A012260219582000C3042003FAD
:100DE0003C010800A42223D69582000495830006C6
:100DF0003C010800AC2023E43C010800AC2023E8BF
:100E000000021400004310253C010800AC221BC066
:100E1000952200043C010800A4221BC49523000273
:100E200001E510230043102A1040001024020001A5
:100E30003C0108000A000398AC2223F83C03080098
:100E40008C6323E83C02080094421BC40043102139
:100E5000A52200043C02080094421BC0A5820004A5
:100E60003C0208008C421BC0A58200063C02080020
:100E70008C4223F03C0D08008DAD23E43C0A0800B1
:100E8000144000E58D4A23E83C02080094421BC44C
:100E9000004A18213063FFFF0062182B2402000271
:100EA00010C2000D014350233C020800944223D697
:100EB0003042000910400008000000009582000C3C
:100EC0003042FFF6A582000C3C020800944223D673
:100ED0003042000901A268233C0208008C4223F83A
:100EE0001040004A012038213C020800944223D2DD
:100EF00000004021A520000A01E21023A5220002E3
:100F00003082FFFF0002104218400008000030212C
:100F10000040182194E200002508000100C23021A1
:100F20000103102A1440FFFB24E7000200061C0204
:100F300030C2FFFF006230210006140200C23021DF
:100F400000C0282100061027A522000A0000302139
:100F50002527000C0000402194E200002508000134
:100F600000C230212D0200041440FFFB24E70002E0
:100F70009522000200004021912300090044202313
:100F8000018038213082FFFFA4E0001000621821A8
:100F9000000210421840001000C3302100404821D8
:100FA00094E2000024E7000200C2302130E2007F1A
:100FB00014400006250800018D6300003C02007FFC
:100FC0003442FF8000625824256700080109102A76
:100FD0001440FFF3000000003082000110400005C3
:100FE00000061C02A0E0000194E2000000C23021D3
:100FF00000061C0230C2FFFF00623021000614020E
:1010000000C230210A00047D30C6FFFF2402000226
:1010100014C20081000000003C0208008C42240C35
:1010200014400007000000003C020800944223D254
:101030009523000201E210231062007700000000F7
:101040003C020800944223D201E21023A5220002B0
:101050003C0208008C42240C1040001A31E3FFFFD0
:101060008DC700103C02080094421B9600E040210E
:1010700000072C0200AA20210043102300823823FD
:101080000007240230E2FFFF00823821000710270A
:10109000A522000A3102FFFF3C040800948423D4F7
:1010A0000045302300E0282100641823006D18213A
:1010B00000C3302100061C0230C2FFFF0A00047D7D
:1010C0000062302101203821000040213082FFFFE2
:1010D0000002104218400008000030210040182192
:1010E00094E200002508000100C230210103102A0B
:1010F0001440FFFB24E7000200061C0230C2FFFF81
:10110000006230210006140200C2302100C02821F4
:1011100000061027A522000A000030212527000C18
:101120000000402194E200002508000100C23021A7
:101130002D0200041440FFFB24E700029522000268
:101140000000402191230009004420230180382120
:101150003082FFFFA4E000103C040800948423D4F4
:101160000062182100C3302100061C0230C2FFFFBC
:101170000062302100061C023C020800944223D089
:1011800000C348210044102300021FC20043102165
:1011900000021043184000100000302100402021C0
:1011A00094E2000024E7000200C2302130E2007F18
:1011B00014400006250800018D6300003C02007FFA
:1011C0003442FF8000625824256700080104102A79
:1011D0001440FFF3000000003C020800944223EC9E
:1011E00000C230213122FFFF00C2302100061C0264
:1011F00030C2FFFF006230210006140200C230211D
:1012000000C0402100061027A5820010ADC00014C8
:101210000A00049DADC000008DC7001000E0402111
:101220001140000700072C0200AA3021000614021A
:1012300030C3FFFF004330210006140200C2282102
:1012400000051027A522000A3C030800946323D45C
:101250003102FFFF01E210210043302300CD302195
:1012600000061C0230C2FFFF00623021000614029B
:1012700000C2302100C0402100061027A5820010C6
:101280003102FFFF00051C0000431025ADC2001015
:101290003C0208008C4223F4104000052DE205EBCF
:1012A0001440000225E2FFF234028870A5C2003427
:1012B0003C030800246323E88C6200002442000100
:1012C000AC6200003C0408008C8423E43C0208006B
:1012D0008C421BC03303FFFF0083202100431821F1
:1012E0000062102B3C010800AC2423E410400003F2
:1012F0002482FFFF3C010800AC2223E43C010800EB
:10130000AC231BC003E0000827BD002027BDFFB8A9
:101310003C05080024A51B96AFBF0044AFBE0040AB
:10132000AFB7003CAFB60038AFB50034AFB4003053
:10133000AFB3002CAFB20028AFB10024AFB0002093
:1013400094A900003C020800944223D03C0308000A
:101350008C631BB03C0408008C841BAC012210235E
:101360000064182AA7A9001E106000BEA7A20016DC
:1013700024BE002297B6001E24B3001A24B700161C
:101380008FC2000014400008000000008FC2FFF868
:1013900097A300168FC4FFF4004310210082202A77
:1013A000148000B00000000097D5081832A2FFFF9B
:1013B000104000A3000090210040A02100008821DF
:1013C0000E000625000000000040302114C0000778
:1013D000000000003C0208008C4223DC2442000193
:1013E0003C0108000A000596AC2223DC3C100800F2
:1013F000021180218E101BC89608000A310200409D
:10140000104000052407180C8E02000C2407188CCD
:1014100000021400ACC200183102008054400001E8
:1014200034E700103C020800005110218C421BD010
:101430003C030800007118218C631BD400021500C6
:1014400000031C0000431025ACC2001496040008E1
:101450003242FFFF008210210282102A1440000253
:1014600002B22823008028218E020000024590212C
:10147000ACC200008E02000400C020212631001002
:10148000AC82000430E2FFFFAC800008A485000EAF
:10149000AC820010240203050E0005A2A482000CF9
:1014A0003242FFFF0054102B1440FFC53242FFFFB1
:1014B0000A00058E000000008E6200008E63FFFCB3
:1014C0000043102A10400067000000008E62FFF009
:1014D000000289003C100800021180210E00062540
:1014E0008E101BC80040302114C000050000000011
:1014F0008E62082C244200010A000596AE62082C78
:101500009608000A31020040104000052407180C1C
:101510008E02000C2407188C00021400ACC20018C4
:101520003C020800005110218C421BD03C030800F3
:10153000007118218C631BD40002150000031C00ED
:1015400000431025ACC200148E63FFF4960200081D
:10155000004320233242FFFF3083FFFF004310216E
:1015600002C2102A104000030080282197A9001E03
:10157000013228238E62000030A4FFFF00441021B6
:10158000AE620000A4C5000E8E020000ACC20000D6
:101590008E0200048E63FFF400431021ACC20004ED
:1015A0008E63FFF496020008006418210062102A7E
:1015B00014400006024590218E62FFF0AE60FFF4F9
:1015C000244200010A000571AE62FFF0AE63FFF431
:1015D000ACC000083242FFFF105600033102000485
:1015E000104000062402030531020080544000012F
:1015F00034E7001034E7002024020905A4C2000CDF
:101600008EE300008EE20004146200073C02B49AEC
:101610008EE208605440000134E704003C024B6550
:101620000A00058834427654344289ABACC2001CAF
:1016300030E2FFFFACC200100E0005A200C0202166
:101640003242FFFF0056102B1440FF9B00000000A9
:101650008E6200008E63FFFC0043102A1440FF4896
:10166000000000008FBF00448FBE00408FB7003CD9
:101670008FB600388FB500348FB400308FB3002C94
:101680008FB200288FB100248FB0002003E0000843
:1016900027BD004827BDFFE8AFBF0014AFB0001062
:1016A0008F6244508F6344100A0005B1008080218E
:1016B0008F626820304220001040000300000000CC
:1016C0000E0001F0000020218F6244508F6344100F
:1016D0003042FFFF0043102B1440FFF500000000D4
:1016E0008F630C143063000F2C6200021440000B57
:1016F000000000008F630C143C0208008C421B4069
:101700003063000F244200013C010800AC221B4062
:101710002C6200021040FFF700000000AF705C1860
:101720008F625C103042000210400009000000008F
:101730008F626820304220001040FFF80000000057
:101740000E0001F0000020210A0005C40000000086
:101750008FBF00148FB0001003E0000827BD0018F1
:1017600000000000000000000000000027BDFFE8AE
:101770003C1BC000AFBF0014AFB00010AF60680CDE
:101780008F62680434420082AF6268048F63400055
:1017900024020B503C010800AC221B5424020B789D
:1017A0003C010800AC221B6434630002AF634000BC
:1017B0000E000605008080213C010800A0221B6865
:1017C000304200FF24030002144300050000000023
:1017D0003C0208008C421B540A0005F8AC5000C0C3
:1017E0003C0208008C421B54AC5000BC8F62443455
:1017F0008F6344388F6444103C010800AC221B5CAA
:101800003C010800AC231B6C3C010800AC241B58B5
:101810008FBF00148FB0001003E0000827BD001830
:101820003C0408008C8700003C03AA553463AA5589
:101830003C06C003AC8300008CC2000014430007C8
:10184000240500023C0355AA346355AAAC8300006A
:101850008CC2000050430001240500013C02080036
:10186000AC47000003E0000800A0102127BDFFF8EE
:1018700018800009000028218F63680C8F62680CB3
:101880001043FFFE0000000024A5000100A4102A60
:101890001440FFF90000000003E0000827BD000825
:1018A0008F6344503C0208008C421B5C00031C0206
:1018B0000043102B144000083C0380003C04080047
:1018C0008C841B6C8F62445000021C020083102B1E
:1018D0001040FFFC3C038000AF6344448F624444EB
:1018E000004310241440FFFD000000008F624448B4
:1018F00003E000083042FFFF3082FFFF2442E00097
:101900002C422001144000033C0240000A0006481B
:101910002402FFFF00822025AF645C388F625C30B8
:10192000304200021440FFFC0000102103E00008D8
:10193000000000008F6244503C0308008C631B5879
:101940000A0006513042FFFF8F6244503042FFFFD1
:101950000043102B1440FFFC0000000003E00008CF
:101960000000000027BDFFE0008028213C040800A3
:1019700024841AF00000302100003821AFBF001885
:10198000AFA000100E00067CAFA000140A00066095
:10199000000000008FBF001803E0000827BD0020F2
:1019A0000000000000000000000000003C020800F1
:1019B000344230003C030800346330003C0408002B
:1019C000348437FF3C010800AC221B742402004021
:1019D0003C010800AC221B783C010800AC201B70C5
:1019E000AC600000246300040083102B5040FFFD16
:1019F000AC60000003E00008000000000080482107
:101A00008FAA00103C0208008C421B703C040800A6
:101A10008C841B788FAB0014244300010044102BEE
:101A20003C010800AC231B7014400003000040215F
:101A30003C010800AC201B703C0208008C421B706B
:101A40003C0308008C631B749124000000021140C9
:101A5000004310210048102125080001A044000087
:101A6000290200081440FFF4252900013C02080067
:101A70008C421B703C0308008C631B748F64680CE1
:101A80000002114000431021AC440008AC45000C9A
:101A9000AC460010AC470014AC4A001803E0000844
:101AA000AC4B001C00000000000000004D61696E9E
:101AB00043707542000000004D61696E43707541CE
:101AC00000000000000000000000000073746B6F55
:101AD00066666C64496E000073746B6F66662A2AD2
:101AE0000000000053774576656E743000000000FA
:101AF000000000000000000000000000666174614A
:101B00006C45727200000000000000000000000040
:101B100000000000000000000000000000000000C5
:101B200000000000000000000000000000000000B5
:101B300073746B6F66666C645F76312E362E300080
:101B40000000000000000000000000000000000095
:0C1B500000000000000000000000000089
:00000001FF
* Firmware is:
* Derived from proprietary unpublished source code,
* Copyright (C) 2000-2003 Broadcom Corporation.
*
* Permission is hereby granted for the distribution of this firmware
* data in hexadecimal or equivalent format, provided this copyright
* notice is accompanying it.
:10000000010200000001000000000FD80C004003B6
:100010000000000000010F040000000010000003B9
:10002000000000000000000D0000000D3C1D00015C
:1000300037BDE00003A0F0213C10000126100000B5
:100040000C004010000000000000000D27BDFFE084
:100050003C04FEFEAFBF00180C0042E834840002EE
:100060000C004364000000003C03000190630F3467
:10007000240200023C04000124840E9C146200034C
:10008000240500013C04000124840E902406000293
:1000900000003821AFA000100C004378AFA000147E
:1000A0000C00402C000000008FBF001803E0000887
:1000B00027BD0020000000000000000027BDFFE079
:1000C000AFBF001CAFB20018AFB100140C0042D497
:1000D000AFB000103C128000241100018F70681036
:1000E0003202040010400007000000008F64100876
:1000F0000092102414400003000000000C00406433
:10010000000000003C02000190420F561051000315
:10011000320202001040FFF1000000000C0041B468
:100120000000000008004034000000008FBF001CE9
:100130008FB200188FB100148FB0001003E00008D8
:1001400027BD002027BDFFE03C04000124840EB041
:10015000000028210000302100003821AFBF001826
:10016000AFA000100C004378AFA000140000D02115
:1001700024020130AF6250003C010001A4200F5066
:100180003C010001A0200F578FBF001803E00008BA
:1001900027BD002000000000000000003C0300011B
:1001A00024630F609062000027BDFFF0144000033D
:1001B0000080C02108004073000048213C0220005C
:1001C00003021024104000032409000208004073B9
:1001D000A0600000240900010018104030431F8077
:1001E000346F80081520004B25EB00283C040001EB
:1001F000008320218C8480103C05000124A50F7A07
:1002000000041402A0A200003C010001A0240F7B06
:100210003C02000100431021944280143C01000183
:10022000A0220F7C3C0C0001018360218D8C801882
:10023000304200FF24420008000220C324020001D3
:100240003C010001A0220F600124102B1040000C83
:100250000000382124A6000E016028218CA2000095
:100260008CA3000424A5000824E70001ACC2000010
:10027000ACC3000400E4102B1440FFF824C60008AF
:10028000000038213C08000125080F7B9106000082
:100290003C02000190420F7C2503000D00C3282181
:1002A0000046102300021FC2004310210002104329
:1002B0001840000C0000202191020001004610238C
:1002C00000021FC2004310210002184394A2000044
:1002D00024E700010082202100E3102A1440FFFBE4
:1002E00024A5000200041C023082FFFF00622021CE
:1002F00000041402008220213C02FFFF018210242E
:100300003083FFFF004310253C010001080040FA44
:10031000AC220F803C05000124A50F7C90A20000B8
:100320003C0C0001018360218D8C8018000220C2EA
:100330001080000E000038210160302124A5000C3F
:100340008CA200008CA3000424A5000824E700016F
:10035000ACC20000ACC3000400E4102B1440FFF852
:1003600024C600083C05000124A50F7C90A20000D3
:1003700030430007240200041062001128620005C7
:10038000104000052402000210620008000710C09F
:10039000080040FA00000000240200061062000E6F
:1003A000000710C0080040FA0000000000A2182159
:1003B0009463000C004B1021080040FAA443000095
:1003C000000710C000A218218C63000C004B102104
:1003D000080040FAAC43000000A218218C63000C16
:1003E000004B202100A21021AC8300009442001099
:1003F000A482000495E700063C02000190420F7CB5
:100400003C03000190630F7A00E2C8233C02000124
:1004100090420F7B2463002801E3402124420028FE
:100420001520001201E2302194C2000C3C010001B1
:10043000A4220F7894C2000494C300063C0100017A
:10044000A4200F763C010001A4200F7200021400CA
:10045000004310253C010001AC220F6C9502000402
:100460003C01000108004124A4220F703C0200015D
:1004700094420F703C03000194630F7200431021FB
:10048000A50200043C02000194420F6CA4C20004C7
:100490003C0200018C420F6CA4C200063C04000127
:1004A00094840F723C02000194420F703C0A0001D8
:1004B000954A0F76004418213063FFFF0062182A26
:1004C000240200021122000B008320233C030001C0
:1004D00094630F7830620009104000063062FFF626
:1004E000A4C2000C3C02000194420F783042000983
:1004F00001425023240200011122001B2922000284
:1005000050400005240200021120000731A2FFFF25
:1005100008004197000000001122001D240200166F
:100520000800419731A2FFFF3C0E000195CE0F80DD
:10053000108000050180682101C4202100041C02F4
:100540003082FFFF00627021000E1027A502000A12
:100550003C03000190630F7B31A2FFFF00E21021FA
:100560000800418D004320233C02000194420F808B
:100570000044202100041C023082FFFF0062202181
:10058000008070210004102708004185A502000AA0
:100590003C05000124A50F7A90A30000146200021C
:1005A00024E2FFF2A5E2003490A2000000E2102352
:1005B000A50200023C03000194630F803C0200018D
:1005C00094420F5A30E5FFFF0064182100451023C4
:1005D0000062202300041C023082FFFF0062202101
:1005E00000041027A502000A3C03000190630F7C61
:1005F0002462000114A20005008070210163102113
:10060000904200000800418500026200246200025E
:1006100014A20003306200FE004B1021944C000035
:100620003C02000194420F823183FFFF3C04000131
:1006300090840F7B0043102100E21021004420230E
:10064000008A202100041C023082FFFF006220216A
:100650000004140200822021008068210004102779
:10066000A4C2001031A2FFFF000E1C0000431025A1
:100670003C04000124840F72ADE20010948200005B
:100680003C05000194A50F763C0300018C630F6CC0
:100690002442000100B92821A48200003322FFFF78
:1006A000006220210083182B3C010001A4250F7655
:1006B0001060000324A2FFFF3C010001A4220F767A
:1006C0003C024000030210253C010001AC240F6CE9
:1006D000AF62100803E0000827BD00103C030001D2
:1006E00090630F5627BDFFE824020001AFBF00143E
:1006F00010620026AFB000108F620CF42442FFFF9E
:100700003042007F000211008C4340003C01000198
:10071000AC230F648C434008244440008C5C4004AC
:1007200030620040144000022402008824020008C5
:100730003C010001A4220F68306200041040000553
:10074000240200013C010001A0220F57080041D5FE
:10075000000314023C010001A0200F570003140203
:100760003C010001A4220F549483000C24020001D8
:100770003C010001A4200F503C010001A0220F56B3
:100780003C010001A4230F62240200011342001E59
:10079000000000001340000524020003134200671C
:1007A00000000000080042CF000000003C020001F1
:1007B00094420F62241A00013C010001A4200F5E44
:1007C0003C010001A4200F52304407FF00021BC26D
:1007D000000318233063003E3463003600021242E7
:1007E0003042003C006218213C010001A4240F5853
:1007F00000832021246300303C010001A4240F5A0F
:100800003C010001A4230F5C3C06000124C60F52EA
:1008100094C5000094C300023C04000194840F5A64
:10082000006510210044102A104000133C10800085
:1008300000A31021A4C200003C02A000AF620CF48F
:100840003C010001A0200F568F6410080090102476
:1008500014400003000000000C0040640000000091
:100860008F620CF400501024104000B7000000000C
:100870000800420F000000003C03000194630F5089
:1008800000851023A4C40000006218213042FFFF3D
:100890003C010001A4230F50AF620CE83C020001B0
:1008A00094420F6834420024AF620CEC94C30002FF
:1008B0003C02000194420F50146200123C0280007E
:1008C0003C1080003C02A000AF620CF43C0100012F
:1008D000A0200F568F6410080090102414400003CD
:1008E000000000000C004064000000008F620CF467
:1008F000005010241440FFF700000000080042CF11
:10090000241A0003AF620CF43C1080008F641008BE
:100910000090102414400003000000000C0040640C
:10092000000000008F620CF4005010241440FFF708
:1009300000000000080042CF241A00033C07000119
:1009400024E70F5094E2000003821021AF620CE014
:100950003C0200018C420F64AF620CE43C050001D4
:1009600094A50F5494E300003C04000194840F58B4
:100970003C02000194420F5E00A328230082202342
:1009800030A6FFFF3083FFFF00C3102B144000434D
:10099000000000003C02000194420F5C00021400C1
:1009A00000621025AF620CE894E200003C030001F5
:1009B00094630F5400441021A4E200003042FFFF72
:1009C000144300213C0200083C02000190420F57F2
:1009D000104000063C03000C3C02000194420F68EA
:1009E000346306240800427C0000D0213C02000150
:1009F00094420F683C03000834630624004310252A
:100A0000AF620CEC3C1080003C02A000AF620CF422
:100A10003C010001A0200F568F64100800901024A4
:100A200014400003000000000C00406400000000BF
:100A30008F620CF4005010241040001500000000DC
:100A400008004283000000003C03000194630F682B
:100A5000344206243C108000006218253C028000CD
:100A6000AF630CECAF620CF48F641008009010249C
:100A700014400003000000000C004064000000006F
:100A80008F620CF4005010241440FFF700000000A7
:100A90003C010001080042CFA4200F5E3C0200018F
:100AA00094420F5C0002140000C21025AF620CE8F3
:100AB0003C02000190420F57104000093C03000C1B
:100AC0003C02000194420F68346306240000D021E8
:100AD00000431025AF620CEC080042C13C108000BE
:100AE0003C02000194420F683C0300083463060492
:100AF00000431025AF620CEC3C02000194420F5EF3
:100B0000004510213C010001A4220F5E3C10800032
:100B10003C02A000AF620CF43C010001A0200F5683
:100B20008F6410080090102414400003000000009F
:100B30000C004064000000008F620CF40050102490
:100B40001440FFF7000000008FBF00148FB00010AA
:100B500003E0000827BD00180000000027BDFFE0EB
:100B60003C04000124840EC0000028210000302134
:100B700000003821AFBF0018AFA000100C00437870
:100B8000AFA000140000D02124020130AF62500059
:100B90003C010001A4200F503C010001A0200F5790
:100BA0008FBF001803E0000827BD002027BDFFE825
:100BB0003C1BC000AFBF0014AFB00010AF60680CAA
:100BC0008F62680434420082AF6268048F63400021
:100BD00024020B503C010001AC220F2024020B78B0
:100BE0003C010001AC220F3034630002AF634000CF
:100BF0000C004315008080213C010001A0220F342D
:100C0000304200FF240300021443000500000000EE
:100C10003C0200018C420F2008004308AC5000C089
:100C20003C0200018C420F20AC5000BC8F62443467
:100C30008F6344388F6444103C010001AC220F28BC
:100C40003C010001AC230F383C010001AC240F240F
:100C50008FBF00148FB0001003E0000827BD0018FC
:100C600003E000082402000127BDFFF818800009F6
:100C7000000028218F63680C8F62680C1043FFFE10
:100C80000000000024A5000100A4102A1440FFF970
:100C90000000000003E0000827BD00088F634450F7
:100CA0003C0200018C420F2800031C020043102B61
:100CB000144000083C0380003C0400018C840F3881
:100CC0008F62445000021C020083102B1040FFFC76
:100CD0003C038000AF6344448F62444400431024CB
:100CE0001440FFFD000000008F62444803E000084C
:100CF0003042FFFF3082FFFF2442E0002C422001FF
:100D0000144000033C024000080043472402FFFF58
:100D100000822025AF645C388F625C303042000274
:100D20001440FFFC0000102103E000080000000058
:100D30008F6244503C0300018C630F240800435031
:100D40003042FFFF8F6244503042FFFF0043102BC0
:100D50001440FFFC0000000003E000080000000059
:100D600027BDFFE0008028213C04000124840ED030
:100D70000000302100003821AFBF0018AFA00010E4
:100D80000C004378AFA000140800435F000000008F
:100D90008FBF001803E0000827BD00203C020001BF
:100DA0003442D6003C0300013463D6003C04000109
:100DB0003484DDFF3C010001AC220F4024020040DE
:100DC0003C010001AC220F443C010001AC200F3C6F
:100DD000AC600000246300040083102B5040FFFD32
:100DE000AC60000003E00008000000000080482123
:100DF0008FAA00103C0200018C420F3C3C04000111
:100E00008C840F448FAB0014244300010044102B4A
:100E10003C010001AC230F3C1440000300004021C2
:100E20003C010001AC200F3C3C0200018C420F3C15
:100E30003C0300018C630F4091240000000211402C
:100E4000004310210048102125080001A0440000A3
:100E5000290200081440FFF4252900013C0200018A
:100E60008C420F3C3C0300018C630F408F64680C84
:100E70000002114000431021AC440008AC45000CB6
:100E8000AC460010AC470014AC4A001803E0000860
:100E9000AC4B001C00000000000000004D61696EBA
:100EA00043707542000000004D61696E43707541EA
:100EB00000000000000000000000000073746B6F71
:100EC00066666C64000000000000000073746B6FC5
:100ED00066666C64000000000000000066617461DA
:100EE0006C4572720000000000000000000000006D
:100EF00000000000000000000000000000000000F2
:100F000000000000000000000000000000000000E1
:100F100073746B6F66666C645F76312E322E3000B0
:0C0F2000000000000000000000000000C5
:00000001FF
* Firmware is:
* Derived from proprietary unpublished source code,
* Copyright (C) 2000-2003 Broadcom Corporation.
*
* Permission is hereby granted for the distribution of this firmware
* data in hexadecimal or equivalent format, provided this copyright
* notice is accompanying it.
/* 5705 needs a special version of the TSO firmware. */
......@@ -313,10 +313,11 @@ struct napi_struct {
#ifdef CONFIG_NETPOLL
spinlock_t poll_lock;
int poll_owner;
struct net_device *dev;
#endif
struct net_device *dev;
struct list_head dev_list;
struct sk_buff *gro_list;
struct sk_buff *skb;
};
enum
......@@ -990,6 +991,9 @@ struct napi_gro_cb {
/* Number of segments aggregated. */
int count;
/* Free the skb? */
int free;
};
#define NAPI_GRO_CB(skb) ((struct napi_gro_cb *)(skb)->cb)
......@@ -1011,6 +1015,14 @@ struct packet_type {
struct list_head list;
};
struct napi_gro_fraginfo {
skb_frag_t frags[MAX_SKB_FRAGS];
unsigned int nr_frags;
unsigned int ip_summed;
unsigned int len;
__wsum csum;
};
#include <linux/interrupt.h>
#include <linux/notifier.h>
......@@ -1363,6 +1375,8 @@ extern int netif_receive_skb(struct sk_buff *skb);
extern void napi_gro_flush(struct napi_struct *napi);
extern int napi_gro_receive(struct napi_struct *napi,
struct sk_buff *skb);
extern int napi_gro_frags(struct napi_struct *napi,
struct napi_gro_fraginfo *info);
extern void netif_nit_deliver(struct sk_buff *skb);
extern int dev_valid_name(const char *name);
extern int dev_ioctl(struct net *net, unsigned int cmd, void __user *);
......
......@@ -155,9 +155,9 @@ static inline struct neighbour * ndisc_get_neigh(struct net_device *dev, const s
{
if (dev)
return __neigh_lookup(&nd_tbl, addr, dev, 1);
return __neigh_lookup_errno(&nd_tbl, addr, dev);
return NULL;
return ERR_PTR(-ENODEV);
}
......
......@@ -70,7 +70,7 @@
#define CAN_BCM_VERSION CAN_VERSION
static __initdata const char banner[] = KERN_INFO
"can: broadcast manager protocol (rev " CAN_BCM_VERSION ")\n";
"can: broadcast manager protocol (rev " CAN_BCM_VERSION " t)\n";
MODULE_DESCRIPTION("PF_CAN broadcast manager protocol");
MODULE_LICENSE("Dual BSD/GPL");
......@@ -90,6 +90,7 @@ struct bcm_op {
unsigned long frames_abs, frames_filtered;
struct timeval ival1, ival2;
struct hrtimer timer, thrtimer;
struct tasklet_struct tsklet, thrtsklet;
ktime_t rx_stamp, kt_ival1, kt_ival2, kt_lastmsg;
int rx_ifindex;
int count;
......@@ -341,6 +342,23 @@ static void bcm_send_to_user(struct bcm_op *op, struct bcm_msg_head *head,
}
}
static void bcm_tx_timeout_tsklet(unsigned long data)
{
struct bcm_op *op = (struct bcm_op *)data;
struct bcm_msg_head msg_head;
/* create notification to user */
msg_head.opcode = TX_EXPIRED;
msg_head.flags = op->flags;
msg_head.count = op->count;
msg_head.ival1 = op->ival1;
msg_head.ival2 = op->ival2;
msg_head.can_id = op->can_id;
msg_head.nframes = 0;
bcm_send_to_user(op, &msg_head, NULL, 0);
}
/*
* bcm_tx_timeout_handler - performes cyclic CAN frame transmissions
*/
......@@ -352,20 +370,8 @@ static enum hrtimer_restart bcm_tx_timeout_handler(struct hrtimer *hrtimer)
if (op->kt_ival1.tv64 && (op->count > 0)) {
op->count--;
if (!op->count && (op->flags & TX_COUNTEVT)) {
struct bcm_msg_head msg_head;
/* create notification to user */
msg_head.opcode = TX_EXPIRED;
msg_head.flags = op->flags;
msg_head.count = op->count;
msg_head.ival1 = op->ival1;
msg_head.ival2 = op->ival2;
msg_head.can_id = op->can_id;
msg_head.nframes = 0;
bcm_send_to_user(op, &msg_head, NULL, 0);
}
if (!op->count && (op->flags & TX_COUNTEVT))
tasklet_schedule(&op->tsklet);
}
if (op->kt_ival1.tv64 && (op->count > 0)) {
......@@ -402,6 +408,9 @@ static void bcm_rx_changed(struct bcm_op *op, struct can_frame *data)
if (op->frames_filtered > ULONG_MAX/100)
op->frames_filtered = op->frames_abs = 0;
/* this element is not throttled anymore */
data->can_dlc &= (BCM_CAN_DLC_MASK|RX_RECV);
head.opcode = RX_CHANGED;
head.flags = op->flags;
head.count = op->count;
......@@ -420,37 +429,32 @@ static void bcm_rx_changed(struct bcm_op *op, struct can_frame *data)
*/
static void bcm_rx_update_and_send(struct bcm_op *op,
struct can_frame *lastdata,
struct can_frame *rxdata)
const struct can_frame *rxdata)
{
memcpy(lastdata, rxdata, CFSIZ);
/* mark as used */
lastdata->can_dlc |= RX_RECV;
/* mark as used and throttled by default */
lastdata->can_dlc |= (RX_RECV|RX_THR);
/* throtteling mode inactive OR data update already on the run ? */
if (!op->kt_ival2.tv64 || hrtimer_callback_running(&op->thrtimer)) {
/* throtteling mode inactive ? */
if (!op->kt_ival2.tv64) {
/* send RX_CHANGED to the user immediately */
bcm_rx_changed(op, rxdata);
bcm_rx_changed(op, lastdata);
return;
}
if (hrtimer_active(&op->thrtimer)) {
/* mark as 'throttled' */
lastdata->can_dlc |= RX_THR;
/* with active throttling timer we are just done here */
if (hrtimer_active(&op->thrtimer))
return;
}
if (!op->kt_lastmsg.tv64) {
/* send first RX_CHANGED to the user immediately */
bcm_rx_changed(op, rxdata);
op->kt_lastmsg = ktime_get();
return;
}
/* first receiption with enabled throttling mode */
if (!op->kt_lastmsg.tv64)
goto rx_changed_settime;
/* got a second frame inside a potential throttle period? */
if (ktime_us_delta(ktime_get(), op->kt_lastmsg) <
ktime_to_us(op->kt_ival2)) {
/* mark as 'throttled' and start timer */
lastdata->can_dlc |= RX_THR;
/* do not send the saved data - only start throttle timer */
hrtimer_start(&op->thrtimer,
ktime_add(op->kt_lastmsg, op->kt_ival2),
HRTIMER_MODE_ABS);
......@@ -458,7 +462,8 @@ static void bcm_rx_update_and_send(struct bcm_op *op,
}
/* the gap was that big, that throttling was not needed here */
bcm_rx_changed(op, rxdata);
rx_changed_settime:
bcm_rx_changed(op, lastdata);
op->kt_lastmsg = ktime_get();
}
......@@ -467,7 +472,7 @@ static void bcm_rx_update_and_send(struct bcm_op *op,
* received data stored in op->last_frames[]
*/
static void bcm_rx_cmp_to_index(struct bcm_op *op, int index,
struct can_frame *rxdata)
const struct can_frame *rxdata)
{
/*
* no one uses the MSBs of can_dlc for comparation,
......@@ -511,14 +516,12 @@ static void bcm_rx_starttimer(struct bcm_op *op)
hrtimer_start(&op->timer, op->kt_ival1, HRTIMER_MODE_REL);
}
/*
* bcm_rx_timeout_handler - when the (cyclic) CAN frame receiption timed out
*/
static enum hrtimer_restart bcm_rx_timeout_handler(struct hrtimer *hrtimer)
static void bcm_rx_timeout_tsklet(unsigned long data)
{
struct bcm_op *op = container_of(hrtimer, struct bcm_op, timer);
struct bcm_op *op = (struct bcm_op *)data;
struct bcm_msg_head msg_head;
/* create notification to user */
msg_head.opcode = RX_TIMEOUT;
msg_head.flags = op->flags;
msg_head.count = op->count;
......@@ -528,6 +531,17 @@ static enum hrtimer_restart bcm_rx_timeout_handler(struct hrtimer *hrtimer)
msg_head.nframes = 0;
bcm_send_to_user(op, &msg_head, NULL, 0);
}
/*
* bcm_rx_timeout_handler - when the (cyclic) CAN frame receiption timed out
*/
static enum hrtimer_restart bcm_rx_timeout_handler(struct hrtimer *hrtimer)
{
struct bcm_op *op = container_of(hrtimer, struct bcm_op, timer);
/* schedule before NET_RX_SOFTIRQ */
tasklet_hi_schedule(&op->tsklet);
/* no restart of the timer is done here! */
......@@ -540,10 +554,26 @@ static enum hrtimer_restart bcm_rx_timeout_handler(struct hrtimer *hrtimer)
return HRTIMER_NORESTART;
}
/*
* bcm_rx_do_flush - helper for bcm_rx_thr_flush
*/
static inline int bcm_rx_do_flush(struct bcm_op *op, int update, int index)
{
if ((op->last_frames) && (op->last_frames[index].can_dlc & RX_THR)) {
if (update)
bcm_rx_changed(op, &op->last_frames[index]);
return 1;
}
return 0;
}
/*
* bcm_rx_thr_flush - Check for throttled data and send it to the userspace
*
* update == 0 : just check if throttled data is available (any irq context)
* update == 1 : check and send throttled data to userspace (soft_irq context)
*/
static int bcm_rx_thr_flush(struct bcm_op *op)
static int bcm_rx_thr_flush(struct bcm_op *op, int update)
{
int updated = 0;
......@@ -551,27 +581,25 @@ static int bcm_rx_thr_flush(struct bcm_op *op)
int i;
/* for MUX filter we start at index 1 */
for (i = 1; i < op->nframes; i++) {
if ((op->last_frames) &&
(op->last_frames[i].can_dlc & RX_THR)) {
op->last_frames[i].can_dlc &= ~RX_THR;
bcm_rx_changed(op, &op->last_frames[i]);
updated++;
}
}
for (i = 1; i < op->nframes; i++)
updated += bcm_rx_do_flush(op, update, i);
} else {
/* for RX_FILTER_ID and simple filter */
if (op->last_frames && (op->last_frames[0].can_dlc & RX_THR)) {
op->last_frames[0].can_dlc &= ~RX_THR;
bcm_rx_changed(op, &op->last_frames[0]);
updated++;
}
updated += bcm_rx_do_flush(op, update, 0);
}
return updated;
}
static void bcm_rx_thr_tsklet(unsigned long data)
{
struct bcm_op *op = (struct bcm_op *)data;
/* push the changed data to the userspace */
bcm_rx_thr_flush(op, 1);
}
/*
* bcm_rx_thr_handler - the time for blocked content updates is over now:
* Check for throttled data and send it to the userspace
......@@ -580,7 +608,9 @@ static enum hrtimer_restart bcm_rx_thr_handler(struct hrtimer *hrtimer)
{
struct bcm_op *op = container_of(hrtimer, struct bcm_op, thrtimer);
if (bcm_rx_thr_flush(op)) {
tasklet_schedule(&op->thrtsklet);
if (bcm_rx_thr_flush(op, 0)) {
hrtimer_forward(hrtimer, ktime_get(), op->kt_ival2);
return HRTIMER_RESTART;
} else {
......@@ -596,48 +626,38 @@ static enum hrtimer_restart bcm_rx_thr_handler(struct hrtimer *hrtimer)
static void bcm_rx_handler(struct sk_buff *skb, void *data)
{
struct bcm_op *op = (struct bcm_op *)data;
struct can_frame rxframe;
const struct can_frame *rxframe = (struct can_frame *)skb->data;
int i;
/* disable timeout */
hrtimer_cancel(&op->timer);
if (skb->len == sizeof(rxframe)) {
memcpy(&rxframe, skb->data, sizeof(rxframe));
/* save rx timestamp */
op->rx_stamp = skb->tstamp;
/* save originator for recvfrom() */
op->rx_ifindex = skb->dev->ifindex;
/* update statistics */
op->frames_abs++;
kfree_skb(skb);
if (op->can_id != rxframe->can_id)
goto rx_freeskb;
} else {
kfree_skb(skb);
return;
}
if (op->can_id != rxframe.can_id)
return;
/* save rx timestamp */
op->rx_stamp = skb->tstamp;
/* save originator for recvfrom() */
op->rx_ifindex = skb->dev->ifindex;
/* update statistics */
op->frames_abs++;
if (op->flags & RX_RTR_FRAME) {
/* send reply for RTR-request (placed in op->frames[0]) */
bcm_can_tx(op);
return;
goto rx_freeskb;
}
if (op->flags & RX_FILTER_ID) {
/* the easiest case */
bcm_rx_update_and_send(op, &op->last_frames[0], &rxframe);
bcm_rx_starttimer(op);
return;
bcm_rx_update_and_send(op, &op->last_frames[0], rxframe);
goto rx_freeskb_starttimer;
}
if (op->nframes == 1) {
/* simple compare with index 0 */
bcm_rx_cmp_to_index(op, 0, &rxframe);
bcm_rx_starttimer(op);
return;
bcm_rx_cmp_to_index(op, 0, rxframe);
goto rx_freeskb_starttimer;
}
if (op->nframes > 1) {
......@@ -649,15 +669,19 @@ static void bcm_rx_handler(struct sk_buff *skb, void *data)
*/
for (i = 1; i < op->nframes; i++) {
if ((GET_U64(&op->frames[0]) & GET_U64(&rxframe)) ==
if ((GET_U64(&op->frames[0]) & GET_U64(rxframe)) ==
(GET_U64(&op->frames[0]) &
GET_U64(&op->frames[i]))) {
bcm_rx_cmp_to_index(op, i, &rxframe);
bcm_rx_cmp_to_index(op, i, rxframe);
break;
}
}
bcm_rx_starttimer(op);
}
rx_freeskb_starttimer:
bcm_rx_starttimer(op);
rx_freeskb:
kfree_skb(skb);
}
/*
......@@ -681,6 +705,12 @@ static void bcm_remove_op(struct bcm_op *op)
hrtimer_cancel(&op->timer);
hrtimer_cancel(&op->thrtimer);
if (op->tsklet.func)
tasklet_kill(&op->tsklet);
if (op->thrtsklet.func)
tasklet_kill(&op->thrtsklet);
if ((op->frames) && (op->frames != &op->sframe))
kfree(op->frames);
......@@ -891,6 +921,10 @@ static int bcm_tx_setup(struct bcm_msg_head *msg_head, struct msghdr *msg,
hrtimer_init(&op->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
op->timer.function = bcm_tx_timeout_handler;
/* initialize tasklet for tx countevent notification */
tasklet_init(&op->tsklet, bcm_tx_timeout_tsklet,
(unsigned long) op);
/* currently unused in tx_ops */
hrtimer_init(&op->thrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
......@@ -1054,9 +1088,17 @@ static int bcm_rx_setup(struct bcm_msg_head *msg_head, struct msghdr *msg,
hrtimer_init(&op->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
op->timer.function = bcm_rx_timeout_handler;
/* initialize tasklet for rx timeout notification */
tasklet_init(&op->tsklet, bcm_rx_timeout_tsklet,
(unsigned long) op);
hrtimer_init(&op->thrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
op->thrtimer.function = bcm_rx_thr_handler;
/* initialize tasklet for rx throttle handling */
tasklet_init(&op->thrtsklet, bcm_rx_thr_tsklet,
(unsigned long) op);
/* add this bcm_op to the list of the rx_ops */
list_add(&op->list, &bo->rx_ops);
......@@ -1102,7 +1144,7 @@ static int bcm_rx_setup(struct bcm_msg_head *msg_head, struct msghdr *msg,
*/
op->kt_lastmsg = ktime_set(0, 0);
hrtimer_cancel(&op->thrtimer);
bcm_rx_thr_flush(op);
bcm_rx_thr_flush(op, 1);
}
if ((op->flags & STARTTIMER) && op->kt_ival1.tv64)
......
......@@ -132,6 +132,9 @@
/* Instead of increasing this, you should create a hash table. */
#define MAX_GRO_SKBS 8
/* This should be increased if a protocol with a bigger head is added. */
#define GRO_MAX_HEAD (MAX_HEADER + 128)
/*
* The list of packet types we will receive (as opposed to discard)
* and the routines to invoke.
......@@ -2345,7 +2348,7 @@ static int napi_gro_complete(struct sk_buff *skb)
struct list_head *head = &ptype_base[ntohs(type) & PTYPE_HASH_MASK];
int err = -ENOENT;
if (!skb_shinfo(skb)->frag_list)
if (NAPI_GRO_CB(skb)->count == 1)
goto out;
rcu_read_lock();
......@@ -2365,6 +2368,7 @@ static int napi_gro_complete(struct sk_buff *skb)
}
out:
skb_shinfo(skb)->gso_size = 0;
__skb_push(skb, -skb_network_offset(skb));
return netif_receive_skb(skb);
}
......@@ -2383,7 +2387,7 @@ void napi_gro_flush(struct napi_struct *napi)
}
EXPORT_SYMBOL(napi_gro_flush);
int napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb)
static int __napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb)
{
struct sk_buff **pp = NULL;
struct packet_type *ptype;
......@@ -2392,6 +2396,7 @@ int napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb)
int count = 0;
int same_flow;
int mac_len;
int free;
if (!(skb->dev->features & NETIF_F_GRO))
goto normal;
......@@ -2408,6 +2413,7 @@ int napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb)
skb->mac_len = mac_len;
NAPI_GRO_CB(skb)->same_flow = 0;
NAPI_GRO_CB(skb)->flush = 0;
NAPI_GRO_CB(skb)->free = 0;
for (p = napi->gro_list; p; p = p->next) {
count++;
......@@ -2427,6 +2433,7 @@ int napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb)
goto normal;
same_flow = NAPI_GRO_CB(skb)->same_flow;
free = NAPI_GRO_CB(skb)->free;
if (pp) {
struct sk_buff *nskb = *pp;
......@@ -2446,17 +2453,91 @@ int napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb)
}
NAPI_GRO_CB(skb)->count = 1;
skb_shinfo(skb)->gso_size = skb->len;
skb->next = napi->gro_list;
napi->gro_list = skb;
ok:
return NET_RX_SUCCESS;
return free;
normal:
return netif_receive_skb(skb);
return -1;
}
int napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb)
{
switch (__napi_gro_receive(napi, skb)) {
case -1:
return netif_receive_skb(skb);
case 1:
kfree_skb(skb);
break;
}
return NET_RX_SUCCESS;
}
EXPORT_SYMBOL(napi_gro_receive);
int napi_gro_frags(struct napi_struct *napi, struct napi_gro_fraginfo *info)
{
struct net_device *dev = napi->dev;
struct sk_buff *skb = napi->skb;
int err = NET_RX_DROP;
napi->skb = NULL;
if (!skb) {
skb = netdev_alloc_skb(dev, GRO_MAX_HEAD + NET_IP_ALIGN);
if (!skb)
goto out;
skb_reserve(skb, NET_IP_ALIGN);
}
BUG_ON(info->nr_frags > MAX_SKB_FRAGS);
skb_shinfo(skb)->nr_frags = info->nr_frags;
memcpy(skb_shinfo(skb)->frags, info->frags, sizeof(info->frags));
skb->data_len = info->len;
skb->len += info->len;
skb->truesize += info->len;
if (!pskb_may_pull(skb, ETH_HLEN))
goto reuse;
err = NET_RX_SUCCESS;
skb->protocol = eth_type_trans(skb, dev);
skb->ip_summed = info->ip_summed;
skb->csum = info->csum;
switch (__napi_gro_receive(napi, skb)) {
case -1:
return netif_receive_skb(skb);
case 0:
goto out;
}
reuse:
skb_shinfo(skb)->nr_frags = 0;
skb->len -= skb->data_len;
skb->truesize -= skb->data_len;
skb->data_len = 0;
__skb_pull(skb, skb_headlen(skb));
skb_reserve(skb, NET_IP_ALIGN - skb_headroom(skb));
napi->skb = skb;
out:
return err;
}
EXPORT_SYMBOL(napi_gro_frags);
static int process_backlog(struct napi_struct *napi, int quota)
{
int work = 0;
......@@ -2535,11 +2616,12 @@ void netif_napi_add(struct net_device *dev, struct napi_struct *napi,
{
INIT_LIST_HEAD(&napi->poll_list);
napi->gro_list = NULL;
napi->skb = NULL;
napi->poll = poll;
napi->weight = weight;
list_add(&napi->dev_list, &dev->napi_list);
#ifdef CONFIG_NETPOLL
napi->dev = dev;
#ifdef CONFIG_NETPOLL
spin_lock_init(&napi->poll_lock);
napi->poll_owner = -1;
#endif
......@@ -2552,6 +2634,7 @@ void netif_napi_del(struct napi_struct *napi)
struct sk_buff *skb, *next;
list_del_init(&napi->dev_list);
kfree(napi->skb);
for (skb = napi->gro_list; skb; skb = next) {
next = skb->next;
......
......@@ -2594,6 +2594,17 @@ int skb_gro_receive(struct sk_buff **head, struct sk_buff *skb)
if (skb_shinfo(p)->frag_list)
goto merge;
else if (!skb_headlen(p) && !skb_headlen(skb) &&
skb_shinfo(p)->nr_frags + skb_shinfo(skb)->nr_frags <
MAX_SKB_FRAGS) {
memcpy(skb_shinfo(p)->frags + skb_shinfo(p)->nr_frags,
skb_shinfo(skb)->frags,
skb_shinfo(skb)->nr_frags * sizeof(skb_frag_t));
skb_shinfo(p)->nr_frags += skb_shinfo(skb)->nr_frags;
NAPI_GRO_CB(skb)->free = 1;
goto done;
}
headroom = skb_headroom(p);
nskb = netdev_alloc_skb(p->dev, headroom);
......@@ -2613,6 +2624,7 @@ int skb_gro_receive(struct sk_buff **head, struct sk_buff *skb)
*NAPI_GRO_CB(nskb) = *NAPI_GRO_CB(p);
skb_shinfo(nskb)->frag_list = p;
skb_shinfo(nskb)->gso_size = skb_shinfo(p)->gso_size;
skb_header_release(p);
nskb->prev = p;
......@@ -2627,11 +2639,12 @@ int skb_gro_receive(struct sk_buff **head, struct sk_buff *skb)
p = nskb;
merge:
NAPI_GRO_CB(p)->count++;
p->prev->next = skb;
p->prev = skb;
skb_header_release(skb);
done:
NAPI_GRO_CB(p)->count++;
p->data_len += skb->len;
p->truesize += skb->len;
p->len += skb->len;
......
......@@ -191,7 +191,7 @@ static int dcbnl_reply(u8 value, u8 event, u8 cmd, u8 attr, u32 pid,
return 0;
nlmsg_failure:
err:
kfree(dcbnl_skb);
kfree_skb(dcbnl_skb);
return ret;
}
......@@ -272,7 +272,7 @@ static int dcbnl_getpfccfg(struct net_device *netdev, struct nlattr **tb,
return 0;
nlmsg_failure:
err:
kfree(dcbnl_skb);
kfree_skb(dcbnl_skb);
err_out:
return -EINVAL;
}
......@@ -314,7 +314,7 @@ static int dcbnl_getperm_hwaddr(struct net_device *netdev, struct nlattr **tb,
nlmsg_failure:
err:
kfree(dcbnl_skb);
kfree_skb(dcbnl_skb);
err_out:
return -EINVAL;
}
......@@ -380,7 +380,7 @@ static int dcbnl_getcap(struct net_device *netdev, struct nlattr **tb,
return 0;
nlmsg_failure:
err:
kfree(dcbnl_skb);
kfree_skb(dcbnl_skb);
err_out:
return -EINVAL;
}
......@@ -458,7 +458,7 @@ static int dcbnl_getnumtcs(struct net_device *netdev, struct nlattr **tb,
return 0;
nlmsg_failure:
err:
kfree(dcbnl_skb);
kfree_skb(dcbnl_skb);
err_out:
return ret;
}
......@@ -687,7 +687,7 @@ static int __dcbnl_pg_getcfg(struct net_device *netdev, struct nlattr **tb,
nla_nest_cancel(dcbnl_skb, pg_nest);
nlmsg_failure:
err:
kfree(dcbnl_skb);
kfree_skb(dcbnl_skb);
err_out:
ret = -EINVAL;
return ret;
......@@ -949,7 +949,7 @@ static int dcbnl_bcn_getcfg(struct net_device *netdev, struct nlattr **tb,
nla_nest_cancel(dcbnl_skb, bcn_nest);
nlmsg_failure:
err:
kfree(dcbnl_skb);
kfree_skb(dcbnl_skb);
err_out:
ret = -EINVAL;
return ret;
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册