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