Commit 3aa2303a authored by Ondrej Zary's avatar Ondrej Zary Committed by Greg Kroah-Hartman
Browse files

staging: ft1000: unify struct ft1000_info between USB and PCMCIA drivers



Unify struct ft1000_info between ft1000-usb and ft1000-pcmcia and move it to
common ft1000.h.

Signed-off-by: default avatarOndrej Zary <linux@rainbow-software.org>
Tested-by: default avatarMarek Belisko <marek.belisko@open-nandra.com>
Review-by: default avatarMarek Belisko <marek.belisko@open-nandra.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 8d915d8c
Loading
Loading
Loading
Loading
+1 −32
Original line number Diff line number Diff line
@@ -31,41 +31,10 @@
#define SUCCESS	0x00
#define FAILURE	0x01

struct ft1000_info {
	struct net_device_stats stats;
	u16 DrvErrNum;
	u16 AsicID;
struct ft1000_pcmcia {
	int PktIntfErr;
	int CardReady;
	int registered;
	int mediastate;
	u16 packetseqnum;
	u8 squeseqnum;			/* sequence number on slow queue */
	spinlock_t dpram_lock;
	u16 fifo_cnt;
	u8 DspVer[DSPVERSZ];		/* DSP version number */
	u8 HwSerNum[HWSERNUMSZ];	/* Hardware Serial Number */
	u8 Sku[SKUSZ];			/* SKU */
	u8 eui64[EUISZ];		/* EUI64 */
	time_t ConTm;			/* Connection Time */
	u16 LedStat;
	u16 ConStat;
	u16 ProgConStat;
	u8 ProductMode[MODESZ];
	u8 RfCalVer[CALVERSZ];
	u8 RfCalDate[CALDATESZ];
	u16 DSP_TIME[4];
	struct list_head prov_list;
	u16 DSPInfoBlklen;
	int (*ft1000_reset)(void *);
	void *link;
	u16 DSPInfoBlk[MAX_DSP_SESS_REC];
	union {
		u16 Rec[MAX_DSP_SESS_REC];
		u32 MagRec[MAX_DSP_SESS_REC/2];
	} DSPSess;
	struct proc_dir_entry *proc_ft1000;
	char netdevname[IFNAMSIZ];
};

struct pcmcia_device;
+15 −6
Original line number Diff line number Diff line
@@ -328,11 +328,12 @@ static void ft1000_disable_interrupts(struct net_device *dev)
static void ft1000_reset_asic(struct net_device *dev)
{
	struct ft1000_info *info = netdev_priv(dev);
	struct ft1000_pcmcia *pcmcia = info->priv;
	u16 tempword;

	DEBUG(1, "ft1000_hw:ft1000_reset_asic called\n");

	(*info->ft1000_reset) (info->link);
	(*info->ft1000_reset) (pcmcia->link);

	// Let's use the register provided by the Magnemite ASIC to reset the
	// ASIC and DSP.
@@ -1397,12 +1398,13 @@ static int ft1000_parse_dpram_msg(struct net_device *dev)
static void ft1000_flush_fifo(struct net_device *dev, u16 DrvErrNum)
{
	struct ft1000_info *info = netdev_priv(dev);
	struct ft1000_pcmcia *pcmcia = info->priv;
	u16 i;
	u32 templong;
	u16 tempword;

	DEBUG(1, "ft1000:ft1000_hw:ft1000_flush_fifo called\n");
	if (info->PktIntfErr > MAX_PH_ERR) {
	if (pcmcia->PktIntfErr > MAX_PH_ERR) {
		if (info->AsicID == ELECTRABUZZ_ID) {
			info->DSP_TIME[0] =
				ft1000_read_dpram(dev, FT1000_DSP_TIMER0);
@@ -1491,7 +1493,7 @@ static void ft1000_flush_fifo(struct net_device *dev, u16 DrvErrNum)
							FIFO_FLUSH_BADCNT;
					} else {
						// Let's assume that we really flush the FIFO
						info->PktIntfErr++;
						pcmcia->PktIntfErr++;
						return;
					}
				} else {
@@ -1522,7 +1524,7 @@ static void ft1000_flush_fifo(struct net_device *dev, u16 DrvErrNum)
			DEBUG(0, "FT1000_REG_MAG_DFSR = 0x%x\n", tempword);
		}
		if (DrvErrNum) {
			info->PktIntfErr++;
			pcmcia->PktIntfErr++;
		}
	}
}
@@ -1731,6 +1733,7 @@ static int ft1000_copy_up_pkt(struct net_device *dev)
static int ft1000_copy_down_pkt(struct net_device *dev, u16 * packet, u16 len)
{
	struct ft1000_info *info = netdev_priv(dev);
	struct ft1000_pcmcia *pcmcia = info->priv;
	union {
		struct pseudo_hdr blk;
		u16 buff[sizeof(struct pseudo_hdr) >> 1];
@@ -1780,7 +1783,7 @@ static int ft1000_copy_down_pkt(struct net_device *dev, u16 * packet, u16 len)
	pseudo.blk.control = 0;
	pseudo.blk.rsvd1 = 0;
	pseudo.blk.seq_num = 0;
	pseudo.blk.rsvd2 = info->packetseqnum++;
	pseudo.blk.rsvd2 = pcmcia->packetseqnum++;
	pseudo.blk.qos_class = 0;
	/* Calculate pseudo header checksum */
	pseudo.blk.checksum = pseudo.buff[0];
@@ -2058,6 +2061,8 @@ void stop_ft1000_card(struct net_device *dev)
		kfree(ptr);
	}

	kfree(info->priv);

	if (info->registered) {
		unregister_netdev(dev);
		info->registered = 0;
@@ -2100,6 +2105,7 @@ struct net_device *init_ft1000_card(struct pcmcia_device *link,
						void *ft1000_reset)
{
	struct ft1000_info *info;
	struct ft1000_pcmcia *pcmcia;
	struct net_device *dev;

	static const struct net_device_ops ft1000ops =		// Slavius 21.10.2009 due to kernel changes
@@ -2141,10 +2147,13 @@ struct net_device *init_ft1000_card(struct pcmcia_device *link,

	memset(&info->stats, 0, sizeof(struct net_device_stats));

	info->priv = kzalloc(sizeof(struct ft1000_pcmcia), GFP_KERNEL);
	pcmcia = info->priv;
	pcmcia->link = link;

	spin_lock_init(&info->dpram_lock);
	info->DrvErrNum = 0;
	info->registered = 1;
	info->link = link;
	info->ft1000_reset = ft1000_reset;
	info->mediastate = 0;
	info->fifo_cnt = 0;
+5 −5
Original line number Diff line number Diff line
@@ -175,8 +175,8 @@ static int ft1000NotifyProc(struct notifier_block *this, unsigned long event,

	switch (event) {
	case NETDEV_CHANGENAME:
		remove_proc_entry(info->netdevname, info->proc_ft1000);
		create_proc_read_entry(dev->name, 0644, info->proc_ft1000,
		remove_proc_entry(info->netdevname, info->ft1000_proc_dir);
		create_proc_read_entry(dev->name, 0644, info->ft1000_proc_dir,
					   ft1000ReadProc, dev);
		snprintf(info->netdevname, IFNAMSIZ, "%s", dev->name);
		break;
@@ -194,8 +194,8 @@ void ft1000InitProc(struct net_device *dev)

	info = netdev_priv(dev);

	info->proc_ft1000 = proc_mkdir(FT1000_PROC, init_net.proc_net);
	create_proc_read_entry(dev->name, 0644, info->proc_ft1000,
	info->ft1000_proc_dir = proc_mkdir(FT1000_PROC, init_net.proc_net);
	create_proc_read_entry(dev->name, 0644, info->ft1000_proc_dir,
				   ft1000ReadProc, dev);
	snprintf(info->netdevname, IFNAMSIZ, "%s", dev->name);
	register_netdevice_notifier(&ft1000_netdev_notifier);
@@ -207,7 +207,7 @@ void ft1000CleanupProc(struct net_device *dev)

	info = netdev_priv(dev);

	remove_proc_entry(dev->name, info->proc_ft1000);
	remove_proc_entry(dev->name, info->ft1000_proc_dir);
	remove_proc_entry(FT1000_PROC, init_net.proc_net);
	unregister_netdevice_notifier(&ft1000_netdev_notifier);
}
+74 −73
Original line number Diff line number Diff line
@@ -139,27 +139,26 @@ void ft1000_free_buffer(struct dpram_blk *pdpram_blk, struct list_head *plist)
//---------------------------------------------------------------------------
int ft1000_create_dev(struct ft1000_device *dev)
{
	struct ft1000_info *info = netdev_priv(dev->net);
    int result;
    int i;
	struct dentry *dir, *file;
	struct ft1000_debug_dirs *tmp;

    // make a new device name
    sprintf(info->DeviceName, "%s%d", "FT1000_", info->CardNumber);
    sprintf(dev->DeviceName, "%s%d", "FT1000_", dev->CardNumber);

    DEBUG("%s: number of instance = %d\n", __func__, ft1000_flarion_cnt);
    DEBUG("DeviceCreated = %x\n", info->DeviceCreated);
    DEBUG("DeviceCreated = %x\n", dev->DeviceCreated);

    if (info->DeviceCreated)
    if (dev->DeviceCreated)
    {
	DEBUG("%s: \"%s\" already registered\n", __func__, info->DeviceName);
	DEBUG("%s: \"%s\" already registered\n", __func__, dev->DeviceName);
	return -EIO;
    }


    // register the device
    DEBUG("%s: \"%s\" debugfs device registration\n", __func__, info->DeviceName);
    DEBUG("%s: \"%s\" debugfs device registration\n", __func__, dev->DeviceName);

	tmp = kmalloc(sizeof(struct ft1000_debug_dirs), GFP_KERNEL);
	if (tmp == NULL) {
@@ -167,7 +166,7 @@ int ft1000_create_dev(struct ft1000_device *dev)
		goto fail;
	}

	dir = debugfs_create_dir(info->DeviceName, NULL);
	dir = debugfs_create_dir(dev->DeviceName, NULL);
	if (IS_ERR(dir)) {
		result = PTR_ERR(dir);
		goto debug_dir_fail;
@@ -182,27 +181,27 @@ int ft1000_create_dev(struct ft1000_device *dev)

	tmp->dent = dir;
	tmp->file = file;
	tmp->int_number = info->CardNumber;
	list_add(&(tmp->list), &(info->nodes.list));
	tmp->int_number = dev->CardNumber;
	list_add(&(tmp->list), &(dev->nodes.list));

    DEBUG("%s: registered debugfs directory \"%s\"\n", __func__, info->DeviceName);
    DEBUG("%s: registered debugfs directory \"%s\"\n", __func__, dev->DeviceName);

    // initialize application information
    info->appcnt = 0;
    dev->appcnt = 0;
    for (i=0; i<MAX_NUM_APP; i++) {
        info->app_info[i].nTxMsg = 0;
        info->app_info[i].nRxMsg = 0;
        info->app_info[i].nTxMsgReject = 0;
        info->app_info[i].nRxMsgMiss = 0;
        info->app_info[i].fileobject = NULL;
        info->app_info[i].app_id = i+1;
        info->app_info[i].DspBCMsgFlag = 0;
        info->app_info[i].NumOfMsg = 0;
        init_waitqueue_head(&info->app_info[i].wait_dpram_msg);
        INIT_LIST_HEAD (&info->app_info[i].app_sqlist);
    }

    info->DeviceCreated = TRUE;
        dev->app_info[i].nTxMsg = 0;
        dev->app_info[i].nRxMsg = 0;
        dev->app_info[i].nTxMsgReject = 0;
        dev->app_info[i].nRxMsgMiss = 0;
        dev->app_info[i].fileobject = NULL;
        dev->app_info[i].app_id = i+1;
        dev->app_info[i].DspBCMsgFlag = 0;
        dev->app_info[i].NumOfMsg = 0;
        init_waitqueue_head(&dev->app_info[i].wait_dpram_msg);
        INIT_LIST_HEAD (&dev->app_info[i].app_sqlist);
    }

    dev->DeviceCreated = TRUE;
    ft1000_flarion_cnt++;

	return 0;
@@ -225,9 +224,10 @@ int ft1000_create_dev(struct ft1000_device *dev)
// Notes:       Only called by cleanup_module().
//
//---------------------------------------------------------------------------
void ft1000_destroy_dev(struct net_device *dev)
void ft1000_destroy_dev(struct net_device *netdev)
{
	struct ft1000_info *info = netdev_priv(dev);
	struct ft1000_info *info = netdev_priv(netdev);
	struct ft1000_device *dev = info->priv;
		int i;
	struct dpram_blk *pdpram_blk;
	struct dpram_blk *ptr;
@@ -238,12 +238,12 @@ void ft1000_destroy_dev(struct net_device *dev)



    if (info->DeviceCreated)
    if (dev->DeviceCreated)
	{
        ft1000_flarion_cnt--;
		list_for_each_safe(pos, q, &info->nodes.list) {
		list_for_each_safe(pos, q, &dev->nodes.list) {
			dir = list_entry(pos, struct ft1000_debug_dirs, list);
			if (dir->int_number == info->CardNumber) {
			if (dir->int_number == dev->CardNumber) {
				debugfs_remove(dir->file);
				debugfs_remove(dir->dent);
				list_del(pos);
@@ -251,17 +251,17 @@ void ft1000_destroy_dev(struct net_device *dev)
			}
		}
		DEBUG("%s: unregistered device \"%s\"\n", __func__,
					   info->DeviceName);
					   dev->DeviceName);

        // Make sure we free any memory reserve for slow Queue
        for (i=0; i<MAX_NUM_APP; i++) {
            while (list_empty(&info->app_info[i].app_sqlist) == 0) {
                pdpram_blk = list_entry(info->app_info[i].app_sqlist.next, struct dpram_blk, list);
            while (list_empty(&dev->app_info[i].app_sqlist) == 0) {
                pdpram_blk = list_entry(dev->app_info[i].app_sqlist.next, struct dpram_blk, list);
                list_del(&pdpram_blk->list);
                ft1000_free_buffer(pdpram_blk, &freercvpool);

            }
            wake_up_interruptible(&info->app_info[i].wait_dpram_msg);
            wake_up_interruptible(&dev->app_info[i].wait_dpram_msg);
        }

        // Remove buffer allocated for receive command data
@@ -273,7 +273,7 @@ void ft1000_destroy_dev(struct net_device *dev)
                kfree(ptr);
            }
        }
		info->DeviceCreated = FALSE;
		dev->DeviceCreated = FALSE;
	}


@@ -301,17 +301,17 @@ static int ft1000_open (struct inode *inode, struct file *file)

	info = file->private_data = netdev_priv(dev->net);

    DEBUG("f_owner = %p number of application = %d\n", (&file->f_owner), info->appcnt );
    DEBUG("f_owner = %p number of application = %d\n", (&file->f_owner), dev->appcnt );

    // Check if maximum number of application exceeded
    if (info->appcnt > MAX_NUM_APP) {
    if (dev->appcnt > MAX_NUM_APP) {
        DEBUG("Maximum number of application exceeded\n");
        return -EACCES;
    }

    // Search for available application info block
    for (i=0; i<MAX_NUM_APP; i++) {
        if ( (info->app_info[i].fileobject == NULL) ) {
        if ( (dev->app_info[i].fileobject == NULL) ) {
            break;
        }
    }
@@ -322,12 +322,12 @@ static int ft1000_open (struct inode *inode, struct file *file)
        return -EACCES;
    }

    info->appcnt++;
    info->app_info[i].fileobject = &file->f_owner;
    info->app_info[i].nTxMsg = 0;
    info->app_info[i].nRxMsg = 0;
    info->app_info[i].nTxMsgReject = 0;
    info->app_info[i].nRxMsgMiss = 0;
    dev->appcnt++;
    dev->app_info[i].fileobject = &file->f_owner;
    dev->app_info[i].nTxMsg = 0;
    dev->app_info[i].nRxMsg = 0;
    dev->app_info[i].nTxMsgReject = 0;
    dev->app_info[i].nRxMsgMiss = 0;

	nonseekable_open(inode, file);
    return 0;
@@ -347,8 +347,9 @@ static int ft1000_open (struct inode *inode, struct file *file)

static unsigned int ft1000_poll_dev(struct file *file, poll_table *wait)
{
    struct net_device *dev = file->private_data;
	struct ft1000_info *info;
    struct net_device *netdev = file->private_data;
	struct ft1000_info *info = netdev_priv(netdev);
	struct ft1000_device *dev = info->priv;
    int i;

    //DEBUG("ft1000_poll_dev called\n");
@@ -357,12 +358,10 @@ static unsigned int ft1000_poll_dev(struct file *file, poll_table *wait)
        return (-EBADF);
    }

	info = netdev_priv(dev);

    // Search for matching file object
    for (i=0; i<MAX_NUM_APP; i++) {
        if ( info->app_info[i].fileobject == &file->f_owner) {
            //DEBUG("FT1000:ft1000_ioctl: Message is for AppId = %d\n", info->app_info[i].app_id);
        if ( dev->app_info[i].fileobject == &file->f_owner) {
            //DEBUG("FT1000:ft1000_ioctl: Message is for AppId = %d\n", dev->app_info[i].app_id);
            break;
        }
    }
@@ -373,12 +372,12 @@ static unsigned int ft1000_poll_dev(struct file *file, poll_table *wait)
        return ( -EACCES );
    }

    if (list_empty(&info->app_info[i].app_sqlist) == 0) {
    if (list_empty(&dev->app_info[i].app_sqlist) == 0) {
        DEBUG("FT1000:ft1000_poll_dev:Message detected in slow queue\n");
        return(POLLIN | POLLRDNORM | POLLPRI);
    }

    poll_wait (file, &info->app_info[i].wait_dpram_msg, wait);
    poll_wait (file, &dev->app_info[i].wait_dpram_msg, wait);
    //DEBUG("FT1000:ft1000_poll_dev:Polling for data from DSP\n");

    return (0);
@@ -428,7 +427,7 @@ static long ft1000_ioctl (struct file *file, unsigned int command,
    //DEBUG("FT1000:ft1000_ioctl:command = 0x%x argument = 0x%8x\n", command, (u32)argument);

	info = file->private_data;
	ft1000dev = info->pFt1000Dev;
	ft1000dev = info->priv;
    cmd = _IOC_NR(command);
    //DEBUG("FT1000:ft1000_ioctl:cmd = 0x%x\n", cmd);

@@ -444,8 +443,8 @@ static long ft1000_ioctl (struct file *file, unsigned int command,
            if (tempword == DSPBCMSGID) {
                // Search for matching file object
                for (i=0; i<MAX_NUM_APP; i++) {
                    if ( info->app_info[i].fileobject == &file->f_owner) {
                        info->app_info[i].DspBCMsgFlag = 1;
                    if (ft1000dev->app_info[i].fileobject == &file->f_owner) {
                        ft1000dev->app_info[i].DspBCMsgFlag = 1;
                        DEBUG("FT1000:ft1000_ioctl:Registered for broadcast messages\n");
                        break;
                    }
@@ -534,15 +533,15 @@ static long ft1000_ioctl (struct file *file, unsigned int command,
                return (-EBADF);
            }

            if (info->DrvMsgPend) {
            if (ft1000dev->DrvMsgPend) {
                return (-ENOTTY);
            }

            if ( (info->DspAsicReset) || (info->fProvComplete == 0) ) {
            if (ft1000dev->fProvComplete == 0) {
                return (-EACCES);
            }

            info->fAppMsgPend = 1;
            ft1000dev->fAppMsgPend = 1;

            if (info->CardReady) {

@@ -571,7 +570,7 @@ static long ft1000_ioctl (struct file *file, unsigned int command,
                else {
                    // Check if this message came from a registered application
                    for (i=0; i<MAX_NUM_APP; i++) {
                        if ( info->app_info[i].fileobject == &file->f_owner) {
                        if (ft1000dev->app_info[i].fileobject == &file->f_owner) {
                            break;
                        }
                    }
@@ -632,7 +631,7 @@ static long ft1000_ioctl (struct file *file, unsigned int command,

                            // Insert slow queue sequence number
                            ppseudo_hdr->seq_num = info->squeseqnum++;
                            ppseudo_hdr->portsrc = info->app_info[app_index].app_id;
                            ppseudo_hdr->portsrc = ft1000dev->app_info[app_index].app_id;
                            // Calculate new checksum
                            ppseudo_hdr->checksum = *pmsg++;
                            //DEBUG("checksum = 0x%x\n", ppseudo_hdr->checksum);
@@ -645,7 +644,7 @@ static long ft1000_ioctl (struct file *file, unsigned int command,
                           card_send_command(ft1000dev,(unsigned short*)dpram_data,total_len+2);


                            info->app_info[app_index].nTxMsg++;
                            ft1000dev->app_info[app_index].nTxMsg++;
                        }
                        else {
                            result = -EINVAL;
@@ -675,8 +674,8 @@ static long ft1000_ioctl (struct file *file, unsigned int command,

            // Search for matching file object
            for (i=0; i<MAX_NUM_APP; i++) {
                if ( info->app_info[i].fileobject == &file->f_owner) {
                    //DEBUG("FT1000:ft1000_ioctl: Message is for AppId = %d\n", info->app_info[i].app_id);
                if (ft1000dev->app_info[i].fileobject == &file->f_owner) {
                    //DEBUG("FT1000:ft1000_ioctl: Message is for AppId = %d\n", ft1000dev->app_info[i].app_id);
                    break;
                }
            }
@@ -690,13 +689,13 @@ static long ft1000_ioctl (struct file *file, unsigned int command,

            result = 0;
            pioctl_dpram = argp;
            if (list_empty(&info->app_info[i].app_sqlist) == 0) {
            if (list_empty(&ft1000dev->app_info[i].app_sqlist) == 0) {
                //DEBUG("FT1000:ft1000_ioctl:Message detected in slow queue\n");
                spin_lock_irqsave(&free_buff_lock, flags);
                pdpram_blk = list_entry(info->app_info[i].app_sqlist.next, struct dpram_blk, list);
                pdpram_blk = list_entry(ft1000dev->app_info[i].app_sqlist.next, struct dpram_blk, list);
                list_del(&pdpram_blk->list);
                info->app_info[i].NumOfMsg--;
                //DEBUG("FT1000:ft1000_ioctl:NumOfMsg for app %d = %d\n", i, info->app_info[i].NumOfMsg);
                ft1000dev->app_info[i].NumOfMsg--;
                //DEBUG("FT1000:ft1000_ioctl:NumOfMsg for app %d = %d\n", i, ft1000dev->app_info[i].NumOfMsg);
                spin_unlock_irqrestore(&free_buff_lock, flags);
                msglen = ntohs(*(u16 *)pdpram_blk->pbuffer) + PSEUDOSZ;
                result = get_user(msglen, &pioctl_dpram->total_len);
@@ -723,7 +722,7 @@ static long ft1000_ioctl (struct file *file, unsigned int command,
        result = -ENOTTY;
        break;
    }
    info->fAppMsgPend = 0;
    ft1000dev->fAppMsgPend = 0;
    return result;
}

@@ -741,6 +740,7 @@ static int ft1000_release (struct inode *inode, struct file *file)
{
	struct ft1000_info *info;
    struct net_device *dev;
    struct ft1000_device *ft1000dev;
    int i;
	struct dpram_blk *pdpram_blk;

@@ -748,16 +748,17 @@ static int ft1000_release (struct inode *inode, struct file *file)

    dev = file->private_data;
	info = netdev_priv(dev);
	ft1000dev = info->priv;

    if (ft1000_flarion_cnt == 0) {
        info->appcnt--;
        ft1000dev->appcnt--;
        return (-EBADF);
    }

    // Search for matching file object
    for (i=0; i<MAX_NUM_APP; i++) {
        if ( info->app_info[i].fileobject == &file->f_owner) {
            //DEBUG("FT1000:ft1000_ioctl: Message is for AppId = %d\n", info->app_info[i].app_id);
        if ( ft1000dev->app_info[i].fileobject == &file->f_owner) {
            //DEBUG("FT1000:ft1000_ioctl: Message is for AppId = %d\n", ft1000dev->app_info[i].app_id);
            break;
        }
    }
@@ -765,17 +766,17 @@ static int ft1000_release (struct inode *inode, struct file *file)
    if (i==MAX_NUM_APP)
	    return 0;

    while (list_empty(&info->app_info[i].app_sqlist) == 0) {
    while (list_empty(&ft1000dev->app_info[i].app_sqlist) == 0) {
        DEBUG("Remove and free memory queue up on slow queue\n");
        pdpram_blk = list_entry(info->app_info[i].app_sqlist.next, struct dpram_blk, list);
        pdpram_blk = list_entry(ft1000dev->app_info[i].app_sqlist.next, struct dpram_blk, list);
        list_del(&pdpram_blk->list);
        ft1000_free_buffer(pdpram_blk, &freercvpool);
    }

    // initialize application information
    info->appcnt--;
    DEBUG("ft1000_chdev:%s:appcnt = %d\n", __FUNCTION__, info->appcnt);
    info->app_info[i].fileobject = NULL;
    ft1000dev->appcnt--;
    DEBUG("ft1000_chdev:%s:appcnt = %d\n", __FUNCTION__, ft1000dev->appcnt);
    ft1000dev->app_info[i].fileobject = NULL;

    return 0;
}
+32 −38
Original line number Diff line number Diff line
@@ -188,7 +188,6 @@ static u16 get_handshake(struct ft1000_device *ft1000dev, u16 expected_value)
	u16 handshake;
	int loopcnt;
	u32 status = 0;
	struct ft1000_info *pft1000info = netdev_priv(ft1000dev->net);

	loopcnt = 0;

@@ -196,10 +195,10 @@ static u16 get_handshake(struct ft1000_device *ft1000dev, u16 expected_value)
		/* Need to clear downloader doorbell if Hartley ASIC */
		status = ft1000_write_register(ft1000dev,  FT1000_DB_DNLD_RX,
						FT1000_REG_DOORBELL);
		if (pft1000info->fcodeldr) {
		if (ft1000dev->fcodeldr) {
			DEBUG(" get_handshake: fcodeldr is %d\n",
				pft1000info->fcodeldr);
			pft1000info->fcodeldr = 0;
				ft1000dev->fcodeldr);
			ft1000dev->fcodeldr = 0;
			status = check_usb_db(ft1000dev);
			if (status != STATUS_SUCCESS) {
				DEBUG("get_handshake: check_usb_db failed\n");
@@ -270,29 +269,28 @@ static u16 get_handshake_usb(struct ft1000_device *ft1000dev, u16 expected_value
	u16 temp;
	u32 status = 0;

	struct ft1000_info *pft1000info = netdev_priv(ft1000dev->net);
	loopcnt = 0;
	handshake = 0;

	while (loopcnt < 100) {
		if (pft1000info->usbboot == 2) {
		if (ft1000dev->usbboot == 2) {
			status = ft1000_read_dpram32(ft1000dev, 0,
					(u8 *)&(pft1000info->tempbuf[0]), 64);
					(u8 *)&(ft1000dev->tempbuf[0]), 64);
			for (temp = 0; temp < 16; temp++) {
				DEBUG("tempbuf %d = 0x%x\n", temp,
					pft1000info->tempbuf[temp]);
					ft1000dev->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]) {
			if (ft1000dev->dspalive == ft1000dev->tempbuf[6]) {
				handshake = 0;
			} else {
				handshake = pft1000info->tempbuf[1];
				pft1000info->dspalive =
						pft1000info->tempbuf[6];
				handshake = ft1000dev->tempbuf[1];
				ft1000dev->dspalive =
						ft1000dev->tempbuf[6];
			}
		} else {
			status = ft1000_read_dpram16(ft1000dev,
@@ -336,9 +334,8 @@ static u16 get_request_type(struct ft1000_device *ft1000dev)
	u32 status;
	u16 tempword;
	u32 tempx;
	struct ft1000_info *pft1000info = netdev_priv(ft1000dev->net);

	if (pft1000info->bootmode == 1) {
	if (ft1000dev->bootmode == 1) {
		status = fix_ft1000_read_dpram32(ft1000dev,
				DWNLD_MAG1_TYPE_LOC, (u8 *)&tempx);
		tempx = ntohl(tempx);
@@ -360,16 +357,15 @@ static u16 get_request_type_usb(struct ft1000_device *ft1000dev)
	u32 status;
	u16 tempword;
	u32 tempx;
	struct ft1000_info *pft1000info = netdev_priv(ft1000dev->net);

	if (pft1000info->bootmode == 1) {
	if (ft1000dev->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];
		if (ft1000dev->usbboot == 2) {
			tempx = ft1000dev->tempbuf[2];
			tempword = ft1000dev->tempbuf[3];
		} else {
			tempx = 0;
			status = ft1000_read_dpram16(ft1000dev,
@@ -401,9 +397,8 @@ static long get_request_value(struct ft1000_device *ft1000dev)
	u32 value;
	u16 tempword;
	u32 status;
	struct ft1000_info *pft1000info = netdev_priv(ft1000dev->net);

	if (pft1000info->bootmode == 1) {
	if (ft1000dev->bootmode == 1) {
		status = fix_ft1000_read_dpram32(ft1000dev,
				DWNLD_MAG1_SIZE_LOC, (u8 *)&value);
		value = ntohl(value);
@@ -507,7 +502,6 @@ static u32 write_blk (struct ft1000_device *ft1000dev, u16 **pUsFile, u8 **pUcFi
   u16 tempword;
   u16 tempbuffer[64];
   u16 resultbuffer[64];
	struct ft1000_info *pft1000info = netdev_priv(ft1000dev->net);

   //DEBUG("FT1000:download:start word_length = %d\n",(int)word_length);
   dpram = (u16)DWNLD_MAG1_PS_HDR_LOC;
@@ -548,7 +542,7 @@ static u32 write_blk (struct ft1000_device *ft1000dev, u16 **pUsFile, u8 **pUcFi
              //DEBUG("write_blk: loopcnt is %d\n", loopcnt);
              //DEBUG("write_blk: bootmode = %d\n", bootmode);
              //DEBUG("write_blk: dpram = %x\n", dpram);
	      if (pft1000info->bootmode == 0)
	      if (ft1000dev->bootmode == 0)
	      {
		 if (dpram >= 0x3F4)
                     Status = ft1000_write_dpram32 (ft1000dev, dpram, (u8 *)&tempbuffer[0], 8);
@@ -718,9 +712,9 @@ u16 scram_dnldr(struct ft1000_device *ft1000dev, void *pFileStart,

	DEBUG("Entered   scram_dnldr...\n");

	pft1000info->fcodeldr = 0;
	pft1000info->usbboot = 0;
	pft1000info->dspalive = 0xffff;
	ft1000dev->fcodeldr = 0;
	ft1000dev->usbboot = 0;
	ft1000dev->dspalive = 0xffff;

	//
	// Get version id of file, at first 4 bytes of file, for newer files.
@@ -745,7 +739,7 @@ u16 scram_dnldr(struct ft1000_device *ft1000dev, void *pFileStart,
		switch (state) {
		case STATE_START_DWNLD:
			DEBUG("FT1000:STATE_START_DWNLD\n");
			if (pft1000info->usbboot)
			if (ft1000dev->usbboot)
				handshake =
				    get_handshake_usb(ft1000dev,
						      HANDSHAKE_DSP_BL_READY);
@@ -771,7 +765,7 @@ u16 scram_dnldr(struct ft1000_device *ft1000dev, void *pFileStart,

		case STATE_BOOT_DWNLD:
			DEBUG("FT1000:STATE_BOOT_DWNLD\n");
			pft1000info->bootmode = 1;
			ft1000dev->bootmode = 1;
			handshake = get_handshake(ft1000dev, HANDSHAKE_REQUEST);
			if (handshake == HANDSHAKE_REQUEST) {
				/*
@@ -797,7 +791,7 @@ u16 scram_dnldr(struct ft1000_device *ft1000dev, void *pFileStart,
					//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;
					ft1000dev->fcodeldr = 1;
					break;
				case REQUEST_CODE_SEGMENT:
					//DEBUG("FT1000:REQUEST_CODE_SEGMENT\n");
@@ -842,7 +836,7 @@ u16 scram_dnldr(struct ft1000_device *ft1000dev, void *pFileStart,
					status = STATUS_FAILURE;
					break;
				}
				if (pft1000info->usbboot)
				if (ft1000dev->usbboot)
					put_handshake_usb(ft1000dev,
							  HANDSHAKE_RESPONSE);
				else
@@ -858,8 +852,8 @@ u16 scram_dnldr(struct ft1000_device *ft1000dev, void *pFileStart,

		case STATE_CODE_DWNLD:
			//DEBUG("FT1000:STATE_CODE_DWNLD\n");
			pft1000info->bootmode = 0;
			if (pft1000info->usbboot)
			ft1000dev->bootmode = 0;
			if (ft1000dev->usbboot)
				handshake =
				    get_handshake_usb(ft1000dev,
						      HANDSHAKE_REQUEST);
@@ -870,7 +864,7 @@ u16 scram_dnldr(struct ft1000_device *ft1000dev, void *pFileStart,
				/*
				 * Get type associated with the request.
				 */
				if (pft1000info->usbboot)
				if (ft1000dev->usbboot)
					request =
					    get_request_type_usb(ft1000dev);
				else
@@ -916,7 +910,7 @@ u16 scram_dnldr(struct ft1000_device *ft1000dev, void *pFileStart,
					}
					break;
				case REQUEST_DONE_CL:
					pft1000info->usbboot = 3;
					ft1000dev->usbboot = 3;
					/* Reposition ptrs to beginning of provisioning section */
					s_file =
					    (u16 *) (pFileStart +
@@ -965,9 +959,9 @@ u16 scram_dnldr(struct ft1000_device *ft1000dev, void *pFileStart,

					write_blk_fifo(ft1000dev, &s_file,
						       &c_file, word_length);
					if (pft1000info->usbboot == 0)
						pft1000info->usbboot++;
					if (pft1000info->usbboot == 1) {
					if (ft1000dev->usbboot == 0)
						ft1000dev->usbboot++;
					if (ft1000dev->usbboot == 1) {
						tempword = 0;
						ft1000_write_dpram16(ft1000dev,
								     DWNLD_MAG1_PS_HDR_LOC,
@@ -1117,7 +1111,7 @@ u16 scram_dnldr(struct ft1000_device *ft1000dev, void *pFileStart,
					status = STATUS_FAILURE;
					break;
				}
				if (pft1000info->usbboot)
				if (ft1000dev->usbboot)
					put_handshake_usb(ft1000dev,
							  HANDSHAKE_RESPONSE);
				else
Loading