1 /* CopyRight (C) 2007 Qualcomm Inc. All Rights Reserved.
4 * This file is part of Express Card USB Driver
7 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
9 #include <linux/kernel.h>
10 #include <linux/module.h>
11 #include <linux/netdevice.h>
12 #include <linux/etherdevice.h>
13 #include <linux/usb.h>
14 #include "ft1000_usb.h"
15 #include <linux/types.h>
17 #define HARLEY_READ_REGISTER 0x0
18 #define HARLEY_WRITE_REGISTER 0x01
19 #define HARLEY_READ_DPRAM_32 0x02
20 #define HARLEY_READ_DPRAM_LOW 0x03
21 #define HARLEY_READ_DPRAM_HIGH 0x04
22 #define HARLEY_WRITE_DPRAM_32 0x05
23 #define HARLEY_WRITE_DPRAM_LOW 0x06
24 #define HARLEY_WRITE_DPRAM_HIGH 0x07
26 #define HARLEY_READ_OPERATION 0xc1
27 #define HARLEY_WRITE_OPERATION 0x41
33 static int ft1000_submit_rx_urb(struct ft1000_info
*info
);
35 static u8 tempbuffer
[1600];
37 #define MAX_RCV_LOOP 100
39 /* send a control message via USB interface synchronously
40 * Parameters: ft1000_usb - device structure
41 * pipe - usb control message pipe
42 * request - control request
43 * requesttype - control message request type
44 * value - value to be written or 0
45 * index - register index
46 * data - data buffer to hold the read/write values
48 * timeout - control message time out value
50 static int ft1000_control(struct ft1000_usb
*ft1000dev
, unsigned int pipe
,
51 u8 request
, u8 requesttype
, u16 value
, u16 index
,
52 void *data
, u16 size
, int timeout
)
56 if ((ft1000dev
== NULL
) || (ft1000dev
->dev
== NULL
)) {
57 pr_debug("ft1000dev or ft1000dev->dev == NULL, failure\n");
61 ret
= usb_control_msg(ft1000dev
->dev
, pipe
, request
, requesttype
,
62 value
, index
, data
, size
, timeout
);
70 /* returns the value in a register */
71 int ft1000_read_register(struct ft1000_usb
*ft1000dev
, u16
*Data
,
76 ret
= ft1000_control(ft1000dev
,
77 usb_rcvctrlpipe(ft1000dev
->dev
, 0),
79 HARLEY_READ_OPERATION
,
84 USB_CTRL_GET_TIMEOUT
);
89 /* writes the value in a register */
90 int ft1000_write_register(struct ft1000_usb
*ft1000dev
, u16 value
,
95 ret
= ft1000_control(ft1000dev
,
96 usb_sndctrlpipe(ft1000dev
->dev
, 0),
97 HARLEY_WRITE_REGISTER
,
98 HARLEY_WRITE_OPERATION
,
103 USB_CTRL_SET_TIMEOUT
);
108 /* read a number of bytes from DPRAM */
109 int ft1000_read_dpram32(struct ft1000_usb
*ft1000dev
, u16 indx
, u8
*buffer
,
114 ret
= ft1000_control(ft1000dev
,
115 usb_rcvctrlpipe(ft1000dev
->dev
, 0),
116 HARLEY_READ_DPRAM_32
,
117 HARLEY_READ_OPERATION
,
122 USB_CTRL_GET_TIMEOUT
);
127 /* writes into DPRAM a number of bytes */
128 int ft1000_write_dpram32(struct ft1000_usb
*ft1000dev
, u16 indx
, u8
*buffer
,
134 cnt
+= cnt
- (cnt
% 4);
136 ret
= ft1000_control(ft1000dev
,
137 usb_sndctrlpipe(ft1000dev
->dev
, 0),
138 HARLEY_WRITE_DPRAM_32
,
139 HARLEY_WRITE_OPERATION
,
144 USB_CTRL_SET_TIMEOUT
);
149 /* read 16 bits from DPRAM */
150 int ft1000_read_dpram16(struct ft1000_usb
*ft1000dev
, u16 indx
, u8
*buffer
,
157 request
= HARLEY_READ_DPRAM_LOW
;
159 request
= HARLEY_READ_DPRAM_HIGH
;
161 ret
= ft1000_control(ft1000dev
,
162 usb_rcvctrlpipe(ft1000dev
->dev
, 0),
164 HARLEY_READ_OPERATION
,
169 USB_CTRL_GET_TIMEOUT
);
174 /* write into DPRAM a number of bytes */
175 int ft1000_write_dpram16(struct ft1000_usb
*ft1000dev
, u16 indx
, u16 value
,
182 request
= HARLEY_WRITE_DPRAM_LOW
;
184 request
= HARLEY_WRITE_DPRAM_HIGH
;
186 ret
= ft1000_control(ft1000dev
,
187 usb_sndctrlpipe(ft1000dev
->dev
, 0),
189 HARLEY_WRITE_OPERATION
,
194 USB_CTRL_SET_TIMEOUT
);
199 /* read DPRAM 4 words at a time */
200 int fix_ft1000_read_dpram32(struct ft1000_usb
*ft1000dev
, u16 indx
,
207 pos
= (indx
/ 4) * 4;
208 ret
= ft1000_read_dpram32(ft1000dev
, pos
, buf
, 16);
211 pos
= (indx
% 4) * 4;
212 *buffer
++ = buf
[pos
++];
213 *buffer
++ = buf
[pos
++];
214 *buffer
++ = buf
[pos
++];
215 *buffer
++ = buf
[pos
++];
217 pr_debug("DPRAM32 Read failed\n");
228 /* Description: This function write to DPRAM 4 words at a time */
229 int fix_ft1000_write_dpram32(struct ft1000_usb
*ft1000dev
, u16 indx
, u8
*buffer
)
239 pos1
= (indx
/ 4) * 4;
241 ret
= ft1000_read_dpram32(ft1000dev
, pos1
, buf
, 16);
245 buf
[pos2
++] = *buffer
++;
246 buf
[pos2
++] = *buffer
++;
247 buf
[pos2
++] = *buffer
++;
248 buf
[pos2
++] = *buffer
++;
249 ret
= ft1000_write_dpram32(ft1000dev
, pos1
, buf
, 16);
251 pr_debug("DPRAM32 Read failed\n");
255 ret
= ft1000_read_dpram32(ft1000dev
, pos1
, (u8
*)&resultbuffer
[0], 16);
259 for (i
= 0; i
< 16; i
++) {
260 if (buf
[i
] != resultbuffer
[i
])
266 ret
= ft1000_write_dpram32(ft1000dev
, pos1
,
267 (u8
*)&tempbuffer
[0], 16);
268 ret
= ft1000_read_dpram32(ft1000dev
, pos1
,
269 (u8
*)&resultbuffer
[0], 16);
272 for (i
= 0; i
< 16; i
++) {
273 if (tempbuffer
[i
] != resultbuffer
[i
]) {
275 pr_debug("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 pr_debug("Reset DSP\n");
297 status
= ft1000_read_register(ft1000dev
, &tempword
,
299 tempword
|= DSP_RESET_BIT
;
300 status
= ft1000_write_register(ft1000dev
, tempword
,
303 pr_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 int card_send_command(struct ft1000_usb
*ft1000dev
, void *ptempbuffer
,
331 unsigned char *commandbuf
;
333 pr_debug("enter card_send_command... size=%d\n", size
);
335 ret
= ft1000_read_register(ft1000dev
, &temp
, FT1000_REG_DOORBELL
);
339 commandbuf
= kmalloc(size
+ 2, GFP_KERNEL
);
342 memcpy((void *)commandbuf
+ 2, (void *)ptempbuffer
, size
);
345 usleep_range(900, 1100);
347 /* check for odd word */
350 /* Must force to be 32 bit aligned */
352 size
+= 4 - (size
% 4);
354 ret
= ft1000_write_dpram32(ft1000dev
, 0, commandbuf
, size
);
357 usleep_range(900, 1100);
358 ret
= ft1000_write_register(ft1000dev
, FT1000_DB_DPRAM_TX
,
359 FT1000_REG_DOORBELL
);
362 usleep_range(900, 1100);
364 ret
= ft1000_read_register(ft1000dev
, &temp
, FT1000_REG_DOORBELL
);
367 if ((temp
& 0x0100) == 0)
368 pr_debug("Message sent\n");
373 /* load or reload the DSP */
374 int dsp_reload(struct ft1000_usb
*ft1000dev
)
380 struct ft1000_info
*pft1000info
;
382 pft1000info
= netdev_priv(ft1000dev
->net
);
384 pft1000info
->CardReady
= 0;
386 /* Program Interrupt Mask register */
387 status
= ft1000_write_register(ft1000dev
, 0xffff, FT1000_REG_SUP_IMASK
);
389 status
= ft1000_read_register(ft1000dev
, &tempword
, FT1000_REG_RESET
);
390 tempword
|= ASIC_RESET_BIT
;
391 status
= ft1000_write_register(ft1000dev
, tempword
, FT1000_REG_RESET
);
393 status
= ft1000_read_register(ft1000dev
, &tempword
, FT1000_REG_RESET
);
394 pr_debug("Reset Register = 0x%x\n", tempword
);
396 /* Toggle DSP reset */
397 card_reset_dsp(ft1000dev
, 1);
399 card_reset_dsp(ft1000dev
, 0);
403 ft1000_write_register(ft1000dev
, HOST_INTF_BE
, FT1000_REG_SUP_CTRL
);
405 /* Let's check for FEFE */
407 ft1000_read_dpram32(ft1000dev
, FT1000_MAG_DPRAM_FEFE_INDX
,
409 pr_debug("templong (fefe) = 0x%8x\n", templong
);
411 /* call codeloader */
412 status
= scram_dnldr(ft1000dev
, pFileStart
, FileLength
);
422 /* call the Card Service function to reset the ASIC. */
423 static void ft1000_reset_asic(struct net_device
*dev
)
425 struct ft1000_info
*info
= netdev_priv(dev
);
426 struct ft1000_usb
*ft1000dev
= info
->priv
;
429 /* Let's use the register provided by the Magnemite ASIC to reset the
432 ft1000_write_register(ft1000dev
, (DSP_RESET_BIT
| ASIC_RESET_BIT
),
437 /* set watermark to -1 in order to not generate an interrupt */
438 ft1000_write_register(ft1000dev
, 0xffff, FT1000_REG_MAG_WATERMARK
);
440 /* clear interrupts */
441 ft1000_read_register(ft1000dev
, &tempword
, FT1000_REG_SUP_ISR
);
442 pr_debug("interrupt status register = 0x%x\n", tempword
);
443 ft1000_write_register(ft1000dev
, tempword
, FT1000_REG_SUP_ISR
);
444 ft1000_read_register(ft1000dev
, &tempword
, FT1000_REG_SUP_ISR
);
445 pr_debug("interrupt status register = 0x%x\n", tempword
);
448 static int ft1000_reset_card(struct net_device
*dev
)
450 struct ft1000_info
*info
= netdev_priv(dev
);
451 struct ft1000_usb
*ft1000dev
= info
->priv
;
453 struct prov_record
*ptr
;
455 ft1000dev
->fCondResetPend
= true;
457 ft1000dev
->fProvComplete
= false;
459 /* Make sure we free any memory reserve for provisioning */
460 while (list_empty(&info
->prov_list
) == 0) {
461 pr_debug("deleting provisioning record\n");
463 list_entry(info
->prov_list
.next
, struct prov_record
, list
);
464 list_del(&ptr
->list
);
465 kfree(ptr
->pprov_data
);
469 pr_debug("reset asic\n");
470 ft1000_reset_asic(dev
);
472 pr_debug("call dsp_reload\n");
473 dsp_reload(ft1000dev
);
475 pr_debug("dsp reload successful\n");
479 /* Initialize DSP heartbeat area */
480 ft1000_write_dpram16(ft1000dev
, FT1000_MAG_HI_HO
, ho_mag
,
481 FT1000_MAG_HI_HO_INDX
);
482 ft1000_read_dpram16(ft1000dev
, FT1000_MAG_HI_HO
, (u8
*)&tempword
,
483 FT1000_MAG_HI_HO_INDX
);
484 pr_debug("hi_ho value = 0x%x\n", tempword
);
488 ft1000dev
->fCondResetPend
= false;
493 /* callback function when a urb is transmitted */
494 static void ft1000_usb_transmit_complete(struct urb
*urb
)
497 struct ft1000_usb
*ft1000dev
= urb
->context
;
500 pr_err("%s: TX status %d\n", ft1000dev
->net
->name
, urb
->status
);
502 netif_wake_queue(ft1000dev
->net
);
505 /* take an ethernet packet and convert it to a Flarion
506 * packet prior to sending it to the ASIC Downlink FIFO.
508 static int ft1000_copy_down_pkt(struct net_device
*netdev
, u8
*packet
, u16 len
)
510 struct ft1000_info
*pInfo
= netdev_priv(netdev
);
511 struct ft1000_usb
*pFt1000Dev
= pInfo
->priv
;
515 struct pseudo_hdr hdr
;
517 if (!pInfo
->CardReady
) {
518 pr_debug("Card Not Ready\n");
522 count
= sizeof(struct pseudo_hdr
) + len
;
523 if (count
> MAX_BUF_SIZE
) {
524 pr_debug("Message Size Overflow! size = %d\n", count
);
529 count
= count
+ (4 - (count
% 4));
531 memset(&hdr
, 0, sizeof(struct pseudo_hdr
));
533 hdr
.length
= ntohs(count
);
535 hdr
.destination
= 0x20;
538 hdr
.sh_str_id
= 0x91;
541 hdr
.checksum
= hdr
.length
^ hdr
.source
^ hdr
.destination
^
542 hdr
.portdest
^ hdr
.portsrc
^ hdr
.sh_str_id
^ hdr
.control
;
544 memcpy(&pFt1000Dev
->tx_buf
[0], &hdr
, sizeof(hdr
));
545 memcpy(&(pFt1000Dev
->tx_buf
[sizeof(struct pseudo_hdr
)]), packet
, len
);
547 netif_stop_queue(netdev
);
549 usb_fill_bulk_urb(pFt1000Dev
->tx_urb
,
551 usb_sndbulkpipe(pFt1000Dev
->dev
,
552 pFt1000Dev
->bulk_out_endpointAddr
),
553 pFt1000Dev
->tx_buf
, count
,
554 ft1000_usb_transmit_complete
, (void *)pFt1000Dev
);
556 t
= (u8
*)pFt1000Dev
->tx_urb
->transfer_buffer
;
558 ret
= usb_submit_urb(pFt1000Dev
->tx_urb
, GFP_ATOMIC
);
561 pr_debug("failed tx_urb %d\n", ret
);
564 pInfo
->stats
.tx_packets
++;
565 pInfo
->stats
.tx_bytes
+= (len
+ 14);
570 /* transmit an ethernet packet
571 * Parameters: skb - socket buffer to be sent
572 * dev - network device
574 static int ft1000_start_xmit(struct sk_buff
*skb
, struct net_device
*dev
)
576 struct ft1000_info
*pInfo
= netdev_priv(dev
);
577 struct ft1000_usb
*pFt1000Dev
= pInfo
->priv
;
582 pr_debug("skb == NULL!!!\n");
586 if (pFt1000Dev
->status
& FT1000_STATUS_CLOSING
) {
587 pr_debug("network driver is closed, return\n");
592 usb_sndbulkpipe(pFt1000Dev
->dev
, pFt1000Dev
->bulk_out_endpointAddr
);
593 maxlen
= usb_maxpacket(pFt1000Dev
->dev
, pipe
, usb_pipeout(pipe
));
595 pdata
= (u8
*)skb
->data
;
597 if (pInfo
->mediastate
== 0) {
598 /* Drop packet is mediastate is down */
599 pr_debug("mediastate is down\n");
603 if ((skb
->len
< ENET_HEADER_SIZE
) || (skb
->len
> ENET_MAX_SIZE
)) {
604 /* Drop packet which has invalid size */
605 pr_debug("invalid ethernet length\n");
609 ft1000_copy_down_pkt(dev
, (pdata
+ ENET_HEADER_SIZE
- 2),
610 skb
->len
- ENET_HEADER_SIZE
+ 2);
618 /* open the network driver */
619 static int ft1000_open(struct net_device
*dev
)
621 struct ft1000_info
*pInfo
= netdev_priv(dev
);
622 struct ft1000_usb
*pFt1000Dev
= pInfo
->priv
;
625 pr_debug("ft1000_open is called for card %d\n", pFt1000Dev
->CardNumber
);
627 pInfo
->stats
.rx_bytes
= 0;
628 pInfo
->stats
.tx_bytes
= 0;
629 pInfo
->stats
.rx_packets
= 0;
630 pInfo
->stats
.tx_packets
= 0;
631 do_gettimeofday(&tv
);
632 pInfo
->ConTm
= tv
.tv_sec
;
633 pInfo
->ProgConStat
= 0;
635 netif_start_queue(dev
);
637 netif_carrier_on(dev
);
639 return ft1000_submit_rx_urb(pInfo
);
642 static struct net_device_stats
*ft1000_netdev_stats(struct net_device
*dev
)
644 struct ft1000_info
*info
= netdev_priv(dev
);
646 return &(info
->stats
);
649 static const struct net_device_ops ftnet_ops
= {
650 .ndo_open
= &ft1000_open
,
651 .ndo_stop
= &ft1000_close
,
652 .ndo_start_xmit
= &ft1000_start_xmit
,
653 .ndo_get_stats
= &ft1000_netdev_stats
,
656 /* initialize the network device */
657 static int ft1000_reset(void *dev
)
659 ft1000_reset_card(dev
);
663 int init_ft1000_netdev(struct ft1000_usb
*ft1000dev
)
665 struct net_device
*netdev
;
666 struct ft1000_info
*pInfo
= NULL
;
667 struct dpram_blk
*pdpram_blk
;
669 struct list_head
*cur
, *tmp
;
673 netdev
= alloc_etherdev(sizeof(struct ft1000_info
));
675 pr_debug("can not allocate network device\n");
679 pInfo
= netdev_priv(netdev
);
681 memset(pInfo
, 0, sizeof(struct ft1000_info
));
683 dev_alloc_name(netdev
, netdev
->name
);
685 pr_debug("network device name is %s\n", netdev
->name
);
687 if (strncmp(netdev
->name
, "eth", 3) == 0) {
688 card_nr
[0] = netdev
->name
[3];
690 ret_val
= kstrtou8(card_nr
, 10, &gCardIndex
);
692 netdev_err(ft1000dev
->net
, "Can't parse netdev\n");
696 ft1000dev
->CardNumber
= gCardIndex
;
697 pr_debug("card number = %d\n", ft1000dev
->CardNumber
);
699 netdev_err(ft1000dev
->net
, "ft1000: Invalid device name\n");
704 memset(&pInfo
->stats
, 0, sizeof(struct net_device_stats
));
706 spin_lock_init(&pInfo
->dpram_lock
);
707 pInfo
->priv
= ft1000dev
;
708 pInfo
->DrvErrNum
= 0;
709 pInfo
->registered
= 1;
710 pInfo
->ft1000_reset
= ft1000_reset
;
711 pInfo
->mediastate
= 0;
713 ft1000dev
->DeviceCreated
= FALSE
;
714 pInfo
->CardReady
= 0;
715 pInfo
->DSP_TIME
[0] = 0;
716 pInfo
->DSP_TIME
[1] = 0;
717 pInfo
->DSP_TIME
[2] = 0;
718 pInfo
->DSP_TIME
[3] = 0;
719 ft1000dev
->fAppMsgPend
= false;
720 ft1000dev
->fCondResetPend
= false;
721 ft1000dev
->usbboot
= 0;
722 ft1000dev
->dspalive
= 0;
723 memset(&ft1000dev
->tempbuf
[0], 0, sizeof(ft1000dev
->tempbuf
));
725 INIT_LIST_HEAD(&pInfo
->prov_list
);
727 INIT_LIST_HEAD(&ft1000dev
->nodes
.list
);
729 netdev
->netdev_ops
= &ftnet_ops
;
731 ft1000dev
->net
= netdev
;
733 pr_debug("Initialize free_buff_lock and freercvpool\n");
734 spin_lock_init(&free_buff_lock
);
736 /* initialize a list of buffers to be use for queuing
737 * up receive command data
739 INIT_LIST_HEAD(&freercvpool
);
741 /* create list of free buffers */
742 for (i
= 0; i
< NUM_OF_FREE_BUFFERS
; i
++) {
743 /* Get memory for DPRAM_DATA link list */
744 pdpram_blk
= kmalloc(sizeof(struct dpram_blk
), GFP_KERNEL
);
745 if (pdpram_blk
== NULL
) {
749 /* Get a block of memory to store command data */
750 pdpram_blk
->pbuffer
= kmalloc(MAX_CMD_SQSIZE
, GFP_KERNEL
);
751 if (pdpram_blk
->pbuffer
== NULL
) {
756 /* link provisioning data */
757 list_add_tail(&pdpram_blk
->list
, &freercvpool
);
759 numofmsgbuf
= NUM_OF_FREE_BUFFERS
;
764 list_for_each_safe(cur
, tmp
, &freercvpool
) {
765 pdpram_blk
= list_entry(cur
, struct dpram_blk
, list
);
766 list_del(&pdpram_blk
->list
);
767 kfree(pdpram_blk
->pbuffer
);
775 /* register the network driver */
776 int reg_ft1000_netdev(struct ft1000_usb
*ft1000dev
,
777 struct usb_interface
*intf
)
779 struct net_device
*netdev
;
780 struct ft1000_info
*pInfo
;
783 netdev
= ft1000dev
->net
;
784 pInfo
= netdev_priv(ft1000dev
->net
);
786 ft1000_read_register(ft1000dev
, &pInfo
->AsicID
, FT1000_REG_ASIC_ID
);
788 usb_set_intfdata(intf
, pInfo
);
789 SET_NETDEV_DEV(netdev
, &intf
->dev
);
791 rc
= register_netdev(netdev
);
793 pr_debug("could not register network device\n");
798 ft1000_create_dev(ft1000dev
);
800 pInfo
->CardReady
= 1;
805 /* take a packet from the FIFO up link and
806 * convert it into an ethernet packet and deliver it to the IP stack
808 static int ft1000_copy_up_pkt(struct urb
*urb
)
810 struct ft1000_info
*info
= urb
->context
;
811 struct ft1000_usb
*ft1000dev
= info
->priv
;
812 struct net_device
*net
= ft1000dev
->net
;
823 if (ft1000dev
->status
& FT1000_STATUS_CLOSING
) {
824 pr_debug("network driver is closed, return\n");
828 len
= urb
->transfer_buffer_length
;
829 lena
= urb
->actual_length
;
831 chksum
= (u16
*)ft1000dev
->rx_buf
;
833 tempword
= *chksum
++;
834 for (i
= 1; i
< 7; i
++)
835 tempword
^= *chksum
++;
837 if (tempword
!= *chksum
) {
838 info
->stats
.rx_errors
++;
839 ft1000_submit_rx_urb(info
);
843 skb
= dev_alloc_skb(len
+ 12 + 2);
846 pr_debug("No Network buffers available\n");
847 info
->stats
.rx_errors
++;
848 ft1000_submit_rx_urb(info
);
852 pbuffer
= (u8
*)skb_put(skb
, len
+ 12);
854 /* subtract the number of bytes read already */
857 /* fake MAC address */
858 *pbuffer
++ = net
->dev_addr
[0];
859 *pbuffer
++ = net
->dev_addr
[1];
860 *pbuffer
++ = net
->dev_addr
[2];
861 *pbuffer
++ = net
->dev_addr
[3];
862 *pbuffer
++ = net
->dev_addr
[4];
863 *pbuffer
++ = net
->dev_addr
[5];
871 memcpy(pbuffer
, ft1000dev
->rx_buf
+ sizeof(struct pseudo_hdr
),
872 len
- sizeof(struct pseudo_hdr
));
876 skb
->protocol
= eth_type_trans(skb
, net
);
877 skb
->ip_summed
= CHECKSUM_UNNECESSARY
;
880 info
->stats
.rx_packets
++;
881 /* Add on 12 bytes for MAC address which was removed */
882 info
->stats
.rx_bytes
+= (lena
+ 12);
884 ft1000_submit_rx_urb(info
);
890 /* the receiving function of the network driver */
891 static int ft1000_submit_rx_urb(struct ft1000_info
*info
)
894 struct ft1000_usb
*pFt1000Dev
= info
->priv
;
896 if (pFt1000Dev
->status
& FT1000_STATUS_CLOSING
) {
897 pr_debug("network driver is closed, return\n");
901 usb_fill_bulk_urb(pFt1000Dev
->rx_urb
,
903 usb_rcvbulkpipe(pFt1000Dev
->dev
,
904 pFt1000Dev
->bulk_in_endpointAddr
),
905 pFt1000Dev
->rx_buf
, MAX_BUF_SIZE
,
906 (usb_complete_t
)ft1000_copy_up_pkt
, info
);
908 result
= usb_submit_urb(pFt1000Dev
->rx_urb
, GFP_ATOMIC
);
911 pr_err("submitting rx_urb %d failed\n", result
);
918 /* close the network driver */
919 int ft1000_close(struct net_device
*net
)
921 struct ft1000_info
*pInfo
= netdev_priv(net
);
922 struct ft1000_usb
*ft1000dev
= pInfo
->priv
;
924 ft1000dev
->status
|= FT1000_STATUS_CLOSING
;
926 pr_debug("pInfo=%p, ft1000dev=%p\n", pInfo
, ft1000dev
);
927 netif_carrier_off(net
);
928 netif_stop_queue(net
);
929 ft1000dev
->status
&= ~FT1000_STATUS_CLOSING
;
931 pInfo
->ProgConStat
= 0xff;
936 /* check if the device is presently available on the system. */
937 static int ft1000_chkcard(struct ft1000_usb
*dev
)
942 if (dev
->fCondResetPend
) {
943 pr_debug("Card is being reset, return FALSE\n");
946 /* Mask register is used to check for device presence since it is never
949 status
= ft1000_read_register(dev
, &tempword
, FT1000_REG_SUP_IMASK
);
951 pr_debug("IMASK = 0 Card not detected\n");
954 /* The system will return the value of 0xffff for the version register
955 * if the device is not present.
957 status
= ft1000_read_register(dev
, &tempword
, FT1000_REG_ASIC_ID
);
958 if (tempword
!= 0x1b01) {
959 dev
->status
|= FT1000_STATUS_CLOSING
;
960 pr_debug("Version = 0xffff Card not detected\n");
966 /* read a message from the dpram area.
968 * dev - network device structure
969 * pbuffer - caller supply address to buffer
971 static bool ft1000_receive_cmd(struct ft1000_usb
*dev
, u16
*pbuffer
,
981 ft1000_read_dpram16(dev
, FT1000_MAG_PH_LEN
, (u8
*)&size
,
982 FT1000_MAG_PH_LEN_INDX
);
983 size
= ntohs(size
) + PSEUDOSZ
;
985 pr_debug("Invalid command length = %d\n", size
);
988 ppseudohdr
= (u16
*)pbuffer
;
989 ft1000_write_register(dev
, FT1000_DPRAM_MAG_RX_BASE
,
990 FT1000_REG_DPRAM_ADDR
);
992 ft1000_read_register(dev
, pbuffer
, FT1000_REG_MAG_DPDATAH
);
994 ft1000_write_register(dev
, FT1000_DPRAM_MAG_RX_BASE
+ 1,
995 FT1000_REG_DPRAM_ADDR
);
996 for (i
= 0; i
<= (size
>> 2); i
++) {
998 ft1000_read_register(dev
, pbuffer
,
999 FT1000_REG_MAG_DPDATAL
);
1002 ft1000_read_register(dev
, pbuffer
,
1003 FT1000_REG_MAG_DPDATAH
);
1006 /* copy odd aligned word */
1008 ft1000_read_register(dev
, pbuffer
, FT1000_REG_MAG_DPDATAL
);
1012 ft1000_read_register(dev
, pbuffer
, FT1000_REG_MAG_DPDATAH
);
1015 if (size
& 0x0001) {
1016 /* copy odd byte from fifo */
1018 ft1000_read_register(dev
, &tempword
,
1019 FT1000_REG_DPRAM_DATA
);
1020 *pbuffer
= ntohs(tempword
);
1022 /* Check if pseudo header checksum is good
1023 * Calculate pseudo header checksum
1025 tempword
= *ppseudohdr
++;
1026 for (i
= 1; i
< 7; i
++)
1027 tempword
^= *ppseudohdr
++;
1029 if (tempword
!= *ppseudohdr
)
1035 static int ft1000_dsp_prov(void *arg
)
1037 struct ft1000_usb
*dev
= (struct ft1000_usb
*)arg
;
1038 struct ft1000_info
*info
= netdev_priv(dev
->net
);
1042 struct prov_record
*ptr
;
1043 struct pseudo_hdr
*ppseudo_hdr
;
1046 u16 TempShortBuf
[256];
1048 while (list_empty(&info
->prov_list
) == 0) {
1049 pr_debug("DSP Provisioning List Entry\n");
1051 /* Check if doorbell is available */
1052 pr_debug("check if doorbell is cleared\n");
1054 ft1000_read_register(dev
, &tempword
, FT1000_REG_DOORBELL
);
1056 pr_debug("ft1000_read_register error\n");
1060 while (tempword
& FT1000_DB_DPRAM_TX
) {
1064 pr_debug("message drop\n");
1067 ft1000_read_register(dev
, &tempword
,
1068 FT1000_REG_DOORBELL
);
1071 if (!(tempword
& FT1000_DB_DPRAM_TX
)) {
1072 pr_debug("*** Provision Data Sent to DSP\n");
1074 /* Send provisioning data */
1076 list_entry(info
->prov_list
.next
, struct prov_record
,
1078 len
= *(u16
*)ptr
->pprov_data
;
1082 pmsg
= (u16
*)ptr
->pprov_data
;
1083 ppseudo_hdr
= (struct pseudo_hdr
*)pmsg
;
1084 /* Insert slow queue sequence number */
1085 ppseudo_hdr
->seq_num
= info
->squeseqnum
++;
1086 ppseudo_hdr
->portsrc
= 0;
1087 /* Calculate new checksum */
1088 ppseudo_hdr
->checksum
= *pmsg
++;
1089 for (i
= 1; i
< 7; i
++)
1090 ppseudo_hdr
->checksum
^= *pmsg
++;
1092 TempShortBuf
[0] = 0;
1093 TempShortBuf
[1] = htons(len
);
1094 memcpy(&TempShortBuf
[2], ppseudo_hdr
, len
);
1097 ft1000_write_dpram32(dev
, 0,
1098 (u8
*)&TempShortBuf
[0],
1099 (unsigned short)(len
+ 2));
1101 ft1000_write_register(dev
, FT1000_DB_DPRAM_TX
,
1102 FT1000_REG_DOORBELL
);
1104 list_del(&ptr
->list
);
1105 kfree(ptr
->pprov_data
);
1108 usleep_range(9000, 11000);
1111 pr_debug("DSP Provisioning List Entry finished\n");
1115 dev
->fProvComplete
= true;
1116 info
->CardReady
= 1;
1121 static int ft1000_proc_drvmsg(struct ft1000_usb
*dev
, u16 size
)
1123 struct ft1000_info
*info
= netdev_priv(dev
->net
);
1126 struct media_msg
*pmediamsg
;
1127 struct dsp_init_msg
*pdspinitmsg
;
1128 struct drv_msg
*pdrvmsg
;
1130 struct pseudo_hdr
*ppseudo_hdr
;
1138 char *cmdbuffer
= kmalloc(1600, GFP_KERNEL
);
1143 status
= ft1000_read_dpram32(dev
, 0x200, cmdbuffer
, size
);
1146 print_hex_dump_debug("cmdbuffer: ", HEX_DUMP_OFFSET
, 16, 1,
1147 cmdbuffer
, size
, true);
1149 pdrvmsg
= (struct drv_msg
*)&cmdbuffer
[2];
1150 msgtype
= ntohs(pdrvmsg
->type
);
1151 pr_debug("Command message type = 0x%x\n", msgtype
);
1154 pr_debug("Command message type = MEDIA_STATE\n");
1155 pmediamsg
= (struct media_msg
*)&cmdbuffer
[0];
1156 if (info
->ProgConStat
!= 0xFF) {
1157 if (pmediamsg
->state
) {
1158 pr_debug("Media is up\n");
1159 if (info
->mediastate
== 0) {
1160 if (dev
->NetDevRegDone
)
1161 netif_wake_queue(dev
->net
);
1162 info
->mediastate
= 1;
1165 pr_debug("Media is down\n");
1166 if (info
->mediastate
== 1) {
1167 info
->mediastate
= 0;
1168 if (dev
->NetDevRegDone
)
1173 pr_debug("Media is down\n");
1174 if (info
->mediastate
== 1) {
1175 info
->mediastate
= 0;
1182 pr_debug("Command message type = DSP_INIT_MSG\n");
1183 pdspinitmsg
= (struct dsp_init_msg
*)&cmdbuffer
[2];
1184 memcpy(info
->DspVer
, pdspinitmsg
->DspVer
, DSPVERSZ
);
1185 pr_debug("DSPVER = 0x%2x 0x%2x 0x%2x 0x%2x\n",
1186 info
->DspVer
[0], info
->DspVer
[1], info
->DspVer
[2],
1188 memcpy(info
->HwSerNum
, pdspinitmsg
->HwSerNum
,
1190 memcpy(info
->Sku
, pdspinitmsg
->Sku
, SKUSZ
);
1191 memcpy(info
->eui64
, pdspinitmsg
->eui64
, EUISZ
);
1192 pr_debug("EUI64=%2x.%2x.%2x.%2x.%2x.%2x.%2x.%2x\n",
1193 info
->eui64
[0], info
->eui64
[1], info
->eui64
[2],
1194 info
->eui64
[3], info
->eui64
[4], info
->eui64
[5],
1195 info
->eui64
[6], info
->eui64
[7]);
1196 dev
->net
->dev_addr
[0] = info
->eui64
[0];
1197 dev
->net
->dev_addr
[1] = info
->eui64
[1];
1198 dev
->net
->dev_addr
[2] = info
->eui64
[2];
1199 dev
->net
->dev_addr
[3] = info
->eui64
[5];
1200 dev
->net
->dev_addr
[4] = info
->eui64
[6];
1201 dev
->net
->dev_addr
[5] = info
->eui64
[7];
1203 if (ntohs(pdspinitmsg
->length
) ==
1204 (sizeof(struct dsp_init_msg
) - 20)) {
1205 memcpy(info
->ProductMode
, pdspinitmsg
->ProductMode
,
1207 memcpy(info
->RfCalVer
, pdspinitmsg
->RfCalVer
, CALVERSZ
);
1208 memcpy(info
->RfCalDate
, pdspinitmsg
->RfCalDate
,
1210 pr_debug("RFCalVer = 0x%2x 0x%2x\n",
1211 info
->RfCalVer
[0], info
->RfCalVer
[1]);
1215 case DSP_PROVISION
:{
1216 pr_debug("Command message type = DSP_PROVISION\n");
1218 /* kick off dspprov routine to start provisioning
1219 * Send provisioning data to DSP
1221 if (list_empty(&info
->prov_list
) == 0) {
1222 dev
->fProvComplete
= false;
1223 status
= ft1000_dsp_prov(dev
);
1227 dev
->fProvComplete
= true;
1228 status
= ft1000_write_register(dev
, FT1000_DB_HB
,
1229 FT1000_REG_DOORBELL
);
1230 pr_debug("No more DSP provisioning data in dsp image\n");
1232 pr_debug("DSP PROVISION is done\n");
1235 case DSP_STORE_INFO
:{
1236 pr_debug("Command message type = DSP_STORE_INFO");
1237 tempword
= ntohs(pdrvmsg
->length
);
1238 info
->DSPInfoBlklen
= tempword
;
1239 if (tempword
< (MAX_DSP_SESS_REC
- 4)) {
1240 pmsg
= (u16
*)&pdrvmsg
->data
[0];
1241 for (i
= 0; i
< ((tempword
+ 1) / 2); i
++) {
1242 pr_debug("dsp info data = 0x%x\n", *pmsg
);
1243 info
->DSPInfoBlk
[i
+ 10] = *pmsg
++;
1246 info
->DSPInfoBlklen
= 0;
1251 pr_debug("Got DSP_GET_INFO\n");
1252 /* copy dsp info block to dsp */
1253 dev
->DrvMsgPend
= 1;
1254 /* allow any outstanding ioctl to finish */
1256 status
= ft1000_read_register(dev
, &tempword
,
1257 FT1000_REG_DOORBELL
);
1258 if (tempword
& FT1000_DB_DPRAM_TX
) {
1260 status
= ft1000_read_register(dev
, &tempword
,
1261 FT1000_REG_DOORBELL
);
1262 if (tempword
& FT1000_DB_DPRAM_TX
) {
1264 status
= ft1000_read_register(dev
, &tempword
,
1265 FT1000_REG_DOORBELL
);
1266 if (tempword
& FT1000_DB_DPRAM_TX
)
1270 /* Put message into Slow Queue Form Pseudo header */
1271 pmsg
= (u16
*)info
->DSPInfoBlk
;
1273 *pmsg
++ = htons(info
->DSPInfoBlklen
+ 20 + info
->DSPInfoBlklen
);
1275 (struct pseudo_hdr
*)(u16
*)&info
->DSPInfoBlk
[2];
1276 ppseudo_hdr
->length
= htons(info
->DSPInfoBlklen
+ 4
1277 + info
->DSPInfoBlklen
);
1278 ppseudo_hdr
->source
= 0x10;
1279 ppseudo_hdr
->destination
= 0x20;
1280 ppseudo_hdr
->portdest
= 0;
1281 ppseudo_hdr
->portsrc
= 0;
1282 ppseudo_hdr
->sh_str_id
= 0;
1283 ppseudo_hdr
->control
= 0;
1284 ppseudo_hdr
->rsvd1
= 0;
1285 ppseudo_hdr
->rsvd2
= 0;
1286 ppseudo_hdr
->qos_class
= 0;
1287 /* Insert slow queue sequence number */
1288 ppseudo_hdr
->seq_num
= info
->squeseqnum
++;
1289 /* Insert application id */
1290 ppseudo_hdr
->portsrc
= 0;
1291 /* Calculate new checksum */
1292 ppseudo_hdr
->checksum
= *pmsg
++;
1293 for (i
= 1; i
< 7; i
++)
1294 ppseudo_hdr
->checksum
^= *pmsg
++;
1296 info
->DSPInfoBlk
[10] = 0x7200;
1297 info
->DSPInfoBlk
[11] = htons(info
->DSPInfoBlklen
);
1298 status
= ft1000_write_dpram32(dev
, 0,
1299 (u8
*)&info
->DSPInfoBlk
[0],
1300 (unsigned short)(info
->DSPInfoBlklen
+ 22));
1301 status
= ft1000_write_register(dev
, FT1000_DB_DPRAM_TX
,
1302 FT1000_REG_DOORBELL
);
1303 dev
->DrvMsgPend
= 0;
1306 case GET_DRV_ERR_RPT_MSG
:{
1307 pr_debug("Got GET_DRV_ERR_RPT_MSG\n");
1308 /* copy driver error message to dsp */
1309 dev
->DrvMsgPend
= 1;
1310 /* allow any outstanding ioctl to finish */
1312 status
= ft1000_read_register(dev
, &tempword
,
1313 FT1000_REG_DOORBELL
);
1314 if (tempword
& FT1000_DB_DPRAM_TX
) {
1316 status
= ft1000_read_register(dev
, &tempword
,
1317 FT1000_REG_DOORBELL
);
1318 if (tempword
& FT1000_DB_DPRAM_TX
)
1321 if ((tempword
& FT1000_DB_DPRAM_TX
) == 0) {
1322 /* Put message into Slow Queue Form Pseudo header */
1323 pmsg
= (u16
*)&tempbuffer
[0];
1324 ppseudo_hdr
= (struct pseudo_hdr
*)pmsg
;
1325 ppseudo_hdr
->length
= htons(0x0012);
1326 ppseudo_hdr
->source
= 0x10;
1327 ppseudo_hdr
->destination
= 0x20;
1328 ppseudo_hdr
->portdest
= 0;
1329 ppseudo_hdr
->portsrc
= 0;
1330 ppseudo_hdr
->sh_str_id
= 0;
1331 ppseudo_hdr
->control
= 0;
1332 ppseudo_hdr
->rsvd1
= 0;
1333 ppseudo_hdr
->rsvd2
= 0;
1334 ppseudo_hdr
->qos_class
= 0;
1335 /* Insert slow queue sequence number */
1336 ppseudo_hdr
->seq_num
= info
->squeseqnum
++;
1337 /* Insert application id */
1338 ppseudo_hdr
->portsrc
= 0;
1339 /* Calculate new checksum */
1340 ppseudo_hdr
->checksum
= *pmsg
++;
1341 for (i
= 1; i
< 7; i
++)
1342 ppseudo_hdr
->checksum
^= *pmsg
++;
1344 pmsg
= (u16
*)&tempbuffer
[16];
1345 *pmsg
++ = htons(RSP_DRV_ERR_RPT_MSG
);
1346 *pmsg
++ = htons(0x000e);
1347 *pmsg
++ = htons(info
->DSP_TIME
[0]);
1348 *pmsg
++ = htons(info
->DSP_TIME
[1]);
1349 *pmsg
++ = htons(info
->DSP_TIME
[2]);
1350 *pmsg
++ = htons(info
->DSP_TIME
[3]);
1351 convert
.byte
[0] = info
->DspVer
[0];
1352 convert
.byte
[1] = info
->DspVer
[1];
1353 *pmsg
++ = convert
.wrd
;
1354 convert
.byte
[0] = info
->DspVer
[2];
1355 convert
.byte
[1] = info
->DspVer
[3];
1356 *pmsg
++ = convert
.wrd
;
1357 *pmsg
++ = htons(info
->DrvErrNum
);
1359 status
= card_send_command(dev
, (unsigned char *)&tempbuffer
[0],
1360 (u16
)(0x0012 + PSEUDOSZ
));
1363 info
->DrvErrNum
= 0;
1365 dev
->DrvMsgPend
= 0;
1378 /* Check which application has registered for dsp broadcast messages */
1379 static int dsp_broadcast_msg_id(struct ft1000_usb
*dev
)
1381 struct dpram_blk
*pdpram_blk
;
1382 unsigned long flags
;
1385 for (i
= 0; i
< MAX_NUM_APP
; i
++) {
1386 if ((dev
->app_info
[i
].DspBCMsgFlag
)
1387 && (dev
->app_info
[i
].fileobject
)
1388 && (dev
->app_info
[i
].NumOfMsg
1390 pdpram_blk
= ft1000_get_buffer(&freercvpool
);
1391 if (pdpram_blk
== NULL
) {
1392 pr_debug("Out of memory in free receive command pool\n");
1393 dev
->app_info
[i
].nRxMsgMiss
++;
1396 if (ft1000_receive_cmd(dev
, pdpram_blk
->pbuffer
,
1398 /* Put message into the
1399 * appropriate application block
1401 dev
->app_info
[i
].nRxMsg
++;
1402 spin_lock_irqsave(&free_buff_lock
, flags
);
1403 list_add_tail(&pdpram_blk
->list
,
1404 &dev
->app_info
[i
] .app_sqlist
);
1405 dev
->app_info
[i
].NumOfMsg
++;
1406 spin_unlock_irqrestore(&free_buff_lock
, flags
);
1407 wake_up_interruptible(&dev
->app_info
[i
]
1410 dev
->app_info
[i
].nRxMsgMiss
++;
1411 ft1000_free_buffer(pdpram_blk
, &freercvpool
);
1412 pr_debug("ft1000_get_buffer NULL\n");
1420 static int handle_misc_portid(struct ft1000_usb
*dev
)
1422 struct dpram_blk
*pdpram_blk
;
1425 pdpram_blk
= ft1000_get_buffer(&freercvpool
);
1426 if (pdpram_blk
== NULL
) {
1427 pr_debug("Out of memory in free receive command pool\n");
1430 if (!ft1000_receive_cmd(dev
, pdpram_blk
->pbuffer
, MAX_CMD_SQSIZE
))
1433 /* Search for correct application block */
1434 for (i
= 0; i
< MAX_NUM_APP
; i
++) {
1435 if (dev
->app_info
[i
].app_id
== ((struct pseudo_hdr
*)
1436 pdpram_blk
->pbuffer
)->portdest
)
1439 if (i
== MAX_NUM_APP
) {
1440 pr_debug("No application matching id = %d\n",
1441 ((struct pseudo_hdr
*)pdpram_blk
->pbuffer
)->portdest
);
1443 } else if (dev
->app_info
[i
].NumOfMsg
> MAX_MSG_LIMIT
) {
1446 dev
->app_info
[i
].nRxMsg
++;
1447 /* Put message into the appropriate application block */
1448 list_add_tail(&pdpram_blk
->list
, &dev
->app_info
[i
].app_sqlist
);
1449 dev
->app_info
[i
].NumOfMsg
++;
1454 ft1000_free_buffer(pdpram_blk
, &freercvpool
);
1458 int ft1000_poll(void *dev_id
)
1460 struct ft1000_usb
*dev
= (struct ft1000_usb
*)dev_id
;
1461 struct ft1000_info
*info
= netdev_priv(dev
->net
);
1470 if (ft1000_chkcard(dev
) == FALSE
) {
1471 pr_debug("failed\n");
1474 status
= ft1000_read_register(dev
, &tempword
, FT1000_REG_DOORBELL
);
1476 if (tempword
& FT1000_DB_DPRAM_RX
) {
1477 status
= ft1000_read_dpram16(dev
,
1478 0x200, (u8
*)&data
, 0);
1479 size
= ntohs(data
) + 16 + 2;
1481 modulo
= 4 - (size
% 4);
1482 size
= size
+ modulo
;
1484 status
= ft1000_read_dpram16(dev
, 0x201,
1487 if (size
< MAX_CMD_SQSIZE
) {
1490 pr_debug("FT1000_REG_DOORBELL message type: FT1000_DB_DPRAM_RX : portid DRIVERID\n");
1491 status
= ft1000_proc_drvmsg(dev
, size
);
1496 status
= dsp_broadcast_msg_id(dev
);
1499 status
= handle_misc_portid(dev
);
1503 pr_debug("Invalid total length for SlowQ = %d\n",
1505 status
= ft1000_write_register(dev
,
1507 FT1000_REG_DOORBELL
);
1508 } else if (tempword
& FT1000_DSP_ASIC_RESET
) {
1509 /* Let's reset the ASIC from the Host side as well */
1510 status
= ft1000_write_register(dev
, ASIC_RESET_BIT
,
1512 status
= ft1000_read_register(dev
, &tempword
,
1515 while (tempword
& ASIC_RESET_BIT
) {
1516 status
= ft1000_read_register(dev
, &tempword
,
1518 usleep_range(9000, 11000);
1524 pr_debug("Unable to reset ASIC\n");
1527 usleep_range(9000, 11000);
1528 /* Program WMARK register */
1529 status
= ft1000_write_register(dev
, 0x600,
1530 FT1000_REG_MAG_WATERMARK
);
1531 /* clear ASIC reset doorbell */
1532 status
= ft1000_write_register(dev
,
1533 FT1000_DSP_ASIC_RESET
,
1534 FT1000_REG_DOORBELL
);
1535 usleep_range(9000, 11000);
1536 } else if (tempword
& FT1000_ASIC_RESET_REQ
) {
1537 pr_debug("FT1000_REG_DOORBELL message type: FT1000_ASIC_RESET_REQ\n");
1538 /* clear ASIC reset request from DSP */
1539 status
= ft1000_write_register(dev
,
1540 FT1000_ASIC_RESET_REQ
,
1541 FT1000_REG_DOORBELL
);
1542 status
= ft1000_write_register(dev
, HOST_INTF_BE
,
1543 FT1000_REG_SUP_CTRL
);
1544 /* copy dsp session record from Adapter block */
1545 status
= ft1000_write_dpram32(dev
, 0,
1546 (u8
*)&info
->DSPSess
.Rec
[0], 1024);
1547 status
= ft1000_write_register(dev
, 0x600,
1548 FT1000_REG_MAG_WATERMARK
);
1549 /* ring doorbell to tell DSP that
1550 * ASIC is out of reset
1552 status
= ft1000_write_register(dev
,
1553 FT1000_ASIC_RESET_DSP
,
1554 FT1000_REG_DOORBELL
);
1555 } else if (tempword
& FT1000_DB_COND_RESET
) {
1556 pr_debug("FT1000_REG_DOORBELL message type: FT1000_DB_COND_RESET\n");
1557 if (!dev
->fAppMsgPend
) {
1558 /* Reset ASIC and DSP */
1559 status
= ft1000_read_dpram16(dev
,
1560 FT1000_MAG_DSP_TIMER0
,
1561 (u8
*)&(info
->DSP_TIME
[0]),
1562 FT1000_MAG_DSP_TIMER0_INDX
);
1563 status
= ft1000_read_dpram16(dev
,
1564 FT1000_MAG_DSP_TIMER1
,
1565 (u8
*)&(info
->DSP_TIME
[1]),
1566 FT1000_MAG_DSP_TIMER1_INDX
);
1567 status
= ft1000_read_dpram16(dev
,
1568 FT1000_MAG_DSP_TIMER2
,
1569 (u8
*)&(info
->DSP_TIME
[2]),
1570 FT1000_MAG_DSP_TIMER2_INDX
);
1571 status
= ft1000_read_dpram16(dev
,
1572 FT1000_MAG_DSP_TIMER3
,
1573 (u8
*)&(info
->DSP_TIME
[3]),
1574 FT1000_MAG_DSP_TIMER3_INDX
);
1575 info
->CardReady
= 0;
1576 info
->DrvErrNum
= DSP_CONDRESET_INFO
;
1577 pr_debug("DSP conditional reset requested\n");
1578 info
->ft1000_reset(dev
->net
);
1580 dev
->fProvComplete
= false;
1581 dev
->fCondResetPend
= true;
1583 ft1000_write_register(dev
, FT1000_DB_COND_RESET
,
1584 FT1000_REG_DOORBELL
);