1 /* CopyRight (C) 2007 Qualcomm Inc. All Rights Reserved.
4 * This file is part of Express Card USB Driver
7 #include <linux/init.h>
8 #include <linux/kernel.h>
9 #include <linux/module.h>
10 #include <linux/netdevice.h>
11 #include <linux/etherdevice.h>
12 #include <linux/usb.h>
13 #include "ft1000_usb.h"
14 #include <linux/types.h>
16 #define HARLEY_READ_REGISTER 0x0
17 #define HARLEY_WRITE_REGISTER 0x01
18 #define HARLEY_READ_DPRAM_32 0x02
19 #define HARLEY_READ_DPRAM_LOW 0x03
20 #define HARLEY_READ_DPRAM_HIGH 0x04
21 #define HARLEY_WRITE_DPRAM_32 0x05
22 #define HARLEY_WRITE_DPRAM_LOW 0x06
23 #define HARLEY_WRITE_DPRAM_HIGH 0x07
25 #define HARLEY_READ_OPERATION 0xc1
26 #define HARLEY_WRITE_OPERATION 0x41
32 static int ft1000_submit_rx_urb(struct ft1000_info *info);
34 static u8 tempbuffer[1600];
36 #define MAX_RCV_LOOP 100
38 /* send a control message via USB interface synchronously
39 * Parameters: ft1000_usb - device structure
40 * pipe - usb control message pipe
41 * request - control request
42 * requesttype - control message request type
43 * value - value to be written or 0
44 * index - register index
45 * data - data buffer to hold the read/write values
47 * timeout - control message time out value
49 static int ft1000_control(struct ft1000_usb *ft1000dev, unsigned int pipe,
50 u8 request, u8 requesttype, u16 value, u16 index,
51 void *data, u16 size, int timeout)
55 if ((ft1000dev == NULL) || (ft1000dev->dev == NULL)) {
56 DEBUG("ft1000dev or ft1000dev->dev == NULL, failure\n");
60 ret = usb_control_msg(ft1000dev->dev, pipe, request, requesttype,
61 value, index, data, size, timeout);
69 /* returns the value in a register */
70 int ft1000_read_register(struct ft1000_usb *ft1000dev, u16 *Data,
75 ret = ft1000_control(ft1000dev,
76 usb_rcvctrlpipe(ft1000dev->dev, 0),
78 HARLEY_READ_OPERATION,
83 USB_CTRL_GET_TIMEOUT);
88 /* writes the value in a register */
89 int ft1000_write_register(struct ft1000_usb *ft1000dev, u16 value,
94 ret = ft1000_control(ft1000dev,
95 usb_sndctrlpipe(ft1000dev->dev, 0),
96 HARLEY_WRITE_REGISTER,
97 HARLEY_WRITE_OPERATION,
102 USB_CTRL_SET_TIMEOUT);
107 /* read a number of bytes from DPRAM */
108 int ft1000_read_dpram32(struct ft1000_usb *ft1000dev, u16 indx, u8 *buffer,
113 ret = ft1000_control(ft1000dev,
114 usb_rcvctrlpipe(ft1000dev->dev, 0),
115 HARLEY_READ_DPRAM_32,
116 HARLEY_READ_OPERATION,
121 USB_CTRL_GET_TIMEOUT);
126 /* writes into DPRAM a number of bytes */
127 int ft1000_write_dpram32(struct ft1000_usb *ft1000dev, u16 indx, u8 *buffer,
133 cnt += cnt - (cnt % 4);
135 ret = ft1000_control(ft1000dev,
136 usb_sndctrlpipe(ft1000dev->dev, 0),
137 HARLEY_WRITE_DPRAM_32,
138 HARLEY_WRITE_OPERATION,
143 USB_CTRL_SET_TIMEOUT);
148 /* read 16 bits from DPRAM */
149 int ft1000_read_dpram16(struct ft1000_usb *ft1000dev, u16 indx, u8 *buffer,
156 request = HARLEY_READ_DPRAM_LOW;
158 request = HARLEY_READ_DPRAM_HIGH;
160 ret = ft1000_control(ft1000dev,
161 usb_rcvctrlpipe(ft1000dev->dev, 0),
163 HARLEY_READ_OPERATION,
168 USB_CTRL_GET_TIMEOUT);
173 /* write into DPRAM a number of bytes */
174 int ft1000_write_dpram16(struct ft1000_usb *ft1000dev, u16 indx, u16 value,
181 request = HARLEY_WRITE_DPRAM_LOW;
183 request = HARLEY_WRITE_DPRAM_HIGH;
185 ret = ft1000_control(ft1000dev,
186 usb_sndctrlpipe(ft1000dev->dev, 0),
188 HARLEY_WRITE_OPERATION,
193 USB_CTRL_SET_TIMEOUT);
198 /* read DPRAM 4 words at a time */
199 int fix_ft1000_read_dpram32(struct ft1000_usb *ft1000dev, u16 indx,
206 pos = (indx / 4) * 4;
207 ret = ft1000_read_dpram32(ft1000dev, pos, buf, 16);
210 pos = (indx % 4) * 4;
211 *buffer++ = buf[pos++];
212 *buffer++ = buf[pos++];
213 *buffer++ = buf[pos++];
214 *buffer++ = buf[pos++];
216 DEBUG("fix_ft1000_read_dpram32: DPRAM32 Read failed\n");
227 /* Description: This function write to DPRAM 4 words at a time */
228 int fix_ft1000_write_dpram32(struct ft1000_usb *ft1000dev, u16 indx, u8 *buffer)
238 pos1 = (indx / 4) * 4;
240 ret = ft1000_read_dpram32(ft1000dev, pos1, buf, 16);
244 buf[pos2++] = *buffer++;
245 buf[pos2++] = *buffer++;
246 buf[pos2++] = *buffer++;
247 buf[pos2++] = *buffer++;
248 ret = ft1000_write_dpram32(ft1000dev, pos1, buf, 16);
250 DEBUG("fix_ft1000_write_dpram32: DPRAM32 Read failed\n");
254 ret = ft1000_read_dpram32(ft1000dev, pos1, (u8 *)&resultbuffer[0], 16);
258 for (i = 0; i < 16; i++) {
259 if (buf[i] != resultbuffer[i])
265 ret = ft1000_write_dpram32(ft1000dev, pos1,
266 (u8 *)&tempbuffer[0], 16);
267 ret = ft1000_read_dpram32(ft1000dev, pos1,
268 (u8 *)&resultbuffer[0], 16);
271 for (i = 0; i < 16; i++) {
272 if (tempbuffer[i] != resultbuffer[i]) {
274 DEBUG("%s Failed to write\n",
284 /* reset or activate the DSP */
285 static void card_reset_dsp(struct ft1000_usb *ft1000dev, bool value)
290 status = ft1000_write_register(ft1000dev, HOST_INTF_BE,
291 FT1000_REG_SUP_CTRL);
292 status = ft1000_read_register(ft1000dev, &tempword,
293 FT1000_REG_SUP_CTRL);
296 DEBUG("Reset DSP\n");
297 status = ft1000_read_register(ft1000dev, &tempword,
299 tempword |= DSP_RESET_BIT;
300 status = ft1000_write_register(ft1000dev, tempword,
303 DEBUG("Activate DSP\n");
304 status = ft1000_read_register(ft1000dev, &tempword,
306 tempword |= DSP_ENCRYPTED;
307 tempword &= ~DSP_UNENCRYPTED;
308 status = ft1000_write_register(ft1000dev, tempword,
310 status = ft1000_read_register(ft1000dev, &tempword,
312 tempword &= ~EFUSE_MEM_DISABLE;
313 tempword &= ~DSP_RESET_BIT;
314 status = ft1000_write_register(ft1000dev, tempword,
316 status = ft1000_read_register(ft1000dev, &tempword,
321 /* send a command to ASIC
322 * Parameters: ft1000_usb - device structure
323 * ptempbuffer - command buffer
324 * size - command buffer size
326 void card_send_command(struct ft1000_usb *ft1000dev, void *ptempbuffer,
330 unsigned char *commandbuf;
332 DEBUG("card_send_command: enter card_send_command... size=%d\n", size);
334 commandbuf = kmalloc(size + 2, GFP_KERNEL);
335 memcpy((void *)commandbuf + 2, (void *)ptempbuffer, size);
337 ft1000_read_register(ft1000dev, &temp, FT1000_REG_DOORBELL);
340 usleep_range(900, 1100);
342 /* check for odd word */
345 /* Must force to be 32 bit aligned */
347 size += 4 - (size % 4);
349 ft1000_write_dpram32(ft1000dev, 0, commandbuf, size);
350 usleep_range(900, 1100);
351 ft1000_write_register(ft1000dev, FT1000_DB_DPRAM_TX,
352 FT1000_REG_DOORBELL);
353 usleep_range(900, 1100);
355 ft1000_read_register(ft1000dev, &temp, FT1000_REG_DOORBELL);
358 if ((temp & 0x0100) == 0)
359 DEBUG("card_send_command: Message sent\n");
364 /* load or reload the DSP */
365 int dsp_reload(struct ft1000_usb *ft1000dev)
371 struct ft1000_info *pft1000info;
373 pft1000info = netdev_priv(ft1000dev->net);
375 pft1000info->CardReady = 0;
377 /* Program Interrupt Mask register */
378 status = ft1000_write_register(ft1000dev, 0xffff, FT1000_REG_SUP_IMASK);
380 status = ft1000_read_register(ft1000dev, &tempword, FT1000_REG_RESET);
381 tempword |= ASIC_RESET_BIT;
382 status = ft1000_write_register(ft1000dev, tempword, FT1000_REG_RESET);
384 status = ft1000_read_register(ft1000dev, &tempword, FT1000_REG_RESET);
385 DEBUG("Reset Register = 0x%x\n", tempword);
387 /* Toggle DSP reset */
388 card_reset_dsp(ft1000dev, 1);
390 card_reset_dsp(ft1000dev, 0);
394 ft1000_write_register(ft1000dev, HOST_INTF_BE, FT1000_REG_SUP_CTRL);
396 /* Let's check for FEFE */
398 ft1000_read_dpram32(ft1000dev, FT1000_MAG_DPRAM_FEFE_INDX,
399 (u8 *) &templong, 4);
400 DEBUG("templong (fefe) = 0x%8x\n", templong);
402 /* call codeloader */
403 status = scram_dnldr(ft1000dev, pFileStart, FileLength);
410 DEBUG("dsp_reload returned\n");
415 /* call the Card Service function to reset the ASIC. */
416 static void ft1000_reset_asic(struct net_device *dev)
418 struct ft1000_info *info = netdev_priv(dev);
419 struct ft1000_usb *ft1000dev = info->priv;
422 DEBUG("ft1000_hw:ft1000_reset_asic called\n");
424 /* Let's use the register provided by the Magnemite ASIC to reset the
427 ft1000_write_register(ft1000dev, (DSP_RESET_BIT | ASIC_RESET_BIT),
432 /* set watermark to -1 in order to not generate an interrupt */
433 ft1000_write_register(ft1000dev, 0xffff, FT1000_REG_MAG_WATERMARK);
435 /* clear interrupts */
436 ft1000_read_register(ft1000dev, &tempword, FT1000_REG_SUP_ISR);
437 DEBUG("ft1000_hw: interrupt status register = 0x%x\n", tempword);
438 ft1000_write_register(ft1000dev, tempword, FT1000_REG_SUP_ISR);
439 ft1000_read_register(ft1000dev, &tempword, FT1000_REG_SUP_ISR);
440 DEBUG("ft1000_hw: interrupt status register = 0x%x\n", tempword);
443 static int ft1000_reset_card(struct net_device *dev)
445 struct ft1000_info *info = netdev_priv(dev);
446 struct ft1000_usb *ft1000dev = info->priv;
448 struct prov_record *ptr;
450 DEBUG("ft1000_hw:ft1000_reset_card called.....\n");
452 ft1000dev->fCondResetPend = true;
454 ft1000dev->fProvComplete = false;
456 /* Make sure we free any memory reserve for provisioning */
457 while (list_empty(&info->prov_list) == 0) {
458 DEBUG("ft1000_reset_card:deleting provisioning record\n");
460 list_entry(info->prov_list.next, struct prov_record, list);
461 list_del(&ptr->list);
462 kfree(ptr->pprov_data);
466 DEBUG("ft1000_hw:ft1000_reset_card: reset asic\n");
467 ft1000_reset_asic(dev);
469 DEBUG("ft1000_hw:ft1000_reset_card: call dsp_reload\n");
470 dsp_reload(ft1000dev);
472 DEBUG("dsp reload successful\n");
476 /* Initialize DSP heartbeat area */
477 ft1000_write_dpram16(ft1000dev, FT1000_MAG_HI_HO, ho_mag,
478 FT1000_MAG_HI_HO_INDX);
479 ft1000_read_dpram16(ft1000dev, FT1000_MAG_HI_HO, (u8 *) &tempword,
480 FT1000_MAG_HI_HO_INDX);
481 DEBUG("ft1000_hw:ft1000_reset_card:hi_ho value = 0x%x\n", tempword);
485 ft1000dev->fCondResetPend = false;
490 /* callback function when a urb is transmitted */
491 static void ft1000_usb_transmit_complete(struct urb *urb)
494 struct ft1000_usb *ft1000dev = urb->context;
497 pr_err("%s: TX status %d\n", ft1000dev->net->name, urb->status);
499 netif_wake_queue(ft1000dev->net);
502 /* take an ethernet packet and convert it to a Flarion
503 * packet prior to sending it to the ASIC Downlink FIFO.
505 static int ft1000_copy_down_pkt(struct net_device *netdev, u8 *packet, u16 len)
507 struct ft1000_info *pInfo = netdev_priv(netdev);
508 struct ft1000_usb *pFt1000Dev = pInfo->priv;
512 struct pseudo_hdr hdr;
514 if (!pInfo->CardReady) {
515 DEBUG("ft1000_copy_down_pkt::Card Not Ready\n");
519 count = sizeof(struct pseudo_hdr) + len;
520 if (count > MAX_BUF_SIZE) {
521 DEBUG("Error:ft1000_copy_down_pkt:Message Size Overflow!\n");
522 DEBUG("size = %d\n", count);
527 count = count + (4 - (count % 4));
529 memset(&hdr, 0, sizeof(struct pseudo_hdr));
531 hdr.length = ntohs(count);
533 hdr.destination = 0x20;
536 hdr.sh_str_id = 0x91;
539 hdr.checksum = hdr.length ^ hdr.source ^ hdr.destination ^
540 hdr.portdest ^ hdr.portsrc ^ hdr.sh_str_id ^ hdr.control;
542 memcpy(&pFt1000Dev->tx_buf[0], &hdr, sizeof(hdr));
543 memcpy(&(pFt1000Dev->tx_buf[sizeof(struct pseudo_hdr)]), packet, len);
545 netif_stop_queue(netdev);
547 usb_fill_bulk_urb(pFt1000Dev->tx_urb,
549 usb_sndbulkpipe(pFt1000Dev->dev,
550 pFt1000Dev->bulk_out_endpointAddr),
551 pFt1000Dev->tx_buf, count,
552 ft1000_usb_transmit_complete, (void *)pFt1000Dev);
554 t = (u8 *) pFt1000Dev->tx_urb->transfer_buffer;
556 ret = usb_submit_urb(pFt1000Dev->tx_urb, GFP_ATOMIC);
559 DEBUG("ft1000 failed tx_urb %d\n", ret);
562 pInfo->stats.tx_packets++;
563 pInfo->stats.tx_bytes += (len + 14);
569 /* transmit an ethernet packet
570 * Parameters: skb - socket buffer to be sent
571 * dev - network device
573 static int ft1000_start_xmit(struct sk_buff *skb, struct net_device *dev)
575 struct ft1000_info *pInfo = netdev_priv(dev);
576 struct ft1000_usb *pFt1000Dev = pInfo->priv;
581 DEBUG("ft1000_hw: ft1000_start_xmit:skb == NULL!!!\n");
585 if (pFt1000Dev->status & FT1000_STATUS_CLOSING) {
586 DEBUG("network driver is closed, return\n");
591 usb_sndbulkpipe(pFt1000Dev->dev, pFt1000Dev->bulk_out_endpointAddr);
592 maxlen = usb_maxpacket(pFt1000Dev->dev, pipe, usb_pipeout(pipe));
594 pdata = (u8 *) skb->data;
596 if (pInfo->mediastate == 0) {
597 /* Drop packet is mediastate is down */
598 DEBUG("ft1000_hw:ft1000_start_xmit:mediastate is down\n");
602 if ((skb->len < ENET_HEADER_SIZE) || (skb->len > ENET_MAX_SIZE)) {
603 /* Drop packet which has invalid size */
604 DEBUG("ft1000_hw:ft1000_start_xmit:invalid ethernet length\n");
608 ft1000_copy_down_pkt(dev, (pdata + ENET_HEADER_SIZE - 2),
609 skb->len - ENET_HEADER_SIZE + 2);
617 /* open the network driver */
618 static int ft1000_open(struct net_device *dev)
620 struct ft1000_info *pInfo = netdev_priv(dev);
621 struct ft1000_usb *pFt1000Dev = pInfo->priv;
624 DEBUG("ft1000_open is called for card %d\n", pFt1000Dev->CardNumber);
626 pInfo->stats.rx_bytes = 0;
627 pInfo->stats.tx_bytes = 0;
628 pInfo->stats.rx_packets = 0;
629 pInfo->stats.tx_packets = 0;
630 do_gettimeofday(&tv);
631 pInfo->ConTm = tv.tv_sec;
632 pInfo->ProgConStat = 0;
634 netif_start_queue(dev);
636 netif_carrier_on(dev);
638 return ft1000_submit_rx_urb(pInfo);
641 static struct net_device_stats *ft1000_netdev_stats(struct net_device *dev)
643 struct ft1000_info *info = netdev_priv(dev);
645 return &(info->stats);
648 static const struct net_device_ops ftnet_ops = {
649 .ndo_open = &ft1000_open,
650 .ndo_stop = &ft1000_close,
651 .ndo_start_xmit = &ft1000_start_xmit,
652 .ndo_get_stats = &ft1000_netdev_stats,
655 /* initialize the network device */
656 static int ft1000_reset(void *dev)
658 ft1000_reset_card(dev);
662 int init_ft1000_netdev(struct ft1000_usb *ft1000dev)
664 struct net_device *netdev;
665 struct ft1000_info *pInfo = NULL;
666 struct dpram_blk *pdpram_blk;
668 struct list_head *cur, *tmp;
672 DEBUG("Enter init_ft1000_netdev...\n");
674 netdev = alloc_etherdev(sizeof(struct ft1000_info));
676 DEBUG("init_ft1000_netdev: can not allocate network device\n");
680 pInfo = netdev_priv(netdev);
682 memset(pInfo, 0, sizeof(struct ft1000_info));
684 dev_alloc_name(netdev, netdev->name);
686 DEBUG("init_ft1000_netdev: network device name is %s\n", netdev->name);
688 if (strncmp(netdev->name, "eth", 3) == 0) {
689 card_nr[0] = netdev->name[3];
691 ret_val = kstrtou8(card_nr, 10, &gCardIndex);
693 netdev_err(ft1000dev->net, "Can't parse netdev\n");
697 ft1000dev->CardNumber = gCardIndex;
698 DEBUG("card number = %d\n", ft1000dev->CardNumber);
700 netdev_err(ft1000dev->net, "ft1000: Invalid device name\n");
705 memset(&pInfo->stats, 0, sizeof(struct net_device_stats));
707 spin_lock_init(&pInfo->dpram_lock);
708 pInfo->priv = ft1000dev;
709 pInfo->DrvErrNum = 0;
710 pInfo->registered = 1;
711 pInfo->ft1000_reset = ft1000_reset;
712 pInfo->mediastate = 0;
714 ft1000dev->DeviceCreated = FALSE;
715 pInfo->CardReady = 0;
716 pInfo->DSP_TIME[0] = 0;
717 pInfo->DSP_TIME[1] = 0;
718 pInfo->DSP_TIME[2] = 0;
719 pInfo->DSP_TIME[3] = 0;
720 ft1000dev->fAppMsgPend = false;
721 ft1000dev->fCondResetPend = false;
722 ft1000dev->usbboot = 0;
723 ft1000dev->dspalive = 0;
724 memset(&ft1000dev->tempbuf[0], 0, sizeof(ft1000dev->tempbuf));
726 INIT_LIST_HEAD(&pInfo->prov_list);
728 INIT_LIST_HEAD(&ft1000dev->nodes.list);
730 netdev->netdev_ops = &ftnet_ops;
732 ft1000dev->net = netdev;
734 DEBUG("Initialize free_buff_lock and freercvpool\n");
735 spin_lock_init(&free_buff_lock);
737 /* initialize a list of buffers to be use for queuing
738 * up receive command data
740 INIT_LIST_HEAD(&freercvpool);
742 /* create list of free buffers */
743 for (i = 0; i < NUM_OF_FREE_BUFFERS; i++) {
744 /* Get memory for DPRAM_DATA link list */
745 pdpram_blk = kmalloc(sizeof(struct dpram_blk), GFP_KERNEL);
746 if (pdpram_blk == NULL) {
750 /* Get a block of memory to store command data */
751 pdpram_blk->pbuffer = kmalloc(MAX_CMD_SQSIZE, GFP_KERNEL);
752 if (pdpram_blk->pbuffer == NULL) {
757 /* link provisioning data */
758 list_add_tail(&pdpram_blk->list, &freercvpool);
760 numofmsgbuf = NUM_OF_FREE_BUFFERS;
765 list_for_each_safe(cur, tmp, &freercvpool) {
766 pdpram_blk = list_entry(cur, struct dpram_blk, list);
767 list_del(&pdpram_blk->list);
768 kfree(pdpram_blk->pbuffer);
776 /* register the network driver */
777 int reg_ft1000_netdev(struct ft1000_usb *ft1000dev,
778 struct usb_interface *intf)
780 struct net_device *netdev;
781 struct ft1000_info *pInfo;
784 netdev = ft1000dev->net;
785 pInfo = netdev_priv(ft1000dev->net);
786 DEBUG("Enter reg_ft1000_netdev...\n");
788 ft1000_read_register(ft1000dev, &pInfo->AsicID, FT1000_REG_ASIC_ID);
790 usb_set_intfdata(intf, pInfo);
791 SET_NETDEV_DEV(netdev, &intf->dev);
793 rc = register_netdev(netdev);
795 DEBUG("reg_ft1000_netdev: could not register network device\n");
800 ft1000_create_dev(ft1000dev);
802 DEBUG("reg_ft1000_netdev returned\n");
804 pInfo->CardReady = 1;
809 /* take a packet from the FIFO up link and
810 * convert it into an ethernet packet and deliver it to the IP stack
812 static int ft1000_copy_up_pkt(struct urb *urb)
814 struct ft1000_info *info = urb->context;
815 struct ft1000_usb *ft1000dev = info->priv;
816 struct net_device *net = ft1000dev->net;
827 if (ft1000dev->status & FT1000_STATUS_CLOSING) {
828 DEBUG("network driver is closed, return\n");
832 len = urb->transfer_buffer_length;
833 lena = urb->actual_length;
835 chksum = (u16 *) ft1000dev->rx_buf;
837 tempword = *chksum++;
838 for (i = 1; i < 7; i++)
839 tempword ^= *chksum++;
841 if (tempword != *chksum) {
842 info->stats.rx_errors++;
843 ft1000_submit_rx_urb(info);
847 skb = dev_alloc_skb(len + 12 + 2);
850 DEBUG("ft1000_copy_up_pkt: No Network buffers available\n");
851 info->stats.rx_errors++;
852 ft1000_submit_rx_urb(info);
856 pbuffer = (u8 *) skb_put(skb, len + 12);
858 /* subtract the number of bytes read already */
861 /* fake MAC address */
862 *pbuffer++ = net->dev_addr[0];
863 *pbuffer++ = net->dev_addr[1];
864 *pbuffer++ = net->dev_addr[2];
865 *pbuffer++ = net->dev_addr[3];
866 *pbuffer++ = net->dev_addr[4];
867 *pbuffer++ = net->dev_addr[5];
875 memcpy(pbuffer, ft1000dev->rx_buf + sizeof(struct pseudo_hdr),
876 len - sizeof(struct pseudo_hdr));
880 skb->protocol = eth_type_trans(skb, net);
881 skb->ip_summed = CHECKSUM_UNNECESSARY;
884 info->stats.rx_packets++;
885 /* Add on 12 bytes for MAC address which was removed */
886 info->stats.rx_bytes += (lena + 12);
888 ft1000_submit_rx_urb(info);
894 /* the receiving function of the network driver */
895 static int ft1000_submit_rx_urb(struct ft1000_info *info)
898 struct ft1000_usb *pFt1000Dev = info->priv;
900 if (pFt1000Dev->status & FT1000_STATUS_CLOSING) {
901 DEBUG("network driver is closed, return\n");
905 usb_fill_bulk_urb(pFt1000Dev->rx_urb,
907 usb_rcvbulkpipe(pFt1000Dev->dev,
908 pFt1000Dev->bulk_in_endpointAddr),
909 pFt1000Dev->rx_buf, MAX_BUF_SIZE,
910 (usb_complete_t) ft1000_copy_up_pkt, info);
912 result = usb_submit_urb(pFt1000Dev->rx_urb, GFP_ATOMIC);
915 pr_err("ft1000_submit_rx_urb: submitting rx_urb %d failed\n",
923 /* close the network driver */
924 int ft1000_close(struct net_device *net)
926 struct ft1000_info *pInfo = netdev_priv(net);
927 struct ft1000_usb *ft1000dev = pInfo->priv;
929 ft1000dev->status |= FT1000_STATUS_CLOSING;
931 DEBUG("ft1000_close: pInfo=%p, ft1000dev=%p\n", pInfo, ft1000dev);
932 netif_carrier_off(net);
933 netif_stop_queue(net);
934 ft1000dev->status &= ~FT1000_STATUS_CLOSING;
936 pInfo->ProgConStat = 0xff;
941 /* check if the device is presently available on the system. */
942 static int ft1000_chkcard(struct ft1000_usb *dev)
947 if (dev->fCondResetPend) {
948 DEBUG("ft1000_hw:ft1000_chkcard:Card is being reset, return FALSE\n");
951 /* Mask register is used to check for device presence since it is never
954 status = ft1000_read_register(dev, &tempword, FT1000_REG_SUP_IMASK);
956 DEBUG("ft1000_hw:ft1000_chkcard: IMASK = 0 Card not detected\n");
959 /* The system will return the value of 0xffff for the version register
960 * if the device is not present.
962 status = ft1000_read_register(dev, &tempword, FT1000_REG_ASIC_ID);
963 if (tempword != 0x1b01) {
964 dev->status |= FT1000_STATUS_CLOSING;
965 DEBUG("ft1000_hw:ft1000_chkcard: Version = 0xffff Card not detected\n");
971 /* read a message from the dpram area.
973 * dev - network device structure
974 * pbuffer - caller supply address to buffer
976 static bool ft1000_receive_cmd(struct ft1000_usb *dev, u16 *pbuffer,
986 ft1000_read_dpram16(dev, FT1000_MAG_PH_LEN, (u8 *) &size,
987 FT1000_MAG_PH_LEN_INDX);
988 size = ntohs(size) + PSEUDOSZ;
990 DEBUG("FT1000:ft1000_receive_cmd:Invalid command length = %d\n",
994 ppseudohdr = (u16 *) pbuffer;
995 ft1000_write_register(dev, FT1000_DPRAM_MAG_RX_BASE,
996 FT1000_REG_DPRAM_ADDR);
998 ft1000_read_register(dev, pbuffer, FT1000_REG_MAG_DPDATAH);
1000 ft1000_write_register(dev, FT1000_DPRAM_MAG_RX_BASE + 1,
1001 FT1000_REG_DPRAM_ADDR);
1002 for (i = 0; i <= (size >> 2); i++) {
1004 ft1000_read_register(dev, pbuffer,
1005 FT1000_REG_MAG_DPDATAL);
1008 ft1000_read_register(dev, pbuffer,
1009 FT1000_REG_MAG_DPDATAH);
1012 /* copy odd aligned word */
1014 ft1000_read_register(dev, pbuffer, FT1000_REG_MAG_DPDATAL);
1018 ft1000_read_register(dev, pbuffer, FT1000_REG_MAG_DPDATAH);
1021 if (size & 0x0001) {
1022 /* copy odd byte from fifo */
1024 ft1000_read_register(dev, &tempword,
1025 FT1000_REG_DPRAM_DATA);
1026 *pbuffer = ntohs(tempword);
1028 /* Check if pseudo header checksum is good
1029 * Calculate pseudo header checksum
1031 tempword = *ppseudohdr++;
1032 for (i = 1; i < 7; i++)
1033 tempword ^= *ppseudohdr++;
1035 if ((tempword != *ppseudohdr))
1042 static int ft1000_dsp_prov(void *arg)
1044 struct ft1000_usb *dev = (struct ft1000_usb *)arg;
1045 struct ft1000_info *info = netdev_priv(dev->net);
1049 struct prov_record *ptr;
1050 struct pseudo_hdr *ppseudo_hdr;
1053 u16 TempShortBuf[256];
1055 DEBUG("*** DspProv Entered\n");
1057 while (list_empty(&info->prov_list) == 0) {
1058 DEBUG("DSP Provisioning List Entry\n");
1060 /* Check if doorbell is available */
1061 DEBUG("check if doorbell is cleared\n");
1063 ft1000_read_register(dev, &tempword, FT1000_REG_DOORBELL);
1065 DEBUG("ft1000_dsp_prov::ft1000_read_register error\n");
1069 while (tempword & FT1000_DB_DPRAM_TX) {
1073 DEBUG("FT1000:ft1000_dsp_prov:message drop\n");
1076 ft1000_read_register(dev, &tempword,
1077 FT1000_REG_DOORBELL);
1080 if (!(tempword & FT1000_DB_DPRAM_TX)) {
1081 DEBUG("*** Provision Data Sent to DSP\n");
1083 /* Send provisioning data */
1085 list_entry(info->prov_list.next, struct prov_record,
1087 len = *(u16 *) ptr->pprov_data;
1091 pmsg = (u16 *) ptr->pprov_data;
1092 ppseudo_hdr = (struct pseudo_hdr *)pmsg;
1093 /* Insert slow queue sequence number */
1094 ppseudo_hdr->seq_num = info->squeseqnum++;
1095 ppseudo_hdr->portsrc = 0;
1096 /* Calculate new checksum */
1097 ppseudo_hdr->checksum = *pmsg++;
1098 for (i = 1; i < 7; i++)
1099 ppseudo_hdr->checksum ^= *pmsg++;
1101 TempShortBuf[0] = 0;
1102 TempShortBuf[1] = htons(len);
1103 memcpy(&TempShortBuf[2], ppseudo_hdr, len);
1106 ft1000_write_dpram32(dev, 0,
1107 (u8 *) &TempShortBuf[0],
1108 (unsigned short)(len + 2));
1110 ft1000_write_register(dev, FT1000_DB_DPRAM_TX,
1111 FT1000_REG_DOORBELL);
1113 list_del(&ptr->list);
1114 kfree(ptr->pprov_data);
1117 usleep_range(9000, 11000);
1120 DEBUG("DSP Provisioning List Entry finished\n");
1124 dev->fProvComplete = true;
1125 info->CardReady = 1;
1130 static int ft1000_proc_drvmsg(struct ft1000_usb *dev, u16 size)
1132 struct ft1000_info *info = netdev_priv(dev->net);
1135 struct media_msg *pmediamsg;
1136 struct dsp_init_msg *pdspinitmsg;
1137 struct drv_msg *pdrvmsg;
1139 struct pseudo_hdr *ppseudo_hdr;
1147 char *cmdbuffer = kmalloc(1600, GFP_KERNEL);
1151 status = ft1000_read_dpram32(dev, 0x200, cmdbuffer, size);
1154 DEBUG("ft1000_proc_drvmsg:cmdbuffer\n");
1155 for (i = 0; i < size; i += 5) {
1157 DEBUG("0x%x, 0x%x, 0x%x, 0x%x, 0x%x\n", cmdbuffer[i],
1158 cmdbuffer[i + 1], cmdbuffer[i + 2],
1159 cmdbuffer[i + 3], cmdbuffer[i + 4]);
1161 for (j = i; j < size; j++)
1162 DEBUG("0x%x ", cmdbuffer[j]);
1168 pdrvmsg = (struct drv_msg *)&cmdbuffer[2];
1169 msgtype = ntohs(pdrvmsg->type);
1170 DEBUG("ft1000_proc_drvmsg:Command message type = 0x%x\n", msgtype);
1173 DEBUG("ft1000_proc_drvmsg:Command message type = MEDIA_STATE");
1174 pmediamsg = (struct media_msg *)&cmdbuffer[0];
1175 if (info->ProgConStat != 0xFF) {
1176 if (pmediamsg->state) {
1177 DEBUG("Media is up\n");
1178 if (info->mediastate == 0) {
1179 if (dev->NetDevRegDone)
1180 netif_wake_queue(dev->net);
1181 info->mediastate = 1;
1184 DEBUG("Media is down\n");
1185 if (info->mediastate == 1) {
1186 info->mediastate = 0;
1187 if (dev->NetDevRegDone)
1192 DEBUG("Media is down\n");
1193 if (info->mediastate == 1) {
1194 info->mediastate = 0;
1201 DEBUG("ft1000_proc_drvmsg:Command message type = DSP_INIT_MSG");
1202 pdspinitmsg = (struct dsp_init_msg *)&cmdbuffer[2];
1203 memcpy(info->DspVer, pdspinitmsg->DspVer, DSPVERSZ);
1204 DEBUG("DSPVER = 0x%2x 0x%2x 0x%2x 0x%2x\n",
1205 info->DspVer[0], info->DspVer[1], info->DspVer[2],
1207 memcpy(info->HwSerNum, pdspinitmsg->HwSerNum,
1209 memcpy(info->Sku, pdspinitmsg->Sku, SKUSZ);
1210 memcpy(info->eui64, pdspinitmsg->eui64, EUISZ);
1211 DEBUG("EUI64=%2x.%2x.%2x.%2x.%2x.%2x.%2x.%2x\n",
1212 info->eui64[0], info->eui64[1], info->eui64[2],
1213 info->eui64[3], info->eui64[4], info->eui64[5],
1214 info->eui64[6], info->eui64[7]);
1215 dev->net->dev_addr[0] = info->eui64[0];
1216 dev->net->dev_addr[1] = info->eui64[1];
1217 dev->net->dev_addr[2] = info->eui64[2];
1218 dev->net->dev_addr[3] = info->eui64[5];
1219 dev->net->dev_addr[4] = info->eui64[6];
1220 dev->net->dev_addr[5] = info->eui64[7];
1222 if (ntohs(pdspinitmsg->length) ==
1223 (sizeof(struct dsp_init_msg) - 20)) {
1224 memcpy(info->ProductMode, pdspinitmsg->ProductMode,
1226 memcpy(info->RfCalVer, pdspinitmsg->RfCalVer, CALVERSZ);
1227 memcpy(info->RfCalDate, pdspinitmsg->RfCalDate,
1229 DEBUG("RFCalVer = 0x%2x 0x%2x\n", info->RfCalVer[0],
1234 case DSP_PROVISION:{
1235 DEBUG("ft1000_proc_drvmsg:Command message type = DSP_PROVISION\n");
1237 /* kick off dspprov routine to start provisioning
1238 * Send provisioning data to DSP
1240 if (list_empty(&info->prov_list) == 0) {
1241 dev->fProvComplete = false;
1242 status = ft1000_dsp_prov(dev);
1246 dev->fProvComplete = true;
1247 status = ft1000_write_register(dev, FT1000_DB_HB,
1248 FT1000_REG_DOORBELL);
1249 DEBUG("FT1000:drivermsg:No more DSP provisioning data in dsp image\n");
1251 DEBUG("ft1000_proc_drvmsg:DSP PROVISION is done\n");
1254 case DSP_STORE_INFO:{
1255 DEBUG("ft1000_proc_drvmsg:Command message type = DSP_STORE_INFO");
1256 DEBUG("FT1000:drivermsg:Got DSP_STORE_INFO\n");
1257 tempword = ntohs(pdrvmsg->length);
1258 info->DSPInfoBlklen = tempword;
1259 if (tempword < (MAX_DSP_SESS_REC - 4)) {
1260 pmsg = (u16 *) &pdrvmsg->data[0];
1261 for (i = 0; i < ((tempword + 1) / 2); i++) {
1262 DEBUG("FT1000:drivermsg:dsp info data = 0x%x\n", *pmsg);
1263 info->DSPInfoBlk[i + 10] = *pmsg++;
1266 info->DSPInfoBlklen = 0;
1271 DEBUG("FT1000:drivermsg:Got DSP_GET_INFO\n");
1272 /* copy dsp info block to dsp */
1273 dev->DrvMsgPend = 1;
1274 /* allow any outstanding ioctl to finish */
1276 status = ft1000_read_register(dev, &tempword,
1277 FT1000_REG_DOORBELL);
1278 if (tempword & FT1000_DB_DPRAM_TX) {
1280 status = ft1000_read_register(dev, &tempword,
1281 FT1000_REG_DOORBELL);
1282 if (tempword & FT1000_DB_DPRAM_TX) {
1284 status = ft1000_read_register(dev, &tempword,
1285 FT1000_REG_DOORBELL);
1286 if (tempword & FT1000_DB_DPRAM_TX)
1290 /* Put message into Slow Queue Form Pseudo header */
1291 pmsg = (u16 *) info->DSPInfoBlk;
1293 *pmsg++ = htons(info->DSPInfoBlklen + 20 + info->DSPInfoBlklen);
1295 (struct pseudo_hdr *)(u16 *) &info->DSPInfoBlk[2];
1296 ppseudo_hdr->length = htons(info->DSPInfoBlklen + 4
1297 + info->DSPInfoBlklen);
1298 ppseudo_hdr->source = 0x10;
1299 ppseudo_hdr->destination = 0x20;
1300 ppseudo_hdr->portdest = 0;
1301 ppseudo_hdr->portsrc = 0;
1302 ppseudo_hdr->sh_str_id = 0;
1303 ppseudo_hdr->control = 0;
1304 ppseudo_hdr->rsvd1 = 0;
1305 ppseudo_hdr->rsvd2 = 0;
1306 ppseudo_hdr->qos_class = 0;
1307 /* Insert slow queue sequence number */
1308 ppseudo_hdr->seq_num = info->squeseqnum++;
1309 /* Insert application id */
1310 ppseudo_hdr->portsrc = 0;
1311 /* Calculate new checksum */
1312 ppseudo_hdr->checksum = *pmsg++;
1313 for (i = 1; i < 7; i++)
1314 ppseudo_hdr->checksum ^= *pmsg++;
1316 info->DSPInfoBlk[10] = 0x7200;
1317 info->DSPInfoBlk[11] = htons(info->DSPInfoBlklen);
1318 status = ft1000_write_dpram32(dev, 0,
1319 (u8 *)&info->DSPInfoBlk[0],
1320 (unsigned short)(info->DSPInfoBlklen + 22));
1321 status = ft1000_write_register(dev, FT1000_DB_DPRAM_TX,
1322 FT1000_REG_DOORBELL);
1323 dev->DrvMsgPend = 0;
1326 case GET_DRV_ERR_RPT_MSG:{
1327 DEBUG("FT1000:drivermsg:Got GET_DRV_ERR_RPT_MSG\n");
1328 /* copy driver error message to dsp */
1329 dev->DrvMsgPend = 1;
1330 /* allow any outstanding ioctl to finish */
1332 status = ft1000_read_register(dev, &tempword,
1333 FT1000_REG_DOORBELL);
1334 if (tempword & FT1000_DB_DPRAM_TX) {
1336 status = ft1000_read_register(dev, &tempword,
1337 FT1000_REG_DOORBELL);
1338 if (tempword & FT1000_DB_DPRAM_TX)
1341 if ((tempword & FT1000_DB_DPRAM_TX) == 0) {
1342 /* Put message into Slow Queue Form Pseudo header */
1343 pmsg = (u16 *) &tempbuffer[0];
1344 ppseudo_hdr = (struct pseudo_hdr *)pmsg;
1345 ppseudo_hdr->length = htons(0x0012);
1346 ppseudo_hdr->source = 0x10;
1347 ppseudo_hdr->destination = 0x20;
1348 ppseudo_hdr->portdest = 0;
1349 ppseudo_hdr->portsrc = 0;
1350 ppseudo_hdr->sh_str_id = 0;
1351 ppseudo_hdr->control = 0;
1352 ppseudo_hdr->rsvd1 = 0;
1353 ppseudo_hdr->rsvd2 = 0;
1354 ppseudo_hdr->qos_class = 0;
1355 /* Insert slow queue sequence number */
1356 ppseudo_hdr->seq_num = info->squeseqnum++;
1357 /* Insert application id */
1358 ppseudo_hdr->portsrc = 0;
1359 /* Calculate new checksum */
1360 ppseudo_hdr->checksum = *pmsg++;
1361 for (i = 1; i < 7; i++)
1362 ppseudo_hdr->checksum ^= *pmsg++;
1364 pmsg = (u16 *) &tempbuffer[16];
1365 *pmsg++ = htons(RSP_DRV_ERR_RPT_MSG);
1366 *pmsg++ = htons(0x000e);
1367 *pmsg++ = htons(info->DSP_TIME[0]);
1368 *pmsg++ = htons(info->DSP_TIME[1]);
1369 *pmsg++ = htons(info->DSP_TIME[2]);
1370 *pmsg++ = htons(info->DSP_TIME[3]);
1371 convert.byte[0] = info->DspVer[0];
1372 convert.byte[1] = info->DspVer[1];
1373 *pmsg++ = convert.wrd;
1374 convert.byte[0] = info->DspVer[2];
1375 convert.byte[1] = info->DspVer[3];
1376 *pmsg++ = convert.wrd;
1377 *pmsg++ = htons(info->DrvErrNum);
1379 card_send_command(dev, (unsigned char *)&tempbuffer[0],
1380 (u16)(0x0012 + PSEUDOSZ));
1381 info->DrvErrNum = 0;
1383 dev->DrvMsgPend = 0;
1393 DEBUG("return from ft1000_proc_drvmsg\n");
1397 /* Check which application has registered for dsp broadcast messages */
1398 static int dsp_broadcast_msg_id(struct ft1000_usb *dev)
1400 struct dpram_blk *pdpram_blk;
1401 unsigned long flags;
1404 for (i = 0; i < MAX_NUM_APP; i++) {
1405 if ((dev->app_info[i].DspBCMsgFlag)
1406 && (dev->app_info[i].fileobject)
1407 && (dev->app_info[i].NumOfMsg
1409 pdpram_blk = ft1000_get_buffer(&freercvpool);
1410 if (pdpram_blk == NULL) {
1411 DEBUG("Out of memory in free receive command pool\n");
1412 dev->app_info[i].nRxMsgMiss++;
1415 if (ft1000_receive_cmd(dev, pdpram_blk->pbuffer,
1417 /* Put message into the
1418 * appropriate application block
1420 dev->app_info[i].nRxMsg++;
1421 spin_lock_irqsave(&free_buff_lock, flags);
1422 list_add_tail(&pdpram_blk->list,
1423 &dev->app_info[i] .app_sqlist);
1424 dev->app_info[i].NumOfMsg++;
1425 spin_unlock_irqrestore(&free_buff_lock, flags);
1426 wake_up_interruptible(&dev->app_info[i]
1429 dev->app_info[i].nRxMsgMiss++;
1430 ft1000_free_buffer(pdpram_blk, &freercvpool);
1431 DEBUG("pdpram_blk::ft1000_get_buffer NULL\n");
1439 static int handle_misc_portid(struct ft1000_usb *dev)
1441 struct dpram_blk *pdpram_blk;
1444 pdpram_blk = ft1000_get_buffer(&freercvpool);
1445 if (pdpram_blk == NULL) {
1446 DEBUG("Out of memory in free receive command pool\n");
1449 if (!ft1000_receive_cmd(dev, pdpram_blk->pbuffer, MAX_CMD_SQSIZE))
1452 /* Search for correct application block */
1453 for (i = 0; i < MAX_NUM_APP; i++) {
1454 if (dev->app_info[i].app_id == ((struct pseudo_hdr *)
1455 pdpram_blk->pbuffer)->portdest)
1458 if (i == MAX_NUM_APP) {
1459 DEBUG("FT1000:ft1000_parse_dpram_msg: No application matching id = %d\n", ((struct pseudo_hdr *)pdpram_blk->pbuffer)->portdest);
1461 } else if (dev->app_info[i].NumOfMsg > MAX_MSG_LIMIT) {
1464 dev->app_info[i].nRxMsg++;
1465 /* Put message into the appropriate application block */
1466 list_add_tail(&pdpram_blk->list, &dev->app_info[i].app_sqlist);
1467 dev->app_info[i].NumOfMsg++;
1472 ft1000_free_buffer(pdpram_blk, &freercvpool);
1476 int ft1000_poll(void *dev_id)
1478 struct ft1000_usb *dev = (struct ft1000_usb *)dev_id;
1479 struct ft1000_info *info = netdev_priv(dev->net);
1488 if (ft1000_chkcard(dev) == FALSE) {
1489 DEBUG("ft1000_poll::ft1000_chkcard: failed\n");
1492 status = ft1000_read_register(dev, &tempword, FT1000_REG_DOORBELL);
1494 if (tempword & FT1000_DB_DPRAM_RX) {
1495 status = ft1000_read_dpram16(dev,
1496 0x200, (u8 *)&data, 0);
1497 size = ntohs(data) + 16 + 2;
1499 modulo = 4 - (size % 4);
1500 size = size + modulo;
1502 status = ft1000_read_dpram16(dev, 0x201,
1505 if (size < MAX_CMD_SQSIZE) {
1508 DEBUG("ft1000_poll: FT1000_REG_DOORBELL message type: FT1000_DB_DPRAM_RX : portid DRIVERID\n");
1509 status = ft1000_proc_drvmsg(dev, size);
1514 status = dsp_broadcast_msg_id(dev);
1517 status = handle_misc_portid(dev);
1521 DEBUG("FT1000:dpc:Invalid total length for SlowQ = %d\n", size);
1522 status = ft1000_write_register(dev,
1524 FT1000_REG_DOORBELL);
1525 } else if (tempword & FT1000_DSP_ASIC_RESET) {
1526 /* Let's reset the ASIC from the Host side as well */
1527 status = ft1000_write_register(dev, ASIC_RESET_BIT,
1529 status = ft1000_read_register(dev, &tempword,
1532 while (tempword & ASIC_RESET_BIT) {
1533 status = ft1000_read_register(dev, &tempword,
1535 usleep_range(9000, 11000);
1541 DEBUG("Unable to reset ASIC\n");
1544 usleep_range(9000, 11000);
1545 /* Program WMARK register */
1546 status = ft1000_write_register(dev, 0x600,
1547 FT1000_REG_MAG_WATERMARK);
1548 /* clear ASIC reset doorbell */
1549 status = ft1000_write_register(dev,
1550 FT1000_DSP_ASIC_RESET,
1551 FT1000_REG_DOORBELL);
1552 usleep_range(9000, 11000);
1553 } else if (tempword & FT1000_ASIC_RESET_REQ) {
1554 DEBUG("ft1000_poll: FT1000_REG_DOORBELL message type: FT1000_ASIC_RESET_REQ\n");
1555 /* clear ASIC reset request from DSP */
1556 status = ft1000_write_register(dev,
1557 FT1000_ASIC_RESET_REQ,
1558 FT1000_REG_DOORBELL);
1559 status = ft1000_write_register(dev, HOST_INTF_BE,
1560 FT1000_REG_SUP_CTRL);
1561 /* copy dsp session record from Adapter block */
1562 status = ft1000_write_dpram32(dev, 0,
1563 (u8 *)&info->DSPSess.Rec[0], 1024);
1564 status = ft1000_write_register(dev, 0x600,
1565 FT1000_REG_MAG_WATERMARK);
1566 /* ring doorbell to tell DSP that
1567 * ASIC is out of reset
1569 status = ft1000_write_register(dev,
1570 FT1000_ASIC_RESET_DSP,
1571 FT1000_REG_DOORBELL);
1572 } else if (tempword & FT1000_DB_COND_RESET) {
1573 DEBUG("ft1000_poll: FT1000_REG_DOORBELL message type: FT1000_DB_COND_RESET\n");
1574 if (!dev->fAppMsgPend) {
1575 /* Reset ASIC and DSP */
1576 status = ft1000_read_dpram16(dev,
1577 FT1000_MAG_DSP_TIMER0,
1578 (u8 *)&(info->DSP_TIME[0]),
1579 FT1000_MAG_DSP_TIMER0_INDX);
1580 status = ft1000_read_dpram16(dev,
1581 FT1000_MAG_DSP_TIMER1,
1582 (u8 *)&(info->DSP_TIME[1]),
1583 FT1000_MAG_DSP_TIMER1_INDX);
1584 status = ft1000_read_dpram16(dev,
1585 FT1000_MAG_DSP_TIMER2,
1586 (u8 *)&(info->DSP_TIME[2]),
1587 FT1000_MAG_DSP_TIMER2_INDX);
1588 status = ft1000_read_dpram16(dev,
1589 FT1000_MAG_DSP_TIMER3,
1590 (u8 *)&(info->DSP_TIME[3]),
1591 FT1000_MAG_DSP_TIMER3_INDX);
1592 info->CardReady = 0;
1593 info->DrvErrNum = DSP_CONDRESET_INFO;
1594 DEBUG("ft1000_hw:DSP conditional reset requested\n");
1595 info->ft1000_reset(dev->net);
1597 dev->fProvComplete = false;
1598 dev->fCondResetPend = true;
1600 ft1000_write_register(dev, FT1000_DB_COND_RESET,
1601 FT1000_REG_DOORBELL);