linux/drivers/staging/vt6656/mac.c
<<
>>
Prefs
   1/*
   2 * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
   3 * All rights reserved.
   4 *
   5 * This program is free software; you can redistribute it and/or modify
   6 * it under the terms of the GNU General Public License as published by
   7 * the Free Software Foundation; either version 2 of the License, or
   8 * (at your option) any later version.
   9 *
  10 * This program is distributed in the hope that it will be useful,
  11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13 * GNU General Public License for more details.
  14 *
  15 * You should have received a copy of the GNU General Public License along
  16 * with this program; if not, write to the Free Software Foundation, Inc.,
  17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  18 *
  19 *
  20 * File: mac.c
  21 *
  22 * Purpose:  MAC routines
  23 *
  24 * Author: Tevin Chen
  25 *
  26 * Date: May 21, 1996
  27 *
  28 * Functions:
  29 *
  30 * Revision History:
  31 */
  32
  33#include "tmacro.h"
  34#include "tether.h"
  35#include "desc.h"
  36#include "mac.h"
  37#include "80211hdr.h"
  38#include "rndis.h"
  39#include "control.h"
  40
  41/*---------------------  Static Definitions -------------------------*/
  42//static int          msglevel                =MSG_LEVEL_DEBUG;
  43static int          msglevel                =MSG_LEVEL_INFO;
  44/*---------------------  Static Classes  ----------------------------*/
  45
  46/*---------------------  Static Variables  --------------------------*/
  47
  48/*---------------------  Static Functions  --------------------------*/
  49
  50/*---------------------  Export Variables  --------------------------*/
  51
  52/*---------------------  Export Functions  --------------------------*/
  53
  54
  55
  56
  57
  58/*
  59 * Description:
  60 *      Set this hash index into multicast address register bit
  61 *
  62 * Parameters:
  63 *  In:
  64 *      byHashIdx   - Hash index to set
  65 *  Out:
  66 *      none
  67 *
  68 * Return Value: none
  69 *
  70 */
  71void MACvSetMultiAddrByHash (PSDevice pDevice, BYTE byHashIdx)
  72{
  73    unsigned int            uByteIdx;
  74    BYTE            byBitMask;
  75    BYTE            pbyData[2];
  76
  77
  78    // calculate byte position
  79    uByteIdx = byHashIdx / 8;
  80
  81    // calculate bit position
  82    byBitMask = 1;
  83    byBitMask <<= (byHashIdx % 8);
  84    // turn on the bit
  85
  86    pbyData[0] = byBitMask;
  87    pbyData[1] = byBitMask;
  88
  89    CONTROLnsRequestOut(pDevice,
  90                        MESSAGE_TYPE_WRITE_MASK,
  91                        (WORD) (MAC_REG_MAR0 + uByteIdx),
  92                        MESSAGE_REQUEST_MACREG,
  93                        2,
  94                        pbyData);
  95}
  96
  97
  98
  99/*
 100 * Description:
 101 *      Write MAC Multicast Address Mask
 102 *
 103 * Parameters:
 104 *  In:
 105 *      uByteidx    - Index of Mask
 106 *      byData      - Mask Value to write
 107 *  Out:
 108 *      none
 109 *
 110 * Return Value: none
 111 *
 112 */
 113void MACvWriteMultiAddr(PSDevice pDevice, unsigned int uByteIdx, BYTE byData)
 114{
 115    BYTE            byData1;
 116
 117    byData1 = byData;
 118    CONTROLnsRequestOut(pDevice,
 119                        MESSAGE_TYPE_WRITE,
 120                        (WORD) (MAC_REG_MAR0 + uByteIdx),
 121                        MESSAGE_REQUEST_MACREG,
 122                        1,
 123                        &byData1);
 124}
 125
 126
 127/*
 128 * Description:
 129 *      Shut Down MAC
 130 *
 131 * Parameters:
 132 *  In:
 133 *  Out:
 134 *      none
 135 *
 136 * Return Value: TRUE if success; otherwise FALSE
 137 *
 138 */
 139BOOL MACbShutdown (PSDevice pDevice)
 140{
 141    CONTROLnsRequestOutAsyn(pDevice,
 142                        MESSAGE_TYPE_MACSHUTDOWN,
 143                        0,
 144                        0,
 145                        0,
 146                        NULL
 147                        );
 148    return TRUE;
 149}
 150
 151void MACvSetBBType(PSDevice pDevice,BYTE byType)
 152{
 153BYTE            pbyData[2];
 154
 155
 156    pbyData[0] = byType;
 157    pbyData[1] = EnCFG_BBType_MASK;
 158
 159    CONTROLnsRequestOut(pDevice,
 160                        MESSAGE_TYPE_WRITE_MASK,
 161                        MAC_REG_ENCFG0,
 162                        MESSAGE_REQUEST_MACREG,
 163                        2,
 164                        pbyData
 165                        );
 166}
 167
 168void MACvSetMISCFifo (PSDevice pDevice, WORD wOffset, DWORD dwData)
 169{
 170BYTE    pbyData[4];
 171
 172    if (wOffset > 273)
 173        return;
 174    pbyData[0] = (BYTE)dwData;
 175    pbyData[1] = (BYTE)(dwData>>8);
 176    pbyData[2] = (BYTE)(dwData>>16);
 177    pbyData[3] = (BYTE)(dwData>>24);
 178
 179    CONTROLnsRequestOut(pDevice,
 180                        MESSAGE_TYPE_WRITE_MISCFF,
 181                        wOffset,
 182                        0,
 183                        4,
 184                        pbyData
 185                        );
 186}
 187
 188/*
 189 * Description:
 190 *      Disable the Key Entry by MISCFIFO
 191 *
 192 * Parameters:
 193 *  In:
 194 *      dwIoBase        - Base Address for MAC
 195 *
 196 *  Out:
 197 *      none
 198 *
 199 * Return Value: none
 200 *
 201 */
 202void MACvDisableKeyEntry(PSDevice pDevice, unsigned int uEntryIdx)
 203{
 204WORD    wOffset;
 205BYTE            byData;
 206
 207
 208    byData = (BYTE) uEntryIdx;
 209
 210    wOffset = MISCFIFO_KEYETRY0;
 211    wOffset += (uEntryIdx * MISCFIFO_KEYENTRYSIZE);
 212
 213    //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset);
 214    //VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, 0);
 215    //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE);
 216
 217    //issue write misc fifo command to device
 218    CONTROLnsRequestOut(pDevice,
 219                        MESSAGE_TYPE_CLRKEYENTRY,
 220                        0,
 221                        0,
 222                        1,
 223                        &byData
 224                        );
 225}
 226
 227
 228/*
 229 * Description:
 230 *      Set the Key by MISCFIFO
 231 *
 232 * Parameters:
 233 *  In:
 234 *      dwIoBase        - Base Address for MAC
 235 *
 236 *  Out:
 237 *      none
 238 *
 239 * Return Value: none
 240 *
 241 */
 242void MACvSetKeyEntry(PSDevice pDevice, WORD wKeyCtl,
 243                     unsigned int uEntryIdx, unsigned int uKeyIdx,
 244                     PBYTE pbyAddr, PDWORD pdwKey)
 245{
 246PBYTE           pbyKey;
 247WORD            wOffset;
 248DWORD           dwData1,dwData2;
 249int             ii;
 250BYTE            pbyData[24];
 251
 252    if ( pDevice->byLocalID <= MAC_REVISION_A1 ) {
 253        if ( pDevice->sMgmtObj.byCSSPK == KEY_CTL_CCMP )
 254            return;
 255    }
 256
 257    wOffset = MISCFIFO_KEYETRY0;
 258    wOffset += (uEntryIdx * MISCFIFO_KEYENTRYSIZE);
 259
 260    dwData1 = 0;
 261    dwData1 |= wKeyCtl;
 262    dwData1 <<= 16;
 263    dwData1 |= MAKEWORD(*(pbyAddr+4), *(pbyAddr+5));
 264
 265    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"1. wOffset: %d, Data: %lX, KeyCtl:%X\n", wOffset, dwData1, wKeyCtl);
 266
 267    //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset);
 268    //VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, dwData);
 269    //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE);
 270
 271    //wOffset++;
 272
 273    dwData2 = 0;
 274    dwData2 |= *(pbyAddr+3);
 275    dwData2 <<= 8;
 276    dwData2 |= *(pbyAddr+2);
 277    dwData2 <<= 8;
 278    dwData2 |= *(pbyAddr+1);
 279    dwData2 <<= 8;
 280    dwData2 |= *(pbyAddr+0);
 281
 282    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"2. wOffset: %d, Data: %lX\n", wOffset, dwData2);
 283
 284    //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset);
 285    //VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, dwData);
 286    //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE);
 287
 288    //wOffset++;
 289
 290    //wOffset += (uKeyIdx * 4);
 291/*    for (ii=0;ii<4;ii++) {
 292        // alway push 128 bits
 293        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"3.(%d) wOffset: %d, Data: %lX\n", ii, wOffset+ii, *pdwKey);
 294        VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset+ii);
 295        VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, *pdwKey++);
 296        VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE);
 297    }
 298*/
 299    pbyKey = (PBYTE)pdwKey;
 300
 301    pbyData[0] = (BYTE)dwData1;
 302    pbyData[1] = (BYTE)(dwData1>>8);
 303    pbyData[2] = (BYTE)(dwData1>>16);
 304    pbyData[3] = (BYTE)(dwData1>>24);
 305    pbyData[4] = (BYTE)dwData2;
 306    pbyData[5] = (BYTE)(dwData2>>8);
 307    pbyData[6] = (BYTE)(dwData2>>16);
 308    pbyData[7] = (BYTE)(dwData2>>24);
 309    for (ii = 8; ii < 24; ii++)
 310        pbyData[ii] = *pbyKey++;
 311
 312    CONTROLnsRequestOut(pDevice,
 313                        MESSAGE_TYPE_SETKEY,
 314                        wOffset,
 315                        (WORD)uKeyIdx,
 316                        24,
 317                        pbyData
 318                        );
 319
 320
 321}
 322
 323
 324void MACvRegBitsOff(PSDevice pDevice, BYTE byRegOfs, BYTE byBits)
 325{
 326BYTE            pbyData[2];
 327
 328    pbyData[0] = 0;
 329    pbyData[1] = byBits;
 330
 331    CONTROLnsRequestOut(pDevice,
 332                        MESSAGE_TYPE_WRITE_MASK,
 333                        byRegOfs,
 334                        MESSAGE_REQUEST_MACREG,
 335                        2,
 336                        pbyData
 337                        );
 338}
 339
 340
 341void MACvRegBitsOn(PSDevice pDevice, BYTE byRegOfs, BYTE byBits)
 342{
 343BYTE            pbyData[2];
 344
 345
 346    pbyData[0] = byBits;
 347    pbyData[1] = byBits;
 348
 349    CONTROLnsRequestOut(pDevice,
 350                        MESSAGE_TYPE_WRITE_MASK,
 351                        byRegOfs,
 352                        MESSAGE_REQUEST_MACREG,
 353                        2,
 354                        pbyData
 355                        );
 356}
 357
 358void MACvWriteWord(PSDevice pDevice, BYTE byRegOfs, WORD wData)
 359{
 360BYTE            pbyData[2];
 361
 362
 363    pbyData[0] = (BYTE)(wData & 0xff);
 364    pbyData[1] = (BYTE)(wData >> 8);
 365
 366    CONTROLnsRequestOut(pDevice,
 367                        MESSAGE_TYPE_WRITE,
 368                        byRegOfs,
 369                        MESSAGE_REQUEST_MACREG,
 370                        2,
 371                        pbyData
 372                        );
 373
 374}
 375
 376void MACvWriteBSSIDAddress(PSDevice pDevice, PBYTE pbyEtherAddr)
 377{
 378BYTE            pbyData[6];
 379
 380
 381    pbyData[0] = *((PBYTE)pbyEtherAddr);
 382    pbyData[1] = *((PBYTE)pbyEtherAddr+1);
 383    pbyData[2] = *((PBYTE)pbyEtherAddr+2);
 384    pbyData[3] = *((PBYTE)pbyEtherAddr+3);
 385    pbyData[4] = *((PBYTE)pbyEtherAddr+4);
 386    pbyData[5] = *((PBYTE)pbyEtherAddr+5);
 387
 388    CONTROLnsRequestOut(pDevice,
 389                        MESSAGE_TYPE_WRITE,
 390                        MAC_REG_BSSID0,
 391                        MESSAGE_REQUEST_MACREG,
 392                        6,
 393                        pbyData
 394                        );
 395}
 396
 397void MACvEnableProtectMD(PSDevice pDevice)
 398{
 399BYTE            pbyData[2];
 400
 401
 402    pbyData[0] = EnCFG_ProtectMd;
 403    pbyData[1] = EnCFG_ProtectMd;
 404
 405    CONTROLnsRequestOut(pDevice,
 406                        MESSAGE_TYPE_WRITE_MASK,
 407                        MAC_REG_ENCFG0,
 408                        MESSAGE_REQUEST_MACREG,
 409                        2,
 410                        pbyData
 411                        );
 412}
 413
 414void MACvDisableProtectMD(PSDevice pDevice)
 415{
 416BYTE            pbyData[2];
 417
 418
 419    pbyData[0] = 0;
 420    pbyData[1] = EnCFG_ProtectMd;
 421
 422    CONTROLnsRequestOut(pDevice,
 423                        MESSAGE_TYPE_WRITE_MASK,
 424                        MAC_REG_ENCFG0,
 425                        MESSAGE_REQUEST_MACREG,
 426                        2,
 427                        pbyData
 428                        );
 429}
 430
 431void MACvEnableBarkerPreambleMd(PSDevice pDevice)
 432{
 433BYTE            pbyData[2];
 434
 435
 436    pbyData[0] = EnCFG_BarkerPream;
 437    pbyData[1] = EnCFG_BarkerPream;
 438
 439    CONTROLnsRequestOut(pDevice,
 440                        MESSAGE_TYPE_WRITE_MASK,
 441                        MAC_REG_ENCFG2,
 442                        MESSAGE_REQUEST_MACREG,
 443                        2,
 444                        pbyData
 445                        );
 446}
 447
 448void MACvDisableBarkerPreambleMd(PSDevice pDevice)
 449{
 450BYTE            pbyData[2];
 451
 452
 453    pbyData[0] = 0;
 454    pbyData[1] = EnCFG_BarkerPream;
 455
 456    CONTROLnsRequestOut(pDevice,
 457                        MESSAGE_TYPE_WRITE_MASK,
 458                        MAC_REG_ENCFG2,
 459                        MESSAGE_REQUEST_MACREG,
 460                        2,
 461                        pbyData
 462                        );
 463}
 464
 465
 466void MACvWriteBeaconInterval(PSDevice pDevice, WORD wInterval)
 467{
 468BYTE            pbyData[2];
 469
 470    pbyData[0] = (BYTE) (wInterval & 0xff);
 471    pbyData[1] = (BYTE) (wInterval >> 8);
 472
 473    CONTROLnsRequestOut(pDevice,
 474                        MESSAGE_TYPE_WRITE,
 475                        MAC_REG_BI,
 476                        MESSAGE_REQUEST_MACREG,
 477                        2,
 478                        pbyData
 479                        );
 480}
 481