linux/drivers/staging/ft1000/ft1000-usb/ft1000_hw.c
<<
>>
Prefs
   1//=====================================================
   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
  20#define HARLEY_READ_REGISTER     0x0
  21#define HARLEY_WRITE_REGISTER    0x01
  22#define HARLEY_READ_DPRAM_32     0x02
  23#define HARLEY_READ_DPRAM_LOW    0x03
  24#define HARLEY_READ_DPRAM_HIGH   0x04
  25#define HARLEY_WRITE_DPRAM_32    0x05
  26#define HARLEY_WRITE_DPRAM_LOW   0x06
  27#define HARLEY_WRITE_DPRAM_HIGH  0x07
  28
  29#define HARLEY_READ_OPERATION    0xc1
  30#define HARLEY_WRITE_OPERATION   0x41
  31
  32//#define JDEBUG
  33
  34static int ft1000_reset(struct net_device *ft1000dev);
  35static int ft1000_submit_rx_urb(struct ft1000_info *info);
  36static int ft1000_start_xmit(struct sk_buff *skb, struct net_device *dev);
  37static int ft1000_open (struct net_device *dev);
  38static struct net_device_stats *ft1000_netdev_stats(struct net_device *dev);
  39static int ft1000_chkcard (struct ft1000_device *dev);
  40
  41//Jim
  42
  43static u8 tempbuffer[1600];
  44
  45#define MAX_RCV_LOOP   100
  46
  47//---------------------------------------------------------------------------
  48// Function:    ft1000_control
  49//
  50// Parameters:  ft1000_device  - device structure
  51//              pipe - usb control message pipe
  52//              request - control request
  53//              requesttype - control message request type
  54//              value - value to be written or 0
  55//              index - register index
  56//              data - data buffer to hold the read/write values
  57//              size - data size
  58//              timeout - control message time out value
  59//
  60// Returns:     STATUS_SUCCESS - success
  61//              STATUS_FAILURE - failure
  62//
  63// Description: This function sends a control message via USB interface synchronously
  64//
  65// Notes:
  66//
  67//---------------------------------------------------------------------------
  68static int ft1000_control(struct ft1000_device *ft1000dev,unsigned int pipe,
  69                          u8 request,
  70                          u8 requesttype,
  71                          u16 value,
  72                          u16 index,
  73                          void *data,
  74                          u16 size,
  75                          int timeout)
  76{
  77        u16 ret;
  78
  79    if (ft1000dev == NULL )
  80    {
  81        DEBUG("NULL ft1000dev, failure\n");
  82        return -ENODEV;
  83    }
  84    else if ( ft1000dev->dev == NULL )
  85    {
  86        DEBUG("NULL ft1000dev->dev, failure\n");
  87        return -ENODEV;
  88    }
  89
  90    ret = usb_control_msg(ft1000dev->dev,
  91                          pipe,
  92                          request,
  93                          requesttype,
  94                          value,
  95                          index,
  96                          data,
  97                          size,
  98                          LARGE_TIMEOUT);
  99
 100        if (ret > 0)
 101                ret = 0;
 102
 103    return ret;
 104
 105
 106}
 107//---------------------------------------------------------------------------
 108// Function:    ft1000_read_register
 109//
 110// Parameters:  ft1000_device  - device structure
 111//              Data - data buffer to hold the value read
 112//              nRegIndex - register index
 113//
 114// Returns:     STATUS_SUCCESS - success
 115//              STATUS_FAILURE - failure
 116//
 117// Description: This function returns the value in a register
 118//
 119// Notes:
 120//
 121//---------------------------------------------------------------------------
 122
 123u16 ft1000_read_register(struct ft1000_device *ft1000dev, u16* Data, u16 nRegIndx)
 124{
 125    u16 ret = STATUS_SUCCESS;
 126
 127    //DEBUG("ft1000_read_register: reg index is %d\n", nRegIndx);
 128    //DEBUG("ft1000_read_register: spin_lock locked\n");
 129    ret = ft1000_control(ft1000dev,
 130                         usb_rcvctrlpipe(ft1000dev->dev,0),
 131                         HARLEY_READ_REGISTER,   //request --READ_REGISTER
 132                         HARLEY_READ_OPERATION,  //requestType
 133                         0,                      //value
 134                         nRegIndx,               //index
 135                         Data,                   //data
 136                         2,                      //data size
 137                         LARGE_TIMEOUT );        //timeout
 138
 139   //DEBUG("ft1000_read_register: ret is  %d \n", ret);
 140
 141   //DEBUG("ft1000_read_register: data is  %x \n", *Data);
 142
 143   return ret;
 144
 145}
 146
 147//---------------------------------------------------------------------------
 148// Function:    ft1000_write_register
 149//
 150// Parameters:  ft1000_device  - device structure
 151//              value - value to write into a register
 152//              nRegIndex - register index
 153//
 154// Returns:     STATUS_SUCCESS - success
 155//              STATUS_FAILURE - failure
 156//
 157// Description: This function writes the value in a register
 158//
 159// Notes:
 160//
 161//---------------------------------------------------------------------------
 162u16 ft1000_write_register(struct ft1000_device *ft1000dev, u16 value, u16 nRegIndx)
 163{
 164     u16 ret = STATUS_SUCCESS;
 165
 166     //DEBUG("ft1000_write_register: value is: %d, reg index is: %d\n", value, nRegIndx);
 167
 168     ret = ft1000_control(ft1000dev,
 169                           usb_sndctrlpipe(ft1000dev->dev, 0),
 170                           HARLEY_WRITE_REGISTER,       //request -- WRITE_REGISTER
 171                           HARLEY_WRITE_OPERATION,      //requestType
 172                           value,
 173                           nRegIndx,
 174                           NULL,
 175                           0,
 176                           LARGE_TIMEOUT );
 177
 178    return ret;
 179}
 180
 181//---------------------------------------------------------------------------
 182// Function:    ft1000_read_dpram32
 183//
 184// Parameters:  ft1000_device  - device structure
 185//              indx - starting address to read
 186//              buffer - data buffer to hold the data read
 187//              cnt - number of byte read from DPRAM
 188//
 189// Returns:     STATUS_SUCCESS - success
 190//              STATUS_FAILURE - failure
 191//
 192// Description: This function read a number of bytes from DPRAM
 193//
 194// Notes:
 195//
 196//---------------------------------------------------------------------------
 197
 198u16 ft1000_read_dpram32(struct ft1000_device *ft1000dev, u16 indx, u8 *buffer, u16 cnt)
 199{
 200    u16 ret = STATUS_SUCCESS;
 201
 202    //DEBUG("ft1000_read_dpram32: indx: %d  cnt: %d\n", indx, cnt);
 203    ret =ft1000_control(ft1000dev,
 204                         usb_rcvctrlpipe(ft1000dev->dev,0),
 205                         HARLEY_READ_DPRAM_32,                //request --READ_DPRAM_32
 206                         HARLEY_READ_OPERATION,               //requestType
 207                         0,                                   //value
 208                         indx,                                //index
 209                         buffer,                              //data
 210                         cnt,                                 //data size
 211                         LARGE_TIMEOUT );                     //timeout
 212
 213   //DEBUG("ft1000_read_dpram32: ret is  %d \n", ret);
 214
 215   //DEBUG("ft1000_read_dpram32: ret=%d \n", ret);
 216
 217   return ret;
 218
 219}
 220
 221//---------------------------------------------------------------------------
 222// Function:    ft1000_write_dpram32
 223//
 224// Parameters:  ft1000_device  - device structure
 225//              indx - starting address to write the data
 226//              buffer - data buffer to write into DPRAM
 227//              cnt - number of bytes to write
 228//
 229// Returns:     STATUS_SUCCESS - success
 230//              STATUS_FAILURE - failure
 231//
 232// Description: This function writes into DPRAM a number of bytes
 233//
 234// Notes:
 235//
 236//---------------------------------------------------------------------------
 237u16 ft1000_write_dpram32(struct ft1000_device *ft1000dev, u16 indx, u8 *buffer, u16 cnt)
 238{
 239     u16 ret = STATUS_SUCCESS;
 240
 241     //DEBUG("ft1000_write_dpram32: indx: %d   buffer: %x cnt: %d\n", indx, buffer, cnt);
 242     if ( cnt % 4)
 243         cnt += cnt - (cnt % 4);
 244
 245     ret = ft1000_control(ft1000dev,
 246                           usb_sndctrlpipe(ft1000dev->dev, 0),
 247                           HARLEY_WRITE_DPRAM_32,              //request -- WRITE_DPRAM_32
 248                           HARLEY_WRITE_OPERATION,             //requestType
 249                           0,                                  //value
 250                           indx,                               //index
 251                           buffer,                             //buffer
 252                           cnt,                                //buffer size
 253                           LARGE_TIMEOUT );
 254
 255    return ret;
 256}
 257
 258//---------------------------------------------------------------------------
 259// Function:    ft1000_read_dpram16
 260//
 261// Parameters:  ft1000_device  - device structure
 262//              indx - starting address to read
 263//              buffer - data buffer to hold the data read
 264//              hightlow - high or low 16 bit word
 265//
 266// Returns:     STATUS_SUCCESS - success
 267//              STATUS_FAILURE - failure
 268//
 269// Description: This function read 16 bits from DPRAM
 270//
 271// Notes:
 272//
 273//---------------------------------------------------------------------------
 274u16 ft1000_read_dpram16(struct ft1000_device *ft1000dev, u16 indx, u8 *buffer, u8 highlow)
 275{
 276    u16 ret = STATUS_SUCCESS;
 277
 278    //DEBUG("ft1000_read_dpram16: indx: %d  hightlow: %d\n", indx, highlow);
 279
 280    u8 request;
 281
 282    if (highlow == 0 )
 283        request = HARLEY_READ_DPRAM_LOW;
 284    else
 285        request = HARLEY_READ_DPRAM_HIGH;
 286
 287    ret = ft1000_control(ft1000dev,
 288                         usb_rcvctrlpipe(ft1000dev->dev,0),
 289                         request,                     //request --READ_DPRAM_H/L
 290                         HARLEY_READ_OPERATION,       //requestType
 291                         0,                           //value
 292                         indx,                        //index
 293                         buffer,                      //data
 294                         2,                           //data size
 295                         LARGE_TIMEOUT );             //timeout
 296
 297   //DEBUG("ft1000_read_dpram16: ret is  %d \n", ret);
 298
 299
 300   //DEBUG("ft1000_read_dpram16: data is  %x \n", *buffer);
 301
 302   return ret;
 303
 304}
 305
 306//---------------------------------------------------------------------------
 307// Function:    ft1000_write_dpram16
 308//
 309// Parameters:  ft1000_device  - device structure
 310//              indx - starting address to write the data
 311//              value - 16bits value to write
 312//              hightlow - high or low 16 bit word
 313//
 314// Returns:     STATUS_SUCCESS - success
 315//              STATUS_FAILURE - failure
 316//
 317// Description: This function writes into DPRAM a number of bytes
 318//
 319// Notes:
 320//
 321//---------------------------------------------------------------------------
 322u16 ft1000_write_dpram16(struct ft1000_device *ft1000dev, u16 indx, u16 value, u8 highlow)
 323{
 324     u16 ret = STATUS_SUCCESS;
 325
 326
 327
 328     //DEBUG("ft1000_write_dpram16: indx: %d  value: %d  highlow: %d\n", indx, value, highlow);
 329
 330     u8 request;
 331
 332
 333     if ( highlow == 0 )
 334         request = HARLEY_WRITE_DPRAM_LOW;
 335     else
 336         request = HARLEY_WRITE_DPRAM_HIGH;
 337
 338     ret = ft1000_control(ft1000dev,
 339                           usb_sndctrlpipe(ft1000dev->dev, 0),
 340                           request,                             //request -- WRITE_DPRAM_H/L
 341                           HARLEY_WRITE_OPERATION,              //requestType
 342                           value,                                   //value
 343                           indx,                                //index
 344                           NULL,                               //buffer
 345                           0,                                   //buffer size
 346                           LARGE_TIMEOUT );
 347
 348    return ret;
 349}
 350
 351//---------------------------------------------------------------------------
 352// Function:    fix_ft1000_read_dpram32
 353//
 354// Parameters:  ft1000_device  - device structure
 355//              indx - starting address to read
 356//              buffer - data buffer to hold the data read
 357//
 358//
 359// Returns:     STATUS_SUCCESS - success
 360//              STATUS_FAILURE - failure
 361//
 362// Description: This function read DPRAM 4 words at a time
 363//
 364// Notes:
 365//
 366//---------------------------------------------------------------------------
 367u16 fix_ft1000_read_dpram32(struct ft1000_device *ft1000dev, u16 indx, u8 *buffer)
 368{
 369    u8 buf[16];
 370    u16 pos;
 371    u16 ret = STATUS_SUCCESS;
 372
 373    //DEBUG("fix_ft1000_read_dpram32: indx: %d  \n", indx);
 374    pos = (indx / 4)*4;
 375    ret = ft1000_read_dpram32(ft1000dev, pos, buf, 16);
 376    if (ret == STATUS_SUCCESS)
 377    {
 378        pos = (indx % 4)*4;
 379        *buffer++ = buf[pos++];
 380        *buffer++ = buf[pos++];
 381        *buffer++ = buf[pos++];
 382        *buffer++ = buf[pos++];
 383    }
 384    else
 385    {
 386        DEBUG("fix_ft1000_read_dpram32: DPRAM32 Read failed\n");
 387        *buffer++ = 0;
 388        *buffer++ = 0;
 389        *buffer++ = 0;
 390        *buffer++ = 0;
 391
 392    }
 393
 394   //DEBUG("fix_ft1000_read_dpram32: data is  %x \n", *buffer);
 395   return ret;
 396
 397}
 398
 399
 400//---------------------------------------------------------------------------
 401// Function:    fix_ft1000_write_dpram32
 402//
 403// Parameters:  ft1000_device  - device structure
 404//              indx - starting address to write
 405//              buffer - data buffer to write
 406//
 407//
 408// Returns:     STATUS_SUCCESS - success
 409//              STATUS_FAILURE - failure
 410//
 411// Description: This function write to DPRAM 4 words at a time
 412//
 413// Notes:
 414//
 415//---------------------------------------------------------------------------
 416u16 fix_ft1000_write_dpram32(struct ft1000_device *ft1000dev, u16 indx, u8 *buffer)
 417{
 418    u16 pos1;
 419    u16 pos2;
 420    u16 i;
 421    u8 buf[32];
 422    u8 resultbuffer[32];
 423    u8 *pdata;
 424    u16 ret  = STATUS_SUCCESS;
 425
 426    //DEBUG("fix_ft1000_write_dpram32: Entered:\n");
 427
 428    pos1 = (indx / 4)*4;
 429    pdata = buffer;
 430    ret = ft1000_read_dpram32(ft1000dev, pos1, buf, 16);
 431    if (ret == STATUS_SUCCESS)
 432    {
 433        pos2 = (indx % 4)*4;
 434        buf[pos2++] = *buffer++;
 435        buf[pos2++] = *buffer++;
 436        buf[pos2++] = *buffer++;
 437        buf[pos2++] = *buffer++;
 438        ret = ft1000_write_dpram32(ft1000dev, pos1, buf, 16);
 439    }
 440    else
 441    {
 442        DEBUG("fix_ft1000_write_dpram32: DPRAM32 Read failed\n");
 443
 444        return ret;
 445    }
 446
 447    ret = ft1000_read_dpram32(ft1000dev, pos1, (u8 *)&resultbuffer[0], 16);
 448    if (ret == STATUS_SUCCESS)
 449    {
 450        buffer = pdata;
 451        for (i=0; i<16; i++)
 452        {
 453            if (buf[i] != resultbuffer[i]){
 454
 455                ret = STATUS_FAILURE;
 456            }
 457        }
 458    }
 459
 460    if (ret == STATUS_FAILURE)
 461    {
 462        ret = ft1000_write_dpram32(ft1000dev, pos1, (u8 *)&tempbuffer[0], 16);
 463        ret = ft1000_read_dpram32(ft1000dev, pos1, (u8 *)&resultbuffer[0], 16);
 464        if (ret == STATUS_SUCCESS)
 465        {
 466            buffer = pdata;
 467            for (i=0; i<16; i++)
 468            {
 469                if (tempbuffer[i] != resultbuffer[i])
 470                {
 471                    ret = STATUS_FAILURE;
 472                    DEBUG("fix_ft1000_write_dpram32 Failed to write\n");
 473                }
 474            }
 475         }
 476    }
 477
 478    return ret;
 479
 480}
 481
 482
 483//------------------------------------------------------------------------
 484//
 485//  Function:   card_reset_dsp
 486//
 487//  Synopsis:   This function is called to reset or activate the DSP
 488//
 489//  Arguments:  value                  - reset or activate
 490//
 491//  Returns:    None
 492//-----------------------------------------------------------------------
 493static void card_reset_dsp (struct ft1000_device *ft1000dev, bool value)
 494{
 495    u16 status = STATUS_SUCCESS;
 496    u16 tempword;
 497
 498    status = ft1000_write_register (ft1000dev, HOST_INTF_BE, FT1000_REG_SUP_CTRL);
 499    status = ft1000_read_register(ft1000dev, &tempword, FT1000_REG_SUP_CTRL);
 500    if (value)
 501    {
 502        DEBUG("Reset DSP\n");
 503        status = ft1000_read_register(ft1000dev, &tempword, FT1000_REG_RESET);
 504        tempword |= DSP_RESET_BIT;
 505        status = ft1000_write_register(ft1000dev, tempword, FT1000_REG_RESET);
 506    }
 507    else
 508    {
 509        DEBUG("Activate DSP\n");
 510        status = ft1000_read_register(ft1000dev, &tempword, FT1000_REG_RESET);
 511        tempword |= DSP_ENCRYPTED;
 512        tempword &= ~DSP_UNENCRYPTED;
 513        status = ft1000_write_register(ft1000dev, tempword, FT1000_REG_RESET);
 514        status = ft1000_read_register(ft1000dev, &tempword, FT1000_REG_RESET);
 515        tempword &= ~EFUSE_MEM_DISABLE;
 516        tempword &= ~DSP_RESET_BIT;
 517        status = ft1000_write_register(ft1000dev, tempword, FT1000_REG_RESET);
 518        status = ft1000_read_register(ft1000dev, &tempword, FT1000_REG_RESET);
 519    }
 520}
 521
 522//---------------------------------------------------------------------------
 523// Function:    CardSendCommand
 524//
 525// Parameters:  ft1000_device  - device structure
 526//              ptempbuffer - command buffer
 527//              size - command buffer size
 528//
 529// Returns:     STATUS_SUCCESS - success
 530//              STATUS_FAILURE - failure
 531//
 532// Description: This function sends a command to ASIC
 533//
 534// Notes:
 535//
 536//---------------------------------------------------------------------------
 537void CardSendCommand(struct ft1000_device *ft1000dev, void *ptempbuffer, int size)
 538{
 539    unsigned short temp;
 540    unsigned char *commandbuf;
 541
 542    DEBUG("CardSendCommand: enter CardSendCommand... size=%d\n", size);
 543
 544    commandbuf =(unsigned char*) kmalloc(size+2, GFP_KERNEL);
 545    memcpy((void*)commandbuf+2, (void*)ptempbuffer, size);
 546
 547    //DEBUG("CardSendCommand: Command Send\n");
 548
 549    ft1000_read_register(ft1000dev, &temp, FT1000_REG_DOORBELL);
 550
 551    if (temp & 0x0100)
 552    {
 553       msleep(10);
 554    }
 555
 556    // check for odd word
 557    size = size + 2;
 558    if (size % 4)
 559    {
 560       // Must force to be 32 bit aligned
 561       size += 4 - (size % 4);
 562    }
 563
 564
 565    //DEBUG("CardSendCommand: write dpram ... size=%d\n", size);
 566    ft1000_write_dpram32(ft1000dev, 0,commandbuf, size);
 567    msleep(1);
 568    //DEBUG("CardSendCommand: write into doorbell ...\n");
 569    ft1000_write_register(ft1000dev,  FT1000_DB_DPRAM_TX ,FT1000_REG_DOORBELL) ;
 570    msleep(1);
 571
 572    ft1000_read_register(ft1000dev, &temp, FT1000_REG_DOORBELL);
 573    //DEBUG("CardSendCommand: read doorbell ...temp=%x\n", temp);
 574    if ( (temp & 0x0100) == 0)
 575    {
 576       //DEBUG("CardSendCommand: Message sent\n");
 577    }
 578
 579}
 580
 581
 582//--------------------------------------------------------------------------
 583//
 584//  Function:   dsp_reload
 585//
 586//  Synopsis:   This function is called to load or reload the DSP
 587//
 588//  Arguments:  ft1000dev - device structure
 589//
 590//  Returns:    None
 591//-----------------------------------------------------------------------
 592int dsp_reload(struct ft1000_device *ft1000dev)
 593{
 594    u16 status;
 595    u16 tempword;
 596    u32 templong;
 597
 598        struct ft1000_info *pft1000info;
 599
 600    pft1000info = netdev_priv(ft1000dev->net);
 601
 602    pft1000info->CardReady = 0;
 603
 604    // Program Interrupt Mask register
 605    status = ft1000_write_register (ft1000dev, 0xffff, FT1000_REG_SUP_IMASK);
 606
 607    status = ft1000_read_register (ft1000dev, &tempword, FT1000_REG_RESET);
 608    tempword |= ASIC_RESET_BIT;
 609    status = ft1000_write_register (ft1000dev, tempword, FT1000_REG_RESET);
 610    msleep(1000);
 611    status = ft1000_read_register (ft1000dev, &tempword, FT1000_REG_RESET);
 612    DEBUG("Reset Register = 0x%x\n", tempword);
 613
 614    // Toggle DSP reset
 615    card_reset_dsp (ft1000dev, 1);
 616    msleep(1000);
 617    card_reset_dsp (ft1000dev, 0);
 618    msleep(1000);
 619
 620    status = ft1000_write_register (ft1000dev, HOST_INTF_BE, FT1000_REG_SUP_CTRL);
 621
 622    // Let's check for FEFE
 623    status = ft1000_read_dpram32 (ft1000dev, FT1000_MAG_DPRAM_FEFE_INDX, (u8 *)&templong, 4);
 624    DEBUG("templong (fefe) = 0x%8x\n", templong);
 625
 626    // call codeloader
 627    status = scram_dnldr(ft1000dev, pFileStart, FileLength);
 628
 629        if (status != STATUS_SUCCESS)
 630                return -EIO;
 631
 632    msleep(1000);
 633
 634    DEBUG("dsp_reload returned\n");
 635        return 0;
 636
 637}
 638
 639//---------------------------------------------------------------------------
 640//
 641// Function:   ft1000_reset_asic
 642// Descripton: This function will call the Card Service function to reset the
 643//             ASIC.
 644// Input:
 645//     dev    - device structure
 646// Output:
 647//     none
 648//
 649//---------------------------------------------------------------------------
 650static void ft1000_reset_asic (struct net_device *dev)
 651{
 652        struct ft1000_info *info = netdev_priv(dev);
 653    struct ft1000_device *ft1000dev = info->pFt1000Dev;
 654    u16 tempword;
 655
 656    DEBUG("ft1000_hw:ft1000_reset_asic called\n");
 657
 658    info->ASICResetNum++;
 659
 660    // Let's use the register provided by the Magnemite ASIC to reset the
 661    // ASIC and DSP.
 662    ft1000_write_register(ft1000dev,  (DSP_RESET_BIT | ASIC_RESET_BIT), FT1000_REG_RESET );
 663
 664    mdelay(1);
 665
 666    // set watermark to -1 in order to not generate an interrrupt
 667    ft1000_write_register(ft1000dev, 0xffff, FT1000_REG_MAG_WATERMARK);
 668
 669    // clear interrupts
 670    ft1000_read_register (ft1000dev, &tempword, FT1000_REG_SUP_ISR);
 671    DEBUG("ft1000_hw: interrupt status register = 0x%x\n",tempword);
 672    ft1000_write_register (ft1000dev,  tempword, FT1000_REG_SUP_ISR);
 673    ft1000_read_register (ft1000dev, &tempword, FT1000_REG_SUP_ISR);
 674    DEBUG("ft1000_hw: interrupt status register = 0x%x\n",tempword);
 675
 676}
 677
 678
 679//---------------------------------------------------------------------------
 680//
 681// Function:   ft1000_reset_card
 682// Descripton: This function will reset the card
 683// Input:
 684//     dev    - device structure
 685// Output:
 686//     status - FALSE (card reset fail)
 687//              TRUE  (card reset successful)
 688//
 689//---------------------------------------------------------------------------
 690static int ft1000_reset_card (struct net_device *dev)
 691{
 692        struct ft1000_info *info = netdev_priv(dev);
 693    struct ft1000_device *ft1000dev = info->pFt1000Dev;
 694    u16 tempword;
 695        struct prov_record *ptr;
 696
 697    DEBUG("ft1000_hw:ft1000_reset_card called.....\n");
 698
 699    info->fCondResetPend = 1;
 700    info->CardReady = 0;
 701    info->fProvComplete = 0;
 702
 703    // Make sure we free any memory reserve for provisioning
 704    while (list_empty(&info->prov_list) == 0) {
 705        DEBUG("ft1000_hw:ft1000_reset_card:deleting provisioning record\n");
 706        ptr = list_entry(info->prov_list.next, struct prov_record, list);
 707        list_del(&ptr->list);
 708        kfree(ptr->pprov_data);
 709        kfree(ptr);
 710    }
 711
 712    DEBUG("ft1000_hw:ft1000_reset_card: reset asic\n");
 713    //reset ASIC
 714    ft1000_reset_asic(dev);
 715
 716    info->DSPResetNum++;
 717
 718    DEBUG("ft1000_hw:ft1000_reset_card: call dsp_reload\n");
 719    dsp_reload(ft1000dev);
 720
 721    DEBUG("dsp reload successful\n");
 722
 723
 724    mdelay(10);
 725
 726    // Initialize DSP heartbeat area to ho
 727    ft1000_write_dpram16(ft1000dev, FT1000_MAG_HI_HO, ho_mag, FT1000_MAG_HI_HO_INDX);
 728    ft1000_read_dpram16(ft1000dev, FT1000_MAG_HI_HO, (u8 *)&tempword, FT1000_MAG_HI_HO_INDX);
 729    DEBUG("ft1000_hw:ft1000_reset_card:hi_ho value = 0x%x\n", tempword);
 730
 731
 732
 733    info->CardReady = 1;
 734
 735    info->fCondResetPend = 0;
 736    return TRUE;
 737
 738}
 739
 740
 741//mbelian
 742#ifdef HAVE_NET_DEVICE_OPS
 743static const struct net_device_ops ftnet_ops =
 744{
 745.ndo_open = &ft1000_open,
 746.ndo_stop = &ft1000_close,
 747.ndo_start_xmit = &ft1000_start_xmit,
 748.ndo_get_stats = &ft1000_netdev_stats,
 749};
 750#endif
 751
 752
 753//---------------------------------------------------------------------------
 754// Function:    init_ft1000_netdev
 755//
 756// Parameters:  ft1000dev  - device structure
 757//
 758//
 759// Returns:     STATUS_SUCCESS - success
 760//              STATUS_FAILURE - failure
 761//
 762// Description: This function initialize the network device
 763//
 764// Notes:
 765//
 766//---------------------------------------------------------------------------
 767u16 init_ft1000_netdev(struct ft1000_device *ft1000dev)
 768{
 769    struct net_device *netdev;
 770        struct ft1000_info *pInfo = NULL;
 771        struct dpram_blk *pdpram_blk;
 772        int i, ret_val;
 773        struct list_head *cur, *tmp;
 774        char card_nr[2];
 775        unsigned long gCardIndex = 0;
 776
 777    DEBUG("Enter init_ft1000_netdev...\n");
 778
 779
 780        netdev = alloc_etherdev(sizeof(struct ft1000_info));
 781    if (!netdev )
 782    {
 783        DEBUG("init_ft1000_netdev: can not allocate network device\n");
 784        return -ENOMEM;
 785    }
 786
 787        pInfo = netdev_priv(netdev);
 788
 789    //DEBUG("init_ft1000_netdev: gFt1000Info=%x, netdev=%x, ft1000dev=%x\n", gFt1000Info, netdev, ft1000dev);
 790
 791        memset(pInfo, 0, sizeof(struct ft1000_info));
 792
 793    dev_alloc_name(netdev, netdev->name);
 794
 795        DEBUG("init_ft1000_netdev: network device name is %s\n", netdev->name);
 796
 797        if ( strncmp(netdev->name,"eth", 3) == 0) {
 798                card_nr[0] = netdev->name[3];
 799                card_nr[1] = '\0';
 800                ret_val = strict_strtoul(card_nr, 10, &gCardIndex);
 801                if (ret_val) {
 802                        printk(KERN_ERR "Can't parse netdev\n");
 803                        goto err_net;
 804                }
 805
 806            pInfo->CardNumber = gCardIndex;
 807            DEBUG("card number = %d\n", pInfo->CardNumber);
 808        }
 809        else {
 810            printk(KERN_ERR "ft1000: Invalid device name\n");
 811                ret_val = -ENXIO;
 812                goto err_net;
 813        }
 814
 815    memset(&pInfo->stats, 0, sizeof(struct net_device_stats) );
 816
 817   spin_lock_init(&pInfo->dpram_lock);
 818    pInfo->pFt1000Dev = ft1000dev;
 819    pInfo->DrvErrNum = 0;
 820    pInfo->ASICResetNum = 0;
 821    pInfo->registered = 1;
 822    pInfo->ft1000_reset = ft1000_reset;
 823    pInfo->mediastate = 0;
 824    pInfo->fifo_cnt = 0;
 825    pInfo->DeviceCreated = FALSE;
 826    pInfo->CurrentInterruptEnableMask = ISR_DEFAULT_MASK;
 827    pInfo->InterruptsEnabled = FALSE;
 828    pInfo->CardReady = 0;
 829    pInfo->DSP_TIME[0] = 0;
 830    pInfo->DSP_TIME[1] = 0;
 831    pInfo->DSP_TIME[2] = 0;
 832    pInfo->DSP_TIME[3] = 0;
 833    pInfo->fAppMsgPend = 0;
 834    pInfo->fCondResetPend = 0;
 835        pInfo->usbboot = 0;
 836        pInfo->dspalive = 0;
 837        memset(&pInfo->tempbuf[0], 0, sizeof(pInfo->tempbuf));
 838
 839    INIT_LIST_HEAD(&pInfo->prov_list);
 840
 841        INIT_LIST_HEAD(&pInfo->nodes.list);
 842//mbelian
 843#ifdef HAVE_NET_DEVICE_OPS
 844        netdev->netdev_ops = &ftnet_ops;
 845#else
 846    netdev->hard_start_xmit = &ft1000_start_xmit;
 847    netdev->get_stats = &ft1000_netdev_stats;
 848    netdev->open = &ft1000_open;
 849    netdev->stop = &ft1000_close;
 850#endif
 851
 852    ft1000dev->net = netdev;
 853
 854
 855
 856//init free_buff_lock, freercvpool, numofmsgbuf, pdpram_blk
 857//only init once per card
 858//Jim
 859          DEBUG("Initialize free_buff_lock and freercvpool\n");
 860        spin_lock_init(&free_buff_lock);
 861
 862        // initialize a list of buffers to be use for queuing up receive command data
 863        INIT_LIST_HEAD (&freercvpool);
 864
 865        // create list of free buffers
 866        for (i=0; i<NUM_OF_FREE_BUFFERS; i++) {
 867            // Get memory for DPRAM_DATA link list
 868                pdpram_blk = kmalloc(sizeof(struct dpram_blk), GFP_KERNEL);
 869                if (pdpram_blk == NULL) {
 870                        ret_val = -ENOMEM;
 871                        goto err_free;
 872                }
 873            // Get a block of memory to store command data
 874            pdpram_blk->pbuffer = kmalloc ( MAX_CMD_SQSIZE, GFP_KERNEL );
 875                if (pdpram_blk->pbuffer == NULL) {
 876                        ret_val = -ENOMEM;
 877                        kfree(pdpram_blk);
 878                        goto err_free;
 879                }
 880            // link provisioning data
 881            list_add_tail (&pdpram_blk->list, &freercvpool);
 882        }
 883        numofmsgbuf = NUM_OF_FREE_BUFFERS;
 884
 885
 886        return 0;
 887
 888
 889err_free:
 890        list_for_each_safe(cur, tmp, &freercvpool) {
 891                pdpram_blk = list_entry(cur, struct dpram_blk, list);
 892                list_del(&pdpram_blk->list);
 893                kfree(pdpram_blk->pbuffer);
 894                kfree(pdpram_blk);
 895        }
 896err_net:
 897        free_netdev(netdev);
 898        return ret_val;
 899}
 900
 901
 902
 903//---------------------------------------------------------------------------
 904// Function:    reg_ft1000_netdev
 905//
 906// Parameters:  ft1000dev  - device structure
 907//
 908//
 909// Returns:     STATUS_SUCCESS - success
 910//              STATUS_FAILURE - failure
 911//
 912// Description: This function register the network driver
 913//
 914// Notes:
 915//
 916//---------------------------------------------------------------------------
 917int reg_ft1000_netdev(struct ft1000_device *ft1000dev, struct usb_interface *intf)
 918{
 919    struct net_device *netdev;
 920        struct ft1000_info *pInfo;
 921        int rc;
 922
 923    netdev = ft1000dev->net;
 924    pInfo = netdev_priv(ft1000dev->net);
 925    DEBUG("Enter reg_ft1000_netdev...\n");
 926
 927
 928    ft1000_read_register(ft1000dev, &pInfo->AsicID, FT1000_REG_ASIC_ID);
 929
 930    usb_set_intfdata(intf, pInfo);
 931    SET_NETDEV_DEV(netdev, &intf->dev);
 932
 933    rc = register_netdev(netdev);
 934    if (rc)
 935    {
 936        DEBUG("reg_ft1000_netdev: could not register network device\n");
 937        free_netdev(netdev);
 938        return rc;
 939    }
 940
 941
 942    //Create character device, implemented by Jim
 943    ft1000_create_dev(ft1000dev);
 944
 945    DEBUG ("reg_ft1000_netdev returned\n");
 946
 947    pInfo->CardReady = 1;
 948
 949
 950        return 0;
 951}
 952
 953static int ft1000_reset(struct net_device *dev)
 954{
 955    ft1000_reset_card(dev);
 956    return 0;
 957}
 958
 959//---------------------------------------------------------------------------
 960// Function:    ft1000_usb_transmit_complete
 961//
 962// Parameters:  urb  - transmitted usb urb
 963//
 964//
 965// Returns:     none
 966//
 967// Description: This is the callback function when a urb is transmitted
 968//
 969// Notes:
 970//
 971//---------------------------------------------------------------------------
 972static void ft1000_usb_transmit_complete(struct urb *urb)
 973{
 974
 975    struct ft1000_device *ft1000dev = urb->context;
 976
 977    //DEBUG("ft1000_usb_transmit_complete entered\n");
 978
 979    if (urb->status)
 980        printk("%s: TX status %d\n", ft1000dev->net->name, urb->status);
 981
 982    netif_wake_queue(ft1000dev->net);
 983
 984    //DEBUG("Return from ft1000_usb_transmit_complete\n");
 985}
 986
 987//---------------------------------------------------------------------------
 988//
 989// Function:   ft1000_copy_down_pkt
 990// Descripton: This function will take an ethernet packet and convert it to
 991//             a Flarion packet prior to sending it to the ASIC Downlink
 992//             FIFO.
 993// Input:
 994//     dev    - device structure
 995//     packet - address of ethernet packet
 996//     len    - length of IP packet
 997// Output:
 998//     status - FAILURE
 999//              SUCCESS
1000//
1001//---------------------------------------------------------------------------
1002static int ft1000_copy_down_pkt (struct net_device *netdev, u8 *packet, u16 len)
1003{
1004        struct ft1000_info *pInfo = netdev_priv(netdev);
1005    struct ft1000_device *pFt1000Dev = pInfo->pFt1000Dev;
1006
1007
1008        int count, ret;
1009    u8 *t;
1010        struct pseudo_hdr hdr;
1011
1012    if (!pInfo->CardReady)
1013    {
1014
1015        DEBUG("ft1000_copy_down_pkt::Card Not Ready\n");
1016        return -ENODEV;
1017
1018    }
1019
1020
1021    //DEBUG("ft1000_copy_down_pkt() entered, len = %d\n", len);
1022
1023        count = sizeof(struct pseudo_hdr) + len;
1024    if(count > MAX_BUF_SIZE)
1025    {
1026        DEBUG("Error:ft1000_copy_down_pkt:Message Size Overflow!\n");
1027        DEBUG("size = %d\n", count);
1028        return -EINVAL;
1029    }
1030
1031    if ( count % 4)
1032        count = count + (4- (count %4) );
1033
1034        memset(&hdr, 0, sizeof(struct pseudo_hdr));
1035
1036        hdr.length = ntohs(count);
1037        hdr.source = 0x10;
1038        hdr.destination = 0x20;
1039        hdr.portdest = 0x20;
1040        hdr.portsrc = 0x10;
1041        hdr.sh_str_id = 0x91;
1042        hdr.control = 0x00;
1043
1044        hdr.checksum = hdr.length ^ hdr.source ^ hdr.destination ^
1045                        hdr.portdest ^ hdr.portsrc ^ hdr.sh_str_id ^
1046                        hdr.control;
1047
1048        memcpy(&pFt1000Dev->tx_buf[0], &hdr, sizeof(hdr));
1049        memcpy(&(pFt1000Dev->tx_buf[sizeof(struct pseudo_hdr)]), packet, len);
1050
1051    netif_stop_queue(netdev);
1052
1053    //DEBUG ("ft1000_copy_down_pkt: count = %d\n", count);
1054
1055    usb_fill_bulk_urb(pFt1000Dev->tx_urb,
1056                      pFt1000Dev->dev,
1057                      usb_sndbulkpipe(pFt1000Dev->dev, pFt1000Dev->bulk_out_endpointAddr),
1058                      pFt1000Dev->tx_buf,
1059                      count,
1060                      ft1000_usb_transmit_complete,
1061                      (void*)pFt1000Dev);
1062
1063    t = (u8 *)pFt1000Dev->tx_urb->transfer_buffer;
1064    //DEBUG("transfer_length=%d\n", pFt1000Dev->tx_urb->transfer_buffer_length);
1065    /*for (i=0; i<count; i++ )
1066    {
1067       DEBUG("%x    ", *t++ );
1068    }*/
1069
1070
1071        ret = usb_submit_urb(pFt1000Dev->tx_urb, GFP_ATOMIC);
1072        if (ret) {
1073                DEBUG("ft1000 failed tx_urb %d\n", ret);
1074                return ret;
1075        } else {
1076                pInfo->stats.tx_packets++;
1077                pInfo->stats.tx_bytes += (len+14);
1078        }
1079
1080    //DEBUG("ft1000_copy_down_pkt() exit\n");
1081
1082        return 0;
1083}
1084
1085//---------------------------------------------------------------------------
1086// Function:    ft1000_start_xmit
1087//
1088// Parameters:  skb - socket buffer to be sent
1089//              dev - network device
1090//
1091//
1092// Returns:     none
1093//
1094// Description: transmit a ethernet packet
1095//
1096// Notes:
1097//
1098//---------------------------------------------------------------------------
1099static int ft1000_start_xmit(struct sk_buff *skb, struct net_device *dev)
1100{
1101        struct ft1000_info *pInfo = netdev_priv(dev);
1102    struct ft1000_device *pFt1000Dev= pInfo->pFt1000Dev;
1103    u8 *pdata;
1104    int maxlen, pipe;
1105
1106
1107    //DEBUG(" ft1000_start_xmit() entered\n");
1108
1109    if ( skb == NULL )
1110    {
1111        DEBUG ("ft1000_hw: ft1000_start_xmit:skb == NULL!!!\n" );
1112        return NETDEV_TX_OK;
1113    }
1114
1115    if ( pFt1000Dev->status & FT1000_STATUS_CLOSING)
1116    {
1117        DEBUG("network driver is closed, return\n");
1118        goto err;
1119    }
1120
1121    //DEBUG("ft1000_start_xmit 1:length of packet = %d\n", skb->len);
1122    pipe = usb_sndbulkpipe(pFt1000Dev->dev, pFt1000Dev->bulk_out_endpointAddr);
1123    maxlen = usb_maxpacket(pFt1000Dev->dev, pipe, usb_pipeout(pipe));
1124    //DEBUG("ft1000_start_xmit 2: pipe=%d dev->maxpacket  = %d\n", pipe, maxlen);
1125
1126    pdata = (u8 *)skb->data;
1127    /*for (i=0; i<skb->len; i++)
1128        DEBUG("skb->data[%d]=%x    ", i, *(skb->data+i));
1129
1130    DEBUG("\n");*/
1131
1132
1133    if (pInfo->mediastate == 0)
1134    {
1135        /* Drop packet is mediastate is down */
1136        DEBUG("ft1000_hw:ft1000_start_xmit:mediastate is down\n");
1137        goto err;
1138    }
1139
1140    if ( (skb->len < ENET_HEADER_SIZE) || (skb->len > ENET_MAX_SIZE) )
1141    {
1142        /* Drop packet which has invalid size */
1143        DEBUG("ft1000_hw:ft1000_start_xmit:invalid ethernet length\n");
1144        goto err;
1145    }
1146//mbelian
1147        ft1000_copy_down_pkt(dev, (pdata+ENET_HEADER_SIZE-2),
1148                                skb->len - ENET_HEADER_SIZE + 2);
1149
1150err:
1151        dev_kfree_skb(skb);
1152    //DEBUG(" ft1000_start_xmit() exit\n");
1153
1154        return NETDEV_TX_OK;
1155}
1156
1157//---------------------------------------------------------------------------
1158//
1159// Function:   ft1000_copy_up_pkt
1160// Descripton: This function will take a packet from the FIFO up link and
1161//             convert it into an ethernet packet and deliver it to the IP stack
1162// Input:
1163//     urb - the receving usb urb
1164//
1165// Output:
1166//     status - FAILURE
1167//              SUCCESS
1168//
1169//---------------------------------------------------------------------------
1170static int ft1000_copy_up_pkt (struct urb *urb)
1171{
1172        struct ft1000_info *info = urb->context;
1173    struct ft1000_device *ft1000dev = info->pFt1000Dev;
1174    struct net_device *net = ft1000dev->net;
1175
1176    u16 tempword;
1177    u16 len;
1178    u16 lena; //mbelian
1179    struct sk_buff *skb;
1180    u16 i;
1181    u8 *pbuffer=NULL;
1182    u8 *ptemp=NULL;
1183    u16 *chksum;
1184
1185
1186    //DEBUG("ft1000_copy_up_pkt entered\n");
1187
1188    if ( ft1000dev->status & FT1000_STATUS_CLOSING)
1189    {
1190        DEBUG("network driver is closed, return\n");
1191        return STATUS_SUCCESS;
1192    }
1193
1194    // Read length
1195    len = urb->transfer_buffer_length;
1196    lena = urb->actual_length; //mbelian
1197    //DEBUG("ft1000_copy_up_pkt: transfer_buffer_length=%d, actual_buffer_len=%d\n",
1198      //       urb->transfer_buffer_length, urb->actual_length);
1199
1200    chksum = (u16 *)ft1000dev->rx_buf;
1201
1202    tempword = *chksum++;
1203    for (i=1; i<7; i++)
1204    {
1205        tempword ^= *chksum++;
1206    }
1207
1208    if  (tempword != *chksum)
1209    {
1210        info->stats.rx_errors ++;
1211        ft1000_submit_rx_urb(info);
1212        return STATUS_FAILURE;
1213    }
1214
1215
1216    //DEBUG("ft1000_copy_up_pkt: checksum is correct %x\n", *chksum);
1217
1218    skb = dev_alloc_skb(len+12+2);
1219
1220    if (skb == NULL)
1221    {
1222        DEBUG("ft1000_copy_up_pkt: No Network buffers available\n");
1223        info->stats.rx_errors++;
1224        ft1000_submit_rx_urb(info);
1225        return STATUS_FAILURE;
1226    }
1227
1228    pbuffer = (u8 *)skb_put(skb, len+12);
1229
1230    //subtract the number of bytes read already
1231    ptemp = pbuffer;
1232
1233    // fake MAC address
1234    *pbuffer++ = net->dev_addr[0];
1235    *pbuffer++ = net->dev_addr[1];
1236    *pbuffer++ = net->dev_addr[2];
1237    *pbuffer++ = net->dev_addr[3];
1238    *pbuffer++ = net->dev_addr[4];
1239    *pbuffer++ = net->dev_addr[5];
1240    *pbuffer++ = 0x00;
1241    *pbuffer++ = 0x07;
1242    *pbuffer++ = 0x35;
1243    *pbuffer++ = 0xff;
1244    *pbuffer++ = 0xff;
1245    *pbuffer++ = 0xfe;
1246
1247
1248
1249
1250        memcpy(pbuffer, ft1000dev->rx_buf+sizeof(struct pseudo_hdr), len-sizeof(struct pseudo_hdr));
1251
1252    //DEBUG("ft1000_copy_up_pkt: Data passed to Protocol layer\n");
1253    /*for (i=0; i<len+12; i++)
1254    {
1255        DEBUG("ft1000_copy_up_pkt: Protocol Data: 0x%x\n ", *ptemp++);
1256    }*/
1257
1258    skb->dev = net;
1259
1260    skb->protocol = eth_type_trans(skb, net);
1261    skb->ip_summed = CHECKSUM_UNNECESSARY;
1262    netif_rx(skb);
1263
1264    info->stats.rx_packets++;
1265    // Add on 12 bytes for MAC address which was removed
1266    info->stats.rx_bytes += (lena+12); //mbelian
1267
1268    ft1000_submit_rx_urb(info);
1269    //DEBUG("ft1000_copy_up_pkt exited\n");
1270    return SUCCESS;
1271}
1272
1273//---------------------------------------------------------------------------
1274//
1275// Function:   ft1000_submit_rx_urb
1276// Descripton: the receiving function of the network driver
1277//
1278// Input:
1279//     info - a private structure contains the device information
1280//
1281// Output:
1282//     status - FAILURE
1283//              SUCCESS
1284//
1285//---------------------------------------------------------------------------
1286static int ft1000_submit_rx_urb(struct ft1000_info *info)
1287{
1288    int result;
1289    struct ft1000_device *pFt1000Dev = info->pFt1000Dev;
1290
1291
1292    //DEBUG ("ft1000_submit_rx_urb entered: sizeof rx_urb is %d\n", sizeof(*pFt1000Dev->rx_urb));
1293    if ( pFt1000Dev->status & FT1000_STATUS_CLOSING)
1294    {
1295        DEBUG("network driver is closed, return\n");
1296        //usb_kill_urb(pFt1000Dev->rx_urb); //mbelian
1297        return -ENODEV;
1298    }
1299
1300    usb_fill_bulk_urb(pFt1000Dev->rx_urb,
1301            pFt1000Dev->dev,
1302            usb_rcvbulkpipe(pFt1000Dev->dev, pFt1000Dev->bulk_in_endpointAddr),
1303            pFt1000Dev->rx_buf,
1304            MAX_BUF_SIZE,
1305            (usb_complete_t)ft1000_copy_up_pkt,
1306            info);
1307
1308
1309    if((result = usb_submit_urb(pFt1000Dev->rx_urb, GFP_ATOMIC)))
1310    {
1311        printk("ft1000_submit_rx_urb: submitting rx_urb %d failed\n", result);
1312        return result;
1313    }
1314
1315    //DEBUG("ft1000_submit_rx_urb exit: result=%d\n", result);
1316
1317        return 0;
1318}
1319
1320//---------------------------------------------------------------------------
1321// Function:    ft1000_open
1322//
1323// Parameters:
1324//              dev - network device
1325//
1326//
1327// Returns:     none
1328//
1329// Description: open the network driver
1330//
1331// Notes:
1332//
1333//---------------------------------------------------------------------------
1334static int ft1000_open (struct net_device *dev)
1335{
1336        struct ft1000_info *pInfo = netdev_priv(dev);
1337    struct timeval tv; //mbelian
1338        int ret;
1339
1340    DEBUG("ft1000_open is called for card %d\n", pInfo->CardNumber);
1341    //DEBUG("ft1000_open: dev->addr=%x, dev->addr_len=%d\n", dev->addr, dev->addr_len);
1342
1343        pInfo->stats.rx_bytes = 0; //mbelian
1344        pInfo->stats.tx_bytes = 0; //mbelian
1345        pInfo->stats.rx_packets = 0; //mbelian
1346        pInfo->stats.tx_packets = 0; //mbelian
1347        do_gettimeofday(&tv);
1348    pInfo->ConTm = tv.tv_sec;
1349        pInfo->ProgConStat = 0; //mbelian
1350
1351
1352    netif_start_queue(dev);
1353
1354    netif_carrier_on(dev); //mbelian
1355
1356        ret = ft1000_submit_rx_urb(pInfo);
1357
1358        return ret;
1359}
1360
1361//---------------------------------------------------------------------------
1362// Function:    ft1000_close
1363//
1364// Parameters:
1365//              net - network device
1366//
1367//
1368// Returns:     none
1369//
1370// Description: close the network driver
1371//
1372// Notes:
1373//
1374//---------------------------------------------------------------------------
1375int ft1000_close(struct net_device *net)
1376{
1377        struct ft1000_info *pInfo = netdev_priv(net);
1378    struct ft1000_device *ft1000dev = pInfo->pFt1000Dev;
1379
1380    //DEBUG ("ft1000_close: netdev->refcnt=%d\n", net->refcnt);
1381
1382    ft1000dev->status |= FT1000_STATUS_CLOSING;
1383    
1384    //DEBUG("ft1000_close: calling usb_kill_urb \n");
1385
1386    DEBUG("ft1000_close: pInfo=%p, ft1000dev=%p\n", pInfo, ft1000dev);
1387    netif_carrier_off(net);//mbelian
1388    netif_stop_queue(net);
1389    //DEBUG("ft1000_close: netif_stop_queue called\n");
1390    ft1000dev->status &= ~FT1000_STATUS_CLOSING;
1391
1392   pInfo->ProgConStat = 0xff; //mbelian
1393
1394
1395    return 0;
1396}
1397
1398static struct net_device_stats *ft1000_netdev_stats(struct net_device *dev)
1399{
1400        struct ft1000_info *info = netdev_priv(dev);
1401
1402        return &(info->stats); //mbelian
1403}
1404
1405
1406/*********************************************************************************
1407Jim
1408*/
1409
1410
1411//---------------------------------------------------------------------------
1412//
1413// Function:   ft1000_chkcard
1414// Descripton: This function will check if the device is presently available on
1415//             the system.
1416// Input:
1417//     dev    - device structure
1418// Output:
1419//     status - FALSE (device is not present)
1420//              TRUE  (device is present)
1421//
1422//---------------------------------------------------------------------------
1423static int ft1000_chkcard (struct ft1000_device *dev) {
1424    u16 tempword;
1425    u16 status;
1426        struct ft1000_info *info = netdev_priv(dev->net);
1427
1428    if (info->fCondResetPend)
1429    {
1430        DEBUG("ft1000_hw:ft1000_chkcard:Card is being reset, return FALSE\n");
1431        return TRUE;
1432    }
1433
1434    // Mask register is used to check for device presence since it is never
1435    // set to zero.
1436    status = ft1000_read_register(dev, &tempword, FT1000_REG_SUP_IMASK);
1437    //DEBUG("ft1000_hw:ft1000_chkcard: read FT1000_REG_SUP_IMASK = %x\n", tempword);
1438    if (tempword == 0) {
1439        DEBUG("ft1000_hw:ft1000_chkcard: IMASK = 0 Card not detected\n");
1440        return FALSE;
1441    }
1442
1443    // The system will return the value of 0xffff for the version register
1444    // if the device is not present.
1445    status = ft1000_read_register(dev, &tempword, FT1000_REG_ASIC_ID);
1446    //DEBUG("ft1000_hw:ft1000_chkcard: read FT1000_REG_ASIC_ID = %x\n", tempword);
1447    if (tempword != 0x1b01 ){
1448        dev->status |= FT1000_STATUS_CLOSING; //mbelian
1449        DEBUG("ft1000_hw:ft1000_chkcard: Version = 0xffff Card not detected\n");
1450        return FALSE;
1451    }
1452    return TRUE;
1453}
1454
1455
1456
1457//---------------------------------------------------------------------------
1458//
1459// Function:   ft1000_receive_cmd
1460// Descripton: This function will read a message from the dpram area.
1461// Input:
1462//    dev - network device structure
1463//    pbuffer - caller supply address to buffer
1464//    pnxtph - pointer to next pseudo header
1465// Output:
1466//   Status = 0 (unsuccessful)
1467//          = 1 (successful)
1468//
1469//---------------------------------------------------------------------------
1470static bool ft1000_receive_cmd (struct ft1000_device *dev, u16 *pbuffer, int maxsz, u16 *pnxtph) {
1471    u16 size, ret;
1472    u16 *ppseudohdr;
1473    int i;
1474    u16 tempword;
1475
1476    ret = ft1000_read_dpram16(dev, FT1000_MAG_PH_LEN, (u8 *)&size, FT1000_MAG_PH_LEN_INDX);
1477    size = ntohs(size) + PSEUDOSZ;
1478    if (size > maxsz) {
1479        DEBUG("FT1000:ft1000_receive_cmd:Invalid command length = %d\n", size);
1480        return FALSE;
1481    }
1482    else {
1483        ppseudohdr = (u16 *)pbuffer;
1484        ft1000_write_register(dev, FT1000_DPRAM_MAG_RX_BASE, FT1000_REG_DPRAM_ADDR);
1485        ret = ft1000_read_register(dev, pbuffer, FT1000_REG_MAG_DPDATAH);
1486        //DEBUG("ft1000_hw:received data = 0x%x\n", *pbuffer);
1487        pbuffer++;
1488        ft1000_write_register(dev,  FT1000_DPRAM_MAG_RX_BASE+1, FT1000_REG_DPRAM_ADDR);
1489        for (i=0; i<=(size>>2); i++) {
1490            ret = ft1000_read_register(dev, pbuffer, FT1000_REG_MAG_DPDATAL);
1491            pbuffer++;
1492            ret = ft1000_read_register(dev, pbuffer, FT1000_REG_MAG_DPDATAH);
1493            pbuffer++;
1494        }
1495        //copy odd aligned word
1496        ret = ft1000_read_register(dev, pbuffer, FT1000_REG_MAG_DPDATAL);
1497        //DEBUG("ft1000_hw:received data = 0x%x\n", *pbuffer);
1498        pbuffer++;
1499        ret = ft1000_read_register(dev, pbuffer, FT1000_REG_MAG_DPDATAH);
1500        //DEBUG("ft1000_hw:received data = 0x%x\n", *pbuffer);
1501        pbuffer++;
1502        if (size & 0x0001) {
1503            //copy odd byte from fifo
1504            ret = ft1000_read_register(dev, &tempword, FT1000_REG_DPRAM_DATA);
1505            *pbuffer = ntohs(tempword);
1506        }
1507
1508        // Check if pseudo header checksum is good
1509        // Calculate pseudo header checksum
1510        tempword = *ppseudohdr++;
1511        for (i=1; i<7; i++) {
1512            tempword ^= *ppseudohdr++;
1513        }
1514        if ( (tempword != *ppseudohdr) ) {
1515            return FALSE;
1516        }
1517
1518        return TRUE;
1519    }
1520}
1521
1522
1523static int ft1000_dsp_prov(void *arg)
1524{
1525    struct ft1000_device *dev = (struct ft1000_device *)arg;
1526        struct ft1000_info *info = netdev_priv(dev->net);
1527    u16 tempword;
1528    u16 len;
1529    u16 i=0;
1530        struct prov_record *ptr;
1531        struct pseudo_hdr *ppseudo_hdr;
1532    u16 *pmsg;
1533    u16 status;
1534    u16 TempShortBuf [256];
1535
1536    DEBUG("*** DspProv Entered\n");
1537
1538    while (list_empty(&info->prov_list) == 0)
1539    {
1540        DEBUG("DSP Provisioning List Entry\n");
1541
1542        // Check if doorbell is available
1543        DEBUG("check if doorbell is cleared\n");
1544        status = ft1000_read_register (dev, &tempword, FT1000_REG_DOORBELL);
1545        if (status)
1546        {
1547                DEBUG("ft1000_dsp_prov::ft1000_read_register error\n");
1548            break;
1549        }
1550
1551        while (tempword & FT1000_DB_DPRAM_TX) {
1552            mdelay(10);
1553            i++;
1554            if (i==10) {
1555               DEBUG("FT1000:ft1000_dsp_prov:message drop\n");
1556               return STATUS_FAILURE;
1557            }
1558            ft1000_read_register(dev, &tempword, FT1000_REG_DOORBELL);
1559        }
1560
1561        if ( !(tempword & FT1000_DB_DPRAM_TX) ) {
1562            DEBUG("*** Provision Data Sent to DSP\n");
1563
1564            // Send provisioning data
1565                ptr = list_entry(info->prov_list.next, struct prov_record, list);
1566            len = *(u16 *)ptr->pprov_data;
1567            len = htons(len);
1568            len += PSEUDOSZ;
1569
1570            pmsg = (u16 *)ptr->pprov_data;
1571                ppseudo_hdr = (struct pseudo_hdr *)pmsg;
1572            // Insert slow queue sequence number
1573            ppseudo_hdr->seq_num = info->squeseqnum++;
1574            ppseudo_hdr->portsrc = 0;
1575            // Calculate new checksum
1576            ppseudo_hdr->checksum = *pmsg++;
1577            //DEBUG("checksum = 0x%x\n", ppseudo_hdr->checksum);
1578            for (i=1; i<7; i++) {
1579                ppseudo_hdr->checksum ^= *pmsg++;
1580                //DEBUG("checksum = 0x%x\n", ppseudo_hdr->checksum);
1581            }
1582
1583            TempShortBuf[0] = 0;
1584            TempShortBuf[1] = htons (len);
1585            memcpy(&TempShortBuf[2], ppseudo_hdr, len);
1586
1587            status = ft1000_write_dpram32 (dev, 0, (u8 *)&TempShortBuf[0], (unsigned short)(len+2));
1588            status = ft1000_write_register (dev, FT1000_DB_DPRAM_TX, FT1000_REG_DOORBELL);
1589
1590            list_del(&ptr->list);
1591            kfree(ptr->pprov_data);
1592            kfree(ptr);
1593        }
1594        msleep(10);
1595    }
1596
1597    DEBUG("DSP Provisioning List Entry finished\n");
1598
1599    msleep(100);
1600
1601    info->fProvComplete = 1;
1602    info->CardReady = 1;
1603    return STATUS_SUCCESS;
1604
1605}
1606
1607
1608static int ft1000_proc_drvmsg (struct ft1000_device *dev, u16 size) {
1609        struct ft1000_info *info = netdev_priv(dev->net);
1610    u16 msgtype;
1611    u16 tempword;
1612        struct media_msg *pmediamsg;
1613        struct dsp_init_msg *pdspinitmsg;
1614        struct drv_msg *pdrvmsg;
1615    u16 i;
1616        struct pseudo_hdr *ppseudo_hdr;
1617    u16 *pmsg;
1618    u16 status;
1619    union {
1620        u8  byte[2];
1621        u16 wrd;
1622    } convert;
1623
1624
1625    char *cmdbuffer = kmalloc(1600, GFP_KERNEL);
1626    if (!cmdbuffer)
1627        return STATUS_FAILURE;
1628
1629    status = ft1000_read_dpram32(dev, 0x200, cmdbuffer, size);
1630
1631
1632
1633#ifdef JDEBUG
1634        DEBUG("ft1000_proc_drvmsg:cmdbuffer\n");
1635        for(i = 0; i < size; i+=5)
1636        {
1637            if( (i + 5) < size )
1638                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]);
1639            else
1640            {
1641                for (j = i; j < size; j++)
1642                DEBUG("0x%x ", cmdbuffer[j]);
1643                DEBUG("\n");
1644                break;
1645            }
1646        }
1647#endif
1648        pdrvmsg = (struct drv_msg *)&cmdbuffer[2];
1649        msgtype = ntohs(pdrvmsg->type);
1650        DEBUG("ft1000_proc_drvmsg:Command message type = 0x%x\n", msgtype);
1651        switch (msgtype) {
1652            case MEDIA_STATE: {
1653                DEBUG("ft1000_proc_drvmsg:Command message type = MEDIA_STATE");
1654
1655                pmediamsg = (struct media_msg *)&cmdbuffer[0];
1656                if (info->ProgConStat != 0xFF) {
1657                    if (pmediamsg->state) {
1658                        DEBUG("Media is up\n");
1659                        if (info->mediastate == 0) {
1660                            if ( info->NetDevRegDone )
1661                            {
1662                                //netif_carrier_on(dev->net);//mbelian
1663                                netif_wake_queue(dev->net);
1664                            }
1665                            info->mediastate = 1;
1666                            /*do_gettimeofday(&tv);
1667                            info->ConTm = tv.tv_sec;*/ //mbelian
1668                        }
1669                    }
1670                    else {
1671                        DEBUG("Media is down\n");
1672                        if (info->mediastate == 1) {
1673                            info->mediastate = 0;
1674                            if ( info->NetDevRegDone )
1675                            {
1676                                //netif_carrier_off(dev->net); mbelian
1677                                //netif_stop_queue(dev->net);
1678                            }
1679                            info->ConTm = 0;
1680                        }
1681                    }
1682                }
1683                else {
1684                    DEBUG("Media is down\n");
1685                    if (info->mediastate == 1) {
1686                        info->mediastate = 0;
1687                        if ( info->NetDevRegDone)
1688                        {
1689                            //netif_carrier_off(dev->net); //mbelian
1690                            //netif_stop_queue(dev->net);
1691                        }
1692                        info->ConTm = 0;
1693                    }
1694                }
1695                break;
1696            }
1697            case DSP_INIT_MSG: {
1698                DEBUG("ft1000_proc_drvmsg:Command message type = DSP_INIT_MSG");
1699
1700                pdspinitmsg = (struct dsp_init_msg *)&cmdbuffer[2];
1701                memcpy(info->DspVer, pdspinitmsg->DspVer, DSPVERSZ);
1702                DEBUG("DSPVER = 0x%2x 0x%2x 0x%2x 0x%2x\n", info->DspVer[0], info->DspVer[1], info->DspVer[2], info->DspVer[3]);
1703                memcpy(info->HwSerNum, pdspinitmsg->HwSerNum, HWSERNUMSZ);
1704                memcpy(info->Sku, pdspinitmsg->Sku, SKUSZ);
1705                memcpy(info->eui64, pdspinitmsg->eui64, EUISZ);
1706                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]);
1707                dev->net->dev_addr[0] = info->eui64[0];
1708                dev->net->dev_addr[1] = info->eui64[1];
1709                dev->net->dev_addr[2] = info->eui64[2];
1710                dev->net->dev_addr[3] = info->eui64[5];
1711                dev->net->dev_addr[4] = info->eui64[6];
1712                dev->net->dev_addr[5] = info->eui64[7];
1713
1714                if (ntohs(pdspinitmsg->length) == (sizeof(struct dsp_init_msg) - 20)) {
1715                    memcpy(info->ProductMode, pdspinitmsg->ProductMode, MODESZ);
1716                    memcpy(info->RfCalVer, pdspinitmsg->RfCalVer, CALVERSZ);
1717                    memcpy(info->RfCalDate, pdspinitmsg->RfCalDate, CALDATESZ);
1718                    DEBUG("RFCalVer = 0x%2x 0x%2x\n", info->RfCalVer[0], info->RfCalVer[1]);
1719                }
1720                break;
1721            }
1722            case DSP_PROVISION: {
1723                DEBUG("ft1000_proc_drvmsg:Command message type = DSP_PROVISION\n");
1724
1725                // kick off dspprov routine to start provisioning
1726                // Send provisioning data to DSP
1727                if (list_empty(&info->prov_list) == 0)
1728                {
1729                    info->fProvComplete = 0;
1730                    status = ft1000_dsp_prov(dev);
1731                    if (status != STATUS_SUCCESS)
1732                        goto out;
1733                }
1734                else {
1735                    info->fProvComplete = 1;
1736                    status = ft1000_write_register (dev, FT1000_DB_HB, FT1000_REG_DOORBELL);
1737                    DEBUG("FT1000:drivermsg:No more DSP provisioning data in dsp image\n");
1738                }
1739                DEBUG("ft1000_proc_drvmsg:DSP PROVISION is done\n");
1740                break;
1741            }
1742            case DSP_STORE_INFO: {
1743                DEBUG("ft1000_proc_drvmsg:Command message type = DSP_STORE_INFO");
1744
1745                DEBUG("FT1000:drivermsg:Got DSP_STORE_INFO\n");
1746                tempword = ntohs(pdrvmsg->length);
1747                info->DSPInfoBlklen = tempword;
1748                if (tempword < (MAX_DSP_SESS_REC-4) ) {
1749                    pmsg = (u16 *)&pdrvmsg->data[0];
1750                    for (i=0; i<((tempword+1)/2); i++) {
1751                        DEBUG("FT1000:drivermsg:dsp info data = 0x%x\n", *pmsg);
1752                        info->DSPInfoBlk[i+10] = *pmsg++;
1753                    }
1754                }
1755                else {
1756                    info->DSPInfoBlklen = 0;
1757                }
1758                break;
1759            }
1760            case DSP_GET_INFO: {
1761                DEBUG("FT1000:drivermsg:Got DSP_GET_INFO\n");
1762                // copy dsp info block to dsp
1763                info->DrvMsgPend = 1;
1764                // allow any outstanding ioctl to finish
1765                mdelay(10);
1766                status = ft1000_read_register(dev, &tempword, FT1000_REG_DOORBELL);
1767                if (tempword & FT1000_DB_DPRAM_TX) {
1768                    mdelay(10);
1769                    status = ft1000_read_register(dev, &tempword, FT1000_REG_DOORBELL);
1770                    if (tempword & FT1000_DB_DPRAM_TX) {
1771                        mdelay(10);
1772                            status = ft1000_read_register(dev, &tempword, FT1000_REG_DOORBELL);
1773                            if (tempword & FT1000_DB_DPRAM_TX) {
1774                                break;
1775                            }
1776                    }
1777                }
1778
1779                // Put message into Slow Queue
1780                // Form Pseudo header
1781                pmsg = (u16 *)info->DSPInfoBlk;
1782                *pmsg++ = 0;
1783                *pmsg++ = htons(info->DSPInfoBlklen+20+info->DSPInfoBlklen);
1784                ppseudo_hdr = (struct pseudo_hdr *)(u16 *)&info->DSPInfoBlk[2];
1785                ppseudo_hdr->length = htons(info->DSPInfoBlklen+4+info->DSPInfoBlklen);
1786                ppseudo_hdr->source = 0x10;
1787                ppseudo_hdr->destination = 0x20;
1788                ppseudo_hdr->portdest = 0;
1789                ppseudo_hdr->portsrc = 0;
1790                ppseudo_hdr->sh_str_id = 0;
1791                ppseudo_hdr->control = 0;
1792                ppseudo_hdr->rsvd1 = 0;
1793                ppseudo_hdr->rsvd2 = 0;
1794                ppseudo_hdr->qos_class = 0;
1795                // Insert slow queue sequence number
1796                ppseudo_hdr->seq_num = info->squeseqnum++;
1797                // Insert application id
1798                ppseudo_hdr->portsrc = 0;
1799                // Calculate new checksum
1800                ppseudo_hdr->checksum = *pmsg++;
1801                for (i=1; i<7; i++) {
1802                    ppseudo_hdr->checksum ^= *pmsg++;
1803                }
1804                info->DSPInfoBlk[10] = 0x7200;
1805                info->DSPInfoBlk[11] = htons(info->DSPInfoBlklen);
1806                status = ft1000_write_dpram32 (dev, 0, (u8 *)&info->DSPInfoBlk[0], (unsigned short)(info->DSPInfoBlklen+22));
1807                status = ft1000_write_register (dev, FT1000_DB_DPRAM_TX, FT1000_REG_DOORBELL);
1808                info->DrvMsgPend = 0;
1809
1810                break;
1811            }
1812
1813          case GET_DRV_ERR_RPT_MSG: {
1814              DEBUG("FT1000:drivermsg:Got GET_DRV_ERR_RPT_MSG\n");
1815              // copy driver error message to dsp
1816              info->DrvMsgPend = 1;
1817              // allow any outstanding ioctl to finish
1818              mdelay(10);
1819              status = ft1000_read_register(dev, &tempword, FT1000_REG_DOORBELL);
1820              if (tempword & FT1000_DB_DPRAM_TX) {
1821                  mdelay(10);
1822                  status = ft1000_read_register(dev, &tempword, FT1000_REG_DOORBELL);
1823                  if (tempword & FT1000_DB_DPRAM_TX) {
1824                      mdelay(10);
1825                  }
1826              }
1827
1828              if ( (tempword & FT1000_DB_DPRAM_TX) == 0) {
1829                  // Put message into Slow Queue
1830                  // Form Pseudo header
1831                  pmsg = (u16 *)&tempbuffer[0];
1832                        ppseudo_hdr = (struct pseudo_hdr *)pmsg;
1833                  ppseudo_hdr->length = htons(0x0012);
1834                  ppseudo_hdr->source = 0x10;
1835                  ppseudo_hdr->destination = 0x20;
1836                  ppseudo_hdr->portdest = 0;
1837                  ppseudo_hdr->portsrc = 0;
1838                  ppseudo_hdr->sh_str_id = 0;
1839                  ppseudo_hdr->control = 0;
1840                  ppseudo_hdr->rsvd1 = 0;
1841                  ppseudo_hdr->rsvd2 = 0;
1842                  ppseudo_hdr->qos_class = 0;
1843                  // Insert slow queue sequence number
1844                  ppseudo_hdr->seq_num = info->squeseqnum++;
1845                  // Insert application id
1846                  ppseudo_hdr->portsrc = 0;
1847                  // Calculate new checksum
1848                  ppseudo_hdr->checksum = *pmsg++;
1849                  for (i=1; i<7; i++) {
1850                      ppseudo_hdr->checksum ^= *pmsg++;
1851                  }
1852                  pmsg = (u16 *)&tempbuffer[16];
1853                  *pmsg++ = htons(RSP_DRV_ERR_RPT_MSG);
1854                  *pmsg++ = htons(0x000e);
1855                  *pmsg++ = htons(info->DSP_TIME[0]);
1856                  *pmsg++ = htons(info->DSP_TIME[1]);
1857                  *pmsg++ = htons(info->DSP_TIME[2]);
1858                  *pmsg++ = htons(info->DSP_TIME[3]);
1859                  convert.byte[0] = info->DspVer[0];
1860                  convert.byte[1] = info->DspVer[1];
1861                  *pmsg++ = convert.wrd;
1862                  convert.byte[0] = info->DspVer[2];
1863                  convert.byte[1] = info->DspVer[3];
1864                  *pmsg++ = convert.wrd;
1865                  *pmsg++ = htons(info->DrvErrNum);
1866
1867                  CardSendCommand (dev, (unsigned char*)&tempbuffer[0], (u16)(0x0012 + PSEUDOSZ));
1868                  info->DrvErrNum = 0;
1869              }
1870              info->DrvMsgPend = 0;
1871
1872          break;
1873      }
1874
1875      default:
1876          break;
1877        }
1878
1879
1880    status = STATUS_SUCCESS;
1881out:
1882    kfree(cmdbuffer);
1883    DEBUG("return from ft1000_proc_drvmsg\n");
1884    return status;
1885}
1886
1887
1888
1889int ft1000_poll(void* dev_id) {
1890
1891    struct ft1000_device *dev = (struct ft1000_device *)dev_id;
1892        struct ft1000_info *info = netdev_priv(dev->net);
1893
1894    u16 tempword;
1895    u16 status;
1896    u16 size;
1897    int i;
1898    u16 data;
1899    u16 modulo;
1900    u16 portid;
1901    u16 nxtph;
1902        struct dpram_blk *pdpram_blk;
1903        struct pseudo_hdr *ppseudo_hdr;
1904    unsigned long flags;
1905
1906    //DEBUG("Enter ft1000_poll...\n");
1907    if (ft1000_chkcard(dev) == FALSE) {
1908        DEBUG("ft1000_poll::ft1000_chkcard: failed\n");
1909        return STATUS_FAILURE;
1910    }
1911
1912    status = ft1000_read_register (dev, &tempword, FT1000_REG_DOORBELL);
1913   // DEBUG("ft1000_poll: read FT1000_REG_DOORBELL message 0x%x\n", tempword);
1914
1915    if ( !status )
1916    {
1917
1918        if (tempword & FT1000_DB_DPRAM_RX) {
1919            //DEBUG("ft1000_poll: FT1000_REG_DOORBELL message type:  FT1000_DB_DPRAM_RX\n");
1920
1921            status = ft1000_read_dpram16(dev, 0x200, (u8 *)&data, 0);
1922            //DEBUG("ft1000_poll:FT1000_DB_DPRAM_RX:ft1000_read_dpram16:size = 0x%x\n", data);
1923            size = ntohs(data) + 16 + 2; //wai
1924            if (size % 4) {
1925                modulo = 4 - (size % 4);
1926                size = size + modulo;
1927            }
1928            status = ft1000_read_dpram16(dev, 0x201, (u8 *)&portid, 1);
1929            portid &= 0xff;
1930            //DEBUG("ft1000_poll: FT1000_REG_DOORBELL message type: FT1000_DB_DPRAM_RX : portid 0x%x\n", portid);
1931
1932            if (size < MAX_CMD_SQSIZE) {
1933                switch (portid)
1934                {
1935                    case DRIVERID:
1936                        DEBUG("ft1000_poll: FT1000_REG_DOORBELL message type: FT1000_DB_DPRAM_RX : portid DRIVERID\n");
1937
1938                        status = ft1000_proc_drvmsg (dev, size);
1939                        if (status != STATUS_SUCCESS )
1940                            return status;
1941                        break;
1942                    case DSPBCMSGID:
1943                        // This is a dsp broadcast message
1944                        // Check which application has registered for dsp broadcast messages
1945                        //DEBUG("ft1000_poll: FT1000_REG_DOORBELL message type: FT1000_DB_DPRAM_RX : portid DSPBCMSGID\n");
1946
1947                        for (i=0; i<MAX_NUM_APP; i++) {
1948                           if ( (info->app_info[i].DspBCMsgFlag) && (info->app_info[i].fileobject) &&
1949                                         (info->app_info[i].NumOfMsg < MAX_MSG_LIMIT)  )
1950                           {
1951                               //DEBUG("Dsp broadcast message detected for app id %d\n", i);
1952                               nxtph = FT1000_DPRAM_RX_BASE + 2;
1953                               pdpram_blk = ft1000_get_buffer (&freercvpool);
1954                               if (pdpram_blk != NULL) {
1955                                   if ( ft1000_receive_cmd(dev, pdpram_blk->pbuffer, MAX_CMD_SQSIZE, &nxtph) ) {
1956                                        ppseudo_hdr = (struct pseudo_hdr *)pdpram_blk->pbuffer;
1957                                       // Put message into the appropriate application block
1958                                       info->app_info[i].nRxMsg++;
1959                                       spin_lock_irqsave(&free_buff_lock, flags);
1960                                       list_add_tail(&pdpram_blk->list, &info->app_info[i].app_sqlist);
1961                                       info->app_info[i].NumOfMsg++;
1962                                       spin_unlock_irqrestore(&free_buff_lock, flags);
1963                                       wake_up_interruptible(&info->app_info[i].wait_dpram_msg);
1964                                   }
1965                                   else {
1966                                       info->app_info[i].nRxMsgMiss++;
1967                                       // Put memory back to free pool
1968                                       ft1000_free_buffer(pdpram_blk, &freercvpool);
1969                                       DEBUG("pdpram_blk::ft1000_get_buffer NULL\n");
1970                                   }
1971                               }
1972                               else {
1973                                   DEBUG("Out of memory in free receive command pool\n");
1974                                   info->app_info[i].nRxMsgMiss++;
1975                               }//endof if (pdpram_blk != NULL)
1976                           }//endof if
1977                           //else
1978                           //    DEBUG("app_info mismatch\n");
1979                        }// endof for
1980                        break;
1981                    default:
1982                        pdpram_blk = ft1000_get_buffer (&freercvpool);
1983                        //DEBUG("Memory allocated = 0x%8x\n", (u32)pdpram_blk);
1984                        if (pdpram_blk != NULL) {
1985                           if ( ft1000_receive_cmd(dev, pdpram_blk->pbuffer, MAX_CMD_SQSIZE, &nxtph) ) {
1986                                ppseudo_hdr = (struct pseudo_hdr *)pdpram_blk->pbuffer;
1987                               // Search for correct application block
1988                               for (i=0; i<MAX_NUM_APP; i++) {
1989                                   if (info->app_info[i].app_id == ppseudo_hdr->portdest) {
1990                                       break;
1991                                   }
1992                               }
1993
1994                               if (i == MAX_NUM_APP) {
1995                                   DEBUG("FT1000:ft1000_parse_dpram_msg: No application matching id = %d\n", ppseudo_hdr->portdest);
1996                                   // Put memory back to free pool
1997                                   ft1000_free_buffer(pdpram_blk, &freercvpool);
1998                               }
1999                               else {
2000                                   if (info->app_info[i].NumOfMsg > MAX_MSG_LIMIT) {
2001                                       // Put memory back to free pool
2002                                       ft1000_free_buffer(pdpram_blk, &freercvpool);
2003                                   }
2004                                   else {
2005                                       info->app_info[i].nRxMsg++;
2006                                       // Put message into the appropriate application block
2007                                       //pxu spin_lock_irqsave(&free_buff_lock, flags);
2008                                       list_add_tail(&pdpram_blk->list, &info->app_info[i].app_sqlist);
2009                                       info->app_info[i].NumOfMsg++;
2010                                       //pxu spin_unlock_irqrestore(&free_buff_lock, flags);
2011                                       //pxu wake_up_interruptible(&info->app_info[i].wait_dpram_msg);
2012                                   }
2013                               }
2014                           }
2015                           else {
2016                               // Put memory back to free pool
2017                               ft1000_free_buffer(pdpram_blk, &freercvpool);
2018                           }
2019                        }
2020                        else {
2021                            DEBUG("Out of memory in free receive command pool\n");
2022                        }
2023                        break;
2024                } //end of switch
2025            } //endof if (size < MAX_CMD_SQSIZE)
2026            else {
2027                DEBUG("FT1000:dpc:Invalid total length for SlowQ = %d\n", size);
2028            }
2029            status = ft1000_write_register (dev, FT1000_DB_DPRAM_RX, FT1000_REG_DOORBELL);
2030        }
2031        else if (tempword & FT1000_DSP_ASIC_RESET) {
2032            //DEBUG("ft1000_poll: FT1000_REG_DOORBELL message type:  FT1000_DSP_ASIC_RESET\n");
2033
2034            // Let's reset the ASIC from the Host side as well
2035            status = ft1000_write_register (dev, ASIC_RESET_BIT, FT1000_REG_RESET);
2036            status = ft1000_read_register (dev, &tempword, FT1000_REG_RESET);
2037            i = 0;
2038            while (tempword & ASIC_RESET_BIT) {
2039                status = ft1000_read_register (dev, &tempword, FT1000_REG_RESET);
2040                msleep(10);
2041                i++;
2042                if (i==100)
2043                    break;
2044            }
2045            if (i==100) {
2046                DEBUG("Unable to reset ASIC\n");
2047                return STATUS_SUCCESS;
2048            }
2049            msleep(10);
2050            // Program WMARK register
2051            status = ft1000_write_register (dev, 0x600, FT1000_REG_MAG_WATERMARK);
2052            // clear ASIC reset doorbell
2053            status = ft1000_write_register (dev, FT1000_DSP_ASIC_RESET, FT1000_REG_DOORBELL);
2054            msleep(10);
2055        }
2056        else if (tempword & FT1000_ASIC_RESET_REQ) {
2057            DEBUG("ft1000_poll: FT1000_REG_DOORBELL message type:  FT1000_ASIC_RESET_REQ\n");
2058
2059            // clear ASIC reset request from DSP
2060            status = ft1000_write_register (dev, FT1000_ASIC_RESET_REQ, FT1000_REG_DOORBELL);
2061            status = ft1000_write_register (dev, HOST_INTF_BE, FT1000_REG_SUP_CTRL);
2062            // copy dsp session record from Adapter block
2063            status = ft1000_write_dpram32 (dev, 0, (u8 *)&info->DSPSess.Rec[0], 1024);
2064            // Program WMARK register
2065            status = ft1000_write_register (dev, 0x600, FT1000_REG_MAG_WATERMARK);
2066            // ring doorbell to tell DSP that ASIC is out of reset
2067            status = ft1000_write_register (dev, FT1000_ASIC_RESET_DSP, FT1000_REG_DOORBELL);
2068        }
2069        else if (tempword & FT1000_DB_COND_RESET) {
2070            DEBUG("ft1000_poll: FT1000_REG_DOORBELL message type:  FT1000_DB_COND_RESET\n");
2071//By Jim
2072// Reset ASIC and DSP
2073//MAG
2074            if (info->fAppMsgPend == 0) {
2075               // Reset ASIC and DSP
2076
2077                status    = ft1000_read_dpram16(dev, FT1000_MAG_DSP_TIMER0, (u8 *)&(info->DSP_TIME[0]), FT1000_MAG_DSP_TIMER0_INDX);
2078                status    = ft1000_read_dpram16(dev, FT1000_MAG_DSP_TIMER1, (u8 *)&(info->DSP_TIME[1]), FT1000_MAG_DSP_TIMER1_INDX);
2079                status    = ft1000_read_dpram16(dev, FT1000_MAG_DSP_TIMER2, (u8 *)&(info->DSP_TIME[2]), FT1000_MAG_DSP_TIMER2_INDX);
2080                status    = ft1000_read_dpram16(dev, FT1000_MAG_DSP_TIMER3, (u8 *)&(info->DSP_TIME[3]), FT1000_MAG_DSP_TIMER3_INDX);
2081                info->CardReady = 0;
2082                info->DrvErrNum = DSP_CONDRESET_INFO;
2083                DEBUG("ft1000_hw:DSP conditional reset requested\n");
2084                info->ft1000_reset(dev->net);
2085            }
2086            else {
2087                info->fProvComplete = 0;
2088                info->fCondResetPend = 1;
2089            }
2090
2091            ft1000_write_register(dev, FT1000_DB_COND_RESET, FT1000_REG_DOORBELL);
2092        }
2093
2094    }//endof if ( !status )
2095
2096    //DEBUG("return from ft1000_poll.\n");
2097    return STATUS_SUCCESS;
2098
2099}
2100
2101/*end of Jim*/
2102