15b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/************************************************************************** 25b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectEtherboot - BOOTP/TFTP Bootstrap Program 35b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectTLAN driver for Etherboot 45b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project***************************************************************************/ 55b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 65b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* 75b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This program is free software; you can redistribute it and/or 85b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * modify it under the terms of the GNU General Public License as 95b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * published by the Free Software Foundation; either version 2, or (at 105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * your option) any later version. 115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* to get some global routines like printf */ 145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include "etherboot.h" 155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* to get the interface to the body of the program */ 165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include "nic.h" 175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* to get the PCI support functions, if this is a PCI NIC */ 185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include "pci.h" 195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* to get our own prototype */ 205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include "cards.h" 215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /***************************************************************** 235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLan Definitions 245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ****************************************************************/ 265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_MIN_FRAME_SIZE 64 285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_MAX_FRAME_SIZE 1600 295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NUM_RX_LISTS 32 315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NUM_TX_LISTS 64 325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_IGNORE 0 345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_RECORD 1 355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_DBG(lvl, format, args...) if (debug&lvl) printf("TLAN: " format, ##args ); 375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_DEBUG_GNRL 0x0001 385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_DEBUG_TX 0x0002 395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_DEBUG_RX 0x0004 405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_DEBUG_LIST 0x0008 415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_DEBUG_PROBE 0x0010 425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MAX_TLAN_BOARDS 8 /* Max number of boards installed at a time */ 445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /***************************************************************** 465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Device Identification Definitions 475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ****************************************************************/ 495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define PCI_DEVICE_ID_NETELLIGENT_10_T2 0xB012 515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define PCI_DEVICE_ID_NETELLIGENT_10_100_WS_5100 0xB030 525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifndef PCI_DEVICE_ID_OLICOM_OC2183 535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define PCI_DEVICE_ID_OLICOM_OC2183 0x0013 545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif 555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifndef PCI_DEVICE_ID_OLICOM_OC2325 565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define PCI_DEVICE_ID_OLICOM_OC2325 0x0012 575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif 585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifndef PCI_DEVICE_ID_OLICOM_OC2326 595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define PCI_DEVICE_ID_OLICOM_OC2326 0x0014 605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif 615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_ADAPTER_NONE 0x00000000 625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_ADAPTER_UNMANAGED_PHY 0x00000001 635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_ADAPTER_BIT_RATE_PHY 0x00000002 645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_ADAPTER_USE_INTERN_10 0x00000004 655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_ADAPTER_ACTIVITY_LED 0x00000008 665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_SPEED_DEFAULT 0 675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_SPEED_10 10 685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_SPEED_100 100 695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_DUPLEX_DEFAULT 0 705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_DUPLEX_HALF 1 715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_DUPLEX_FULL 2 725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_BUFFERS_PER_LIST 10 735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_LAST_BUFFER 0x80000000 745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_CSTAT_UNUSED 0x8000 755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_CSTAT_FRM_CMP 0x4000 765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_CSTAT_READY 0x3000 775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_CSTAT_EOC 0x0800 785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_CSTAT_RX_ERROR 0x0400 795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_CSTAT_PASS_CRC 0x0200 805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_CSTAT_DP_PR 0x0100 815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /***************************************************************** 835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * PHY definitions 845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ****************************************************************/ 865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_PHY_MAX_ADDR 0x1F 885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_PHY_NONE 0x20 895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /***************************************************************** 915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLan Driver Timer Definitions 925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ****************************************************************/ 945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_TIMER_LINK_BEAT 1 965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_TIMER_ACTIVITY 2 975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_TIMER_PHY_PDOWN 3 985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_TIMER_PHY_PUP 4 995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_TIMER_PHY_RESET 5 1005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_TIMER_PHY_START_LINK 6 1015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_TIMER_PHY_FINISH_AN 7 1025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_TIMER_FINISH_RESET 8 1035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_TIMER_ACT_DELAY (HZ/10) 1045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /***************************************************************** 1065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLan Driver Eeprom Definitions 1075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 1085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ****************************************************************/ 1095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_EEPROM_ACK 0 1115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_EEPROM_STOP 1 1125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /***************************************************************** 1145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Host Register Offsets and Contents 1155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 1165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ****************************************************************/ 1175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_HOST_CMD 0x00 1195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_HC_GO 0x80000000 1205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_HC_STOP 0x40000000 1215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_HC_ACK 0x20000000 1225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_HC_CS_MASK 0x1FE00000 1235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_HC_EOC 0x00100000 1245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_HC_RT 0x00080000 1255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_HC_NES 0x00040000 1265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_HC_AD_RST 0x00008000 1275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_HC_LD_TMR 0x00004000 1285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_HC_LD_THR 0x00002000 1295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_HC_REQ_INT 0x00001000 1305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_HC_INT_OFF 0x00000800 1315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_HC_INT_ON 0x00000400 1325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_HC_AC_MASK 0x000000FF 1335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_CH_PARM 0x04 1345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_DIO_ADR 0x08 1355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_DA_ADR_INC 0x8000 1365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_DA_RAM_ADR 0x4000 1375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_HOST_INT 0x0A 1385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_HI_IV_MASK 0x1FE0 1395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_HI_IT_MASK 0x001C 1405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_DIO_DATA 0x0C 1415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* ThunderLAN Internal Register DIO Offsets */ 1435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_CMD 0x00 1455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_CMD_NRESET 0x80 1465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_CMD_NWRAP 0x40 1475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_CMD_CSF 0x20 1485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_CMD_CAF 0x10 1495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_CMD_NOBRX 0x08 1505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_CMD_DUPLEX 0x04 1515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_CMD_TRFRAM 0x02 1525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_CMD_TXPACE 0x01 1535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_SIO 0x01 1545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_SIO_MINTEN 0x80 1555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_SIO_ECLOK 0x40 1565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_SIO_ETXEN 0x20 1575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_SIO_EDATA 0x10 1585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_SIO_NMRST 0x08 1595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_SIO_MCLK 0x04 1605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_SIO_MTXEN 0x02 1615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_SIO_MDATA 0x01 1625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_STS 0x02 1635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_STS_MIRQ 0x80 1645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_STS_HBEAT 0x40 1655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_STS_TXSTOP 0x20 1665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_STS_RXSTOP 0x10 1675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_STS_RSRVD 0x0F 1685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_MASK 0x03 1695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_MASK_MASK7 0x80 1705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_MASK_MASK6 0x40 1715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_MASK_MASK5 0x20 1725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_MASK_MASK4 0x10 1735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_MASK_RSRVD 0x0F 1745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_CONFIG 0x04 1755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_CFG_RCLK 0x8000 1765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_CFG_TCLK 0x4000 1775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_CFG_BIT 0x2000 1785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_CFG_RXCRC 0x1000 1795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_CFG_PEF 0x0800 1805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_CFG_1FRAG 0x0400 1815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_CFG_1CHAN 0x0200 1825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_CFG_MTEST 0x0100 1835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_CFG_PHY_EN 0x0080 1845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_CFG_MSMASK 0x007F 1855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_MAN_TEST 0x06 1865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_DEF_VENDOR_ID 0x08 1875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_DEF_DEVICE_ID 0x0A 1885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_DEF_REVISION 0x0C 1895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_DEF_SUBCLASS 0x0D 1905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_DEF_MIN_LAT 0x0E 1915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_DEF_MAX_LAT 0x0F 1925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_AREG_0 0x10 1935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_AREG_1 0x16 1945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_AREG_2 0x1C 1955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_AREG_3 0x22 1965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_HASH_1 0x28 1975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_HASH_2 0x2C 1985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_GOOD_TX_FRMS 0x30 1995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_TX_UNDERUNS 0x33 2005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_GOOD_RX_FRMS 0x34 2015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_RX_OVERRUNS 0x37 2025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_DEFERRED_TX 0x38 2035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_CRC_ERRORS 0x3A 2045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_CODE_ERRORS 0x3B 2055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_MULTICOL_FRMS 0x3C 2065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_SINGLECOL_FRMS 0x3E 2075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_EXCESSCOL_FRMS 0x40 2085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_LATE_COLS 0x41 2095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_CARRIER_LOSS 0x42 2105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_ACOMMIT 0x43 2115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_LED_REG 0x44 2125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_LED_ACT 0x10 2135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_LED_LINK 0x01 2145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_BSIZE_REG 0x45 2155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_MAX_RX 0x46 2165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_INT_DIS 0x48 2175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_ID_TX_EOC 0x04 2185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_ID_RX_EOF 0x02 2195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_ID_RX_EOC 0x01 2205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* ThunderLAN Interrupt Codes */ 2225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_INT_NUMBER_OF_INTS 8 2245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_INT_NONE 0x0000 2265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_INT_TX_EOF 0x0001 2275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_INT_STAT_OVERFLOW 0x0002 2285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_INT_RX_EOF 0x0003 2295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_INT_DUMMY 0x0004 2305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_INT_TX_EOC 0x0005 2315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_INT_STATUS_CHECK 0x0006 2325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_INT_RX_EOC 0x0007 2335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_TLPHY_ID 0x10 2345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_TLPHY_CTL 0x11 2355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_TC_IGLINK 0x8000 2365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_TC_SWAPOL 0x4000 2375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_TC_AUISEL 0x2000 2385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_TC_SQEEN 0x1000 2395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_TC_MTEST 0x0800 2405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_TC_RESERVED 0x07F8 2415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_TC_NFEW 0x0004 2425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_TC_INTEN 0x0002 2435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_TC_TINT 0x0001 2445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_TLPHY_STS 0x12 2455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_TS_MINT 0x8000 2465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_TS_PHOK 0x4000 2475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_TS_POLOK 0x2000 2485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_TS_TPENERGY 0x1000 2495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_TS_RESERVED 0x0FFF 2505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_TLPHY_PAR 0x19 2515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_PHY_CIM_STAT 0x0020 2525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_PHY_SPEED_100 0x0040 2535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_PHY_DUPLEX_FULL 0x0080 2545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_PHY_AN_EN_STAT 0x0400 2555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* ThunderLAN MII Registers */ 2585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Generic MII/PHY Registers */ 2605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MII_GEN_CTL 0x00 2625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MII_GC_RESET 0x8000 2635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MII_GC_LOOPBK 0x4000 2645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MII_GC_SPEEDSEL 0x2000 2655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MII_GC_AUTOENB 0x1000 2665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MII_GC_PDOWN 0x0800 2675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MII_GC_ISOLATE 0x0400 2685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MII_GC_AUTORSRT 0x0200 2695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MII_GC_DUPLEX 0x0100 2705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MII_GC_COLTEST 0x0080 2715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MII_GC_RESERVED 0x007F 2725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MII_GEN_STS 0x01 2735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MII_GS_100BT4 0x8000 2745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MII_GS_100BTXFD 0x4000 2755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MII_GS_100BTXHD 0x2000 2765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MII_GS_10BTFD 0x1000 2775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MII_GS_10BTHD 0x0800 2785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MII_GS_RESERVED 0x07C0 2795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MII_GS_AUTOCMPLT 0x0020 2805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MII_GS_RFLT 0x0010 2815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MII_GS_AUTONEG 0x0008 2825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MII_GS_LINK 0x0004 2835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MII_GS_JABBER 0x0002 2845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MII_GS_EXTCAP 0x0001 2855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MII_GEN_ID_HI 0x02 2865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MII_GEN_ID_LO 0x03 2875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MII_GIL_OUI 0xFC00 2885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MII_GIL_MODEL 0x03F0 2895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MII_GIL_REVISION 0x000F 2905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MII_AN_ADV 0x04 2915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MII_AN_LPA 0x05 2925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MII_AN_EXP 0x06 2935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* ThunderLAN Specific MII/PHY Registers */ 2955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_TC_IGLINK 0x8000 2975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_TC_SWAPOL 0x4000 2985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_TC_AUISEL 0x2000 2995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_TC_SQEEN 0x1000 3005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_TC_MTEST 0x0800 3015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_TC_RESERVED 0x07F8 3025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_TC_NFEW 0x0004 3035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_TC_INTEN 0x0002 3045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_TC_TINT 0x0001 3055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_TS_MINT 0x8000 3065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_TS_PHOK 0x4000 3075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_TS_POLOK 0x2000 3085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_TS_TPENERGY 0x1000 3095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_TS_RESERVED 0x0FFF 3105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_PHY_CIM_STAT 0x0020 3115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_PHY_SPEED_100 0x0040 3125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_PHY_DUPLEX_FULL 0x0080 3135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_PHY_AN_EN_STAT 0x0400 3145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* National Sem. & Level1 PHY id's */ 3165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define NAT_SEM_ID1 0x2000 3175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define NAT_SEM_ID2 0x5C01 3185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define LEVEL1_ID1 0x7810 3195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define LEVEL1_ID2 0x0000 3205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLan_ClearBit( bit, port ) outb_p(inb_p(port) & ~bit, port) 3225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLan_GetBit( bit, port ) ((int) (inb_p(port) & bit)) 3235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLan_SetBit( bit, port ) outb_p(inb_p(port) | bit, port) 3245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecttypedef unsigned int u32; 3265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecttypedef unsigned short u16; 3275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecttypedef unsigned char u8; 3285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Routines to access internal registers. */ 3305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectinline u8 TLan_DioRead8(u16 base_addr, u16 internal_addr) 3325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 3335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outw(internal_addr, base_addr + TLAN_DIO_ADR); 3345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return (inb((base_addr + TLAN_DIO_DATA) + (internal_addr & 0x3))); 3355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* TLan_DioRead8 */ 3375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectinline u16 TLan_DioRead16(u16 base_addr, u16 internal_addr) 3395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 3405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outw(internal_addr, base_addr + TLAN_DIO_ADR); 3415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return (inw((base_addr + TLAN_DIO_DATA) + (internal_addr & 0x2))); 3425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* TLan_DioRead16 */ 3445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectinline u32 TLan_DioRead32(u16 base_addr, u16 internal_addr) 3465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 3475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outw(internal_addr, base_addr + TLAN_DIO_ADR); 3485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return (inl(base_addr + TLAN_DIO_DATA)); 3495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* TLan_DioRead32 */ 3515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectinline void TLan_DioWrite8(u16 base_addr, u16 internal_addr, u8 data) 3535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 3545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outw(internal_addr, base_addr + TLAN_DIO_ADR); 3555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outb(data, base_addr + TLAN_DIO_DATA + (internal_addr & 0x3)); 3565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 3585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectinline void TLan_DioWrite16(u16 base_addr, u16 internal_addr, u16 data) 3605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 3615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outw(internal_addr, base_addr + TLAN_DIO_ADR); 3625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outw(data, base_addr + TLAN_DIO_DATA + (internal_addr & 0x2)); 3635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 3655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectinline void TLan_DioWrite32(u16 base_addr, u16 internal_addr, u32 data) 3675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 3685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outw(internal_addr, base_addr + TLAN_DIO_ADR); 3695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outl(data, base_addr + TLAN_DIO_DATA + (internal_addr & 0x2)); 3705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 3725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* NIC specific static variables go here */ 3745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/***************************************************************************** 3765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project****************************************************************************** 3775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ThunderLAN Driver Eeprom routines 3795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project The Compaq Netelligent 10 and 10/100 cards use a Microchip 24C02A 3815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project EEPROM. These functions are based on information in Microchip's 3825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project data sheet. I don't know how well this functions will work with 3835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project other EEPROMs. 3845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project****************************************************************************** 3865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project*****************************************************************************/ 3875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /*************************************************************** 3895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLan_EeSendStart 3905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 3915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Returns: 3925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Nothing 3935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Parms: 3945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * io_base The IO port base address for the 3955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLAN device with the EEPROM to 3965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * use. 3975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 3985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This function sends a start cycle to an EEPROM attached 3995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * to a TLAN chip. 4005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 4015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project **************************************************************/ 4025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void TLan_EeSendStart( u16 io_base ) 4045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 4055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u16 sio; 4065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outw( TLAN_NET_SIO, io_base + TLAN_DIO_ADR ); 4085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project sio = io_base + TLAN_DIO_DATA + TLAN_NET_SIO; 4095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_SetBit( TLAN_NET_SIO_ECLOK, sio ); 4115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_SetBit( TLAN_NET_SIO_EDATA, sio ); 4125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_SetBit( TLAN_NET_SIO_ETXEN, sio ); 4135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_ClearBit( TLAN_NET_SIO_EDATA, sio ); 4145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_ClearBit( TLAN_NET_SIO_ECLOK, sio ); 4155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* TLan_EeSendStart */ 4175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /*************************************************************** 4195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLan_EeSendByte 4205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 4215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Returns: 4225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * If the correct ack was received, 0, otherwise 1 4235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Parms: io_base The IO port base address for the 4245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLAN device with the EEPROM to 4255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * use. 4265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * data The 8 bits of information to 4275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * send to the EEPROM. 4285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * stop If TLAN_EEPROM_STOP is passed, a 4295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * stop cycle is sent after the 4305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * byte is sent after the ack is 4315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * read. 4325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 4335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This function sends a byte on the serial EEPROM line, 4345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * driving the clock to send each bit. The function then 4355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * reverses transmission direction and reads an acknowledge 4365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * bit. 4375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 4385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project **************************************************************/ 4395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int TLan_EeSendByte( u16 io_base, u8 data, int stop ) 4415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 4425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int err; 4435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u8 place; 4445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u16 sio; 4455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outw( TLAN_NET_SIO, io_base + TLAN_DIO_ADR ); 4475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project sio = io_base + TLAN_DIO_DATA + TLAN_NET_SIO; 4485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Assume clock is low, tx is enabled; */ 4505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project for ( place = 0x80; place != 0; place >>= 1 ) { 4515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( place & data ) 4525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_SetBit( TLAN_NET_SIO_EDATA, sio ); 4535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project else 4545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_ClearBit( TLAN_NET_SIO_EDATA, sio ); 4555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_SetBit( TLAN_NET_SIO_ECLOK, sio ); 4565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_ClearBit( TLAN_NET_SIO_ECLOK, sio ); 4575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 4585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_ClearBit( TLAN_NET_SIO_ETXEN, sio ); 4595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_SetBit( TLAN_NET_SIO_ECLOK, sio ); 4605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project err = TLan_GetBit( TLAN_NET_SIO_EDATA, sio ); 4615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_ClearBit( TLAN_NET_SIO_ECLOK, sio ); 4625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_SetBit( TLAN_NET_SIO_ETXEN, sio ); 4635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( ( ! err ) && stop ) { 4655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_ClearBit( TLAN_NET_SIO_EDATA, sio ); /* STOP, raise data while clock is high */ 4665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_SetBit( TLAN_NET_SIO_ECLOK, sio ); 4675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_SetBit( TLAN_NET_SIO_EDATA, sio ); 4685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 4695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return ( err ); 4715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* TLan_EeSendByte */ 4735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /*************************************************************** 4755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLan_EeReceiveByte 4765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 4775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Returns: 4785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Nothing 4795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Parms: 4805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * io_base The IO port base address for the 4815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLAN device with the EEPROM to 4825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * use. 4835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * data An address to a char to hold the 4845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * data sent from the EEPROM. 4855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * stop If TLAN_EEPROM_STOP is passed, a 4865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * stop cycle is sent after the 4875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * byte is received, and no ack is 4885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * sent. 4895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 4905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This function receives 8 bits of data from the EEPROM 4915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * over the serial link. It then sends and ack bit, or no 4925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * ack and a stop bit. This function is used to retrieve 4935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * data after the address of a byte in the EEPROM has been 4945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * sent. 4955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 4965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project **************************************************************/ 4975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void TLan_EeReceiveByte( u16 io_base, u8 *data, int stop ) 4995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 5005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u8 place; 5015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u16 sio; 5025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 5035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outw( TLAN_NET_SIO, io_base + TLAN_DIO_ADR ); 5045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project sio = io_base + TLAN_DIO_DATA + TLAN_NET_SIO; 5055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *data = 0; 5065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 5075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Assume clock is low, tx is enabled; */ 5085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_ClearBit( TLAN_NET_SIO_ETXEN, sio ); 5095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project for ( place = 0x80; place; place >>= 1 ) { 5105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_SetBit( TLAN_NET_SIO_ECLOK, sio ); 5115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( TLan_GetBit( TLAN_NET_SIO_EDATA, sio ) ) 5125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *data |= place; 5135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_ClearBit( TLAN_NET_SIO_ECLOK, sio ); 5145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 5155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 5165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_SetBit( TLAN_NET_SIO_ETXEN, sio ); 5175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( ! stop ) { 5185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_ClearBit( TLAN_NET_SIO_EDATA, sio ); /* Ack = 0 */ 5195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_SetBit( TLAN_NET_SIO_ECLOK, sio ); 5205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_ClearBit( TLAN_NET_SIO_ECLOK, sio ); 5215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else { 5225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_SetBit( TLAN_NET_SIO_EDATA, sio ); /* No ack = 1 (?) */ 5235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_SetBit( TLAN_NET_SIO_ECLOK, sio ); 5245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_ClearBit( TLAN_NET_SIO_ECLOK, sio ); 5255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_ClearBit( TLAN_NET_SIO_EDATA, sio ); /* STOP, raise data while clock is high */ 5265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_SetBit( TLAN_NET_SIO_ECLOK, sio ); 5275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_SetBit( TLAN_NET_SIO_EDATA, sio ); 5285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 5295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 5305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* TLan_EeReceiveByte */ 5315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 5325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /*************************************************************** 5335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLan_EeReadByte 5345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 5355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Returns: 5365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * No error = 0, else, the stage at which the error 5375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * occurred. 5385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Parms: 5395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * io_base The IO port base address for the 5405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLAN device with the EEPROM to 5415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * use. 5425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * ee_addr The address of the byte in the 5435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * EEPROM whose contents are to be 5445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * retrieved. 5455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * data An address to a char to hold the 5465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * data obtained from the EEPROM. 5475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 5485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This function reads a byte of information from an byte 5495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * cell in the EEPROM. 5505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 5515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project **************************************************************/ 5525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 5535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int TLan_EeReadByte( u16 io_base, u8 ee_addr, u8 *data ) 5545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 5555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int err; 5565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project unsigned long flags = 0; 5575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int ret=0; 5585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 5595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_EeSendStart( io_base ); 5605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project err = TLan_EeSendByte( io_base, 0xA0, TLAN_EEPROM_ACK ); 5615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (err) 5625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 5635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ret=1; 5645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project goto fail; 5655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 5665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project err = TLan_EeSendByte( io_base, ee_addr, TLAN_EEPROM_ACK ); 5675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (err) 5685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 5695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ret=2; 5705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project goto fail; 5715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 5725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_EeSendStart( io_base ); 5735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project err = TLan_EeSendByte( io_base, 0xA1, TLAN_EEPROM_ACK ); 5745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (err) 5755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 5765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ret=3; 5775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project goto fail; 5785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 5795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_EeReceiveByte( io_base, data, TLAN_EEPROM_STOP ); 5805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectfail: 5815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 5825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return ret; 5835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 5845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* TLan_EeReadByte */ 5855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 5865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#if 0 5875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Not yet converted from Linux driver */ 5885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/***************************************************************************** 5895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project****************************************************************************** 5905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 5915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ThunderLAN Driver PHY Layer Routines 5925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 5935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project****************************************************************************** 5945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project*****************************************************************************/ 5955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 5965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /********************************************************************* 5975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLan_PhyPrint 5985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 5995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Returns: 6005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Nothing 6015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Parms: 6025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * dev A pointer to the device structure of the 6035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLAN device having the PHYs to be detailed. 6045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 6055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This function prints the registers a PHY (aka tranceiver). 6065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 6075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ********************************************************************/ 6085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 6095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid TLan_PhyPrint( struct net_device *dev ) 6105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 6115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLanPrivateInfo *priv = dev->priv; 6125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u16 i, data0, data1, data2, data3, phy; 6135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 6145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project phy = priv->phy[priv->phyNum]; 6155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 6165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( priv->adapter->flags & TLAN_ADAPTER_UNMANAGED_PHY ) { 6175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk( "TLAN: Device %s, Unmanaged PHY.\n", dev->name ); 6185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else if ( phy <= TLAN_PHY_MAX_ADDR ) { 6195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk( "TLAN: Device %s, PHY 0x%02x.\n", dev->name, phy ); 6205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk( "TLAN: Off. +0 +1 +2 +3 \n" ); 6215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project for ( i = 0; i < 0x20; i+= 4 ) { 6225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk( "TLAN: 0x%02x", i ); 6235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiReadReg( dev, phy, i, &data0 ); 6245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk( " 0x%04hx", data0 ); 6255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiReadReg( dev, phy, i + 1, &data1 ); 6265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk( " 0x%04hx", data1 ); 6275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiReadReg( dev, phy, i + 2, &data2 ); 6285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk( " 0x%04hx", data2 ); 6295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiReadReg( dev, phy, i + 3, &data3 ); 6305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk( " 0x%04hx\n", data3 ); 6315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 6325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else { 6335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk( "TLAN: Device %s, Invalid PHY.\n", dev->name ); 6345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 6355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 6365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* TLan_PhyPrint */ 6375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 6385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /********************************************************************* 6395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLan_PhyDetect 6405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 6415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Returns: 6425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Nothing 6435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Parms: 6445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * dev A pointer to the device structure of the adapter 6455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * for which the PHY needs determined. 6465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 6475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * So far I've found that adapters which have external PHYs 6485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * may also use the internal PHY for part of the functionality. 6495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * (eg, AUI/Thinnet). This function finds out if this TLAN 6505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * chip has an internal PHY, and then finds the first external 6515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * PHY (starting from address 0) if it exists). 6525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 6535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ********************************************************************/ 6545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 6555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid TLan_PhyDetect( struct net_device *dev ) 6565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 6575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLanPrivateInfo *priv = dev->priv; 6585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u16 control; 6595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u16 hi; 6605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u16 lo; 6615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 phy; 6625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 6635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( priv->adapter->flags & TLAN_ADAPTER_UNMANAGED_PHY ) { 6645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->phyNum = 0xFFFF; 6655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return; 6665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 6675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 6685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiReadReg( dev, TLAN_PHY_MAX_ADDR, MII_GEN_ID_HI, &hi ); 6695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 6705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( hi != 0xFFFF ) { 6715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->phy[0] = TLAN_PHY_MAX_ADDR; 6725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else { 6735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->phy[0] = TLAN_PHY_NONE; 6745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 6755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 6765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->phy[1] = TLAN_PHY_NONE; 6775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project for ( phy = 0; phy <= TLAN_PHY_MAX_ADDR; phy++ ) { 6785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiReadReg( dev, phy, MII_GEN_CTL, &control ); 6795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiReadReg( dev, phy, MII_GEN_ID_HI, &hi ); 6805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiReadReg( dev, phy, MII_GEN_ID_LO, &lo ); 6815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( ( control != 0xFFFF ) || ( hi != 0xFFFF ) || ( lo != 0xFFFF ) ) { 6825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLAN_DBG( TLAN_DEBUG_GNRL, "PHY found at %02x %04x %04x %04x\n", phy, control, hi, lo ); 6835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( ( priv->phy[1] == TLAN_PHY_NONE ) && ( phy != TLAN_PHY_MAX_ADDR ) ) { 6845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->phy[1] = phy; 6855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 6865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 6875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 6885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 6895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( priv->phy[1] != TLAN_PHY_NONE ) { 6905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->phyNum = 1; 6915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else if ( priv->phy[0] != TLAN_PHY_NONE ) { 6925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->phyNum = 0; 6935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else { 6945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk( "TLAN: Cannot initialize device, no PHY was found!\n" ); 6955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 6965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 6975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* TLan_PhyDetect */ 6985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 6995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid TLan_PhyPowerDown( struct net_device *dev ) 7005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 7015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLanPrivateInfo *priv = dev->priv; 7025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u16 value; 7035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 7045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLAN_DBG( TLAN_DEBUG_GNRL, "%s: Powering down PHY(s).\n", dev->name ); 7055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project value = MII_GC_PDOWN | MII_GC_LOOPBK | MII_GC_ISOLATE; 7065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiSync( dev->base_addr ); 7075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiWriteReg( dev, priv->phy[priv->phyNum], MII_GEN_CTL, value ); 7085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( ( priv->phyNum == 0 ) && ( priv->phy[1] != TLAN_PHY_NONE ) && ( ! ( priv->adapter->flags & TLAN_ADAPTER_USE_INTERN_10 ) ) ) { 7095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiSync( dev->base_addr ); 7105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiWriteReg( dev, priv->phy[1], MII_GEN_CTL, value ); 7115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 7125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 7135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Wait for 50 ms and powerup 7145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This is abitrary. It is intended to make sure the 7155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * tranceiver settles. 7165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 7175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_SetTimer( dev, (HZ/20), TLAN_TIMER_PHY_PUP ); 7185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 7195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* TLan_PhyPowerDown */ 7205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 7215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid TLan_PhyPowerUp( struct net_device *dev ) 7225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 7235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLanPrivateInfo *priv = dev->priv; 7245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u16 value; 7255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 7265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLAN_DBG( TLAN_DEBUG_GNRL, "%s: Powering up PHY.\n", dev->name ); 7275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiSync( dev->base_addr ); 7285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project value = MII_GC_LOOPBK; 7295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiWriteReg( dev, priv->phy[priv->phyNum], MII_GEN_CTL, value ); 7305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiSync(dev->base_addr); 7315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Wait for 500 ms and reset the 7325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * tranceiver. The TLAN docs say both 50 ms and 7335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 500 ms, so do the longer, just in case. 7345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 7355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_SetTimer( dev, (HZ/20), TLAN_TIMER_PHY_RESET ); 7365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 7375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* TLan_PhyPowerUp */ 7385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 7395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid TLan_PhyReset( struct net_device *dev ) 7405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 7415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLanPrivateInfo *priv = dev->priv; 7425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u16 phy; 7435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u16 value; 7445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 7455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project phy = priv->phy[priv->phyNum]; 7465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 7475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLAN_DBG( TLAN_DEBUG_GNRL, "%s: Reseting PHY.\n", dev->name ); 7485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiSync( dev->base_addr ); 7495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project value = MII_GC_LOOPBK | MII_GC_RESET; 7505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiWriteReg( dev, phy, MII_GEN_CTL, value ); 7515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiReadReg( dev, phy, MII_GEN_CTL, &value ); 7525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project while ( value & MII_GC_RESET ) { 7535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiReadReg( dev, phy, MII_GEN_CTL, &value ); 7545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 7555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 7565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Wait for 500 ms and initialize. 7575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * I don't remember why I wait this long. 7585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * I've changed this to 50ms, as it seems long enough. 7595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 7605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_SetTimer( dev, (HZ/20), TLAN_TIMER_PHY_START_LINK ); 7615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 7625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* TLan_PhyReset */ 7635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 7645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid TLan_PhyStartLink( struct net_device *dev ) 7655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 7665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLanPrivateInfo *priv = dev->priv; 7675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u16 ability; 7685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u16 control; 7695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u16 data; 7705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u16 phy; 7715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u16 status; 7725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u16 tctl; 7735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 7745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project phy = priv->phy[priv->phyNum]; 7755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLAN_DBG( TLAN_DEBUG_GNRL, "%s: Trying to activate link.\n", dev->name ); 7765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiReadReg( dev, phy, MII_GEN_STS, &status ); 7775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiReadReg( dev, phy, MII_GEN_STS, &ability ); 7785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 7795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( ( status & MII_GS_AUTONEG ) && 7805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ( ! priv->aui ) ) { 7815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ability = status >> 11; 7825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( priv->speed == TLAN_SPEED_10 && 7835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->duplex == TLAN_DUPLEX_HALF) { 7845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiWriteReg( dev, phy, MII_GEN_CTL, 0x0000); 7855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else if ( priv->speed == TLAN_SPEED_10 && 7865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->duplex == TLAN_DUPLEX_FULL) { 7875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->tlanFullDuplex = TRUE; 7885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiWriteReg( dev, phy, MII_GEN_CTL, 0x0100); 7895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else if ( priv->speed == TLAN_SPEED_100 && 7905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->duplex == TLAN_DUPLEX_HALF) { 7915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiWriteReg( dev, phy, MII_GEN_CTL, 0x2000); 7925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else if ( priv->speed == TLAN_SPEED_100 && 7935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->duplex == TLAN_DUPLEX_FULL) { 7945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->tlanFullDuplex = TRUE; 7955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiWriteReg( dev, phy, MII_GEN_CTL, 0x2100); 7965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else { 7975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 7985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Set Auto-Neg advertisement */ 7995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiWriteReg( dev, phy, MII_AN_ADV, (ability << 5) | 1); 8005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Enablee Auto-Neg */ 8015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiWriteReg( dev, phy, MII_GEN_CTL, 0x1000 ); 8025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Restart Auto-Neg */ 8035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiWriteReg( dev, phy, MII_GEN_CTL, 0x1200 ); 8045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Wait for 4 sec for autonegotiation 8055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * to complete. The max spec time is less than this 8065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * but the card need additional time to start AN. 8075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * .5 sec should be plenty extra. 8085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 8095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk( "TLAN: %s: Starting autonegotiation.\n", dev->name ); 8105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_SetTimer( dev, (2*HZ), TLAN_TIMER_PHY_FINISH_AN ); 8115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return; 8125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 8135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 8145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 8155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 8165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( ( priv->aui ) && ( priv->phyNum != 0 ) ) { 8175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->phyNum = 0; 8185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project data = TLAN_NET_CFG_1FRAG | TLAN_NET_CFG_1CHAN | TLAN_NET_CFG_PHY_EN; 8195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_DioWrite16( dev->base_addr, TLAN_NET_CONFIG, data ); 8205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_SetTimer( dev, (40*HZ/1000), TLAN_TIMER_PHY_PDOWN ); 8215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return; 8225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else if ( priv->phyNum == 0 ) { 8235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiReadReg( dev, phy, TLAN_TLPHY_CTL, &tctl ); 8245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( priv->aui ) { 8255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project tctl |= TLAN_TC_AUISEL; 8265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else { 8275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project tctl &= ~TLAN_TC_AUISEL; 8285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project control = 0; 8295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( priv->duplex == TLAN_DUPLEX_FULL ) { 8305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project control |= MII_GC_DUPLEX; 8315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->tlanFullDuplex = TRUE; 8325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 8335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( priv->speed == TLAN_SPEED_100 ) { 8345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project control |= MII_GC_SPEEDSEL; 8355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 8365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiWriteReg( dev, phy, MII_GEN_CTL, control ); 8375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 8385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiWriteReg( dev, phy, TLAN_TLPHY_CTL, tctl ); 8395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 8405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 8415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Wait for 2 sec to give the tranceiver time 8425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * to establish link. 8435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 8445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_SetTimer( dev, (4*HZ), TLAN_TIMER_FINISH_RESET ); 8455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 8465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* TLan_PhyStartLink */ 8475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 8485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid TLan_PhyFinishAutoNeg( struct net_device *dev ) 8495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 8505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLanPrivateInfo *priv = dev->priv; 8515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u16 an_adv; 8525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u16 an_lpa; 8535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u16 data; 8545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u16 mode; 8555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u16 phy; 8565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u16 status; 8575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 8585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project phy = priv->phy[priv->phyNum]; 8595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 8605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiReadReg( dev, phy, MII_GEN_STS, &status ); 8615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project udelay( 1000 ); 8625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiReadReg( dev, phy, MII_GEN_STS, &status ); 8635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 8645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( ! ( status & MII_GS_AUTOCMPLT ) ) { 8655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Wait for 8 sec to give the process 8665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * more time. Perhaps we should fail after a while. 8675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 8685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (!priv->neg_be_verbose++) { 8695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk(KERN_INFO "TLAN: Giving autonegotiation more time.\n"); 8705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk(KERN_INFO "TLAN: Please check that your adapter has\n"); 8715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk(KERN_INFO "TLAN: been properly connected to a HUB or Switch.\n"); 8725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk(KERN_INFO "TLAN: Trying to establish link in the background...\n"); 8735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 8745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_SetTimer( dev, (8*HZ), TLAN_TIMER_PHY_FINISH_AN ); 8755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return; 8765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 8775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 8785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk( "TLAN: %s: Autonegotiation complete.\n", dev->name ); 8795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiReadReg( dev, phy, MII_AN_ADV, &an_adv ); 8805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiReadReg( dev, phy, MII_AN_LPA, &an_lpa ); 8815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mode = an_adv & an_lpa & 0x03E0; 8825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( mode & 0x0100 ) { 8835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->tlanFullDuplex = TRUE; 8845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else if ( ! ( mode & 0x0080 ) && ( mode & 0x0040 ) ) { 8855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->tlanFullDuplex = TRUE; 8865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 8875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 8885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( ( ! ( mode & 0x0180 ) ) && ( priv->adapter->flags & TLAN_ADAPTER_USE_INTERN_10 ) && ( priv->phyNum != 0 ) ) { 8895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->phyNum = 0; 8905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project data = TLAN_NET_CFG_1FRAG | TLAN_NET_CFG_1CHAN | TLAN_NET_CFG_PHY_EN; 8915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_DioWrite16( dev->base_addr, TLAN_NET_CONFIG, data ); 8925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_SetTimer( dev, (400*HZ/1000), TLAN_TIMER_PHY_PDOWN ); 8935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return; 8945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 8955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 8965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( priv->phyNum == 0 ) { 8975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( ( priv->duplex == TLAN_DUPLEX_FULL ) || ( an_adv & an_lpa & 0x0040 ) ) { 8985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiWriteReg( dev, phy, MII_GEN_CTL, MII_GC_AUTOENB | MII_GC_DUPLEX ); 8995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk( "TLAN: Starting internal PHY with FULL-DUPLEX\n" ); 9005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else { 9015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiWriteReg( dev, phy, MII_GEN_CTL, MII_GC_AUTOENB ); 9025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk( "TLAN: Starting internal PHY with HALF-DUPLEX\n" ); 9035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 9045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 9055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 9065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Wait for 100 ms. No reason in partiticular. 9075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 9085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_SetTimer( dev, (HZ/10), TLAN_TIMER_FINISH_RESET ); 9095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 9105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* TLan_PhyFinishAutoNeg */ 9115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 9125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef MONITOR 9135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 9145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /********************************************************************* 9155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 9165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLan_phyMonitor 9175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 9185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Returns: 9195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * None 9205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 9215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Params: 9225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * dev The device structure of this device. 9235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 9245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 9255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This function monitors PHY condition by reading the status 9265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * register via the MII bus. This can be used to give info 9275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * about link changes (up/down), and possible switch to alternate 9285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * media. 9295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 9305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * ******************************************************************/ 9315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 9325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid TLan_PhyMonitor( struct net_device *dev ) 9335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 9345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLanPrivateInfo *priv = dev->priv; 9355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u16 phy; 9365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u16 phy_status; 9375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 9385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project phy = priv->phy[priv->phyNum]; 9395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 9405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Get PHY status register */ 9415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiReadReg( dev, phy, MII_GEN_STS, &phy_status ); 9425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 9435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Check if link has been lost */ 9445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (!(phy_status & MII_GS_LINK)) { 9455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (priv->link) { 9465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->link = 0; 9475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk(KERN_DEBUG "TLAN: %s has lost link\n", dev->name); 9485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project dev->flags &= ~IFF_RUNNING; 9495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_SetTimer( dev, (2*HZ), TLAN_TIMER_LINK_BEAT ); 9505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return; 9515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 9525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 9535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 9545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Link restablished? */ 9555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ((phy_status & MII_GS_LINK) && !priv->link) { 9565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->link = 1; 9575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk(KERN_DEBUG "TLAN: %s has reestablished link\n", dev->name); 9585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project dev->flags |= IFF_RUNNING; 9595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 9605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 9615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Setup a new monitor */ 9625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_SetTimer( dev, (2*HZ), TLAN_TIMER_LINK_BEAT ); 9635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 9645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 9655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif /* MONITOR */ 9665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 9675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/***************************************************************************** 9685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project****************************************************************************** 9695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 9705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ThunderLAN Driver MII Routines 9715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 9725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project These routines are based on the information in Chap. 2 of the 9735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project "ThunderLAN Programmer's Guide", pp. 15-24. 9745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 9755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project****************************************************************************** 9765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project*****************************************************************************/ 9775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 9785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /*************************************************************** 9795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLan_MiiReadReg 9805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 9815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Returns: 9825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 0 if ack received ok 9835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 1 otherwise. 9845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 9855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Parms: 9865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * dev The device structure containing 9875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * The io address and interrupt count 9885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * for this device. 9895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * phy The address of the PHY to be queried. 9905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * reg The register whose contents are to be 9915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * retreived. 9925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * val A pointer to a variable to store the 9935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * retrieved value. 9945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 9955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This function uses the TLAN's MII bus to retreive the contents 9965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * of a given register on a PHY. It sends the appropriate info 9975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * and then reads the 16-bit register value from the MII bus via 9985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * the TLAN SIO register. 9995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 10005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project **************************************************************/ 10015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 10025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectint TLan_MiiReadReg( struct net_device *dev, u16 phy, u16 reg, u16 *val ) 10035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 10045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u8 nack; 10055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u16 sio, tmp; 10065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 i; 10075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int err; 10085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int minten; 10095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLanPrivateInfo *priv = dev->priv; 10105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project unsigned long flags = 0; 10115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 10125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project err = FALSE; 10135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outw(TLAN_NET_SIO, dev->base_addr + TLAN_DIO_ADR); 10145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project sio = dev->base_addr + TLAN_DIO_DATA + TLAN_NET_SIO; 10155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 10165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (!in_irq()) 10175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project spin_lock_irqsave(&priv->lock, flags); 10185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 10195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiSync(dev->base_addr); 10205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 10215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project minten = TLan_GetBit( TLAN_NET_SIO_MINTEN, sio ); 10225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( minten ) 10235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_ClearBit(TLAN_NET_SIO_MINTEN, sio); 10245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 10255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiSendData( dev->base_addr, 0x1, 2 ); /* Start ( 01b ) */ 10265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiSendData( dev->base_addr, 0x2, 2 ); /* Read ( 10b ) */ 10275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiSendData( dev->base_addr, phy, 5 ); /* Device # */ 10285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiSendData( dev->base_addr, reg, 5 ); /* Register # */ 10295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 10305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_ClearBit(TLAN_NET_SIO_MTXEN, sio); /* Change direction */ 10315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 10325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_ClearBit(TLAN_NET_SIO_MCLK, sio); /* Clock Idle bit */ 10335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_SetBit(TLAN_NET_SIO_MCLK, sio); 10345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_ClearBit(TLAN_NET_SIO_MCLK, sio); /* Wait 300ns */ 10355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 10365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project nack = TLan_GetBit(TLAN_NET_SIO_MDATA, sio); /* Check for ACK */ 10375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_SetBit(TLAN_NET_SIO_MCLK, sio); /* Finish ACK */ 10385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (nack) { /* No ACK, so fake it */ 10395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project for (i = 0; i < 16; i++) { 10405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_ClearBit(TLAN_NET_SIO_MCLK, sio); 10415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_SetBit(TLAN_NET_SIO_MCLK, sio); 10425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 10435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project tmp = 0xffff; 10445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project err = TRUE; 10455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else { /* ACK, so read data */ 10465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project for (tmp = 0, i = 0x8000; i; i >>= 1) { 10475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_ClearBit(TLAN_NET_SIO_MCLK, sio); 10485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (TLan_GetBit(TLAN_NET_SIO_MDATA, sio)) 10495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project tmp |= i; 10505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_SetBit(TLAN_NET_SIO_MCLK, sio); 10515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 10525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 10535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 10545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_ClearBit(TLAN_NET_SIO_MCLK, sio); /* Idle cycle */ 10555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_SetBit(TLAN_NET_SIO_MCLK, sio); 10565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 10575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( minten ) 10585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_SetBit(TLAN_NET_SIO_MINTEN, sio); 10595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 10605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *val = tmp; 10615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 10625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (!in_irq()) 10635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project spin_unlock_irqrestore(&priv->lock, flags); 10645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 10655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return err; 10665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 10675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* TLan_MiiReadReg */ 10685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 10695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /*************************************************************** 10705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLan_MiiSendData 10715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 10725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Returns: 10735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Nothing 10745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Parms: 10755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * base_port The base IO port of the adapter in 10765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * question. 10775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * dev The address of the PHY to be queried. 10785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * data The value to be placed on the MII bus. 10795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * num_bits The number of bits in data that are to 10805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * be placed on the MII bus. 10815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 10825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This function sends on sequence of bits on the MII 10835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * configuration bus. 10845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 10855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project **************************************************************/ 10865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 10875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid TLan_MiiSendData( u16 base_port, u32 data, unsigned num_bits ) 10885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 10895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u16 sio; 10905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 i; 10915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 10925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( num_bits == 0 ) 10935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return; 10945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 10955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outw( TLAN_NET_SIO, base_port + TLAN_DIO_ADR ); 10965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project sio = base_port + TLAN_DIO_DATA + TLAN_NET_SIO; 10975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_SetBit( TLAN_NET_SIO_MTXEN, sio ); 10985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 10995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project for ( i = ( 0x1 << ( num_bits - 1 ) ); i; i >>= 1 ) { 11005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_ClearBit( TLAN_NET_SIO_MCLK, sio ); 11015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project (void) TLan_GetBit( TLAN_NET_SIO_MCLK, sio ); 11025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( data & i ) 11035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_SetBit( TLAN_NET_SIO_MDATA, sio ); 11045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project else 11055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_ClearBit( TLAN_NET_SIO_MDATA, sio ); 11065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_SetBit( TLAN_NET_SIO_MCLK, sio ); 11075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project (void) TLan_GetBit( TLAN_NET_SIO_MCLK, sio ); 11085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 11095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 11105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* TLan_MiiSendData */ 11115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 11125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /*************************************************************** 11135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLan_MiiSync 11145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 11155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Returns: 11165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Nothing 11175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Parms: 11185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * base_port The base IO port of the adapter in 11195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * question. 11205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 11215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This functions syncs all PHYs in terms of the MII configuration 11225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * bus. 11235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 11245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project **************************************************************/ 11255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 11265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid TLan_MiiSync( u16 base_port ) 11275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 11285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int i; 11295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u16 sio; 11305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 11315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outw( TLAN_NET_SIO, base_port + TLAN_DIO_ADR ); 11325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project sio = base_port + TLAN_DIO_DATA + TLAN_NET_SIO; 11335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 11345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_ClearBit( TLAN_NET_SIO_MTXEN, sio ); 11355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project for ( i = 0; i < 32; i++ ) { 11365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_ClearBit( TLAN_NET_SIO_MCLK, sio ); 11375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_SetBit( TLAN_NET_SIO_MCLK, sio ); 11385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 11395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 11405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* TLan_MiiSync */ 11415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 11425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /*************************************************************** 11435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLan_MiiWriteReg 11445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 11455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Returns: 11465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Nothing 11475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Parms: 11485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * dev The device structure for the device 11495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * to write to. 11505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * phy The address of the PHY to be written to. 11515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * reg The register whose contents are to be 11525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * written. 11535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * val The value to be written to the register. 11545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 11555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This function uses the TLAN's MII bus to write the contents of a 11565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * given register on a PHY. It sends the appropriate info and then 11575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * writes the 16-bit register value from the MII configuration bus 11585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * via the TLAN SIO register. 11595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 11605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project **************************************************************/ 11615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 11625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid TLan_MiiWriteReg( struct net_device *dev, u16 phy, u16 reg, u16 val ) 11635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 11645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u16 sio; 11655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int minten; 11665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project unsigned long flags = 0; 11675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLanPrivateInfo *priv = dev->priv; 11685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 11695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outw(TLAN_NET_SIO, dev->base_addr + TLAN_DIO_ADR); 11705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project sio = dev->base_addr + TLAN_DIO_DATA + TLAN_NET_SIO; 11715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 11725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (!in_irq()) 11735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project spin_lock_irqsave(&priv->lock, flags); 11745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 11755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiSync( dev->base_addr ); 11765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 11775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project minten = TLan_GetBit( TLAN_NET_SIO_MINTEN, sio ); 11785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( minten ) 11795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_ClearBit( TLAN_NET_SIO_MINTEN, sio ); 11805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 11815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiSendData( dev->base_addr, 0x1, 2 ); /* Start ( 01b ) */ 11825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiSendData( dev->base_addr, 0x1, 2 ); /* Write ( 01b ) */ 11835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiSendData( dev->base_addr, phy, 5 ); /* Device # */ 11845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiSendData( dev->base_addr, reg, 5 ); /* Register # */ 11855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 11865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiSendData( dev->base_addr, 0x2, 2 ); /* Send ACK */ 11875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiSendData( dev->base_addr, val, 16 ); /* Send Data */ 11885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 11895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_ClearBit( TLAN_NET_SIO_MCLK, sio ); /* Idle cycle */ 11905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_SetBit( TLAN_NET_SIO_MCLK, sio ); 11915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 11925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( minten ) 11935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_SetBit( TLAN_NET_SIO_MINTEN, sio ); 11945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 11955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (!in_irq()) 11965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project spin_unlock_irqrestore(&priv->lock, flags); 11975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 11985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* TLan_MiiWriteReg */ 11995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif 12005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 12015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/************************************************************************** 12025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectRESET - Reset adapter 12035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project***************************************************************************/ 12045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void skel_reset(struct nic *nic) 12055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 12065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* put the card in its initial state */ 12075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 12085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 12095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/************************************************************************** 12105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectPOLL - Wait for a frame 12115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project***************************************************************************/ 12125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int skel_poll(struct nic *nic) 12135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 12145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* return true if there's an ethernet packet ready to read */ 12155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* nic->packet should contain data on return */ 12165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* nic->packetlen should contain length of data */ 12175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return (0); /* initially as this is called to flush the input */ 12185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 12195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 12205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/************************************************************************** 12215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectTRANSMIT - Transmit a frame 12225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project***************************************************************************/ 12235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void skel_transmit( 12245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project struct nic *nic, 12255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project const char *d, /* Destination */ 12265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project unsigned int t, /* Type */ 12275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project unsigned int s, /* size */ 12285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project const char *p) /* Packet */ 12295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 12305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* send the packet to destination */ 12315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 12325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 12335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/************************************************************************** 12345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectDISABLE - Turn off ethernet interface 12355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project***************************************************************************/ 12365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void skel_disable(struct nic *nic) 12375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 12385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 12395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 12405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/************************************************************************** 12415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectPROBE - Look for an adapter, this routine's visible to the outside 12425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectYou should omit the last argument struct pci_device * for a non-PCI NIC 12435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project***************************************************************************/ 12445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstruct nic *tlan_probe(struct nic *nic, unsigned short *probe_addrs, 12455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project struct pci_device *p) 12465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 12475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* if probe_addrs is 0, then routine can use a hardwired default */ 12485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* if board found */ 12495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 12505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* point to NIC specific routines */ 12515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project nic->reset = skel_reset; 12525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project nic->poll = skel_poll; 12535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project nic->transmit = skel_transmit; 12545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project nic->disable = skel_disable; 12555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return nic; 12565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 12575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* else */ 12585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return 0; 12595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 12605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 12615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#if 0 12625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifndef TLAN_H 12635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_H 12645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/******************************************************************** 12655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 12665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Linux ThunderLAN Driver 12675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 12685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * tlan.h 12695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * by James Banks 12705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 12715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * (C) 1997-1998 Caldera, Inc. 12725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * (C) 1999-2001 Torben Mathiasen 12735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 12745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This software may be used and distributed according to the terms 12755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * of the GNU General Public License, incorporated herein by reference. 12765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 12775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ** This file is best viewed/edited with tabstop=4, colums>=132 12785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 12795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 12805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Dec 10, 1999 Torben Mathiasen <torben.mathiasen@compaq.com> 12815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * New Maintainer 12825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 12835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ********************************************************************/ 12845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 12855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <asm/io.h> 12865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <asm/types.h> 12875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <linux/netdevice.h> 12885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 12895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define FALSE 0 12905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TRUE 1 12915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 12925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TX_TIMEOUT (10*HZ) /* We need time for auto-neg */ 12935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 12945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecttypedef struct tlan_adapter_entry { 12955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u16 vendorId; 12965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u16 deviceId; 12975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project char *deviceLabel; 12985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 flags; 12995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u16 addrOfs; 13005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} TLanAdapterEntry; 13015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 13025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /***************************************************************** 13035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * EISA Definitions 13045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 13055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ****************************************************************/ 13065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 13075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define EISA_ID 0xc80 /* EISA ID Registers */ 13085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define EISA_ID0 0xc80 /* EISA ID Register 0 */ 13095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define EISA_ID1 0xc81 /* EISA ID Register 1 */ 13105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define EISA_ID2 0xc82 /* EISA ID Register 2 */ 13115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define EISA_ID3 0xc83 /* EISA ID Register 3 */ 13125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define EISA_CR 0xc84 /* EISA Control Register */ 13135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define EISA_REG0 0xc88 /* EISA Configuration Register 0 */ 13145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define EISA_REG1 0xc89 /* EISA Configuration Register 1 */ 13155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define EISA_REG2 0xc8a /* EISA Configuration Register 2 */ 13165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define EISA_REG3 0xc8f /* EISA Configuration Register 3 */ 13175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define EISA_APROM 0xc90 /* Ethernet Address PROM */ 13185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 13195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /***************************************************************** 13205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Rx/Tx List Definitions 13215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 13225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ****************************************************************/ 13235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 13245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecttypedef struct tlan_buffer_ref_tag { 13255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 count; 13265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 address; 13275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} TLanBufferRef; 13285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 13295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecttypedef struct tlan_list_tag { 13305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 forward; 13315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u16 cStat; 13325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u16 frameSize; 13335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLanBufferRef buffer[TLAN_BUFFERS_PER_LIST]; 13345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} TLanList; 13355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 13365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecttypedef u8 TLanBuffer[TLAN_MAX_FRAME_SIZE]; 13375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 13385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /***************************************************************** 13395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLAN Private Information Structure 13405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 13415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ****************************************************************/ 13425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 13435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecttypedef struct tlan_private_tag { 13445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project struct net_device *nextDevice; 13455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project void *dmaStorage; 13465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u8 *padBuffer; 13475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLanList *rxList; 13485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u8 *rxBuffer; 13495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 rxHead; 13505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 rxTail; 13515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 rxEocCount; 13525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLanList *txList; 13535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u8 *txBuffer; 13545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 txHead; 13555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 txInProgress; 13565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 txTail; 13575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 txBusyCount; 13585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 phyOnline; 13595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 timerSetAt; 13605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 timerType; 13615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project struct timer_list timer; 13625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project struct net_device_stats stats; 13635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project struct board *adapter; 13645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 adapterRev; 13655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 aui; 13665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 debug; 13675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 duplex; 13685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 phy[2]; 13695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 phyNum; 13705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 speed; 13715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u8 tlanRev; 13725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u8 tlanFullDuplex; 13735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project char devName[8]; 13745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project spinlock_t lock; 13755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u8 link; 13765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u8 is_eisa; 13775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project struct tq_struct tlan_tqueue; 13785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u8 neg_be_verbose; 13795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} TLanPrivateInfo; 13805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 13815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_HC_GO 0x80000000 13825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_HC_STOP 0x40000000 13835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_HC_ACK 0x20000000 13845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_HC_CS_MASK 0x1FE00000 13855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_HC_EOC 0x00100000 13865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_HC_RT 0x00080000 13875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_HC_NES 0x00040000 13885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_HC_AD_RST 0x00008000 13895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_HC_LD_TMR 0x00004000 13905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_HC_LD_THR 0x00002000 13915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_HC_REQ_INT 0x00001000 13925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_HC_INT_OFF 0x00000800 13935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_HC_INT_ON 0x00000400 13945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_HC_AC_MASK 0x000000FF 13955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_DA_ADR_INC 0x8000 13965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_DA_RAM_ADR 0x4000 13975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_HI_IV_MASK 0x1FE0 13985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_HI_IT_MASK 0x001C 13995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 14005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_CMD_NRESET 0x80 14015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_CMD_NWRAP 0x40 14025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_CMD_CSF 0x20 14035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_CMD_CAF 0x10 14045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_CMD_NOBRX 0x08 14055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_CMD_DUPLEX 0x04 14065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_CMD_TRFRAM 0x02 14075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_CMD_TXPACE 0x01 14085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_SIO_MINTEN 0x80 14095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_SIO_ECLOK 0x40 14105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_SIO_ETXEN 0x20 14115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_SIO_EDATA 0x10 14125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_SIO_NMRST 0x08 14135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_SIO_MCLK 0x04 14145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_SIO_MTXEN 0x02 14155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_SIO_MDATA 0x01 14165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_STS_MIRQ 0x80 14175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_STS_HBEAT 0x40 14185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_STS_TXSTOP 0x20 14195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_STS_RXSTOP 0x10 14205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_STS_RSRVD 0x0F 14215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_MASK_MASK7 0x80 14225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_MASK_MASK6 0x40 14235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_MASK_MASK5 0x20 14245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_MASK_MASK4 0x10 14255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_MASK_RSRVD 0x0F 14265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_CFG_RCLK 0x8000 14275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_CFG_TCLK 0x4000 14285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_CFG_BIT 0x2000 14295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_CFG_RXCRC 0x1000 14305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_CFG_PEF 0x0800 14315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_CFG_1FRAG 0x0400 14325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_CFG_1CHAN 0x0200 14335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_CFG_MTEST 0x0100 14345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_CFG_PHY_EN 0x0080 14355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_NET_CFG_MSMASK 0x007F 14365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_LED_ACT 0x10 14375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_LED_LINK 0x01 14385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_ID_TX_EOC 0x04 14395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_ID_RX_EOF 0x02 14405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define TLAN_ID_RX_EOC 0x01 14415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 14425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CIRC_INC( a, b ) if ( ++a >= b ) a = 0 14435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 14445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef I_LIKE_A_FAST_HASH_FUNCTION 14455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* given 6 bytes, view them as 8 6-bit numbers and return the XOR of those */ 14465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* the code below is about seven times as fast as the original code */ 14475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectinline u32 TLan_HashFunc( u8 *a ) 14485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 14495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u8 hash; 14505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 14515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project hash = (a[0]^a[3]); /* & 077 */ 14525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project hash ^= ((a[0]^a[3])>>6); /* & 003 */ 14535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project hash ^= ((a[1]^a[4])<<2); /* & 074 */ 14545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project hash ^= ((a[1]^a[4])>>4); /* & 017 */ 14555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project hash ^= ((a[2]^a[5])<<4); /* & 060 */ 14565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project hash ^= ((a[2]^a[5])>>2); /* & 077 */ 14575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 14585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return (hash & 077); 14595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 14605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 14615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#else /* original code */ 14625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 14635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectinline u32 xor( u32 a, u32 b ) 14645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 14655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return ( ( a && ! b ) || ( ! a && b ) ); 14665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 14675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define XOR8( a, b, c, d, e, f, g, h ) xor( a, xor( b, xor( c, xor( d, xor( e, xor( f, xor( g, h ) ) ) ) ) ) ) 14685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define DA( a, bit ) ( ( (u8) a[bit/8] ) & ( (u8) ( 1 << bit%8 ) ) ) 14695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 14705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectinline u32 TLan_HashFunc( u8 *a ) 14715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 14725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 hash; 14735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 14745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project hash = XOR8( DA(a,0), DA(a, 6), DA(a,12), DA(a,18), DA(a,24), DA(a,30), DA(a,36), DA(a,42) ); 14755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project hash |= XOR8( DA(a,1), DA(a, 7), DA(a,13), DA(a,19), DA(a,25), DA(a,31), DA(a,37), DA(a,43) ) << 1; 14765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project hash |= XOR8( DA(a,2), DA(a, 8), DA(a,14), DA(a,20), DA(a,26), DA(a,32), DA(a,38), DA(a,44) ) << 2; 14775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project hash |= XOR8( DA(a,3), DA(a, 9), DA(a,15), DA(a,21), DA(a,27), DA(a,33), DA(a,39), DA(a,45) ) << 3; 14785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project hash |= XOR8( DA(a,4), DA(a,10), DA(a,16), DA(a,22), DA(a,28), DA(a,34), DA(a,40), DA(a,46) ) << 4; 14795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project hash |= XOR8( DA(a,5), DA(a,11), DA(a,17), DA(a,23), DA(a,29), DA(a,35), DA(a,41), DA(a,47) ) << 5; 14805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 14815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return hash; 14825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 14835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 14845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 14855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif /* I_LIKE_A_FAST_HASH_FUNCTION */ 14865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif 14875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/******************************************************************************* 14885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 14895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Linux ThunderLAN Driver 14905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 14915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * tlan.c 14925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * by James Banks 14935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 14945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * (C) 1997-1998 Caldera, Inc. 14955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * (C) 1998 James Banks 14965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * (C) 1999-2001 Torben Mathiasen 14975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 14985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This software may be used and distributed according to the terms 14995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * of the GNU General Public License, incorporated herein by reference. 15005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 15015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ** This file is best viewed/edited with columns>=132. 15025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 15035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ** Useful (if not required) reading: 15045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 15055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Texas Instruments, ThunderLAN Programmer's Guide, 15065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TI Literature Number SPWU013A 15075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * available in PDF format from www.ti.com 15085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Level One, LXT901 and LXT970 Data Sheets 15095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * available in PDF format from www.level1.com 15105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * National Semiconductor, DP83840A Data Sheet 15115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * available in PDF format from www.national.com 15125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Microchip Technology, 24C01A/02A/04A Data Sheet 15135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * available in PDF format from www.microchip.com 15145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 15155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Change History 15165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 15175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Tigran Aivazian <tigran@sco.com>: TLan_PciProbe() now uses 15185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * new PCI BIOS interface. 15195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Alan Cox <alan@redhat.com>: Fixed the out of memory 15205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * handling. 15215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 15225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Torben Mathiasen <torben.mathiasen@compaq.com> New Maintainer! 15235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 15245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * v1.1 Dec 20, 1999 - Removed linux version checking 15255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Patch from Tigran Aivazian. 15265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * - v1.1 includes Alan's SMP updates. 15275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * - We still have problems on SMP though, 15285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * but I'm looking into that. 15295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 15305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * v1.2 Jan 02, 2000 - Hopefully fixed the SMP deadlock. 15315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * - Removed dependency of HZ being 100. 15325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * - We now allow higher priority timers to 15335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * overwrite timers like TLAN_TIMER_ACTIVITY 15345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Patch from John Cagle <john.cagle@compaq.com>. 15355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * - Fixed a few compiler warnings. 15365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 15375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * v1.3 Feb 04, 2000 - Fixed the remaining HZ issues. 15385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * - Removed call to pci_present(). 15395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * - Removed SA_INTERRUPT flag from irq handler. 15405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * - Added __init and __initdata to reduce resisdent 15415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * code size. 15425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * - Driver now uses module_init/module_exit. 15435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * - Rewrote init_module and tlan_probe to 15445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * share a lot more code. We now use tlan_probe 15455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * with builtin and module driver. 15465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * - Driver ported to new net API. 15475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * - tlan.txt has been reworked to reflect current 15485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * driver (almost) 15495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * - Other minor stuff 15505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 15515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * v1.4 Feb 10, 2000 - Updated with more changes required after Dave's 15525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * network cleanup in 2.3.43pre7 (Tigran & myself) 15535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * - Minor stuff. 15545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 15555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * v1.5 March 22, 2000 - Fixed another timer bug that would hang the driver 15565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * if no cable/link were present. 15575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * - Cosmetic changes. 15585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * - TODO: Port completely to new PCI/DMA API 15595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Auto-Neg fallback. 15605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 15615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * v1.6 April 04, 2000 - Fixed driver support for kernel-parameters. Haven't 15625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * tested it though, as the kernel support is currently 15635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * broken (2.3.99p4p3). 15645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * - Updated tlan.txt accordingly. 15655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * - Adjusted minimum/maximum frame length. 15665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * - There is now a TLAN website up at 15675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * http://tlan.kernel.dk 15685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 15695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * v1.7 April 07, 2000 - Started to implement custom ioctls. Driver now 15705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * reports PHY information when used with Donald 15715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Beckers userspace MII diagnostics utility. 15725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 15735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * v1.8 April 23, 2000 - Fixed support for forced speed/duplex settings. 15745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * - Added link information to Auto-Neg and forced 15755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * modes. When NIC operates with auto-neg the driver 15765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * will report Link speed & duplex modes as well as 15775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * link partner abilities. When forced link is used, 15785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * the driver will report status of the established 15795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * link. 15805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Please read tlan.txt for additional information. 15815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * - Removed call to check_region(), and used 15825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * return value of request_region() instead. 15835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 15845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * v1.8a May 28, 2000 - Minor updates. 15855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 15865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * v1.9 July 25, 2000 - Fixed a few remaining Full-Duplex issues. 15875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * - Updated with timer fixes from Andrew Morton. 15885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * - Fixed module race in TLan_Open. 15895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * - Added routine to monitor PHY status. 15905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * - Added activity led support for Proliant devices. 15915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 15925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * v1.10 Aug 30, 2000 - Added support for EISA based tlan controllers 15935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * like the Compaq NetFlex3/E. 15945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * - Rewrote tlan_probe to better handle multiple 15955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * bus probes. Probing and device setup is now 15965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * done through TLan_Probe and TLan_init_one. Actual 15975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * hardware probe is done with kernel API and 15985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLan_EisaProbe. 15995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * - Adjusted debug information for probing. 16005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * - Fixed bug that would cause general debug information 16015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * to be printed after driver removal. 16025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * - Added transmit timeout handling. 16035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * - Fixed OOM return values in tlan_probe. 16045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * - Fixed possible mem leak in tlan_exit 16055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * (now tlan_remove_one). 16065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * - Fixed timer bug in TLan_phyMonitor. 16075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * - This driver version is alpha quality, please 16085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * send me any bug issues you may encounter. 16095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 16105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * v1.11 Aug 31, 2000 - Do not try to register irq 0 if no irq line was 16115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * set for EISA cards. 16125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * - Added support for NetFlex3/E with nibble-rate 16135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 10Base-T PHY. This is untestet as I haven't got 16145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * one of these cards. 16155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * - Fixed timer being added twice. 16165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * - Disabled PhyMonitoring by default as this is 16175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * work in progress. Define MONITOR to enable it. 16185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * - Now we don't display link info with PHYs that 16195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * doesn't support it (level1). 16205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * - Incresed tx_timeout beacuse of auto-neg. 16215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * - Adjusted timers for forced speeds. 16225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 16235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * v1.12 Oct 12, 2000 - Minor fixes (memleak, init, etc.) 16245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 16255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * v1.13 Nov 28, 2000 - Stop flooding console with auto-neg issues 16265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * when link can't be established. 16275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * - Added the bbuf option as a kernel parameter. 16285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * - Fixed ioaddr probe bug. 16295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * - Fixed stupid deadlock with MII interrupts. 16305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * - Added support for speed/duplex selection with 16315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * multiple nics. 16325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * - Added partly fix for TX Channel lockup with 16335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLAN v1.0 silicon. This needs to be investigated 16345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * further. 16355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 16365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * v1.14 Dec 16, 2000 - Added support for servicing multiple frames per. 16375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * interrupt. Thanks goes to 16385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Adam Keys <adam@ti.com> 16395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Denis Beaudoin <dbeaudoin@ti.com> 16405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * for providing the patch. 16415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * - Fixed auto-neg output when using multiple 16425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * adapters. 16435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * - Converted to use new taskq interface. 16445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 16455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * v1.14a Jan 6, 2001 - Minor adjustments (spinlocks, etc.) 16465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 16475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *******************************************************************************/ 16485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 16495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 16505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <linux/module.h> 16515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 16525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include "tlan.h" 16535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 16545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <linux/init.h> 16555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <linux/ioport.h> 16565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <linux/pci.h> 16575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <linux/etherdevice.h> 16585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <linux/delay.h> 16595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <linux/spinlock.h> 16605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <linux/mii.h> 16615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 16625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecttypedef u32 (TLanIntVectorFunc)( struct net_device *, u16 ); 16635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 16645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* For removing EISA devices */ 16655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic struct net_device *TLan_Eisa_Devices; 16665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 16675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int TLanDevicesInstalled; 16685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 16695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Set speed, duplex and aui settings */ 16705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int aui[MAX_TLAN_BOARDS]; 16715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int duplex[MAX_TLAN_BOARDS]; 16725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int speed[MAX_TLAN_BOARDS]; 16735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int boards_found; 16745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 16755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectMODULE_AUTHOR("Maintainer: Torben Mathiasen <torben.mathiasen@compaq.com>"); 16765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectMODULE_DESCRIPTION("Driver for TI ThunderLAN based ethernet PCI adapters"); 16775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectMODULE_LICENSE("GPL"); 16785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 16795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectMODULE_PARM(aui, "1-" __MODULE_STRING(MAX_TLAN_BOARDS) "i"); 16805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectMODULE_PARM(duplex, "1-" __MODULE_STRING(MAX_TLAN_BOARDS) "i"); 16815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectMODULE_PARM(speed, "1-" __MODULE_STRING(MAX_TLAN_BOARDS) "i"); 16825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectMODULE_PARM(debug, "i"); 16835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectMODULE_PARM(bbuf, "i"); 16845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectMODULE_PARM_DESC(aui, "ThunderLAN use AUI port(s) (0-1)"); 16855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectMODULE_PARM_DESC(duplex, "ThunderLAN duplex setting(s) (0-default, 1-half, 2-full)"); 16865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectMODULE_PARM_DESC(speed, "ThunderLAN port speen setting(s) (0,10,100)"); 16875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectMODULE_PARM_DESC(debug, "ThunderLAN debug mask"); 16885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectMODULE_PARM_DESC(bbuf, "ThunderLAN use big buffer (0-1)"); 16895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectEXPORT_NO_SYMBOLS; 16905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 16915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Define this to enable Link beat monitoring */ 16925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#undef MONITOR 16935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 16945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Turn on debugging. See linux/Documentation/networking/tlan.txt for details */ 16955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int debug; 16965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 16975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int bbuf; 16985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic u8 *TLanPadBuffer; 16995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic char TLanSignature[] = "TLAN"; 17005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic const char tlan_banner[] = "ThunderLAN driver v1.14a\n"; 17015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int tlan_have_pci; 17025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int tlan_have_eisa; 17035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 17045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectconst char *media[] = { 17055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project "10BaseT-HD ", "10BaseT-FD ","100baseTx-HD ", 17065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project "100baseTx-FD", "100baseT4", 0 17075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}; 17085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 17095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectint media_map[] = { 0x0020, 0x0040, 0x0080, 0x0100, 0x0200,}; 17105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 17115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic struct board { 17125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project const char *deviceLabel; 17135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 flags; 17145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u16 addrOfs; 17155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} board_info[] __devinitdata = { 17165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { "Compaq Netelligent 10 T PCI UTP", TLAN_ADAPTER_ACTIVITY_LED, 0x83 }, 17175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { "Compaq Netelligent 10/100 TX PCI UTP", TLAN_ADAPTER_ACTIVITY_LED, 0x83 }, 17185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { "Compaq Integrated NetFlex-3/P", TLAN_ADAPTER_NONE, 0x83 }, 17195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { "Compaq NetFlex-3/P", TLAN_ADAPTER_UNMANAGED_PHY | TLAN_ADAPTER_BIT_RATE_PHY, 0x83 }, 17205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { "Compaq NetFlex-3/P", TLAN_ADAPTER_NONE, 0x83 }, 17215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { "Compaq Netelligent Integrated 10/100 TX UTP", TLAN_ADAPTER_ACTIVITY_LED, 0x83 }, 17225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { "Compaq Netelligent Dual 10/100 TX PCI UTP", TLAN_ADAPTER_NONE, 0x83 }, 17235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { "Compaq Netelligent 10/100 TX Embedded UTP", TLAN_ADAPTER_NONE, 0x83 }, 17245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { "Olicom OC-2183/2185", TLAN_ADAPTER_USE_INTERN_10, 0x83 }, 17255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { "Olicom OC-2325", TLAN_ADAPTER_UNMANAGED_PHY, 0xF8 }, 17265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { "Olicom OC-2326", TLAN_ADAPTER_USE_INTERN_10, 0xF8 }, 17275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { "Compaq Netelligent 10/100 TX UTP", TLAN_ADAPTER_ACTIVITY_LED, 0x83 }, 17285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { "Compaq Netelligent 10 T/2 PCI UTP/Coax", TLAN_ADAPTER_NONE, 0x83 }, 17295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { "Compaq NetFlex-3/E", TLAN_ADAPTER_ACTIVITY_LED | /* EISA card */ 17305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLAN_ADAPTER_UNMANAGED_PHY | TLAN_ADAPTER_BIT_RATE_PHY, 0x83 }, 17315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { "Compaq NetFlex-3/E", TLAN_ADAPTER_ACTIVITY_LED, 0x83 }, /* EISA card */ 17325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}; 17335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 17345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic struct pci_device_id tlan_pci_tbl[] __devinitdata = { 17355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_NETEL10, 17365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, 17375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_NETEL100, 17385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1 }, 17395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_NETFLEX3I, 17405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project PCI_ANY_ID, PCI_ANY_ID, 0, 0, 2 }, 17415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_THUNDER, 17425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project PCI_ANY_ID, PCI_ANY_ID, 0, 0, 3 }, 17435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_NETFLEX3B, 17445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project PCI_ANY_ID, PCI_ANY_ID, 0, 0, 4 }, 17455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_NETEL100PI, 17465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project PCI_ANY_ID, PCI_ANY_ID, 0, 0, 5 }, 17475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_NETEL100D, 17485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project PCI_ANY_ID, PCI_ANY_ID, 0, 0, 6 }, 17495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_NETEL100I, 17505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project PCI_ANY_ID, PCI_ANY_ID, 0, 0, 7 }, 17515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { PCI_VENDOR_ID_OLICOM, PCI_DEVICE_ID_OLICOM_OC2183, 17525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project PCI_ANY_ID, PCI_ANY_ID, 0, 0, 8 }, 17535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { PCI_VENDOR_ID_OLICOM, PCI_DEVICE_ID_OLICOM_OC2325, 17545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project PCI_ANY_ID, PCI_ANY_ID, 0, 0, 9 }, 17555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { PCI_VENDOR_ID_OLICOM, PCI_DEVICE_ID_OLICOM_OC2326, 17565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project PCI_ANY_ID, PCI_ANY_ID, 0, 0, 10 }, 17575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_NETELLIGENT_10_100_WS_5100, 17585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project PCI_ANY_ID, PCI_ANY_ID, 0, 0, 11 }, 17595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_NETELLIGENT_10_T2, 17605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project PCI_ANY_ID, PCI_ANY_ID, 0, 0, 12 }, 17615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 0,} 17625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}; 17635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectMODULE_DEVICE_TABLE(pci, tlan_pci_tbl); 17645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 17655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void TLan_EisaProbe( void ); 17665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void TLan_Eisa_Cleanup( void ); 17675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int TLan_Init( struct net_device * ); 17685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int TLan_Open( struct net_device *dev ); 17695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int TLan_StartTx( struct sk_buff *, struct net_device *); 17705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void TLan_HandleInterrupt( int, void *, struct pt_regs *); 17715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int TLan_Close( struct net_device *); 17725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic struct net_device_stats *TLan_GetStats( struct net_device *); 17735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void TLan_SetMulticastList( struct net_device *); 17745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int TLan_ioctl( struct net_device *dev, struct ifreq *rq, int cmd); 17755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int TLan_probe1( struct pci_dev *pdev, long ioaddr, int irq, int rev, const struct pci_device_id *ent); 17765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void TLan_tx_timeout( struct net_device *dev); 17775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int tlan_init_one( struct pci_dev *pdev, const struct pci_device_id *ent); 17785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 17795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic u32 TLan_HandleInvalid( struct net_device *, u16 ); 17805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic u32 TLan_HandleTxEOF( struct net_device *, u16 ); 17815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic u32 TLan_HandleStatOverflow( struct net_device *, u16 ); 17825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic u32 TLan_HandleRxEOF( struct net_device *, u16 ); 17835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic u32 TLan_HandleDummy( struct net_device *, u16 ); 17845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic u32 TLan_HandleTxEOC( struct net_device *, u16 ); 17855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic u32 TLan_HandleStatusCheck( struct net_device *, u16 ); 17865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic u32 TLan_HandleRxEOC( struct net_device *, u16 ); 17875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 17885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void TLan_Timer( unsigned long ); 17895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 17905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void TLan_ResetLists( struct net_device * ); 17915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void TLan_FreeLists( struct net_device * ); 17925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void TLan_PrintDio( u16 ); 17935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void TLan_PrintList( TLanList *, char *, int ); 17945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void TLan_ReadAndClearStats( struct net_device *, int ); 17955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void TLan_ResetAdapter( struct net_device * ); 17965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void TLan_FinishReset( struct net_device * ); 17975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void TLan_SetMac( struct net_device *, int areg, char *mac ); 17985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 17995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void TLan_PhyPrint( struct net_device * ); 18005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void TLan_PhyDetect( struct net_device * ); 18015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void TLan_PhyPowerDown( struct net_device * ); 18025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void TLan_PhyPowerUp( struct net_device * ); 18035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void TLan_PhyReset( struct net_device * ); 18045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void TLan_PhyStartLink( struct net_device * ); 18055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void TLan_PhyFinishAutoNeg( struct net_device * ); 18065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef MONITOR 18075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void TLan_PhyMonitor( struct net_device * ); 18085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif 18095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 18105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* 18115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int TLan_PhyNop( struct net_device * ); 18125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int TLan_PhyInternalCheck( struct net_device * ); 18135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int TLan_PhyInternalService( struct net_device * ); 18145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int TLan_PhyDp83840aCheck( struct net_device * ); 18155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project*/ 18165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 18175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int TLan_MiiReadReg( struct net_device *, u16, u16, u16 * ); 18185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void TLan_MiiSendData( u16, u32, unsigned ); 18195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void TLan_MiiSync( u16 ); 18205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void TLan_MiiWriteReg( struct net_device *, u16, u16, u16 ); 18215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 18225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void TLan_EeSendStart( u16 ); 18235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int TLan_EeSendByte( u16, u8, int ); 18245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void TLan_EeReceiveByte( u16, u8 *, int ); 18255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int TLan_EeReadByte( struct net_device *, u8, u8 * ); 18265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 18275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic TLanIntVectorFunc *TLanIntVector[TLAN_INT_NUMBER_OF_INTS] = { 18285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_HandleInvalid, 18295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_HandleTxEOF, 18305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_HandleStatOverflow, 18315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_HandleRxEOF, 18325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_HandleDummy, 18335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_HandleTxEOC, 18345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_HandleStatusCheck, 18355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_HandleRxEOC 18365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}; 18375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 18385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic inline void 18395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectTLan_SetTimer( struct net_device *dev, u32 ticks, u32 type ) 18405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 18415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLanPrivateInfo *priv = dev->priv; 18425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project unsigned long flags = 0; 18435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 18445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (!in_irq()) 18455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project spin_lock_irqsave(&priv->lock, flags); 18465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( priv->timer.function != NULL && 18475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->timerType != TLAN_TIMER_ACTIVITY ) { 18485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (!in_irq()) 18495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project spin_unlock_irqrestore(&priv->lock, flags); 18505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return; 18515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 18525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->timer.function = &TLan_Timer; 18535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (!in_irq()) 18545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project spin_unlock_irqrestore(&priv->lock, flags); 18555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 18565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->timer.data = (unsigned long) dev; 18575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->timerSetAt = jiffies; 18585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->timerType = type; 18595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mod_timer(&priv->timer, jiffies + ticks); 18605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 18615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* TLan_SetTimer */ 18625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 18635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/***************************************************************************** 18645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project****************************************************************************** 18655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 18665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ThunderLAN Driver Primary Functions 18675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 18685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project These functions are more or less common to all Linux network drivers. 18695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 18705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project****************************************************************************** 18715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project*****************************************************************************/ 18725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 18735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /*************************************************************** 18745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * tlan_remove_one 18755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 18765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Returns: 18775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Nothing 18785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Parms: 18795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * None 18805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 18815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Goes through the TLanDevices list and frees the device 18825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * structs and memory associated with each device (lists 18835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * and buffers). It also ureserves the IO port regions 18845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * associated with this device. 18855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 18865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project **************************************************************/ 18875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 18885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void __devexit tlan_remove_one( struct pci_dev *pdev) 18895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 18905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project struct net_device *dev = pci_get_drvdata( pdev ); 18915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLanPrivateInfo *priv = dev->priv; 18925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 18935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project unregister_netdev( dev ); 18945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 18955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( priv->dmaStorage ) { 18965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project kfree( priv->dmaStorage ); 18975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 18985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 18995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project release_region( dev->base_addr, 0x10 ); 19005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 19015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project kfree( dev ); 19025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 19035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project pci_set_drvdata( pdev, NULL ); 19045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 19055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 19065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic struct pci_driver tlan_driver = { 19075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project name: "tlan", 19085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project id_table: tlan_pci_tbl, 19095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project probe: tlan_init_one, 19105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project remove: tlan_remove_one, 19115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}; 19125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 19135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int __init tlan_probe(void) 19145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 19155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project static int pad_allocated; 19165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 19175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk(KERN_INFO "%s", tlan_banner); 19185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 19195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLanPadBuffer = (u8 *) kmalloc(TLAN_MIN_FRAME_SIZE, 19205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project GFP_KERNEL); 19215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 19225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (TLanPadBuffer == NULL) { 19235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk(KERN_ERR "TLAN: Could not allocate memory for pad buffer.\n"); 19245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return -ENOMEM; 19255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 19265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 19275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project memset(TLanPadBuffer, 0, TLAN_MIN_FRAME_SIZE); 19285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project pad_allocated = 1; 19295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 19305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLAN_DBG(TLAN_DEBUG_PROBE, "Starting PCI Probe....\n"); 19315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 19325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Use new style PCI probing. Now the kernel will 19335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project do most of this for us */ 19345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project pci_register_driver(&tlan_driver); 19355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 19365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLAN_DBG(TLAN_DEBUG_PROBE, "Starting EISA Probe....\n"); 19375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_EisaProbe(); 19385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 19395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk(KERN_INFO "TLAN: %d device%s installed, PCI: %d EISA: %d\n", 19405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLanDevicesInstalled, TLanDevicesInstalled == 1 ? "" : "s", 19415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project tlan_have_pci, tlan_have_eisa); 19425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 19435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (TLanDevicesInstalled == 0) { 19445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project pci_unregister_driver(&tlan_driver); 19455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project kfree(TLanPadBuffer); 19465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return -ENODEV; 19475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 19485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return 0; 19495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 19505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 19515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 19525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int __devinit tlan_init_one( struct pci_dev *pdev, 19535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project const struct pci_device_id *ent) 19545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 19555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return TLan_probe1( pdev, -1, -1, 0, ent); 19565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 19575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 19585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* 19595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *************************************************************** 19605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * tlan_probe1 19615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 19625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Returns: 19635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 0 on success, error code on error 19645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Parms: 19655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * none 19665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 19675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * The name is lower case to fit in with all the rest of 19685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * the netcard_probe names. This function looks for 19695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * another TLan based adapter, setting it up with the 19705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * allocated device struct if one is found. 19715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * tlan_probe has been ported to the new net API and 19725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * now allocates its own device structure. This function 19735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * is also used by modules. 19745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 19755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project **************************************************************/ 19765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 19775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int __devinit TLan_probe1(struct pci_dev *pdev, 19785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project long ioaddr, int irq, int rev, const struct pci_device_id *ent ) 19795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 19805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 19815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project struct net_device *dev; 19825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLanPrivateInfo *priv; 19835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u8 pci_rev; 19845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u16 device_id; 19855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int reg; 19865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 19875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (pdev && pci_enable_device(pdev)) 19885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return -EIO; 19895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 19905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project dev = init_etherdev(NULL, sizeof(TLanPrivateInfo)); 19915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (dev == NULL) { 19925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk(KERN_ERR "TLAN: Could not allocate memory for device.\n"); 19935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return -ENOMEM; 19945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 19955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project SET_MODULE_OWNER(dev); 19965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 19975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv = dev->priv; 19985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 19995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Is this a PCI device? */ 20005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (pdev) { 20015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 pci_io_base = 0; 20025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 20035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->adapter = &board_info[ent->driver_data]; 20045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 20055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project pci_read_config_byte ( pdev, PCI_REVISION_ID, &pci_rev); 20065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 20075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project for ( reg= 0; reg <= 5; reg ++ ) { 20085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (pci_resource_flags(pdev, reg) & IORESOURCE_IO) { 20095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project pci_io_base = pci_resource_start(pdev, reg); 20105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLAN_DBG( TLAN_DEBUG_GNRL, "IO mapping is available at %x.\n", 20115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project pci_io_base); 20125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project break; 20135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 20145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 20155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (!pci_io_base) { 20165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk(KERN_ERR "TLAN: No IO mappings available\n"); 20175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project unregister_netdev(dev); 20185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project kfree(dev); 20195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return -ENODEV; 20205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 20215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 20225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project dev->base_addr = pci_io_base; 20235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project dev->irq = pdev->irq; 20245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->adapterRev = pci_rev; 20255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project pci_set_master(pdev); 20265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project pci_set_drvdata(pdev, dev); 20275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 20285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else { /* EISA card */ 20295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* This is a hack. We need to know which board structure 20305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * is suited for this adapter */ 20315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project device_id = inw(ioaddr + EISA_ID2); 20325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->is_eisa = 1; 20335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (device_id == 0x20F1) { 20345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->adapter = &board_info[13]; /* NetFlex-3/E */ 20355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->adapterRev = 23; /* TLAN 2.3 */ 20365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else { 20375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->adapter = &board_info[14]; 20385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->adapterRev = 10; /* TLAN 1.0 */ 20395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 20405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project dev->base_addr = ioaddr; 20415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project dev->irq = irq; 20425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 20435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 20445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Kernel parameters */ 20455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (dev->mem_start) { 20465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->aui = dev->mem_start & 0x01; 20475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->duplex = ((dev->mem_start & 0x06) == 0x06) ? 0 : (dev->mem_start & 0x06) >> 1; 20485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->speed = ((dev->mem_start & 0x18) == 0x18) ? 0 : (dev->mem_start & 0x18) >> 3; 20495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 20505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (priv->speed == 0x1) { 20515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->speed = TLAN_SPEED_10; 20525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else if (priv->speed == 0x2) { 20535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->speed = TLAN_SPEED_100; 20545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 20555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project debug = priv->debug = dev->mem_end; 20565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else { 20575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->aui = aui[boards_found]; 20585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->speed = speed[boards_found]; 20595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->duplex = duplex[boards_found]; 20605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->debug = debug; 20615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 20625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 20635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* This will be used when we get an adapter error from 20645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * within our irq handler */ 20655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project INIT_LIST_HEAD(&priv->tlan_tqueue.list); 20665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->tlan_tqueue.sync = 0; 20675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->tlan_tqueue.routine = (void *)(void*)TLan_tx_timeout; 20685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->tlan_tqueue.data = dev; 20695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 20705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project spin_lock_init(&priv->lock); 20715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 20725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (TLan_Init(dev)) { 20735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk(KERN_ERR "TLAN: Could not register device.\n"); 20745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project unregister_netdev(dev); 20755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project kfree(dev); 20765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return -EAGAIN; 20775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else { 20785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 20795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLanDevicesInstalled++; 20805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project boards_found++; 20815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 20825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* pdev is NULL if this is an EISA device */ 20835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (pdev) 20845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project tlan_have_pci++; 20855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project else { 20865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->nextDevice = TLan_Eisa_Devices; 20875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_Eisa_Devices = dev; 20885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project tlan_have_eisa++; 20895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 20905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 20915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk(KERN_INFO "TLAN: %s irq=%2d, io=%04x, %s, Rev. %d\n", 20925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project dev->name, 20935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project (int) dev->irq, 20945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project (int) dev->base_addr, 20955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->adapter->deviceLabel, 20965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->adapterRev); 20975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return 0; 20985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 20995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 21005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 21015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 21025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void TLan_Eisa_Cleanup(void) 21035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 21045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project struct net_device *dev; 21055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLanPrivateInfo *priv; 21065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 21075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project while( tlan_have_eisa ) { 21085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project dev = TLan_Eisa_Devices; 21095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv = dev->priv; 21105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (priv->dmaStorage) { 21115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project kfree(priv->dmaStorage); 21125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 21135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project release_region( dev->base_addr, 0x10); 21145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project unregister_netdev( dev ); 21155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_Eisa_Devices = priv->nextDevice; 21165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project kfree( dev ); 21175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project tlan_have_eisa--; 21185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 21195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 21205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 21215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 21225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void __exit tlan_exit(void) 21235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 21245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project pci_unregister_driver(&tlan_driver); 21255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 21265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (tlan_have_eisa) 21275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_Eisa_Cleanup(); 21285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 21295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project kfree( TLanPadBuffer ); 21305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 21315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 21325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 21335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Module loading/unloading */ 21345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectmodule_init(tlan_probe); 21355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectmodule_exit(tlan_exit); 21365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 21375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /************************************************************** 21385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLan_EisaProbe 21395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 21405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Returns: 0 on success, 1 otherwise 21415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 21425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Parms: None 21435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 21445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 21455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This functions probes for EISA devices and calls 21465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLan_probe1 when one is found. 21475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 21485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *************************************************************/ 21495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 21505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void __init TLan_EisaProbe (void) 21515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 21525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project long ioaddr; 21535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int rc = -ENODEV; 21545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int irq; 21555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u16 device_id; 21565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 21575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (!EISA_bus) { 21585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLAN_DBG(TLAN_DEBUG_PROBE, "No EISA bus present\n"); 21595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return; 21605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 21615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 21625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Loop through all slots of the EISA bus */ 21635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project for (ioaddr = 0x1000; ioaddr < 0x9000; ioaddr += 0x1000) { 21645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 21655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLAN_DBG(TLAN_DEBUG_PROBE,"EISA_ID 0x%4x: 0x%4x\n", (int) ioaddr + 0xC80, inw(ioaddr + EISA_ID)); 21665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLAN_DBG(TLAN_DEBUG_PROBE,"EISA_ID 0x%4x: 0x%4x\n", (int) ioaddr + 0xC82, inw(ioaddr + EISA_ID2)); 21675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 21685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLAN_DBG(TLAN_DEBUG_PROBE, "Probing for EISA adapter at IO: 0x%4x : ", 21695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project (int) ioaddr); 21705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (request_region(ioaddr, 0x10, TLanSignature) == NULL) 21715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project goto out; 21725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 21735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (inw(ioaddr + EISA_ID) != 0x110E) { 21745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project release_region(ioaddr, 0x10); 21755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project goto out; 21765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 21775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 21785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project device_id = inw(ioaddr + EISA_ID2); 21795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (device_id != 0x20F1 && device_id != 0x40F1) { 21805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project release_region (ioaddr, 0x10); 21815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project goto out; 21825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 21835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 21845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (inb(ioaddr + EISA_CR) != 0x1) { /* Check if adapter is enabled */ 21855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project release_region (ioaddr, 0x10); 21865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project goto out2; 21875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 21885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 21895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (debug == 0x10) 21905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk("Found one\n"); 21915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 21925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Get irq from board */ 21935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project switch (inb(ioaddr + 0xCC0)) { 21945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case(0x10): 21955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project irq=5; 21965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project break; 21975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case(0x20): 21985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project irq=9; 21995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project break; 22005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case(0x40): 22015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project irq=10; 22025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project break; 22035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case(0x80): 22045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project irq=11; 22055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project break; 22065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project default: 22075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project goto out; 22085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 22095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 22105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 22115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Setup the newly found eisa adapter */ 22125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project rc = TLan_probe1( NULL, ioaddr, irq, 22135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 12, NULL); 22145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project continue; 22155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 22165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project out: 22175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (debug == 0x10) 22185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk("None found\n"); 22195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project continue; 22205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 22215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project out2: if (debug == 0x10) 22225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk("Card found but it is not enabled, skipping\n"); 22235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project continue; 22245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 22255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 22265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 22275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* TLan_EisaProbe */ 22285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 22295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 22305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 22315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /*************************************************************** 22325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLan_Init 22335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 22345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Returns: 22355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 0 on success, error code otherwise. 22365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Parms: 22375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * dev The structure of the device to be 22385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * init'ed. 22395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 22405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This function completes the initialization of the 22415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * device structure and driver. It reserves the IO 22425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * addresses, allocates memory for the lists and bounce 22435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * buffers, retrieves the MAC address from the eeprom 22445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * and assignes the device's methods. 22455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 22465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project **************************************************************/ 22475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 22485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int TLan_Init( struct net_device *dev ) 22495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 22505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int dma_size; 22515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int err; 22525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int i; 22535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLanPrivateInfo *priv; 22545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 22555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv = dev->priv; 22565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 22575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (!priv->is_eisa) /* EISA devices have already requested IO */ 22585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (!request_region( dev->base_addr, 0x10, TLanSignature )) { 22595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk(KERN_ERR "TLAN: %s: IO port region 0x%lx size 0x%x in use.\n", 22605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project dev->name, 22615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project dev->base_addr, 22625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 0x10 ); 22635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return -EIO; 22645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 22655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 22665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( bbuf ) { 22675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project dma_size = ( TLAN_NUM_RX_LISTS + TLAN_NUM_TX_LISTS ) 22685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * ( sizeof(TLanList) + TLAN_MAX_FRAME_SIZE ); 22695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else { 22705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project dma_size = ( TLAN_NUM_RX_LISTS + TLAN_NUM_TX_LISTS ) 22715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * ( sizeof(TLanList) ); 22725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 22735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->dmaStorage = kmalloc(dma_size, GFP_KERNEL | GFP_DMA); 22745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( priv->dmaStorage == NULL ) { 22755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk(KERN_ERR "TLAN: Could not allocate lists and buffers for %s.\n", 22765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project dev->name ); 22775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project release_region( dev->base_addr, 0x10 ); 22785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return -ENOMEM; 22795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 22805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project memset( priv->dmaStorage, 0, dma_size ); 22815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->rxList = (TLanList *) 22825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ( ( ( (u32) priv->dmaStorage ) + 7 ) & 0xFFFFFFF8 ); 22835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->txList = priv->rxList + TLAN_NUM_RX_LISTS; 22845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( bbuf ) { 22855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->rxBuffer = (u8 *) ( priv->txList + TLAN_NUM_TX_LISTS ); 22865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->txBuffer = priv->rxBuffer 22875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project + ( TLAN_NUM_RX_LISTS * TLAN_MAX_FRAME_SIZE ); 22885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 22895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 22905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project err = 0; 22915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project for ( i = 0; i < 6 ; i++ ) 22925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project err |= TLan_EeReadByte( dev, 22935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project (u8) priv->adapter->addrOfs + i, 22945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project (u8 *) &dev->dev_addr[i] ); 22955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( err ) { 22965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk(KERN_ERR "TLAN: %s: Error reading MAC from eeprom: %d\n", 22975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project dev->name, 22985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project err ); 22995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 23005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project dev->addr_len = 6; 23015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 23025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Device methods */ 23035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project dev->open = &TLan_Open; 23045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project dev->hard_start_xmit = &TLan_StartTx; 23055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project dev->stop = &TLan_Close; 23065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project dev->get_stats = &TLan_GetStats; 23075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project dev->set_multicast_list = &TLan_SetMulticastList; 23085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project dev->do_ioctl = &TLan_ioctl; 23095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project dev->tx_timeout = &TLan_tx_timeout; 23105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project dev->watchdog_timeo = TX_TIMEOUT; 23115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 23125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return 0; 23135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 23145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* TLan_Init */ 23155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 23165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /*************************************************************** 23175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLan_Open 23185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 23195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Returns: 23205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 0 on success, error code otherwise. 23215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Parms: 23225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * dev Structure of device to be opened. 23235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 23245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This routine puts the driver and TLAN adapter in a 23255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * state where it is ready to send and receive packets. 23265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * It allocates the IRQ, resets and brings the adapter 23275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * out of reset, and allows interrupts. It also delays 23285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * the startup for autonegotiation or sends a Rx GO 23295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * command to the adapter, as appropriate. 23305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 23315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project **************************************************************/ 23325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 23335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int TLan_Open( struct net_device *dev ) 23345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 23355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLanPrivateInfo *priv = dev->priv; 23365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int err; 23375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 23385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->tlanRev = TLan_DioRead8( dev->base_addr, TLAN_DEF_REVISION ); 23395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project err = request_irq( dev->irq, TLan_HandleInterrupt, SA_SHIRQ, TLanSignature, dev ); 23405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 23415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( err ) { 23425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk(KERN_ERR "TLAN: Cannot open %s because IRQ %d is already in use.\n", dev->name, dev->irq ); 23435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return err; 23445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 23455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 23465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project init_timer(&priv->timer); 23475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project netif_start_queue(dev); 23485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 23495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* NOTE: It might not be necessary to read the stats before a 23505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project reset if you don't care what the values are. 23515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 23525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_ResetLists( dev ); 23535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_ReadAndClearStats( dev, TLAN_IGNORE ); 23545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_ResetAdapter( dev ); 23555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 23565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLAN_DBG( TLAN_DEBUG_GNRL, "%s: Opened. TLAN Chip Rev: %x\n", dev->name, priv->tlanRev ); 23575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 23585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return 0; 23595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 23605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* TLan_Open */ 23615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 23625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /************************************************************** 23635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLan_ioctl 23645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 23655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Returns: 23665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 0 on success, error code otherwise 23675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Params: 23685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * dev structure of device to receive ioctl. 23695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 23705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * rq ifreq structure to hold userspace data. 23715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 23725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * cmd ioctl command. 23735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 23745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 23755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *************************************************************/ 23765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 23775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int TLan_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) 23785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 23795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLanPrivateInfo *priv = dev->priv; 23805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project struct mii_ioctl_data *data = (struct mii_ioctl_data *)&rq->ifr_data; 23815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 phy = priv->phy[priv->phyNum]; 23825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 23835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (!priv->phyOnline) 23845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return -EAGAIN; 23855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 23865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project switch(cmd) { 23875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case SIOCGMIIPHY: /* Get address of MII PHY in use. */ 23885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case SIOCDEVPRIVATE: /* for binary compat, remove in 2.5 */ 23895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project data->phy_id = phy; 23905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 23915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case SIOCGMIIREG: /* Read MII PHY register. */ 23925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case SIOCDEVPRIVATE+1: /* for binary compat, remove in 2.5 */ 23935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiReadReg(dev, data->phy_id & 0x1f, data->reg_num & 0x1f, &data->val_out); 23945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return 0; 23955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 23965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 23975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case SIOCSMIIREG: /* Write MII PHY register. */ 23985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case SIOCDEVPRIVATE+2: /* for binary compat, remove in 2.5 */ 23995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (!capable(CAP_NET_ADMIN)) 24005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return -EPERM; 24015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiWriteReg(dev, data->phy_id & 0x1f, data->reg_num & 0x1f, data->val_in); 24025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return 0; 24035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project default: 24045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return -EOPNOTSUPP; 24055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 24065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* tlan_ioctl */ 24075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 24085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /*************************************************************** 24095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLan_tx_timeout 24105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 24115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Returns: nothing 24125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 24135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Params: 24145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * dev structure of device which timed out 24155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * during transmit. 24165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 24175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project **************************************************************/ 24185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 24195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void TLan_tx_timeout(struct net_device *dev) 24205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 24215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 24225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLAN_DBG( TLAN_DEBUG_GNRL, "%s: Transmit timed out.\n", dev->name); 24235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 24245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Ok so we timed out, lets see what we can do about it...*/ 24255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_FreeLists( dev ); 24265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_ResetLists( dev ); 24275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_ReadAndClearStats( dev, TLAN_IGNORE ); 24285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_ResetAdapter( dev ); 24295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project dev->trans_start = jiffies; 24305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project netif_wake_queue( dev ); 24315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 24325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 24335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 24345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 24355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /*************************************************************** 24365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLan_StartTx 24375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 24385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Returns: 24395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 0 on success, non-zero on failure. 24405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Parms: 24415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * skb A pointer to the sk_buff containing the 24425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * frame to be sent. 24435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * dev The device to send the data on. 24445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 24455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This function adds a frame to the Tx list to be sent 24465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * ASAP. First it verifies that the adapter is ready and 24475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * there is room in the queue. Then it sets up the next 24485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * available list, copies the frame to the corresponding 24495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * buffer. If the adapter Tx channel is idle, it gives 24505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * the adapter a Tx Go command on the list, otherwise it 24515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * sets the forward address of the previous list to point 24525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * to this one. Then it frees the sk_buff. 24535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 24545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project **************************************************************/ 24555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 24565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int TLan_StartTx( struct sk_buff *skb, struct net_device *dev ) 24575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 24585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLanPrivateInfo *priv = dev->priv; 24595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLanList *tail_list; 24605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u8 *tail_buffer; 24615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int pad; 24625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project unsigned long flags; 24635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 24645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( ! priv->phyOnline ) { 24655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLAN_DBG( TLAN_DEBUG_TX, "TRANSMIT: %s PHY is not ready\n", dev->name ); 24665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project dev_kfree_skb_any(skb); 24675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return 0; 24685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 24695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 24705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project tail_list = priv->txList + priv->txTail; 24715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 24725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( tail_list->cStat != TLAN_CSTAT_UNUSED ) { 24735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLAN_DBG( TLAN_DEBUG_TX, "TRANSMIT: %s is busy (Head=%d Tail=%d)\n", dev->name, priv->txHead, priv->txTail ); 24745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project netif_stop_queue(dev); 24755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->txBusyCount++; 24765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return 1; 24775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 24785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 24795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project tail_list->forward = 0; 24805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 24815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( bbuf ) { 24825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project tail_buffer = priv->txBuffer + ( priv->txTail * TLAN_MAX_FRAME_SIZE ); 24835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project memcpy( tail_buffer, skb->data, skb->len ); 24845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else { 24855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project tail_list->buffer[0].address = virt_to_bus( skb->data ); 24865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project tail_list->buffer[9].address = (u32) skb; 24875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 24885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 24895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project pad = TLAN_MIN_FRAME_SIZE - skb->len; 24905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 24915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( pad > 0 ) { 24925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project tail_list->frameSize = (u16) skb->len + pad; 24935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project tail_list->buffer[0].count = (u32) skb->len; 24945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project tail_list->buffer[1].count = TLAN_LAST_BUFFER | (u32) pad; 24955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project tail_list->buffer[1].address = virt_to_bus( TLanPadBuffer ); 24965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else { 24975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project tail_list->frameSize = (u16) skb->len; 24985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project tail_list->buffer[0].count = TLAN_LAST_BUFFER | (u32) skb->len; 24995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project tail_list->buffer[1].count = 0; 25005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project tail_list->buffer[1].address = 0; 25015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 25025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 25035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project spin_lock_irqsave(&priv->lock, flags); 25045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project tail_list->cStat = TLAN_CSTAT_READY; 25055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( ! priv->txInProgress ) { 25065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->txInProgress = 1; 25075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLAN_DBG( TLAN_DEBUG_TX, "TRANSMIT: Starting TX on buffer %d\n", priv->txTail ); 25085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outl( virt_to_bus( tail_list ), dev->base_addr + TLAN_CH_PARM ); 25095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outl( TLAN_HC_GO, dev->base_addr + TLAN_HOST_CMD ); 25105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else { 25115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLAN_DBG( TLAN_DEBUG_TX, "TRANSMIT: Adding buffer %d to TX channel\n", priv->txTail ); 25125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( priv->txTail == 0 ) { 25135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ( priv->txList + ( TLAN_NUM_TX_LISTS - 1 ) )->forward = virt_to_bus( tail_list ); 25145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else { 25155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ( priv->txList + ( priv->txTail - 1 ) )->forward = virt_to_bus( tail_list ); 25165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 25175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 25185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project spin_unlock_irqrestore(&priv->lock, flags); 25195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 25205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project CIRC_INC( priv->txTail, TLAN_NUM_TX_LISTS ); 25215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 25225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( bbuf ) 25235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project dev_kfree_skb_any(skb); 25245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 25255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project dev->trans_start = jiffies; 25265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return 0; 25275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 25285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* TLan_StartTx */ 25295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 25305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /*************************************************************** 25315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLan_HandleInterrupt 25325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 25335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Returns: 25345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Nothing 25355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Parms: 25365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * irq The line on which the interrupt 25375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * occurred. 25385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * dev_id A pointer to the device assigned to 25395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * this irq line. 25405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * regs ??? 25415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 25425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This function handles an interrupt generated by its 25435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * assigned TLAN adapter. The function deactivates 25445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * interrupts on its adapter, records the type of 25455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * interrupt, executes the appropriate subhandler, and 25465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * acknowdges the interrupt to the adapter (thus 25475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * re-enabling adapter interrupts. 25485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 25495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project **************************************************************/ 25505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 25515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void TLan_HandleInterrupt(int irq, void *dev_id, struct pt_regs *regs) 25525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 25535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 ack; 25545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project struct net_device *dev; 25555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 host_cmd; 25565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u16 host_int; 25575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int type; 25585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLanPrivateInfo *priv; 25595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 25605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project dev = dev_id; 25615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv = dev->priv; 25625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 25635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project spin_lock(&priv->lock); 25645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 25655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project host_int = inw( dev->base_addr + TLAN_HOST_INT ); 25665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outw( host_int, dev->base_addr + TLAN_HOST_INT ); 25675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 25685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project type = ( host_int & TLAN_HI_IT_MASK ) >> 2; 25695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 25705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ack = TLanIntVector[type]( dev, host_int ); 25715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 25725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( ack ) { 25735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project host_cmd = TLAN_HC_ACK | ack | ( type << 18 ); 25745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outl( host_cmd, dev->base_addr + TLAN_HOST_CMD ); 25755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 25765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 25775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project spin_unlock(&priv->lock); 25785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 25795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* TLan_HandleInterrupts */ 25805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 25815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /*************************************************************** 25825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLan_Close 25835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 25845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Returns: 25855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * An error code. 25865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Parms: 25875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * dev The device structure of the device to 25885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * close. 25895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 25905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This function shuts down the adapter. It records any 25915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * stats, puts the adapter into reset state, deactivates 25925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * its time as needed, and frees the irq it is using. 25935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 25945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project **************************************************************/ 25955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 25965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int TLan_Close(struct net_device *dev) 25975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 25985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLanPrivateInfo *priv = dev->priv; 25995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 26005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project netif_stop_queue(dev); 26015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->neg_be_verbose = 0; 26025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 26035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_ReadAndClearStats( dev, TLAN_RECORD ); 26045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outl( TLAN_HC_AD_RST, dev->base_addr + TLAN_HOST_CMD ); 26055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( priv->timer.function != NULL ) { 26065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project del_timer_sync( &priv->timer ); 26075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->timer.function = NULL; 26085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 26095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 26105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project free_irq( dev->irq, dev ); 26115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_FreeLists( dev ); 26125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLAN_DBG( TLAN_DEBUG_GNRL, "Device %s closed.\n", dev->name ); 26135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 26145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return 0; 26155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 26165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* TLan_Close */ 26175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 26185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /*************************************************************** 26195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLan_GetStats 26205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 26215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Returns: 26225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * A pointer to the device's statistics structure. 26235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Parms: 26245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * dev The device structure to return the 26255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * stats for. 26265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 26275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This function updates the devices statistics by reading 26285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * the TLAN chip's onboard registers. Then it returns the 26295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * address of the statistics structure. 26305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 26315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project **************************************************************/ 26325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 26335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic struct net_device_stats *TLan_GetStats( struct net_device *dev ) 26345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 26355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLanPrivateInfo *priv = dev->priv; 26365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int i; 26375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 26385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Should only read stats if open ? */ 26395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_ReadAndClearStats( dev, TLAN_RECORD ); 26405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 26415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLAN_DBG( TLAN_DEBUG_RX, "RECEIVE: %s EOC count = %d\n", dev->name, priv->rxEocCount ); 26425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLAN_DBG( TLAN_DEBUG_TX, "TRANSMIT: %s Busy count = %d\n", dev->name, priv->txBusyCount ); 26435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( debug & TLAN_DEBUG_GNRL ) { 26445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_PrintDio( dev->base_addr ); 26455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_PhyPrint( dev ); 26465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 26475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( debug & TLAN_DEBUG_LIST ) { 26485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project for ( i = 0; i < TLAN_NUM_RX_LISTS; i++ ) 26495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_PrintList( priv->rxList + i, "RX", i ); 26505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project for ( i = 0; i < TLAN_NUM_TX_LISTS; i++ ) 26515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_PrintList( priv->txList + i, "TX", i ); 26525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 26535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 26545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return ( &( (TLanPrivateInfo *) dev->priv )->stats ); 26555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 26565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* TLan_GetStats */ 26575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 26585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /*************************************************************** 26595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLan_SetMulticastList 26605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 26615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Returns: 26625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Nothing 26635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Parms: 26645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * dev The device structure to set the 26655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * multicast list for. 26665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 26675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This function sets the TLAN adaptor to various receive 26685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * modes. If the IFF_PROMISC flag is set, promiscuous 26695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * mode is acitviated. Otherwise, promiscuous mode is 26705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * turned off. If the IFF_ALLMULTI flag is set, then 26715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * the hash table is set to receive all group addresses. 26725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Otherwise, the first three multicast addresses are 26735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * stored in AREG_1-3, and the rest are selected via the 26745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * hash table, as necessary. 26755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 26765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project **************************************************************/ 26775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 26785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void TLan_SetMulticastList( struct net_device *dev ) 26795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 26805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project struct dev_mc_list *dmi = dev->mc_list; 26815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 hash1 = 0; 26825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 hash2 = 0; 26835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int i; 26845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 offset; 26855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u8 tmp; 26865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 26875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( dev->flags & IFF_PROMISC ) { 26885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project tmp = TLan_DioRead8( dev->base_addr, TLAN_NET_CMD ); 26895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_DioWrite8( dev->base_addr, TLAN_NET_CMD, tmp | TLAN_NET_CMD_CAF ); 26905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else { 26915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project tmp = TLan_DioRead8( dev->base_addr, TLAN_NET_CMD ); 26925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_DioWrite8( dev->base_addr, TLAN_NET_CMD, tmp & ~TLAN_NET_CMD_CAF ); 26935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( dev->flags & IFF_ALLMULTI ) { 26945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project for ( i = 0; i < 3; i++ ) 26955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_SetMac( dev, i + 1, NULL ); 26965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_DioWrite32( dev->base_addr, TLAN_HASH_1, 0xFFFFFFFF ); 26975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_DioWrite32( dev->base_addr, TLAN_HASH_2, 0xFFFFFFFF ); 26985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else { 26995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project for ( i = 0; i < dev->mc_count; i++ ) { 27005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( i < 3 ) { 27015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_SetMac( dev, i + 1, (char *) &dmi->dmi_addr ); 27025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else { 27035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project offset = TLan_HashFunc( (u8 *) &dmi->dmi_addr ); 27045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( offset < 32 ) 27055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project hash1 |= ( 1 << offset ); 27065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project else 27075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project hash2 |= ( 1 << ( offset - 32 ) ); 27085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 27095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project dmi = dmi->next; 27105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 27115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project for ( ; i < 3; i++ ) 27125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_SetMac( dev, i + 1, NULL ); 27135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_DioWrite32( dev->base_addr, TLAN_HASH_1, hash1 ); 27145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_DioWrite32( dev->base_addr, TLAN_HASH_2, hash2 ); 27155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 27165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 27175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 27185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* TLan_SetMulticastList */ 27195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 27205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/***************************************************************************** 27215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project****************************************************************************** 27225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 27235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ThunderLAN Driver Interrupt Vectors and Table 27245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 27255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project Please see Chap. 4, "Interrupt Handling" of the "ThunderLAN 27265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project Programmer's Guide" for more informations on handling interrupts 27275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project generated by TLAN based adapters. 27285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 27295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project****************************************************************************** 27305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project*****************************************************************************/ 27315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 27325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /*************************************************************** 27335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLan_HandleInvalid 27345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 27355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Returns: 27365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 0 27375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Parms: 27385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * dev Device assigned the IRQ that was 27395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * raised. 27405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * host_int The contents of the HOST_INT 27415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * port. 27425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 27435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This function handles invalid interrupts. This should 27445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * never happen unless some other adapter is trying to use 27455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * the IRQ line assigned to the device. 27465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 27475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project **************************************************************/ 27485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 27495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectu32 TLan_HandleInvalid( struct net_device *dev, u16 host_int ) 27505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 27515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* printk( "TLAN: Invalid interrupt on %s.\n", dev->name ); */ 27525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return 0; 27535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 27545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* TLan_HandleInvalid */ 27555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 27565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /*************************************************************** 27575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLan_HandleTxEOF 27585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 27595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Returns: 27605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 1 27615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Parms: 27625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * dev Device assigned the IRQ that was 27635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * raised. 27645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * host_int The contents of the HOST_INT 27655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * port. 27665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 27675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This function handles Tx EOF interrupts which are raised 27685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * by the adapter when it has completed sending the 27695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * contents of a buffer. If detemines which list/buffer 27705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * was completed and resets it. If the buffer was the last 27715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * in the channel (EOC), then the function checks to see if 27725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * another buffer is ready to send, and if so, sends a Tx 27735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Go command. Finally, the driver activates/continues the 27745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * activity LED. 27755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 27765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project **************************************************************/ 27775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 27785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectu32 TLan_HandleTxEOF( struct net_device *dev, u16 host_int ) 27795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 27805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLanPrivateInfo *priv = dev->priv; 27815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int eoc = 0; 27825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLanList *head_list; 27835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 ack = 0; 27845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u16 tmpCStat; 27855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 27865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLAN_DBG( TLAN_DEBUG_TX, "TRANSMIT: Handling TX EOF (Head=%d Tail=%d)\n", priv->txHead, priv->txTail ); 27875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project head_list = priv->txList + priv->txHead; 27885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 27895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project while (((tmpCStat = head_list->cStat ) & TLAN_CSTAT_FRM_CMP) && (ack < 255)) { 27905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ack++; 27915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( ! bbuf ) { 27925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project dev_kfree_skb_any( (struct sk_buff *) head_list->buffer[9].address ); 27935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project head_list->buffer[9].address = 0; 27945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 27955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 27965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( tmpCStat & TLAN_CSTAT_EOC ) 27975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project eoc = 1; 27985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 27995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->stats.tx_bytes += head_list->frameSize; 28005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 28015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project head_list->cStat = TLAN_CSTAT_UNUSED; 28025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project netif_start_queue(dev); 28035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project CIRC_INC( priv->txHead, TLAN_NUM_TX_LISTS ); 28045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project head_list = priv->txList + priv->txHead; 28055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 28065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 28075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (!ack) 28085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk(KERN_INFO "TLAN: Received interrupt for uncompleted TX frame.\n"); 28095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 28105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( eoc ) { 28115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLAN_DBG( TLAN_DEBUG_TX, "TRANSMIT: Handling TX EOC (Head=%d Tail=%d)\n", priv->txHead, priv->txTail ); 28125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project head_list = priv->txList + priv->txHead; 28135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( ( head_list->cStat & TLAN_CSTAT_READY ) == TLAN_CSTAT_READY ) { 28145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outl( virt_to_bus( head_list ), dev->base_addr + TLAN_CH_PARM ); 28155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ack |= TLAN_HC_GO; 28165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else { 28175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->txInProgress = 0; 28185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 28195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 28205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 28215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( priv->adapter->flags & TLAN_ADAPTER_ACTIVITY_LED ) { 28225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_DioWrite8( dev->base_addr, TLAN_LED_REG, TLAN_LED_LINK | TLAN_LED_ACT ); 28235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( priv->timer.function == NULL ) { 28245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->timer.function = &TLan_Timer; 28255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->timer.data = (unsigned long) dev; 28265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->timer.expires = jiffies + TLAN_TIMER_ACT_DELAY; 28275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->timerSetAt = jiffies; 28285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->timerType = TLAN_TIMER_ACTIVITY; 28295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project add_timer(&priv->timer); 28305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else if ( priv->timerType == TLAN_TIMER_ACTIVITY ) { 28315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->timerSetAt = jiffies; 28325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 28335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 28345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 28355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return ack; 28365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 28375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* TLan_HandleTxEOF */ 28385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 28395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /*************************************************************** 28405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLan_HandleStatOverflow 28415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 28425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Returns: 28435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 1 28445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Parms: 28455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * dev Device assigned the IRQ that was 28465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * raised. 28475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * host_int The contents of the HOST_INT 28485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * port. 28495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 28505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This function handles the Statistics Overflow interrupt 28515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * which means that one or more of the TLAN statistics 28525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * registers has reached 1/2 capacity and needs to be read. 28535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 28545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project **************************************************************/ 28555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 28565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectu32 TLan_HandleStatOverflow( struct net_device *dev, u16 host_int ) 28575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 28585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_ReadAndClearStats( dev, TLAN_RECORD ); 28595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 28605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return 1; 28615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 28625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* TLan_HandleStatOverflow */ 28635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 28645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /*************************************************************** 28655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLan_HandleRxEOF 28665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 28675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Returns: 28685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 1 28695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Parms: 28705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * dev Device assigned the IRQ that was 28715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * raised. 28725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * host_int The contents of the HOST_INT 28735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * port. 28745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 28755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This function handles the Rx EOF interrupt which 28765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * indicates a frame has been received by the adapter from 28775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * the net and the frame has been transferred to memory. 28785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * The function determines the bounce buffer the frame has 28795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * been loaded into, creates a new sk_buff big enough to 28805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * hold the frame, and sends it to protocol stack. It 28815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * then resets the used buffer and appends it to the end 28825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * of the list. If the frame was the last in the Rx 28835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * channel (EOC), the function restarts the receive channel 28845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * by sending an Rx Go command to the adapter. Then it 28855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * activates/continues the activity LED. 28865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 28875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project **************************************************************/ 28885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 28895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectu32 TLan_HandleRxEOF( struct net_device *dev, u16 host_int ) 28905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 28915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLanPrivateInfo *priv = dev->priv; 28925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 ack = 0; 28935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int eoc = 0; 28945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u8 *head_buffer; 28955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLanList *head_list; 28965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project struct sk_buff *skb; 28975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLanList *tail_list; 28985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project void *t; 28995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 frameSize; 29005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u16 tmpCStat; 29015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 29025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLAN_DBG( TLAN_DEBUG_RX, "RECEIVE: Handling RX EOF (Head=%d Tail=%d)\n", priv->rxHead, priv->rxTail ); 29035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project head_list = priv->rxList + priv->rxHead; 29045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 29055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project while (((tmpCStat = head_list->cStat) & TLAN_CSTAT_FRM_CMP) && (ack < 255)) { 29065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project frameSize = head_list->frameSize; 29075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ack++; 29085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (tmpCStat & TLAN_CSTAT_EOC) 29095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project eoc = 1; 29105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 29115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (bbuf) { 29125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project skb = dev_alloc_skb(frameSize + 7); 29135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (skb == NULL) 29145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk(KERN_INFO "TLAN: Couldn't allocate memory for received data.\n"); 29155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project else { 29165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project head_buffer = priv->rxBuffer + (priv->rxHead * TLAN_MAX_FRAME_SIZE); 29175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project skb->dev = dev; 29185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project skb_reserve(skb, 2); 29195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project t = (void *) skb_put(skb, frameSize); 29205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 29215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->stats.rx_bytes += head_list->frameSize; 29225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 29235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project memcpy( t, head_buffer, frameSize ); 29245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project skb->protocol = eth_type_trans( skb, dev ); 29255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project netif_rx( skb ); 29265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 29275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else { 29285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project struct sk_buff *new_skb; 29295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 29305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* 29315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * I changed the algorithm here. What we now do 29325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * is allocate the new frame. If this fails we 29335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * simply recycle the frame. 29345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 29355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 29365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project new_skb = dev_alloc_skb( TLAN_MAX_FRAME_SIZE + 7 ); 29375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 29385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( new_skb != NULL ) { 29395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* If this ever happened it would be a problem */ 29405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* not any more - ac */ 29415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project skb = (struct sk_buff *) head_list->buffer[9].address; 29425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project skb_trim( skb, frameSize ); 29435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 29445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->stats.rx_bytes += frameSize; 29455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 29465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project skb->protocol = eth_type_trans( skb, dev ); 29475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project netif_rx( skb ); 29485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 29495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project new_skb->dev = dev; 29505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project skb_reserve( new_skb, 2 ); 29515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project t = (void *) skb_put( new_skb, TLAN_MAX_FRAME_SIZE ); 29525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project head_list->buffer[0].address = virt_to_bus( t ); 29535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project head_list->buffer[8].address = (u32) t; 29545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project head_list->buffer[9].address = (u32) new_skb; 29555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else 29565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk(KERN_WARNING "TLAN: Couldn't allocate memory for received data.\n" ); 29575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 29585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 29595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project head_list->forward = 0; 29605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project head_list->cStat = 0; 29615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project tail_list = priv->rxList + priv->rxTail; 29625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project tail_list->forward = virt_to_bus( head_list ); 29635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 29645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project CIRC_INC( priv->rxHead, TLAN_NUM_RX_LISTS ); 29655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project CIRC_INC( priv->rxTail, TLAN_NUM_RX_LISTS ); 29665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project head_list = priv->rxList + priv->rxHead; 29675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 29685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 29695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (!ack) 29705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk(KERN_INFO "TLAN: Received interrupt for uncompleted RX frame.\n"); 29715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 29725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 29735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( eoc ) { 29745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLAN_DBG( TLAN_DEBUG_RX, "RECEIVE: Handling RX EOC (Head=%d Tail=%d)\n", priv->rxHead, priv->rxTail ); 29755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project head_list = priv->rxList + priv->rxHead; 29765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outl( virt_to_bus( head_list ), dev->base_addr + TLAN_CH_PARM ); 29775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ack |= TLAN_HC_GO | TLAN_HC_RT; 29785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->rxEocCount++; 29795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 29805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 29815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( priv->adapter->flags & TLAN_ADAPTER_ACTIVITY_LED ) { 29825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_DioWrite8( dev->base_addr, TLAN_LED_REG, TLAN_LED_LINK | TLAN_LED_ACT ); 29835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( priv->timer.function == NULL ) { 29845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->timer.function = &TLan_Timer; 29855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->timer.data = (unsigned long) dev; 29865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->timer.expires = jiffies + TLAN_TIMER_ACT_DELAY; 29875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->timerSetAt = jiffies; 29885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->timerType = TLAN_TIMER_ACTIVITY; 29895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project add_timer(&priv->timer); 29905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else if ( priv->timerType == TLAN_TIMER_ACTIVITY ) { 29915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->timerSetAt = jiffies; 29925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 29935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 29945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 29955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project dev->last_rx = jiffies; 29965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 29975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return ack; 29985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 29995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* TLan_HandleRxEOF */ 30005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 30015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /*************************************************************** 30025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLan_HandleDummy 30035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 30045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Returns: 30055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 1 30065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Parms: 30075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * dev Device assigned the IRQ that was 30085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * raised. 30095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * host_int The contents of the HOST_INT 30105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * port. 30115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 30125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This function handles the Dummy interrupt, which is 30135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * raised whenever a test interrupt is generated by setting 30145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * the Req_Int bit of HOST_CMD to 1. 30155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 30165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project **************************************************************/ 30175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 30185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectu32 TLan_HandleDummy( struct net_device *dev, u16 host_int ) 30195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 30205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk( "TLAN: Test interrupt on %s.\n", dev->name ); 30215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return 1; 30225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 30235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* TLan_HandleDummy */ 30245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 30255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /*************************************************************** 30265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLan_HandleTxEOC 30275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 30285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Returns: 30295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 1 30305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Parms: 30315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * dev Device assigned the IRQ that was 30325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * raised. 30335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * host_int The contents of the HOST_INT 30345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * port. 30355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 30365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This driver is structured to determine EOC occurances by 30375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * reading the CSTAT member of the list structure. Tx EOC 30385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * interrupts are disabled via the DIO INTDIS register. 30395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * However, TLAN chips before revision 3.0 didn't have this 30405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * functionality, so process EOC events if this is the 30415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * case. 30425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 30435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project **************************************************************/ 30445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 30455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectu32 TLan_HandleTxEOC( struct net_device *dev, u16 host_int ) 30465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 30475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLanPrivateInfo *priv = dev->priv; 30485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLanList *head_list; 30495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 ack = 1; 30505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 30515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project host_int = 0; 30525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( priv->tlanRev < 0x30 ) { 30535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLAN_DBG( TLAN_DEBUG_TX, "TRANSMIT: Handling TX EOC (Head=%d Tail=%d) -- IRQ\n", priv->txHead, priv->txTail ); 30545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project head_list = priv->txList + priv->txHead; 30555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( ( head_list->cStat & TLAN_CSTAT_READY ) == TLAN_CSTAT_READY ) { 30565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project netif_stop_queue(dev); 30575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outl( virt_to_bus( head_list ), dev->base_addr + TLAN_CH_PARM ); 30585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ack |= TLAN_HC_GO; 30595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else { 30605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->txInProgress = 0; 30615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 30625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 30635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 30645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return ack; 30655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 30665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* TLan_HandleTxEOC */ 30675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 30685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /*************************************************************** 30695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLan_HandleStatusCheck 30705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 30715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Returns: 30725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 0 if Adapter check, 1 if Network Status check. 30735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Parms: 30745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * dev Device assigned the IRQ that was 30755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * raised. 30765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * host_int The contents of the HOST_INT 30775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * port. 30785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 30795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This function handles Adapter Check/Network Status 30805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * interrupts generated by the adapter. It checks the 30815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * vector in the HOST_INT register to determine if it is 30825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * an Adapter Check interrupt. If so, it resets the 30835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * adapter. Otherwise it clears the status registers 30845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * and services the PHY. 30855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 30865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project **************************************************************/ 30875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 30885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectu32 TLan_HandleStatusCheck( struct net_device *dev, u16 host_int ) 30895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 30905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLanPrivateInfo *priv = dev->priv; 30915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 ack; 30925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 error; 30935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u8 net_sts; 30945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 phy; 30955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u16 tlphy_ctl; 30965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u16 tlphy_sts; 30975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 30985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ack = 1; 30995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( host_int & TLAN_HI_IV_MASK ) { 31005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project netif_stop_queue( dev ); 31015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project error = inl( dev->base_addr + TLAN_CH_PARM ); 31025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk( "TLAN: %s: Adaptor Error = 0x%x\n", dev->name, error ); 31035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_ReadAndClearStats( dev, TLAN_RECORD ); 31045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outl( TLAN_HC_AD_RST, dev->base_addr + TLAN_HOST_CMD ); 31055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 31065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project queue_task(&priv->tlan_tqueue, &tq_immediate); 31075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mark_bh(IMMEDIATE_BH); 31085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 31095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project netif_wake_queue(dev); 31105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ack = 0; 31115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else { 31125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLAN_DBG( TLAN_DEBUG_GNRL, "%s: Status Check\n", dev->name ); 31135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project phy = priv->phy[priv->phyNum]; 31145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 31155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project net_sts = TLan_DioRead8( dev->base_addr, TLAN_NET_STS ); 31165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( net_sts ) { 31175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_DioWrite8( dev->base_addr, TLAN_NET_STS, net_sts ); 31185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLAN_DBG( TLAN_DEBUG_GNRL, "%s: Net_Sts = %x\n", dev->name, (unsigned) net_sts ); 31195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 31205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( ( net_sts & TLAN_NET_STS_MIRQ ) && ( priv->phyNum == 0 ) ) { 31215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiReadReg( dev, phy, TLAN_TLPHY_STS, &tlphy_sts ); 31225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiReadReg( dev, phy, TLAN_TLPHY_CTL, &tlphy_ctl ); 31235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( ! ( tlphy_sts & TLAN_TS_POLOK ) && ! ( tlphy_ctl & TLAN_TC_SWAPOL ) ) { 31245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project tlphy_ctl |= TLAN_TC_SWAPOL; 31255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiWriteReg( dev, phy, TLAN_TLPHY_CTL, tlphy_ctl); 31265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else if ( ( tlphy_sts & TLAN_TS_POLOK ) && ( tlphy_ctl & TLAN_TC_SWAPOL ) ) { 31275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project tlphy_ctl &= ~TLAN_TC_SWAPOL; 31285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiWriteReg( dev, phy, TLAN_TLPHY_CTL, tlphy_ctl); 31295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 31305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 31315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (debug) { 31325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_PhyPrint( dev ); 31335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 31345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 31355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 31365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 31375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return ack; 31385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 31395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* TLan_HandleStatusCheck */ 31405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 31415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /*************************************************************** 31425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLan_HandleRxEOC 31435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 31445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Returns: 31455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 1 31465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Parms: 31475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * dev Device assigned the IRQ that was 31485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * raised. 31495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * host_int The contents of the HOST_INT 31505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * port. 31515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 31525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This driver is structured to determine EOC occurances by 31535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * reading the CSTAT member of the list structure. Rx EOC 31545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * interrupts are disabled via the DIO INTDIS register. 31555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * However, TLAN chips before revision 3.0 didn't have this 31565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * CSTAT member or a INTDIS register, so if this chip is 31575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * pre-3.0, process EOC interrupts normally. 31585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 31595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project **************************************************************/ 31605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 31615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectu32 TLan_HandleRxEOC( struct net_device *dev, u16 host_int ) 31625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 31635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLanPrivateInfo *priv = dev->priv; 31645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLanList *head_list; 31655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 ack = 1; 31665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 31675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( priv->tlanRev < 0x30 ) { 31685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLAN_DBG( TLAN_DEBUG_RX, "RECEIVE: Handling RX EOC (Head=%d Tail=%d) -- IRQ\n", priv->rxHead, priv->rxTail ); 31695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project head_list = priv->rxList + priv->rxHead; 31705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outl( virt_to_bus( head_list ), dev->base_addr + TLAN_CH_PARM ); 31715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ack |= TLAN_HC_GO | TLAN_HC_RT; 31725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->rxEocCount++; 31735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 31745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 31755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return ack; 31765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 31775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* TLan_HandleRxEOC */ 31785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 31795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/***************************************************************************** 31805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project****************************************************************************** 31815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 31825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ThunderLAN Driver Timer Function 31835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 31845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project****************************************************************************** 31855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project*****************************************************************************/ 31865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 31875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /*************************************************************** 31885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLan_Timer 31895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 31905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Returns: 31915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Nothing 31925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Parms: 31935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * data A value given to add timer when 31945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * add_timer was called. 31955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 31965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This function handles timed functionality for the 31975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLAN driver. The two current timer uses are for 31985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * delaying for autonegotionation and driving the ACT LED. 31995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * - Autonegotiation requires being allowed about 32005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 2 1/2 seconds before attempting to transmit a 32015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * packet. It would be a very bad thing to hang 32025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * the kernel this long, so the driver doesn't 32035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * allow transmission 'til after this time, for 32045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * certain PHYs. It would be much nicer if all 32055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * PHYs were interrupt-capable like the internal 32065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * PHY. 32075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * - The ACT LED, which shows adapter activity, is 32085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * driven by the driver, and so must be left on 32095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * for a short period to power up the LED so it 32105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * can be seen. This delay can be changed by 32115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * changing the TLAN_TIMER_ACT_DELAY in tlan.h, 32125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * if desired. 100 ms produces a slightly 32135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * sluggish response. 32145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 32155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project **************************************************************/ 32165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 32175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid TLan_Timer( unsigned long data ) 32185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 32195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project struct net_device *dev = (struct net_device *) data; 32205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLanPrivateInfo *priv = dev->priv; 32215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 elapsed; 32225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project unsigned long flags = 0; 32235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 32245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->timer.function = NULL; 32255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 32265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project switch ( priv->timerType ) { 32275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef MONITOR 32285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case TLAN_TIMER_LINK_BEAT: 32295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_PhyMonitor( dev ); 32305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project break; 32315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif 32325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case TLAN_TIMER_PHY_PDOWN: 32335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_PhyPowerDown( dev ); 32345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project break; 32355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case TLAN_TIMER_PHY_PUP: 32365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_PhyPowerUp( dev ); 32375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project break; 32385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case TLAN_TIMER_PHY_RESET: 32395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_PhyReset( dev ); 32405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project break; 32415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case TLAN_TIMER_PHY_START_LINK: 32425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_PhyStartLink( dev ); 32435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project break; 32445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case TLAN_TIMER_PHY_FINISH_AN: 32455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_PhyFinishAutoNeg( dev ); 32465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project break; 32475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case TLAN_TIMER_FINISH_RESET: 32485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_FinishReset( dev ); 32495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project break; 32505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case TLAN_TIMER_ACTIVITY: 32515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project spin_lock_irqsave(&priv->lock, flags); 32525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( priv->timer.function == NULL ) { 32535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project elapsed = jiffies - priv->timerSetAt; 32545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( elapsed >= TLAN_TIMER_ACT_DELAY ) { 32555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_DioWrite8( dev->base_addr, TLAN_LED_REG, TLAN_LED_LINK ); 32565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else { 32575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->timer.function = &TLan_Timer; 32585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->timer.expires = priv->timerSetAt + TLAN_TIMER_ACT_DELAY; 32595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project spin_unlock_irqrestore(&priv->lock, flags); 32605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project add_timer( &priv->timer ); 32615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project break; 32625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 32635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 32645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project spin_unlock_irqrestore(&priv->lock, flags); 32655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project break; 32665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project default: 32675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project break; 32685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 32695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 32705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* TLan_Timer */ 32715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 32725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/***************************************************************************** 32735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project****************************************************************************** 32745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 32755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ThunderLAN Driver Adapter Related Routines 32765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 32775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project****************************************************************************** 32785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project*****************************************************************************/ 32795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 32805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /*************************************************************** 32815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLan_ResetLists 32825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 32835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Returns: 32845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Nothing 32855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Parms: 32865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * dev The device structure with the list 32875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * stuctures to be reset. 32885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 32895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This routine sets the variables associated with managing 32905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * the TLAN lists to their initial values. 32915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 32925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project **************************************************************/ 32935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 32945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid TLan_ResetLists( struct net_device *dev ) 32955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 32965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLanPrivateInfo *priv = dev->priv; 32975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int i; 32985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLanList *list; 32995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project struct sk_buff *skb; 33005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project void *t = NULL; 33015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 33025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->txHead = 0; 33035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->txTail = 0; 33045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project for ( i = 0; i < TLAN_NUM_TX_LISTS; i++ ) { 33055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project list = priv->txList + i; 33065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project list->cStat = TLAN_CSTAT_UNUSED; 33075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( bbuf ) { 33085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project list->buffer[0].address = virt_to_bus( priv->txBuffer + ( i * TLAN_MAX_FRAME_SIZE ) ); 33095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else { 33105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project list->buffer[0].address = 0; 33115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 33125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project list->buffer[2].count = 0; 33135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project list->buffer[2].address = 0; 33145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project list->buffer[9].address = 0; 33155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 33165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 33175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->rxHead = 0; 33185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->rxTail = TLAN_NUM_RX_LISTS - 1; 33195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project for ( i = 0; i < TLAN_NUM_RX_LISTS; i++ ) { 33205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project list = priv->rxList + i; 33215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project list->cStat = TLAN_CSTAT_READY; 33225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project list->frameSize = TLAN_MAX_FRAME_SIZE; 33235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project list->buffer[0].count = TLAN_MAX_FRAME_SIZE | TLAN_LAST_BUFFER; 33245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( bbuf ) { 33255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project list->buffer[0].address = virt_to_bus( priv->rxBuffer + ( i * TLAN_MAX_FRAME_SIZE ) ); 33265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else { 33275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project skb = dev_alloc_skb( TLAN_MAX_FRAME_SIZE + 7 ); 33285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( skb == NULL ) { 33295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk( "TLAN: Couldn't allocate memory for received data.\n" ); 33305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* If this ever happened it would be a problem */ 33315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else { 33325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project skb->dev = dev; 33335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project skb_reserve( skb, 2 ); 33345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project t = (void *) skb_put( skb, TLAN_MAX_FRAME_SIZE ); 33355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 33365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project list->buffer[0].address = virt_to_bus( t ); 33375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project list->buffer[8].address = (u32) t; 33385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project list->buffer[9].address = (u32) skb; 33395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 33405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project list->buffer[1].count = 0; 33415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project list->buffer[1].address = 0; 33425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( i < TLAN_NUM_RX_LISTS - 1 ) 33435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project list->forward = virt_to_bus( list + 1 ); 33445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project else 33455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project list->forward = 0; 33465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 33475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 33485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* TLan_ResetLists */ 33495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 33505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid TLan_FreeLists( struct net_device *dev ) 33515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 33525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLanPrivateInfo *priv = dev->priv; 33535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int i; 33545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLanList *list; 33555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project struct sk_buff *skb; 33565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 33575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( ! bbuf ) { 33585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project for ( i = 0; i < TLAN_NUM_TX_LISTS; i++ ) { 33595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project list = priv->txList + i; 33605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project skb = (struct sk_buff *) list->buffer[9].address; 33615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( skb ) { 33625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project dev_kfree_skb_any( skb ); 33635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project list->buffer[9].address = 0; 33645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 33655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 33665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 33675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project for ( i = 0; i < TLAN_NUM_RX_LISTS; i++ ) { 33685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project list = priv->rxList + i; 33695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project skb = (struct sk_buff *) list->buffer[9].address; 33705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( skb ) { 33715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project dev_kfree_skb_any( skb ); 33725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project list->buffer[9].address = 0; 33735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 33745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 33755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 33765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 33775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* TLan_FreeLists */ 33785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 33795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /*************************************************************** 33805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLan_PrintDio 33815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 33825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Returns: 33835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Nothing 33845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Parms: 33855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * io_base Base IO port of the device of 33865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * which to print DIO registers. 33875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 33885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This function prints out all the internal (DIO) 33895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * registers of a TLAN chip. 33905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 33915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project **************************************************************/ 33925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 33935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid TLan_PrintDio( u16 io_base ) 33945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 33955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 data0, data1; 33965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int i; 33975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 33985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk( "TLAN: Contents of internal registers for io base 0x%04hx.\n", io_base ); 33995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk( "TLAN: Off. +0 +4\n" ); 34005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project for ( i = 0; i < 0x4C; i+= 8 ) { 34015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project data0 = TLan_DioRead32( io_base, i ); 34025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project data1 = TLan_DioRead32( io_base, i + 0x4 ); 34035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk( "TLAN: 0x%02x 0x%08x 0x%08x\n", i, data0, data1 ); 34045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 34055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 34065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* TLan_PrintDio */ 34075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 34085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /*************************************************************** 34095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLan_PrintList 34105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 34115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Returns: 34125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Nothing 34135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Parms: 34145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * list A pointer to the TLanList structure to 34155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * be printed. 34165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * type A string to designate type of list, 34175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * "Rx" or "Tx". 34185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * num The index of the list. 34195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 34205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This function prints out the contents of the list 34215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * pointed to by the list parameter. 34225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 34235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project **************************************************************/ 34245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 34255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid TLan_PrintList( TLanList *list, char *type, int num) 34265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 34275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int i; 34285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 34295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk( "TLAN: %s List %d at 0x%08x\n", type, num, (u32) list ); 34305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk( "TLAN: Forward = 0x%08x\n", list->forward ); 34315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk( "TLAN: CSTAT = 0x%04hx\n", list->cStat ); 34325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk( "TLAN: Frame Size = 0x%04hx\n", list->frameSize ); 34335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* for ( i = 0; i < 10; i++ ) { */ 34345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project for ( i = 0; i < 2; i++ ) { 34355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk( "TLAN: Buffer[%d].count, addr = 0x%08x, 0x%08x\n", i, list->buffer[i].count, list->buffer[i].address ); 34365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 34375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 34385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* TLan_PrintList */ 34395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 34405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /*************************************************************** 34415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLan_ReadAndClearStats 34425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 34435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Returns: 34445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Nothing 34455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Parms: 34465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * dev Pointer to device structure of adapter 34475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * to which to read stats. 34485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * record Flag indicating whether to add 34495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 34505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This functions reads all the internal status registers 34515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * of the TLAN chip, which clears them as a side effect. 34525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * It then either adds the values to the device's status 34535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * struct, or discards them, depending on whether record 34545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * is TLAN_RECORD (!=0) or TLAN_IGNORE (==0). 34555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 34565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project **************************************************************/ 34575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 34585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid TLan_ReadAndClearStats( struct net_device *dev, int record ) 34595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 34605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLanPrivateInfo *priv = dev->priv; 34615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 tx_good, tx_under; 34625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 rx_good, rx_over; 34635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 def_tx, crc, code; 34645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 multi_col, single_col; 34655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 excess_col, late_col, loss; 34665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 34675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outw( TLAN_GOOD_TX_FRMS, dev->base_addr + TLAN_DIO_ADR ); 34685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project tx_good = inb( dev->base_addr + TLAN_DIO_DATA ); 34695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project tx_good += inb( dev->base_addr + TLAN_DIO_DATA + 1 ) << 8; 34705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project tx_good += inb( dev->base_addr + TLAN_DIO_DATA + 2 ) << 16; 34715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project tx_under = inb( dev->base_addr + TLAN_DIO_DATA + 3 ); 34725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 34735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outw( TLAN_GOOD_RX_FRMS, dev->base_addr + TLAN_DIO_ADR ); 34745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project rx_good = inb( dev->base_addr + TLAN_DIO_DATA ); 34755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project rx_good += inb( dev->base_addr + TLAN_DIO_DATA + 1 ) << 8; 34765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project rx_good += inb( dev->base_addr + TLAN_DIO_DATA + 2 ) << 16; 34775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project rx_over = inb( dev->base_addr + TLAN_DIO_DATA + 3 ); 34785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 34795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outw( TLAN_DEFERRED_TX, dev->base_addr + TLAN_DIO_ADR ); 34805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project def_tx = inb( dev->base_addr + TLAN_DIO_DATA ); 34815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project def_tx += inb( dev->base_addr + TLAN_DIO_DATA + 1 ) << 8; 34825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project crc = inb( dev->base_addr + TLAN_DIO_DATA + 2 ); 34835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project code = inb( dev->base_addr + TLAN_DIO_DATA + 3 ); 34845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 34855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outw( TLAN_MULTICOL_FRMS, dev->base_addr + TLAN_DIO_ADR ); 34865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project multi_col = inb( dev->base_addr + TLAN_DIO_DATA ); 34875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project multi_col += inb( dev->base_addr + TLAN_DIO_DATA + 1 ) << 8; 34885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project single_col = inb( dev->base_addr + TLAN_DIO_DATA + 2 ); 34895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project single_col += inb( dev->base_addr + TLAN_DIO_DATA + 3 ) << 8; 34905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 34915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outw( TLAN_EXCESSCOL_FRMS, dev->base_addr + TLAN_DIO_ADR ); 34925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project excess_col = inb( dev->base_addr + TLAN_DIO_DATA ); 34935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project late_col = inb( dev->base_addr + TLAN_DIO_DATA + 1 ); 34945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project loss = inb( dev->base_addr + TLAN_DIO_DATA + 2 ); 34955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 34965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( record ) { 34975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->stats.rx_packets += rx_good; 34985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->stats.rx_errors += rx_over + crc + code; 34995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->stats.tx_packets += tx_good; 35005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->stats.tx_errors += tx_under + loss; 35015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->stats.collisions += multi_col + single_col + excess_col + late_col; 35025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 35035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->stats.rx_over_errors += rx_over; 35045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->stats.rx_crc_errors += crc; 35055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->stats.rx_frame_errors += code; 35065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 35075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->stats.tx_aborted_errors += tx_under; 35085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->stats.tx_carrier_errors += loss; 35095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 35105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 35115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* TLan_ReadAndClearStats */ 35125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 35135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /*************************************************************** 35145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLan_Reset 35155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 35165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Returns: 35175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 0 35185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Parms: 35195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * dev Pointer to device structure of adapter 35205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * to be reset. 35215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 35225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This function resets the adapter and it's physical 35235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * device. See Chap. 3, pp. 9-10 of the "ThunderLAN 35245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Programmer's Guide" for details. The routine tries to 35255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * implement what is detailed there, though adjustments 35265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * have been made. 35275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 35285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project **************************************************************/ 35295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 35305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid 35315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectTLan_ResetAdapter( struct net_device *dev ) 35325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 35335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLanPrivateInfo *priv = dev->priv; 35345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int i; 35355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 addr; 35365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 data; 35375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u8 data8; 35385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 35395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->tlanFullDuplex = FALSE; 35405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->phyOnline=0; 35415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* 1. Assert reset bit. */ 35425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 35435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project data = inl(dev->base_addr + TLAN_HOST_CMD); 35445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project data |= TLAN_HC_AD_RST; 35455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outl(data, dev->base_addr + TLAN_HOST_CMD); 35465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 35475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project udelay(1000); 35485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 35495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* 2. Turn off interrupts. ( Probably isn't necessary ) */ 35505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 35515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project data = inl(dev->base_addr + TLAN_HOST_CMD); 35525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project data |= TLAN_HC_INT_OFF; 35535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outl(data, dev->base_addr + TLAN_HOST_CMD); 35545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 35555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* 3. Clear AREGs and HASHs. */ 35565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 35575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project for ( i = TLAN_AREG_0; i <= TLAN_HASH_2; i += 4 ) { 35585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_DioWrite32( dev->base_addr, (u16) i, 0 ); 35595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 35605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 35615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* 4. Setup NetConfig register. */ 35625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 35635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project data = TLAN_NET_CFG_1FRAG | TLAN_NET_CFG_1CHAN | TLAN_NET_CFG_PHY_EN; 35645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_DioWrite16( dev->base_addr, TLAN_NET_CONFIG, (u16) data ); 35655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 35665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* 5. Load Ld_Tmr and Ld_Thr in HOST_CMD. */ 35675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 35685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outl( TLAN_HC_LD_TMR | 0x3f, dev->base_addr + TLAN_HOST_CMD ); 35695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outl( TLAN_HC_LD_THR | 0x9, dev->base_addr + TLAN_HOST_CMD ); 35705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 35715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* 6. Unreset the MII by setting NMRST (in NetSio) to 1. */ 35725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 35735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outw( TLAN_NET_SIO, dev->base_addr + TLAN_DIO_ADR ); 35745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project addr = dev->base_addr + TLAN_DIO_DATA + TLAN_NET_SIO; 35755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_SetBit( TLAN_NET_SIO_NMRST, addr ); 35765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 35775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* 7. Setup the remaining registers. */ 35785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 35795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( priv->tlanRev >= 0x30 ) { 35805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project data8 = TLAN_ID_TX_EOC | TLAN_ID_RX_EOC; 35815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_DioWrite8( dev->base_addr, TLAN_INT_DIS, data8 ); 35825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 35835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_PhyDetect( dev ); 35845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project data = TLAN_NET_CFG_1FRAG | TLAN_NET_CFG_1CHAN; 35855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 35865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( priv->adapter->flags & TLAN_ADAPTER_BIT_RATE_PHY ) { 35875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project data |= TLAN_NET_CFG_BIT; 35885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( priv->aui == 1 ) { 35895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_DioWrite8( dev->base_addr, TLAN_ACOMMIT, 0x0a ); 35905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else if ( priv->duplex == TLAN_DUPLEX_FULL ) { 35915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_DioWrite8( dev->base_addr, TLAN_ACOMMIT, 0x00 ); 35925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->tlanFullDuplex = TRUE; 35935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else { 35945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_DioWrite8( dev->base_addr, TLAN_ACOMMIT, 0x08 ); 35955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 35965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 35975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 35985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( priv->phyNum == 0 ) { 35995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project data |= TLAN_NET_CFG_PHY_EN; 36005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 36015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_DioWrite16( dev->base_addr, TLAN_NET_CONFIG, (u16) data ); 36025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 36035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( priv->adapter->flags & TLAN_ADAPTER_UNMANAGED_PHY ) { 36045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_FinishReset( dev ); 36055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else { 36065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_PhyPowerDown( dev ); 36075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 36085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 36095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* TLan_ResetAdapter */ 36105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 36115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid 36125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectTLan_FinishReset( struct net_device *dev ) 36135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 36145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLanPrivateInfo *priv = dev->priv; 36155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u8 data; 36165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u32 phy; 36175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u8 sio; 36185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u16 status; 36195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u16 partner; 36205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u16 tlphy_ctl; 36215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u16 tlphy_par; 36225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project u16 tlphy_id1, tlphy_id2; 36235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int i; 36245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 36255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project phy = priv->phy[priv->phyNum]; 36265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 36275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project data = TLAN_NET_CMD_NRESET | TLAN_NET_CMD_NWRAP; 36285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( priv->tlanFullDuplex ) { 36295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project data |= TLAN_NET_CMD_DUPLEX; 36305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 36315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_DioWrite8( dev->base_addr, TLAN_NET_CMD, data ); 36325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project data = TLAN_NET_MASK_MASK4 | TLAN_NET_MASK_MASK5; 36335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( priv->phyNum == 0 ) { 36345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project data |= TLAN_NET_MASK_MASK7; 36355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 36365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_DioWrite8( dev->base_addr, TLAN_NET_MASK, data ); 36375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_DioWrite16( dev->base_addr, TLAN_MAX_RX, ((1536)+7)&~7 ); 36385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiReadReg( dev, phy, MII_GEN_ID_HI, &tlphy_id1 ); 36395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiReadReg( dev, phy, MII_GEN_ID_LO, &tlphy_id2 ); 36405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 36415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( ( priv->adapter->flags & TLAN_ADAPTER_UNMANAGED_PHY ) || ( priv->aui ) ) { 36425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project status = MII_GS_LINK; 36435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk( "TLAN: %s: Link forced.\n", dev->name ); 36445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else { 36455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiReadReg( dev, phy, MII_GEN_STS, &status ); 36465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project udelay( 1000 ); 36475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiReadReg( dev, phy, MII_GEN_STS, &status ); 36485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( (status & MII_GS_LINK) && /* We only support link info on Nat.Sem. PHY's */ 36495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project (tlphy_id1 == NAT_SEM_ID1) && 36505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project (tlphy_id2 == NAT_SEM_ID2) ) { 36515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiReadReg( dev, phy, MII_AN_LPA, &partner ); 36525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiReadReg( dev, phy, TLAN_TLPHY_PAR, &tlphy_par ); 36535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 36545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk( "TLAN: %s: Link active with ", dev->name ); 36555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (!(tlphy_par & TLAN_PHY_AN_EN_STAT)) { 36565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk( "forced 10%sMbps %s-Duplex\n", 36575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project tlphy_par & TLAN_PHY_SPEED_100 ? "" : "0", 36585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project tlphy_par & TLAN_PHY_DUPLEX_FULL ? "Full" : "Half"); 36595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else { 36605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk( "AutoNegotiation enabled, at 10%sMbps %s-Duplex\n", 36615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project tlphy_par & TLAN_PHY_SPEED_100 ? "" : "0", 36625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project tlphy_par & TLAN_PHY_DUPLEX_FULL ? "Full" : "Half"); 36635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk("TLAN: Partner capability: "); 36645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project for (i = 5; i <= 10; i++) 36655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (partner & (1<<i)) 36665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk("%s", media[i-5]); 36675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk("\n"); 36685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 36695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 36705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_DioWrite8( dev->base_addr, TLAN_LED_REG, TLAN_LED_LINK ); 36715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef MONITOR 36725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* We have link beat..for now anyway */ 36735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->link = 1; 36745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /*Enabling link beat monitoring */ 36755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_SetTimer( dev, (10*HZ), TLAN_TIMER_LINK_BEAT ); 36765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif 36775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else if (status & MII_GS_LINK) { 36785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk( "TLAN: %s: Link active\n", dev->name ); 36795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_DioWrite8( dev->base_addr, TLAN_LED_REG, TLAN_LED_LINK ); 36805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 36815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 36825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 36835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( priv->phyNum == 0 ) { 36845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiReadReg( dev, phy, TLAN_TLPHY_CTL, &tlphy_ctl ); 36855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project tlphy_ctl |= TLAN_TC_INTEN; 36865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_MiiWriteReg( dev, phy, TLAN_TLPHY_CTL, tlphy_ctl ); 36875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project sio = TLan_DioRead8( dev->base_addr, TLAN_NET_SIO ); 36885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project sio |= TLAN_NET_SIO_MINTEN; 36895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_DioWrite8( dev->base_addr, TLAN_NET_SIO, sio ); 36905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 36915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 36925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( status & MII_GS_LINK ) { 36935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_SetMac( dev, 0, dev->dev_addr ); 36945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project priv->phyOnline = 1; 36955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outb( ( TLAN_HC_INT_ON >> 8 ), dev->base_addr + TLAN_HOST_CMD + 1 ); 36965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( debug >= 1 && debug != TLAN_DEBUG_PROBE ) { 36975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outb( ( TLAN_HC_REQ_INT >> 8 ), dev->base_addr + TLAN_HOST_CMD + 1 ); 36985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 36995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outl( virt_to_bus( priv->rxList ), dev->base_addr + TLAN_CH_PARM ); 37005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project outl( TLAN_HC_GO | TLAN_HC_RT, dev->base_addr + TLAN_HOST_CMD ); 37015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else { 37025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project printk( "TLAN: %s: Link inactive, will retry in 10 secs...\n", dev->name ); 37035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_SetTimer( dev, (10*HZ), TLAN_TIMER_FINISH_RESET ); 37045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return; 37055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 37065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 37075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* TLan_FinishReset */ 37085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 37095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /*************************************************************** 37105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLan_SetMac 37115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 37125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Returns: 37135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Nothing 37145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Parms: 37155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * dev Pointer to device structure of adapter 37165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * on which to change the AREG. 37175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * areg The AREG to set the address in (0 - 3). 37185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * mac A pointer to an array of chars. Each 37195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * element stores one byte of the address. 37205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * IE, it isn't in ascii. 37215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 37225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This function transfers a MAC address to one of the 37235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * TLAN AREGs (address registers). The TLAN chip locks 37245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * the register on writing to offset 0 and unlocks the 37255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * register after writing to offset 5. If NULL is passed 37265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * in mac, then the AREG is filled with 0's. 37275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 37285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project **************************************************************/ 37295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 37305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid TLan_SetMac( struct net_device *dev, int areg, char *mac ) 37315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 37325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int i; 37335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 37345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project areg *= 6; 37355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 37365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if ( mac != NULL ) { 37375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project for ( i = 0; i < 6; i++ ) 37385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_DioWrite8( dev->base_addr, TLAN_AREG_0 + areg + i, mac[i] ); 37395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } else { 37405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project for ( i = 0; i < 6; i++ ) 37415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project TLan_DioWrite8( dev->base_addr, TLAN_AREG_0 + areg + i, 0 ); 37425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 37435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 37445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} /* TLan_SetMac */ 37455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 37465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif 3747