blob: 2f19b0e7f7a85b0ab56b870c271de07b10c85d1d [file] [log] [blame]
Marek Beliskof7c1be02010-09-22 07:56:27 +02001//=====================================================
2// CopyRight (C) 2007 Qualcomm Inc. All Rights Reserved.
3//
4//
5// This file is part of Express Card USB Driver
6//
7// $Id:
8//====================================================
9// 20090926; aelias; removed compiler warnings & errors; ubuntu 9.04; 2.6.28-15-generic
10
11#include <linux/init.h>
12#include <linux/kernel.h>
13#include <linux/module.h>
14#include <linux/netdevice.h>
15#include <linux/etherdevice.h>
16#include <linux/usb.h>
17#include "ft1000_usb.h"
18#include <linux/types.h>
19//#include <asm/semaphore.h> //aelias [-] reason : file moved
20//#include <linux/semaphore.h> //aelias [+] reason : file moved
21//#include <asm/io.h>
22//#include <linux/kthread.h>
23
24#define HARLEY_READ_REGISTER 0x0
25#define HARLEY_WRITE_REGISTER 0x01
26#define HARLEY_READ_DPRAM_32 0x02
27#define HARLEY_READ_DPRAM_LOW 0x03
28#define HARLEY_READ_DPRAM_HIGH 0x04
29#define HARLEY_WRITE_DPRAM_32 0x05
30#define HARLEY_WRITE_DPRAM_LOW 0x06
31#define HARLEY_WRITE_DPRAM_HIGH 0x07
32
33#define HARLEY_READ_OPERATION 0xc1
34#define HARLEY_WRITE_OPERATION 0x41
35
36//#define JDEBUG
37
Arnd Bergmann2a953cf2010-09-30 10:24:10 +020038static int ft1000_reset(struct net_device *ft1000dev);
39static int ft1000_submit_rx_urb(PFT1000_INFO info);
Marek Beliskof7c1be02010-09-22 07:56:27 +020040static int ft1000_start_xmit(struct sk_buff *skb, struct net_device *dev);
41static int ft1000_open (struct net_device *dev);
Marek Beliskof7c1be02010-09-22 07:56:27 +020042static struct net_device_stats *ft1000_netdev_stats(struct net_device *dev);
Marek Beliskof7c1be02010-09-22 07:56:27 +020043static int ft1000_chkcard (struct ft1000_device *dev);
44/*
45static const struct net_device_ops ft1000net_ops = {
46 .ndo_start_xmit = ft1000_start_xmit,
47 .ndo_get_stats = ft1000_netdev_stats,
48 .ndo_open = ft1000_open,
49 .ndo_stop = ft1000_close,
50};
51*/
52
53//Jim
54
55static u8 tempbuffer[1600];
Marek Beliskof9d17372010-10-14 14:14:33 +020056static unsigned long gCardIndex;
Marek Beliskof7c1be02010-09-22 07:56:27 +020057
58#define MAX_RCV_LOOP 100
59
Marek Beliskof7c1be02010-09-22 07:56:27 +020060/****************************************************************
61 * ft1000_control_complete
62 ****************************************************************/
63static void ft1000_control_complete(struct urb *urb)
64{
65 struct ft1000_device *ft1000dev = (struct ft1000_device *)urb->context;
66
67 //DEBUG("FT1000_CONTROL_COMPLETE ENTERED\n");
68 if (ft1000dev == NULL )
69 {
70 DEBUG("NULL ft1000dev, failure\n");
71 return ;
72 }
73 else if ( ft1000dev->dev == NULL )
74 {
75 DEBUG("NULL ft1000dev->dev, failure\n");
76 return ;
77 }
78 //spin_lock(&ft1000dev->device_lock);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -070079
Marek Beliskof7c1be02010-09-22 07:56:27 +020080 if(waitqueue_active(&ft1000dev->control_wait))
81 {
82 wake_up(&ft1000dev->control_wait);
83 }
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -070084
Marek Beliskof7c1be02010-09-22 07:56:27 +020085 //DEBUG("FT1000_CONTROL_COMPLETE RETURNED\n");
86 //spin_unlock(&ft1000dev->device_lock);
87}
88
89//---------------------------------------------------------------------------
90// Function: ft1000_control
91//
92// Parameters: ft1000_device - device structure
93// pipe - usb control message pipe
94// request - control request
95// requesttype - control message request type
96// value - value to be written or 0
97// index - register index
98// data - data buffer to hold the read/write values
99// size - data size
100// timeout - control message time out value
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700101//
Marek Beliskof7c1be02010-09-22 07:56:27 +0200102// Returns: STATUS_SUCCESS - success
103// STATUS_FAILURE - failure
104//
105// Description: This function sends a control message via USB interface synchronously
106//
107// Notes:
108//
109//---------------------------------------------------------------------------
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700110static int ft1000_control(struct ft1000_device *ft1000dev,unsigned int pipe,
111 u8 request,
Marek Beliskof7c1be02010-09-22 07:56:27 +0200112 u8 requesttype,
113 u16 value,
114 u16 index,
115 void *data,
116 u16 size,
117 int timeout)
118{
119 u16 ret;
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700120
Marek Beliskof7c1be02010-09-22 07:56:27 +0200121 if (ft1000dev == NULL )
122 {
123 DEBUG("NULL ft1000dev, failure\n");
Marek Belisko310bad02010-10-14 13:36:11 +0200124 return -ENODEV;
Marek Beliskof7c1be02010-09-22 07:56:27 +0200125 }
126 else if ( ft1000dev->dev == NULL )
127 {
128 DEBUG("NULL ft1000dev->dev, failure\n");
Marek Belisko310bad02010-10-14 13:36:11 +0200129 return -ENODEV;
Marek Beliskof7c1be02010-09-22 07:56:27 +0200130 }
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700131
Marek Beliskof7c1be02010-09-22 07:56:27 +0200132 ret = usb_control_msg(ft1000dev->dev,
133 pipe,
134 request,
135 requesttype,
136 value,
137 index,
138 data,
139 size,
140 LARGE_TIMEOUT);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700141
Marek Belisko310bad02010-10-14 13:36:11 +0200142 if (ret > 0)
143 ret = 0;
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700144
145 return ret;
146
147
Marek Beliskof7c1be02010-09-22 07:56:27 +0200148}
149//---------------------------------------------------------------------------
150// Function: ft1000_read_register
151//
152// Parameters: ft1000_device - device structure
153// Data - data buffer to hold the value read
154// nRegIndex - register index
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700155//
Marek Beliskof7c1be02010-09-22 07:56:27 +0200156// Returns: STATUS_SUCCESS - success
157// STATUS_FAILURE - failure
158//
159// Description: This function returns the value in a register
160//
161// Notes:
162//
163//---------------------------------------------------------------------------
164
Arnd Bergmann2a953cf2010-09-30 10:24:10 +0200165u16 ft1000_read_register(struct ft1000_device *ft1000dev, u16* Data, u16 nRegIndx)
Marek Beliskof7c1be02010-09-22 07:56:27 +0200166{
167 u16 ret = STATUS_SUCCESS;
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700168
Marek Beliskof7c1be02010-09-22 07:56:27 +0200169 //DEBUG("ft1000_read_register: reg index is %d\n", nRegIndx);
170 //DEBUG("ft1000_read_register: spin_lock locked\n");
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700171 ret = ft1000_control(ft1000dev,
Marek Beliskof7c1be02010-09-22 07:56:27 +0200172 usb_rcvctrlpipe(ft1000dev->dev,0),
173 HARLEY_READ_REGISTER, //request --READ_REGISTER
174 HARLEY_READ_OPERATION, //requestType
175 0, //value
176 nRegIndx, //index
177 Data, //data
178 2, //data size
179 LARGE_TIMEOUT ); //timeout
Marek Beliskof7c1be02010-09-22 07:56:27 +0200180
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700181 //DEBUG("ft1000_read_register: ret is %d \n", ret);
182
183 //DEBUG("ft1000_read_register: data is %x \n", *Data);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700184
Marek Beliskof7c1be02010-09-22 07:56:27 +0200185 return ret;
186
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700187}
Marek Beliskof7c1be02010-09-22 07:56:27 +0200188
189//---------------------------------------------------------------------------
190// Function: ft1000_write_register
191//
192// Parameters: ft1000_device - device structure
193// value - value to write into a register
194// nRegIndex - register index
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700195//
Marek Beliskof7c1be02010-09-22 07:56:27 +0200196// Returns: STATUS_SUCCESS - success
197// STATUS_FAILURE - failure
198//
199// Description: This function writes the value in a register
200//
201// Notes:
202//
203//---------------------------------------------------------------------------
204u16 ft1000_write_register(struct ft1000_device *ft1000dev, USHORT value, u16 nRegIndx)
205{
206 u16 ret = STATUS_SUCCESS;
207
208 //DEBUG("ft1000_write_register: value is: %d, reg index is: %d\n", value, nRegIndx);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700209
Marek Beliskof7c1be02010-09-22 07:56:27 +0200210 ret = ft1000_control(ft1000dev,
211 usb_sndctrlpipe(ft1000dev->dev, 0),
212 HARLEY_WRITE_REGISTER, //request -- WRITE_REGISTER
213 HARLEY_WRITE_OPERATION, //requestType
214 value,
215 nRegIndx,
216 NULL,
217 0,
218 LARGE_TIMEOUT );
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700219
Marek Beliskof7c1be02010-09-22 07:56:27 +0200220 return ret;
221}
222
223//---------------------------------------------------------------------------
224// Function: ft1000_read_dpram32
225//
226// Parameters: ft1000_device - device structure
227// indx - starting address to read
228// buffer - data buffer to hold the data read
229// cnt - number of byte read from DPRAM
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700230//
Marek Beliskof7c1be02010-09-22 07:56:27 +0200231// Returns: STATUS_SUCCESS - success
232// STATUS_FAILURE - failure
233//
234// Description: This function read a number of bytes from DPRAM
235//
236// Notes:
237//
238//---------------------------------------------------------------------------
239
240u16 ft1000_read_dpram32(struct ft1000_device *ft1000dev, USHORT indx, PUCHAR buffer, USHORT cnt)
241{
242 u16 ret = STATUS_SUCCESS;
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700243
Marek Beliskof7c1be02010-09-22 07:56:27 +0200244 //DEBUG("ft1000_read_dpram32: indx: %d cnt: %d\n", indx, cnt);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700245 ret =ft1000_control(ft1000dev,
Marek Beliskof7c1be02010-09-22 07:56:27 +0200246 usb_rcvctrlpipe(ft1000dev->dev,0),
247 HARLEY_READ_DPRAM_32, //request --READ_DPRAM_32
248 HARLEY_READ_OPERATION, //requestType
249 0, //value
250 indx, //index
251 buffer, //data
252 cnt, //data size
253 LARGE_TIMEOUT ); //timeout
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700254
255 //DEBUG("ft1000_read_dpram32: ret is %d \n", ret);
256
257 //DEBUG("ft1000_read_dpram32: ret=%d \n", ret);
Marek Beliskof7c1be02010-09-22 07:56:27 +0200258
259 return ret;
260
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700261}
Marek Beliskof7c1be02010-09-22 07:56:27 +0200262
263//---------------------------------------------------------------------------
264// Function: ft1000_write_dpram32
265//
266// Parameters: ft1000_device - device structure
267// indx - starting address to write the data
268// buffer - data buffer to write into DPRAM
269// cnt - number of bytes to write
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700270//
Marek Beliskof7c1be02010-09-22 07:56:27 +0200271// Returns: STATUS_SUCCESS - success
272// STATUS_FAILURE - failure
273//
274// Description: This function writes into DPRAM a number of bytes
275//
276// Notes:
277//
278//---------------------------------------------------------------------------
279u16 ft1000_write_dpram32(struct ft1000_device *ft1000dev, USHORT indx, PUCHAR buffer, USHORT cnt)
280{
281 u16 ret = STATUS_SUCCESS;
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700282
Marek Beliskof7c1be02010-09-22 07:56:27 +0200283 //DEBUG("ft1000_write_dpram32: indx: %d buffer: %x cnt: %d\n", indx, buffer, cnt);
284 if ( cnt % 4)
285 cnt += cnt - (cnt % 4);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700286
Marek Beliskof7c1be02010-09-22 07:56:27 +0200287 ret = ft1000_control(ft1000dev,
288 usb_sndctrlpipe(ft1000dev->dev, 0),
289 HARLEY_WRITE_DPRAM_32, //request -- WRITE_DPRAM_32
290 HARLEY_WRITE_OPERATION, //requestType
291 0, //value
292 indx, //index
293 buffer, //buffer
294 cnt, //buffer size
295 LARGE_TIMEOUT );
296
Marek Beliskof7c1be02010-09-22 07:56:27 +0200297 return ret;
298}
299
300//---------------------------------------------------------------------------
301// Function: ft1000_read_dpram16
302//
303// Parameters: ft1000_device - device structure
304// indx - starting address to read
305// buffer - data buffer to hold the data read
306// hightlow - high or low 16 bit word
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700307//
Marek Beliskof7c1be02010-09-22 07:56:27 +0200308// Returns: STATUS_SUCCESS - success
309// STATUS_FAILURE - failure
310//
311// Description: This function read 16 bits from DPRAM
312//
313// Notes:
314//
315//---------------------------------------------------------------------------
316u16 ft1000_read_dpram16(struct ft1000_device *ft1000dev, USHORT indx, PUCHAR buffer, u8 highlow)
317{
318 u16 ret = STATUS_SUCCESS;
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700319
Marek Beliskof7c1be02010-09-22 07:56:27 +0200320 //DEBUG("ft1000_read_dpram16: indx: %d hightlow: %d\n", indx, highlow);
321
322 u8 request;
323
324 if (highlow == 0 )
325 request = HARLEY_READ_DPRAM_LOW;
326 else
327 request = HARLEY_READ_DPRAM_HIGH;
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700328
329 ret = ft1000_control(ft1000dev,
Marek Beliskof7c1be02010-09-22 07:56:27 +0200330 usb_rcvctrlpipe(ft1000dev->dev,0),
331 request, //request --READ_DPRAM_H/L
332 HARLEY_READ_OPERATION, //requestType
333 0, //value
334 indx, //index
335 buffer, //data
336 2, //data size
337 LARGE_TIMEOUT ); //timeout
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700338
339 //DEBUG("ft1000_read_dpram16: ret is %d \n", ret);
340
341
342 //DEBUG("ft1000_read_dpram16: data is %x \n", *buffer);
Marek Beliskof7c1be02010-09-22 07:56:27 +0200343
344 return ret;
345
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700346}
Marek Beliskof7c1be02010-09-22 07:56:27 +0200347
348//---------------------------------------------------------------------------
349// Function: ft1000_write_dpram16
350//
351// Parameters: ft1000_device - device structure
352// indx - starting address to write the data
353// value - 16bits value to write
354// hightlow - high or low 16 bit word
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700355//
Marek Beliskof7c1be02010-09-22 07:56:27 +0200356// Returns: STATUS_SUCCESS - success
357// STATUS_FAILURE - failure
358//
359// Description: This function writes into DPRAM a number of bytes
360//
361// Notes:
362//
363//---------------------------------------------------------------------------
364u16 ft1000_write_dpram16(struct ft1000_device *ft1000dev, USHORT indx, USHORT value, u8 highlow)
365{
366 u16 ret = STATUS_SUCCESS;
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700367
368
Marek Beliskof7c1be02010-09-22 07:56:27 +0200369
370 //DEBUG("ft1000_write_dpram16: indx: %d value: %d highlow: %d\n", indx, value, highlow);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700371
Marek Beliskof7c1be02010-09-22 07:56:27 +0200372 u8 request;
373
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700374
Marek Beliskof7c1be02010-09-22 07:56:27 +0200375 if ( highlow == 0 )
376 request = HARLEY_WRITE_DPRAM_LOW;
377 else
378 request = HARLEY_WRITE_DPRAM_HIGH;
379
380 ret = ft1000_control(ft1000dev,
381 usb_sndctrlpipe(ft1000dev->dev, 0),
382 request, //request -- WRITE_DPRAM_H/L
383 HARLEY_WRITE_OPERATION, //requestType
384 value, //value
385 indx, //index
386 NULL, //buffer
387 0, //buffer size
388 LARGE_TIMEOUT );
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700389
Marek Beliskof7c1be02010-09-22 07:56:27 +0200390 return ret;
391}
392
393//---------------------------------------------------------------------------
394// Function: fix_ft1000_read_dpram32
395//
396// Parameters: ft1000_device - device structure
397// indx - starting address to read
398// buffer - data buffer to hold the data read
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700399//
400//
Marek Beliskof7c1be02010-09-22 07:56:27 +0200401// Returns: STATUS_SUCCESS - success
402// STATUS_FAILURE - failure
403//
404// Description: This function read DPRAM 4 words at a time
405//
406// Notes:
407//
408//---------------------------------------------------------------------------
409u16 fix_ft1000_read_dpram32(struct ft1000_device *ft1000dev, USHORT indx, PUCHAR buffer)
410{
Arnd Bergmann2a953cf2010-09-30 10:24:10 +0200411 UCHAR buf[16];
Marek Beliskof7c1be02010-09-22 07:56:27 +0200412 USHORT pos;
413 u16 ret = STATUS_SUCCESS;
414
415 //DEBUG("fix_ft1000_read_dpram32: indx: %d \n", indx);
416 pos = (indx / 4)*4;
Arnd Bergmann2a953cf2010-09-30 10:24:10 +0200417 ret = ft1000_read_dpram32(ft1000dev, pos, buf, 16);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700418 if (ret == STATUS_SUCCESS)
Marek Beliskof7c1be02010-09-22 07:56:27 +0200419 {
420 pos = (indx % 4)*4;
Arnd Bergmann2a953cf2010-09-30 10:24:10 +0200421 *buffer++ = buf[pos++];
422 *buffer++ = buf[pos++];
423 *buffer++ = buf[pos++];
424 *buffer++ = buf[pos++];
Marek Beliskof7c1be02010-09-22 07:56:27 +0200425 }
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700426 else
Marek Beliskof7c1be02010-09-22 07:56:27 +0200427 {
428 DEBUG("fix_ft1000_read_dpram32: DPRAM32 Read failed\n");
429 *buffer++ = 0;
430 *buffer++ = 0;
431 *buffer++ = 0;
432 *buffer++ = 0;
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700433
Marek Beliskof7c1be02010-09-22 07:56:27 +0200434 }
435
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700436 //DEBUG("fix_ft1000_read_dpram32: data is %x \n", *buffer);
Marek Beliskof7c1be02010-09-22 07:56:27 +0200437 return ret;
438
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700439}
Marek Beliskof7c1be02010-09-22 07:56:27 +0200440
441
442//---------------------------------------------------------------------------
443// Function: fix_ft1000_write_dpram32
444//
445// Parameters: ft1000_device - device structure
446// indx - starting address to write
447// buffer - data buffer to write
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700448//
449//
Marek Beliskof7c1be02010-09-22 07:56:27 +0200450// Returns: STATUS_SUCCESS - success
451// STATUS_FAILURE - failure
452//
453// Description: This function write to DPRAM 4 words at a time
454//
455// Notes:
456//
457//---------------------------------------------------------------------------
458u16 fix_ft1000_write_dpram32(struct ft1000_device *ft1000dev, USHORT indx, PUCHAR buffer)
459{
460 USHORT pos1;
461 USHORT pos2;
462 USHORT i;
Arnd Bergmann2a953cf2010-09-30 10:24:10 +0200463 UCHAR buf[32];
Marek Beliskof7c1be02010-09-22 07:56:27 +0200464 UCHAR resultbuffer[32];
465 PUCHAR pdata;
466 u16 ret = STATUS_SUCCESS;
467
468 //DEBUG("fix_ft1000_write_dpram32: Entered:\n");
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700469
Marek Beliskof7c1be02010-09-22 07:56:27 +0200470 pos1 = (indx / 4)*4;
471 pdata = buffer;
Arnd Bergmann2a953cf2010-09-30 10:24:10 +0200472 ret = ft1000_read_dpram32(ft1000dev, pos1, buf, 16);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700473 if (ret == STATUS_SUCCESS)
Marek Beliskof7c1be02010-09-22 07:56:27 +0200474 {
475 pos2 = (indx % 4)*4;
Arnd Bergmann2a953cf2010-09-30 10:24:10 +0200476 buf[pos2++] = *buffer++;
477 buf[pos2++] = *buffer++;
478 buf[pos2++] = *buffer++;
479 buf[pos2++] = *buffer++;
480 ret = ft1000_write_dpram32(ft1000dev, pos1, buf, 16);
Marek Beliskof7c1be02010-09-22 07:56:27 +0200481 }
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700482 else
Marek Beliskof7c1be02010-09-22 07:56:27 +0200483 {
484 DEBUG("fix_ft1000_write_dpram32: DPRAM32 Read failed\n");
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700485
Marek Beliskof7c1be02010-09-22 07:56:27 +0200486 return ret;
487 }
488
489 ret = ft1000_read_dpram32(ft1000dev, pos1, (PUCHAR)&resultbuffer[0], 16);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700490 if (ret == STATUS_SUCCESS)
Marek Beliskof7c1be02010-09-22 07:56:27 +0200491 {
492 buffer = pdata;
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700493 for (i=0; i<16; i++)
Marek Beliskof7c1be02010-09-22 07:56:27 +0200494 {
Arnd Bergmann2a953cf2010-09-30 10:24:10 +0200495 if (buf[i] != resultbuffer[i]){
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700496
Marek Beliskof7c1be02010-09-22 07:56:27 +0200497 ret = STATUS_FAILURE;
498 }
499 }
500 }
501
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700502 if (ret == STATUS_FAILURE)
Marek Beliskof7c1be02010-09-22 07:56:27 +0200503 {
504 ret = ft1000_write_dpram32(ft1000dev, pos1, (PUCHAR)&tempbuffer[0], 16);
505 ret = ft1000_read_dpram32(ft1000dev, pos1, (PUCHAR)&resultbuffer[0], 16);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700506 if (ret == STATUS_SUCCESS)
Marek Beliskof7c1be02010-09-22 07:56:27 +0200507 {
508 buffer = pdata;
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700509 for (i=0; i<16; i++)
Marek Beliskof7c1be02010-09-22 07:56:27 +0200510 {
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700511 if (tempbuffer[i] != resultbuffer[i])
Marek Beliskof7c1be02010-09-22 07:56:27 +0200512 {
513 ret = STATUS_FAILURE;
514 DEBUG("fix_ft1000_write_dpram32 Failed to write\n");
515 }
516 }
517 }
518 }
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700519
Marek Beliskof7c1be02010-09-22 07:56:27 +0200520 return ret;
521
522}
523
524
525//------------------------------------------------------------------------
526//
527// Function: card_reset_dsp
528//
529// Synopsis: This function is called to reset or activate the DSP
530//
531// Arguments: value - reset or activate
532//
533// Returns: None
534//-----------------------------------------------------------------------
Arnd Bergmann2a953cf2010-09-30 10:24:10 +0200535static void card_reset_dsp (struct ft1000_device *ft1000dev, BOOLEAN value)
Marek Beliskof7c1be02010-09-22 07:56:27 +0200536{
537 u16 status = STATUS_SUCCESS;
538 USHORT tempword;
539
540 status = ft1000_write_register (ft1000dev, HOST_INTF_BE, FT1000_REG_SUP_CTRL);
541 status = ft1000_read_register(ft1000dev, &tempword, FT1000_REG_SUP_CTRL);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700542 if (value)
Marek Beliskof7c1be02010-09-22 07:56:27 +0200543 {
544 DEBUG("Reset DSP\n");
545 status = ft1000_read_register(ft1000dev, &tempword, FT1000_REG_RESET);
546 tempword |= DSP_RESET_BIT;
547 status = ft1000_write_register(ft1000dev, tempword, FT1000_REG_RESET);
548 }
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700549 else
Marek Beliskof7c1be02010-09-22 07:56:27 +0200550 {
551 DEBUG("Activate DSP\n");
552 status = ft1000_read_register(ft1000dev, &tempword, FT1000_REG_RESET);
553#if 1
554 tempword |= DSP_ENCRYPTED;
555 tempword &= ~DSP_UNENCRYPTED;
556#else
557 tempword |= DSP_UNENCRYPTED;
558 tempword &= ~DSP_ENCRYPTED;
559#endif
560 status = ft1000_write_register(ft1000dev, tempword, FT1000_REG_RESET);
561 status = ft1000_read_register(ft1000dev, &tempword, FT1000_REG_RESET);
562 tempword &= ~EFUSE_MEM_DISABLE;
563 tempword &= ~DSP_RESET_BIT;
564 status = ft1000_write_register(ft1000dev, tempword, FT1000_REG_RESET);
565 status = ft1000_read_register(ft1000dev, &tempword, FT1000_REG_RESET);
566 }
567}
568
569//---------------------------------------------------------------------------
570// Function: CardSendCommand
571//
572// Parameters: ft1000_device - device structure
573// ptempbuffer - command buffer
574// size - command buffer size
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700575//
Marek Beliskof7c1be02010-09-22 07:56:27 +0200576// Returns: STATUS_SUCCESS - success
577// STATUS_FAILURE - failure
578//
579// Description: This function sends a command to ASIC
580//
581// Notes:
582//
583//---------------------------------------------------------------------------
Arnd Bergmann2a953cf2010-09-30 10:24:10 +0200584void CardSendCommand(struct ft1000_device *ft1000dev, void *ptempbuffer, int size)
Marek Beliskof7c1be02010-09-22 07:56:27 +0200585{
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700586 unsigned short temp;
Marek Beliskof7c1be02010-09-22 07:56:27 +0200587 unsigned char *commandbuf;
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700588
Marek Beliskof7c1be02010-09-22 07:56:27 +0200589 DEBUG("CardSendCommand: enter CardSendCommand... size=%d\n", size);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700590
Marek Beliskof7c1be02010-09-22 07:56:27 +0200591 commandbuf =(unsigned char*) kmalloc(size+2, GFP_KERNEL);
592 //memset((void*)commandbuf, 0, size+2);
593 memcpy((void*)commandbuf+2, (void*)ptempbuffer, size);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700594
Marek Beliskof7c1be02010-09-22 07:56:27 +0200595 //DEBUG("CardSendCommand: Command Send\n");
596 /***
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700597 for (i=0; i<size+2; i++)
Marek Beliskof7c1be02010-09-22 07:56:27 +0200598 {
599 DEBUG("FT1000:ft1000_ChIoctl: data %d = 0x%x\n", i, *ptr++);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700600 }
601 ***/
602
Marek Beliskof7c1be02010-09-22 07:56:27 +0200603 ft1000_read_register(ft1000dev, &temp, FT1000_REG_DOORBELL);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700604
605 if (temp & 0x0100)
Marek Beliskof7c1be02010-09-22 07:56:27 +0200606 {
607 msleep(10);
608 }
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700609
Marek Beliskof7c1be02010-09-22 07:56:27 +0200610 // check for odd word
611 size = size + 2;
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700612 if (size % 4)
Marek Beliskof7c1be02010-09-22 07:56:27 +0200613 {
614 // Must force to be 32 bit aligned
615 size += 4 - (size % 4);
616 }
617
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700618
Marek Beliskof7c1be02010-09-22 07:56:27 +0200619 //DEBUG("CardSendCommand: write dpram ... size=%d\n", size);
620 ft1000_write_dpram32(ft1000dev, 0,commandbuf, size);
621 msleep(1);
622 //DEBUG("CardSendCommand: write into doorbell ...\n");
623 ft1000_write_register(ft1000dev, FT1000_DB_DPRAM_TX ,FT1000_REG_DOORBELL) ;
624 msleep(1);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700625
Marek Beliskof7c1be02010-09-22 07:56:27 +0200626 ft1000_read_register(ft1000dev, &temp, FT1000_REG_DOORBELL);
627 //DEBUG("CardSendCommand: read doorbell ...temp=%x\n", temp);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700628 if ( (temp & 0x0100) == 0)
Marek Beliskof7c1be02010-09-22 07:56:27 +0200629 {
630 //DEBUG("CardSendCommand: Message sent\n");
631 }
632
633}
634
635
636//--------------------------------------------------------------------------
637//
638// Function: dsp_reload
639//
640// Synopsis: This function is called to load or reload the DSP
641//
642// Arguments: ft1000dev - device structure
643//
644// Returns: None
645//-----------------------------------------------------------------------
Marek Belisko5cb99542010-10-12 10:26:40 +0200646int dsp_reload(struct ft1000_device *ft1000dev)
Marek Beliskof7c1be02010-09-22 07:56:27 +0200647{
648 u16 status;
649 USHORT tempword;
650 ULONG templong;
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700651
Marek Beliskof7c1be02010-09-22 07:56:27 +0200652 PFT1000_INFO pft1000info;
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700653
Marek Beliskof7c1be02010-09-22 07:56:27 +0200654 pft1000info = netdev_priv(ft1000dev->net);
655
656 pft1000info->CardReady = 0;
Marek Beliskof7c1be02010-09-22 07:56:27 +0200657
658 // Program Interrupt Mask register
659 status = ft1000_write_register (ft1000dev, 0xffff, FT1000_REG_SUP_IMASK);
660
661 status = ft1000_read_register (ft1000dev, &tempword, FT1000_REG_RESET);
662 tempword |= ASIC_RESET_BIT;
663 status = ft1000_write_register (ft1000dev, tempword, FT1000_REG_RESET);
664 msleep(1000);
665 status = ft1000_read_register (ft1000dev, &tempword, FT1000_REG_RESET);
666 DEBUG("Reset Register = 0x%x\n", tempword);
667
668 // Toggle DSP reset
669 card_reset_dsp (ft1000dev, 1);
670 msleep(1000);
671 card_reset_dsp (ft1000dev, 0);
672 msleep(1000);
673
674 status = ft1000_write_register (ft1000dev, HOST_INTF_BE, FT1000_REG_SUP_CTRL);
675
676 // Let's check for FEFE
677 status = ft1000_read_dpram32 (ft1000dev, FT1000_MAG_DPRAM_FEFE_INDX, (PUCHAR)&templong, 4);
678 DEBUG("templong (fefe) = 0x%8x\n", templong);
679
680 // call codeloader
681 status = scram_dnldr(ft1000dev, pFileStart, FileLength);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700682
Marek Belisko5cb99542010-10-12 10:26:40 +0200683 if (status != STATUS_SUCCESS)
684 return -EIO;
Marek Beliskof7c1be02010-09-22 07:56:27 +0200685
686 msleep(1000);
Marek Beliskof7c1be02010-09-22 07:56:27 +0200687
688 DEBUG("dsp_reload returned\n");
Marek Belisko5cb99542010-10-12 10:26:40 +0200689 return 0;
Marek Beliskof7c1be02010-09-22 07:56:27 +0200690
691}
692
693//---------------------------------------------------------------------------
694//
695// Function: ft1000_reset_asic
696// Descripton: This function will call the Card Service function to reset the
697// ASIC.
698// Input:
699// dev - device structure
700// Output:
701// none
702//
703//---------------------------------------------------------------------------
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700704static void ft1000_reset_asic (struct net_device *dev)
Marek Beliskof7c1be02010-09-22 07:56:27 +0200705{
706 FT1000_INFO *info = netdev_priv(dev);
707 struct ft1000_device *ft1000dev = info->pFt1000Dev;
708 u16 tempword;
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700709
Marek Beliskof7c1be02010-09-22 07:56:27 +0200710 DEBUG("ft1000_hw:ft1000_reset_asic called\n");
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700711
Marek Beliskof7c1be02010-09-22 07:56:27 +0200712 info->ASICResetNum++;
713
714 // Let's use the register provided by the Magnemite ASIC to reset the
715 // ASIC and DSP.
716 ft1000_write_register(ft1000dev, (DSP_RESET_BIT | ASIC_RESET_BIT), FT1000_REG_RESET );
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700717
Marek Beliskof7c1be02010-09-22 07:56:27 +0200718 mdelay(1);
719
720 // set watermark to -1 in order to not generate an interrrupt
721 ft1000_write_register(ft1000dev, 0xffff, FT1000_REG_MAG_WATERMARK);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700722
Marek Beliskof7c1be02010-09-22 07:56:27 +0200723 // clear interrupts
724 ft1000_read_register (ft1000dev, &tempword, FT1000_REG_SUP_ISR);
725 DEBUG("ft1000_hw: interrupt status register = 0x%x\n",tempword);
726 ft1000_write_register (ft1000dev, tempword, FT1000_REG_SUP_ISR);
727 ft1000_read_register (ft1000dev, &tempword, FT1000_REG_SUP_ISR);
728 DEBUG("ft1000_hw: interrupt status register = 0x%x\n",tempword);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700729
Marek Beliskof7c1be02010-09-22 07:56:27 +0200730}
731/*
732//---------------------------------------------------------------------------
733//
734// Function: ft1000_disable_interrupts
735// Descripton: This function will disable all interrupts.
736// Input:
737// dev - device structure
738// Output:
739// None.
740//
741//---------------------------------------------------------------------------
742static void ft1000_disable_interrupts(struct net_device *dev) {
743 FT1000_INFO *info = netdev_priv(dev);
744 struct ft1000_device *ft1000dev = info->pFt1000Dev;
745 u16 tempword;
746
747 DEBUG("ft1000_hw: ft1000_disable_interrupts()\n");
748 ft1000_write_register (ft1000dev, ISR_MASK_ALL, FT1000_REG_SUP_IMASK);
749 ft1000_read_register (ft1000dev, &tempword, FT1000_REG_SUP_IMASK);
750 DEBUG("ft1000_hw:ft1000_disable_interrupts:current interrupt enable mask = 0x%x\n", tempword);
751 info->InterruptsEnabled = FALSE;
752}
753
754//---------------------------------------------------------------------------
755//
756// Function: ft1000_enable_interrupts
757// Descripton: This function will enable interrupts base on the current interrupt mask.
758// Input:
759// dev - device structure
760// Output:
761// None.
762//
763//---------------------------------------------------------------------------
764static void ft1000_enable_interrupts(struct net_device *dev) {
765 FT1000_INFO *info = netdev_priv(dev);
766 struct ft1000_device *ft1000dev = info->pFt1000Dev;
767 u16 tempword;
768
769 DEBUG("ft1000_hw:ft1000_enable_interrupts()\n");
770 ft1000_write_register (ft1000dev, info->CurrentInterruptEnableMask, FT1000_REG_SUP_IMASK);
771 ft1000_read_register (ft1000dev, &tempword, FT1000_REG_SUP_IMASK);
772 DEBUG("ft1000_hw:ft1000_enable_interrupts:current interrupt enable mask = 0x%x\n", tempword);
773 info->InterruptsEnabled = TRUE;
774}
775*/
776
777//---------------------------------------------------------------------------
778//
779// Function: ft1000_reset_card
780// Descripton: This function will reset the card
781// Input:
782// dev - device structure
783// Output:
784// status - FALSE (card reset fail)
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700785// TRUE (card reset successful)
Marek Beliskof7c1be02010-09-22 07:56:27 +0200786//
787//---------------------------------------------------------------------------
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700788static int ft1000_reset_card (struct net_device *dev)
Marek Beliskof7c1be02010-09-22 07:56:27 +0200789{
790 FT1000_INFO *info = netdev_priv(dev);
791 struct ft1000_device *ft1000dev = info->pFt1000Dev;
792 u16 tempword;
Marek Beliskoe27d96d2010-10-15 14:13:01 +0200793 struct prov_record *ptr;
Marek Beliskof7c1be02010-09-22 07:56:27 +0200794
795 DEBUG("ft1000_hw:ft1000_reset_card called.....\n");
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700796
Marek Beliskof7c1be02010-09-22 07:56:27 +0200797 info->fCondResetPend = 1;
798 info->CardReady = 0;
799 info->fProvComplete = 0;
800 //ft1000_disable_interrupts(dev);
801
Marek Beliskof7c1be02010-09-22 07:56:27 +0200802 // Make sure we free any memory reserve for provisioning
803 while (list_empty(&info->prov_list) == 0) {
804 DEBUG("ft1000_hw:ft1000_reset_card:deleting provisioning record\n");
Marek Beliskoe27d96d2010-10-15 14:13:01 +0200805 ptr = list_entry(info->prov_list.next, struct prov_record, list);
Marek Beliskof7c1be02010-09-22 07:56:27 +0200806 list_del(&ptr->list);
807 kfree(ptr->pprov_data);
808 kfree(ptr);
809 }
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700810
Marek Beliskof7c1be02010-09-22 07:56:27 +0200811 DEBUG("ft1000_hw:ft1000_reset_card: reset asic\n");
812 //reset ASIC
813 ft1000_reset_asic(dev);
814
815 info->DSPResetNum++;
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700816
Marek Beliskof7c1be02010-09-22 07:56:27 +0200817#if 0
818 DEBUG("ft1000_hw:ft1000_reset_card:resetting ASIC and DSP\n");
819 ft1000_write_register (ft1000dev, (DSP_RESET_BIT | ASIC_RESET_BIT), FT1000_REG_RESET );
820
821
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700822 // Copy DSP session record into info block if this is not a coldstart
Marek Beliskof7c1be02010-09-22 07:56:27 +0200823 //if (ft1000_card_present == 1) {
824 spin_lock_irqsave(&info->dpram_lock, flags);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700825
Marek Beliskof7c1be02010-09-22 07:56:27 +0200826 ft1000_write_register(ft1000dev, FT1000_DPRAM_MAG_RX_BASE, FT1000_REG_DPRAM_ADDR);
827 for (i=0;i<MAX_DSP_SESS_REC/2; i++) {
828 //info->DSPSess.MagRec[i] = inl(dev->base_addr+FT1000_REG_MAG_DPDATA);
829 ft1000_read_dpram32(ft1000dev, FT1000_REG_MAG_DPDATA, (PCHAR)&(info->DSPSess.MagRec[i]), 4);
830 }
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700831
Marek Beliskof7c1be02010-09-22 07:56:27 +0200832 spin_unlock_irqrestore(&info->dpram_lock, flags);
833 //}
834 info->squeseqnum = 0;
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700835
Marek Beliskof7c1be02010-09-22 07:56:27 +0200836 DEBUG("ft1000_hw:ft1000_reset_card:resetting ASIC\n");
837 mdelay(10);
838 //reset ASIC
839 ft1000_reset_asic(dev);
840
841 info->DSPResetNum++;
842
843 DEBUG("ft1000_hw:ft1000_reset_card:downloading dsp image\n");
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700844
845
Marek Beliskof7c1be02010-09-22 07:56:27 +0200846 // Put dsp in reset and take ASIC out of reset
847 DEBUG("ft1000_hw:ft1000_reset_card:Put DSP in reset and take ASIC out of reset\n");
848 ft1000_write_register (ft1000dev, DSP_RESET_BIT, FT1000_REG_RESET);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700849
Marek Beliskof7c1be02010-09-22 07:56:27 +0200850 // Setting MAGNEMITE ASIC to big endian mode
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700851 ft1000_write_register (ft1000dev, HOST_INTF_BE, FT1000_REG_SUP_CTRL);
Marek Beliskof7c1be02010-09-22 07:56:27 +0200852
853 // Take DSP out of reset
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700854
Marek Beliskof7c1be02010-09-22 07:56:27 +0200855 ft1000_read_register(ft1000dev, &tempword, FT1000_REG_RESET);
856 tempword |= DSP_ENCRYPTED;
857 tempword &= ~DSP_UNENCRYPTED;
858 ft1000_write_register(ft1000dev, tempword, FT1000_REG_RESET);
859 tempword &= ~EFUSE_MEM_DISABLE;
860 ft1000_write_register(ft1000dev, tempword, FT1000_REG_RESET);
861 tempword &= ~DSP_RESET_BIT;
862 ft1000_write_register(ft1000dev, tempword, FT1000_REG_RESET);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700863
864
Marek Beliskof7c1be02010-09-22 07:56:27 +0200865 // FLARION_DSP_ACTIVE;
866 mdelay(10);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700867 DEBUG("ft1000_hw:ft1000_reset_card:Take DSP out of reset\n");
Marek Beliskof7c1be02010-09-22 07:56:27 +0200868
869 // Wait for 0xfefe indicating dsp ready before starting download
870 for (i=0; i<50; i++) {
871 //tempword = ft1000_read_dpram_mag_16(dev, FT1000_MAG_DPRAM_FEFE, FT1000_MAG_DPRAM_FEFE_INDX);
872 ft1000_read_dpram32 (ft1000dev, FT1000_MAG_DPRAM_FEFE_INDX, (PUCHAR)&templong, 4);
873 if (tempword == 0xfefe) {
874 break;
875 }
876 mdelay(20);
877 }
878
879 if (i==50) {
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700880 DEBUG("ft1000_hw:ft1000_reset_card:No FEFE detected from DSP\n");
Marek Beliskof7c1be02010-09-22 07:56:27 +0200881 return FALSE;
882 }
883
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700884
Marek Beliskof7c1be02010-09-22 07:56:27 +0200885#endif
886
887 DEBUG("ft1000_hw:ft1000_reset_card: call dsp_reload\n");
888 dsp_reload(ft1000dev);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700889
Marek Beliskof7c1be02010-09-22 07:56:27 +0200890 DEBUG("dsp reload successful\n");
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700891
Marek Beliskof7c1be02010-09-22 07:56:27 +0200892
893 mdelay(10);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700894
Marek Beliskof7c1be02010-09-22 07:56:27 +0200895 // Initialize DSP heartbeat area to ho
896 ft1000_write_dpram16(ft1000dev, FT1000_MAG_HI_HO, ho_mag, FT1000_MAG_HI_HO_INDX);
897 ft1000_read_dpram16(ft1000dev, FT1000_MAG_HI_HO, (PCHAR)&tempword, FT1000_MAG_HI_HO_INDX);
898 DEBUG("ft1000_hw:ft1000_reset_card:hi_ho value = 0x%x\n", tempword);
Marek Beliskof7c1be02010-09-22 07:56:27 +0200899
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700900
901
Marek Beliskof7c1be02010-09-22 07:56:27 +0200902 info->CardReady = 1;
903 //ft1000_enable_interrupts(dev);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700904
Marek Beliskof7c1be02010-09-22 07:56:27 +0200905 info->fCondResetPend = 0;
906 return TRUE;
907
908}
909
910
911//mbelian
912#ifdef HAVE_NET_DEVICE_OPS
913static const struct net_device_ops ftnet_ops =
914{
915.ndo_open = &ft1000_open,
916.ndo_stop = &ft1000_close,
917.ndo_start_xmit = &ft1000_start_xmit,
918.ndo_get_stats = &ft1000_netdev_stats,
919};
920#endif
921
922
923//---------------------------------------------------------------------------
924// Function: init_ft1000_netdev
925//
926// Parameters: ft1000dev - device structure
927//
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700928//
Marek Beliskof7c1be02010-09-22 07:56:27 +0200929// Returns: STATUS_SUCCESS - success
930// STATUS_FAILURE - failure
931//
932// Description: This function initialize the network device
933//
934// Notes:
935//
936//---------------------------------------------------------------------------
937u16 init_ft1000_netdev(struct ft1000_device *ft1000dev)
938{
939 struct net_device *netdev;
940 FT1000_INFO *pInfo = NULL;
Marek Belisko29437ab2010-10-16 22:37:25 +0200941 struct dpram_blk *pdpram_blk;
Marek Beliskof9d17372010-10-14 14:14:33 +0200942 int i, ret_val;
Vasiliy Kulikovb7378b92010-10-03 21:58:46 +0400943 struct list_head *cur, *tmp;
Marek Beliskof9d17372010-10-14 14:14:33 +0200944 char card_nr[2];
Marek Beliskof7c1be02010-09-22 07:56:27 +0200945
946 gCardIndex=0; //mbelian
947
948 DEBUG("Enter init_ft1000_netdev...\n");
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700949
Marek Beliskof7c1be02010-09-22 07:56:27 +0200950
951 netdev = alloc_etherdev( sizeof(FT1000_INFO));
952 if (!netdev )
953 {
954 DEBUG("init_ft1000_netdev: can not allocate network device\n");
Marek Belisko78890fd2010-10-15 08:57:25 +0200955 return -ENOMEM;
Marek Beliskof7c1be02010-09-22 07:56:27 +0200956 }
957
958 //pInfo = (PFT1000_INFO)netdev->priv;
959 pInfo = (FT1000_INFO *) netdev_priv (netdev);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700960
Marek Beliskof7c1be02010-09-22 07:56:27 +0200961 //DEBUG("init_ft1000_netdev: gFt1000Info=%x, netdev=%x, ft1000dev=%x\n", gFt1000Info, netdev, ft1000dev);
962
963 memset (pInfo, 0, sizeof(FT1000_INFO));
964
965 dev_alloc_name(netdev, netdev->name);
966
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700967 //for the first inserted card, decide the card index beginning number, in case there are existing network interfaces
Marek Beliskof7c1be02010-09-22 07:56:27 +0200968 if ( gCardIndex == 0 )
969 {
970 DEBUG("init_ft1000_netdev: network device name is %s\n", netdev->name);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700971
Marek Beliskof9d17372010-10-14 14:14:33 +0200972 if ( strncmp(netdev->name,"eth", 3) == 0) {
973 card_nr[0] = netdev->name[3];
974 card_nr[1] = '\0';
975 ret_val = strict_strtoul(card_nr, 10, &gCardIndex);
976 if (ret_val) {
977 printk(KERN_ERR "Can't parse netdev\n");
Marek Belisko78890fd2010-10-15 08:57:25 +0200978 goto err_net;
Marek Beliskof9d17372010-10-14 14:14:33 +0200979 }
980
Marek Beliskof7c1be02010-09-22 07:56:27 +0200981 pInfo->CardNumber = gCardIndex;
982 DEBUG("card number = %d\n", pInfo->CardNumber);
983 }
984 else {
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -0700985 printk(KERN_ERR "ft1000: Invalid device name\n");
Marek Belisko78890fd2010-10-15 08:57:25 +0200986 ret_val = -ENXIO;
987 goto err_net;
Marek Beliskof7c1be02010-09-22 07:56:27 +0200988 }
989 }
990 else
991 {
992 //not the first inserted card, increase card number by 1
993 /*gCardIndex ++;*/
994 pInfo->CardNumber = gCardIndex;
995 /*DEBUG("card number = %d\n", pInfo->CardNumber);*/ //mbelian
996 }
997
998 memset(&pInfo->stats, 0, sizeof(struct net_device_stats) );
999
1000 spin_lock_init(&pInfo->dpram_lock);
1001 pInfo->pFt1000Dev = ft1000dev;
1002 pInfo->DrvErrNum = 0;
1003 pInfo->ASICResetNum = 0;
1004 pInfo->registered = 1;
1005 pInfo->ft1000_reset = ft1000_reset;
1006 pInfo->mediastate = 0;
1007 pInfo->fifo_cnt = 0;
1008 pInfo->DeviceCreated = FALSE;
1009 pInfo->DeviceMajor = 0;
1010 pInfo->CurrentInterruptEnableMask = ISR_DEFAULT_MASK;
1011 pInfo->InterruptsEnabled = FALSE;
1012 pInfo->CardReady = 0;
Marek Beliskof7c1be02010-09-22 07:56:27 +02001013 pInfo->DSP_TIME[0] = 0;
1014 pInfo->DSP_TIME[1] = 0;
1015 pInfo->DSP_TIME[2] = 0;
1016 pInfo->DSP_TIME[3] = 0;
1017 pInfo->fAppMsgPend = 0;
1018 pInfo->fCondResetPend = 0;
1019 pInfo->usbboot = 0;
1020 pInfo->dspalive = 0;
1021 for (i=0;i<32 ;i++ )
1022 {
1023 pInfo->tempbuf[i] = 0;
1024 }
1025
1026 INIT_LIST_HEAD(&pInfo->prov_list);
1027
1028//mbelian
1029#ifdef HAVE_NET_DEVICE_OPS
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001030 netdev->netdev_ops = &ftnet_ops;
Marek Beliskof7c1be02010-09-22 07:56:27 +02001031#else
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001032 netdev->hard_start_xmit = &ft1000_start_xmit;
Marek Beliskof7c1be02010-09-22 07:56:27 +02001033 netdev->get_stats = &ft1000_netdev_stats;
1034 netdev->open = &ft1000_open;
1035 netdev->stop = &ft1000_close;
1036#endif
1037
1038 //netif_stop_queue(netdev); //mbelian
1039
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001040
Marek Beliskof7c1be02010-09-22 07:56:27 +02001041 ft1000dev->net = netdev;
1042
1043
1044
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001045//init free_buff_lock, freercvpool, numofmsgbuf, pdpram_blk
Marek Beliskof7c1be02010-09-22 07:56:27 +02001046//only init once per card
1047//Jim
1048 DEBUG("Initialize free_buff_lock and freercvpool\n");
1049 spin_lock_init(&free_buff_lock);
1050
1051 // initialize a list of buffers to be use for queuing up receive command data
1052 INIT_LIST_HEAD (&freercvpool);
1053
1054 // create list of free buffers
1055 for (i=0; i<NUM_OF_FREE_BUFFERS; i++) {
1056 // Get memory for DPRAM_DATA link list
Marek Belisko29437ab2010-10-16 22:37:25 +02001057 pdpram_blk = kmalloc(sizeof(struct dpram_blk), GFP_KERNEL);
Marek Belisko78890fd2010-10-15 08:57:25 +02001058 if (pdpram_blk == NULL) {
1059 ret_val = -ENOMEM;
1060 goto err_free;
1061 }
Marek Beliskof7c1be02010-09-22 07:56:27 +02001062 // Get a block of memory to store command data
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001063 pdpram_blk->pbuffer = kmalloc ( MAX_CMD_SQSIZE, GFP_KERNEL );
Marek Belisko78890fd2010-10-15 08:57:25 +02001064 if (pdpram_blk->pbuffer == NULL) {
1065 ret_val = -ENOMEM;
1066 kfree(pdpram_blk);
1067 goto err_free;
1068 }
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001069 // link provisioning data
Marek Beliskof7c1be02010-09-22 07:56:27 +02001070 list_add_tail (&pdpram_blk->list, &freercvpool);
1071 }
1072 numofmsgbuf = NUM_OF_FREE_BUFFERS;
1073
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001074
Marek Belisko78890fd2010-10-15 08:57:25 +02001075 return 0;
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001076
Vasiliy Kulikovb7378b92010-10-03 21:58:46 +04001077
1078err_free:
Dan Carpenter1055cc92010-10-15 05:40:42 +02001079 list_for_each_safe(cur, tmp, &freercvpool) {
Marek Belisko29437ab2010-10-16 22:37:25 +02001080 pdpram_blk = list_entry(cur, struct dpram_blk, list);
Vasiliy Kulikovb7378b92010-10-03 21:58:46 +04001081 list_del(&pdpram_blk->list);
1082 kfree(pdpram_blk->pbuffer);
1083 kfree(pdpram_blk);
1084 }
Marek Belisko78890fd2010-10-15 08:57:25 +02001085err_net:
1086 free_netdev(netdev);
1087 return ret_val;
Marek Beliskof7c1be02010-09-22 07:56:27 +02001088}
1089
1090
1091
1092//---------------------------------------------------------------------------
1093// Function: reg_ft1000_netdev
1094//
1095// Parameters: ft1000dev - device structure
1096//
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001097//
Marek Beliskof7c1be02010-09-22 07:56:27 +02001098// Returns: STATUS_SUCCESS - success
1099// STATUS_FAILURE - failure
1100//
1101// Description: This function register the network driver
1102//
1103// Notes:
1104//
1105//---------------------------------------------------------------------------
Marek Beliskoaaf08852010-10-15 09:41:45 +02001106int reg_ft1000_netdev(struct ft1000_device *ft1000dev, struct usb_interface *intf)
Marek Beliskof7c1be02010-09-22 07:56:27 +02001107{
1108 struct net_device *netdev;
1109 FT1000_INFO *pInfo;
Marek Belisko7dc59112010-10-15 10:51:22 +02001110 int rc;
Marek Beliskof7c1be02010-09-22 07:56:27 +02001111
1112 netdev = ft1000dev->net;
1113 pInfo = netdev_priv(ft1000dev->net);
1114 DEBUG("Enter reg_ft1000_netdev...\n");
1115
1116
1117 ft1000_read_register(ft1000dev, &pInfo->AsicID, FT1000_REG_ASIC_ID);
1118
1119 usb_set_intfdata(intf, pInfo);
1120 SET_NETDEV_DEV(netdev, &intf->dev);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001121
Marek Beliskof7c1be02010-09-22 07:56:27 +02001122 rc = register_netdev(netdev);
1123 if (rc)
1124 {
1125 DEBUG("reg_ft1000_netdev: could not register network device\n");
1126 free_netdev(netdev);
Marek Beliskoaaf08852010-10-15 09:41:45 +02001127 return rc;
Marek Beliskof7c1be02010-09-22 07:56:27 +02001128 }
1129
1130
1131 //Create character device, implemented by Jim
1132 ft1000_CreateDevice(ft1000dev);
1133
1134 //INIT_LIST_HEAD(&pInfo->prov_list);
1135
Marek Beliskof7c1be02010-09-22 07:56:27 +02001136
1137 //hard code MAC address for now
1138/**
1139 netdev->dev_addr[0] = 0;
1140 netdev->dev_addr[1] = 7;
1141 netdev->dev_addr[2] = 0x35;
1142 netdev->dev_addr[3] = 0x84;
1143 netdev->dev_addr[4] = 0;
1144 netdev->dev_addr[5] = 0x20 + pInfo->CardNumber;
1145**/
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001146
Marek Beliskof7c1be02010-09-22 07:56:27 +02001147 DEBUG ("reg_ft1000_netdev returned\n");
1148
1149 pInfo->CardReady = 1;
1150
1151
Marek Beliskoaaf08852010-10-15 09:41:45 +02001152 return 0;
Marek Beliskof7c1be02010-09-22 07:56:27 +02001153}
1154
Arnd Bergmann2a953cf2010-09-30 10:24:10 +02001155static int ft1000_reset(struct net_device *dev)
Marek Beliskof7c1be02010-09-22 07:56:27 +02001156{
1157 ft1000_reset_card(dev);
1158 return 0;
1159}
1160
1161//---------------------------------------------------------------------------
1162// Function: ft1000_usb_transmit_complete
1163//
1164// Parameters: urb - transmitted usb urb
1165//
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001166//
Marek Beliskof7c1be02010-09-22 07:56:27 +02001167// Returns: none
1168//
1169// Description: This is the callback function when a urb is transmitted
1170//
1171// Notes:
1172//
1173//---------------------------------------------------------------------------
1174static void ft1000_usb_transmit_complete(struct urb *urb)
1175{
1176
1177 struct ft1000_device *ft1000dev = urb->context;
1178
1179 //DEBUG("ft1000_usb_transmit_complete entered\n");
1180// Jim spin_lock(&ft1000dev->device_lock);
1181
1182 if (urb->status)
1183 printk("%s: TX status %d\n", ft1000dev->net->name, urb->status);
1184
1185 netif_wake_queue(ft1000dev->net);
1186
1187//Jim spin_unlock(&ft1000dev->device_lock);
1188 //DEBUG("Return from ft1000_usb_transmit_complete\n");
1189}
1190
1191
1192/****************************************************************
1193 * ft1000_control
1194 ****************************************************************/
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001195static int ft1000_read_fifo_reg(struct ft1000_device *ft1000dev,unsigned int pipe,
1196 u8 request,
Marek Beliskof7c1be02010-09-22 07:56:27 +02001197 u8 requesttype,
1198 u16 value,
1199 u16 index,
1200 void *data,
1201 u16 size,
1202 int timeout)
1203{
1204 u16 ret;
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001205
Marek Beliskof7c1be02010-09-22 07:56:27 +02001206 DECLARE_WAITQUEUE(wait, current);
1207 struct urb *urb;
1208 struct usb_ctrlrequest *dr;
1209 int status;
1210
1211 if (ft1000dev == NULL )
1212 {
1213 DEBUG("NULL ft1000dev, failure\n");
1214 return STATUS_FAILURE;
1215 }
1216 else if ( ft1000dev->dev == NULL )
1217 {
1218 DEBUG("NULL ft1000dev->dev, failure\n");
1219 return STATUS_FAILURE;
1220 }
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001221
Marek Beliskof7c1be02010-09-22 07:56:27 +02001222 spin_lock(&ft1000dev->device_lock);
1223
1224 /*DECLARE_WAITQUEUE(wait, current);
1225 struct urb *urb;
1226 struct usb_ctrlrequest *dr;
1227 int status;*/
1228
1229 if(in_interrupt())
1230 {
1231 spin_unlock(&ft1000dev->device_lock);
1232 return -EBUSY;
1233 }
1234
1235 urb = usb_alloc_urb(0, GFP_KERNEL);
1236 dr = kmalloc(sizeof(struct usb_ctrlrequest), in_interrupt() ? GFP_ATOMIC : GFP_KERNEL);
1237
1238 if(!urb || !dr)
1239 {
Vasiliy Kulikovb7378b92010-10-03 21:58:46 +04001240 kfree(dr);
1241 usb_free_urb(urb);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001242 spin_unlock(&ft1000dev->device_lock);
Marek Beliskof7c1be02010-09-22 07:56:27 +02001243 return -ENOMEM;
1244 }
1245
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001246
1247
Marek Beliskof7c1be02010-09-22 07:56:27 +02001248 dr->bRequestType = requesttype;
1249 dr->bRequest = request;
1250 dr->wValue = value;
1251 dr->wIndex = index;
1252 dr->wLength = size;
1253
1254 usb_fill_control_urb(urb, ft1000dev->dev, pipe, (char*)dr, (void*)data, size, (void *)ft1000_control_complete, (void*)ft1000dev);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001255
Marek Beliskof7c1be02010-09-22 07:56:27 +02001256
1257 init_waitqueue_head(&ft1000dev->control_wait);
1258
1259 //current->state = TASK_INTERRUPTIBLE; //mbelian
1260 set_current_state(TASK_INTERRUPTIBLE);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001261
Marek Beliskof7c1be02010-09-22 07:56:27 +02001262 add_wait_queue(&ft1000dev->control_wait, &wait);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001263
1264
1265
Marek Beliskof7c1be02010-09-22 07:56:27 +02001266
1267 status = usb_submit_urb(urb, GFP_KERNEL);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001268
Marek Beliskof7c1be02010-09-22 07:56:27 +02001269 if(status)
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001270 {
Marek Beliskof7c1be02010-09-22 07:56:27 +02001271 usb_free_urb(urb);
1272 kfree(dr);
1273 remove_wait_queue(&ft1000dev->control_wait, &wait);
1274 spin_unlock(&ft1000dev->device_lock);
1275 return status;
1276 }
1277
1278 if(urb->status == -EINPROGRESS)
1279 {
1280 while(timeout && urb->status == -EINPROGRESS)
1281 {
1282 status = timeout = schedule_timeout(timeout);
1283 }
1284 }
1285 else
1286 {
1287 status = 1;
1288 }
1289
1290 remove_wait_queue(&ft1000dev->control_wait, &wait);
1291
1292 if(!status)
1293 {
1294 usb_unlink_urb(urb);
1295 printk("ft1000 timeout\n");
1296 status = -ETIMEDOUT;
1297 }
1298 else
1299 {
1300 status = urb->status;
1301
1302 if(urb->status)
1303 {
Arnd Bergmann7cfd8a32010-09-30 10:24:09 +02001304 printk("ft1000 control message failed (urb addr: %p) with error number: %i\n", urb, (int)status);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001305
Marek Beliskof7c1be02010-09-22 07:56:27 +02001306 usb_clear_halt(ft1000dev->dev, usb_rcvctrlpipe(ft1000dev->dev, 0));
1307 usb_clear_halt(ft1000dev->dev, usb_sndctrlpipe(ft1000dev->dev, 0));
1308 usb_unlink_urb(urb);
1309 }
1310 }
1311
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001312
Marek Beliskof7c1be02010-09-22 07:56:27 +02001313
1314 usb_free_urb(urb);
1315 kfree(dr);
1316 spin_unlock(&ft1000dev->device_lock);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001317 return ret;
Marek Beliskof7c1be02010-09-22 07:56:27 +02001318
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001319
Marek Beliskof7c1be02010-09-22 07:56:27 +02001320}
1321
1322//---------------------------------------------------------------------------
1323// Function: ft1000_read_fifo_len
1324//
1325// Parameters: ft1000dev - device structure
1326//
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001327//
Marek Beliskof7c1be02010-09-22 07:56:27 +02001328// Returns: none
1329//
1330// Description: read the fifo length register content
1331//
1332// Notes:
1333//
1334//---------------------------------------------------------------------------
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001335static inline u16 ft1000_read_fifo_len (struct net_device *dev)
Marek Beliskof7c1be02010-09-22 07:56:27 +02001336{
1337 u16 temp;
1338 u16 ret;
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001339
Marek Beliskof7c1be02010-09-22 07:56:27 +02001340 //FT1000_INFO *info = (PFT1000_INFO)dev->priv;
1341 FT1000_INFO *info = (FT1000_INFO *) netdev_priv (dev);
1342 struct ft1000_device *ft1000dev = info->pFt1000Dev;
1343// DEBUG("ft1000_read_fifo_len: enter ft1000dev %x\n", ft1000dev); //aelias [-] reason: warning: format ???%x??? expects type ???unsigned int???, but argument 2 has type ???struct ft1000_device *???
Arnd Bergmann7cfd8a32010-09-30 10:24:09 +02001344 DEBUG("ft1000_read_fifo_len: enter ft1000dev %p\n", ft1000dev); //aelias [+] reason: up
Marek Beliskof7c1be02010-09-22 07:56:27 +02001345 //ft1000_read_register(ft1000dev, &temp, FT1000_REG_MAG_UFSR);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001346
1347 ret = STATUS_SUCCESS;
1348
Marek Beliskof7c1be02010-09-22 07:56:27 +02001349 ret = ft1000_read_fifo_reg(ft1000dev,
1350 usb_rcvctrlpipe(ft1000dev->dev,0),
1351 HARLEY_READ_REGISTER,
1352 HARLEY_READ_OPERATION,
1353 0,
1354 FT1000_REG_MAG_UFSR,
1355 &temp,
1356 2,
1357 LARGE_TIMEOUT);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001358
Marek Beliskof7c1be02010-09-22 07:56:27 +02001359 if (ret>0)
1360 ret = STATUS_SUCCESS;
1361 else
1362 ret = STATUS_FAILURE;
1363
1364 DEBUG("ft1000_read_fifo_len: returned %d\n", temp);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001365
Marek Beliskof7c1be02010-09-22 07:56:27 +02001366 return (temp- 16);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001367
Marek Beliskof7c1be02010-09-22 07:56:27 +02001368}
1369
1370
1371//---------------------------------------------------------------------------
1372//
1373// Function: ft1000_copy_down_pkt
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001374// Descripton: This function will take an ethernet packet and convert it to
1375// a Flarion packet prior to sending it to the ASIC Downlink
Marek Beliskof7c1be02010-09-22 07:56:27 +02001376// FIFO.
1377// Input:
1378// dev - device structure
1379// packet - address of ethernet packet
1380// len - length of IP packet
1381// Output:
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001382// status - FAILURE
1383// SUCCESS
Marek Beliskof7c1be02010-09-22 07:56:27 +02001384//
1385//---------------------------------------------------------------------------
Arnd Bergmann2a953cf2010-09-30 10:24:10 +02001386static int ft1000_copy_down_pkt (struct net_device *netdev, u8 *packet, u16 len)
Marek Beliskof7c1be02010-09-22 07:56:27 +02001387{
1388 FT1000_INFO *pInfo = netdev_priv(netdev);
1389 struct ft1000_device *pFt1000Dev = pInfo->pFt1000Dev;
1390
1391
1392 int i, count, ret;
1393 USHORT *pTemp;
1394 USHORT checksum;
1395 u8 *t;
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001396
Marek Beliskof7c1be02010-09-22 07:56:27 +02001397 if (!pInfo->CardReady)
1398 {
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001399
Marek Beliskof7c1be02010-09-22 07:56:27 +02001400 DEBUG("ft1000_copy_down_pkt::Card Not Ready\n");
1401 return STATUS_FAILURE;
Marek Beliskof7c1be02010-09-22 07:56:27 +02001402
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001403 }
1404
1405
1406 //DEBUG("ft1000_copy_down_pkt() entered, len = %d\n", len);
1407
1408#if 0
1409 // Check if there is room on the FIFO
1410 if ( len > ft1000_read_fifo_len (netdev) )
Marek Beliskof7c1be02010-09-22 07:56:27 +02001411 {
1412 udelay(10);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001413 if ( len > ft1000_read_fifo_len (netdev) )
Marek Beliskof7c1be02010-09-22 07:56:27 +02001414 {
1415 udelay(20);
1416 }
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001417
1418 if ( len > ft1000_read_fifo_len (netdev) )
Marek Beliskof7c1be02010-09-22 07:56:27 +02001419 {
1420 udelay(20);
1421 }
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001422
1423 if ( len > ft1000_read_fifo_len (netdev) )
Marek Beliskof7c1be02010-09-22 07:56:27 +02001424 {
1425 udelay(20);
1426 }
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001427
1428 if ( len > ft1000_read_fifo_len (netdev) )
Marek Beliskof7c1be02010-09-22 07:56:27 +02001429 {
1430 udelay(20);
1431 }
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001432
1433 if ( len > ft1000_read_fifo_len (netdev) )
Marek Beliskof7c1be02010-09-22 07:56:27 +02001434 {
1435 udelay(20);
1436 }
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001437
1438 if ( len > ft1000_read_fifo_len (netdev) )
Marek Beliskof7c1be02010-09-22 07:56:27 +02001439 {
1440 DEBUG("ft1000_hw:ft1000_copy_down_pkt:Transmit FIFO is fulli - pkt drop\n");
1441 pInfo->stats.tx_errors++;
1442 return STATUS_SUCCESS;
1443 }
1444 }
1445#endif
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001446
Marek Beliskob13e39b2010-10-15 14:13:02 +02001447 count = sizeof(struct pseudo_hdr) + len;
Marek Beliskof7c1be02010-09-22 07:56:27 +02001448 if(count > MAX_BUF_SIZE)
1449 {
1450 DEBUG("Error:ft1000_copy_down_pkt:Message Size Overflow!\n");
1451 DEBUG("size = %d\n", count);
1452 return STATUS_FAILURE;
1453 }
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001454
Marek Beliskof7c1be02010-09-22 07:56:27 +02001455 if ( count % 4)
1456 count = count + (4- (count %4) );
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001457
Marek Beliskof7c1be02010-09-22 07:56:27 +02001458 pTemp = (PUSHORT)&(pFt1000Dev->tx_buf[0]);
1459 *pTemp ++ = ntohs(count);
1460 *pTemp ++ = 0x1020;
1461 *pTemp ++ = 0x2010;
1462 *pTemp ++ = 0x9100;
1463 *pTemp ++ = 0;
1464 *pTemp ++ = 0;
1465 *pTemp ++ = 0;
1466 pTemp = (PUSHORT)&(pFt1000Dev->tx_buf[0]);
1467 checksum = *pTemp ++;
1468 for (i=1; i<7; i++)
1469 {
1470 checksum ^= *pTemp ++;
1471 }
1472 *pTemp++ = checksum;
Marek Beliskob13e39b2010-10-15 14:13:02 +02001473 memcpy(&(pFt1000Dev->tx_buf[sizeof(struct pseudo_hdr)]), packet, len);
Marek Beliskof7c1be02010-09-22 07:56:27 +02001474
1475 //usb_init_urb(pFt1000Dev->tx_urb); //mbelian
1476
1477 netif_stop_queue(netdev);
1478
1479 //DEBUG ("ft1000_copy_down_pkt: count = %d\n", count);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001480
Marek Beliskof7c1be02010-09-22 07:56:27 +02001481 usb_fill_bulk_urb(pFt1000Dev->tx_urb,
1482 pFt1000Dev->dev,
1483 usb_sndbulkpipe(pFt1000Dev->dev, pFt1000Dev->bulk_out_endpointAddr),
1484 pFt1000Dev->tx_buf,
1485 count,
1486 ft1000_usb_transmit_complete,
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001487 (void*)pFt1000Dev);
1488
Marek Beliskof7c1be02010-09-22 07:56:27 +02001489 t = (u8 *)pFt1000Dev->tx_urb->transfer_buffer;
1490 //DEBUG("transfer_length=%d\n", pFt1000Dev->tx_urb->transfer_buffer_length);
1491 /*for (i=0; i<count; i++ )
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001492 {
Marek Beliskof7c1be02010-09-22 07:56:27 +02001493 DEBUG("%x ", *t++ );
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001494 }*/
1495
1496
Marek Beliskof7c1be02010-09-22 07:56:27 +02001497 ret = usb_submit_urb(pFt1000Dev->tx_urb, GFP_ATOMIC);
1498 if(ret)
1499 {
1500 DEBUG("ft1000 failed tx_urb %d\n", ret);
1501
1502 /* pInfo->stats.tx_errors++;
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001503
Marek Beliskof7c1be02010-09-22 07:56:27 +02001504 netif_start_queue(netdev); */ //mbelian
1505 return STATUS_FAILURE;
1506
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001507 }
1508 else
Marek Beliskof7c1be02010-09-22 07:56:27 +02001509 {
1510 //DEBUG("ft1000 sucess tx_urb %d\n", ret);
1511
1512 pInfo->stats.tx_packets++;
1513 pInfo->stats.tx_bytes += (len+14);
1514 }
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001515
1516 //DEBUG("ft1000_copy_down_pkt() exit\n");
1517
Marek Beliskof7c1be02010-09-22 07:56:27 +02001518 return STATUS_SUCCESS;
1519}
1520
1521//---------------------------------------------------------------------------
1522// Function: ft1000_start_xmit
1523//
1524// Parameters: skb - socket buffer to be sent
1525// dev - network device
1526//
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001527//
Marek Beliskof7c1be02010-09-22 07:56:27 +02001528// Returns: none
1529//
1530// Description: transmit a ethernet packet
1531//
1532// Notes:
1533//
1534//---------------------------------------------------------------------------
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001535static int ft1000_start_xmit(struct sk_buff *skb, struct net_device *dev)
Marek Beliskof7c1be02010-09-22 07:56:27 +02001536{
1537 FT1000_INFO *pInfo = netdev_priv(dev);
1538 struct ft1000_device *pFt1000Dev= pInfo->pFt1000Dev;
1539 u8 *pdata;
1540 int maxlen, pipe;
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001541
1542
1543 //DEBUG(" ft1000_start_xmit() entered\n");
1544
1545 if ( skb == NULL )
Marek Beliskof7c1be02010-09-22 07:56:27 +02001546 {
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001547 DEBUG ("ft1000_hw: ft1000_start_xmit:skb == NULL!!!\n" );
Marek Beliskof7c1be02010-09-22 07:56:27 +02001548 return STATUS_FAILURE;
1549 }
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001550
Marek Beliskof7c1be02010-09-22 07:56:27 +02001551 if ( pFt1000Dev->status & FT1000_STATUS_CLOSING)
1552 {
1553 DEBUG("network driver is closed, return\n");
1554 dev_kfree_skb(skb);
1555 //usb_kill_urb(pFt1000Dev->tx_urb); //mbelian
1556 return STATUS_SUCCESS;
1557 }
1558
1559 //DEBUG("ft1000_start_xmit 1:length of packet = %d\n", skb->len);
1560 pipe = usb_sndbulkpipe(pFt1000Dev->dev, pFt1000Dev->bulk_out_endpointAddr);
1561 maxlen = usb_maxpacket(pFt1000Dev->dev, pipe, usb_pipeout(pipe));
1562 //DEBUG("ft1000_start_xmit 2: pipe=%d dev->maxpacket = %d\n", pipe, maxlen);
1563
1564 pdata = (u8 *)skb->data;
1565 /*for (i=0; i<skb->len; i++)
1566 DEBUG("skb->data[%d]=%x ", i, *(skb->data+i));
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001567
Marek Beliskof7c1be02010-09-22 07:56:27 +02001568 DEBUG("\n");*/
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001569
1570
1571 if (pInfo->mediastate == 0)
Marek Beliskof7c1be02010-09-22 07:56:27 +02001572 {
1573 /* Drop packet is mediastate is down */
1574 DEBUG("ft1000_hw:ft1000_start_xmit:mediastate is down\n");
1575 dev_kfree_skb(skb);
1576 return STATUS_SUCCESS;
1577 }
1578
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001579 if ( (skb->len < ENET_HEADER_SIZE) || (skb->len > ENET_MAX_SIZE) )
Marek Beliskof7c1be02010-09-22 07:56:27 +02001580 {
1581 /* Drop packet which has invalid size */
1582 DEBUG("ft1000_hw:ft1000_start_xmit:invalid ethernet length\n");
1583 dev_kfree_skb(skb);
1584 return STATUS_SUCCESS;
1585 }
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001586//mbelian
Marek Beliskof7c1be02010-09-22 07:56:27 +02001587 if(ft1000_copy_down_pkt (dev, (pdata+ENET_HEADER_SIZE-2), skb->len - ENET_HEADER_SIZE + 2) == STATUS_FAILURE)
1588 {
1589 dev_kfree_skb(skb);
1590 return STATUS_SUCCESS;
1591 }
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001592
Marek Beliskof7c1be02010-09-22 07:56:27 +02001593 dev_kfree_skb(skb);
1594 //DEBUG(" ft1000_start_xmit() exit\n");
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001595
Marek Beliskof7c1be02010-09-22 07:56:27 +02001596 return 0;
1597}
1598
1599//---------------------------------------------------------------------------
1600//
1601// Function: ft1000_copy_up_pkt
1602// Descripton: This function will take a packet from the FIFO up link and
1603// convert it into an ethernet packet and deliver it to the IP stack
1604// Input:
1605// urb - the receving usb urb
1606//
1607// Output:
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001608// status - FAILURE
1609// SUCCESS
Marek Beliskof7c1be02010-09-22 07:56:27 +02001610//
1611//---------------------------------------------------------------------------
Arnd Bergmann2a953cf2010-09-30 10:24:10 +02001612static int ft1000_copy_up_pkt (struct urb *urb)
Marek Beliskof7c1be02010-09-22 07:56:27 +02001613{
1614 PFT1000_INFO info = urb->context;
1615 struct ft1000_device *ft1000dev = info->pFt1000Dev;
1616 struct net_device *net = ft1000dev->net;
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001617
Marek Beliskof7c1be02010-09-22 07:56:27 +02001618 u16 tempword;
1619 u16 len;
1620 u16 lena; //mbelian
1621 struct sk_buff *skb;
1622 u16 i;
1623 u8 *pbuffer=NULL;
1624 u8 *ptemp=NULL;
1625 u16 *chksum;
1626
1627
1628 //DEBUG("ft1000_copy_up_pkt entered\n");
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001629
Marek Beliskof7c1be02010-09-22 07:56:27 +02001630 if ( ft1000dev->status & FT1000_STATUS_CLOSING)
1631 {
1632 DEBUG("network driver is closed, return\n");
1633 return STATUS_SUCCESS;
1634 }
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001635
Marek Beliskof7c1be02010-09-22 07:56:27 +02001636 // Read length
1637 len = urb->transfer_buffer_length;
1638 lena = urb->actual_length; //mbelian
1639 //DEBUG("ft1000_copy_up_pkt: transfer_buffer_length=%d, actual_buffer_len=%d\n",
1640 // urb->transfer_buffer_length, urb->actual_length);
1641
1642 chksum = (PUSHORT)ft1000dev->rx_buf;
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001643
Marek Beliskof7c1be02010-09-22 07:56:27 +02001644 tempword = *chksum++;
1645 for (i=1; i<7; i++)
1646 {
1647 tempword ^= *chksum++;
1648 }
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001649
Marek Beliskof7c1be02010-09-22 07:56:27 +02001650 if (tempword != *chksum)
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001651 {
Marek Beliskof7c1be02010-09-22 07:56:27 +02001652 info->stats.rx_errors ++;
1653 ft1000_submit_rx_urb(info);
1654 return STATUS_FAILURE;
1655 }
1656
1657
1658 //DEBUG("ft1000_copy_up_pkt: checksum is correct %x\n", *chksum);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001659
Marek Beliskof7c1be02010-09-22 07:56:27 +02001660 skb = dev_alloc_skb(len+12+2);
1661
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001662 if (skb == NULL)
Marek Beliskof7c1be02010-09-22 07:56:27 +02001663 {
1664 DEBUG("ft1000_copy_up_pkt: No Network buffers available\n");
1665 info->stats.rx_errors++;
1666 ft1000_submit_rx_urb(info);
1667 return STATUS_FAILURE;
1668 }
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001669
Marek Beliskof7c1be02010-09-22 07:56:27 +02001670 pbuffer = (u8 *)skb_put(skb, len+12);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001671
Marek Beliskof7c1be02010-09-22 07:56:27 +02001672 //subtract the number of bytes read already
1673 ptemp = pbuffer;
1674
1675 // fake MAC address
1676 *pbuffer++ = net->dev_addr[0];
1677 *pbuffer++ = net->dev_addr[1];
1678 *pbuffer++ = net->dev_addr[2];
1679 *pbuffer++ = net->dev_addr[3];
1680 *pbuffer++ = net->dev_addr[4];
1681 *pbuffer++ = net->dev_addr[5];
1682 *pbuffer++ = 0x00;
1683 *pbuffer++ = 0x07;
1684 *pbuffer++ = 0x35;
1685 *pbuffer++ = 0xff;
1686 *pbuffer++ = 0xff;
1687 *pbuffer++ = 0xfe;
Marek Beliskof7c1be02010-09-22 07:56:27 +02001688
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001689
1690
1691
Marek Beliskob13e39b2010-10-15 14:13:02 +02001692 memcpy(pbuffer, ft1000dev->rx_buf+sizeof(struct pseudo_hdr), len-sizeof(struct pseudo_hdr));
Marek Beliskof7c1be02010-09-22 07:56:27 +02001693
1694 //DEBUG("ft1000_copy_up_pkt: Data passed to Protocol layer\n");
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001695 /*for (i=0; i<len+12; i++)
Marek Beliskof7c1be02010-09-22 07:56:27 +02001696 {
1697 DEBUG("ft1000_copy_up_pkt: Protocol Data: 0x%x\n ", *ptemp++);
1698 }*/
1699
1700 skb->dev = net;
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001701
Marek Beliskof7c1be02010-09-22 07:56:27 +02001702 skb->protocol = eth_type_trans(skb, net);
1703 skb->ip_summed = CHECKSUM_UNNECESSARY;
1704 netif_rx(skb);
1705
1706 info->stats.rx_packets++;
1707 // Add on 12 bytes for MAC address which was removed
1708 info->stats.rx_bytes += (lena+12); //mbelian
1709
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001710 ft1000_submit_rx_urb(info);
Marek Beliskof7c1be02010-09-22 07:56:27 +02001711 //DEBUG("ft1000_copy_up_pkt exited\n");
1712 return SUCCESS;
1713}
1714
1715//---------------------------------------------------------------------------
1716//
1717// Function: ft1000_submit_rx_urb
1718// Descripton: the receiving function of the network driver
1719//
1720// Input:
1721// info - a private structure contains the device information
1722//
1723// Output:
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001724// status - FAILURE
1725// SUCCESS
Marek Beliskof7c1be02010-09-22 07:56:27 +02001726//
1727//---------------------------------------------------------------------------
Arnd Bergmann2a953cf2010-09-30 10:24:10 +02001728static int ft1000_submit_rx_urb(PFT1000_INFO info)
Marek Beliskof7c1be02010-09-22 07:56:27 +02001729{
1730 int result;
1731 struct ft1000_device *pFt1000Dev = info->pFt1000Dev;
1732
1733 //netif_carrier_on(pFt1000Dev->net);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001734
Marek Beliskof7c1be02010-09-22 07:56:27 +02001735 //DEBUG ("ft1000_submit_rx_urb entered: sizeof rx_urb is %d\n", sizeof(*pFt1000Dev->rx_urb));
1736 if ( pFt1000Dev->status & FT1000_STATUS_CLOSING)
1737 {
1738 DEBUG("network driver is closed, return\n");
1739 //usb_kill_urb(pFt1000Dev->rx_urb); //mbelian
1740 return STATUS_SUCCESS;
1741 }
1742 //memset(pFt1000Dev->rx_urb, 0, sizeof(*pFt1000Dev->rx_urb));
1743 //usb_init_urb(pFt1000Dev->rx_urb);//mbelian
1744
1745 //spin_lock_init(&pFt1000Dev->rx_urb->lock);
1746
1747 usb_fill_bulk_urb(pFt1000Dev->rx_urb,
1748 pFt1000Dev->dev,
1749 usb_rcvbulkpipe(pFt1000Dev->dev, pFt1000Dev->bulk_in_endpointAddr),
1750 pFt1000Dev->rx_buf,
1751 MAX_BUF_SIZE,
1752 (usb_complete_t)ft1000_copy_up_pkt,
1753 info);
1754
1755
1756 if((result = usb_submit_urb(pFt1000Dev->rx_urb, GFP_ATOMIC)))
1757 {
1758 printk("ft1000_submit_rx_urb: submitting rx_urb %d failed\n", result);
1759 return STATUS_FAILURE;
1760 }
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001761
Marek Beliskof7c1be02010-09-22 07:56:27 +02001762 //DEBUG("ft1000_submit_rx_urb exit: result=%d\n", result);
1763
1764 return STATUS_SUCCESS;
1765}
1766
1767//---------------------------------------------------------------------------
1768// Function: ft1000_open
1769//
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001770// Parameters:
Marek Beliskof7c1be02010-09-22 07:56:27 +02001771// dev - network device
1772//
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001773//
Marek Beliskof7c1be02010-09-22 07:56:27 +02001774// Returns: none
1775//
1776// Description: open the network driver
1777//
1778// Notes:
1779//
1780//---------------------------------------------------------------------------
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001781static int ft1000_open (struct net_device *dev)
Marek Beliskof7c1be02010-09-22 07:56:27 +02001782{
1783 FT1000_INFO *pInfo = (FT1000_INFO *)netdev_priv(dev);
1784 struct timeval tv; //mbelian
1785
1786 DEBUG("ft1000_open is called for card %d\n", pInfo->CardNumber);
1787 //DEBUG("ft1000_open: dev->addr=%x, dev->addr_len=%d\n", dev->addr, dev->addr_len);
1788
1789 pInfo->stats.rx_bytes = 0; //mbelian
1790 pInfo->stats.tx_bytes = 0; //mbelian
1791 pInfo->stats.rx_packets = 0; //mbelian
1792 pInfo->stats.tx_packets = 0; //mbelian
1793 do_gettimeofday(&tv);
1794 pInfo->ConTm = tv.tv_sec;
1795 pInfo->ProgConStat = 0; //mbelian
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001796
1797
Marek Beliskof7c1be02010-09-22 07:56:27 +02001798 netif_start_queue(dev);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001799
Marek Beliskof7c1be02010-09-22 07:56:27 +02001800 //netif_device_attach(dev);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001801
Marek Beliskof7c1be02010-09-22 07:56:27 +02001802 netif_carrier_on(dev); //mbelian
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001803
1804 ft1000_submit_rx_urb(pInfo);
Marek Beliskof7c1be02010-09-22 07:56:27 +02001805 return 0;
1806}
1807
1808//---------------------------------------------------------------------------
1809// Function: ft1000_close
1810//
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001811// Parameters:
Marek Beliskof7c1be02010-09-22 07:56:27 +02001812// net - network device
1813//
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001814//
Marek Beliskof7c1be02010-09-22 07:56:27 +02001815// Returns: none
1816//
1817// Description: close the network driver
1818//
1819// Notes:
1820//
1821//---------------------------------------------------------------------------
1822int ft1000_close(struct net_device *net)
1823{
1824 FT1000_INFO *pInfo = (FT1000_INFO *) netdev_priv (net);
1825 struct ft1000_device *ft1000dev = pInfo->pFt1000Dev;
1826
1827 //DEBUG ("ft1000_close: netdev->refcnt=%d\n", net->refcnt);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001828
Marek Beliskof7c1be02010-09-22 07:56:27 +02001829 ft1000dev->status |= FT1000_STATUS_CLOSING;
1830
1831 //DEBUG("ft1000_close: calling usb_kill_urb \n");
1832 //usb_kill_urb(ft1000dev->rx_urb);
1833 //usb_kill_urb(ft1000dev->tx_urb);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001834
Marek Beliskof7c1be02010-09-22 07:56:27 +02001835
Arnd Bergmann7cfd8a32010-09-30 10:24:09 +02001836 DEBUG("ft1000_close: pInfo=%p, ft1000dev=%p\n", pInfo, ft1000dev);
Marek Beliskof7c1be02010-09-22 07:56:27 +02001837 netif_carrier_off(net);//mbelian
1838 netif_stop_queue(net);
1839 //DEBUG("ft1000_close: netif_stop_queue called\n");
1840 ft1000dev->status &= ~FT1000_STATUS_CLOSING;
1841
1842 pInfo->ProgConStat = 0xff; //mbelian
1843
1844
1845 return 0;
1846}
1847
1848static struct net_device_stats *ft1000_netdev_stats(struct net_device *dev)
1849{
1850 FT1000_INFO *info = (FT1000_INFO *) netdev_priv (dev);
1851 //struct ft1000_device *ft1000dev = info->pFt1000Dev;
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001852
Marek Beliskof7c1be02010-09-22 07:56:27 +02001853 //return &(ft1000dev->stats);//mbelian
1854 return &(info->stats); //mbelian
1855}
1856
1857
1858/*********************************************************************************
1859Jim
1860*/
1861
1862
1863//---------------------------------------------------------------------------
1864//
1865// Function: ft1000_chkcard
1866// Descripton: This function will check if the device is presently available on
1867// the system.
1868// Input:
1869// dev - device structure
1870// Output:
1871// status - FALSE (device is not present)
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001872// TRUE (device is present)
Marek Beliskof7c1be02010-09-22 07:56:27 +02001873//
1874//---------------------------------------------------------------------------
1875static int ft1000_chkcard (struct ft1000_device *dev) {
1876 u16 tempword;
1877 u16 status;
1878 FT1000_INFO *info = (FT1000_INFO *) netdev_priv (dev->net);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001879
Marek Beliskof7c1be02010-09-22 07:56:27 +02001880 if (info->fCondResetPend)
1881 {
1882 DEBUG("ft1000_hw:ft1000_chkcard:Card is being reset, return FALSE\n");
1883 return TRUE;
1884 }
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001885
Marek Beliskof7c1be02010-09-22 07:56:27 +02001886 // Mask register is used to check for device presence since it is never
1887 // set to zero.
1888 status = ft1000_read_register(dev, &tempword, FT1000_REG_SUP_IMASK);
1889 //DEBUG("ft1000_hw:ft1000_chkcard: read FT1000_REG_SUP_IMASK = %x\n", tempword);
1890 if (tempword == 0) {
1891 DEBUG("ft1000_hw:ft1000_chkcard: IMASK = 0 Card not detected\n");
1892 return FALSE;
1893 }
1894
1895 // The system will return the value of 0xffff for the version register
1896 // if the device is not present.
1897 status = ft1000_read_register(dev, &tempword, FT1000_REG_ASIC_ID);
1898 //DEBUG("ft1000_hw:ft1000_chkcard: read FT1000_REG_ASIC_ID = %x\n", tempword);
1899 //pxu if (tempword == 0xffff) {
1900 if (tempword != 0x1b01 ){
1901 dev->status |= FT1000_STATUS_CLOSING; //mbelian
1902 DEBUG("ft1000_hw:ft1000_chkcard: Version = 0xffff Card not detected\n");
1903 return FALSE;
1904 }
1905 return TRUE;
1906}
1907
Marek Beliskof7c1be02010-09-22 07:56:27 +02001908
Marek Beliskof7c1be02010-09-22 07:56:27 +02001909
1910//---------------------------------------------------------------------------
1911//
1912// Function: ft1000_receive_cmd
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001913// Descripton: This function will read a message from the dpram area.
Marek Beliskof7c1be02010-09-22 07:56:27 +02001914// Input:
1915// dev - network device structure
1916// pbuffer - caller supply address to buffer
1917// pnxtph - pointer to next pseudo header
1918// Output:
1919// Status = 0 (unsuccessful)
1920// = 1 (successful)
1921//
1922//---------------------------------------------------------------------------
Arnd Bergmann2a953cf2010-09-30 10:24:10 +02001923static BOOLEAN ft1000_receive_cmd (struct ft1000_device *dev, u16 *pbuffer, int maxsz, u16 *pnxtph) {
Marek Beliskof7c1be02010-09-22 07:56:27 +02001924 u16 size, ret;
1925 u16 *ppseudohdr;
1926 int i;
1927 u16 tempword;
1928
1929 ret = ft1000_read_dpram16(dev, FT1000_MAG_PH_LEN, (PUCHAR)&size, FT1000_MAG_PH_LEN_INDX);
1930 size = ntohs(size) + PSEUDOSZ;
1931 if (size > maxsz) {
1932 DEBUG("FT1000:ft1000_receive_cmd:Invalid command length = %d\n", size);
1933 return FALSE;
1934 }
1935 else {
1936 ppseudohdr = (u16 *)pbuffer;
1937 //spin_lock_irqsave (&info->dpram_lock, flags);
1938 ft1000_write_register(dev, FT1000_DPRAM_MAG_RX_BASE, FT1000_REG_DPRAM_ADDR);
1939 ret = ft1000_read_register(dev, pbuffer, FT1000_REG_MAG_DPDATAH);
1940 //DEBUG("ft1000_hw:received data = 0x%x\n", *pbuffer);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001941 pbuffer++;
Marek Beliskof7c1be02010-09-22 07:56:27 +02001942 ft1000_write_register(dev, FT1000_DPRAM_MAG_RX_BASE+1, FT1000_REG_DPRAM_ADDR);
1943 for (i=0; i<=(size>>2); i++) {
1944 ret = ft1000_read_register(dev, pbuffer, FT1000_REG_MAG_DPDATAL);
1945 pbuffer++;
1946 ret = ft1000_read_register(dev, pbuffer, FT1000_REG_MAG_DPDATAH);
1947 pbuffer++;
1948 }
1949 //copy odd aligned word
1950 ret = ft1000_read_register(dev, pbuffer, FT1000_REG_MAG_DPDATAL);
1951 //DEBUG("ft1000_hw:received data = 0x%x\n", *pbuffer);
1952 pbuffer++;
1953 ret = ft1000_read_register(dev, pbuffer, FT1000_REG_MAG_DPDATAH);
1954 //DEBUG("ft1000_hw:received data = 0x%x\n", *pbuffer);
1955 pbuffer++;
1956 if (size & 0x0001) {
1957 //copy odd byte from fifo
1958 ret = ft1000_read_register(dev, &tempword, FT1000_REG_DPRAM_DATA);
1959 *pbuffer = ntohs(tempword);
1960 }
1961 //spin_unlock_irqrestore(&info->dpram_lock, flags);
1962
1963 // Check if pseudo header checksum is good
1964 // Calculate pseudo header checksum
1965 tempword = *ppseudohdr++;
1966 for (i=1; i<7; i++) {
1967 tempword ^= *ppseudohdr++;
1968 }
1969 if ( (tempword != *ppseudohdr) ) {
1970 return FALSE;
1971 }
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001972
1973
1974#if 0
Marek Beliskof7c1be02010-09-22 07:56:27 +02001975 DEBUG("ft1000_receive_cmd:pbuffer\n");
1976 for(i = 0; i < size; i+=5)
1977 {
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001978 if( (i + 5) < size )
1979 DEBUG("0x%x, 0x%x, 0x%x, 0x%x, 0x%x\n", tempbuffer[i], tempbuffer[i+1], tempbuffer[i+2], tempbuffer[i+3], tempbuffer[i+4]);
Marek Beliskof7c1be02010-09-22 07:56:27 +02001980 else
1981 {
1982 for (j = i; j < size; j++)
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001983 DEBUG("0x%x ", tempbuffer[j]);
1984 DEBUG("\n");
Marek Beliskof7c1be02010-09-22 07:56:27 +02001985 break;
1986 }
1987 }
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07001988
1989#endif
1990
Marek Beliskof7c1be02010-09-22 07:56:27 +02001991 return TRUE;
1992 }
1993}
1994
1995
Arnd Bergmann2a953cf2010-09-30 10:24:10 +02001996static int ft1000_dsp_prov(void *arg)
Marek Beliskof7c1be02010-09-22 07:56:27 +02001997{
1998 struct ft1000_device *dev = (struct ft1000_device *)arg;
1999 FT1000_INFO *info = (FT1000_INFO *) netdev_priv (dev->net);
2000 u16 tempword;
2001 u16 len;
2002 u16 i=0;
Marek Beliskoe27d96d2010-10-15 14:13:01 +02002003 struct prov_record *ptr;
Marek Beliskob13e39b2010-10-15 14:13:02 +02002004 struct pseudo_hdr *ppseudo_hdr;
Marek Beliskof7c1be02010-09-22 07:56:27 +02002005 PUSHORT pmsg;
2006 u16 status;
2007 USHORT TempShortBuf [256];
2008
2009 DEBUG("*** DspProv Entered\n");
2010
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002011 while ( list_empty(&info->prov_list) == 0
2012 /*&& !kthread_should_stop() */)
Marek Beliskof7c1be02010-09-22 07:56:27 +02002013 {
2014 DEBUG("DSP Provisioning List Entry\n");
2015
2016 // Check if doorbell is available
2017 DEBUG("check if doorbell is cleared\n");
2018 status = ft1000_read_register (dev, &tempword, FT1000_REG_DOORBELL);
2019 if (status)
2020 {
2021 DEBUG("ft1000_dsp_prov::ft1000_read_register error\n");
2022 break;
2023 }
2024
2025 while (tempword & FT1000_DB_DPRAM_TX) {
2026 mdelay(10);
2027 i++;
2028 if (i==10) {
2029 DEBUG("FT1000:ft1000_dsp_prov:message drop\n");
2030 return STATUS_FAILURE;
2031 }
2032 ft1000_read_register(dev, &tempword, FT1000_REG_DOORBELL);
2033 }
2034
2035 if ( !(tempword & FT1000_DB_DPRAM_TX) ) {
2036 DEBUG("*** Provision Data Sent to DSP\n");
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002037
Marek Beliskof7c1be02010-09-22 07:56:27 +02002038 // Send provisioning data
Marek Beliskoe27d96d2010-10-15 14:13:01 +02002039 ptr = list_entry(info->prov_list.next, struct prov_record, list);
Marek Beliskof7c1be02010-09-22 07:56:27 +02002040 len = *(u16 *)ptr->pprov_data;
2041 len = htons(len);
2042 len += PSEUDOSZ;
2043 //len = htons(len);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002044
Marek Beliskof7c1be02010-09-22 07:56:27 +02002045 pmsg = (PUSHORT)ptr->pprov_data;
Marek Beliskob13e39b2010-10-15 14:13:02 +02002046 ppseudo_hdr = (struct pseudo_hdr *)pmsg;
Marek Beliskof7c1be02010-09-22 07:56:27 +02002047 // Insert slow queue sequence number
2048 ppseudo_hdr->seq_num = info->squeseqnum++;
2049 ppseudo_hdr->portsrc = 0;
2050 // Calculate new checksum
2051 ppseudo_hdr->checksum = *pmsg++;
2052 //DEBUG("checksum = 0x%x\n", ppseudo_hdr->checksum);
2053 for (i=1; i<7; i++) {
2054 ppseudo_hdr->checksum ^= *pmsg++;
2055 //DEBUG("checksum = 0x%x\n", ppseudo_hdr->checksum);
2056 }
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002057
Marek Beliskof7c1be02010-09-22 07:56:27 +02002058 TempShortBuf[0] = 0;
2059 TempShortBuf[1] = htons (len);
2060 memcpy(&TempShortBuf[2], ppseudo_hdr, len);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002061
Marek Beliskof7c1be02010-09-22 07:56:27 +02002062 status = ft1000_write_dpram32 (dev, 0, (PUCHAR)&TempShortBuf[0], (unsigned short)(len+2));
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002063 status = ft1000_write_register (dev, FT1000_DB_DPRAM_TX, FT1000_REG_DOORBELL);
2064
Marek Beliskof7c1be02010-09-22 07:56:27 +02002065 list_del(&ptr->list);
2066 kfree(ptr->pprov_data);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002067 kfree(ptr);
Marek Beliskof7c1be02010-09-22 07:56:27 +02002068 }
2069 msleep(10);
2070 }
2071
2072 DEBUG("DSP Provisioning List Entry finished\n");
2073
2074 msleep(100);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002075
Marek Beliskof7c1be02010-09-22 07:56:27 +02002076 info->fProvComplete = 1;
2077 info->CardReady = 1;
Marek Beliskof7c1be02010-09-22 07:56:27 +02002078 return STATUS_SUCCESS;
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002079
Marek Beliskof7c1be02010-09-22 07:56:27 +02002080}
2081
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002082
Arnd Bergmann2a953cf2010-09-30 10:24:10 +02002083static int ft1000_proc_drvmsg (struct ft1000_device *dev, u16 size) {
Marek Beliskof7c1be02010-09-22 07:56:27 +02002084 FT1000_INFO *info = (FT1000_INFO *) netdev_priv (dev->net);
2085 u16 msgtype;
2086 u16 tempword;
Marek Belisko1b8a3012010-10-15 14:12:58 +02002087 struct media_msg *pmediamsg;
Marek Belisko369e8572010-10-15 14:12:59 +02002088 struct dsp_init_msg *pdspinitmsg;
Marek Beliskoe09aee22010-10-15 14:13:03 +02002089 struct drv_msg *pdrvmsg;
Marek Beliskof7c1be02010-09-22 07:56:27 +02002090 u16 i;
Marek Beliskob13e39b2010-10-15 14:13:02 +02002091 struct pseudo_hdr *ppseudo_hdr;
Marek Beliskof7c1be02010-09-22 07:56:27 +02002092 PUSHORT pmsg;
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002093 u16 status;
Marek Beliskof7c1be02010-09-22 07:56:27 +02002094 //struct timeval tv; //mbelian
2095 union {
2096 u8 byte[2];
2097 u16 wrd;
2098 } convert;
2099
Marek Beliskof7c1be02010-09-22 07:56:27 +02002100
Arnd Bergmann2a953cf2010-09-30 10:24:10 +02002101 char *cmdbuffer = kmalloc(1600, GFP_KERNEL);
2102 if (!cmdbuffer)
2103 return STATUS_FAILURE;
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002104
Arnd Bergmann2a953cf2010-09-30 10:24:10 +02002105 status = ft1000_read_dpram32(dev, 0x200, cmdbuffer, size);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002106
2107
2108 //if (ft1000_receive_cmd(dev, &cmdbuffer[0], MAX_CMD_SQSIZE, &tempword))
Marek Beliskof7c1be02010-09-22 07:56:27 +02002109 {
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002110
2111#ifdef JDEBUG
Marek Beliskof7c1be02010-09-22 07:56:27 +02002112 DEBUG("ft1000_proc_drvmsg:cmdbuffer\n");
2113 for(i = 0; i < size; i+=5)
2114 {
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002115 if( (i + 5) < size )
2116 DEBUG("0x%x, 0x%x, 0x%x, 0x%x, 0x%x\n", cmdbuffer[i], cmdbuffer[i+1], cmdbuffer[i+2], cmdbuffer[i+3], cmdbuffer[i+4]);
Marek Beliskof7c1be02010-09-22 07:56:27 +02002117 else
2118 {
2119 for (j = i; j < size; j++)
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002120 DEBUG("0x%x ", cmdbuffer[j]);
2121 DEBUG("\n");
Marek Beliskof7c1be02010-09-22 07:56:27 +02002122 break;
2123 }
2124 }
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002125#endif
Marek Beliskoe09aee22010-10-15 14:13:03 +02002126 pdrvmsg = (struct drv_msg *)&cmdbuffer[2];
Marek Beliskof7c1be02010-09-22 07:56:27 +02002127 msgtype = ntohs(pdrvmsg->type);
2128 DEBUG("ft1000_proc_drvmsg:Command message type = 0x%x\n", msgtype);
2129 switch (msgtype) {
2130 case MEDIA_STATE: {
2131 DEBUG("ft1000_proc_drvmsg:Command message type = MEDIA_STATE");
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002132
Marek Belisko1b8a3012010-10-15 14:12:58 +02002133 pmediamsg = (struct media_msg *)&cmdbuffer[0];
Marek Beliskof7c1be02010-09-22 07:56:27 +02002134 if (info->ProgConStat != 0xFF) {
2135 if (pmediamsg->state) {
2136 DEBUG("Media is up\n");
2137 if (info->mediastate == 0) {
2138 if ( info->NetDevRegDone )
2139 {
2140 //netif_carrier_on(dev->net);//mbelian
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002141 netif_wake_queue(dev->net);
Marek Beliskof7c1be02010-09-22 07:56:27 +02002142 }
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002143 info->mediastate = 1;
Marek Beliskof7c1be02010-09-22 07:56:27 +02002144 /*do_gettimeofday(&tv);
2145 info->ConTm = tv.tv_sec;*/ //mbelian
2146 }
2147 }
2148 else {
2149 DEBUG("Media is down\n");
2150 if (info->mediastate == 1) {
2151 info->mediastate = 0;
2152 if ( info->NetDevRegDone )
2153 {
2154 //netif_carrier_off(dev->net); mbelian
2155 //netif_stop_queue(dev->net);
2156 }
2157 info->ConTm = 0;
2158 }
2159 }
2160 }
2161 else {
2162 DEBUG("Media is down\n");
2163 if (info->mediastate == 1) {
2164 info->mediastate = 0;
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002165 if ( info->NetDevRegDone)
Marek Beliskof7c1be02010-09-22 07:56:27 +02002166 {
2167 //netif_carrier_off(dev->net); //mbelian
2168 //netif_stop_queue(dev->net);
2169 }
2170 info->ConTm = 0;
2171 }
2172 }
2173 break;
2174 }
2175 case DSP_INIT_MSG: {
2176 DEBUG("ft1000_proc_drvmsg:Command message type = DSP_INIT_MSG");
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002177
Marek Belisko369e8572010-10-15 14:12:59 +02002178 pdspinitmsg = (struct dsp_init_msg *)&cmdbuffer[2];
Marek Beliskof7c1be02010-09-22 07:56:27 +02002179 memcpy(info->DspVer, pdspinitmsg->DspVer, DSPVERSZ);
2180 DEBUG("DSPVER = 0x%2x 0x%2x 0x%2x 0x%2x\n", info->DspVer[0], info->DspVer[1], info->DspVer[2], info->DspVer[3]);
2181 memcpy(info->HwSerNum, pdspinitmsg->HwSerNum, HWSERNUMSZ);
2182 memcpy(info->Sku, pdspinitmsg->Sku, SKUSZ);
2183 memcpy(info->eui64, pdspinitmsg->eui64, EUISZ);
2184 DEBUG("EUI64=%2x.%2x.%2x.%2x.%2x.%2x.%2x.%2x\n", info->eui64[0],info->eui64[1], info->eui64[2], info->eui64[3], info->eui64[4], info->eui64[5],info->eui64[6], info->eui64[7]);
2185 dev->net->dev_addr[0] = info->eui64[0];
2186 dev->net->dev_addr[1] = info->eui64[1];
2187 dev->net->dev_addr[2] = info->eui64[2];
2188 dev->net->dev_addr[3] = info->eui64[5];
2189 dev->net->dev_addr[4] = info->eui64[6];
2190 dev->net->dev_addr[5] = info->eui64[7];
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002191
Marek Belisko369e8572010-10-15 14:12:59 +02002192 if (ntohs(pdspinitmsg->length) == (sizeof(struct dsp_init_msg) - 20)) {
Marek Beliskof7c1be02010-09-22 07:56:27 +02002193 memcpy(info->ProductMode, pdspinitmsg->ProductMode, MODESZ);
2194 memcpy(info->RfCalVer, pdspinitmsg->RfCalVer, CALVERSZ);
2195 memcpy(info->RfCalDate, pdspinitmsg->RfCalDate, CALDATESZ);
2196 DEBUG("RFCalVer = 0x%2x 0x%2x\n", info->RfCalVer[0], info->RfCalVer[1]);
2197 }
2198 break;
2199 }
2200 case DSP_PROVISION: {
2201 DEBUG("ft1000_proc_drvmsg:Command message type = DSP_PROVISION\n");
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002202
Marek Beliskof7c1be02010-09-22 07:56:27 +02002203 // kick off dspprov routine to start provisioning
2204 // Send provisioning data to DSP
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002205 if (list_empty(&info->prov_list) == 0)
Marek Beliskof7c1be02010-09-22 07:56:27 +02002206 {
2207 info->fProvComplete = 0;
2208 status = ft1000_dsp_prov(dev);
2209 if (status != STATUS_SUCCESS)
Arnd Bergmann2a953cf2010-09-30 10:24:10 +02002210 goto out;
Marek Beliskof7c1be02010-09-22 07:56:27 +02002211 }
2212 else {
2213 info->fProvComplete = 1;
2214 status = ft1000_write_register (dev, FT1000_DB_HB, FT1000_REG_DOORBELL);
2215 DEBUG("FT1000:drivermsg:No more DSP provisioning data in dsp image\n");
2216 }
2217 DEBUG("ft1000_proc_drvmsg:DSP PROVISION is done\n");
2218 break;
2219 }
2220 case DSP_STORE_INFO: {
2221 DEBUG("ft1000_proc_drvmsg:Command message type = DSP_STORE_INFO");
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002222
Marek Beliskof7c1be02010-09-22 07:56:27 +02002223 DEBUG("FT1000:drivermsg:Got DSP_STORE_INFO\n");
2224 tempword = ntohs(pdrvmsg->length);
2225 info->DSPInfoBlklen = tempword;
2226 if (tempword < (MAX_DSP_SESS_REC-4) ) {
2227 pmsg = (PUSHORT)&pdrvmsg->data[0];
2228 for (i=0; i<((tempword+1)/2); i++) {
2229 DEBUG("FT1000:drivermsg:dsp info data = 0x%x\n", *pmsg);
2230 info->DSPInfoBlk[i+10] = *pmsg++;
2231 }
2232 }
2233 else {
2234 info->DSPInfoBlklen = 0;
2235 }
2236 break;
2237 }
2238 case DSP_GET_INFO: {
2239 DEBUG("FT1000:drivermsg:Got DSP_GET_INFO\n");
2240 // copy dsp info block to dsp
2241 info->DrvMsgPend = 1;
2242 // allow any outstanding ioctl to finish
2243 mdelay(10);
2244 status = ft1000_read_register(dev, &tempword, FT1000_REG_DOORBELL);
2245 if (tempword & FT1000_DB_DPRAM_TX) {
2246 mdelay(10);
2247 status = ft1000_read_register(dev, &tempword, FT1000_REG_DOORBELL);
2248 if (tempword & FT1000_DB_DPRAM_TX) {
2249 mdelay(10);
2250 status = ft1000_read_register(dev, &tempword, FT1000_REG_DOORBELL);
2251 if (tempword & FT1000_DB_DPRAM_TX) {
2252 break;
2253 }
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002254 }
Marek Beliskof7c1be02010-09-22 07:56:27 +02002255 }
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002256
Marek Beliskof7c1be02010-09-22 07:56:27 +02002257 // Put message into Slow Queue
2258 // Form Pseudo header
2259 pmsg = (PUSHORT)info->DSPInfoBlk;
2260 *pmsg++ = 0;
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002261 *pmsg++ = htons(info->DSPInfoBlklen+20+info->DSPInfoBlklen);
Marek Beliskob13e39b2010-10-15 14:13:02 +02002262 ppseudo_hdr = (struct pseudo_hdr *)(PUSHORT)&info->DSPInfoBlk[2];
Marek Beliskof7c1be02010-09-22 07:56:27 +02002263 ppseudo_hdr->length = htons(info->DSPInfoBlklen+4+info->DSPInfoBlklen);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002264 ppseudo_hdr->source = 0x10;
Marek Beliskof7c1be02010-09-22 07:56:27 +02002265 ppseudo_hdr->destination = 0x20;
2266 ppseudo_hdr->portdest = 0;
2267 ppseudo_hdr->portsrc = 0;
2268 ppseudo_hdr->sh_str_id = 0;
2269 ppseudo_hdr->control = 0;
2270 ppseudo_hdr->rsvd1 = 0;
2271 ppseudo_hdr->rsvd2 = 0;
2272 ppseudo_hdr->qos_class = 0;
2273 // Insert slow queue sequence number
2274 ppseudo_hdr->seq_num = info->squeseqnum++;
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002275 // Insert application id
Marek Beliskof7c1be02010-09-22 07:56:27 +02002276 ppseudo_hdr->portsrc = 0;
2277 // Calculate new checksum
2278 ppseudo_hdr->checksum = *pmsg++;
2279 for (i=1; i<7; i++) {
2280 ppseudo_hdr->checksum ^= *pmsg++;
2281 }
2282 info->DSPInfoBlk[10] = 0x7200;
2283 info->DSPInfoBlk[11] = htons(info->DSPInfoBlklen);
2284 status = ft1000_write_dpram32 (dev, 0, (PUCHAR)&info->DSPInfoBlk[0], (unsigned short)(info->DSPInfoBlklen+22));
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002285 status = ft1000_write_register (dev, FT1000_DB_DPRAM_TX, FT1000_REG_DOORBELL);
Marek Beliskof7c1be02010-09-22 07:56:27 +02002286 info->DrvMsgPend = 0;
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002287
Marek Beliskof7c1be02010-09-22 07:56:27 +02002288 break;
2289 }
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002290
Marek Beliskof7c1be02010-09-22 07:56:27 +02002291 case GET_DRV_ERR_RPT_MSG: {
2292 DEBUG("FT1000:drivermsg:Got GET_DRV_ERR_RPT_MSG\n");
2293 // copy driver error message to dsp
2294 info->DrvMsgPend = 1;
2295 // allow any outstanding ioctl to finish
2296 mdelay(10);
2297 status = ft1000_read_register(dev, &tempword, FT1000_REG_DOORBELL);
2298 if (tempword & FT1000_DB_DPRAM_TX) {
2299 mdelay(10);
2300 status = ft1000_read_register(dev, &tempword, FT1000_REG_DOORBELL);
2301 if (tempword & FT1000_DB_DPRAM_TX) {
2302 mdelay(10);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002303 }
Marek Beliskof7c1be02010-09-22 07:56:27 +02002304 }
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002305
Marek Beliskof7c1be02010-09-22 07:56:27 +02002306 if ( (tempword & FT1000_DB_DPRAM_TX) == 0) {
2307 // Put message into Slow Queue
2308 // Form Pseudo header
2309 pmsg = (PUSHORT)&tempbuffer[0];
Marek Beliskob13e39b2010-10-15 14:13:02 +02002310 ppseudo_hdr = (struct pseudo_hdr *)pmsg;
Marek Beliskof7c1be02010-09-22 07:56:27 +02002311 ppseudo_hdr->length = htons(0x0012);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002312 ppseudo_hdr->source = 0x10;
Marek Beliskof7c1be02010-09-22 07:56:27 +02002313 ppseudo_hdr->destination = 0x20;
2314 ppseudo_hdr->portdest = 0;
2315 ppseudo_hdr->portsrc = 0;
2316 ppseudo_hdr->sh_str_id = 0;
2317 ppseudo_hdr->control = 0;
2318 ppseudo_hdr->rsvd1 = 0;
2319 ppseudo_hdr->rsvd2 = 0;
2320 ppseudo_hdr->qos_class = 0;
2321 // Insert slow queue sequence number
2322 ppseudo_hdr->seq_num = info->squeseqnum++;
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002323 // Insert application id
Marek Beliskof7c1be02010-09-22 07:56:27 +02002324 ppseudo_hdr->portsrc = 0;
2325 // Calculate new checksum
2326 ppseudo_hdr->checksum = *pmsg++;
2327 for (i=1; i<7; i++) {
2328 ppseudo_hdr->checksum ^= *pmsg++;
2329 }
2330 pmsg = (PUSHORT)&tempbuffer[16];
2331 *pmsg++ = htons(RSP_DRV_ERR_RPT_MSG);
2332 *pmsg++ = htons(0x000e);
2333 *pmsg++ = htons(info->DSP_TIME[0]);
2334 *pmsg++ = htons(info->DSP_TIME[1]);
2335 *pmsg++ = htons(info->DSP_TIME[2]);
2336 *pmsg++ = htons(info->DSP_TIME[3]);
2337 convert.byte[0] = info->DspVer[0];
2338 convert.byte[1] = info->DspVer[1];
2339 *pmsg++ = convert.wrd;
2340 convert.byte[0] = info->DspVer[2];
2341 convert.byte[1] = info->DspVer[3];
2342 *pmsg++ = convert.wrd;
2343 *pmsg++ = htons(info->DrvErrNum);
2344
2345 CardSendCommand (dev, (unsigned char*)&tempbuffer[0], (USHORT)(0x0012 + PSEUDOSZ));
2346 info->DrvErrNum = 0;
2347 }
2348 info->DrvMsgPend = 0;
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002349
2350 break;
Marek Beliskof7c1be02010-09-22 07:56:27 +02002351 }
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002352
Marek Beliskof7c1be02010-09-22 07:56:27 +02002353 default:
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002354 break;
Marek Beliskof7c1be02010-09-22 07:56:27 +02002355 }
2356
2357 }
2358
Arnd Bergmann2a953cf2010-09-30 10:24:10 +02002359 status = STATUS_SUCCESS;
2360out:
2361 kfree(cmdbuffer);
Marek Beliskof7c1be02010-09-22 07:56:27 +02002362 DEBUG("return from ft1000_proc_drvmsg\n");
Arnd Bergmann2a953cf2010-09-30 10:24:10 +02002363 return status;
Marek Beliskof7c1be02010-09-22 07:56:27 +02002364}
2365
2366
2367
2368int ft1000_poll(void* dev_id) {
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002369
Marek Beliskof7c1be02010-09-22 07:56:27 +02002370 //FT1000_INFO *info = (PFT1000_INFO)((struct net_device *)dev_id)->priv;
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002371 //struct ft1000_device *dev = (struct ft1000_device *)info->pFt1000Dev;
Marek Beliskof7c1be02010-09-22 07:56:27 +02002372 struct ft1000_device *dev = (struct ft1000_device *)dev_id;
2373 FT1000_INFO *info = (FT1000_INFO *) netdev_priv (dev->net);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002374
Marek Beliskof7c1be02010-09-22 07:56:27 +02002375 u16 tempword;
2376 u16 status;
2377 u16 size;
2378 int i;
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002379 USHORT data;
Marek Beliskof7c1be02010-09-22 07:56:27 +02002380 USHORT modulo;
2381 USHORT portid;
2382 u16 nxtph;
Marek Belisko29437ab2010-10-16 22:37:25 +02002383 struct dpram_blk *pdpram_blk;
Marek Beliskob13e39b2010-10-15 14:13:02 +02002384 struct pseudo_hdr *ppseudo_hdr;
Marek Beliskof7c1be02010-09-22 07:56:27 +02002385 unsigned long flags;
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002386
Marek Beliskof7c1be02010-09-22 07:56:27 +02002387 //DEBUG("Enter ft1000_poll...\n");
2388 if (ft1000_chkcard(dev) == FALSE) {
2389 DEBUG("ft1000_poll::ft1000_chkcard: failed\n");
2390 return STATUS_FAILURE;
2391 }
2392
2393 status = ft1000_read_register (dev, &tempword, FT1000_REG_DOORBELL);
2394 // DEBUG("ft1000_poll: read FT1000_REG_DOORBELL message 0x%x\n", tempword);
2395
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002396 //while ( (tempword) && (!status) ) {
2397 if ( !status )
2398 {
2399
Marek Beliskof7c1be02010-09-22 07:56:27 +02002400 if (tempword & FT1000_DB_DPRAM_RX) {
2401 //DEBUG("ft1000_poll: FT1000_REG_DOORBELL message type: FT1000_DB_DPRAM_RX\n");
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002402
Marek Beliskof7c1be02010-09-22 07:56:27 +02002403 status = ft1000_read_dpram16(dev, 0x200, (PUCHAR)&data, 0);
2404 //DEBUG("ft1000_poll:FT1000_DB_DPRAM_RX:ft1000_read_dpram16:size = 0x%x\n", data);
2405 size = ntohs(data) + 16 + 2; //wai
2406 if (size % 4) {
2407 modulo = 4 - (size % 4);
2408 size = size + modulo;
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002409 }
Marek Beliskof7c1be02010-09-22 07:56:27 +02002410 status = ft1000_read_dpram16(dev, 0x201, (PUCHAR)&portid, 1);
2411 portid &= 0xff;
2412 //DEBUG("ft1000_poll: FT1000_REG_DOORBELL message type: FT1000_DB_DPRAM_RX : portid 0x%x\n", portid);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002413
Marek Beliskof7c1be02010-09-22 07:56:27 +02002414 if (size < MAX_CMD_SQSIZE) {
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002415 switch (portid)
Marek Beliskof7c1be02010-09-22 07:56:27 +02002416 {
2417 case DRIVERID:
2418 DEBUG("ft1000_poll: FT1000_REG_DOORBELL message type: FT1000_DB_DPRAM_RX : portid DRIVERID\n");
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002419
Marek Beliskof7c1be02010-09-22 07:56:27 +02002420 status = ft1000_proc_drvmsg (dev, size);
2421 if (status != STATUS_SUCCESS )
2422 return status;
2423 break;
2424 case DSPBCMSGID:
2425 // This is a dsp broadcast message
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002426 // Check which application has registered for dsp broadcast messages
Marek Beliskof7c1be02010-09-22 07:56:27 +02002427 //DEBUG("ft1000_poll: FT1000_REG_DOORBELL message type: FT1000_DB_DPRAM_RX : portid DSPBCMSGID\n");
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002428
Marek Beliskof7c1be02010-09-22 07:56:27 +02002429 for (i=0; i<MAX_NUM_APP; i++) {
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002430 if ( (info->app_info[i].DspBCMsgFlag) && (info->app_info[i].fileobject) &&
2431 (info->app_info[i].NumOfMsg < MAX_MSG_LIMIT) )
Marek Beliskof7c1be02010-09-22 07:56:27 +02002432 {
2433 //DEBUG("Dsp broadcast message detected for app id %d\n", i);
2434 nxtph = FT1000_DPRAM_RX_BASE + 2;
2435 pdpram_blk = ft1000_get_buffer (&freercvpool);
2436 if (pdpram_blk != NULL) {
2437 if ( ft1000_receive_cmd(dev, pdpram_blk->pbuffer, MAX_CMD_SQSIZE, &nxtph) ) {
Marek Beliskob13e39b2010-10-15 14:13:02 +02002438 ppseudo_hdr = (struct pseudo_hdr *)pdpram_blk->pbuffer;
Marek Beliskof7c1be02010-09-22 07:56:27 +02002439 // Put message into the appropriate application block
2440 info->app_info[i].nRxMsg++;
2441 spin_lock_irqsave(&free_buff_lock, flags);
2442 list_add_tail(&pdpram_blk->list, &info->app_info[i].app_sqlist);
2443 info->app_info[i].NumOfMsg++;
2444 spin_unlock_irqrestore(&free_buff_lock, flags);
2445 wake_up_interruptible(&info->app_info[i].wait_dpram_msg);
2446 }
2447 else {
2448 info->app_info[i].nRxMsgMiss++;
2449 // Put memory back to free pool
2450 ft1000_free_buffer(pdpram_blk, &freercvpool);
2451 DEBUG("pdpram_blk::ft1000_get_buffer NULL\n");
2452 }
2453 }
2454 else {
2455 DEBUG("Out of memory in free receive command pool\n");
2456 info->app_info[i].nRxMsgMiss++;
2457 }//endof if (pdpram_blk != NULL)
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002458 }//endof if
Marek Beliskof7c1be02010-09-22 07:56:27 +02002459 //else
2460 // DEBUG("app_info mismatch\n");
2461 }// endof for
2462 break;
2463 default:
2464 pdpram_blk = ft1000_get_buffer (&freercvpool);
2465 //DEBUG("Memory allocated = 0x%8x\n", (u32)pdpram_blk);
2466 if (pdpram_blk != NULL) {
2467 if ( ft1000_receive_cmd(dev, pdpram_blk->pbuffer, MAX_CMD_SQSIZE, &nxtph) ) {
Marek Beliskob13e39b2010-10-15 14:13:02 +02002468 ppseudo_hdr = (struct pseudo_hdr *)pdpram_blk->pbuffer;
Marek Beliskof7c1be02010-09-22 07:56:27 +02002469 // Search for correct application block
2470 for (i=0; i<MAX_NUM_APP; i++) {
2471 if (info->app_info[i].app_id == ppseudo_hdr->portdest) {
2472 break;
2473 }
2474 }
2475
Dan Carpenterfcbf77b2010-10-15 05:42:00 +02002476 if (i == MAX_NUM_APP) {
Marek Beliskof7c1be02010-09-22 07:56:27 +02002477 DEBUG("FT1000:ft1000_parse_dpram_msg: No application matching id = %d\n", ppseudo_hdr->portdest);
2478 // Put memory back to free pool
2479 ft1000_free_buffer(pdpram_blk, &freercvpool);
2480 }
2481 else {
2482 if (info->app_info[i].NumOfMsg > MAX_MSG_LIMIT) {
2483 // Put memory back to free pool
2484 ft1000_free_buffer(pdpram_blk, &freercvpool);
2485 }
2486 else {
2487 info->app_info[i].nRxMsg++;
2488 // Put message into the appropriate application block
2489 //pxu spin_lock_irqsave(&free_buff_lock, flags);
2490 list_add_tail(&pdpram_blk->list, &info->app_info[i].app_sqlist);
2491 info->app_info[i].NumOfMsg++;
2492 //pxu spin_unlock_irqrestore(&free_buff_lock, flags);
2493 //pxu wake_up_interruptible(&info->app_info[i].wait_dpram_msg);
2494 }
2495 }
2496 }
2497 else {
2498 // Put memory back to free pool
2499 ft1000_free_buffer(pdpram_blk, &freercvpool);
2500 }
2501 }
2502 else {
2503 DEBUG("Out of memory in free receive command pool\n");
2504 }
2505 break;
2506 } //end of switch
2507 } //endof if (size < MAX_CMD_SQSIZE)
2508 else {
2509 DEBUG("FT1000:dpc:Invalid total length for SlowQ = %d\n", size);
2510 }
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002511 status = ft1000_write_register (dev, FT1000_DB_DPRAM_RX, FT1000_REG_DOORBELL);
Marek Beliskof7c1be02010-09-22 07:56:27 +02002512 }
2513 else if (tempword & FT1000_DSP_ASIC_RESET) {
2514 //DEBUG("ft1000_poll: FT1000_REG_DOORBELL message type: FT1000_DSP_ASIC_RESET\n");
2515
2516 // Let's reset the ASIC from the Host side as well
2517 status = ft1000_write_register (dev, ASIC_RESET_BIT, FT1000_REG_RESET);
2518 status = ft1000_read_register (dev, &tempword, FT1000_REG_RESET);
2519 i = 0;
2520 while (tempword & ASIC_RESET_BIT) {
2521 status = ft1000_read_register (dev, &tempword, FT1000_REG_RESET);
2522 msleep(10);
2523 i++;
2524 if (i==100)
2525 break;
2526 }
2527 if (i==100) {
2528 DEBUG("Unable to reset ASIC\n");
2529 return STATUS_SUCCESS;
2530 }
2531 msleep(10);
2532 // Program WMARK register
2533 status = ft1000_write_register (dev, 0x600, FT1000_REG_MAG_WATERMARK);
2534 // clear ASIC reset doorbell
2535 status = ft1000_write_register (dev, FT1000_DSP_ASIC_RESET, FT1000_REG_DOORBELL);
2536 msleep(10);
2537 }
2538 else if (tempword & FT1000_ASIC_RESET_REQ) {
2539 DEBUG("ft1000_poll: FT1000_REG_DOORBELL message type: FT1000_ASIC_RESET_REQ\n");
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002540
Marek Beliskof7c1be02010-09-22 07:56:27 +02002541 // clear ASIC reset request from DSP
2542 status = ft1000_write_register (dev, FT1000_ASIC_RESET_REQ, FT1000_REG_DOORBELL);
2543 status = ft1000_write_register (dev, HOST_INTF_BE, FT1000_REG_SUP_CTRL);
2544 // copy dsp session record from Adapter block
2545 status = ft1000_write_dpram32 (dev, 0, (PUCHAR)&info->DSPSess.Rec[0], 1024);
2546 // Program WMARK register
2547 status = ft1000_write_register (dev, 0x600, FT1000_REG_MAG_WATERMARK);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002548 // ring doorbell to tell DSP that ASIC is out of reset
Marek Beliskof7c1be02010-09-22 07:56:27 +02002549 status = ft1000_write_register (dev, FT1000_ASIC_RESET_DSP, FT1000_REG_DOORBELL);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002550 }
Marek Beliskof7c1be02010-09-22 07:56:27 +02002551 else if (tempword & FT1000_DB_COND_RESET) {
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002552 DEBUG("ft1000_poll: FT1000_REG_DOORBELL message type: FT1000_DB_COND_RESET\n");
Marek Beliskof7c1be02010-09-22 07:56:27 +02002553//By Jim
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002554// Reset ASIC and DSP
Marek Beliskof7c1be02010-09-22 07:56:27 +02002555//MAG
2556 if (info->fAppMsgPend == 0) {
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002557 // Reset ASIC and DSP
2558
Marek Beliskof7c1be02010-09-22 07:56:27 +02002559 status = ft1000_read_dpram16(dev, FT1000_MAG_DSP_TIMER0, (PUCHAR)&(info->DSP_TIME[0]), FT1000_MAG_DSP_TIMER0_INDX);
2560 status = ft1000_read_dpram16(dev, FT1000_MAG_DSP_TIMER1, (PUCHAR)&(info->DSP_TIME[1]), FT1000_MAG_DSP_TIMER1_INDX);
2561 status = ft1000_read_dpram16(dev, FT1000_MAG_DSP_TIMER2, (PUCHAR)&(info->DSP_TIME[2]), FT1000_MAG_DSP_TIMER2_INDX);
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002562 status = ft1000_read_dpram16(dev, FT1000_MAG_DSP_TIMER3, (PUCHAR)&(info->DSP_TIME[3]), FT1000_MAG_DSP_TIMER3_INDX);
2563 info->CardReady = 0;
Marek Beliskof7c1be02010-09-22 07:56:27 +02002564 info->DrvErrNum = DSP_CONDRESET_INFO;
2565 DEBUG("ft1000_hw:DSP conditional reset requested\n");
2566 info->ft1000_reset(dev->net);
2567 }
2568 else {
2569 info->fProvComplete = 0;
2570 info->fCondResetPend = 1;
2571 }
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002572
2573 ft1000_write_register(dev, FT1000_DB_COND_RESET, FT1000_REG_DOORBELL);
Marek Beliskof7c1be02010-09-22 07:56:27 +02002574 }
Greg Kroah-Hartmanbf3146c2010-09-22 08:34:49 -07002575
Marek Beliskof7c1be02010-09-22 07:56:27 +02002576 }//endof if ( !status )
2577
2578 //DEBUG("return from ft1000_poll.\n");
2579 return STATUS_SUCCESS;
2580
2581}
2582
2583/*end of Jim*/