summaryrefslogtreecommitdiff
path: root/drivers/staging/ft1000
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/staging/ft1000')
-rw-r--r--drivers/staging/ft1000/Kconfig2
-rw-r--r--drivers/staging/ft1000/ft1000-pcmcia/ft1000_cs.c266
-rw-r--r--drivers/staging/ft1000/ft1000-pcmcia/ft1000_cs.h1
-rw-r--r--drivers/staging/ft1000/ft1000-pcmcia/ft1000_dnld.c3
-rw-r--r--drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c36
-rw-r--r--drivers/staging/ft1000/ft1000-usb/ft1000_debug.c6
-rw-r--r--drivers/staging/ft1000/ft1000-usb/ft1000_download.c1545
-rw-r--r--drivers/staging/ft1000/ft1000-usb/ft1000_hw.c2201
-rw-r--r--drivers/staging/ft1000/ft1000-usb/ft1000_hw.h10
-rw-r--r--drivers/staging/ft1000/ft1000-usb/ft1000_proc.c2
-rw-r--r--drivers/staging/ft1000/ft1000-usb/ft1000_usb.h20
11 files changed, 1916 insertions, 2176 deletions
diff --git a/drivers/staging/ft1000/Kconfig b/drivers/staging/ft1000/Kconfig
index d6da130..c54b4e8 100644
--- a/drivers/staging/ft1000/Kconfig
+++ b/drivers/staging/ft1000/Kconfig
@@ -13,7 +13,7 @@ config FT1000_USB
config FT1000_PCMCIA
tristate "Driver for ft1000 pcmcia device."
- depends on PCMCIA && BROKEN
+ depends on PCMCIA
depends on NET
help
Say Y if you want to have support for Flarion card also called
diff --git a/drivers/staging/ft1000/ft1000-pcmcia/ft1000_cs.c b/drivers/staging/ft1000/ft1000-pcmcia/ft1000_cs.c
index 2163eae..10af477 100644
--- a/drivers/staging/ft1000/ft1000-pcmcia/ft1000_cs.c
+++ b/drivers/staging/ft1000/ft1000-pcmcia/ft1000_cs.c
@@ -39,9 +39,6 @@
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
-//#include <pcmcia/version.h> // Slavius 21.10.2009 removed from kernel
-#include <pcmcia/cs_types.h>
-#include <pcmcia/cs.h>
#include <pcmcia/cistpl.h>
#include <pcmcia/cisreg.h>
#include <pcmcia/ds.h>
@@ -51,8 +48,6 @@
#include <asm/byteorder.h>
#include <asm/uaccess.h>
-#include "ft1000_cs.h" // Slavius 21.10.2009 because CS_SUCCESS constant is missing due to removed pcmcia/version.h
-
/*====================================================================*/
/* Module parameters */
@@ -82,9 +77,8 @@ MODULE_LICENSE("GPL");
/*====================================================================*/
-struct net_device *init_ft1000_card(int, int, unsigned char *,
- void *ft1000_reset, struct pcmcia_device * link,
- struct device *fdev);
+struct net_device *init_ft1000_card(struct pcmcia_device *link,
+ void *ft1000_reset);
void stop_ft1000_card(struct net_device *);
static int ft1000_config(struct pcmcia_device *link);
@@ -111,73 +105,7 @@ typedef struct local_info_t {
static void ft1000_reset(struct pcmcia_device * link)
{
- conf_reg_t reg;
-
- DEBUG(0, "ft1000_cs:ft1000_reset is called................\n");
-
- /* Soft-Reset card */
- reg.Action = CS_WRITE;
- reg.Offset = CISREG_COR;
- reg.Value = COR_SOFT_RESET;
- pcmcia_access_configuration_register(link, &reg);
-
- /* Wait until the card has acknowledged our reset */
- udelay(2);
-
- /* Restore original COR configuration index */
- /* Need at least 2 write to respond */
- reg.Action = CS_WRITE;
- reg.Offset = CISREG_COR;
- reg.Value = COR_DEFAULT;
- pcmcia_access_configuration_register(link, &reg);
-
- /* Wait until the card has finished restarting */
- udelay(1);
-
- reg.Action = CS_WRITE;
- reg.Offset = CISREG_COR;
- reg.Value = COR_DEFAULT;
- pcmcia_access_configuration_register(link, &reg);
-
- /* Wait until the card has finished restarting */
- udelay(1);
-
- reg.Action = CS_WRITE;
- reg.Offset = CISREG_COR;
- reg.Value = COR_DEFAULT;
- pcmcia_access_configuration_register(link, &reg);
-
- /* Wait until the card has finished restarting */
- udelay(1);
-
-}
-
-/*====================================================================*/
-
-static int get_tuple_first(struct pcmcia_device *link, tuple_t * tuple,
- cisparse_t * parse)
-{
- int i;
- i = pcmcia_get_first_tuple(link, tuple);
- if (i != CS_SUCCESS)
- return i;
- i = pcmcia_get_tuple_data(link, tuple);
- if (i != CS_SUCCESS)
- return i;
- return pcmcia_parse_tuple(tuple, parse); // Slavius 21.10.2009 removed unused link parameter
-}
-
-static int get_tuple_next(struct pcmcia_device *link, tuple_t * tuple,
- cisparse_t * parse)
-{
- int i;
- i = pcmcia_get_next_tuple(link, tuple);
- if (i != CS_SUCCESS)
- return i;
- i = pcmcia_get_tuple_data(link, tuple);
- if (i != CS_SUCCESS)
- return i;
- return pcmcia_parse_tuple(tuple, parse); // Slavius 21.10.2009 removed unused link parameter
+ pcmcia_reset_card(link->socket);
}
/*======================================================================
@@ -192,23 +120,19 @@ static int ft1000_attach(struct pcmcia_device *link)
DEBUG(0, "ft1000_cs: ft1000_attach()\n");
- local = kmalloc(sizeof(local_info_t), GFP_KERNEL);
+ local = kzalloc(sizeof(local_info_t), GFP_KERNEL);
if (!local) {
return -ENOMEM;
}
- memset(local, 0, sizeof(local_info_t));
local->link = link;
link->priv = local;
local->dev = NULL;
- link->irq.Attributes = IRQ_TYPE_EXCLUSIVE;
- link->irq.IRQInfo1 = IRQ_LEVEL_ID;
- link->conf.Attributes = CONF_ENABLE_IRQ;
- link->conf.IntType = INT_MEMORY_AND_IO;
- link->irq.Handler = NULL;
+ link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO;
return ft1000_config(link);
+
} /* ft1000_attach */
/*======================================================================
@@ -235,7 +159,7 @@ static void ft1000_detach(struct pcmcia_device *link)
stop_ft1000_card(dev);
}
- ft1000_release(link);
+ pcmcia_disable_device(link);
/* This points to the parent local_info_t struct */
free_netdev(dev);
@@ -244,166 +168,53 @@ static void ft1000_detach(struct pcmcia_device *link)
/*======================================================================
+ Check if the io window is configured
+
+======================================================================*/
+int ft1000_confcheck(struct pcmcia_device *link, void *priv_data)
+{
+
+ return pcmcia_request_io(link);
+} /* ft1000_confcheck */
+
+/*======================================================================
+
ft1000_config() is scheduled to run after a CARD_INSERTION event
is received, to configure the PCMCIA socket, and to make the
device available to the system.
======================================================================*/
-#define CS_CHECK(fn, ret) \
- do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
-
-#define CFG_CHECK(fn, ret) \
- last_fn = (fn); if ((last_ret = (ret)) != 0) goto next_entry
-
-static int ft1000_config(struct pcmcia_device * link)
+static int ft1000_config(struct pcmcia_device *link)
{
- tuple_t tuple;
- cisparse_t parse;
- int last_fn, last_ret, i;
- u_char buf[64];
- cistpl_lan_node_id_t *node_id;
- cistpl_cftable_entry_t dflt = { 0 };
- cistpl_cftable_entry_t *cfg;
- unsigned char mac_address[6];
+ int ret;
- DEBUG(0, "ft1000_cs: ft1000_config(0x%p)\n", link);
-
- /*
- This reads the card's CONFIG tuple to find its configuration
- registers.
- */
-// tuple.DesiredTuple = CISTPL_CONFIG;
-// tuple.Attributes = 0;
- tuple.TupleData = buf;
- tuple.TupleDataMax = sizeof(buf);
- tuple.TupleOffset = 0;
-// CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple));
-// CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple));
-// CS_CHECK(ParseTuple, pcmcia_parse_tuple(link, &tuple, &parse));
-// link->conf.ConfigBase = parse.config.base;
-// link->conf.Present = parse.config.rmask[0];
+ dev_dbg(&link->dev, "ft1000_cs: ft1000_config(0x%p)\n", link);
- /*
- In this loop, we scan the CIS for configuration table entries,
- each of which describes a valid card configuration, including
- voltage, IO window, memory window, and interrupt settings.
-
- We make no assumptions about the card to be configured: we use
- just the information available in the CIS. In an ideal world,
- this would work for any PCMCIA card, but it requires a complete
- and accurate CIS. In practice, a driver usually "knows" most of
- these things without consulting the CIS, and most client drivers
- will only use the CIS to fill in implementation-defined details.
- */
- tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
- tuple.Attributes = 0;
- CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple));
- while (1) {
- cfg = &(parse.cftable_entry);
- CFG_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple));
- CFG_CHECK(ParseTuple,
- pcmcia_parse_tuple(&tuple, &parse)); // Slavius 21.10.2009 removed unused link parameter
-
- if (cfg->flags & CISTPL_CFTABLE_DEFAULT)
- dflt = *cfg;
- if (cfg->index == 0)
- goto next_entry;
- link->conf.ConfigIndex = cfg->index;
-
- /* Do we need to allocate an interrupt? */
- if (cfg->irq.IRQInfo1 || dflt.irq.IRQInfo1)
- link->conf.Attributes |= CONF_ENABLE_IRQ;
-
- /* IO window settings */
- link->io.NumPorts1 = link->io.NumPorts2 = 0;
- if ((cfg->io.nwin > 0) || (dflt.io.nwin > 0)) {
- cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt.io;
- link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
- if (!(io->flags & CISTPL_IO_8BIT)) {
- DEBUG(0, "ft1000_cs: IO_DATA_PATH_WIDTH_16\n");
- link->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
- }
- if (!(io->flags & CISTPL_IO_16BIT)) {
- DEBUG(0, "ft1000_cs: IO_DATA_PATH_WIDTH_8\n");
- link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
- }
- link->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
- link->io.BasePort1 = io->win[0].base;
- link->io.NumPorts1 = io->win[0].len;
- if (io->nwin > 1) {
- link->io.Attributes2 = link->io.Attributes1;
- link->io.BasePort2 = io->win[1].base;
- link->io.NumPorts2 = io->win[1].len;
- }
- /* This reserves IO space but doesn't actually enable it */
- pcmcia_request_io(link, &link->io);
- }
-
- break;
-
- next_entry:
- last_ret = pcmcia_get_next_tuple(link, &tuple);
- }
- if (last_ret != CS_SUCCESS) {
- cs_error(link, RequestIO, last_ret);
- goto failed;
+ /* setup IO window */
+ ret = pcmcia_loop_config(link, ft1000_confcheck, NULL);
+ if (ret) {
+ printk(KERN_INFO "ft1000: Could not configure pcmcia\n");
+ return -ENODEV;
}
- /*
- Allocate an interrupt line. Note that this does not assign a
- handler to the interrupt, unless the 'Handler' member of the
- irq structure is initialized.
- */
- CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq));
-
- /*
- This actually configures the PCMCIA socket -- setting up
- the I/O windows and the interrupt mapping, and putting the
- card and host interface into "Memory and IO" mode.
- */
- CS_CHECK(RequestConfiguration,
- pcmcia_request_configuration(link, &link->conf));
-
- /* Get MAC address from tuples */
-
- tuple.Attributes = tuple.TupleOffset = 0;
- tuple.TupleData = buf;
- tuple.TupleDataMax = sizeof(buf);
-
- /* Check for a LAN function extension tuple */
- tuple.DesiredTuple = CISTPL_FUNCE;
- i = get_tuple_first(link, &tuple, &parse);
- while (i == CS_SUCCESS) {
- if (parse.funce.type == CISTPL_FUNCE_LAN_NODE_ID)
- break;
- i = get_tuple_next(link, &tuple, &parse);
+ /* configure device */
+ ret = pcmcia_enable_device(link);
+ if (ret) {
+ printk(KERN_INFO "ft1000: could not enable pcmcia\n");
+ goto failed;
}
- if (i == CS_SUCCESS) {
- node_id = (cistpl_lan_node_id_t *) parse.funce.data;
- if (node_id->nb == 6) {
- for (i = 0; i < 6; i++)
- mac_address[i] = node_id->id[i];
- }
+ ((local_info_t *) link->priv)->dev = init_ft1000_card(link,
+ &ft1000_reset);
+ if (((local_info_t *) link->priv)->dev == NULL) {
+ printk(KERN_INFO "ft1000: Could not register as network device\n");
+ goto failed;
}
- ((local_info_t *) link->priv)->dev =
- init_ft1000_card(link->irq.AssignedIRQ, link->io.BasePort1,
- &mac_address[0], ft1000_reset, link,
- &handle_to_dev(link));
-
- /*
- At this point, the dev_node_t structure(s) need to be
- initialized and arranged in a linked list at link->dev.
- */
-
/* Finally, report what we've done */
return 0;
-
-cs_failed:
- cs_error(link, last_fn, last_ret);
failed:
ft1000_release(link);
return -ENODEV;
@@ -429,14 +240,11 @@ static void ft1000_release(struct pcmcia_device * link)
no one will try to access the device or its data structures.
*/
- /* Unlink the device chain */
- link->dev_node = NULL;
-
/*
In a normal driver, additional code may be needed to release
other kernel data structures associated with this device.
*/
-
+ kfree((local_info_t *) link->priv);
/* Don't bother checking to see if these succeed or not */
pcmcia_disable_device(link);
diff --git a/drivers/staging/ft1000/ft1000-pcmcia/ft1000_cs.h b/drivers/staging/ft1000/ft1000-pcmcia/ft1000_cs.h
deleted file mode 100644
index 2b5e383..0000000
--- a/drivers/staging/ft1000/ft1000-pcmcia/ft1000_cs.h
+++ /dev/null
@@ -1 +0,0 @@
-#define CS_SUCCESS 0x00
diff --git a/drivers/staging/ft1000/ft1000-pcmcia/ft1000_dnld.c b/drivers/staging/ft1000/ft1000-pcmcia/ft1000_dnld.c
index 0bf398d..b0729fc 100644
--- a/drivers/staging/ft1000/ft1000-pcmcia/ft1000_dnld.c
+++ b/drivers/staging/ft1000/ft1000-pcmcia/ft1000_dnld.c
@@ -30,7 +30,6 @@
#include <linux/netdevice.h>
#include <linux/timer.h>
#include <linux/delay.h>
-#include <linux/slab.h>
#include <asm/io.h>
#include <asm/uaccess.h>
#include <linux/vmalloc.h>
@@ -310,7 +309,7 @@ USHORT hdr_checksum(PPSEUDO_HDR pHdr)
return chksum;
}
-int card_download(struct net_device *dev, void *pFileStart, UINT FileLength)
+int card_download(struct net_device *dev, const u8 *pFileStart, UINT FileLength)
{
FT1000_INFO *info = (PFT1000_INFO) netdev_priv(dev);
int Status = SUCCESS;
diff --git a/drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c b/drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c
index 588afd5..ff691d9 100644
--- a/drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c
+++ b/drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c
@@ -43,6 +43,10 @@
#include <linux/firmware.h>
#include <linux/ethtool.h>
+#include <pcmcia/cistpl.h>
+#include <pcmcia/cisreg.h>
+#include <pcmcia/ds.h>
+
#ifdef FT_DEBUG
#define DEBUG(n, args...) printk(KERN_DEBUG args);
#else
@@ -53,7 +57,7 @@
#include "ft1000_dev.h"
#include "ft1000.h"
-int card_download(struct net_device *dev, void *pFileStart, UINT FileLength);
+int card_download(struct net_device *dev, const u8 *pFileStart, UINT FileLength);
void ft1000InitProc(struct net_device *dev);
void ft1000CleanupProc(struct net_device *dev);
@@ -1936,7 +1940,7 @@ int ft1000_copy_down_pkt(struct net_device *dev, u16 * packet, u16 len)
}
info->stats.tx_packets++;
- // Add 14 bytes for MAC adddress plus ethernet type
+ // Add 14 bytes for MAC address plus ethernet type
info->stats.tx_bytes += (len + 14);
return SUCCESS;
}
@@ -2148,13 +2152,11 @@ static const struct ethtool_ops ops = {
.get_link = ft1000_get_link
};
-struct net_device *init_ft1000_card(unsigned short irq, int port,
- unsigned char *mac_addr, void *ft1000_reset,
- void *link, struct device *fdev)
+struct net_device *init_ft1000_card(struct pcmcia_device *link,
+ void *ft1000_reset)
{
FT1000_INFO *info;
struct net_device *dev;
- int i;
static const struct net_device_ops ft1000ops = // Slavius 21.10.2009 due to kernel changes
{
@@ -2165,8 +2167,8 @@ struct net_device *init_ft1000_card(unsigned short irq, int port,
};
DEBUG(1, "ft1000_hw: init_ft1000_card()\n");
- DEBUG(1, "ft1000_hw: irq = %d\n", irq);
- DEBUG(1, "ft1000_hw: port = 0x%04x\n", port);
+ DEBUG(1, "ft1000_hw: irq = %d\n", link->irq);
+ DEBUG(1, "ft1000_hw: port = 0x%04x\n", link->resource[0]->start);
flarion_ft1000_cnt++;
@@ -2184,7 +2186,7 @@ struct net_device *init_ft1000_card(unsigned short irq, int port,
return NULL;
}
- SET_NETDEV_DEV(dev, fdev);
+ SET_NETDEV_DEV(dev, &link->dev);
info = netdev_priv(dev);
memset(info, 0, sizeof(FT1000_INFO));
@@ -2227,15 +2229,13 @@ struct net_device *init_ft1000_card(unsigned short irq, int port,
DEBUG(0, "device name = %s\n", dev->name);
- for (i = 0; i < 6; i++) {
- dev->dev_addr[i] = mac_addr[i];
- DEBUG(1, "ft1000_hw: mac_addr %d = 0x%02x\n", i, mac_addr[i]);
+ dev->irq = link->irq;
+ dev->base_addr = link->resource[0]->start;
+ if (pcmcia_get_mac_from_cis(link, dev)) {
+ printk(KERN_ERR "ft1000: Could not read mac address\n");
+ goto err_dev;
}
- netif_stop_queue(dev);
- dev->irq = irq;
- dev->base_addr = port;
-
if (request_irq(dev->irq, ft1000_interrupt, IRQF_SHARED, dev->name, dev)) {
printk(KERN_ERR "ft1000: Could not request_irq\n");
goto err_dev;
@@ -2254,13 +2254,13 @@ struct net_device *init_ft1000_card(unsigned short irq, int port,
info->AsicID = ft1000_read_reg(dev, FT1000_REG_ASIC_ID);
if (info->AsicID == ELECTRABUZZ_ID) {
DEBUG(0, "ft1000_hw: ELECTRABUZZ ASIC\n");
- if (request_firmware(&fw_entry, "ft1000.img", fdev) != 0) {
+ if (request_firmware(&fw_entry, "ft1000.img", &link->dev) != 0) {
printk(KERN_INFO "ft1000: Could not open ft1000.img\n");
goto err_unreg;
}
} else {
DEBUG(0, "ft1000_hw: MAGNEMITE ASIC\n");
- if (request_firmware(&fw_entry, "ft2000.img", fdev) != 0) {
+ if (request_firmware(&fw_entry, "ft2000.img", &link->dev) != 0) {
printk(KERN_INFO "ft1000: Could not open ft2000.img\n");
goto err_unreg;
}
diff --git a/drivers/staging/ft1000/ft1000-usb/ft1000_debug.c b/drivers/staging/ft1000/ft1000-usb/ft1000_debug.c
index 149ba59..19db23f 100644
--- a/drivers/staging/ft1000/ft1000-usb/ft1000_debug.c
+++ b/drivers/staging/ft1000/ft1000-usb/ft1000_debug.c
@@ -471,14 +471,14 @@ static long ft1000_ioctl (struct file *file, unsigned int command,
// Connect Message
DEBUG("FT1000:ft1000_ioctl: IOCTL_FT1000_CONNECT\n");
ConnectionMsg[79] = 0xfc;
- CardSendCommand(ft1000dev, (unsigned short *)ConnectionMsg, 0x4c);
+ card_send_command(ft1000dev, (unsigned short *)ConnectionMsg, 0x4c);
break;
case IOCTL_DISCONNECT:
// Disconnect Message
DEBUG("FT1000:ft1000_ioctl: IOCTL_FT1000_DISCONNECT\n");
ConnectionMsg[79] = 0xfd;
- CardSendCommand(ft1000dev, (unsigned short *)ConnectionMsg, 0x4c);
+ card_send_command(ft1000dev, (unsigned short *)ConnectionMsg, 0x4c);
break;
case IOCTL_GET_DSP_STAT_CMD:
//DEBUG("FT1000:ft1000_ioctl: IOCTL_FT1000_GET_DSP_STAT called\n");
@@ -642,7 +642,7 @@ static long ft1000_ioctl (struct file *file, unsigned int command,
}
pmsg++;
ppseudo_hdr = (struct pseudo_hdr *)pmsg;
- CardSendCommand(ft1000dev,(unsigned short*)dpram_data,total_len+2);
+ card_send_command(ft1000dev,(unsigned short*)dpram_data,total_len+2);
info->app_info[app_index].nTxMsg++;
diff --git a/drivers/staging/ft1000/ft1000-usb/ft1000_download.c b/drivers/staging/ft1000/ft1000-usb/ft1000_download.c
index 17546d8..8e62242 100644
--- a/drivers/staging/ft1000/ft1000-usb/ft1000_download.c
+++ b/drivers/staging/ft1000/ft1000-usb/ft1000_download.c
@@ -125,65 +125,48 @@ struct dsp_image_info {
//---------------------------------------------------------------------------
static u32 check_usb_db (struct ft1000_device *ft1000dev)
{
- int loopcnt;
- u16 temp;
- u32 status;
-
- loopcnt = 0;
- while (loopcnt < 10)
- {
-
- status = ft1000_read_register (ft1000dev, &temp, FT1000_REG_DOORBELL);
- DEBUG("check_usb_db: read FT1000_REG_DOORBELL value is %x\n", temp);
- if (temp & 0x0080)
- {
- DEBUG("FT1000:Got checkusb doorbell\n");
- status = ft1000_write_register (ft1000dev, 0x0080, FT1000_REG_DOORBELL);
- status = ft1000_write_register (ft1000dev, 0x0100, FT1000_REG_DOORBELL);
- status = ft1000_write_register (ft1000dev, 0x8000, FT1000_REG_DOORBELL);
- break;
- }
- else
- {
- loopcnt++;
- msleep (10);
- }
-
- } //end of while
-
-
- loopcnt = 0;
- while (loopcnt < 20)
- {
-
- status = ft1000_read_register (ft1000dev, &temp, FT1000_REG_DOORBELL);
- DEBUG("FT1000:check_usb_db:Doorbell = 0x%x\n", temp);
- if (temp & 0x8000)
- {
- loopcnt++;
- msleep (10);
- }
- else
- {
- DEBUG("check_usb_db: door bell is cleared, return 0\n");
- return 0;
- }
-#if 0
- // Check if Card is present
- status = ft1000_read_register (ft1000dev, &temp, FT1000_REG_SUP_IMASK);
- if (temp == 0x0000) {
- break;
- }
-
- status = ft1000_read_register (ft1000dev, &temp, FT1000_REG_ASIC_ID);
- if (temp == 0xffff) {
- break;
- }
-#endif
- }
+ int loopcnt;
+ u16 temp;
+ u32 status;
+
+ loopcnt = 0;
+
+ while (loopcnt < 10) {
+ status = ft1000_read_register(ft1000dev, &temp,
+ FT1000_REG_DOORBELL);
+ DEBUG("check_usb_db: read FT1000_REG_DOORBELL value is %x\n",
+ temp);
+ if (temp & 0x0080) {
+ DEBUG("FT1000:Got checkusb doorbell\n");
+ status = ft1000_write_register(ft1000dev, 0x0080,
+ FT1000_REG_DOORBELL);
+ status = ft1000_write_register(ft1000dev, 0x0100,
+ FT1000_REG_DOORBELL);
+ status = ft1000_write_register(ft1000dev, 0x8000,
+ FT1000_REG_DOORBELL);
+ break;
+ } else {
+ loopcnt++;
+ msleep(10);
+ }
- return HANDSHAKE_MAG_TIMEOUT_VALUE;
+ }
+
+ loopcnt = 0;
+ while (loopcnt < 20) {
+ status = ft1000_read_register(ft1000dev, &temp,
+ FT1000_REG_DOORBELL);
+ DEBUG("FT1000:check_usb_db:Doorbell = 0x%x\n", temp);
+ if (temp & 0x8000) {
+ loopcnt++;
+ msleep(10);
+ } else {
+ DEBUG("check_usb_db: door bell is cleared, return 0\n");
+ return 0;
+ }
+ }
+ return HANDSHAKE_MAG_TIMEOUT_VALUE;
}
//---------------------------------------------------------------------------
@@ -202,57 +185,49 @@ static u32 check_usb_db (struct ft1000_device *ft1000dev)
//---------------------------------------------------------------------------
static u16 get_handshake(struct ft1000_device *ft1000dev, u16 expected_value)
{
- u16 handshake;
- int loopcnt;
- u32 status=0;
+ u16 handshake;
+ int loopcnt;
+ u32 status = 0;
struct ft1000_info *pft1000info = netdev_priv(ft1000dev->net);
- loopcnt = 0;
- while (loopcnt < 100)
- {
+ loopcnt = 0;
+
+ while (loopcnt < 100) {
+ /* Need to clear downloader doorbell if Hartley ASIC */
+ status = ft1000_write_register(ft1000dev, FT1000_DB_DNLD_RX,
+ FT1000_REG_DOORBELL);
+ if (pft1000info->fcodeldr) {
+ DEBUG(" get_handshake: fcodeldr is %d\n",
+ pft1000info->fcodeldr);
+ pft1000info->fcodeldr = 0;
+ status = check_usb_db(ft1000dev);
+ if (status != STATUS_SUCCESS) {
+ DEBUG("get_handshake: check_usb_db failed\n");
+ status = STATUS_FAILURE;
+ break;
+ }
+ status = ft1000_write_register(ft1000dev,
+ FT1000_DB_DNLD_RX,
+ FT1000_REG_DOORBELL);
+ }
- // Need to clear downloader doorbell if Hartley ASIC
- status = ft1000_write_register (ft1000dev, FT1000_DB_DNLD_RX, FT1000_REG_DOORBELL);
- //DEBUG("FT1000:get_handshake:doorbell = 0x%x\n", temp);
- if (pft1000info->fcodeldr)
- {
- DEBUG(" get_handshake: fcodeldr is %d\n", pft1000info->fcodeldr);
- pft1000info->fcodeldr = 0;
- status = check_usb_db(ft1000dev);
- if (status != STATUS_SUCCESS)
- {
- DEBUG("get_handshake: check_usb_db failed\n");
- status = STATUS_FAILURE;
- break;
- }
- status = ft1000_write_register (ft1000dev, FT1000_DB_DNLD_RX, FT1000_REG_DOORBELL);
- }
-
- status = ft1000_read_dpram16 (ft1000dev, DWNLD_MAG1_HANDSHAKE_LOC, (u8 *)&handshake, 1);
- //DEBUG("get_handshake: handshake is %x\n", tempx);
- handshake = ntohs(handshake);
- //DEBUG("get_handshake: after swap, handshake is %x\n", handshake);
-
- if (status)
- return HANDSHAKE_TIMEOUT_VALUE;
-
- //DEBUG("get_handshake: handshake= %x\n", handshake);
- if ((handshake == expected_value) || (handshake == HANDSHAKE_RESET_VALUE_USB))
- {
- //DEBUG("get_handshake: return handshake %x\n", handshake);
- return handshake;
- }
- else
- {
- loopcnt++;
- msleep (10);
- }
- //DEBUG("HANDSHKE LOOP: %d\n", loopcnt);
+ status = ft1000_read_dpram16(ft1000dev,
+ DWNLD_MAG1_HANDSHAKE_LOC, (u8 *)&handshake, 1);
+ handshake = ntohs(handshake);
- }
+ if (status)
+ return HANDSHAKE_TIMEOUT_VALUE;
+
+ if ((handshake == expected_value) ||
+ (handshake == HANDSHAKE_RESET_VALUE_USB)) {
+ return handshake;
+ } else {
+ loopcnt++;
+ msleep(10);
+ }
+ }
- //DEBUG("get_handshake: return handshake time out\n");
- return HANDSHAKE_TIMEOUT_VALUE;
+ return HANDSHAKE_TIMEOUT_VALUE;
}
//---------------------------------------------------------------------------
@@ -271,65 +246,74 @@ static u16 get_handshake(struct ft1000_device *ft1000dev, u16 expected_value)
//---------------------------------------------------------------------------
static void put_handshake(struct ft1000_device *ft1000dev,u16 handshake_value)
{
- u32 tempx;
- u16 tempword;
- u32 status;
-
-
-
- tempx = (u32)handshake_value;
- tempx = ntohl(tempx);
-
- tempword = (u16)(tempx & 0xffff);
- status = ft1000_write_dpram16 (ft1000dev, DWNLD_MAG1_HANDSHAKE_LOC, tempword, 0);
- tempword = (u16)(tempx >> 16);
- status = ft1000_write_dpram16 (ft1000dev, DWNLD_MAG1_HANDSHAKE_LOC, tempword, 1);
- status = ft1000_write_register(ft1000dev, FT1000_DB_DNLD_TX, FT1000_REG_DOORBELL);
+ u32 tempx;
+ u16 tempword;
+ u32 status;
+
+ tempx = (u32)handshake_value;
+ tempx = ntohl(tempx);
+
+ tempword = (u16)(tempx & 0xffff);
+ status = ft1000_write_dpram16(ft1000dev, DWNLD_MAG1_HANDSHAKE_LOC,
+ tempword, 0);
+ tempword = (u16)(tempx >> 16);
+ status = ft1000_write_dpram16(ft1000dev, DWNLD_MAG1_HANDSHAKE_LOC,
+ tempword, 1);
+ status = ft1000_write_register(ft1000dev, FT1000_DB_DNLD_TX,
+ FT1000_REG_DOORBELL);
}
static u16 get_handshake_usb(struct ft1000_device *ft1000dev, u16 expected_value)
{
- u16 handshake;
- int loopcnt;
- u16 temp;
- u32 status=0;
+ u16 handshake;
+ int loopcnt;
+ u16 temp;
+ u32 status = 0;
struct ft1000_info *pft1000info = netdev_priv(ft1000dev->net);
- loopcnt = 0;
- handshake = 0;
- while (loopcnt < 100)
- {
- if (pft1000info->usbboot == 2) {
- status = ft1000_read_dpram32 (ft1000dev, 0, (u8 *)&(pft1000info->tempbuf[0]), 64);
- for (temp=0; temp<16; temp++)
- DEBUG("tempbuf %d = 0x%x\n", temp, pft1000info->tempbuf[temp]);
- status = ft1000_read_dpram16 (ft1000dev, DWNLD_MAG1_HANDSHAKE_LOC, (u8 *)&handshake, 1);
- DEBUG("handshake from read_dpram16 = 0x%x\n", handshake);
- if (pft1000info->dspalive == pft1000info->tempbuf[6])
- handshake = 0;
- else {
- handshake = pft1000info->tempbuf[1];
- pft1000info->dspalive = pft1000info->tempbuf[6];
- }
- }
- else {
- status = ft1000_read_dpram16 (ft1000dev, DWNLD_MAG1_HANDSHAKE_LOC, (u8 *)&handshake, 1);
- }
- loopcnt++;
- msleep(10);
- handshake = ntohs(handshake);
- if ((handshake == expected_value) || (handshake == HANDSHAKE_RESET_VALUE_USB))
- {
- return handshake;
- }
- }
+ loopcnt = 0;
+ handshake = 0;
+
+ while (loopcnt < 100) {
+ if (pft1000info->usbboot == 2) {
+ status = ft1000_read_dpram32(ft1000dev, 0,
+ (u8 *)&(pft1000info->tempbuf[0]), 64);
+ for (temp = 0; temp < 16; temp++) {
+ DEBUG("tempbuf %d = 0x%x\n", temp,
+ pft1000info->tempbuf[temp]);
+ }
+ status = ft1000_read_dpram16(ft1000dev,
+ DWNLD_MAG1_HANDSHAKE_LOC,
+ (u8 *)&handshake, 1);
+ DEBUG("handshake from read_dpram16 = 0x%x\n",
+ handshake);
+ if (pft1000info->dspalive == pft1000info->tempbuf[6]) {
+ handshake = 0;
+ } else {
+ handshake = pft1000info->tempbuf[1];
+ pft1000info->dspalive =
+ pft1000info->tempbuf[6];
+ }
+ } else {
+ status = ft1000_read_dpram16(ft1000dev,
+ DWNLD_MAG1_HANDSHAKE_LOC,
+ (u8 *)&handshake, 1);
+ }
+
+ loopcnt++;
+ msleep(10);
+ handshake = ntohs(handshake);
+ if ((handshake == expected_value) ||
+ (handshake == HANDSHAKE_RESET_VALUE_USB))
+ return handshake;
+ }
- return HANDSHAKE_TIMEOUT_VALUE;
+ return HANDSHAKE_TIMEOUT_VALUE;
}
static void put_handshake_usb(struct ft1000_device *ft1000dev,u16 handshake_value)
{
- int i;
+ int i;
for (i=0; i<1000; i++);
}
@@ -348,62 +332,56 @@ static void put_handshake_usb(struct ft1000_device *ft1000dev,u16 handshake_valu
//---------------------------------------------------------------------------
static u16 get_request_type(struct ft1000_device *ft1000dev)
{
- u16 request_type;
- u32 status;
- u16 tempword;
- u32 tempx;
+ u16 request_type;
+ u32 status;
+ u16 tempword;
+ u32 tempx;
struct ft1000_info *pft1000info = netdev_priv(ft1000dev->net);
- if ( pft1000info->bootmode == 1)
- {
- status = fix_ft1000_read_dpram32 (ft1000dev, DWNLD_MAG1_TYPE_LOC, (u8 *)&tempx);
- tempx = ntohl(tempx);
- }
- else
- {
- tempx = 0;
-
- status = ft1000_read_dpram16 (ft1000dev, DWNLD_MAG1_TYPE_LOC, (u8 *)&tempword, 1);
- tempx |= (tempword << 16);
- tempx = ntohl(tempx);
- }
- request_type = (u16)tempx;
-
- //DEBUG("get_request_type: request_type is %x\n", request_type);
- return request_type;
-
+ if (pft1000info->bootmode == 1) {
+ status = fix_ft1000_read_dpram32(ft1000dev,
+ DWNLD_MAG1_TYPE_LOC, (u8 *)&tempx);
+ tempx = ntohl(tempx);
+ } else {
+ tempx = 0;
+ status = ft1000_read_dpram16(ft1000dev,
+ DWNLD_MAG1_TYPE_LOC, (u8 *)&tempword, 1);
+ tempx |= (tempword << 16);
+ tempx = ntohl(tempx);
+ }
+ request_type = (u16)tempx;
+
+ return request_type;
}
static u16 get_request_type_usb(struct ft1000_device *ft1000dev)
{
- u16 request_type;
- u32 status;
- u16 tempword;
- u32 tempx;
+ u16 request_type;
+ u32 status;
+ u16 tempword;
+ u32 tempx;
struct ft1000_info *pft1000info = netdev_priv(ft1000dev->net);
- if ( pft1000info->bootmode == 1)
- {
- status = fix_ft1000_read_dpram32 (ft1000dev, DWNLD_MAG1_TYPE_LOC, (u8 *)&tempx);
- tempx = ntohl(tempx);
- }
- else
- {
- if (pft1000info->usbboot == 2) {
- tempx = pft1000info->tempbuf[2];
- tempword = pft1000info->tempbuf[3];
- }
- else {
- tempx = 0;
- status = ft1000_read_dpram16 (ft1000dev, DWNLD_MAG1_TYPE_LOC, (u8 *)&tempword, 1);
- }
- tempx |= (tempword << 16);
- tempx = ntohl(tempx);
- }
- request_type = (u16)tempx;
- //DEBUG("get_request_type: request_type is %x\n", request_type);
- return request_type;
+ if (pft1000info->bootmode == 1) {
+ status = fix_ft1000_read_dpram32(ft1000dev,
+ DWNLD_MAG1_TYPE_LOC, (u8 *)&tempx);
+ tempx = ntohl(tempx);
+ } else {
+ if (pft1000info->usbboot == 2) {
+ tempx = pft1000info->tempbuf[2];
+ tempword = pft1000info->tempbuf[3];
+ } else {
+ tempx = 0;
+ status = ft1000_read_dpram16(ft1000dev,
+ DWNLD_MAG1_TYPE_LOC,
+ (u8 *)&tempword, 1);
+ }
+ tempx |= (tempword << 16);
+ tempx = ntohl(tempx);
+ }
+ request_type = (u16)tempx;
+ return request_type;
}
//---------------------------------------------------------------------------
@@ -420,60 +398,28 @@ static u16 get_request_type_usb(struct ft1000_device *ft1000dev)
//---------------------------------------------------------------------------
static long get_request_value(struct ft1000_device *ft1000dev)
{
- u32 value;
- u16 tempword;
- u32 status;
+ u32 value;
+ u16 tempword;
+ u32 status;
struct ft1000_info *pft1000info = netdev_priv(ft1000dev->net);
-
- if ( pft1000info->bootmode == 1)
- {
- status = fix_ft1000_read_dpram32(ft1000dev, DWNLD_MAG1_SIZE_LOC, (u8 *)&value);
- value = ntohl(value);
- }
- else
- {
- status = ft1000_read_dpram16(ft1000dev, DWNLD_MAG1_SIZE_LOC, (u8 *)&tempword, 0);
- value = tempword;
- status = ft1000_read_dpram16(ft1000dev, DWNLD_MAG1_SIZE_LOC, (u8 *)&tempword, 1);
- value |= (tempword << 16);
- value = ntohl(value);
- }
-
-
- //DEBUG("get_request_value: value is %x\n", value);
- return value;
-
+ if (pft1000info->bootmode == 1) {
+ status = fix_ft1000_read_dpram32(ft1000dev,
+ DWNLD_MAG1_SIZE_LOC, (u8 *)&value);
+ value = ntohl(value);
+ } else {
+ status = ft1000_read_dpram16(ft1000dev,
+ DWNLD_MAG1_SIZE_LOC, (u8 *)&tempword, 0);
+ value = tempword;
+ status = ft1000_read_dpram16(ft1000dev,
+ DWNLD_MAG1_SIZE_LOC, (u8 *)&tempword, 1);
+ value |= (tempword << 16);
+ value = ntohl(value);
+ }
+
+ return value;
}
-#if 0
-static long get_request_value_usb(struct ft1000_device *ft1000dev)
-{
- u32 value;
- u16 tempword;
- u32 status;
- struct ft1000_info * pft1000info = netdev_priv(ft1000dev->net);
-
- if (pft1000info->usbboot == 2) {
- value = pft1000info->tempbuf[4];
- tempword = pft1000info->tempbuf[5];
- }
- else {
- value = 0;
- status = ft1000_read_dpram16(ft1000dev, DWNLD_MAG1_SIZE_LOC, (u8 *)&tempword, 1);
- }
-
- value |= (tempword << 16);
- value = ntohl(value);
-
- if (pft1000info->usbboot == 1)
- pft1000info->usbboot = 2;
-
- //DEBUG("get_request_value_usb: value is %x\n", value);
- return value;
-
-}
-#endif
//---------------------------------------------------------------------------
// Function: put_request_value
@@ -490,16 +436,12 @@ static long get_request_value_usb(struct ft1000_device *ft1000dev)
//---------------------------------------------------------------------------
static void put_request_value(struct ft1000_device *ft1000dev, long lvalue)
{
- u32 tempx;
- u32 status;
-
- tempx = ntohl(lvalue);
- status = fix_ft1000_write_dpram32(ft1000dev, DWNLD_MAG1_SIZE_LOC, (u8 *)&tempx);
-
-
-
- //DEBUG("put_request_value: value is %x\n", lvalue);
+ u32 tempx;
+ u32 status;
+ tempx = ntohl(lvalue);
+ status = fix_ft1000_write_dpram32(ft1000dev, DWNLD_MAG1_SIZE_LOC,
+ (u8 *)&tempx);
}
@@ -518,16 +460,27 @@ static void put_request_value(struct ft1000_device *ft1000dev, long lvalue)
//---------------------------------------------------------------------------
static u16 hdr_checksum(struct pseudo_hdr *pHdr)
{
- u16 *usPtr = (u16 *)pHdr;
- u16 chksum;
+ u16 *usPtr = (u16 *)pHdr;
+ u16 chksum;
- chksum = ((((((usPtr[0] ^ usPtr[1]) ^ usPtr[2]) ^ usPtr[3]) ^
- usPtr[4]) ^ usPtr[5]) ^ usPtr[6]);
+ chksum = ((((((usPtr[0] ^ usPtr[1]) ^ usPtr[2]) ^ usPtr[3]) ^
+ usPtr[4]) ^ usPtr[5]) ^ usPtr[6]);
- return chksum;
+ return chksum;
}
+static int check_buffers(u16 *buff_w, u16 *buff_r, int len, int offset)
+{
+ int i;
+
+ for (i = 0; i < len; i++) {
+ if (buff_w[i] != buff_r[i + offset])
+ return -1;
+ }
+
+ return 0;
+}
//---------------------------------------------------------------------------
// Function: write_blk
@@ -550,9 +503,7 @@ static u32 write_blk (struct ft1000_device *ft1000dev, u16 **pUsFile, u8 **pUcFi
{
u32 Status = STATUS_SUCCESS;
u16 dpram;
- long temp_word_length;
int loopcnt, i, j;
- u16 *pTempFile;
u16 tempword;
u16 tempbuffer[64];
u16 resultbuffer[64];
@@ -571,8 +522,6 @@ static u32 write_blk (struct ft1000_device *ft1000dev, u16 **pUsFile, u8 **pUcFi
word_length--;
tempword = (u16)word_length;
word_length = (word_length / 16) + 1;
- pTempFile = *pUsFile;
- temp_word_length = word_length;
for (; word_length > 0; word_length--) /* In words */
{
loopcnt = 0;
@@ -622,43 +571,31 @@ static u32 write_blk (struct ft1000_device *ft1000dev, u16 **pUsFile, u8 **pUcFi
Status = ft1000_read_dpram32 (ft1000dev, dpram, (u8 *)&resultbuffer[0], 64);
if ( (tempbuffer[31] & 0xfe00) == 0xfe00)
{
- for (i=0; i<28; i++)
- {
- if (resultbuffer[i] != tempbuffer[i])
- {
- //NdisMSleep (100);
- DEBUG("FT1000:download:DPRAM write failed 1 during bootloading\n");
- msleep(10);
- Status = STATUS_FAILURE;
- break;
+ if (check_buffers(tempbuffer, resultbuffer, 28, 0)) {
+ DEBUG("FT1000:download:DPRAM write failed 1 during bootloading\n");
+ msleep(10);
+ Status = STATUS_FAILURE;
+ break;
}
- }
Status = ft1000_read_dpram32 (ft1000dev, dpram+12, (u8 *)&resultbuffer[0], 64);
- for (i=0; i<16; i++)
- {
- if (resultbuffer[i] != tempbuffer[i+24])
- {
- //NdisMSleep (100);
- DEBUG("FT1000:download:DPRAM write failed 2 during bootloading\n");
- msleep(10);
- Status = STATUS_FAILURE;
- break;
+
+ if (check_buffers(tempbuffer, resultbuffer, 16, 24)) {
+ DEBUG("FT1000:download:DPRAM write failed 2 during bootloading\n");
+ msleep(10);
+ Status = STATUS_FAILURE;
+ break;
}
- }
+
}
else
{
- for (i=0; i<32; i++)
- {
- if (resultbuffer[i] != tempbuffer[i])
- {
- //NdisMSleep (100);
- DEBUG("FT1000:download:DPRAM write failed 3 during bootloading\n");
- msleep(10);
- Status = STATUS_FAILURE;
- break;
+ if (check_buffers(tempbuffer, resultbuffer, 32, 0)) {
+ DEBUG("FT1000:download:DPRAM write failed 3 during bootloading\n");
+ msleep(10);
+ Status = STATUS_FAILURE;
+ break;
}
- }
+
}
if (Status == STATUS_SUCCESS)
@@ -702,60 +639,35 @@ static void usb_dnld_complete (struct urb *urb)
// Notes:
//
//---------------------------------------------------------------------------
-static u32 write_blk_fifo (struct ft1000_device *ft1000dev, u16 **pUsFile, u8 **pUcFile, long word_length)
+static u32 write_blk_fifo(struct ft1000_device *ft1000dev, u16 **pUsFile,
+ u8 **pUcFile, long word_length)
{
- u32 Status = STATUS_SUCCESS;
- int byte_length;
- long aligncnt;
+ u32 Status = STATUS_SUCCESS;
+ int byte_length;
- byte_length = word_length * 4;
+ byte_length = word_length * 4;
- if (byte_length % 4)
- aligncnt = 4 - (byte_length % 4);
- else
- aligncnt = 0;
- byte_length += aligncnt;
+ if (byte_length && ((byte_length % 64) == 0))
+ byte_length += 4;
- if (byte_length && ((byte_length % 64) == 0)) {
- byte_length += 4;
- }
+ if (byte_length < 64)
+ byte_length = 68;
- if (byte_length < 64)
- byte_length = 68;
-
-#if 0
- pblk = kzalloc(byte_length, GFP_KERNEL);
- memcpy (pblk, *pUcFile, byte_length);
-
- pipe = usb_sndbulkpipe (ft1000dev->dev, ft1000dev->bulk_out_endpointAddr);
-
- Status = usb_bulk_msg (ft1000dev->dev,
- pipe,
- pblk,
- byte_length,
- &cnt,
- 10);
- DEBUG("write_blk_fifo Status = 0x%8x Bytes Transfer = %d Data = 0x%x\n", Status, cnt, *pblk);
-
- kfree(pblk);
-#else
- usb_init_urb(ft1000dev->tx_urb);
- memcpy (ft1000dev->tx_buf, *pUcFile, byte_length);
- usb_fill_bulk_urb(ft1000dev->tx_urb,
- ft1000dev->dev,
- usb_sndbulkpipe(ft1000dev->dev, ft1000dev->bulk_out_endpointAddr),
- ft1000dev->tx_buf,
- byte_length,
- usb_dnld_complete,
- (void*)ft1000dev);
-
- usb_submit_urb(ft1000dev->tx_urb, GFP_ATOMIC);
-#endif
-
- *pUsFile = *pUsFile + (word_length << 1);
- *pUcFile = *pUcFile + (word_length << 2);
+ usb_init_urb(ft1000dev->tx_urb);
+ memcpy(ft1000dev->tx_buf, *pUcFile, byte_length);
+ usb_fill_bulk_urb(ft1000dev->tx_urb,
+ ft1000dev->dev,
+ usb_sndbulkpipe(ft1000dev->dev,
+ ft1000dev->bulk_out_endpointAddr),
+ ft1000dev->tx_buf, byte_length, usb_dnld_complete,
+ (void *)ft1000dev);
- return Status;
+ usb_submit_urb(ft1000dev->tx_urb, GFP_ATOMIC);
+
+ *pUsFile = *pUsFile + (word_length << 1);
+ *pUcFile = *pUcFile + (word_length << 2);
+
+ return Status;
}
//---------------------------------------------------------------------------
@@ -770,460 +682,534 @@ static u32 write_blk_fifo (struct ft1000_device *ft1000dev, u16 **pUsFile, u8 **
// Returns: status - return code
//---------------------------------------------------------------------------
-u16 scram_dnldr(struct ft1000_device *ft1000dev, void *pFileStart, u32 FileLength)
+u16 scram_dnldr(struct ft1000_device *ft1000dev, void *pFileStart,
+ u32 FileLength)
{
- u16 status = STATUS_SUCCESS;
- u32 state;
- u16 handshake;
+ u16 status = STATUS_SUCCESS;
+ u32 state;
+ u16 handshake;
struct pseudo_hdr *pseudo_header;
- u16 pseudo_header_len;
- long word_length;
- u16 request;
- u16 temp;
- u16 tempword;
+ u16 pseudo_header_len;
+ long word_length;
+ u16 request;
+ u16 temp;
+ u16 tempword;
struct dsp_file_hdr *file_hdr;
struct dsp_image_info *dsp_img_info = NULL;
- long requested_version;
- bool correct_version;
+ long requested_version;
+ bool correct_version;
struct drv_msg *mailbox_data;
- u16 *data = NULL;
- u16 *s_file = NULL;
- u8 *c_file = NULL;
- u8 *boot_end = NULL, *code_end= NULL;
- int image;
- long loader_code_address, loader_code_size = 0;
- long run_address = 0, run_size = 0;
-
- u32 templong;
- u32 image_chksum = 0;
-
- u16 dpram = 0;
- u8 *pbuffer;
+ u16 *data = NULL;
+ u16 *s_file = NULL;
+ u8 *c_file = NULL;
+ u8 *boot_end = NULL, *code_end = NULL;
+ int image;
+ long loader_code_address, loader_code_size = 0;
+ long run_address = 0, run_size = 0;
+
+ u32 templong;
+ u32 image_chksum = 0;
+
+ u16 dpram = 0;
+ u8 *pbuffer;
struct prov_record *pprov_record;
struct ft1000_info *pft1000info = netdev_priv(ft1000dev->net);
- DEBUG("Entered scram_dnldr...\n");
+ DEBUG("Entered scram_dnldr...\n");
- pft1000info->fcodeldr = 0;
- pft1000info->usbboot = 0;
- pft1000info->dspalive = 0xffff;
+ pft1000info->fcodeldr = 0;
+ pft1000info->usbboot = 0;
+ pft1000info->dspalive = 0xffff;
+ //
+ // Get version id of file, at first 4 bytes of file, for newer files.
+ //
- //
- // Get version id of file, at first 4 bytes of file, for newer files.
- //
+ state = STATE_START_DWNLD;
- state = STATE_START_DWNLD;
+ file_hdr = (struct dsp_file_hdr *)pFileStart;
- file_hdr = (struct dsp_file_hdr *)pFileStart;
+ ft1000_write_register(ft1000dev, 0x800, FT1000_REG_MAG_WATERMARK);
- ft1000_write_register (ft1000dev, 0x800, FT1000_REG_MAG_WATERMARK);
+ s_file = (u16 *) (pFileStart + file_hdr->loader_offset);
+ c_file = (u8 *) (pFileStart + file_hdr->loader_offset);
- s_file = (u16 *)(pFileStart + file_hdr->loader_offset);
- c_file = (u8 *)(pFileStart + file_hdr->loader_offset);
+ boot_end = (u8 *) (pFileStart + file_hdr->loader_code_end);
- boot_end = (u8 *)(pFileStart + file_hdr->loader_code_end);
+ loader_code_address = file_hdr->loader_code_address;
+ loader_code_size = file_hdr->loader_code_size;
+ correct_version = FALSE;
- loader_code_address = file_hdr->loader_code_address;
- loader_code_size = file_hdr->loader_code_size;
- correct_version = FALSE;
+ while ((status == STATUS_SUCCESS) && (state != STATE_DONE_FILE)) {
+ switch (state) {
+ case STATE_START_DWNLD:
+ DEBUG("FT1000:STATE_START_DWNLD\n");
+ if (pft1000info->usbboot)
+ handshake =
+ get_handshake_usb(ft1000dev,
+ HANDSHAKE_DSP_BL_READY);
+ else
+ handshake =
+ get_handshake(ft1000dev,
+ HANDSHAKE_DSP_BL_READY);
+
+ if (handshake == HANDSHAKE_DSP_BL_READY) {
+ DEBUG
+ ("scram_dnldr: handshake is HANDSHAKE_DSP_BL_READY, call put_handshake(HANDSHAKE_DRIVER_READY)\n");
+ put_handshake(ft1000dev,
+ HANDSHAKE_DRIVER_READY);
+ } else {
+ DEBUG
+ ("FT1000:download:Download error: Handshake failed\n");
+ status = STATUS_FAILURE;
+ }
- while ((status == STATUS_SUCCESS) && (state != STATE_DONE_FILE))
- {
- switch (state)
- {
- case STATE_START_DWNLD:
- DEBUG("FT1000:STATE_START_DWNLD\n");
- if (pft1000info->usbboot)
- handshake = get_handshake_usb(ft1000dev, HANDSHAKE_DSP_BL_READY);
- else
- handshake = get_handshake(ft1000dev, HANDSHAKE_DSP_BL_READY);
-
- if (handshake == HANDSHAKE_DSP_BL_READY)
- {
- DEBUG("scram_dnldr: handshake is HANDSHAKE_DSP_BL_READY, call put_handshake(HANDSHAKE_DRIVER_READY)\n");
- put_handshake(ft1000dev, HANDSHAKE_DRIVER_READY);
- }
- else
- {
- DEBUG("FT1000:download:Download error: Handshake failed\n");
- status = STATUS_FAILURE;
- }
-
- state = STATE_BOOT_DWNLD;
-
- break;
-
- case STATE_BOOT_DWNLD:
- DEBUG("FT1000:STATE_BOOT_DWNLD\n");
- pft1000info->bootmode = 1;
- handshake = get_handshake(ft1000dev, HANDSHAKE_REQUEST);
- if (handshake == HANDSHAKE_REQUEST)
- {
- /*
- * Get type associated with the request.
- */
- request = get_request_type(ft1000dev);
- switch (request)
- {
- case REQUEST_RUN_ADDRESS:
- DEBUG("FT1000:REQUEST_RUN_ADDRESS\n");
- put_request_value(ft1000dev, loader_code_address);
- break;
- case REQUEST_CODE_LENGTH:
- DEBUG("FT1000:REQUEST_CODE_LENGTH\n");
- put_request_value(ft1000dev, loader_code_size);
- break;
- case REQUEST_DONE_BL:
- DEBUG("FT1000:REQUEST_DONE_BL\n");
- /* Reposition ptrs to beginning of code section */
- s_file = (u16 *)(boot_end);
- c_file = (u8 *)(boot_end);
- //DEBUG("FT1000:download:s_file = 0x%8x\n", (int)s_file);
- //DEBUG("FT1000:download:c_file = 0x%8x\n", (int)c_file);
- state = STATE_CODE_DWNLD;
- pft1000info->fcodeldr = 1;
- break;
- case REQUEST_CODE_SEGMENT:
- //DEBUG("FT1000:REQUEST_CODE_SEGMENT\n");
- word_length = get_request_value(ft1000dev);
- //DEBUG("FT1000:word_length = 0x%x\n", (int)word_length);
- //NdisMSleep (100);
- if (word_length > MAX_LENGTH)
- {
- DEBUG("FT1000:download:Download error: Max length exceeded\n");
- status = STATUS_FAILURE;
- break;
- }
- if ( (word_length*2 + c_file) > boot_end)
- {
- /*
- * Error, beyond boot code range.
- */
- DEBUG("FT1000:download:Download error: Requested len=%d exceeds BOOT code boundry.\n",
- (int)word_length);
- status = STATUS_FAILURE;
- break;
- }
- /*
- * Position ASIC DPRAM auto-increment pointer.
- */
- dpram = (u16)DWNLD_MAG1_PS_HDR_LOC;
+ state = STATE_BOOT_DWNLD;
+
+ break;
+
+ case STATE_BOOT_DWNLD:
+ DEBUG("FT1000:STATE_BOOT_DWNLD\n");
+ pft1000info->bootmode = 1;
+ handshake = get_handshake(ft1000dev, HANDSHAKE_REQUEST);
+ if (handshake == HANDSHAKE_REQUEST) {
+ /*
+ * Get type associated with the request.
+ */
+ request = get_request_type(ft1000dev);
+ switch (request) {
+ case REQUEST_RUN_ADDRESS:
+ DEBUG("FT1000:REQUEST_RUN_ADDRESS\n");
+ put_request_value(ft1000dev,
+ loader_code_address);
+ break;
+ case REQUEST_CODE_LENGTH:
+ DEBUG("FT1000:REQUEST_CODE_LENGTH\n");
+ put_request_value(ft1000dev,
+ loader_code_size);
+ break;
+ case REQUEST_DONE_BL:
+ DEBUG("FT1000:REQUEST_DONE_BL\n");
+ /* Reposition ptrs to beginning of code section */
+ s_file = (u16 *) (boot_end);
+ c_file = (u8 *) (boot_end);
+ //DEBUG("FT1000:download:s_file = 0x%8x\n", (int)s_file);
+ //DEBUG("FT1000:download:c_file = 0x%8x\n", (int)c_file);
+ state = STATE_CODE_DWNLD;
+ pft1000info->fcodeldr = 1;
+ break;
+ case REQUEST_CODE_SEGMENT:
+ //DEBUG("FT1000:REQUEST_CODE_SEGMENT\n");
+ word_length =
+ get_request_value(ft1000dev);
+ //DEBUG("FT1000:word_length = 0x%x\n", (int)word_length);
+ //NdisMSleep (100);
+ if (word_length > MAX_LENGTH) {
+ DEBUG
+ ("FT1000:download:Download error: Max length exceeded\n");
+ status = STATUS_FAILURE;
+ break;
+ }
+ if ((word_length * 2 + c_file) >
+ boot_end) {
+ /*
+ * Error, beyond boot code range.
+ */
+ DEBUG
+ ("FT1000:download:Download error: Requested len=%d exceeds BOOT code boundry.\n",
+ (int)word_length);
+ status = STATUS_FAILURE;
+ break;
+ }
+ /*
+ * Position ASIC DPRAM auto-increment pointer.
+ */
+ dpram = (u16) DWNLD_MAG1_PS_HDR_LOC;
if (word_length & 0x1)
word_length++;
word_length = word_length / 2;
- status = write_blk(ft1000dev, &s_file, &c_file, word_length);
- //DEBUG("write_blk returned %d\n", status);
- break;
- default:
- DEBUG("FT1000:download:Download error: Bad request type=%d in BOOT download state.\n",request);
- status = STATUS_FAILURE;
- break;
- }
- if (pft1000info->usbboot)
- put_handshake_usb(ft1000dev, HANDSHAKE_RESPONSE);
- else
- put_handshake(ft1000dev, HANDSHAKE_RESPONSE);
- }
- else
- {
- DEBUG("FT1000:download:Download error: Handshake failed\n");
- status = STATUS_FAILURE;
- }
-
- break;
-
- case STATE_CODE_DWNLD:
- //DEBUG("FT1000:STATE_CODE_DWNLD\n");
- pft1000info->bootmode = 0;
- if (pft1000info->usbboot)
- handshake = get_handshake_usb(ft1000dev, HANDSHAKE_REQUEST);
- else
- handshake = get_handshake(ft1000dev, HANDSHAKE_REQUEST);
- if (handshake == HANDSHAKE_REQUEST)
- {
- /*
- * Get type associated with the request.
- */
- if (pft1000info->usbboot)
- request = get_request_type_usb(ft1000dev);
- else
- request = get_request_type(ft1000dev);
- switch (request)
- {
- case REQUEST_FILE_CHECKSUM:
- DEBUG("FT1000:download:image_chksum = 0x%8x\n", image_chksum);
- put_request_value(ft1000dev, image_chksum);
- break;
- case REQUEST_RUN_ADDRESS:
- DEBUG("FT1000:download: REQUEST_RUN_ADDRESS\n");
- if (correct_version)
- {
- DEBUG("FT1000:download:run_address = 0x%8x\n", (int)run_address);
- put_request_value(ft1000dev, run_address);
- }
- else
- {
- DEBUG("FT1000:download:Download error: Got Run address request before image offset request.\n");
- status = STATUS_FAILURE;
- break;
- }
- break;
- case REQUEST_CODE_LENGTH:
- DEBUG("FT1000:download:REQUEST_CODE_LENGTH\n");
- if (correct_version)
- {
- DEBUG("FT1000:download:run_size = 0x%8x\n", (int)run_size);
- put_request_value(ft1000dev, run_size);
- }
- else
- {
- DEBUG("FT1000:download:Download error: Got Size request before image offset request.\n");
- status = STATUS_FAILURE;
- break;
- }
- break;
- case REQUEST_DONE_CL:
- pft1000info->usbboot = 3;
- /* Reposition ptrs to beginning of provisioning section */
- s_file = (u16 *)(pFileStart + file_hdr->commands_offset);
- c_file = (u8 *)(pFileStart + file_hdr->commands_offset);
- state = STATE_DONE_DWNLD;
- break;
- case REQUEST_CODE_SEGMENT:
- //DEBUG("FT1000:download: REQUEST_CODE_SEGMENT - CODELOADER\n");
- if (!correct_version)
- {
- DEBUG("FT1000:download:Download error: Got Code Segment request before image offset request.\n");
- status = STATUS_FAILURE;
- break;
- }
-#if 0
- word_length = get_request_value_usb(ft1000dev);
- //DEBUG("FT1000:download:word_length = %d\n", (int)word_length);
- if (word_length > MAX_LENGTH/2)
-#else
- word_length = get_request_value(ft1000dev);
- //DEBUG("FT1000:download:word_length = %d\n", (int)word_length);
- if (word_length > MAX_LENGTH)
-#endif
- {
- DEBUG("FT1000:download:Download error: Max length exceeded\n");
- status = STATUS_FAILURE;
- break;
- }
- if ( (word_length*2 + c_file) > code_end)
- {
- /*
- * Error, beyond boot code range.
- */
- DEBUG("FT1000:download:Download error: Requested len=%d exceeds DSP code boundry.\n",
- (int)word_length);
- status = STATUS_FAILURE;
- break;
- }
- /*
- * Position ASIC DPRAM auto-increment pointer.
- */
- dpram = (u16)DWNLD_MAG1_PS_HDR_LOC;
- if (word_length & 0x1)
- word_length++;
- word_length = word_length / 2;
-
- write_blk_fifo (ft1000dev, &s_file, &c_file, word_length);
- if (pft1000info->usbboot == 0)
- pft1000info->usbboot++;
- if (pft1000info->usbboot == 1) {
- tempword = 0;
- ft1000_write_dpram16 (ft1000dev, DWNLD_MAG1_PS_HDR_LOC, tempword, 0);
- }
-
- break;
-
- case REQUEST_MAILBOX_DATA:
- DEBUG("FT1000:download: REQUEST_MAILBOX_DATA\n");
- // Convert length from byte count to word count. Make sure we round up.
- word_length = (long)(pft1000info->DSPInfoBlklen + 1)/2;
- put_request_value(ft1000dev, word_length);
- mailbox_data = (struct drv_msg *)&(pft1000info->DSPInfoBlk[0]);
- /*
- * Position ASIC DPRAM auto-increment pointer.
- */
-
-
- data = (u16 *)&mailbox_data->data[0];
- dpram = (u16)DWNLD_MAG1_PS_HDR_LOC;
- if (word_length & 0x1)
- word_length++;
-
- word_length = (word_length / 2);
-
-
- for (; word_length > 0; word_length--) /* In words */
- {
-
- templong = *data++;
- templong |= (*data++ << 16);
- status = fix_ft1000_write_dpram32 (ft1000dev, dpram++, (u8 *)&templong);
-
- }
- break;
-
- case REQUEST_VERSION_INFO:
- DEBUG("FT1000:download:REQUEST_VERSION_INFO\n");
- word_length = file_hdr->version_data_size;
- put_request_value(ft1000dev, word_length);
- /*
- * Position ASIC DPRAM auto-increment pointer.
- */
-
- s_file = (u16 *)(pFileStart + file_hdr->version_data_offset);
-
-
- dpram = (u16)DWNLD_MAG1_PS_HDR_LOC;
- if (word_length & 0x1)
- word_length++;
-
- word_length = (word_length / 2);
-
-
- for (; word_length > 0; word_length--) /* In words */
- {
-
- templong = ntohs(*s_file++);
- temp = ntohs(*s_file++);
- templong |= (temp << 16);
- status = fix_ft1000_write_dpram32 (ft1000dev, dpram++, (u8 *)&templong);
-
- }
- break;
-
- case REQUEST_CODE_BY_VERSION:
- DEBUG("FT1000:download:REQUEST_CODE_BY_VERSION\n");
- correct_version = FALSE;
- requested_version = get_request_value(ft1000dev);
-
- dsp_img_info = (struct dsp_image_info *)(pFileStart + sizeof(struct dsp_file_hdr ));
-
- for (image = 0; image < file_hdr->nDspImages; image++)
- {
-
- temp = (u16)(dsp_img_info->version);
- templong = temp;
- temp = (u16)(dsp_img_info->version >> 16);
- templong |= (temp << 16);
- if (templong == (u32)requested_version)
- {
- correct_version = TRUE;
- DEBUG("FT1000:download: correct_version is TRUE\n");
- s_file = (u16 *)(pFileStart + dsp_img_info->begin_offset);
- c_file = (u8 *)(pFileStart + dsp_img_info->begin_offset);
- code_end = (u8 *)(pFileStart + dsp_img_info->end_offset);
- run_address = dsp_img_info->run_address;
- run_size = dsp_img_info->image_size;
- image_chksum = (u32)dsp_img_info->checksum;
- break;
- }
- dsp_img_info++;
-
-
- } //end of for
-
- if (!correct_version)
- {
- /*
- * Error, beyond boot code range.
- */
- DEBUG("FT1000:download:Download error: Bad Version Request = 0x%x.\n",(int)requested_version);
- status = STATUS_FAILURE;
- break;
- }
- break;
-
- default:
- DEBUG("FT1000:download:Download error: Bad request type=%d in CODE download state.\n",request);
- status = STATUS_FAILURE;
- break;
- }
- if (pft1000info->usbboot)
- put_handshake_usb(ft1000dev, HANDSHAKE_RESPONSE);
- else
- put_handshake(ft1000dev, HANDSHAKE_RESPONSE);
- }
- else
- {
- DEBUG("FT1000:download:Download error: Handshake failed\n");
- status = STATUS_FAILURE;
- }
-
- break;
-
- case STATE_DONE_DWNLD:
- DEBUG("FT1000:download:Code loader is done...\n");
- state = STATE_SECTION_PROV;
- break;
-
- case STATE_SECTION_PROV:
- DEBUG("FT1000:download:STATE_SECTION_PROV\n");
- pseudo_header = (struct pseudo_hdr *)c_file;
-
- if (pseudo_header->checksum == hdr_checksum(pseudo_header))
- {
- if (pseudo_header->portdest != 0x80 /* Dsp OAM */)
- {
- state = STATE_DONE_PROV;
- break;
- }
- pseudo_header_len = ntohs(pseudo_header->length); /* Byte length for PROV records */
-
- // Get buffer for provisioning data
- pbuffer = kmalloc((pseudo_header_len + sizeof(struct pseudo_hdr)), GFP_ATOMIC);
- if (pbuffer) {
- memcpy(pbuffer, (void *)c_file, (u32)(pseudo_header_len + sizeof(struct pseudo_hdr)));
- // link provisioning data
- pprov_record = kmalloc(sizeof(struct prov_record), GFP_ATOMIC);
- if (pprov_record) {
- pprov_record->pprov_data = pbuffer;
- list_add_tail (&pprov_record->list, &pft1000info->prov_list);
- // Move to next entry if available
- c_file = (u8 *)((unsigned long)c_file + (u32)((pseudo_header_len + 1) & 0xFFFFFFFE) + sizeof(struct pseudo_hdr));
- if ( (unsigned long)(c_file) - (unsigned long)(pFileStart) >= (unsigned long)FileLength) {
- state = STATE_DONE_FILE;
- }
- }
- else {
- kfree(pbuffer);
- status = STATUS_FAILURE;
- }
- }
- else {
- status = STATUS_FAILURE;
- }
- }
- else
- {
- /* Checksum did not compute */
- status = STATUS_FAILURE;
- }
- DEBUG("ft1000:download: after STATE_SECTION_PROV, state = %d, status= %d\n", state, status);
- break;
-
- case STATE_DONE_PROV:
- DEBUG("FT1000:download:STATE_DONE_PROV\n");
- state = STATE_DONE_FILE;
- break;
-
-
- default:
- status = STATUS_FAILURE;
- break;
- } /* End Switch */
-
- if (status != STATUS_SUCCESS) {
- break;
- }
+ status =
+ write_blk(ft1000dev, &s_file,
+ &c_file, word_length);
+ //DEBUG("write_blk returned %d\n", status);
+ break;
+ default:
+ DEBUG
+ ("FT1000:download:Download error: Bad request type=%d in BOOT download state.\n",
+ request);
+ status = STATUS_FAILURE;
+ break;
+ }
+ if (pft1000info->usbboot)
+ put_handshake_usb(ft1000dev,
+ HANDSHAKE_RESPONSE);
+ else
+ put_handshake(ft1000dev,
+ HANDSHAKE_RESPONSE);
+ } else {
+ DEBUG
+ ("FT1000:download:Download error: Handshake failed\n");
+ status = STATUS_FAILURE;
+ }
+
+ break;
+
+ case STATE_CODE_DWNLD:
+ //DEBUG("FT1000:STATE_CODE_DWNLD\n");
+ pft1000info->bootmode = 0;
+ if (pft1000info->usbboot)
+ handshake =
+ get_handshake_usb(ft1000dev,
+ HANDSHAKE_REQUEST);
+ else
+ handshake =
+ get_handshake(ft1000dev, HANDSHAKE_REQUEST);
+ if (handshake == HANDSHAKE_REQUEST) {
+ /*
+ * Get type associated with the request.
+ */
+ if (pft1000info->usbboot)
+ request =
+ get_request_type_usb(ft1000dev);
+ else
+ request = get_request_type(ft1000dev);
+ switch (request) {
+ case REQUEST_FILE_CHECKSUM:
+ DEBUG
+ ("FT1000:download:image_chksum = 0x%8x\n",
+ image_chksum);
+ put_request_value(ft1000dev,
+ image_chksum);
+ break;
+ case REQUEST_RUN_ADDRESS:
+ DEBUG
+ ("FT1000:download: REQUEST_RUN_ADDRESS\n");
+ if (correct_version) {
+ DEBUG
+ ("FT1000:download:run_address = 0x%8x\n",
+ (int)run_address);
+ put_request_value(ft1000dev,
+ run_address);
+ } else {
+ DEBUG
+ ("FT1000:download:Download error: Got Run address request before image offset request.\n");
+ status = STATUS_FAILURE;
+ break;
+ }
+ break;
+ case REQUEST_CODE_LENGTH:
+ DEBUG
+ ("FT1000:download:REQUEST_CODE_LENGTH\n");
+ if (correct_version) {
+ DEBUG
+ ("FT1000:download:run_size = 0x%8x\n",
+ (int)run_size);
+ put_request_value(ft1000dev,
+ run_size);
+ } else {
+ DEBUG
+ ("FT1000:download:Download error: Got Size request before image offset request.\n");
+ status = STATUS_FAILURE;
+ break;
+ }
+ break;
+ case REQUEST_DONE_CL:
+ pft1000info->usbboot = 3;
+ /* Reposition ptrs to beginning of provisioning section */
+ s_file =
+ (u16 *) (pFileStart +
+ file_hdr->commands_offset);
+ c_file =
+ (u8 *) (pFileStart +
+ file_hdr->commands_offset);
+ state = STATE_DONE_DWNLD;
+ break;
+ case REQUEST_CODE_SEGMENT:
+ //DEBUG("FT1000:download: REQUEST_CODE_SEGMENT - CODELOADER\n");
+ if (!correct_version) {
+ DEBUG
+ ("FT1000:download:Download error: Got Code Segment request before image offset request.\n");
+ status = STATUS_FAILURE;
+ break;
+ }
+
+ word_length =
+ get_request_value(ft1000dev);
+ //DEBUG("FT1000:download:word_length = %d\n", (int)word_length);
+ if (word_length > MAX_LENGTH) {
+ DEBUG
+ ("FT1000:download:Download error: Max length exceeded\n");
+ status = STATUS_FAILURE;
+ break;
+ }
+ if ((word_length * 2 + c_file) >
+ code_end) {
+ /*
+ * Error, beyond boot code range.
+ */
+ DEBUG
+ ("FT1000:download:Download error: Requested len=%d exceeds DSP code boundry.\n",
+ (int)word_length);
+ status = STATUS_FAILURE;
+ break;
+ }
+ /*
+ * Position ASIC DPRAM auto-increment pointer.
+ */
+ dpram = (u16) DWNLD_MAG1_PS_HDR_LOC;
+ if (word_length & 0x1)
+ word_length++;
+ word_length = word_length / 2;
+
+ write_blk_fifo(ft1000dev, &s_file,
+ &c_file, word_length);
+ if (pft1000info->usbboot == 0)
+ pft1000info->usbboot++;
+ if (pft1000info->usbboot == 1) {
+ tempword = 0;
+ ft1000_write_dpram16(ft1000dev,
+ DWNLD_MAG1_PS_HDR_LOC,
+ tempword,
+ 0);
+ }
+
+ break;
+
+ case REQUEST_MAILBOX_DATA:
+ DEBUG
+ ("FT1000:download: REQUEST_MAILBOX_DATA\n");
+ // Convert length from byte count to word count. Make sure we round up.
+ word_length =
+ (long)(pft1000info->DSPInfoBlklen +
+ 1) / 2;
+ put_request_value(ft1000dev,
+ word_length);
+ mailbox_data =
+ (struct drv_msg *)&(pft1000info->
+ DSPInfoBlk[0]);
+ /*
+ * Position ASIC DPRAM auto-increment pointer.
+ */
+
+ data = (u16 *) & mailbox_data->data[0];
+ dpram = (u16) DWNLD_MAG1_PS_HDR_LOC;
+ if (word_length & 0x1)
+ word_length++;
+
+ word_length = (word_length / 2);
+
+ for (; word_length > 0; word_length--) { /* In words */
+
+ templong = *data++;
+ templong |= (*data++ << 16);
+ status =
+ fix_ft1000_write_dpram32
+ (ft1000dev, dpram++,
+ (u8 *) & templong);
+
+ }
+ break;
+
+ case REQUEST_VERSION_INFO:
+ DEBUG
+ ("FT1000:download:REQUEST_VERSION_INFO\n");
+ word_length =
+ file_hdr->version_data_size;
+ put_request_value(ft1000dev,
+ word_length);
+ /*
+ * Position ASIC DPRAM auto-increment pointer.
+ */
+
+ s_file =
+ (u16 *) (pFileStart +
+ file_hdr->
+ version_data_offset);
+
+ dpram = (u16) DWNLD_MAG1_PS_HDR_LOC;
+ if (word_length & 0x1)
+ word_length++;
+
+ word_length = (word_length / 2);
+
+ for (; word_length > 0; word_length--) { /* In words */
+
+ templong = ntohs(*s_file++);
+ temp = ntohs(*s_file++);
+ templong |= (temp << 16);
+ status =
+ fix_ft1000_write_dpram32
+ (ft1000dev, dpram++,
+ (u8 *) & templong);
+
+ }
+ break;
+
+ case REQUEST_CODE_BY_VERSION:
+ DEBUG
+ ("FT1000:download:REQUEST_CODE_BY_VERSION\n");
+ correct_version = FALSE;
+ requested_version =
+ get_request_value(ft1000dev);
+
+ dsp_img_info =
+ (struct dsp_image_info *)(pFileStart
+ +
+ sizeof
+ (struct
+ dsp_file_hdr));
+
+ for (image = 0;
+ image < file_hdr->nDspImages;
+ image++) {
+
+ if (dsp_img_info->version ==
+ requested_version) {
+ correct_version = TRUE;
+ DEBUG
+ ("FT1000:download: correct_version is TRUE\n");
+ s_file =
+ (u16 *) (pFileStart
+ +
+ dsp_img_info->
+ begin_offset);
+ c_file =
+ (u8 *) (pFileStart +
+ dsp_img_info->
+ begin_offset);
+ code_end =
+ (u8 *) (pFileStart +
+ dsp_img_info->
+ end_offset);
+ run_address =
+ dsp_img_info->
+ run_address;
+ run_size =
+ dsp_img_info->
+ image_size;
+ image_chksum =
+ (u32) dsp_img_info->
+ checksum;
+ break;
+ }
+ dsp_img_info++;
+
+ } //end of for
+
+ if (!correct_version) {
+ /*
+ * Error, beyond boot code range.
+ */
+ DEBUG
+ ("FT1000:download:Download error: Bad Version Request = 0x%x.\n",
+ (int)requested_version);
+ status = STATUS_FAILURE;
+ break;
+ }
+ break;
+
+ default:
+ DEBUG
+ ("FT1000:download:Download error: Bad request type=%d in CODE download state.\n",
+ request);
+ status = STATUS_FAILURE;
+ break;
+ }
+ if (pft1000info->usbboot)
+ put_handshake_usb(ft1000dev,
+ HANDSHAKE_RESPONSE);
+ else
+ put_handshake(ft1000dev,
+ HANDSHAKE_RESPONSE);
+ } else {
+ DEBUG
+ ("FT1000:download:Download error: Handshake failed\n");
+ status = STATUS_FAILURE;
+ }
+
+ break;
+
+ case STATE_DONE_DWNLD:
+ DEBUG("FT1000:download:Code loader is done...\n");
+ state = STATE_SECTION_PROV;
+ break;
+
+ case STATE_SECTION_PROV:
+ DEBUG("FT1000:download:STATE_SECTION_PROV\n");
+ pseudo_header = (struct pseudo_hdr *)c_file;
+
+ if (pseudo_header->checksum ==
+ hdr_checksum(pseudo_header)) {
+ if (pseudo_header->portdest !=
+ 0x80 /* Dsp OAM */ ) {
+ state = STATE_DONE_PROV;
+ break;
+ }
+ pseudo_header_len = ntohs(pseudo_header->length); /* Byte length for PROV records */
+
+ // Get buffer for provisioning data
+ pbuffer =
+ kmalloc((pseudo_header_len +
+ sizeof(struct pseudo_hdr)),
+ GFP_ATOMIC);
+ if (pbuffer) {
+ memcpy(pbuffer, (void *)c_file,
+ (u32) (pseudo_header_len +
+ sizeof(struct
+ pseudo_hdr)));
+ // link provisioning data
+ pprov_record =
+ kmalloc(sizeof(struct prov_record),
+ GFP_ATOMIC);
+ if (pprov_record) {
+ pprov_record->pprov_data =
+ pbuffer;
+ list_add_tail(&pprov_record->
+ list,
+ &pft1000info->
+ prov_list);
+ // Move to next entry if available
+ c_file =
+ (u8 *) ((unsigned long)
+ c_file +
+ (u32) ((pseudo_header_len + 1) & 0xFFFFFFFE) + sizeof(struct pseudo_hdr));
+ if ((unsigned long)(c_file) -
+ (unsigned long)(pFileStart)
+ >=
+ (unsigned long)FileLength) {
+ state = STATE_DONE_FILE;
+ }
+ } else {
+ kfree(pbuffer);
+ status = STATUS_FAILURE;
+ }
+ } else {
+ status = STATUS_FAILURE;
+ }
+ } else {
+ /* Checksum did not compute */
+ status = STATUS_FAILURE;
+ }
+ DEBUG
+ ("ft1000:download: after STATE_SECTION_PROV, state = %d, status= %d\n",
+ state, status);
+ break;
+
+ case STATE_DONE_PROV:
+ DEBUG("FT1000:download:STATE_DONE_PROV\n");
+ state = STATE_DONE_FILE;
+ break;
+
+ default:
+ status = STATUS_FAILURE;
+ break;
+ } /* End Switch */
+
+ if (status != STATUS_SUCCESS) {
+ break;
+ }
/****
// Check if Card is present
@@ -1238,11 +1224,12 @@ u16 scram_dnldr(struct ft1000_device *ft1000dev, void *pFileStart, u32 FileLeng
}
****/
- } /* End while */
+ } /* End while */
- DEBUG("Download exiting with status = 0x%8x\n", status);
- ft1000_write_register(ft1000dev, FT1000_DB_DNLD_TX, FT1000_REG_DOORBELL);
+ DEBUG("Download exiting with status = 0x%8x\n", status);
+ ft1000_write_register(ft1000dev, FT1000_DB_DNLD_TX,
+ FT1000_REG_DOORBELL);
- return status;
+ return status;
}
diff --git a/drivers/staging/ft1000/ft1000-usb/ft1000_hw.c b/drivers/staging/ft1000/ft1000-usb/ft1000_hw.c
index 643a637..78dcd49 100644
--- a/drivers/staging/ft1000/ft1000-usb/ft1000_hw.c
+++ b/drivers/staging/ft1000/ft1000-usb/ft1000_hw.c
@@ -65,45 +65,26 @@ static u8 tempbuffer[1600];
// Notes:
//
//---------------------------------------------------------------------------
-static int ft1000_control(struct ft1000_device *ft1000dev,unsigned int pipe,
- u8 request,
- u8 requesttype,
- u16 value,
- u16 index,
- void *data,
- u16 size,
- int timeout)
+static int ft1000_control(struct ft1000_device *ft1000dev, unsigned int pipe,
+ u8 request, u8 requesttype, u16 value, u16 index,
+ void *data, u16 size, int timeout)
{
u16 ret;
- if (ft1000dev == NULL )
- {
- DEBUG("NULL ft1000dev, failure\n");
- return -ENODEV;
- }
- else if ( ft1000dev->dev == NULL )
- {
- DEBUG("NULL ft1000dev->dev, failure\n");
- return -ENODEV;
- }
+ if ((ft1000dev == NULL) || (ft1000dev->dev == NULL)) {
+ DEBUG("ft1000dev or ft1000dev->dev == NULL, failure\n");
+ return -ENODEV;
+ }
- ret = usb_control_msg(ft1000dev->dev,
- pipe,
- request,
- requesttype,
- value,
- index,
- data,
- size,
- LARGE_TIMEOUT);
+ ret = usb_control_msg(ft1000dev->dev, pipe, request, requesttype,
+ value, index, data, size, LARGE_TIMEOUT);
if (ret > 0)
ret = 0;
- return ret;
-
-
+ return ret;
}
+
//---------------------------------------------------------------------------
// Function: ft1000_read_register
//
@@ -120,28 +101,22 @@ static int ft1000_control(struct ft1000_device *ft1000dev,unsigned int pipe,
//
//---------------------------------------------------------------------------
-u16 ft1000_read_register(struct ft1000_device *ft1000dev, u16* Data, u16 nRegIndx)
+int ft1000_read_register(struct ft1000_device *ft1000dev, u16* Data,
+ u16 nRegIndx)
{
- u16 ret = STATUS_SUCCESS;
-
- //DEBUG("ft1000_read_register: reg index is %d\n", nRegIndx);
- //DEBUG("ft1000_read_register: spin_lock locked\n");
- ret = ft1000_control(ft1000dev,
- usb_rcvctrlpipe(ft1000dev->dev,0),
- HARLEY_READ_REGISTER, //request --READ_REGISTER
- HARLEY_READ_OPERATION, //requestType
- 0, //value
- nRegIndx, //index
- Data, //data
- 2, //data size
- LARGE_TIMEOUT ); //timeout
-
- //DEBUG("ft1000_read_register: ret is %d \n", ret);
-
- //DEBUG("ft1000_read_register: data is %x \n", *Data);
-
- return ret;
+ int ret = STATUS_SUCCESS;
+
+ ret = ft1000_control(ft1000dev,
+ usb_rcvctrlpipe(ft1000dev->dev, 0),
+ HARLEY_READ_REGISTER,
+ HARLEY_READ_OPERATION,
+ 0,
+ nRegIndx,
+ Data,
+ 2,
+ LARGE_TIMEOUT);
+ return ret;
}
//---------------------------------------------------------------------------
@@ -159,23 +134,22 @@ u16 ft1000_read_register(struct ft1000_device *ft1000dev, u16* Data, u16 nRegInd
// Notes:
//
//---------------------------------------------------------------------------
-u16 ft1000_write_register(struct ft1000_device *ft1000dev, u16 value, u16 nRegIndx)
+int ft1000_write_register(struct ft1000_device *ft1000dev, u16 value,
+ u16 nRegIndx)
{
- u16 ret = STATUS_SUCCESS;
-
- //DEBUG("ft1000_write_register: value is: %d, reg index is: %d\n", value, nRegIndx);
+ int ret = STATUS_SUCCESS;
+
+ ret = ft1000_control(ft1000dev,
+ usb_sndctrlpipe(ft1000dev->dev, 0),
+ HARLEY_WRITE_REGISTER,
+ HARLEY_WRITE_OPERATION,
+ value,
+ nRegIndx,
+ NULL,
+ 0,
+ LARGE_TIMEOUT);
- ret = ft1000_control(ft1000dev,
- usb_sndctrlpipe(ft1000dev->dev, 0),
- HARLEY_WRITE_REGISTER, //request -- WRITE_REGISTER
- HARLEY_WRITE_OPERATION, //requestType
- value,
- nRegIndx,
- NULL,
- 0,
- LARGE_TIMEOUT );
-
- return ret;
+ return ret;
}
//---------------------------------------------------------------------------
@@ -195,27 +169,22 @@ u16 ft1000_write_register(struct ft1000_device *ft1000dev, u16 value, u16 nRegIn
//
//---------------------------------------------------------------------------
-u16 ft1000_read_dpram32(struct ft1000_device *ft1000dev, u16 indx, u8 *buffer, u16 cnt)
+int ft1000_read_dpram32(struct ft1000_device *ft1000dev, u16 indx, u8 *buffer,
+ u16 cnt)
{
- u16 ret = STATUS_SUCCESS;
-
- //DEBUG("ft1000_read_dpram32: indx: %d cnt: %d\n", indx, cnt);
- ret =ft1000_control(ft1000dev,
- usb_rcvctrlpipe(ft1000dev->dev,0),
- HARLEY_READ_DPRAM_32, //request --READ_DPRAM_32
- HARLEY_READ_OPERATION, //requestType
- 0, //value
- indx, //index
- buffer, //data
- cnt, //data size
- LARGE_TIMEOUT ); //timeout
-
- //DEBUG("ft1000_read_dpram32: ret is %d \n", ret);
-
- //DEBUG("ft1000_read_dpram32: ret=%d \n", ret);
-
- return ret;
+ int ret = STATUS_SUCCESS;
+
+ ret = ft1000_control(ft1000dev,
+ usb_rcvctrlpipe(ft1000dev->dev, 0),
+ HARLEY_READ_DPRAM_32,
+ HARLEY_READ_OPERATION,
+ 0,
+ indx,
+ buffer,
+ cnt,
+ LARGE_TIMEOUT);
+ return ret;
}
//---------------------------------------------------------------------------
@@ -234,25 +203,25 @@ u16 ft1000_read_dpram32(struct ft1000_device *ft1000dev, u16 indx, u8 *buffer, u
// Notes:
//
//---------------------------------------------------------------------------
-u16 ft1000_write_dpram32(struct ft1000_device *ft1000dev, u16 indx, u8 *buffer, u16 cnt)
+int ft1000_write_dpram32(struct ft1000_device *ft1000dev, u16 indx, u8 *buffer,
+ u16 cnt)
{
- u16 ret = STATUS_SUCCESS;
-
- //DEBUG("ft1000_write_dpram32: indx: %d buffer: %x cnt: %d\n", indx, buffer, cnt);
- if ( cnt % 4)
- cnt += cnt - (cnt % 4);
-
- ret = ft1000_control(ft1000dev,
- usb_sndctrlpipe(ft1000dev->dev, 0),
- HARLEY_WRITE_DPRAM_32, //request -- WRITE_DPRAM_32
- HARLEY_WRITE_OPERATION, //requestType
- 0, //value
- indx, //index
- buffer, //buffer
- cnt, //buffer size
- LARGE_TIMEOUT );
-
- return ret;
+ int ret = STATUS_SUCCESS;
+
+ if (cnt % 4)
+ cnt += cnt - (cnt % 4);
+
+ ret = ft1000_control(ft1000dev,
+ usb_sndctrlpipe(ft1000dev->dev, 0),
+ HARLEY_WRITE_DPRAM_32,
+ HARLEY_WRITE_OPERATION,
+ 0,
+ indx,
+ buffer,
+ cnt,
+ LARGE_TIMEOUT);
+
+ return ret;
}
//---------------------------------------------------------------------------
@@ -271,36 +240,28 @@ u16 ft1000_write_dpram32(struct ft1000_device *ft1000dev, u16 indx, u8 *buffer,
// Notes:
//
//---------------------------------------------------------------------------
-u16 ft1000_read_dpram16(struct ft1000_device *ft1000dev, u16 indx, u8 *buffer, u8 highlow)
+int ft1000_read_dpram16(struct ft1000_device *ft1000dev, u16 indx, u8 *buffer,
+ u8 highlow)
{
- u16 ret = STATUS_SUCCESS;
-
- //DEBUG("ft1000_read_dpram16: indx: %d hightlow: %d\n", indx, highlow);
-
- u8 request;
-
- if (highlow == 0 )
- request = HARLEY_READ_DPRAM_LOW;
- else
- request = HARLEY_READ_DPRAM_HIGH;
-
- ret = ft1000_control(ft1000dev,
- usb_rcvctrlpipe(ft1000dev->dev,0),
- request, //request --READ_DPRAM_H/L
- HARLEY_READ_OPERATION, //requestType
- 0, //value
- indx, //index
- buffer, //data
- 2, //data size
- LARGE_TIMEOUT ); //timeout
-
- //DEBUG("ft1000_read_dpram16: ret is %d \n", ret);
-
-
- //DEBUG("ft1000_read_dpram16: data is %x \n", *buffer);
-
- return ret;
+ int ret = STATUS_SUCCESS;
+ u8 request;
+
+ if (highlow == 0)
+ request = HARLEY_READ_DPRAM_LOW;
+ else
+ request = HARLEY_READ_DPRAM_HIGH;
+
+ ret = ft1000_control(ft1000dev,
+ usb_rcvctrlpipe(ft1000dev->dev, 0),
+ request,
+ HARLEY_READ_OPERATION,
+ 0,
+ indx,
+ buffer,
+ 2,
+ LARGE_TIMEOUT);
+ return ret;
}
//---------------------------------------------------------------------------
@@ -319,33 +280,27 @@ u16 ft1000_read_dpram16(struct ft1000_device *ft1000dev, u16 indx, u8 *buffer, u
// Notes:
//
//---------------------------------------------------------------------------
-u16 ft1000_write_dpram16(struct ft1000_device *ft1000dev, u16 indx, u16 value, u8 highlow)
+int ft1000_write_dpram16(struct ft1000_device *ft1000dev, u16 indx, u16 value, u8 highlow)
{
- u16 ret = STATUS_SUCCESS;
-
-
+ int ret = STATUS_SUCCESS;
+ u8 request;
+
+ if (highlow == 0)
+ request = HARLEY_WRITE_DPRAM_LOW;
+ else
+ request = HARLEY_WRITE_DPRAM_HIGH;
+
+ ret = ft1000_control(ft1000dev,
+ usb_sndctrlpipe(ft1000dev->dev, 0),
+ request,
+ HARLEY_WRITE_OPERATION,
+ value,
+ indx,
+ NULL,
+ 0,
+ LARGE_TIMEOUT);
- //DEBUG("ft1000_write_dpram16: indx: %d value: %d highlow: %d\n", indx, value, highlow);
-
- u8 request;
-
-
- if ( highlow == 0 )
- request = HARLEY_WRITE_DPRAM_LOW;
- else
- request = HARLEY_WRITE_DPRAM_HIGH;
-
- ret = ft1000_control(ft1000dev,
- usb_sndctrlpipe(ft1000dev->dev, 0),
- request, //request -- WRITE_DPRAM_H/L
- HARLEY_WRITE_OPERATION, //requestType
- value, //value
- indx, //index
- NULL, //buffer
- 0, //buffer size
- LARGE_TIMEOUT );
-
- return ret;
+ return ret;
}
//---------------------------------------------------------------------------
@@ -364,36 +319,31 @@ u16 ft1000_write_dpram16(struct ft1000_device *ft1000dev, u16 indx, u16 value, u
// Notes:
//
//---------------------------------------------------------------------------
-u16 fix_ft1000_read_dpram32(struct ft1000_device *ft1000dev, u16 indx, u8 *buffer)
+int fix_ft1000_read_dpram32(struct ft1000_device *ft1000dev, u16 indx,
+ u8 *buffer)
{
- u8 buf[16];
- u16 pos;
- u16 ret = STATUS_SUCCESS;
-
- //DEBUG("fix_ft1000_read_dpram32: indx: %d \n", indx);
- pos = (indx / 4)*4;
- ret = ft1000_read_dpram32(ft1000dev, pos, buf, 16);
- if (ret == STATUS_SUCCESS)
- {
- pos = (indx % 4)*4;
- *buffer++ = buf[pos++];
- *buffer++ = buf[pos++];
- *buffer++ = buf[pos++];
- *buffer++ = buf[pos++];
- }
- else
- {
- DEBUG("fix_ft1000_read_dpram32: DPRAM32 Read failed\n");
- *buffer++ = 0;
- *buffer++ = 0;
- *buffer++ = 0;
- *buffer++ = 0;
-
- }
-
- //DEBUG("fix_ft1000_read_dpram32: data is %x \n", *buffer);
- return ret;
+ u8 buf[16];
+ u16 pos;
+ int ret = STATUS_SUCCESS;
+
+ pos = (indx / 4) * 4;
+ ret = ft1000_read_dpram32(ft1000dev, pos, buf, 16);
+
+ if (ret == STATUS_SUCCESS) {
+ pos = (indx % 4) * 4;
+ *buffer++ = buf[pos++];
+ *buffer++ = buf[pos++];
+ *buffer++ = buf[pos++];
+ *buffer++ = buf[pos++];
+ } else {
+ DEBUG("fix_ft1000_read_dpram32: DPRAM32 Read failed\n");
+ *buffer++ = 0;
+ *buffer++ = 0;
+ *buffer++ = 0;
+ *buffer++ = 0;
+ }
+ return ret;
}
@@ -413,70 +363,60 @@ u16 fix_ft1000_read_dpram32(struct ft1000_device *ft1000dev, u16 indx, u8 *buffe
// Notes:
//
//---------------------------------------------------------------------------
-u16 fix_ft1000_write_dpram32(struct ft1000_device *ft1000dev, u16 indx, u8 *buffer)
+int fix_ft1000_write_dpram32(struct ft1000_device *ft1000dev, u16 indx, u8 *buffer)
{
- u16 pos1;
- u16 pos2;
- u16 i;
- u8 buf[32];
- u8 resultbuffer[32];
- u8 *pdata;
- u16 ret = STATUS_SUCCESS;
-
- //DEBUG("fix_ft1000_write_dpram32: Entered:\n");
-
- pos1 = (indx / 4)*4;
- pdata = buffer;
- ret = ft1000_read_dpram32(ft1000dev, pos1, buf, 16);
- if (ret == STATUS_SUCCESS)
- {
- pos2 = (indx % 4)*4;
- buf[pos2++] = *buffer++;
- buf[pos2++] = *buffer++;
- buf[pos2++] = *buffer++;
- buf[pos2++] = *buffer++;
- ret = ft1000_write_dpram32(ft1000dev, pos1, buf, 16);
- }
- else
- {
- DEBUG("fix_ft1000_write_dpram32: DPRAM32 Read failed\n");
-
- return ret;
- }
-
- ret = ft1000_read_dpram32(ft1000dev, pos1, (u8 *)&resultbuffer[0], 16);
- if (ret == STATUS_SUCCESS)
- {
- buffer = pdata;
- for (i=0; i<16; i++)
- {
- if (buf[i] != resultbuffer[i]){
+ u16 pos1;
+ u16 pos2;
+ u16 i;
+ u8 buf[32];
+ u8 resultbuffer[32];
+ u8 *pdata;
+ int ret = STATUS_SUCCESS;
+
+ pos1 = (indx / 4) * 4;
+ pdata = buffer;
+ ret = ft1000_read_dpram32(ft1000dev, pos1, buf, 16);
+
+ if (ret == STATUS_SUCCESS) {
+ pos2 = (indx % 4)*4;
+ buf[pos2++] = *buffer++;
+ buf[pos2++] = *buffer++;
+ buf[pos2++] = *buffer++;
+ buf[pos2++] = *buffer++;
+ ret = ft1000_write_dpram32(ft1000dev, pos1, buf, 16);
+ } else {
+ DEBUG("fix_ft1000_write_dpram32: DPRAM32 Read failed\n");
+ return ret;
+ }
- ret = STATUS_FAILURE;
- }
- }
- }
+ ret = ft1000_read_dpram32(ft1000dev, pos1, (u8 *)&resultbuffer[0], 16);
- if (ret == STATUS_FAILURE)
- {
- ret = ft1000_write_dpram32(ft1000dev, pos1, (u8 *)&tempbuffer[0], 16);
- ret = ft1000_read_dpram32(ft1000dev, pos1, (u8 *)&resultbuffer[0], 16);
- if (ret == STATUS_SUCCESS)
- {
- buffer = pdata;
- for (i=0; i<16; i++)
- {
- if (tempbuffer[i] != resultbuffer[i])
- {
- ret = STATUS_FAILURE;
- DEBUG("fix_ft1000_write_dpram32 Failed to write\n");
- }
- }
- }
- }
+ if (ret == STATUS_SUCCESS) {
+ buffer = pdata;
+ for (i = 0; i < 16; i++) {
+ if (buf[i] != resultbuffer[i])
+ ret = STATUS_FAILURE;
+ }
+ }
- return ret;
+ if (ret == STATUS_FAILURE) {
+ ret = ft1000_write_dpram32(ft1000dev, pos1,
+ (u8 *)&tempbuffer[0], 16);
+ ret = ft1000_read_dpram32(ft1000dev, pos1,
+ (u8 *)&resultbuffer[0], 16);
+ if (ret == STATUS_SUCCESS) {
+ buffer = pdata;
+ for (i = 0; i < 16; i++) {
+ if (tempbuffer[i] != resultbuffer[i]) {
+ ret = STATUS_FAILURE;
+ DEBUG("%s Failed to write\n",
+ __func__);
+ }
+ }
+ }
+ }
+ return ret;
}
@@ -490,37 +430,44 @@ u16 fix_ft1000_write_dpram32(struct ft1000_device *ft1000dev, u16 indx, u8 *buff
//
// Returns: None
//-----------------------------------------------------------------------
-static void card_reset_dsp (struct ft1000_device *ft1000dev, bool value)
+static void card_reset_dsp(struct ft1000_device *ft1000dev, bool value)
{
- u16 status = STATUS_SUCCESS;
- u16 tempword;
-
- status = ft1000_write_register (ft1000dev, HOST_INTF_BE, FT1000_REG_SUP_CTRL);
- status = ft1000_read_register(ft1000dev, &tempword, FT1000_REG_SUP_CTRL);
- if (value)
- {
- DEBUG("Reset DSP\n");
- status = ft1000_read_register(ft1000dev, &tempword, FT1000_REG_RESET);
- tempword |= DSP_RESET_BIT;
- status = ft1000_write_register(ft1000dev, tempword, FT1000_REG_RESET);
- }
- else
- {
- DEBUG("Activate DSP\n");
- status = ft1000_read_register(ft1000dev, &tempword, FT1000_REG_RESET);
- tempword |= DSP_ENCRYPTED;
- tempword &= ~DSP_UNENCRYPTED;
- status = ft1000_write_register(ft1000dev, tempword, FT1000_REG_RESET);
- status = ft1000_read_register(ft1000dev, &tempword, FT1000_REG_RESET);
- tempword &= ~EFUSE_MEM_DISABLE;
- tempword &= ~DSP_RESET_BIT;
- status = ft1000_write_register(ft1000dev, tempword, FT1000_REG_RESET);
- status = ft1000_read_register(ft1000dev, &tempword, FT1000_REG_RESET);
- }
+ u16 status = STATUS_SUCCESS;
+ u16 tempword;
+
+ status = ft1000_write_register(ft1000dev, HOST_INTF_BE,
+ FT1000_REG_SUP_CTRL);
+ status = ft1000_read_register(ft1000dev, &tempword,
+ FT1000_REG_SUP_CTRL);
+
+ if (value) {
+ DEBUG("Reset DSP\n");
+ status = ft1000_read_register(ft1000dev, &tempword,
+ FT1000_REG_RESET);
+ tempword |= DSP_RESET_BIT;
+ status = ft1000_write_register(ft1000dev, tempword,
+ FT1000_REG_RESET);
+ } else {
+ DEBUG("Activate DSP\n");
+ status = ft1000_read_register(ft1000dev, &tempword,
+ FT1000_REG_RESET);
+ tempword |= DSP_ENCRYPTED;
+ tempword &= ~DSP_UNENCRYPTED;
+ status = ft1000_write_register(ft1000dev, tempword,
+ FT1000_REG_RESET);
+ status = ft1000_read_register(ft1000dev, &tempword,
+ FT1000_REG_RESET);
+ tempword &= ~EFUSE_MEM_DISABLE;
+ tempword &= ~DSP_RESET_BIT;
+ status = ft1000_write_register(ft1000dev, tempword,
+ FT1000_REG_RESET);
+ status = ft1000_read_register(ft1000dev, &tempword,
+ FT1000_REG_RESET);
+ }
}
//---------------------------------------------------------------------------
-// Function: CardSendCommand
+// Function: card_send_command
//
// Parameters: ft1000_device - device structure
// ptempbuffer - command buffer
@@ -534,51 +481,47 @@ static void card_reset_dsp (struct ft1000_device *ft1000dev, bool value)
// Notes:
//
//---------------------------------------------------------------------------
-void CardSendCommand(struct ft1000_device *ft1000dev, void *ptempbuffer, int size)
+void card_send_command(struct ft1000_device *ft1000dev, void *ptempbuffer,
+ int size)
{
- unsigned short temp;
- unsigned char *commandbuf;
+ unsigned short temp;
+ unsigned char *commandbuf;
- DEBUG("CardSendCommand: enter CardSendCommand... size=%d\n", size);
+ DEBUG("card_send_command: enter card_send_command... size=%d\n", size);
- commandbuf =(unsigned char*) kmalloc(size+2, GFP_KERNEL);
- memcpy((void*)commandbuf+2, (void*)ptempbuffer, size);
+ commandbuf = (unsigned char *)kmalloc(size + 2, GFP_KERNEL);
+ memcpy((void *)commandbuf + 2, (void *)ptempbuffer, size);
- //DEBUG("CardSendCommand: Command Send\n");
+ //DEBUG("card_send_command: Command Send\n");
- ft1000_read_register(ft1000dev, &temp, FT1000_REG_DOORBELL);
+ ft1000_read_register(ft1000dev, &temp, FT1000_REG_DOORBELL);
- if (temp & 0x0100)
- {
- msleep(10);
- }
+ if (temp & 0x0100)
+ msleep(10);
- // check for odd word
- size = size + 2;
- if (size % 4)
- {
- // Must force to be 32 bit aligned
- size += 4 - (size % 4);
- }
+ /* check for odd word */
+ size = size + 2;
+ /* Must force to be 32 bit aligned */
+ if (size % 4)
+ size += 4 - (size % 4);
- //DEBUG("CardSendCommand: write dpram ... size=%d\n", size);
- ft1000_write_dpram32(ft1000dev, 0,commandbuf, size);
- msleep(1);
- //DEBUG("CardSendCommand: write into doorbell ...\n");
- ft1000_write_register(ft1000dev, FT1000_DB_DPRAM_TX ,FT1000_REG_DOORBELL) ;
- msleep(1);
+ //DEBUG("card_send_command: write dpram ... size=%d\n", size);
+ ft1000_write_dpram32(ft1000dev, 0, commandbuf, size);
+ msleep(1);
+ //DEBUG("card_send_command: write into doorbell ...\n");
+ ft1000_write_register(ft1000dev, FT1000_DB_DPRAM_TX,
+ FT1000_REG_DOORBELL);
+ msleep(1);
- ft1000_read_register(ft1000dev, &temp, FT1000_REG_DOORBELL);
- //DEBUG("CardSendCommand: read doorbell ...temp=%x\n", temp);
- if ( (temp & 0x0100) == 0)
- {
- //DEBUG("CardSendCommand: Message sent\n");
- }
+ ft1000_read_register(ft1000dev, &temp, FT1000_REG_DOORBELL);
+ //DEBUG("card_send_command: read doorbell ...temp=%x\n", temp);
+ if ((temp & 0x0100) == 0) {
+ //DEBUG("card_send_command: Message sent\n");
+ }
}
-
//--------------------------------------------------------------------------
//
// Function: dsp_reload
@@ -591,49 +534,52 @@ void CardSendCommand(struct ft1000_device *ft1000dev, void *ptempbuffer, int siz
//-----------------------------------------------------------------------
int dsp_reload(struct ft1000_device *ft1000dev)
{
- u16 status;
- u16 tempword;
- u32 templong;
+ u16 status;
+ u16 tempword;
+ u32 templong;
struct ft1000_info *pft1000info;
- pft1000info = netdev_priv(ft1000dev->net);
+ pft1000info = netdev_priv(ft1000dev->net);
- pft1000info->CardReady = 0;
+ pft1000info->CardReady = 0;
- // Program Interrupt Mask register
- status = ft1000_write_register (ft1000dev, 0xffff, FT1000_REG_SUP_IMASK);
+ /* Program Interrupt Mask register */
+ status = ft1000_write_register(ft1000dev, 0xffff, FT1000_REG_SUP_IMASK);
- status = ft1000_read_register (ft1000dev, &tempword, FT1000_REG_RESET);
- tempword |= ASIC_RESET_BIT;
- status = ft1000_write_register (ft1000dev, tempword, FT1000_REG_RESET);
- msleep(1000);
- status = ft1000_read_register (ft1000dev, &tempword, FT1000_REG_RESET);
- DEBUG("Reset Register = 0x%x\n", tempword);
+ status = ft1000_read_register(ft1000dev, &tempword, FT1000_REG_RESET);
+ tempword |= ASIC_RESET_BIT;
+ status = ft1000_write_register(ft1000dev, tempword, FT1000_REG_RESET);
+ msleep(1000);
+ status = ft1000_read_register(ft1000dev, &tempword, FT1000_REG_RESET);
+ DEBUG("Reset Register = 0x%x\n", tempword);
- // Toggle DSP reset
- card_reset_dsp (ft1000dev, 1);
- msleep(1000);
- card_reset_dsp (ft1000dev, 0);
- msleep(1000);
+ /* Toggle DSP reset */
+ card_reset_dsp(ft1000dev, 1);
+ msleep(1000);
+ card_reset_dsp(ft1000dev, 0);
+ msleep(1000);
- status = ft1000_write_register (ft1000dev, HOST_INTF_BE, FT1000_REG_SUP_CTRL);
+ status =
+ ft1000_write_register(ft1000dev, HOST_INTF_BE, FT1000_REG_SUP_CTRL);
- // Let's check for FEFE
- status = ft1000_read_dpram32 (ft1000dev, FT1000_MAG_DPRAM_FEFE_INDX, (u8 *)&templong, 4);
- DEBUG("templong (fefe) = 0x%8x\n", templong);
+ /* Let's check for FEFE */
+ status =
+ ft1000_read_dpram32(ft1000dev, FT1000_MAG_DPRAM_FEFE_INDX,
+ (u8 *) &templong, 4);
+ DEBUG("templong (fefe) = 0x%8x\n", templong);
- // call codeloader
- status = scram_dnldr(ft1000dev, pFileStart, FileLength);
+ /* call codeloader */
+ status = scram_dnldr(ft1000dev, pFileStart, FileLength);
if (status != STATUS_SUCCESS)
return -EIO;
- msleep(1000);
+ msleep(1000);
- DEBUG("dsp_reload returned\n");
- return 0;
+ DEBUG("dsp_reload returned\n");
+ return 0;
}
//---------------------------------------------------------------------------
@@ -647,32 +593,33 @@ int dsp_reload(struct ft1000_device *ft1000dev)
// none
//
//---------------------------------------------------------------------------
-static void ft1000_reset_asic (struct net_device *dev)
+static void ft1000_reset_asic(struct net_device *dev)
{
struct ft1000_info *info = netdev_priv(dev);
- struct ft1000_device *ft1000dev = info->pFt1000Dev;
- u16 tempword;
+ struct ft1000_device *ft1000dev = info->pFt1000Dev;
+ u16 tempword;
- DEBUG("ft1000_hw:ft1000_reset_asic called\n");
+ DEBUG("ft1000_hw:ft1000_reset_asic called\n");
- info->ASICResetNum++;
+ info->ASICResetNum++;
- // Let's use the register provided by the Magnemite ASIC to reset the
- // ASIC and DSP.
- ft1000_write_register(ft1000dev, (DSP_RESET_BIT | ASIC_RESET_BIT), FT1000_REG_RESET );
+ /* Let's use the register provided by the Magnemite ASIC to reset the
+ * ASIC and DSP.
+ */
+ ft1000_write_register(ft1000dev, (DSP_RESET_BIT | ASIC_RESET_BIT),
+ FT1000_REG_RESET);
- mdelay(1);
+ mdelay(1);
- // set watermark to -1 in order to not generate an interrrupt
- ft1000_write_register(ft1000dev, 0xffff, FT1000_REG_MAG_WATERMARK);
-
- // clear interrupts
- ft1000_read_register (ft1000dev, &tempword, FT1000_REG_SUP_ISR);
- DEBUG("ft1000_hw: interrupt status register = 0x%x\n",tempword);
- ft1000_write_register (ft1000dev, tempword, FT1000_REG_SUP_ISR);
- ft1000_read_register (ft1000dev, &tempword, FT1000_REG_SUP_ISR);
- DEBUG("ft1000_hw: interrupt status register = 0x%x\n",tempword);
+ /* set watermark to -1 in order to not generate an interrrupt */
+ ft1000_write_register(ft1000dev, 0xffff, FT1000_REG_MAG_WATERMARK);
+ /* clear interrupts */
+ ft1000_read_register(ft1000dev, &tempword, FT1000_REG_SUP_ISR);
+ DEBUG("ft1000_hw: interrupt status register = 0x%x\n", tempword);
+ ft1000_write_register(ft1000dev, tempword, FT1000_REG_SUP_ISR);
+ ft1000_read_register(ft1000dev, &tempword, FT1000_REG_SUP_ISR);
+ DEBUG("ft1000_hw: interrupt status register = 0x%x\n", tempword);
}
@@ -687,54 +634,53 @@ static void ft1000_reset_asic (struct net_device *dev)
// TRUE (card reset successful)
//
//---------------------------------------------------------------------------
-static int ft1000_reset_card (struct net_device *dev)
+static int ft1000_reset_card(struct net_device *dev)
{
struct ft1000_info *info = netdev_priv(dev);
- struct ft1000_device *ft1000dev = info->pFt1000Dev;
- u16 tempword;
+ struct ft1000_device *ft1000dev = info->pFt1000Dev;
+ u16 tempword;
struct prov_record *ptr;
- DEBUG("ft1000_hw:ft1000_reset_card called.....\n");
-
- info->fCondResetPend = 1;
- info->CardReady = 0;
- info->fProvComplete = 0;
-
- // Make sure we free any memory reserve for provisioning
- while (list_empty(&info->prov_list) == 0) {
- DEBUG("ft1000_hw:ft1000_reset_card:deleting provisioning record\n");
- ptr = list_entry(info->prov_list.next, struct prov_record, list);
- list_del(&ptr->list);
- kfree(ptr->pprov_data);
- kfree(ptr);
- }
-
- DEBUG("ft1000_hw:ft1000_reset_card: reset asic\n");
- //reset ASIC
- ft1000_reset_asic(dev);
+ DEBUG("ft1000_hw:ft1000_reset_card called.....\n");
- info->DSPResetNum++;
+ info->fCondResetPend = 1;
+ info->CardReady = 0;
+ info->fProvComplete = 0;
- DEBUG("ft1000_hw:ft1000_reset_card: call dsp_reload\n");
- dsp_reload(ft1000dev);
+ /* Make sure we free any memory reserve for provisioning */
+ while (list_empty(&info->prov_list) == 0) {
+ DEBUG("ft1000_reset_card:deleting provisioning record\n");
+ ptr =
+ list_entry(info->prov_list.next, struct prov_record, list);
+ list_del(&ptr->list);
+ kfree(ptr->pprov_data);
+ kfree(ptr);
+ }
- DEBUG("dsp reload successful\n");
+ DEBUG("ft1000_hw:ft1000_reset_card: reset asic\n");
+ ft1000_reset_asic(dev);
+ info->DSPResetNum++;
- mdelay(10);
+ DEBUG("ft1000_hw:ft1000_reset_card: call dsp_reload\n");
+ dsp_reload(ft1000dev);
- // Initialize DSP heartbeat area to ho
- ft1000_write_dpram16(ft1000dev, FT1000_MAG_HI_HO, ho_mag, FT1000_MAG_HI_HO_INDX);
- ft1000_read_dpram16(ft1000dev, FT1000_MAG_HI_HO, (u8 *)&tempword, FT1000_MAG_HI_HO_INDX);
- DEBUG("ft1000_hw:ft1000_reset_card:hi_ho value = 0x%x\n", tempword);
+ DEBUG("dsp reload successful\n");
+ mdelay(10);
+ /* Initialize DSP heartbeat area */
+ ft1000_write_dpram16(ft1000dev, FT1000_MAG_HI_HO, ho_mag,
+ FT1000_MAG_HI_HO_INDX);
+ ft1000_read_dpram16(ft1000dev, FT1000_MAG_HI_HO, (u8 *) &tempword,
+ FT1000_MAG_HI_HO_INDX);
+ DEBUG("ft1000_hw:ft1000_reset_card:hi_ho value = 0x%x\n", tempword);
- info->CardReady = 1;
+ info->CardReady = 1;
- info->fCondResetPend = 0;
- return TRUE;
+ info->fCondResetPend = 0;
+ return TRUE;
}
@@ -742,10 +688,10 @@ static int ft1000_reset_card (struct net_device *dev)
#ifdef HAVE_NET_DEVICE_OPS
static const struct net_device_ops ftnet_ops =
{
-.ndo_open = &ft1000_open,
-.ndo_stop = &ft1000_close,
-.ndo_start_xmit = &ft1000_start_xmit,
-.ndo_get_stats = &ft1000_netdev_stats,
+ .ndo_open = &ft1000_open,
+ .ndo_stop = &ft1000_close,
+ .ndo_start_xmit = &ft1000_start_xmit,
+ .ndo_get_stats = &ft1000_netdev_stats,
};
#endif
@@ -764,9 +710,9 @@ static const struct net_device_ops ftnet_ops =
// Notes:
//
//---------------------------------------------------------------------------
-u16 init_ft1000_netdev(struct ft1000_device *ft1000dev)
+int init_ft1000_netdev(struct ft1000_device *ft1000dev)
{
- struct net_device *netdev;
+ struct net_device *netdev;
struct ft1000_info *pInfo = NULL;
struct dpram_blk *pdpram_blk;
int i, ret_val;
@@ -774,27 +720,23 @@ u16 init_ft1000_netdev(struct ft1000_device *ft1000dev)
char card_nr[2];
unsigned long gCardIndex = 0;
- DEBUG("Enter init_ft1000_netdev...\n");
-
+ DEBUG("Enter init_ft1000_netdev...\n");
netdev = alloc_etherdev(sizeof(struct ft1000_info));
- if (!netdev )
- {
- DEBUG("init_ft1000_netdev: can not allocate network device\n");
- return -ENOMEM;
- }
+ if (!netdev) {
+ DEBUG("init_ft1000_netdev: can not allocate network device\n");
+ return -ENOMEM;
+ }
pInfo = netdev_priv(netdev);
- //DEBUG("init_ft1000_netdev: gFt1000Info=%x, netdev=%x, ft1000dev=%x\n", gFt1000Info, netdev, ft1000dev);
-
memset(pInfo, 0, sizeof(struct ft1000_info));
- dev_alloc_name(netdev, netdev->name);
+ dev_alloc_name(netdev, netdev->name);
- DEBUG("init_ft1000_netdev: network device name is %s\n", netdev->name);
+ DEBUG("init_ft1000_netdev: network device name is %s\n", netdev->name);
- if ( strncmp(netdev->name,"eth", 3) == 0) {
+ if (strncmp(netdev->name, "eth", 3) == 0) {
card_nr[0] = netdev->name[3];
card_nr[1] = '\0';
ret_val = strict_strtoul(card_nr, 10, &gCardIndex);
@@ -803,89 +745,83 @@ u16 init_ft1000_netdev(struct ft1000_device *ft1000dev)
goto err_net;
}
- pInfo->CardNumber = gCardIndex;
- DEBUG("card number = %d\n", pInfo->CardNumber);
- }
- else {
- printk(KERN_ERR "ft1000: Invalid device name\n");
+ pInfo->CardNumber = gCardIndex;
+ DEBUG("card number = %d\n", pInfo->CardNumber);
+ } else {
+ printk(KERN_ERR "ft1000: Invalid device name\n");
ret_val = -ENXIO;
goto err_net;
- }
+ }
- memset(&pInfo->stats, 0, sizeof(struct net_device_stats) );
-
- spin_lock_init(&pInfo->dpram_lock);
- pInfo->pFt1000Dev = ft1000dev;
- pInfo->DrvErrNum = 0;
- pInfo->ASICResetNum = 0;
- pInfo->registered = 1;
- pInfo->ft1000_reset = ft1000_reset;
- pInfo->mediastate = 0;
- pInfo->fifo_cnt = 0;
- pInfo->DeviceCreated = FALSE;
- pInfo->CurrentInterruptEnableMask = ISR_DEFAULT_MASK;
- pInfo->InterruptsEnabled = FALSE;
- pInfo->CardReady = 0;
- pInfo->DSP_TIME[0] = 0;
- pInfo->DSP_TIME[1] = 0;
- pInfo->DSP_TIME[2] = 0;
- pInfo->DSP_TIME[3] = 0;
- pInfo->fAppMsgPend = 0;
- pInfo->fCondResetPend = 0;
+ memset(&pInfo->stats, 0, sizeof(struct net_device_stats));
+
+ spin_lock_init(&pInfo->dpram_lock);
+ pInfo->pFt1000Dev = ft1000dev;
+ pInfo->DrvErrNum = 0;
+ pInfo->ASICResetNum = 0;
+ pInfo->registered = 1;
+ pInfo->ft1000_reset = ft1000_reset;
+ pInfo->mediastate = 0;
+ pInfo->fifo_cnt = 0;
+ pInfo->DeviceCreated = FALSE;
+ pInfo->CurrentInterruptEnableMask = ISR_DEFAULT_MASK;
+ pInfo->InterruptsEnabled = FALSE;
+ pInfo->CardReady = 0;
+ pInfo->DSP_TIME[0] = 0;
+ pInfo->DSP_TIME[1] = 0;
+ pInfo->DSP_TIME[2] = 0;
+ pInfo->DSP_TIME[3] = 0;
+ pInfo->fAppMsgPend = 0;
+ pInfo->fCondResetPend = 0;
pInfo->usbboot = 0;
pInfo->dspalive = 0;
memset(&pInfo->tempbuf[0], 0, sizeof(pInfo->tempbuf));
- INIT_LIST_HEAD(&pInfo->prov_list);
+ INIT_LIST_HEAD(&pInfo->prov_list);
INIT_LIST_HEAD(&pInfo->nodes.list);
-//mbelian
+
#ifdef HAVE_NET_DEVICE_OPS
netdev->netdev_ops = &ftnet_ops;
#else
- netdev->hard_start_xmit = &ft1000_start_xmit;
- netdev->get_stats = &ft1000_netdev_stats;
- netdev->open = &ft1000_open;
- netdev->stop = &ft1000_close;
+ netdev->hard_start_xmit = &ft1000_start_xmit;
+ netdev->get_stats = &ft1000_netdev_stats;
+ netdev->open = &ft1000_open;
+ netdev->stop = &ft1000_close;
#endif
- ft1000dev->net = netdev;
+ ft1000dev->net = netdev;
+ DEBUG("Initialize free_buff_lock and freercvpool\n");
+ spin_lock_init(&free_buff_lock);
+ /* initialize a list of buffers to be use for queuing
+ * up receive command data
+ */
+ INIT_LIST_HEAD(&freercvpool);
-//init free_buff_lock, freercvpool, numofmsgbuf, pdpram_blk
-//only init once per card
-//Jim
- DEBUG("Initialize free_buff_lock and freercvpool\n");
- spin_lock_init(&free_buff_lock);
-
- // initialize a list of buffers to be use for queuing up receive command data
- INIT_LIST_HEAD (&freercvpool);
-
- // create list of free buffers
- for (i=0; i<NUM_OF_FREE_BUFFERS; i++) {
- // Get memory for DPRAM_DATA link list
+ /* create list of free buffers */
+ for (i = 0; i < NUM_OF_FREE_BUFFERS; i++) {
+ /* Get memory for DPRAM_DATA link list */
pdpram_blk = kmalloc(sizeof(struct dpram_blk), GFP_KERNEL);
if (pdpram_blk == NULL) {
ret_val = -ENOMEM;
goto err_free;
}
- // Get a block of memory to store command data
- pdpram_blk->pbuffer = kmalloc ( MAX_CMD_SQSIZE, GFP_KERNEL );
+ /* Get a block of memory to store command data */
+ pdpram_blk->pbuffer = kmalloc(MAX_CMD_SQSIZE, GFP_KERNEL);
if (pdpram_blk->pbuffer == NULL) {
ret_val = -ENOMEM;
kfree(pdpram_blk);
goto err_free;
}
- // link provisioning data
- list_add_tail (&pdpram_blk->list, &freercvpool);
- }
- numofmsgbuf = NUM_OF_FREE_BUFFERS;
-
+ /* link provisioning data */
+ list_add_tail(&pdpram_blk->list, &freercvpool);
+ }
+ numofmsgbuf = NUM_OF_FREE_BUFFERS;
return 0;
-
err_free:
list_for_each_safe(cur, tmp, &freercvpool) {
pdpram_blk = list_entry(cur, struct dpram_blk, list);
@@ -898,8 +834,6 @@ err_net:
return ret_val;
}
-
-
//---------------------------------------------------------------------------
// Function: reg_ft1000_netdev
//
@@ -914,46 +848,42 @@ err_net:
// Notes:
//
//---------------------------------------------------------------------------
-int reg_ft1000_netdev(struct ft1000_device *ft1000dev, struct usb_interface *intf)
+int reg_ft1000_netdev(struct ft1000_device *ft1000dev,
+ struct usb_interface *intf)
{
- struct net_device *netdev;
+ struct net_device *netdev;
struct ft1000_info *pInfo;
int rc;
- netdev = ft1000dev->net;
- pInfo = netdev_priv(ft1000dev->net);
- DEBUG("Enter reg_ft1000_netdev...\n");
+ netdev = ft1000dev->net;
+ pInfo = netdev_priv(ft1000dev->net);
+ DEBUG("Enter reg_ft1000_netdev...\n");
+ ft1000_read_register(ft1000dev, &pInfo->AsicID, FT1000_REG_ASIC_ID);
- ft1000_read_register(ft1000dev, &pInfo->AsicID, FT1000_REG_ASIC_ID);
-
- usb_set_intfdata(intf, pInfo);
- SET_NETDEV_DEV(netdev, &intf->dev);
-
- rc = register_netdev(netdev);
- if (rc)
- {
- DEBUG("reg_ft1000_netdev: could not register network device\n");
- free_netdev(netdev);
- return rc;
- }
-
+ usb_set_intfdata(intf, pInfo);
+ SET_NETDEV_DEV(netdev, &intf->dev);
- //Create character device, implemented by Jim
- ft1000_create_dev(ft1000dev);
+ rc = register_netdev(netdev);
+ if (rc) {
+ DEBUG("reg_ft1000_netdev: could not register network device\n");
+ free_netdev(netdev);
+ return rc;
+ }
- DEBUG ("reg_ft1000_netdev returned\n");
+ ft1000_create_dev(ft1000dev);
- pInfo->CardReady = 1;
+ DEBUG("reg_ft1000_netdev returned\n");
+ pInfo->CardReady = 1;
return 0;
}
static int ft1000_reset(struct net_device *dev)
{
- ft1000_reset_card(dev);
- return 0;
+ ft1000_reset_card(dev);
+ return 0;
}
//---------------------------------------------------------------------------
@@ -972,14 +902,14 @@ static int ft1000_reset(struct net_device *dev)
static void ft1000_usb_transmit_complete(struct urb *urb)
{
- struct ft1000_device *ft1000dev = urb->context;
+ struct ft1000_device *ft1000dev = urb->context;
//DEBUG("ft1000_usb_transmit_complete entered\n");
- if (urb->status)
- printk("%s: TX status %d\n", ft1000dev->net->name, urb->status);
+ if (urb->status)
+ pr_err("%s: TX status %d\n", ft1000dev->net->name, urb->status);
- netif_wake_queue(ft1000dev->net);
+ netif_wake_queue(ft1000dev->net);
//DEBUG("Return from ft1000_usb_transmit_complete\n");
}
@@ -999,37 +929,31 @@ static void ft1000_usb_transmit_complete(struct urb *urb)
// SUCCESS
//
//---------------------------------------------------------------------------
-static int ft1000_copy_down_pkt (struct net_device *netdev, u8 *packet, u16 len)
+static int ft1000_copy_down_pkt(struct net_device *netdev, u8 * packet, u16 len)
{
struct ft1000_info *pInfo = netdev_priv(netdev);
- struct ft1000_device *pFt1000Dev = pInfo->pFt1000Dev;
-
+ struct ft1000_device *pFt1000Dev = pInfo->pFt1000Dev;
int count, ret;
- u8 *t;
+ u8 *t;
struct pseudo_hdr hdr;
- if (!pInfo->CardReady)
- {
-
- DEBUG("ft1000_copy_down_pkt::Card Not Ready\n");
- return -ENODEV;
-
- }
-
+ if (!pInfo->CardReady) {
+ DEBUG("ft1000_copy_down_pkt::Card Not Ready\n");
+ return -ENODEV;
+ }
- //DEBUG("ft1000_copy_down_pkt() entered, len = %d\n", len);
+ //DEBUG("ft1000_copy_down_pkt() entered, len = %d\n", len);
count = sizeof(struct pseudo_hdr) + len;
- if(count > MAX_BUF_SIZE)
- {
- DEBUG("Error:ft1000_copy_down_pkt:Message Size Overflow!\n");
- DEBUG("size = %d\n", count);
- return -EINVAL;
- }
+ if (count > MAX_BUF_SIZE) {
+ DEBUG("Error:ft1000_copy_down_pkt:Message Size Overflow!\n");
+ DEBUG("size = %d\n", count);
+ return -EINVAL;
+ }
- if ( count % 4)
- count = count + (4- (count %4) );
+ if (count % 4)
+ count = count + (4 - (count % 4));
memset(&hdr, 0, sizeof(struct pseudo_hdr));
@@ -1042,46 +966,45 @@ static int ft1000_copy_down_pkt (struct net_device *netdev, u8 *packet, u16 len)
hdr.control = 0x00;
hdr.checksum = hdr.length ^ hdr.source ^ hdr.destination ^
- hdr.portdest ^ hdr.portsrc ^ hdr.sh_str_id ^
- hdr.control;
+ hdr.portdest ^ hdr.portsrc ^ hdr.sh_str_id ^ hdr.control;
memcpy(&pFt1000Dev->tx_buf[0], &hdr, sizeof(hdr));
memcpy(&(pFt1000Dev->tx_buf[sizeof(struct pseudo_hdr)]), packet, len);
- netif_stop_queue(netdev);
+ netif_stop_queue(netdev);
- //DEBUG ("ft1000_copy_down_pkt: count = %d\n", count);
+ //DEBUG ("ft1000_copy_down_pkt: count = %d\n", count);
- usb_fill_bulk_urb(pFt1000Dev->tx_urb,
- pFt1000Dev->dev,
- usb_sndbulkpipe(pFt1000Dev->dev, pFt1000Dev->bulk_out_endpointAddr),
- pFt1000Dev->tx_buf,
- count,
- ft1000_usb_transmit_complete,
- (void*)pFt1000Dev);
-
- t = (u8 *)pFt1000Dev->tx_urb->transfer_buffer;
- //DEBUG("transfer_length=%d\n", pFt1000Dev->tx_urb->transfer_buffer_length);
- /*for (i=0; i<count; i++ )
- {
- DEBUG("%x ", *t++ );
- }*/
+ usb_fill_bulk_urb(pFt1000Dev->tx_urb,
+ pFt1000Dev->dev,
+ usb_sndbulkpipe(pFt1000Dev->dev,
+ pFt1000Dev->bulk_out_endpointAddr),
+ pFt1000Dev->tx_buf, count,
+ ft1000_usb_transmit_complete, (void *)pFt1000Dev);
+ t = (u8 *) pFt1000Dev->tx_urb->transfer_buffer;
+ //DEBUG("transfer_length=%d\n", pFt1000Dev->tx_urb->transfer_buffer_length);
+ /*for (i=0; i<count; i++ )
+ {
+ DEBUG("%x ", *t++ );
+ } */
ret = usb_submit_urb(pFt1000Dev->tx_urb, GFP_ATOMIC);
+
if (ret) {
DEBUG("ft1000 failed tx_urb %d\n", ret);
return ret;
} else {
pInfo->stats.tx_packets++;
- pInfo->stats.tx_bytes += (len+14);
+ pInfo->stats.tx_bytes += (len + 14);
}
- //DEBUG("ft1000_copy_down_pkt() exit\n");
+ //DEBUG("ft1000_copy_down_pkt() exit\n");
return 0;
}
+
//---------------------------------------------------------------------------
// Function: ft1000_start_xmit
//
@@ -1099,61 +1022,56 @@ static int ft1000_copy_down_pkt (struct net_device *netdev, u8 *packet, u16 len)
static int ft1000_start_xmit(struct sk_buff *skb, struct net_device *dev)
{
struct ft1000_info *pInfo = netdev_priv(dev);
- struct ft1000_device *pFt1000Dev= pInfo->pFt1000Dev;
- u8 *pdata;
- int maxlen, pipe;
-
+ struct ft1000_device *pFt1000Dev = pInfo->pFt1000Dev;
+ u8 *pdata;
+ int maxlen, pipe;
- //DEBUG(" ft1000_start_xmit() entered\n");
-
- if ( skb == NULL )
- {
- DEBUG ("ft1000_hw: ft1000_start_xmit:skb == NULL!!!\n" );
- return NETDEV_TX_OK;
- }
-
- if ( pFt1000Dev->status & FT1000_STATUS_CLOSING)
- {
- DEBUG("network driver is closed, return\n");
- goto err;
- }
-
- //DEBUG("ft1000_start_xmit 1:length of packet = %d\n", skb->len);
- pipe = usb_sndbulkpipe(pFt1000Dev->dev, pFt1000Dev->bulk_out_endpointAddr);
- maxlen = usb_maxpacket(pFt1000Dev->dev, pipe, usb_pipeout(pipe));
- //DEBUG("ft1000_start_xmit 2: pipe=%d dev->maxpacket = %d\n", pipe, maxlen);
-
- pdata = (u8 *)skb->data;
- /*for (i=0; i<skb->len; i++)
- DEBUG("skb->data[%d]=%x ", i, *(skb->data+i));
-
- DEBUG("\n");*/
+ //DEBUG(" ft1000_start_xmit() entered\n");
+ if (skb == NULL) {
+ DEBUG("ft1000_hw: ft1000_start_xmit:skb == NULL!!!\n");
+ return NETDEV_TX_OK;
+ }
- if (pInfo->mediastate == 0)
- {
- /* Drop packet is mediastate is down */
- DEBUG("ft1000_hw:ft1000_start_xmit:mediastate is down\n");
- goto err;
- }
+ if (pFt1000Dev->status & FT1000_STATUS_CLOSING) {
+ DEBUG("network driver is closed, return\n");
+ goto err;
+ }
+ //DEBUG("ft1000_start_xmit 1:length of packet = %d\n", skb->len);
+ pipe =
+ usb_sndbulkpipe(pFt1000Dev->dev, pFt1000Dev->bulk_out_endpointAddr);
+ maxlen = usb_maxpacket(pFt1000Dev->dev, pipe, usb_pipeout(pipe));
+ //DEBUG("ft1000_start_xmit 2: pipe=%d dev->maxpacket = %d\n", pipe, maxlen);
+
+ pdata = (u8 *) skb->data;
+ /*for (i=0; i<skb->len; i++)
+ DEBUG("skb->data[%d]=%x ", i, *(skb->data+i));
+
+ DEBUG("\n"); */
+
+ if (pInfo->mediastate == 0) {
+ /* Drop packet is mediastate is down */
+ DEBUG("ft1000_hw:ft1000_start_xmit:mediastate is down\n");
+ goto err;
+ }
- if ( (skb->len < ENET_HEADER_SIZE) || (skb->len > ENET_MAX_SIZE) )
- {
- /* Drop packet which has invalid size */
- DEBUG("ft1000_hw:ft1000_start_xmit:invalid ethernet length\n");
- goto err;
- }
+ if ((skb->len < ENET_HEADER_SIZE) || (skb->len > ENET_MAX_SIZE)) {
+ /* Drop packet which has invalid size */
+ DEBUG("ft1000_hw:ft1000_start_xmit:invalid ethernet length\n");
+ goto err;
+ }
//mbelian
- ft1000_copy_down_pkt(dev, (pdata+ENET_HEADER_SIZE-2),
- skb->len - ENET_HEADER_SIZE + 2);
+ ft1000_copy_down_pkt(dev, (pdata + ENET_HEADER_SIZE - 2),
+ skb->len - ENET_HEADER_SIZE + 2);
err:
dev_kfree_skb(skb);
- //DEBUG(" ft1000_start_xmit() exit\n");
+ //DEBUG(" ft1000_start_xmit() exit\n");
return NETDEV_TX_OK;
}
+
//---------------------------------------------------------------------------
//
// Function: ft1000_copy_up_pkt
@@ -1167,109 +1085,100 @@ err:
// SUCCESS
//
//---------------------------------------------------------------------------
-static int ft1000_copy_up_pkt (struct urb *urb)
+static int ft1000_copy_up_pkt(struct urb *urb)
{
struct ft1000_info *info = urb->context;
- struct ft1000_device *ft1000dev = info->pFt1000Dev;
- struct net_device *net = ft1000dev->net;
-
- u16 tempword;
- u16 len;
- u16 lena; //mbelian
- struct sk_buff *skb;
- u16 i;
- u8 *pbuffer=NULL;
- u8 *ptemp=NULL;
- u16 *chksum;
-
-
- //DEBUG("ft1000_copy_up_pkt entered\n");
-
- if ( ft1000dev->status & FT1000_STATUS_CLOSING)
- {
- DEBUG("network driver is closed, return\n");
- return STATUS_SUCCESS;
- }
-
- // Read length
- len = urb->transfer_buffer_length;
- lena = urb->actual_length; //mbelian
- //DEBUG("ft1000_copy_up_pkt: transfer_buffer_length=%d, actual_buffer_len=%d\n",
- // urb->transfer_buffer_length, urb->actual_length);
-
- chksum = (u16 *)ft1000dev->rx_buf;
-
- tempword = *chksum++;
- for (i=1; i<7; i++)
- {
- tempword ^= *chksum++;
- }
-
- if (tempword != *chksum)
- {
- info->stats.rx_errors ++;
- ft1000_submit_rx_urb(info);
- return STATUS_FAILURE;
- }
-
-
- //DEBUG("ft1000_copy_up_pkt: checksum is correct %x\n", *chksum);
-
- skb = dev_alloc_skb(len+12+2);
-
- if (skb == NULL)
- {
- DEBUG("ft1000_copy_up_pkt: No Network buffers available\n");
- info->stats.rx_errors++;
- ft1000_submit_rx_urb(info);
- return STATUS_FAILURE;
- }
-
- pbuffer = (u8 *)skb_put(skb, len+12);
-
- //subtract the number of bytes read already
- ptemp = pbuffer;
-
- // fake MAC address
- *pbuffer++ = net->dev_addr[0];
- *pbuffer++ = net->dev_addr[1];
- *pbuffer++ = net->dev_addr[2];
- *pbuffer++ = net->dev_addr[3];
- *pbuffer++ = net->dev_addr[4];
- *pbuffer++ = net->dev_addr[5];
- *pbuffer++ = 0x00;
- *pbuffer++ = 0x07;
- *pbuffer++ = 0x35;
- *pbuffer++ = 0xff;
- *pbuffer++ = 0xff;
- *pbuffer++ = 0xfe;
-
-
-
-
- memcpy(pbuffer, ft1000dev->rx_buf+sizeof(struct pseudo_hdr), len-sizeof(struct pseudo_hdr));
-
- //DEBUG("ft1000_copy_up_pkt: Data passed to Protocol layer\n");
- /*for (i=0; i<len+12; i++)
- {
- DEBUG("ft1000_copy_up_pkt: Protocol Data: 0x%x\n ", *ptemp++);
- }*/
+ struct ft1000_device *ft1000dev = info->pFt1000Dev;
+ struct net_device *net = ft1000dev->net;
+
+ u16 tempword;
+ u16 len;
+ u16 lena; //mbelian
+ struct sk_buff *skb;
+ u16 i;
+ u8 *pbuffer = NULL;
+ u8 *ptemp = NULL;
+ u16 *chksum;
+
+ //DEBUG("ft1000_copy_up_pkt entered\n");
+
+ if (ft1000dev->status & FT1000_STATUS_CLOSING) {
+ DEBUG("network driver is closed, return\n");
+ return STATUS_SUCCESS;
+ }
+ // Read length
+ len = urb->transfer_buffer_length;
+ lena = urb->actual_length; //mbelian
+ //DEBUG("ft1000_copy_up_pkt: transfer_buffer_length=%d, actual_buffer_len=%d\n",
+ // urb->transfer_buffer_length, urb->actual_length);
+
+ chksum = (u16 *) ft1000dev->rx_buf;
+
+ tempword = *chksum++;
+ for (i = 1; i < 7; i++)
+ tempword ^= *chksum++;
+
+ if (tempword != *chksum) {
+ info->stats.rx_errors++;
+ ft1000_submit_rx_urb(info);
+ return STATUS_FAILURE;
+ }
- skb->dev = net;
+ //DEBUG("ft1000_copy_up_pkt: checksum is correct %x\n", *chksum);
- skb->protocol = eth_type_trans(skb, net);
- skb->ip_summed = CHECKSUM_UNNECESSARY;
- netif_rx(skb);
+ skb = dev_alloc_skb(len + 12 + 2);
- info->stats.rx_packets++;
- // Add on 12 bytes for MAC address which was removed
- info->stats.rx_bytes += (lena+12); //mbelian
+ if (skb == NULL) {
+ DEBUG("ft1000_copy_up_pkt: No Network buffers available\n");
+ info->stats.rx_errors++;
+ ft1000_submit_rx_urb(info);
+ return STATUS_FAILURE;
+ }
- ft1000_submit_rx_urb(info);
- //DEBUG("ft1000_copy_up_pkt exited\n");
- return SUCCESS;
+ pbuffer = (u8 *) skb_put(skb, len + 12);
+
+ /* subtract the number of bytes read already */
+ ptemp = pbuffer;
+
+ /* fake MAC address */
+ *pbuffer++ = net->dev_addr[0];
+ *pbuffer++ = net->dev_addr[1];
+ *pbuffer++ = net->dev_addr[2];
+ *pbuffer++ = net->dev_addr[3];
+ *pbuffer++ = net->dev_addr[4];
+ *pbuffer++ = net->dev_addr[5];
+ *pbuffer++ = 0x00;
+ *pbuffer++ = 0x07;
+ *pbuffer++ = 0x35;
+ *pbuffer++ = 0xff;
+ *pbuffer++ = 0xff;
+ *pbuffer++ = 0xfe;
+
+ memcpy(pbuffer, ft1000dev->rx_buf + sizeof(struct pseudo_hdr),
+ len - sizeof(struct pseudo_hdr));
+
+ //DEBUG("ft1000_copy_up_pkt: Data passed to Protocol layer\n");
+ /*for (i=0; i<len+12; i++)
+ {
+ DEBUG("ft1000_copy_up_pkt: Protocol Data: 0x%x\n ", *ptemp++);
+ } */
+
+ skb->dev = net;
+
+ skb->protocol = eth_type_trans(skb, net);
+ skb->ip_summed = CHECKSUM_UNNECESSARY;
+ netif_rx(skb);
+
+ info->stats.rx_packets++;
+ /* Add on 12 bytes for MAC address which was removed */
+ info->stats.rx_bytes += (lena + 12); //mbelian
+
+ ft1000_submit_rx_urb(info);
+ //DEBUG("ft1000_copy_up_pkt exited\n");
+ return SUCCESS;
}
+
//---------------------------------------------------------------------------
//
// Function: ft1000_submit_rx_urb
@@ -1285,38 +1194,36 @@ static int ft1000_copy_up_pkt (struct urb *urb)
//---------------------------------------------------------------------------
static int ft1000_submit_rx_urb(struct ft1000_info *info)
{
- int result;
- struct ft1000_device *pFt1000Dev = info->pFt1000Dev;
-
-
- //DEBUG ("ft1000_submit_rx_urb entered: sizeof rx_urb is %d\n", sizeof(*pFt1000Dev->rx_urb));
- if ( pFt1000Dev->status & FT1000_STATUS_CLOSING)
- {
- DEBUG("network driver is closed, return\n");
- //usb_kill_urb(pFt1000Dev->rx_urb); //mbelian
- return -ENODEV;
- }
-
- usb_fill_bulk_urb(pFt1000Dev->rx_urb,
- pFt1000Dev->dev,
- usb_rcvbulkpipe(pFt1000Dev->dev, pFt1000Dev->bulk_in_endpointAddr),
- pFt1000Dev->rx_buf,
- MAX_BUF_SIZE,
- (usb_complete_t)ft1000_copy_up_pkt,
- info);
+ int result;
+ struct ft1000_device *pFt1000Dev = info->pFt1000Dev;
+
+ //DEBUG ("ft1000_submit_rx_urb entered: sizeof rx_urb is %d\n", sizeof(*pFt1000Dev->rx_urb));
+ if (pFt1000Dev->status & FT1000_STATUS_CLOSING) {
+ DEBUG("network driver is closed, return\n");
+ //usb_kill_urb(pFt1000Dev->rx_urb); //mbelian
+ return -ENODEV;
+ }
+ usb_fill_bulk_urb(pFt1000Dev->rx_urb,
+ pFt1000Dev->dev,
+ usb_rcvbulkpipe(pFt1000Dev->dev,
+ pFt1000Dev->bulk_in_endpointAddr),
+ pFt1000Dev->rx_buf, MAX_BUF_SIZE,
+ (usb_complete_t) ft1000_copy_up_pkt, info);
- if((result = usb_submit_urb(pFt1000Dev->rx_urb, GFP_ATOMIC)))
- {
- printk("ft1000_submit_rx_urb: submitting rx_urb %d failed\n", result);
- return result;
- }
+ result = usb_submit_urb(pFt1000Dev->rx_urb, GFP_ATOMIC);
- //DEBUG("ft1000_submit_rx_urb exit: result=%d\n", result);
+ if (result) {
+ pr_err("ft1000_submit_rx_urb: submitting rx_urb %d failed\n",
+ result);
+ return result;
+ }
+ //DEBUG("ft1000_submit_rx_urb exit: result=%d\n", result);
return 0;
}
+
//---------------------------------------------------------------------------
// Function: ft1000_open
//
@@ -1331,27 +1238,26 @@ static int ft1000_submit_rx_urb(struct ft1000_info *info)
// Notes:
//
//---------------------------------------------------------------------------
-static int ft1000_open (struct net_device *dev)
+static int ft1000_open(struct net_device *dev)
{
struct ft1000_info *pInfo = netdev_priv(dev);
- struct timeval tv; //mbelian
+ struct timeval tv; //mbelian
int ret;
- DEBUG("ft1000_open is called for card %d\n", pInfo->CardNumber);
- //DEBUG("ft1000_open: dev->addr=%x, dev->addr_len=%d\n", dev->addr, dev->addr_len);
+ DEBUG("ft1000_open is called for card %d\n", pInfo->CardNumber);
+ //DEBUG("ft1000_open: dev->addr=%x, dev->addr_len=%d\n", dev->addr, dev->addr_len);
- pInfo->stats.rx_bytes = 0; //mbelian
- pInfo->stats.tx_bytes = 0; //mbelian
- pInfo->stats.rx_packets = 0; //mbelian
- pInfo->stats.tx_packets = 0; //mbelian
+ pInfo->stats.rx_bytes = 0; //mbelian
+ pInfo->stats.tx_bytes = 0; //mbelian
+ pInfo->stats.rx_packets = 0; //mbelian
+ pInfo->stats.tx_packets = 0; //mbelian
do_gettimeofday(&tv);
- pInfo->ConTm = tv.tv_sec;
- pInfo->ProgConStat = 0; //mbelian
-
+ pInfo->ConTm = tv.tv_sec;
+ pInfo->ProgConStat = 0; //mbelian
- netif_start_queue(dev);
+ netif_start_queue(dev);
- netif_carrier_on(dev); //mbelian
+ netif_carrier_on(dev); //mbelian
ret = ft1000_submit_rx_urb(pInfo);
@@ -1375,24 +1281,23 @@ static int ft1000_open (struct net_device *dev)
int ft1000_close(struct net_device *net)
{
struct ft1000_info *pInfo = netdev_priv(net);
- struct ft1000_device *ft1000dev = pInfo->pFt1000Dev;
+ struct ft1000_device *ft1000dev = pInfo->pFt1000Dev;
- //DEBUG ("ft1000_close: netdev->refcnt=%d\n", net->refcnt);
+ //DEBUG ("ft1000_close: netdev->refcnt=%d\n", net->refcnt);
- ft1000dev->status |= FT1000_STATUS_CLOSING;
-
- //DEBUG("ft1000_close: calling usb_kill_urb \n");
+ ft1000dev->status |= FT1000_STATUS_CLOSING;
- DEBUG("ft1000_close: pInfo=%p, ft1000dev=%p\n", pInfo, ft1000dev);
- netif_carrier_off(net);//mbelian
- netif_stop_queue(net);
- //DEBUG("ft1000_close: netif_stop_queue called\n");
- ft1000dev->status &= ~FT1000_STATUS_CLOSING;
+ //DEBUG("ft1000_close: calling usb_kill_urb \n");
- pInfo->ProgConStat = 0xff; //mbelian
+ DEBUG("ft1000_close: pInfo=%p, ft1000dev=%p\n", pInfo, ft1000dev);
+ netif_carrier_off(net); //mbelian
+ netif_stop_queue(net);
+ //DEBUG("ft1000_close: netif_stop_queue called\n");
+ ft1000dev->status &= ~FT1000_STATUS_CLOSING;
+ pInfo->ProgConStat = 0xff; //mbelian
- return 0;
+ return 0;
}
static struct net_device_stats *ft1000_netdev_stats(struct net_device *dev)
@@ -1420,40 +1325,41 @@ Jim
// TRUE (device is present)
//
//---------------------------------------------------------------------------
-static int ft1000_chkcard (struct ft1000_device *dev) {
- u16 tempword;
- u16 status;
+static int ft1000_chkcard(struct ft1000_device *dev)
+{
+ u16 tempword;
+ u16 status;
struct ft1000_info *info = netdev_priv(dev->net);
- if (info->fCondResetPend)
- {
- DEBUG("ft1000_hw:ft1000_chkcard:Card is being reset, return FALSE\n");
- return TRUE;
- }
-
- // Mask register is used to check for device presence since it is never
- // set to zero.
- status = ft1000_read_register(dev, &tempword, FT1000_REG_SUP_IMASK);
- //DEBUG("ft1000_hw:ft1000_chkcard: read FT1000_REG_SUP_IMASK = %x\n", tempword);
- if (tempword == 0) {
- DEBUG("ft1000_hw:ft1000_chkcard: IMASK = 0 Card not detected\n");
- return FALSE;
- }
-
- // The system will return the value of 0xffff for the version register
- // if the device is not present.
- status = ft1000_read_register(dev, &tempword, FT1000_REG_ASIC_ID);
- //DEBUG("ft1000_hw:ft1000_chkcard: read FT1000_REG_ASIC_ID = %x\n", tempword);
- if (tempword != 0x1b01 ){
- dev->status |= FT1000_STATUS_CLOSING; //mbelian
- DEBUG("ft1000_hw:ft1000_chkcard: Version = 0xffff Card not detected\n");
- return FALSE;
- }
- return TRUE;
+ if (info->fCondResetPend) {
+ DEBUG
+ ("ft1000_hw:ft1000_chkcard:Card is being reset, return FALSE\n");
+ return TRUE;
+ }
+ /* Mask register is used to check for device presence since it is never
+ * set to zero.
+ */
+ status = ft1000_read_register(dev, &tempword, FT1000_REG_SUP_IMASK);
+ //DEBUG("ft1000_hw:ft1000_chkcard: read FT1000_REG_SUP_IMASK = %x\n", tempword);
+ if (tempword == 0) {
+ DEBUG
+ ("ft1000_hw:ft1000_chkcard: IMASK = 0 Card not detected\n");
+ return FALSE;
+ }
+ /* The system will return the value of 0xffff for the version register
+ * if the device is not present.
+ */
+ status = ft1000_read_register(dev, &tempword, FT1000_REG_ASIC_ID);
+ //DEBUG("ft1000_hw:ft1000_chkcard: read FT1000_REG_ASIC_ID = %x\n", tempword);
+ if (tempword != 0x1b01) {
+ dev->status |= FT1000_STATUS_CLOSING; //mbelian
+ DEBUG
+ ("ft1000_hw:ft1000_chkcard: Version = 0xffff Card not detected\n");
+ return FALSE;
+ }
+ return TRUE;
}
-
-
//---------------------------------------------------------------------------
//
// Function: ft1000_receive_cmd
@@ -1467,425 +1373,476 @@ static int ft1000_chkcard (struct ft1000_device *dev) {
// = 1 (successful)
//
//---------------------------------------------------------------------------
-static bool ft1000_receive_cmd (struct ft1000_device *dev, u16 *pbuffer, int maxsz, u16 *pnxtph) {
- u16 size, ret;
- u16 *ppseudohdr;
- int i;
- u16 tempword;
+static bool ft1000_receive_cmd(struct ft1000_device *dev, u16 *pbuffer,
+ int maxsz, u16 *pnxtph)
+{
+ u16 size, ret;
+ u16 *ppseudohdr;
+ int i;
+ u16 tempword;
+
+ ret =
+ ft1000_read_dpram16(dev, FT1000_MAG_PH_LEN, (u8 *) &size,
+ FT1000_MAG_PH_LEN_INDX);
+ size = ntohs(size) + PSEUDOSZ;
+ if (size > maxsz) {
+ DEBUG("FT1000:ft1000_receive_cmd:Invalid command length = %d\n",
+ size);
+ return FALSE;
+ } else {
+ ppseudohdr = (u16 *) pbuffer;
+ ft1000_write_register(dev, FT1000_DPRAM_MAG_RX_BASE,
+ FT1000_REG_DPRAM_ADDR);
+ ret =
+ ft1000_read_register(dev, pbuffer, FT1000_REG_MAG_DPDATAH);
+ //DEBUG("ft1000_hw:received data = 0x%x\n", *pbuffer);
+ pbuffer++;
+ ft1000_write_register(dev, FT1000_DPRAM_MAG_RX_BASE + 1,
+ FT1000_REG_DPRAM_ADDR);
+ for (i = 0; i <= (size >> 2); i++) {
+ ret =
+ ft1000_read_register(dev, pbuffer,
+ FT1000_REG_MAG_DPDATAL);
+ pbuffer++;
+ ret =
+ ft1000_read_register(dev, pbuffer,
+ FT1000_REG_MAG_DPDATAH);
+ pbuffer++;
+ }
+ /* copy odd aligned word */
+ ret =
+ ft1000_read_register(dev, pbuffer, FT1000_REG_MAG_DPDATAL);
+ //DEBUG("ft1000_hw:received data = 0x%x\n", *pbuffer);
+ pbuffer++;
+ ret =
+ ft1000_read_register(dev, pbuffer, FT1000_REG_MAG_DPDATAH);
+ //DEBUG("ft1000_hw:received data = 0x%x\n", *pbuffer);
+ pbuffer++;
+ if (size & 0x0001) {
+ /* copy odd byte from fifo */
+ ret =
+ ft1000_read_register(dev, &tempword,
+ FT1000_REG_DPRAM_DATA);
+ *pbuffer = ntohs(tempword);
+ }
+ /* Check if pseudo header checksum is good
+ * Calculate pseudo header checksum
+ */
+ tempword = *ppseudohdr++;
+ for (i = 1; i < 7; i++)
+ tempword ^= *ppseudohdr++;
- ret = ft1000_read_dpram16(dev, FT1000_MAG_PH_LEN, (u8 *)&size, FT1000_MAG_PH_LEN_INDX);
- size = ntohs(size) + PSEUDOSZ;
- if (size > maxsz) {
- DEBUG("FT1000:ft1000_receive_cmd:Invalid command length = %d\n", size);
- return FALSE;
- }
- else {
- ppseudohdr = (u16 *)pbuffer;
- ft1000_write_register(dev, FT1000_DPRAM_MAG_RX_BASE, FT1000_REG_DPRAM_ADDR);
- ret = ft1000_read_register(dev, pbuffer, FT1000_REG_MAG_DPDATAH);
- //DEBUG("ft1000_hw:received data = 0x%x\n", *pbuffer);
- pbuffer++;
- ft1000_write_register(dev, FT1000_DPRAM_MAG_RX_BASE+1, FT1000_REG_DPRAM_ADDR);
- for (i=0; i<=(size>>2); i++) {
- ret = ft1000_read_register(dev, pbuffer, FT1000_REG_MAG_DPDATAL);
- pbuffer++;
- ret = ft1000_read_register(dev, pbuffer, FT1000_REG_MAG_DPDATAH);
- pbuffer++;
- }
- //copy odd aligned word
- ret = ft1000_read_register(dev, pbuffer, FT1000_REG_MAG_DPDATAL);
- //DEBUG("ft1000_hw:received data = 0x%x\n", *pbuffer);
- pbuffer++;
- ret = ft1000_read_register(dev, pbuffer, FT1000_REG_MAG_DPDATAH);
- //DEBUG("ft1000_hw:received data = 0x%x\n", *pbuffer);
- pbuffer++;
- if (size & 0x0001) {
- //copy odd byte from fifo
- ret = ft1000_read_register(dev, &tempword, FT1000_REG_DPRAM_DATA);
- *pbuffer = ntohs(tempword);
- }
+ if ((tempword != *ppseudohdr))
+ return FALSE;
- // Check if pseudo header checksum is good
- // Calculate pseudo header checksum
- tempword = *ppseudohdr++;
- for (i=1; i<7; i++) {
- tempword ^= *ppseudohdr++;
- }
- if ( (tempword != *ppseudohdr) ) {
- return FALSE;
- }
-
- return TRUE;
- }
+ return TRUE;
+ }
}
-
static int ft1000_dsp_prov(void *arg)
{
- struct ft1000_device *dev = (struct ft1000_device *)arg;
+ struct ft1000_device *dev = (struct ft1000_device *)arg;
struct ft1000_info *info = netdev_priv(dev->net);
- u16 tempword;
- u16 len;
- u16 i=0;
+ u16 tempword;
+ u16 len;
+ u16 i = 0;
struct prov_record *ptr;
struct pseudo_hdr *ppseudo_hdr;
- u16 *pmsg;
- u16 status;
- u16 TempShortBuf [256];
-
- DEBUG("*** DspProv Entered\n");
-
- while (list_empty(&info->prov_list) == 0)
- {
- DEBUG("DSP Provisioning List Entry\n");
-
- // Check if doorbell is available
- DEBUG("check if doorbell is cleared\n");
- status = ft1000_read_register (dev, &tempword, FT1000_REG_DOORBELL);
- if (status)
- {
- DEBUG("ft1000_dsp_prov::ft1000_read_register error\n");
- break;
- }
-
- while (tempword & FT1000_DB_DPRAM_TX) {
- mdelay(10);
- i++;
- if (i==10) {
- DEBUG("FT1000:ft1000_dsp_prov:message drop\n");
- return STATUS_FAILURE;
- }
- ft1000_read_register(dev, &tempword, FT1000_REG_DOORBELL);
- }
+ u16 *pmsg;
+ u16 status;
+ u16 TempShortBuf[256];
+
+ DEBUG("*** DspProv Entered\n");
+
+ while (list_empty(&info->prov_list) == 0) {
+ DEBUG("DSP Provisioning List Entry\n");
+
+ /* Check if doorbell is available */
+ DEBUG("check if doorbell is cleared\n");
+ status =
+ ft1000_read_register(dev, &tempword, FT1000_REG_DOORBELL);
+ if (status) {
+ DEBUG("ft1000_dsp_prov::ft1000_read_register error\n");
+ break;
+ }
- if ( !(tempword & FT1000_DB_DPRAM_TX) ) {
- DEBUG("*** Provision Data Sent to DSP\n");
-
- // Send provisioning data
- ptr = list_entry(info->prov_list.next, struct prov_record, list);
- len = *(u16 *)ptr->pprov_data;
- len = htons(len);
- len += PSEUDOSZ;
-
- pmsg = (u16 *)ptr->pprov_data;
- ppseudo_hdr = (struct pseudo_hdr *)pmsg;
- // Insert slow queue sequence number
- ppseudo_hdr->seq_num = info->squeseqnum++;
- ppseudo_hdr->portsrc = 0;
- // Calculate new checksum
- ppseudo_hdr->checksum = *pmsg++;
- //DEBUG("checksum = 0x%x\n", ppseudo_hdr->checksum);
- for (i=1; i<7; i++) {
- ppseudo_hdr->checksum ^= *pmsg++;
- //DEBUG("checksum = 0x%x\n", ppseudo_hdr->checksum);
- }
+ while (tempword & FT1000_DB_DPRAM_TX) {
+ mdelay(10);
+ i++;
+ if (i == 10) {
+ DEBUG("FT1000:ft1000_dsp_prov:message drop\n");
+ return STATUS_FAILURE;
+ }
+ ft1000_read_register(dev, &tempword,
+ FT1000_REG_DOORBELL);
+ }
- TempShortBuf[0] = 0;
- TempShortBuf[1] = htons (len);
- memcpy(&TempShortBuf[2], ppseudo_hdr, len);
+ if (!(tempword & FT1000_DB_DPRAM_TX)) {
+ DEBUG("*** Provision Data Sent to DSP\n");
- status = ft1000_write_dpram32 (dev, 0, (u8 *)&TempShortBuf[0], (unsigned short)(len+2));
- status = ft1000_write_register (dev, FT1000_DB_DPRAM_TX, FT1000_REG_DOORBELL);
+ /* Send provisioning data */
+ ptr =
+ list_entry(info->prov_list.next, struct prov_record,
+ list);
+ len = *(u16 *) ptr->pprov_data;
+ len = htons(len);
+ len += PSEUDOSZ;
- list_del(&ptr->list);
- kfree(ptr->pprov_data);
- kfree(ptr);
- }
- msleep(10);
- }
+ pmsg = (u16 *) ptr->pprov_data;
+ ppseudo_hdr = (struct pseudo_hdr *)pmsg;
+ /* Insert slow queue sequence number */
+ ppseudo_hdr->seq_num = info->squeseqnum++;
+ ppseudo_hdr->portsrc = 0;
+ /* Calculate new checksum */
+ ppseudo_hdr->checksum = *pmsg++;
+ //DEBUG("checksum = 0x%x\n", ppseudo_hdr->checksum);
+ for (i = 1; i < 7; i++) {
+ ppseudo_hdr->checksum ^= *pmsg++;
+ //DEBUG("checksum = 0x%x\n", ppseudo_hdr->checksum);
+ }
+
+ TempShortBuf[0] = 0;
+ TempShortBuf[1] = htons(len);
+ memcpy(&TempShortBuf[2], ppseudo_hdr, len);
+
+ status =
+ ft1000_write_dpram32(dev, 0,
+ (u8 *) &TempShortBuf[0],
+ (unsigned short)(len + 2));
+ status =
+ ft1000_write_register(dev, FT1000_DB_DPRAM_TX,
+ FT1000_REG_DOORBELL);
+
+ list_del(&ptr->list);
+ kfree(ptr->pprov_data);
+ kfree(ptr);
+ }
+ msleep(10);
+ }
- DEBUG("DSP Provisioning List Entry finished\n");
+ DEBUG("DSP Provisioning List Entry finished\n");
- msleep(100);
+ msleep(100);
- info->fProvComplete = 1;
- info->CardReady = 1;
- return STATUS_SUCCESS;
+ info->fProvComplete = 1;
+ info->CardReady = 1;
+ return STATUS_SUCCESS;
}
-
-static int ft1000_proc_drvmsg (struct ft1000_device *dev, u16 size) {
+static int ft1000_proc_drvmsg(struct ft1000_device *dev, u16 size)
+{
struct ft1000_info *info = netdev_priv(dev->net);
- u16 msgtype;
- u16 tempword;
+ u16 msgtype;
+ u16 tempword;
struct media_msg *pmediamsg;
struct dsp_init_msg *pdspinitmsg;
struct drv_msg *pdrvmsg;
- u16 i;
+ u16 i;
struct pseudo_hdr *ppseudo_hdr;
- u16 *pmsg;
- u16 status;
- union {
- u8 byte[2];
- u16 wrd;
- } convert;
-
-
- char *cmdbuffer = kmalloc(1600, GFP_KERNEL);
- if (!cmdbuffer)
- return STATUS_FAILURE;
-
- status = ft1000_read_dpram32(dev, 0x200, cmdbuffer, size);
+ u16 *pmsg;
+ u16 status;
+ union {
+ u8 byte[2];
+ u16 wrd;
+ } convert;
+ char *cmdbuffer = kmalloc(1600, GFP_KERNEL);
+ if (!cmdbuffer)
+ return STATUS_FAILURE;
+ status = ft1000_read_dpram32(dev, 0x200, cmdbuffer, size);
#ifdef JDEBUG
- DEBUG("ft1000_proc_drvmsg:cmdbuffer\n");
- for(i = 0; i < size; i+=5)
- {
- if( (i + 5) < size )
- DEBUG("0x%x, 0x%x, 0x%x, 0x%x, 0x%x\n", cmdbuffer[i], cmdbuffer[i+1], cmdbuffer[i+2], cmdbuffer[i+3], cmdbuffer[i+4]);
- else
- {
- for (j = i; j < size; j++)
- DEBUG("0x%x ", cmdbuffer[j]);
- DEBUG("\n");
- break;
- }
- }
+ DEBUG("ft1000_proc_drvmsg:cmdbuffer\n");
+ for (i = 0; i < size; i += 5) {
+ if ((i + 5) < size)
+ DEBUG("0x%x, 0x%x, 0x%x, 0x%x, 0x%x\n", cmdbuffer[i],
+ cmdbuffer[i + 1], cmdbuffer[i + 2],
+ cmdbuffer[i + 3], cmdbuffer[i + 4]);
+ else {
+ for (j = i; j < size; j++)
+ DEBUG("0x%x ", cmdbuffer[j]);
+ DEBUG("\n");
+ break;
+ }
+ }
#endif
pdrvmsg = (struct drv_msg *)&cmdbuffer[2];
- msgtype = ntohs(pdrvmsg->type);
- DEBUG("ft1000_proc_drvmsg:Command message type = 0x%x\n", msgtype);
- switch (msgtype) {
- case MEDIA_STATE: {
- DEBUG("ft1000_proc_drvmsg:Command message type = MEDIA_STATE");
-
- pmediamsg = (struct media_msg *)&cmdbuffer[0];
- if (info->ProgConStat != 0xFF) {
- if (pmediamsg->state) {
- DEBUG("Media is up\n");
- if (info->mediastate == 0) {
- if ( info->NetDevRegDone )
- {
- //netif_carrier_on(dev->net);//mbelian
- netif_wake_queue(dev->net);
- }
- info->mediastate = 1;
- /*do_gettimeofday(&tv);
- info->ConTm = tv.tv_sec;*/ //mbelian
- }
- }
- else {
- DEBUG("Media is down\n");
- if (info->mediastate == 1) {
- info->mediastate = 0;
- if ( info->NetDevRegDone )
- {
- //netif_carrier_off(dev->net); mbelian
- //netif_stop_queue(dev->net);
- }
- info->ConTm = 0;
- }
- }
- }
- else {
- DEBUG("Media is down\n");
- if (info->mediastate == 1) {
- info->mediastate = 0;
- if ( info->NetDevRegDone)
- {
- //netif_carrier_off(dev->net); //mbelian
- //netif_stop_queue(dev->net);
- }
- info->ConTm = 0;
- }
- }
- break;
- }
- case DSP_INIT_MSG: {
- DEBUG("ft1000_proc_drvmsg:Command message type = DSP_INIT_MSG");
-
- pdspinitmsg = (struct dsp_init_msg *)&cmdbuffer[2];
- memcpy(info->DspVer, pdspinitmsg->DspVer, DSPVERSZ);
- DEBUG("DSPVER = 0x%2x 0x%2x 0x%2x 0x%2x\n", info->DspVer[0], info->DspVer[1], info->DspVer[2], info->DspVer[3]);
- memcpy(info->HwSerNum, pdspinitmsg->HwSerNum, HWSERNUMSZ);
- memcpy(info->Sku, pdspinitmsg->Sku, SKUSZ);
- memcpy(info->eui64, pdspinitmsg->eui64, EUISZ);
- DEBUG("EUI64=%2x.%2x.%2x.%2x.%2x.%2x.%2x.%2x\n", info->eui64[0],info->eui64[1], info->eui64[2], info->eui64[3], info->eui64[4], info->eui64[5],info->eui64[6], info->eui64[7]);
- dev->net->dev_addr[0] = info->eui64[0];
- dev->net->dev_addr[1] = info->eui64[1];
- dev->net->dev_addr[2] = info->eui64[2];
- dev->net->dev_addr[3] = info->eui64[5];
- dev->net->dev_addr[4] = info->eui64[6];
- dev->net->dev_addr[5] = info->eui64[7];
-
- if (ntohs(pdspinitmsg->length) == (sizeof(struct dsp_init_msg) - 20)) {
- memcpy(info->ProductMode, pdspinitmsg->ProductMode, MODESZ);
- memcpy(info->RfCalVer, pdspinitmsg->RfCalVer, CALVERSZ);
- memcpy(info->RfCalDate, pdspinitmsg->RfCalDate, CALDATESZ);
- DEBUG("RFCalVer = 0x%2x 0x%2x\n", info->RfCalVer[0], info->RfCalVer[1]);
- }
- break;
- }
- case DSP_PROVISION: {
- DEBUG("ft1000_proc_drvmsg:Command message type = DSP_PROVISION\n");
-
- // kick off dspprov routine to start provisioning
- // Send provisioning data to DSP
- if (list_empty(&info->prov_list) == 0)
- {
- info->fProvComplete = 0;
- status = ft1000_dsp_prov(dev);
- if (status != STATUS_SUCCESS)
- goto out;
- }
- else {
- info->fProvComplete = 1;
- status = ft1000_write_register (dev, FT1000_DB_HB, FT1000_REG_DOORBELL);
- DEBUG("FT1000:drivermsg:No more DSP provisioning data in dsp image\n");
- }
- DEBUG("ft1000_proc_drvmsg:DSP PROVISION is done\n");
- break;
- }
- case DSP_STORE_INFO: {
- DEBUG("ft1000_proc_drvmsg:Command message type = DSP_STORE_INFO");
-
- DEBUG("FT1000:drivermsg:Got DSP_STORE_INFO\n");
- tempword = ntohs(pdrvmsg->length);
- info->DSPInfoBlklen = tempword;
- if (tempword < (MAX_DSP_SESS_REC-4) ) {
- pmsg = (u16 *)&pdrvmsg->data[0];
- for (i=0; i<((tempword+1)/2); i++) {
- DEBUG("FT1000:drivermsg:dsp info data = 0x%x\n", *pmsg);
- info->DSPInfoBlk[i+10] = *pmsg++;
- }
- }
- else {
- info->DSPInfoBlklen = 0;
- }
- break;
- }
- case DSP_GET_INFO: {
- DEBUG("FT1000:drivermsg:Got DSP_GET_INFO\n");
- // copy dsp info block to dsp
- info->DrvMsgPend = 1;
- // allow any outstanding ioctl to finish
- mdelay(10);
- status = ft1000_read_register(dev, &tempword, FT1000_REG_DOORBELL);
- if (tempword & FT1000_DB_DPRAM_TX) {
- mdelay(10);
- status = ft1000_read_register(dev, &tempword, FT1000_REG_DOORBELL);
- if (tempword & FT1000_DB_DPRAM_TX) {
- mdelay(10);
- status = ft1000_read_register(dev, &tempword, FT1000_REG_DOORBELL);
- if (tempword & FT1000_DB_DPRAM_TX) {
- break;
- }
- }
- }
-
- // Put message into Slow Queue
- // Form Pseudo header
- pmsg = (u16 *)info->DSPInfoBlk;
- *pmsg++ = 0;
- *pmsg++ = htons(info->DSPInfoBlklen+20+info->DSPInfoBlklen);
- ppseudo_hdr = (struct pseudo_hdr *)(u16 *)&info->DSPInfoBlk[2];
- ppseudo_hdr->length = htons(info->DSPInfoBlklen+4+info->DSPInfoBlklen);
- ppseudo_hdr->source = 0x10;
- ppseudo_hdr->destination = 0x20;
- ppseudo_hdr->portdest = 0;
- ppseudo_hdr->portsrc = 0;
- ppseudo_hdr->sh_str_id = 0;
- ppseudo_hdr->control = 0;
- ppseudo_hdr->rsvd1 = 0;
- ppseudo_hdr->rsvd2 = 0;
- ppseudo_hdr->qos_class = 0;
- // Insert slow queue sequence number
- ppseudo_hdr->seq_num = info->squeseqnum++;
- // Insert application id
- ppseudo_hdr->portsrc = 0;
- // Calculate new checksum
- ppseudo_hdr->checksum = *pmsg++;
- for (i=1; i<7; i++) {
- ppseudo_hdr->checksum ^= *pmsg++;
- }
- info->DSPInfoBlk[10] = 0x7200;
- info->DSPInfoBlk[11] = htons(info->DSPInfoBlklen);
- status = ft1000_write_dpram32 (dev, 0, (u8 *)&info->DSPInfoBlk[0], (unsigned short)(info->DSPInfoBlklen+22));
- status = ft1000_write_register (dev, FT1000_DB_DPRAM_TX, FT1000_REG_DOORBELL);
- info->DrvMsgPend = 0;
-
- break;
- }
+ msgtype = ntohs(pdrvmsg->type);
+ DEBUG("ft1000_proc_drvmsg:Command message type = 0x%x\n", msgtype);
+ switch (msgtype) {
+ case MEDIA_STATE:{
+ DEBUG
+ ("ft1000_proc_drvmsg:Command message type = MEDIA_STATE");
+
+ pmediamsg = (struct media_msg *)&cmdbuffer[0];
+ if (info->ProgConStat != 0xFF) {
+ if (pmediamsg->state) {
+ DEBUG("Media is up\n");
+ if (info->mediastate == 0) {
+ if (info->NetDevRegDone) {
+ //netif_carrier_on(dev->net);//mbelian
+ netif_wake_queue(dev->
+ net);
+ }
+ info->mediastate = 1;
+ /*do_gettimeofday(&tv);
+ info->ConTm = tv.tv_sec; *///mbelian
+ }
+ } else {
+ DEBUG("Media is down\n");
+ if (info->mediastate == 1) {
+ info->mediastate = 0;
+ if (info->NetDevRegDone) {
+ //netif_carrier_off(dev->net); mbelian
+ //netif_stop_queue(dev->net);
+ }
+ info->ConTm = 0;
+ }
+ }
+ } else {
+ DEBUG("Media is down\n");
+ if (info->mediastate == 1) {
+ info->mediastate = 0;
+ if (info->NetDevRegDone) {
+ //netif_carrier_off(dev->net); //mbelian
+ //netif_stop_queue(dev->net);
+ }
+ info->ConTm = 0;
+ }
+ }
+ break;
+ }
+ case DSP_INIT_MSG:{
+ DEBUG
+ ("ft1000_proc_drvmsg:Command message type = DSP_INIT_MSG");
+
+ pdspinitmsg = (struct dsp_init_msg *)&cmdbuffer[2];
+ memcpy(info->DspVer, pdspinitmsg->DspVer, DSPVERSZ);
+ DEBUG("DSPVER = 0x%2x 0x%2x 0x%2x 0x%2x\n",
+ info->DspVer[0], info->DspVer[1], info->DspVer[2],
+ info->DspVer[3]);
+ memcpy(info->HwSerNum, pdspinitmsg->HwSerNum,
+ HWSERNUMSZ);
+ memcpy(info->Sku, pdspinitmsg->Sku, SKUSZ);
+ memcpy(info->eui64, pdspinitmsg->eui64, EUISZ);
+ DEBUG("EUI64=%2x.%2x.%2x.%2x.%2x.%2x.%2x.%2x\n",
+ info->eui64[0], info->eui64[1], info->eui64[2],
+ info->eui64[3], info->eui64[4], info->eui64[5],
+ info->eui64[6], info->eui64[7]);
+ dev->net->dev_addr[0] = info->eui64[0];
+ dev->net->dev_addr[1] = info->eui64[1];
+ dev->net->dev_addr[2] = info->eui64[2];
+ dev->net->dev_addr[3] = info->eui64[5];
+ dev->net->dev_addr[4] = info->eui64[6];
+ dev->net->dev_addr[5] = info->eui64[7];
+
+ if (ntohs(pdspinitmsg->length) ==
+ (sizeof(struct dsp_init_msg) - 20)) {
+ memcpy(info->ProductMode,
+ pdspinitmsg->ProductMode, MODESZ);
+ memcpy(info->RfCalVer, pdspinitmsg->RfCalVer,
+ CALVERSZ);
+ memcpy(info->RfCalDate, pdspinitmsg->RfCalDate,
+ CALDATESZ);
+ DEBUG("RFCalVer = 0x%2x 0x%2x\n",
+ info->RfCalVer[0], info->RfCalVer[1]);
+ }
+ break;
+ }
+ case DSP_PROVISION:{
+ DEBUG
+ ("ft1000_proc_drvmsg:Command message type = DSP_PROVISION\n");
+
+ /* kick off dspprov routine to start provisioning
+ * Send provisioning data to DSP
+ */
+ if (list_empty(&info->prov_list) == 0) {
+ info->fProvComplete = 0;
+ status = ft1000_dsp_prov(dev);
+ if (status != STATUS_SUCCESS)
+ goto out;
+ } else {
+ info->fProvComplete = 1;
+ status =
+ ft1000_write_register(dev, FT1000_DB_HB,
+ FT1000_REG_DOORBELL);
+ DEBUG
+ ("FT1000:drivermsg:No more DSP provisioning data in dsp image\n");
+ }
+ DEBUG("ft1000_proc_drvmsg:DSP PROVISION is done\n");
+ break;
+ }
+ case DSP_STORE_INFO:{
+ DEBUG
+ ("ft1000_proc_drvmsg:Command message type = DSP_STORE_INFO");
+
+ DEBUG("FT1000:drivermsg:Got DSP_STORE_INFO\n");
+ tempword = ntohs(pdrvmsg->length);
+ info->DSPInfoBlklen = tempword;
+ if (tempword < (MAX_DSP_SESS_REC - 4)) {
+ pmsg = (u16 *) &pdrvmsg->data[0];
+ for (i = 0; i < ((tempword + 1) / 2); i++) {
+ DEBUG
+ ("FT1000:drivermsg:dsp info data = 0x%x\n",
+ *pmsg);
+ info->DSPInfoBlk[i + 10] = *pmsg++;
+ }
+ } else {
+ info->DSPInfoBlklen = 0;
+ }
+ break;
+ }
+ case DSP_GET_INFO:{
+ DEBUG("FT1000:drivermsg:Got DSP_GET_INFO\n");
+ /* copy dsp info block to dsp */
+ info->DrvMsgPend = 1;
+ /* allow any outstanding ioctl to finish */
+ mdelay(10);
+ status =
+ ft1000_read_register(dev, &tempword,
+ FT1000_REG_DOORBELL);
+ if (tempword & FT1000_DB_DPRAM_TX) {
+ mdelay(10);
+ status =
+ ft1000_read_register(dev, &tempword,
+ FT1000_REG_DOORBELL);
+ if (tempword & FT1000_DB_DPRAM_TX) {
+ mdelay(10);
+ status =
+ ft1000_read_register(dev, &tempword,
+ FT1000_REG_DOORBELL);
+ if (tempword & FT1000_DB_DPRAM_TX)
+ break;
+ }
+ }
+ /* Put message into Slow Queue
+ * Form Pseudo header
+ */
+ pmsg = (u16 *) info->DSPInfoBlk;
+ *pmsg++ = 0;
+ *pmsg++ =
+ htons(info->DSPInfoBlklen + 20 +
+ info->DSPInfoBlklen);
+ ppseudo_hdr =
+ (struct pseudo_hdr *)(u16 *) &info->DSPInfoBlk[2];
+ ppseudo_hdr->length =
+ htons(info->DSPInfoBlklen + 4 +
+ info->DSPInfoBlklen);
+ ppseudo_hdr->source = 0x10;
+ ppseudo_hdr->destination = 0x20;
+ ppseudo_hdr->portdest = 0;
+ ppseudo_hdr->portsrc = 0;
+ ppseudo_hdr->sh_str_id = 0;
+ ppseudo_hdr->control = 0;
+ ppseudo_hdr->rsvd1 = 0;
+ ppseudo_hdr->rsvd2 = 0;
+ ppseudo_hdr->qos_class = 0;
+ /* Insert slow queue sequence number */
+ ppseudo_hdr->seq_num = info->squeseqnum++;
+ /* Insert application id */
+ ppseudo_hdr->portsrc = 0;
+ /* Calculate new checksum */
+ ppseudo_hdr->checksum = *pmsg++;
+ for (i = 1; i < 7; i++)
+ ppseudo_hdr->checksum ^= *pmsg++;
+
+ info->DSPInfoBlk[10] = 0x7200;
+ info->DSPInfoBlk[11] = htons(info->DSPInfoBlklen);
+ status =
+ ft1000_write_dpram32(dev, 0,
+ (u8 *) &info->DSPInfoBlk[0],
+ (unsigned short)(info->
+ DSPInfoBlklen
+ + 22));
+ status =
+ ft1000_write_register(dev, FT1000_DB_DPRAM_TX,
+ FT1000_REG_DOORBELL);
+ info->DrvMsgPend = 0;
+
+ break;
+ }
- case GET_DRV_ERR_RPT_MSG: {
- DEBUG("FT1000:drivermsg:Got GET_DRV_ERR_RPT_MSG\n");
- // copy driver error message to dsp
- info->DrvMsgPend = 1;
- // allow any outstanding ioctl to finish
- mdelay(10);
- status = ft1000_read_register(dev, &tempword, FT1000_REG_DOORBELL);
- if (tempword & FT1000_DB_DPRAM_TX) {
- mdelay(10);
- status = ft1000_read_register(dev, &tempword, FT1000_REG_DOORBELL);
- if (tempword & FT1000_DB_DPRAM_TX) {
- mdelay(10);
- }
- }
-
- if ( (tempword & FT1000_DB_DPRAM_TX) == 0) {
- // Put message into Slow Queue
- // Form Pseudo header
- pmsg = (u16 *)&tempbuffer[0];
- ppseudo_hdr = (struct pseudo_hdr *)pmsg;
- ppseudo_hdr->length = htons(0x0012);
- ppseudo_hdr->source = 0x10;
- ppseudo_hdr->destination = 0x20;
- ppseudo_hdr->portdest = 0;
- ppseudo_hdr->portsrc = 0;
- ppseudo_hdr->sh_str_id = 0;
- ppseudo_hdr->control = 0;
- ppseudo_hdr->rsvd1 = 0;
- ppseudo_hdr->rsvd2 = 0;
- ppseudo_hdr->qos_class = 0;
- // Insert slow queue sequence number
- ppseudo_hdr->seq_num = info->squeseqnum++;
- // Insert application id
- ppseudo_hdr->portsrc = 0;
- // Calculate new checksum
- ppseudo_hdr->checksum = *pmsg++;
- for (i=1; i<7; i++) {
- ppseudo_hdr->checksum ^= *pmsg++;
- }
- pmsg = (u16 *)&tempbuffer[16];
- *pmsg++ = htons(RSP_DRV_ERR_RPT_MSG);
- *pmsg++ = htons(0x000e);
- *pmsg++ = htons(info->DSP_TIME[0]);
- *pmsg++ = htons(info->DSP_TIME[1]);
- *pmsg++ = htons(info->DSP_TIME[2]);
- *pmsg++ = htons(info->DSP_TIME[3]);
- convert.byte[0] = info->DspVer[0];
- convert.byte[1] = info->DspVer[1];
- *pmsg++ = convert.wrd;
- convert.byte[0] = info->DspVer[2];
- convert.byte[1] = info->DspVer[3];
- *pmsg++ = convert.wrd;
- *pmsg++ = htons(info->DrvErrNum);
-
- CardSendCommand (dev, (unsigned char*)&tempbuffer[0], (u16)(0x0012 + PSEUDOSZ));
- info->DrvErrNum = 0;
- }
- info->DrvMsgPend = 0;
-
- break;
- }
-
- default:
- break;
- }
+ case GET_DRV_ERR_RPT_MSG:{
+ DEBUG("FT1000:drivermsg:Got GET_DRV_ERR_RPT_MSG\n");
+ /* copy driver error message to dsp */
+ info->DrvMsgPend = 1;
+ /* allow any outstanding ioctl to finish */
+ mdelay(10);
+ status =
+ ft1000_read_register(dev, &tempword,
+ FT1000_REG_DOORBELL);
+ if (tempword & FT1000_DB_DPRAM_TX) {
+ mdelay(10);
+ status =
+ ft1000_read_register(dev, &tempword,
+ FT1000_REG_DOORBELL);
+ if (tempword & FT1000_DB_DPRAM_TX)
+ mdelay(10);
+ }
+
+ if ((tempword & FT1000_DB_DPRAM_TX) == 0) {
+ /* Put message into Slow Queue
+ * Form Pseudo header
+ */
+ pmsg = (u16 *) &tempbuffer[0];
+ ppseudo_hdr = (struct pseudo_hdr *)pmsg;
+ ppseudo_hdr->length = htons(0x0012);
+ ppseudo_hdr->source = 0x10;
+ ppseudo_hdr->destination = 0x20;
+ ppseudo_hdr->portdest = 0;
+ ppseudo_hdr->portsrc = 0;
+ ppseudo_hdr->sh_str_id = 0;
+ ppseudo_hdr->control = 0;
+ ppseudo_hdr->rsvd1 = 0;
+ ppseudo_hdr->rsvd2 = 0;
+ ppseudo_hdr->qos_class = 0;
+ /* Insert slow queue sequence number */
+ ppseudo_hdr->seq_num = info->squeseqnum++;
+ /* Insert application id */
+ ppseudo_hdr->portsrc = 0;
+ /* Calculate new checksum */
+ ppseudo_hdr->checksum = *pmsg++;
+ for (i = 1; i < 7; i++)
+ ppseudo_hdr->checksum ^= *pmsg++;
+
+ pmsg = (u16 *) &tempbuffer[16];
+ *pmsg++ = htons(RSP_DRV_ERR_RPT_MSG);
+ *pmsg++ = htons(0x000e);
+ *pmsg++ = htons(info->DSP_TIME[0]);
+ *pmsg++ = htons(info->DSP_TIME[1]);
+ *pmsg++ = htons(info->DSP_TIME[2]);
+ *pmsg++ = htons(info->DSP_TIME[3]);
+ convert.byte[0] = info->DspVer[0];
+ convert.byte[1] = info->DspVer[1];
+ *pmsg++ = convert.wrd;
+ convert.byte[0] = info->DspVer[2];
+ convert.byte[1] = info->DspVer[3];
+ *pmsg++ = convert.wrd;
+ *pmsg++ = htons(info->DrvErrNum);
+
+ card_send_command(dev,
+ (unsigned char *)&tempbuffer[0],
+ (u16) (0x0012 + PSEUDOSZ));
+ info->DrvErrNum = 0;
+ }
+ info->DrvMsgPend = 0;
+
+ break;
+ }
+ default:
+ break;
+ }
- status = STATUS_SUCCESS;
+ status = STATUS_SUCCESS;
out:
- kfree(cmdbuffer);
- DEBUG("return from ft1000_proc_drvmsg\n");
- return status;
+ kfree(cmdbuffer);
+ DEBUG("return from ft1000_proc_drvmsg\n");
+ return status;
}
-
-
int ft1000_poll(void* dev_id) {
struct ft1000_device *dev = (struct ft1000_device *)dev_id;
diff --git a/drivers/staging/ft1000/ft1000-usb/ft1000_hw.h b/drivers/staging/ft1000/ft1000-usb/ft1000_hw.h
deleted file mode 100644
index ab9312f..0000000
--- a/drivers/staging/ft1000/ft1000-usb/ft1000_hw.h
+++ /dev/null
@@ -1,10 +0,0 @@
-
-#ifndef _FT1000_HW_H_
-#define _FT1000_HW_H_
-
-#include "ft1000_usb.h"
-
-extern u16 ft1000_read_register(struct usb_device *dev, u16 *Data, u8 nRegIndx);
-extern u16 ft1000_write_register(struct usb_device *dev, u16 value, u8 nRegIndx);
-
-#endif
diff --git a/drivers/staging/ft1000/ft1000-usb/ft1000_proc.c b/drivers/staging/ft1000/ft1000-usb/ft1000_proc.c
index b87542a..5ae3967 100644
--- a/drivers/staging/ft1000/ft1000-usb/ft1000_proc.c
+++ b/drivers/staging/ft1000/ft1000-usb/ft1000_proc.c
@@ -51,7 +51,7 @@
#define FTNET_PROC init_net.proc_net
-u16 ft1000_read_dpram16 (struct ft1000_device *ft1000dev, u16 indx,
+int ft1000_read_dpram16 (struct ft1000_device *ft1000dev, u16 indx,
u8 *buffer, u8 highlow);
diff --git a/drivers/staging/ft1000/ft1000-usb/ft1000_usb.h b/drivers/staging/ft1000/ft1000-usb/ft1000_usb.h
index a143e9c..e047c03 100644
--- a/drivers/staging/ft1000/ft1000-usb/ft1000_usb.h
+++ b/drivers/staging/ft1000/ft1000-usb/ft1000_usb.h
@@ -560,14 +560,14 @@ struct dpram_blk {
u16 *pbuffer;
} __attribute__ ((packed));
-u16 ft1000_read_register(struct ft1000_device *ft1000dev, u16* Data, u16 nRegIndx);
-u16 ft1000_write_register(struct ft1000_device *ft1000dev, u16 value, u16 nRegIndx);
-u16 ft1000_read_dpram32(struct ft1000_device *ft1000dev, u16 indx, u8 *buffer, u16 cnt);
-u16 ft1000_write_dpram32(struct ft1000_device *ft1000dev, u16 indx, u8 *buffer, u16 cnt);
-u16 ft1000_read_dpram16(struct ft1000_device *ft1000dev, u16 indx, u8 *buffer, u8 highlow);
-u16 ft1000_write_dpram16(struct ft1000_device *ft1000dev, u16 indx, u16 value, u8 highlow);
-u16 fix_ft1000_read_dpram32(struct ft1000_device *ft1000dev, u16 indx, u8 *buffer);
-u16 fix_ft1000_write_dpram32(struct ft1000_device *ft1000dev, u16 indx, u8 *buffer);
+int ft1000_read_register(struct ft1000_device *ft1000dev, u16* Data, u16 nRegIndx);
+int ft1000_write_register(struct ft1000_device *ft1000dev, u16 value, u16 nRegIndx);
+int ft1000_read_dpram32(struct ft1000_device *ft1000dev, u16 indx, u8 *buffer, u16 cnt);
+int ft1000_write_dpram32(struct ft1000_device *ft1000dev, u16 indx, u8 *buffer, u16 cnt);
+int ft1000_read_dpram16(struct ft1000_device *ft1000dev, u16 indx, u8 *buffer, u8 highlow);
+int ft1000_write_dpram16(struct ft1000_device *ft1000dev, u16 indx, u16 value, u8 highlow);
+int fix_ft1000_read_dpram32(struct ft1000_device *ft1000dev, u16 indx, u8 *buffer);
+int fix_ft1000_write_dpram32(struct ft1000_device *ft1000dev, u16 indx, u8 *buffer);
extern void *pFileStart;
extern size_t FileLength;
@@ -581,7 +581,7 @@ extern spinlock_t free_buff_lock; // lock to arbitrate free buffer list for re
int ft1000_create_dev(struct ft1000_device *dev);
void ft1000_destroy_dev(struct net_device *dev);
-extern void CardSendCommand(struct ft1000_device *ft1000dev, void *ptempbuffer, int size);
+extern void card_send_command(struct ft1000_device *ft1000dev, void *ptempbuffer, int size);
struct dpram_blk *ft1000_get_buffer(struct list_head *bufflist);
void ft1000_free_buffer(struct dpram_blk *pdpram_blk, struct list_head *plist);
@@ -589,7 +589,7 @@ void ft1000_free_buffer(struct dpram_blk *pdpram_blk, struct list_head *plist);
char *getfw (char *fn, size_t *pimgsz);
int dsp_reload(struct ft1000_device *ft1000dev);
-u16 init_ft1000_netdev(struct ft1000_device *ft1000dev);
+int init_ft1000_netdev(struct ft1000_device *ft1000dev);
struct usb_interface;
int reg_ft1000_netdev(struct ft1000_device *ft1000dev, struct usb_interface *intf);
int ft1000_poll(void* dev_id);