linux/drivers/net/irda/via-ircc.h
<<
>>
Prefs
   1/*********************************************************************
   2 *                
   3 * Filename:      via-ircc.h
   4 * Version:       1.0
   5 * Description:   Driver for the VIA VT8231/VT8233 IrDA chipsets
   6 * Author:        VIA Technologies, inc
   7 * Date  :        08/06/2003
   8
   9Copyright (c) 1998-2003 VIA Technologies, Inc.
  10
  11This program is free software; you can redistribute it and/or modify it under
  12the terms of the GNU General Public License as published by the Free Software
  13Foundation; either version 2, or (at your option) any later version.
  14
  15This program is distributed in the hope that it will be useful, but WITHOUT
  16ANY WARRANTIES OR REPRESENTATIONS; without even the implied warranty of
  17MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  18See the GNU General Public License for more details.
  19
  20You should have received a copy of the GNU General Public License along with
  21this program; if not, write to the Free Software Foundation, Inc.,
  2259 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  23
  24 * Comment:
  25 * jul/08/2002 : Rx buffer length should use Rx ring ptr.       
  26 * Oct/28/2002 : Add SB id for 3147 and 3177.   
  27 * jul/09/2002 : only implement two kind of dongle currently.
  28 * Oct/02/2002 : work on VT8231 and VT8233 .
  29 * Aug/06/2003 : change driver format to pci driver .
  30 ********************************************************************/
  31#ifndef via_IRCC_H
  32#define via_IRCC_H
  33#include <linux/time.h>
  34#include <linux/spinlock.h>
  35#include <linux/pm.h>
  36#include <linux/types.h>
  37#include <asm/io.h>
  38
  39#define MAX_TX_WINDOW 7
  40#define MAX_RX_WINDOW 7
  41
  42struct st_fifo_entry {
  43        int status;
  44        int len;
  45};
  46
  47struct st_fifo {
  48        struct st_fifo_entry entries[MAX_RX_WINDOW + 2];
  49        int pending_bytes;
  50        int head;
  51        int tail;
  52        int len;
  53};
  54
  55struct frame_cb {
  56        void *start;            /* Start of frame in DMA mem */
  57        int len;                /* Length of frame in DMA mem */
  58};
  59
  60struct tx_fifo {
  61        struct frame_cb queue[MAX_TX_WINDOW + 2];       /* Info about frames in queue */
  62        int ptr;                /* Currently being sent */
  63        int len;                /* Length of queue */
  64        int free;               /* Next free slot */
  65        void *tail;             /* Next free start in DMA mem */
  66};
  67
  68
  69struct eventflag                // for keeping track of Interrupt Events
  70{
  71        //--------tx part
  72        unsigned char TxFIFOUnderRun;
  73        unsigned char EOMessage;
  74        unsigned char TxFIFOReady;
  75        unsigned char EarlyEOM;
  76        //--------rx part
  77        unsigned char PHYErr;
  78        unsigned char CRCErr;
  79        unsigned char RxFIFOOverRun;
  80        unsigned char EOPacket;
  81        unsigned char RxAvail;
  82        unsigned char TooLargePacket;
  83        unsigned char SIRBad;
  84        //--------unknown
  85        unsigned char Unknown;
  86        //----------
  87        unsigned char TimeOut;
  88        unsigned char RxDMATC;
  89        unsigned char TxDMATC;
  90};
  91
  92/* Private data for each instance */
  93struct via_ircc_cb {
  94        struct st_fifo st_fifo; /* Info about received frames */
  95        struct tx_fifo tx_fifo; /* Info about frames to be transmitted */
  96
  97        struct net_device *netdev;      /* Yes! we are some kind of netdevice */
  98        struct net_device_stats stats;
  99
 100        struct irlap_cb *irlap; /* The link layer we are binded to */
 101        struct qos_info qos;    /* QoS capabilities for this device */
 102
 103        chipio_t io;            /* IrDA controller information */
 104        iobuff_t tx_buff;       /* Transmit buffer */
 105        iobuff_t rx_buff;       /* Receive buffer */
 106        dma_addr_t tx_buff_dma;
 107        dma_addr_t rx_buff_dma;
 108
 109        __u8 ier;               /* Interrupt enable register */
 110
 111        struct timeval stamp;
 112        struct timeval now;
 113
 114        spinlock_t lock;        /* For serializing operations */
 115
 116        __u32 flags;            /* Interface flags */
 117        __u32 new_speed;
 118        int index;              /* Instance index */
 119
 120        struct eventflag EventFlag;
 121        unsigned int chip_id;   /* to remember chip id */
 122        unsigned int RetryCount;
 123        unsigned int RxDataReady;
 124        unsigned int RxLastCount;
 125};
 126
 127
 128//---------I=Infrared,  H=Host, M=Misc, T=Tx, R=Rx, ST=Status,
 129//         CF=Config, CT=Control, L=Low, H=High, C=Count
 130#define  I_CF_L_0               0x10
 131#define  I_CF_H_0               0x11
 132#define  I_SIR_BOF              0x12
 133#define  I_SIR_EOF              0x13
 134#define  I_ST_CT_0              0x15
 135#define  I_ST_L_1               0x16
 136#define  I_ST_H_1               0x17
 137#define  I_CF_L_1               0x18
 138#define  I_CF_H_1               0x19
 139#define  I_CF_L_2               0x1a
 140#define  I_CF_H_2               0x1b
 141#define  I_CF_3         0x1e
 142#define  H_CT                   0x20
 143#define  H_ST                   0x21
 144#define  M_CT                   0x22
 145#define  TX_CT_1                0x23
 146#define  TX_CT_2                0x24
 147#define  TX_ST                  0x25
 148#define  RX_CT                  0x26
 149#define  RX_ST                  0x27
 150#define  RESET                  0x28
 151#define  P_ADDR         0x29
 152#define  RX_C_L         0x2a
 153#define  RX_C_H         0x2b
 154#define  RX_P_L         0x2c
 155#define  RX_P_H         0x2d
 156#define  TX_C_L         0x2e
 157#define  TX_C_H         0x2f
 158#define  TIMER          0x32
 159#define  I_CF_4                 0x33
 160#define  I_T_C_L                0x34
 161#define  I_T_C_H                0x35
 162#define  VERSION                0x3f
 163//-------------------------------
 164#define StartAddr       0x10    // the first register address
 165#define EndAddr         0x3f    // the last register address
 166#define GetBit(val,bit)  val = (unsigned char) ((val>>bit) & 0x1)
 167                        // Returns the bit
 168#define SetBit(val,bit)  val= (unsigned char ) (val | (0x1 << bit))
 169                        // Sets bit to 1
 170#define ResetBit(val,bit) val= (unsigned char ) (val & ~(0x1 << bit))
 171                        // Sets bit to 0
 172
 173#define OFF   0
 174#define ON   1
 175#define DMA_TX_MODE   0x08
 176#define DMA_RX_MODE   0x04
 177
 178#define DMA1   0
 179#define DMA2   0xc0
 180#define MASK1   DMA1+0x0a
 181#define MASK2   DMA2+0x14
 182
 183#define Clk_bit 0x40
 184#define Tx_bit 0x01
 185#define Rd_Valid 0x08
 186#define RxBit 0x08
 187
 188static void DisableDmaChannel(unsigned int channel)
 189{
 190        switch (channel) {      // 8 Bit DMA channels DMAC1
 191        case 0:
 192                outb(4, MASK1); //mask channel 0
 193                break;
 194        case 1:
 195                outb(5, MASK1); //Mask channel 1
 196                break;
 197        case 2:
 198                outb(6, MASK1); //Mask channel 2
 199                break;
 200        case 3:
 201                outb(7, MASK1); //Mask channel 3
 202                break;
 203        case 5:
 204                outb(5, MASK2); //Mask channel 5
 205                break;
 206        case 6:
 207                outb(6, MASK2); //Mask channel 6
 208                break;
 209        case 7:
 210                outb(7, MASK2); //Mask channel 7
 211                break;
 212        default:
 213                break;
 214        };                      //Switch
 215}
 216
 217static unsigned char ReadLPCReg(int iRegNum)
 218{
 219        unsigned char iVal;
 220
 221        outb(0x87, 0x2e);
 222        outb(0x87, 0x2e);
 223        outb(iRegNum, 0x2e);
 224        iVal = inb(0x2f);
 225        outb(0xaa, 0x2e);
 226
 227        return iVal;
 228}
 229
 230static void WriteLPCReg(int iRegNum, unsigned char iVal)
 231{
 232
 233        outb(0x87, 0x2e);
 234        outb(0x87, 0x2e);
 235        outb(iRegNum, 0x2e);
 236        outb(iVal, 0x2f);
 237        outb(0xAA, 0x2e);
 238}
 239
 240static __u8 ReadReg(unsigned int BaseAddr, int iRegNum)
 241{
 242        return ((__u8) inb(BaseAddr + iRegNum));
 243}
 244
 245static void WriteReg(unsigned int BaseAddr, int iRegNum, unsigned char iVal)
 246{
 247        outb(iVal, BaseAddr + iRegNum);
 248}
 249
 250static int WriteRegBit(unsigned int BaseAddr, unsigned char RegNum,
 251                unsigned char BitPos, unsigned char value)
 252{
 253        __u8 Rtemp, Wtemp;
 254
 255        if (BitPos > 7) {
 256                return -1;
 257        }
 258        if ((RegNum < StartAddr) || (RegNum > EndAddr))
 259                return -1;
 260        Rtemp = ReadReg(BaseAddr, RegNum);
 261        if (value == 0)
 262                Wtemp = ResetBit(Rtemp, BitPos);
 263        else {
 264                if (value == 1)
 265                        Wtemp = SetBit(Rtemp, BitPos);
 266                else
 267                        return -1;
 268        }
 269        WriteReg(BaseAddr, RegNum, Wtemp);
 270        return 0;
 271}
 272
 273static __u8 CheckRegBit(unsigned int BaseAddr, unsigned char RegNum,
 274                 unsigned char BitPos)
 275{
 276        __u8 temp;
 277
 278        if (BitPos > 7)
 279                return 0xff;
 280        if ((RegNum < StartAddr) || (RegNum > EndAddr)) {
 281//     printf("what is the register %x!\n",RegNum);
 282        }
 283        temp = ReadReg(BaseAddr, RegNum);
 284        return GetBit(temp, BitPos);
 285}
 286
 287static void SetMaxRxPacketSize(__u16 iobase, __u16 size)
 288{
 289        __u16 low, high;
 290        if ((size & 0xe000) == 0) {
 291                low = size & 0x00ff;
 292                high = (size & 0x1f00) >> 8;
 293                WriteReg(iobase, I_CF_L_2, low);
 294                WriteReg(iobase, I_CF_H_2, high);
 295
 296        }
 297
 298}
 299
 300//for both Rx and Tx
 301
 302static void SetFIFO(__u16 iobase, __u16 value)
 303{
 304        switch (value) {
 305        case 128:
 306                WriteRegBit(iobase, 0x11, 0, 0);
 307                WriteRegBit(iobase, 0x11, 7, 1);
 308                break;
 309        case 64:
 310                WriteRegBit(iobase, 0x11, 0, 0);
 311                WriteRegBit(iobase, 0x11, 7, 0);
 312                break;
 313        case 32:
 314                WriteRegBit(iobase, 0x11, 0, 1);
 315                WriteRegBit(iobase, 0x11, 7, 0);
 316                break;
 317        default:
 318                WriteRegBit(iobase, 0x11, 0, 0);
 319                WriteRegBit(iobase, 0x11, 7, 0);
 320        }
 321
 322}
 323
 324#define CRC16(BaseAddr,val)         WriteRegBit(BaseAddr,I_CF_L_0,7,val)        //0 for 32 CRC
 325/*
 326#define SetVFIR(BaseAddr,val)       WriteRegBit(BaseAddr,I_CF_H_0,5,val)
 327#define SetFIR(BaseAddr,val)        WriteRegBit(BaseAddr,I_CF_L_0,6,val)
 328#define SetMIR(BaseAddr,val)        WriteRegBit(BaseAddr,I_CF_L_0,5,val)
 329#define SetSIR(BaseAddr,val)        WriteRegBit(BaseAddr,I_CF_L_0,4,val)
 330*/
 331#define SIRFilter(BaseAddr,val)     WriteRegBit(BaseAddr,I_CF_L_0,3,val)
 332#define Filter(BaseAddr,val)        WriteRegBit(BaseAddr,I_CF_L_0,2,val)
 333#define InvertTX(BaseAddr,val)      WriteRegBit(BaseAddr,I_CF_L_0,1,val)
 334#define InvertRX(BaseAddr,val)      WriteRegBit(BaseAddr,I_CF_L_0,0,val)
 335//****************************I_CF_H_0
 336#define EnableTX(BaseAddr,val)      WriteRegBit(BaseAddr,I_CF_H_0,4,val)
 337#define EnableRX(BaseAddr,val)      WriteRegBit(BaseAddr,I_CF_H_0,3,val)
 338#define EnableDMA(BaseAddr,val)     WriteRegBit(BaseAddr,I_CF_H_0,2,val)
 339#define SIRRecvAny(BaseAddr,val)    WriteRegBit(BaseAddr,I_CF_H_0,1,val)
 340#define DiableTrans(BaseAddr,val)   WriteRegBit(BaseAddr,I_CF_H_0,0,val)
 341//***************************I_SIR_BOF,I_SIR_EOF
 342#define SetSIRBOF(BaseAddr,val)     WriteReg(BaseAddr,I_SIR_BOF,val)
 343#define SetSIREOF(BaseAddr,val)     WriteReg(BaseAddr,I_SIR_EOF,val)
 344#define GetSIRBOF(BaseAddr)        ReadReg(BaseAddr,I_SIR_BOF)
 345#define GetSIREOF(BaseAddr)        ReadReg(BaseAddr,I_SIR_EOF)
 346//*******************I_ST_CT_0
 347#define EnPhys(BaseAddr,val)   WriteRegBit(BaseAddr,I_ST_CT_0,7,val)
 348#define IsModeError(BaseAddr) CheckRegBit(BaseAddr,I_ST_CT_0,6) //RO
 349#define IsVFIROn(BaseAddr)     CheckRegBit(BaseAddr,0x14,0)     //RO for VT1211 only
 350#define IsFIROn(BaseAddr)     CheckRegBit(BaseAddr,I_ST_CT_0,5) //RO
 351#define IsMIROn(BaseAddr)     CheckRegBit(BaseAddr,I_ST_CT_0,4) //RO
 352#define IsSIROn(BaseAddr)     CheckRegBit(BaseAddr,I_ST_CT_0,3) //RO
 353#define IsEnableTX(BaseAddr)  CheckRegBit(BaseAddr,I_ST_CT_0,2) //RO
 354#define IsEnableRX(BaseAddr)  CheckRegBit(BaseAddr,I_ST_CT_0,1) //RO
 355#define Is16CRC(BaseAddr)     CheckRegBit(BaseAddr,I_ST_CT_0,0) //RO
 356//***************************I_CF_3
 357#define DisableAdjacentPulseWidth(BaseAddr,val) WriteRegBit(BaseAddr,I_CF_3,5,val)      //1 disable
 358#define DisablePulseWidthAdjust(BaseAddr,val)   WriteRegBit(BaseAddr,I_CF_3,4,val)      //1 disable
 359#define UseOneRX(BaseAddr,val)                  WriteRegBit(BaseAddr,I_CF_3,1,val)      //0 use two RX
 360#define SlowIRRXLowActive(BaseAddr,val)         WriteRegBit(BaseAddr,I_CF_3,0,val)      //0 show RX high=1 in SIR
 361//***************************H_CT
 362#define EnAllInt(BaseAddr,val)   WriteRegBit(BaseAddr,H_CT,7,val)
 363#define TXStart(BaseAddr,val)    WriteRegBit(BaseAddr,H_CT,6,val)
 364#define RXStart(BaseAddr,val)    WriteRegBit(BaseAddr,H_CT,5,val)
 365#define ClearRXInt(BaseAddr,val)   WriteRegBit(BaseAddr,H_CT,4,val)     // 1 clear
 366//*****************H_ST
 367#define IsRXInt(BaseAddr)           CheckRegBit(BaseAddr,H_ST,4)
 368#define GetIntIndentify(BaseAddr)   ((ReadReg(BaseAddr,H_ST)&0xf1) >>1)
 369#define IsHostBusy(BaseAddr)        CheckRegBit(BaseAddr,H_ST,0)
 370#define GetHostStatus(BaseAddr)     ReadReg(BaseAddr,H_ST)      //RO
 371//**************************M_CT
 372#define EnTXDMA(BaseAddr,val)         WriteRegBit(BaseAddr,M_CT,7,val)
 373#define EnRXDMA(BaseAddr,val)         WriteRegBit(BaseAddr,M_CT,6,val)
 374#define SwapDMA(BaseAddr,val)         WriteRegBit(BaseAddr,M_CT,5,val)
 375#define EnInternalLoop(BaseAddr,val)  WriteRegBit(BaseAddr,M_CT,4,val)
 376#define EnExternalLoop(BaseAddr,val)  WriteRegBit(BaseAddr,M_CT,3,val)
 377//**************************TX_CT_1
 378#define EnTXFIFOHalfLevelInt(BaseAddr,val)   WriteRegBit(BaseAddr,TX_CT_1,4,val)        //half empty int (1 half)
 379#define EnTXFIFOUnderrunEOMInt(BaseAddr,val) WriteRegBit(BaseAddr,TX_CT_1,5,val)
 380#define EnTXFIFOReadyInt(BaseAddr,val)       WriteRegBit(BaseAddr,TX_CT_1,6,val)        //int when reach it threshold (setting by bit 4)
 381//**************************TX_CT_2
 382#define ForceUnderrun(BaseAddr,val)   WriteRegBit(BaseAddr,TX_CT_2,7,val)       // force an underrun int
 383#define EnTXCRC(BaseAddr,val)         WriteRegBit(BaseAddr,TX_CT_2,6,val)       //1 for FIR,MIR...0 (not SIR)
 384#define ForceBADCRC(BaseAddr,val)     WriteRegBit(BaseAddr,TX_CT_2,5,val)       //force an bad CRC
 385#define SendSIP(BaseAddr,val)         WriteRegBit(BaseAddr,TX_CT_2,4,val)       //send indication pulse for prevent SIR disturb
 386#define ClearEnTX(BaseAddr,val)       WriteRegBit(BaseAddr,TX_CT_2,3,val)       // opposite to EnTX
 387//*****************TX_ST
 388#define GetTXStatus(BaseAddr)   ReadReg(BaseAddr,TX_ST) //RO
 389//**************************RX_CT
 390#define EnRXSpecInt(BaseAddr,val)           WriteRegBit(BaseAddr,RX_CT,0,val)
 391#define EnRXFIFOReadyInt(BaseAddr,val)      WriteRegBit(BaseAddr,RX_CT,1,val)   //enable int when reach it threshold (setting by bit 7)
 392#define EnRXFIFOHalfLevelInt(BaseAddr,val)  WriteRegBit(BaseAddr,RX_CT,7,val)   //enable int when (1) half full...or (0) just not full
 393//*****************RX_ST
 394#define GetRXStatus(BaseAddr)   ReadReg(BaseAddr,RX_ST) //RO
 395//***********************P_ADDR
 396#define SetPacketAddr(BaseAddr,addr)        WriteReg(BaseAddr,P_ADDR,addr)
 397//***********************I_CF_4
 398#define EnGPIOtoRX2(BaseAddr,val)       WriteRegBit(BaseAddr,I_CF_4,7,val)
 399#define EnTimerInt(BaseAddr,val)                WriteRegBit(BaseAddr,I_CF_4,1,val)
 400#define ClearTimerInt(BaseAddr,val)     WriteRegBit(BaseAddr,I_CF_4,0,val)
 401//***********************I_T_C_L
 402#define WriteGIO(BaseAddr,val)      WriteRegBit(BaseAddr,I_T_C_L,7,val)
 403#define ReadGIO(BaseAddr)                   CheckRegBit(BaseAddr,I_T_C_L,7)
 404#define ReadRX(BaseAddr)                    CheckRegBit(BaseAddr,I_T_C_L,3)     //RO
 405#define WriteTX(BaseAddr,val)           WriteRegBit(BaseAddr,I_T_C_L,0,val)
 406//***********************I_T_C_H
 407#define EnRX2(BaseAddr,val)                 WriteRegBit(BaseAddr,I_T_C_H,7,val)
 408#define ReadRX2(BaseAddr)           CheckRegBit(BaseAddr,I_T_C_H,7)
 409//**********************Version
 410#define GetFIRVersion(BaseAddr)         ReadReg(BaseAddr,VERSION)
 411
 412
 413static void SetTimer(__u16 iobase, __u8 count)
 414{
 415        EnTimerInt(iobase, OFF);
 416        WriteReg(iobase, TIMER, count);
 417        EnTimerInt(iobase, ON);
 418}
 419
 420
 421static void SetSendByte(__u16 iobase, __u32 count)
 422{
 423        __u32 low, high;
 424
 425        if ((count & 0xf000) == 0) {
 426                low = count & 0x00ff;
 427                high = (count & 0x0f00) >> 8;
 428                WriteReg(iobase, TX_C_L, low);
 429                WriteReg(iobase, TX_C_H, high);
 430        }
 431}
 432
 433static void ResetChip(__u16 iobase, __u8 type)
 434{
 435        __u8 value;
 436
 437        value = (type + 2) << 4;
 438        WriteReg(iobase, RESET, type);
 439}
 440
 441static int CkRxRecv(__u16 iobase, struct via_ircc_cb *self)
 442{
 443        __u8 low, high;
 444        __u16 wTmp = 0, wTmp1 = 0, wTmp_new = 0;
 445
 446        low = ReadReg(iobase, RX_C_L);
 447        high = ReadReg(iobase, RX_C_H);
 448        wTmp1 = high;
 449        wTmp = (wTmp1 << 8) | low;
 450        udelay(10);
 451        low = ReadReg(iobase, RX_C_L);
 452        high = ReadReg(iobase, RX_C_H);
 453        wTmp1 = high;
 454        wTmp_new = (wTmp1 << 8) | low;
 455        if (wTmp_new != wTmp)
 456                return 1;
 457        else
 458                return 0;
 459
 460}
 461
 462static __u16 RxCurCount(__u16 iobase, struct via_ircc_cb * self)
 463{
 464        __u8 low, high;
 465        __u16 wTmp = 0, wTmp1 = 0;
 466
 467        low = ReadReg(iobase, RX_P_L);
 468        high = ReadReg(iobase, RX_P_H);
 469        wTmp1 = high;
 470        wTmp = (wTmp1 << 8) | low;
 471        return wTmp;
 472}
 473
 474/* This Routine can only use in recevie_complete
 475 * for it will update last count.
 476 */
 477
 478static __u16 GetRecvByte(__u16 iobase, struct via_ircc_cb * self)
 479{
 480        __u8 low, high;
 481        __u16 wTmp, wTmp1, ret;
 482
 483        low = ReadReg(iobase, RX_P_L);
 484        high = ReadReg(iobase, RX_P_H);
 485        wTmp1 = high;
 486        wTmp = (wTmp1 << 8) | low;
 487
 488
 489        if (wTmp >= self->RxLastCount)
 490                ret = wTmp - self->RxLastCount;
 491        else
 492                ret = (0x8000 - self->RxLastCount) + wTmp;
 493        self->RxLastCount = wTmp;
 494
 495/* RX_P is more actually the RX_C
 496 low=ReadReg(iobase,RX_C_L);
 497 high=ReadReg(iobase,RX_C_H);
 498
 499 if(!(high&0xe000)) {
 500         temp=(high<<8)+low;
 501         return temp;
 502 }
 503 else return 0;
 504*/
 505        return ret;
 506}
 507
 508static void Sdelay(__u16 scale)
 509{
 510        __u8 bTmp;
 511        int i, j;
 512
 513        for (j = 0; j < scale; j++) {
 514                for (i = 0; i < 0x20; i++) {
 515                        bTmp = inb(0xeb);
 516                        outb(bTmp, 0xeb);
 517                }
 518        }
 519}
 520
 521static void Tdelay(__u16 scale)
 522{
 523        __u8 bTmp;
 524        int i, j;
 525
 526        for (j = 0; j < scale; j++) {
 527                for (i = 0; i < 0x50; i++) {
 528                        bTmp = inb(0xeb);
 529                        outb(bTmp, 0xeb);
 530                }
 531        }
 532}
 533
 534
 535static void ActClk(__u16 iobase, __u8 value)
 536{
 537        __u8 bTmp;
 538        bTmp = ReadReg(iobase, 0x34);
 539        if (value)
 540                WriteReg(iobase, 0x34, bTmp | Clk_bit);
 541        else
 542                WriteReg(iobase, 0x34, bTmp & ~Clk_bit);
 543}
 544
 545static void ClkTx(__u16 iobase, __u8 Clk, __u8 Tx)
 546{
 547        __u8 bTmp;
 548
 549        bTmp = ReadReg(iobase, 0x34);
 550        if (Clk == 0)
 551                bTmp &= ~Clk_bit;
 552        else {
 553                if (Clk == 1)
 554                        bTmp |= Clk_bit;
 555        }
 556        WriteReg(iobase, 0x34, bTmp);
 557        Sdelay(1);
 558        if (Tx == 0)
 559                bTmp &= ~Tx_bit;
 560        else {
 561                if (Tx == 1)
 562                        bTmp |= Tx_bit;
 563        }
 564        WriteReg(iobase, 0x34, bTmp);
 565}
 566
 567static void Wr_Byte(__u16 iobase, __u8 data)
 568{
 569        __u8 bData = data;
 570//      __u8 btmp;
 571        int i;
 572
 573        ClkTx(iobase, 0, 1);
 574
 575        Tdelay(2);
 576        ActClk(iobase, 1);
 577        Tdelay(1);
 578
 579        for (i = 0; i < 8; i++) {       //LDN
 580
 581                if ((bData >> i) & 0x01) {
 582                        ClkTx(iobase, 0, 1);    //bit data = 1;
 583                } else {
 584                        ClkTx(iobase, 0, 0);    //bit data = 1;
 585                }
 586                Tdelay(2);
 587                Sdelay(1);
 588                ActClk(iobase, 1);      //clk hi
 589                Tdelay(1);
 590        }
 591}
 592
 593static __u8 Rd_Indx(__u16 iobase, __u8 addr, __u8 index)
 594{
 595        __u8 data = 0, bTmp, data_bit;
 596        int i;
 597
 598        bTmp = addr | (index << 1) | 0;
 599        ClkTx(iobase, 0, 0);
 600        Tdelay(2);
 601        ActClk(iobase, 1);
 602        udelay(1);
 603        Wr_Byte(iobase, bTmp);
 604        Sdelay(1);
 605        ClkTx(iobase, 0, 0);
 606        Tdelay(2);
 607        for (i = 0; i < 10; i++) {
 608                ActClk(iobase, 1);
 609                Tdelay(1);
 610                ActClk(iobase, 0);
 611                Tdelay(1);
 612                ClkTx(iobase, 0, 1);
 613                Tdelay(1);
 614                bTmp = ReadReg(iobase, 0x34);
 615                if (!(bTmp & Rd_Valid))
 616                        break;
 617        }
 618        if (!(bTmp & Rd_Valid)) {
 619                for (i = 0; i < 8; i++) {
 620                        ActClk(iobase, 1);
 621                        Tdelay(1);
 622                        ActClk(iobase, 0);
 623                        bTmp = ReadReg(iobase, 0x34);
 624                        data_bit = 1 << i;
 625                        if (bTmp & RxBit)
 626                                data |= data_bit;
 627                        else
 628                                data &= ~data_bit;
 629                        Tdelay(2);
 630                }
 631        } else {
 632                for (i = 0; i < 2; i++) {
 633                        ActClk(iobase, 1);
 634                        Tdelay(1);
 635                        ActClk(iobase, 0);
 636                        Tdelay(2);
 637                }
 638                bTmp = ReadReg(iobase, 0x34);
 639        }
 640        for (i = 0; i < 1; i++) {
 641                ActClk(iobase, 1);
 642                Tdelay(1);
 643                ActClk(iobase, 0);
 644                Tdelay(2);
 645        }
 646        ClkTx(iobase, 0, 0);
 647        Tdelay(1);
 648        for (i = 0; i < 3; i++) {
 649                ActClk(iobase, 1);
 650                Tdelay(1);
 651                ActClk(iobase, 0);
 652                Tdelay(2);
 653        }
 654        return data;
 655}
 656
 657static void Wr_Indx(__u16 iobase, __u8 addr, __u8 index, __u8 data)
 658{
 659        int i;
 660        __u8 bTmp;
 661
 662        ClkTx(iobase, 0, 0);
 663        udelay(2);
 664        ActClk(iobase, 1);
 665        udelay(1);
 666        bTmp = addr | (index << 1) | 1;
 667        Wr_Byte(iobase, bTmp);
 668        Wr_Byte(iobase, data);
 669        for (i = 0; i < 2; i++) {
 670                ClkTx(iobase, 0, 0);
 671                Tdelay(2);
 672                ActClk(iobase, 1);
 673                Tdelay(1);
 674        }
 675        ActClk(iobase, 0);
 676}
 677
 678static void ResetDongle(__u16 iobase)
 679{
 680        int i;
 681        ClkTx(iobase, 0, 0);
 682        Tdelay(1);
 683        for (i = 0; i < 30; i++) {
 684                ActClk(iobase, 1);
 685                Tdelay(1);
 686                ActClk(iobase, 0);
 687                Tdelay(1);
 688        }
 689        ActClk(iobase, 0);
 690}
 691
 692static void SetSITmode(__u16 iobase)
 693{
 694
 695        __u8 bTmp;
 696
 697        bTmp = ReadLPCReg(0x28);
 698        WriteLPCReg(0x28, bTmp | 0x10); //select ITMOFF
 699        bTmp = ReadReg(iobase, 0x35);
 700        WriteReg(iobase, 0x35, bTmp | 0x40);    // Driver ITMOFF
 701        WriteReg(iobase, 0x28, bTmp | 0x80);    // enable All interrupt
 702}
 703
 704static void SI_SetMode(__u16 iobase, int mode)
 705{
 706        //__u32 dTmp;
 707        __u8 bTmp;
 708
 709        WriteLPCReg(0x28, 0x70);        // S/W Reset
 710        SetSITmode(iobase);
 711        ResetDongle(iobase);
 712        udelay(10);
 713        Wr_Indx(iobase, 0x40, 0x0, 0x17);       //RX ,APEN enable,Normal power
 714        Wr_Indx(iobase, 0x40, 0x1, mode);       //Set Mode
 715        Wr_Indx(iobase, 0x40, 0x2, 0xff);       //Set power to FIR VFIR > 1m
 716        bTmp = Rd_Indx(iobase, 0x40, 1);
 717}
 718
 719static void InitCard(__u16 iobase)
 720{
 721        ResetChip(iobase, 5);
 722        WriteReg(iobase, I_ST_CT_0, 0x00);      // open CHIP on
 723        SetSIRBOF(iobase, 0xc0);        // hardware default value
 724        SetSIREOF(iobase, 0xc1);
 725}
 726
 727static void CommonInit(__u16 iobase)
 728{
 729//  EnTXCRC(iobase,0);
 730        SwapDMA(iobase, OFF);
 731        SetMaxRxPacketSize(iobase, 0x0fff);     //set to max:4095
 732        EnRXFIFOReadyInt(iobase, OFF);
 733        EnRXFIFOHalfLevelInt(iobase, OFF);
 734        EnTXFIFOHalfLevelInt(iobase, OFF);
 735        EnTXFIFOUnderrunEOMInt(iobase, ON);
 736//  EnTXFIFOReadyInt(iobase,ON);
 737        InvertTX(iobase, OFF);
 738        InvertRX(iobase, OFF);
 739//  WriteLPCReg(0xF0,0); //(if VT1211 then do this)
 740        if (IsSIROn(iobase)) {
 741                SIRFilter(iobase, ON);
 742                SIRRecvAny(iobase, ON);
 743        } else {
 744                SIRFilter(iobase, OFF);
 745                SIRRecvAny(iobase, OFF);
 746        }
 747        EnRXSpecInt(iobase, ON);
 748        WriteReg(iobase, I_ST_CT_0, 0x80);
 749        EnableDMA(iobase, ON);
 750}
 751
 752static void SetBaudRate(__u16 iobase, __u32 rate)
 753{
 754        __u8 value = 11, temp;
 755
 756        if (IsSIROn(iobase)) {
 757                switch (rate) {
 758                case (__u32) (2400L):
 759                        value = 47;
 760                        break;
 761                case (__u32) (9600L):
 762                        value = 11;
 763                        break;
 764                case (__u32) (19200L):
 765                        value = 5;
 766                        break;
 767                case (__u32) (38400L):
 768                        value = 2;
 769                        break;
 770                case (__u32) (57600L):
 771                        value = 1;
 772                        break;
 773                case (__u32) (115200L):
 774                        value = 0;
 775                        break;
 776                default:
 777                        break;
 778                };
 779        } else if (IsMIROn(iobase)) {
 780                value = 0;      // will automatically be fixed in 1.152M
 781        } else if (IsFIROn(iobase)) {
 782                value = 0;      // will automatically be fixed in 4M
 783        }
 784        temp = (ReadReg(iobase, I_CF_H_1) & 0x03);
 785        temp |= value << 2;
 786        WriteReg(iobase, I_CF_H_1, temp);
 787}
 788
 789static void SetPulseWidth(__u16 iobase, __u8 width)
 790{
 791        __u8 temp, temp1, temp2;
 792
 793        temp = (ReadReg(iobase, I_CF_L_1) & 0x1f);
 794        temp1 = (ReadReg(iobase, I_CF_H_1) & 0xfc);
 795        temp2 = (width & 0x07) << 5;
 796        temp |= temp2;
 797        temp2 = (width & 0x18) >> 3;
 798        temp1 |= temp2;
 799        WriteReg(iobase, I_CF_L_1, temp);
 800        WriteReg(iobase, I_CF_H_1, temp1);
 801}
 802
 803static void SetSendPreambleCount(__u16 iobase, __u8 count)
 804{
 805        __u8 temp;
 806
 807        temp = ReadReg(iobase, I_CF_L_1) & 0xe0;
 808        temp |= count;
 809        WriteReg(iobase, I_CF_L_1, temp);
 810
 811}
 812
 813static void SetVFIR(__u16 BaseAddr, __u8 val)
 814{
 815        __u8 tmp;
 816
 817        tmp = ReadReg(BaseAddr, I_CF_L_0);
 818        WriteReg(BaseAddr, I_CF_L_0, tmp & 0x8f);
 819        WriteRegBit(BaseAddr, I_CF_H_0, 5, val);
 820}
 821
 822static void SetFIR(__u16 BaseAddr, __u8 val)
 823{
 824        __u8 tmp;
 825
 826        WriteRegBit(BaseAddr, I_CF_H_0, 5, 0);
 827        tmp = ReadReg(BaseAddr, I_CF_L_0);
 828        WriteReg(BaseAddr, I_CF_L_0, tmp & 0x8f);
 829        WriteRegBit(BaseAddr, I_CF_L_0, 6, val);
 830}
 831
 832static void SetMIR(__u16 BaseAddr, __u8 val)
 833{
 834        __u8 tmp;
 835
 836        WriteRegBit(BaseAddr, I_CF_H_0, 5, 0);
 837        tmp = ReadReg(BaseAddr, I_CF_L_0);
 838        WriteReg(BaseAddr, I_CF_L_0, tmp & 0x8f);
 839        WriteRegBit(BaseAddr, I_CF_L_0, 5, val);
 840}
 841
 842static void SetSIR(__u16 BaseAddr, __u8 val)
 843{
 844        __u8 tmp;
 845
 846        WriteRegBit(BaseAddr, I_CF_H_0, 5, 0);
 847        tmp = ReadReg(BaseAddr, I_CF_L_0);
 848        WriteReg(BaseAddr, I_CF_L_0, tmp & 0x8f);
 849        WriteRegBit(BaseAddr, I_CF_L_0, 4, val);
 850}
 851
 852#endif                          /* via_IRCC_H */
 853
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.