blob: c99ce74a7aff7251c3821314fab0e43be38ffd2f [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*******************************************************************************
2 *
3 * Linux ThunderLAN Driver
4 *
5 * tlan.c
6 * by James Banks
7 *
8 * (C) 1997-1998 Caldera, Inc.
9 * (C) 1998 James Banks
10 * (C) 1999-2001 Torben Mathiasen
11 * (C) 2002 Samuel Chessman
12 *
13 * This software may be used and distributed according to the terms
14 * of the GNU General Public License, incorporated herein by reference.
15 *
16 ** This file is best viewed/edited with columns>=132.
17 *
18 ** Useful (if not required) reading:
19 *
20 * Texas Instruments, ThunderLAN Programmer's Guide,
21 * TI Literature Number SPWU013A
22 * available in PDF format from www.ti.com
23 * Level One, LXT901 and LXT970 Data Sheets
24 * available in PDF format from www.level1.com
25 * National Semiconductor, DP83840A Data Sheet
26 * available in PDF format from www.national.com
27 * Microchip Technology, 24C01A/02A/04A Data Sheet
28 * available in PDF format from www.microchip.com
29 *
30 * Change History
31 *
32 * Tigran Aivazian <tigran@sco.com>: TLan_PciProbe() now uses
33 * new PCI BIOS interface.
34 * Alan Cox <alan@redhat.com>: Fixed the out of memory
35 * handling.
Jeff Garzik6aa20a22006-09-13 13:24:59 -040036 *
Linus Torvalds1da177e2005-04-16 15:20:36 -070037 * Torben Mathiasen <torben.mathiasen@compaq.com> New Maintainer!
38 *
39 * v1.1 Dec 20, 1999 - Removed linux version checking
Jeff Garzik6aa20a22006-09-13 13:24:59 -040040 * Patch from Tigran Aivazian.
Linus Torvalds1da177e2005-04-16 15:20:36 -070041 * - v1.1 includes Alan's SMP updates.
42 * - We still have problems on SMP though,
Jeff Garzik6aa20a22006-09-13 13:24:59 -040043 * but I'm looking into that.
44 *
Linus Torvalds1da177e2005-04-16 15:20:36 -070045 * v1.2 Jan 02, 2000 - Hopefully fixed the SMP deadlock.
46 * - Removed dependency of HZ being 100.
Jeff Garzik6aa20a22006-09-13 13:24:59 -040047 * - We now allow higher priority timers to
Linus Torvalds1da177e2005-04-16 15:20:36 -070048 * overwrite timers like TLAN_TIMER_ACTIVITY
49 * Patch from John Cagle <john.cagle@compaq.com>.
50 * - Fixed a few compiler warnings.
51 *
52 * v1.3 Feb 04, 2000 - Fixed the remaining HZ issues.
Jeff Garzik6aa20a22006-09-13 13:24:59 -040053 * - Removed call to pci_present().
Linus Torvalds1da177e2005-04-16 15:20:36 -070054 * - Removed SA_INTERRUPT flag from irq handler.
Jeff Garzik6aa20a22006-09-13 13:24:59 -040055 * - Added __init and __initdata to reduce resisdent
Linus Torvalds1da177e2005-04-16 15:20:36 -070056 * code size.
57 * - Driver now uses module_init/module_exit.
58 * - Rewrote init_module and tlan_probe to
59 * share a lot more code. We now use tlan_probe
60 * with builtin and module driver.
Jeff Garzik6aa20a22006-09-13 13:24:59 -040061 * - Driver ported to new net API.
62 * - tlan.txt has been reworked to reflect current
Linus Torvalds1da177e2005-04-16 15:20:36 -070063 * driver (almost)
64 * - Other minor stuff
65 *
66 * v1.4 Feb 10, 2000 - Updated with more changes required after Dave's
67 * network cleanup in 2.3.43pre7 (Tigran & myself)
68 * - Minor stuff.
69 *
70 * v1.5 March 22, 2000 - Fixed another timer bug that would hang the driver
71 * if no cable/link were present.
72 * - Cosmetic changes.
73 * - TODO: Port completely to new PCI/DMA API
74 * Auto-Neg fallback.
75 *
76 * v1.6 April 04, 2000 - Fixed driver support for kernel-parameters. Haven't
Jeff Garzik6aa20a22006-09-13 13:24:59 -040077 * tested it though, as the kernel support is currently
Linus Torvalds1da177e2005-04-16 15:20:36 -070078 * broken (2.3.99p4p3).
79 * - Updated tlan.txt accordingly.
80 * - Adjusted minimum/maximum frame length.
Jeff Garzik6aa20a22006-09-13 13:24:59 -040081 * - There is now a TLAN website up at
Linus Torvalds1da177e2005-04-16 15:20:36 -070082 * http://tlan.kernel.dk
83 *
84 * v1.7 April 07, 2000 - Started to implement custom ioctls. Driver now
85 * reports PHY information when used with Donald
86 * Beckers userspace MII diagnostics utility.
87 *
88 * v1.8 April 23, 2000 - Fixed support for forced speed/duplex settings.
89 * - Added link information to Auto-Neg and forced
90 * modes. When NIC operates with auto-neg the driver
91 * will report Link speed & duplex modes as well as
92 * link partner abilities. When forced link is used,
93 * the driver will report status of the established
94 * link.
Jeff Garzik6aa20a22006-09-13 13:24:59 -040095 * Please read tlan.txt for additional information.
96 * - Removed call to check_region(), and used
Linus Torvalds1da177e2005-04-16 15:20:36 -070097 * return value of request_region() instead.
Jeff Garzik6aa20a22006-09-13 13:24:59 -040098 *
Linus Torvalds1da177e2005-04-16 15:20:36 -070099 * v1.8a May 28, 2000 - Minor updates.
100 *
101 * v1.9 July 25, 2000 - Fixed a few remaining Full-Duplex issues.
102 * - Updated with timer fixes from Andrew Morton.
103 * - Fixed module race in TLan_Open.
104 * - Added routine to monitor PHY status.
105 * - Added activity led support for Proliant devices.
106 *
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400107 * v1.10 Aug 30, 2000 - Added support for EISA based tlan controllers
108 * like the Compaq NetFlex3/E.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700109 * - Rewrote tlan_probe to better handle multiple
110 * bus probes. Probing and device setup is now
111 * done through TLan_Probe and TLan_init_one. Actual
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400112 * hardware probe is done with kernel API and
Linus Torvalds1da177e2005-04-16 15:20:36 -0700113 * TLan_EisaProbe.
114 * - Adjusted debug information for probing.
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400115 * - Fixed bug that would cause general debug information
116 * to be printed after driver removal.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700117 * - Added transmit timeout handling.
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400118 * - Fixed OOM return values in tlan_probe.
119 * - Fixed possible mem leak in tlan_exit
Linus Torvalds1da177e2005-04-16 15:20:36 -0700120 * (now tlan_remove_one).
121 * - Fixed timer bug in TLan_phyMonitor.
122 * - This driver version is alpha quality, please
123 * send me any bug issues you may encounter.
124 *
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400125 * v1.11 Aug 31, 2000 - Do not try to register irq 0 if no irq line was
Linus Torvalds1da177e2005-04-16 15:20:36 -0700126 * set for EISA cards.
127 * - Added support for NetFlex3/E with nibble-rate
128 * 10Base-T PHY. This is untestet as I haven't got
129 * one of these cards.
130 * - Fixed timer being added twice.
131 * - Disabled PhyMonitoring by default as this is
132 * work in progress. Define MONITOR to enable it.
133 * - Now we don't display link info with PHYs that
134 * doesn't support it (level1).
135 * - Incresed tx_timeout beacuse of auto-neg.
136 * - Adjusted timers for forced speeds.
137 *
138 * v1.12 Oct 12, 2000 - Minor fixes (memleak, init, etc.)
139 *
140 * v1.13 Nov 28, 2000 - Stop flooding console with auto-neg issues
141 * when link can't be established.
142 * - Added the bbuf option as a kernel parameter.
143 * - Fixed ioaddr probe bug.
144 * - Fixed stupid deadlock with MII interrupts.
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400145 * - Added support for speed/duplex selection with
Linus Torvalds1da177e2005-04-16 15:20:36 -0700146 * multiple nics.
147 * - Added partly fix for TX Channel lockup with
148 * TLAN v1.0 silicon. This needs to be investigated
149 * further.
150 *
151 * v1.14 Dec 16, 2000 - Added support for servicing multiple frames per.
152 * interrupt. Thanks goes to
153 * Adam Keys <adam@ti.com>
154 * Denis Beaudoin <dbeaudoin@ti.com>
155 * for providing the patch.
156 * - Fixed auto-neg output when using multiple
157 * adapters.
158 * - Converted to use new taskq interface.
159 *
160 * v1.14a Jan 6, 2001 - Minor adjustments (spinlocks, etc.)
161 *
162 * Samuel Chessman <chessman@tux.org> New Maintainer!
163 *
164 * v1.15 Apr 4, 2002 - Correct operation when aui=1 to be
165 * 10T half duplex no loopback
166 * Thanks to Gunnar Eikman
167 *******************************************************************************/
168
169#include <linux/module.h>
170#include <linux/init.h>
171#include <linux/ioport.h>
172#include <linux/eisa.h>
173#include <linux/pci.h>
Domen Puncer1e7f0bd2005-06-26 18:22:14 -0400174#include <linux/dma-mapping.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -0700175#include <linux/netdevice.h>
176#include <linux/etherdevice.h>
177#include <linux/delay.h>
178#include <linux/spinlock.h>
179#include <linux/workqueue.h>
180#include <linux/mii.h>
181
182#include "tlan.h"
183
184typedef u32 (TLanIntVectorFunc)( struct net_device *, u16 );
185
186
187/* For removing EISA devices */
188static struct net_device *TLan_Eisa_Devices;
189
190static int TLanDevicesInstalled;
191
192/* Set speed, duplex and aui settings */
193static int aui[MAX_TLAN_BOARDS];
194static int duplex[MAX_TLAN_BOARDS];
195static int speed[MAX_TLAN_BOARDS];
196static int boards_found;
Stephen Hemminger15efa9b2005-05-04 15:33:11 -0700197module_param_array(aui, int, NULL, 0);
198module_param_array(duplex, int, NULL, 0);
199module_param_array(speed, int, NULL, 0);
200MODULE_PARM_DESC(aui, "ThunderLAN use AUI port(s) (0-1)");
201MODULE_PARM_DESC(duplex, "ThunderLAN duplex setting(s) (0-default, 1-half, 2-full)");
202MODULE_PARM_DESC(speed, "ThunderLAN port speen setting(s) (0,10,100)");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700203
204MODULE_AUTHOR("Maintainer: Samuel Chessman <chessman@tux.org>");
205MODULE_DESCRIPTION("Driver for TI ThunderLAN based ethernet PCI adapters");
206MODULE_LICENSE("GPL");
207
208
209/* Define this to enable Link beat monitoring */
210#undef MONITOR
211
212/* Turn on debugging. See Documentation/networking/tlan.txt for details */
213static int debug;
Stephen Hemminger15efa9b2005-05-04 15:33:11 -0700214module_param(debug, int, 0);
215MODULE_PARM_DESC(debug, "ThunderLAN debug mask");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700216
217static int bbuf;
Stephen Hemminger15efa9b2005-05-04 15:33:11 -0700218module_param(bbuf, int, 0);
219MODULE_PARM_DESC(bbuf, "ThunderLAN use big buffer (0-1)");
220
Linus Torvalds1da177e2005-04-16 15:20:36 -0700221static u8 *TLanPadBuffer;
222static dma_addr_t TLanPadBufferDMA;
223static char TLanSignature[] = "TLAN";
224static const char tlan_banner[] = "ThunderLAN driver v1.15\n";
225static int tlan_have_pci;
226static int tlan_have_eisa;
227
228static const char *media[] = {
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400229 "10BaseT-HD ", "10BaseT-FD ","100baseTx-HD ",
Linus Torvalds1da177e2005-04-16 15:20:36 -0700230 "100baseTx-FD", "100baseT4", NULL
231};
232
233static struct board {
234 const char *deviceLabel;
235 u32 flags;
236 u16 addrOfs;
237} board_info[] = {
238 { "Compaq Netelligent 10 T PCI UTP", TLAN_ADAPTER_ACTIVITY_LED, 0x83 },
239 { "Compaq Netelligent 10/100 TX PCI UTP", TLAN_ADAPTER_ACTIVITY_LED, 0x83 },
240 { "Compaq Integrated NetFlex-3/P", TLAN_ADAPTER_NONE, 0x83 },
241 { "Compaq NetFlex-3/P", TLAN_ADAPTER_UNMANAGED_PHY | TLAN_ADAPTER_BIT_RATE_PHY, 0x83 },
242 { "Compaq NetFlex-3/P", TLAN_ADAPTER_NONE, 0x83 },
243 { "Compaq Netelligent Integrated 10/100 TX UTP", TLAN_ADAPTER_ACTIVITY_LED, 0x83 },
244 { "Compaq Netelligent Dual 10/100 TX PCI UTP", TLAN_ADAPTER_NONE, 0x83 },
245 { "Compaq Netelligent 10/100 TX Embedded UTP", TLAN_ADAPTER_NONE, 0x83 },
246 { "Olicom OC-2183/2185", TLAN_ADAPTER_USE_INTERN_10, 0x83 },
247 { "Olicom OC-2325", TLAN_ADAPTER_UNMANAGED_PHY, 0xF8 },
248 { "Olicom OC-2326", TLAN_ADAPTER_USE_INTERN_10, 0xF8 },
249 { "Compaq Netelligent 10/100 TX UTP", TLAN_ADAPTER_ACTIVITY_LED, 0x83 },
250 { "Compaq Netelligent 10 T/2 PCI UTP/Coax", TLAN_ADAPTER_NONE, 0x83 },
251 { "Compaq NetFlex-3/E", TLAN_ADAPTER_ACTIVITY_LED | /* EISA card */
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400252 TLAN_ADAPTER_UNMANAGED_PHY | TLAN_ADAPTER_BIT_RATE_PHY, 0x83 },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700253 { "Compaq NetFlex-3/E", TLAN_ADAPTER_ACTIVITY_LED, 0x83 }, /* EISA card */
254};
255
256static struct pci_device_id tlan_pci_tbl[] = {
257 { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_NETEL10,
258 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
259 { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_NETEL100,
260 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1 },
261 { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_NETFLEX3I,
262 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 2 },
263 { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_THUNDER,
264 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 3 },
265 { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_NETFLEX3B,
266 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 4 },
267 { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_NETEL100PI,
268 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 5 },
269 { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_NETEL100D,
270 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 6 },
271 { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_NETEL100I,
272 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 7 },
273 { PCI_VENDOR_ID_OLICOM, PCI_DEVICE_ID_OLICOM_OC2183,
274 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 8 },
275 { PCI_VENDOR_ID_OLICOM, PCI_DEVICE_ID_OLICOM_OC2325,
276 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 9 },
277 { PCI_VENDOR_ID_OLICOM, PCI_DEVICE_ID_OLICOM_OC2326,
278 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 10 },
279 { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_NETELLIGENT_10_100_WS_5100,
280 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 11 },
281 { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_NETELLIGENT_10_T2,
282 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 12 },
283 { 0,}
284};
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400285MODULE_DEVICE_TABLE(pci, tlan_pci_tbl);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700286
287static void TLan_EisaProbe( void );
288static void TLan_Eisa_Cleanup( void );
289static int TLan_Init( struct net_device * );
290static int TLan_Open( struct net_device *dev );
291static int TLan_StartTx( struct sk_buff *, struct net_device *);
David Howells7d12e782006-10-05 14:55:46 +0100292static irqreturn_t TLan_HandleInterrupt( int, void *);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700293static int TLan_Close( struct net_device *);
294static struct net_device_stats *TLan_GetStats( struct net_device *);
295static void TLan_SetMulticastList( struct net_device *);
296static int TLan_ioctl( struct net_device *dev, struct ifreq *rq, int cmd);
297static int TLan_probe1( struct pci_dev *pdev, long ioaddr, int irq, int rev, const struct pci_device_id *ent);
298static void TLan_tx_timeout( struct net_device *dev);
David Howellsc4028952006-11-22 14:57:56 +0000299static void TLan_tx_timeout_work(struct work_struct *work);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700300static int tlan_init_one( struct pci_dev *pdev, const struct pci_device_id *ent);
301
302static u32 TLan_HandleInvalid( struct net_device *, u16 );
303static u32 TLan_HandleTxEOF( struct net_device *, u16 );
304static u32 TLan_HandleStatOverflow( struct net_device *, u16 );
305static u32 TLan_HandleRxEOF( struct net_device *, u16 );
306static u32 TLan_HandleDummy( struct net_device *, u16 );
307static u32 TLan_HandleTxEOC( struct net_device *, u16 );
308static u32 TLan_HandleStatusCheck( struct net_device *, u16 );
309static u32 TLan_HandleRxEOC( struct net_device *, u16 );
310
311static void TLan_Timer( unsigned long );
312
313static void TLan_ResetLists( struct net_device * );
314static void TLan_FreeLists( struct net_device * );
315static void TLan_PrintDio( u16 );
316static void TLan_PrintList( TLanList *, char *, int );
317static void TLan_ReadAndClearStats( struct net_device *, int );
318static void TLan_ResetAdapter( struct net_device * );
319static void TLan_FinishReset( struct net_device * );
320static void TLan_SetMac( struct net_device *, int areg, char *mac );
321
322static void TLan_PhyPrint( struct net_device * );
323static void TLan_PhyDetect( struct net_device * );
324static void TLan_PhyPowerDown( struct net_device * );
325static void TLan_PhyPowerUp( struct net_device * );
326static void TLan_PhyReset( struct net_device * );
327static void TLan_PhyStartLink( struct net_device * );
328static void TLan_PhyFinishAutoNeg( struct net_device * );
329#ifdef MONITOR
330static void TLan_PhyMonitor( struct net_device * );
331#endif
332
333/*
334static int TLan_PhyNop( struct net_device * );
335static int TLan_PhyInternalCheck( struct net_device * );
336static int TLan_PhyInternalService( struct net_device * );
337static int TLan_PhyDp83840aCheck( struct net_device * );
338*/
339
340static int TLan_MiiReadReg( struct net_device *, u16, u16, u16 * );
341static void TLan_MiiSendData( u16, u32, unsigned );
342static void TLan_MiiSync( u16 );
343static void TLan_MiiWriteReg( struct net_device *, u16, u16, u16 );
344
345static void TLan_EeSendStart( u16 );
346static int TLan_EeSendByte( u16, u8, int );
347static void TLan_EeReceiveByte( u16, u8 *, int );
348static int TLan_EeReadByte( struct net_device *, u8, u8 * );
349
350
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400351static void
Linus Torvalds1da177e2005-04-16 15:20:36 -0700352TLan_StoreSKB( struct tlan_list_tag *tag, struct sk_buff *skb)
353{
354 unsigned long addr = (unsigned long)skb;
355 tag->buffer[9].address = (u32)addr;
356 addr >>= 31; /* >>= 32 is undefined for 32bit arch, stupid C */
357 addr >>= 1;
358 tag->buffer[8].address = (u32)addr;
359}
360
361static struct sk_buff *
362TLan_GetSKB( struct tlan_list_tag *tag)
363{
364 unsigned long addr = tag->buffer[8].address;
365 addr <<= 31;
366 addr <<= 1;
367 addr |= tag->buffer[9].address;
368 return (struct sk_buff *) addr;
369}
370
371
372static TLanIntVectorFunc *TLanIntVector[TLAN_INT_NUMBER_OF_INTS] = {
373 TLan_HandleInvalid,
374 TLan_HandleTxEOF,
375 TLan_HandleStatOverflow,
376 TLan_HandleRxEOF,
377 TLan_HandleDummy,
378 TLan_HandleTxEOC,
379 TLan_HandleStatusCheck,
380 TLan_HandleRxEOC
381};
382
383static inline void
384TLan_SetTimer( struct net_device *dev, u32 ticks, u32 type )
385{
386 TLanPrivateInfo *priv = netdev_priv(dev);
387 unsigned long flags = 0;
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400388
Linus Torvalds1da177e2005-04-16 15:20:36 -0700389 if (!in_irq())
390 spin_lock_irqsave(&priv->lock, flags);
391 if ( priv->timer.function != NULL &&
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400392 priv->timerType != TLAN_TIMER_ACTIVITY ) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700393 if (!in_irq())
394 spin_unlock_irqrestore(&priv->lock, flags);
395 return;
396 }
397 priv->timer.function = &TLan_Timer;
398 if (!in_irq())
399 spin_unlock_irqrestore(&priv->lock, flags);
400
401 priv->timer.data = (unsigned long) dev;
402 priv->timerSetAt = jiffies;
403 priv->timerType = type;
404 mod_timer(&priv->timer, jiffies + ticks);
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400405
Linus Torvalds1da177e2005-04-16 15:20:36 -0700406} /* TLan_SetTimer */
407
408
409/*****************************************************************************
410******************************************************************************
411
412 ThunderLAN Driver Primary Functions
413
414 These functions are more or less common to all Linux network drivers.
415
416******************************************************************************
417*****************************************************************************/
418
419
420
421
422
423 /***************************************************************
424 * tlan_remove_one
425 *
426 * Returns:
427 * Nothing
428 * Parms:
429 * None
430 *
431 * Goes through the TLanDevices list and frees the device
432 * structs and memory associated with each device (lists
433 * and buffers). It also ureserves the IO port regions
434 * associated with this device.
435 *
436 **************************************************************/
437
438
439static void __devexit tlan_remove_one( struct pci_dev *pdev)
440{
441 struct net_device *dev = pci_get_drvdata( pdev );
442 TLanPrivateInfo *priv = netdev_priv(dev);
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400443
Linus Torvalds1da177e2005-04-16 15:20:36 -0700444 unregister_netdev( dev );
445
446 if ( priv->dmaStorage ) {
447 pci_free_consistent(priv->pciDev, priv->dmaSize, priv->dmaStorage, priv->dmaStorageDMA );
448 }
449
450#ifdef CONFIG_PCI
451 pci_release_regions(pdev);
452#endif
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400453
Linus Torvalds1da177e2005-04-16 15:20:36 -0700454 free_netdev( dev );
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400455
Linus Torvalds1da177e2005-04-16 15:20:36 -0700456 pci_set_drvdata( pdev, NULL );
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400457}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700458
459static struct pci_driver tlan_driver = {
460 .name = "tlan",
461 .id_table = tlan_pci_tbl,
462 .probe = tlan_init_one,
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400463 .remove = __devexit_p(tlan_remove_one),
Linus Torvalds1da177e2005-04-16 15:20:36 -0700464};
465
466static int __init tlan_probe(void)
467{
468 static int pad_allocated;
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400469
Linus Torvalds1da177e2005-04-16 15:20:36 -0700470 printk(KERN_INFO "%s", tlan_banner);
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400471
Linus Torvalds1da177e2005-04-16 15:20:36 -0700472 TLanPadBuffer = (u8 *) pci_alloc_consistent(NULL, TLAN_MIN_FRAME_SIZE, &TLanPadBufferDMA);
473
474 if (TLanPadBuffer == NULL) {
475 printk(KERN_ERR "TLAN: Could not allocate memory for pad buffer.\n");
476 return -ENOMEM;
477 }
478
479 memset(TLanPadBuffer, 0, TLAN_MIN_FRAME_SIZE);
480 pad_allocated = 1;
481
482 TLAN_DBG(TLAN_DEBUG_PROBE, "Starting PCI Probe....\n");
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400483
Linus Torvalds1da177e2005-04-16 15:20:36 -0700484 /* Use new style PCI probing. Now the kernel will
485 do most of this for us */
486 pci_register_driver(&tlan_driver);
487
488 TLAN_DBG(TLAN_DEBUG_PROBE, "Starting EISA Probe....\n");
489 TLan_EisaProbe();
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400490
491 printk(KERN_INFO "TLAN: %d device%s installed, PCI: %d EISA: %d\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -0700492 TLanDevicesInstalled, TLanDevicesInstalled == 1 ? "" : "s",
493 tlan_have_pci, tlan_have_eisa);
494
495 if (TLanDevicesInstalled == 0) {
496 pci_unregister_driver(&tlan_driver);
497 pci_free_consistent(NULL, TLAN_MIN_FRAME_SIZE, TLanPadBuffer, TLanPadBufferDMA);
498 return -ENODEV;
499 }
500 return 0;
501}
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400502
Linus Torvalds1da177e2005-04-16 15:20:36 -0700503
504static int __devinit tlan_init_one( struct pci_dev *pdev,
505 const struct pci_device_id *ent)
506{
507 return TLan_probe1( pdev, -1, -1, 0, ent);
508}
509
510
511/*
512 ***************************************************************
513 * tlan_probe1
514 *
515 * Returns:
516 * 0 on success, error code on error
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400517 * Parms:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700518 * none
519 *
520 * The name is lower case to fit in with all the rest of
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400521 * the netcard_probe names. This function looks for
Linus Torvalds1da177e2005-04-16 15:20:36 -0700522 * another TLan based adapter, setting it up with the
523 * allocated device struct if one is found.
524 * tlan_probe has been ported to the new net API and
525 * now allocates its own device structure. This function
526 * is also used by modules.
527 *
528 **************************************************************/
529
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400530static int __devinit TLan_probe1(struct pci_dev *pdev,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700531 long ioaddr, int irq, int rev, const struct pci_device_id *ent )
532{
533
534 struct net_device *dev;
535 TLanPrivateInfo *priv;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700536 u16 device_id;
537 int reg, rc = -ENODEV;
538
Adrian Bunkad9f6712006-02-05 00:37:47 +0100539#ifdef CONFIG_PCI
Linus Torvalds1da177e2005-04-16 15:20:36 -0700540 if (pdev) {
541 rc = pci_enable_device(pdev);
542 if (rc)
543 return rc;
544
545 rc = pci_request_regions(pdev, TLanSignature);
546 if (rc) {
547 printk(KERN_ERR "TLAN: Could not reserve IO regions\n");
548 goto err_out;
549 }
550 }
Adrian Bunkad9f6712006-02-05 00:37:47 +0100551#endif /* CONFIG_PCI */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700552
553 dev = alloc_etherdev(sizeof(TLanPrivateInfo));
554 if (dev == NULL) {
555 printk(KERN_ERR "TLAN: Could not allocate memory for device.\n");
556 rc = -ENOMEM;
557 goto err_out_regions;
558 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700559 SET_NETDEV_DEV(dev, &pdev->dev);
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400560
Linus Torvalds1da177e2005-04-16 15:20:36 -0700561 priv = netdev_priv(dev);
562
563 priv->pciDev = pdev;
David Howellsc4028952006-11-22 14:57:56 +0000564 priv->dev = dev;
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400565
Linus Torvalds1da177e2005-04-16 15:20:36 -0700566 /* Is this a PCI device? */
567 if (pdev) {
568 u32 pci_io_base = 0;
569
570 priv->adapter = &board_info[ent->driver_data];
571
Domen Puncer1e7f0bd2005-06-26 18:22:14 -0400572 rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700573 if (rc) {
574 printk(KERN_ERR "TLAN: No suitable PCI mapping available.\n");
575 goto err_out_free_dev;
576 }
577
Linus Torvalds1da177e2005-04-16 15:20:36 -0700578 for ( reg= 0; reg <= 5; reg ++ ) {
579 if (pci_resource_flags(pdev, reg) & IORESOURCE_IO) {
580 pci_io_base = pci_resource_start(pdev, reg);
581 TLAN_DBG( TLAN_DEBUG_GNRL, "IO mapping is available at %x.\n",
582 pci_io_base);
583 break;
584 }
585 }
586 if (!pci_io_base) {
587 printk(KERN_ERR "TLAN: No IO mappings available\n");
588 rc = -EIO;
589 goto err_out_free_dev;
590 }
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400591
Linus Torvalds1da177e2005-04-16 15:20:36 -0700592 dev->base_addr = pci_io_base;
593 dev->irq = pdev->irq;
Auke Kok44c10132007-06-08 15:46:36 -0700594 priv->adapterRev = pdev->revision;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700595 pci_set_master(pdev);
596 pci_set_drvdata(pdev, dev);
597
598 } else { /* EISA card */
599 /* This is a hack. We need to know which board structure
600 * is suited for this adapter */
601 device_id = inw(ioaddr + EISA_ID2);
602 priv->is_eisa = 1;
603 if (device_id == 0x20F1) {
604 priv->adapter = &board_info[13]; /* NetFlex-3/E */
605 priv->adapterRev = 23; /* TLAN 2.3 */
606 } else {
607 priv->adapter = &board_info[14];
608 priv->adapterRev = 10; /* TLAN 1.0 */
609 }
610 dev->base_addr = ioaddr;
611 dev->irq = irq;
612 }
613
614 /* Kernel parameters */
615 if (dev->mem_start) {
616 priv->aui = dev->mem_start & 0x01;
617 priv->duplex = ((dev->mem_start & 0x06) == 0x06) ? 0 : (dev->mem_start & 0x06) >> 1;
618 priv->speed = ((dev->mem_start & 0x18) == 0x18) ? 0 : (dev->mem_start & 0x18) >> 3;
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400619
Linus Torvalds1da177e2005-04-16 15:20:36 -0700620 if (priv->speed == 0x1) {
621 priv->speed = TLAN_SPEED_10;
622 } else if (priv->speed == 0x2) {
623 priv->speed = TLAN_SPEED_100;
624 }
625 debug = priv->debug = dev->mem_end;
626 } else {
627 priv->aui = aui[boards_found];
628 priv->speed = speed[boards_found];
629 priv->duplex = duplex[boards_found];
630 priv->debug = debug;
631 }
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400632
Linus Torvalds1da177e2005-04-16 15:20:36 -0700633 /* This will be used when we get an adapter error from
634 * within our irq handler */
David Howellsc4028952006-11-22 14:57:56 +0000635 INIT_WORK(&priv->tlan_tqueue, TLan_tx_timeout_work);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700636
637 spin_lock_init(&priv->lock);
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400638
Linus Torvalds1da177e2005-04-16 15:20:36 -0700639 rc = TLan_Init(dev);
640 if (rc) {
641 printk(KERN_ERR "TLAN: Could not set up device.\n");
642 goto err_out_free_dev;
643 }
644
645 rc = register_netdev(dev);
646 if (rc) {
647 printk(KERN_ERR "TLAN: Could not register device.\n");
648 goto err_out_uninit;
649 }
650
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400651
Linus Torvalds1da177e2005-04-16 15:20:36 -0700652 TLanDevicesInstalled++;
653 boards_found++;
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400654
Linus Torvalds1da177e2005-04-16 15:20:36 -0700655 /* pdev is NULL if this is an EISA device */
656 if (pdev)
657 tlan_have_pci++;
658 else {
659 priv->nextDevice = TLan_Eisa_Devices;
660 TLan_Eisa_Devices = dev;
661 tlan_have_eisa++;
662 }
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400663
Linus Torvalds1da177e2005-04-16 15:20:36 -0700664 printk(KERN_INFO "TLAN: %s irq=%2d, io=%04x, %s, Rev. %d\n",
665 dev->name,
666 (int) dev->irq,
667 (int) dev->base_addr,
668 priv->adapter->deviceLabel,
669 priv->adapterRev);
670 return 0;
671
672err_out_uninit:
673 pci_free_consistent(priv->pciDev, priv->dmaSize, priv->dmaStorage,
674 priv->dmaStorageDMA );
675err_out_free_dev:
676 free_netdev(dev);
677err_out_regions:
678#ifdef CONFIG_PCI
679 if (pdev)
680 pci_release_regions(pdev);
681#endif
682err_out:
683 if (pdev)
684 pci_disable_device(pdev);
685 return rc;
686}
687
688
689static void TLan_Eisa_Cleanup(void)
690{
691 struct net_device *dev;
692 TLanPrivateInfo *priv;
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400693
Linus Torvalds1da177e2005-04-16 15:20:36 -0700694 while( tlan_have_eisa ) {
695 dev = TLan_Eisa_Devices;
696 priv = netdev_priv(dev);
697 if (priv->dmaStorage) {
698 pci_free_consistent(priv->pciDev, priv->dmaSize, priv->dmaStorage, priv->dmaStorageDMA );
699 }
700 release_region( dev->base_addr, 0x10);
701 unregister_netdev( dev );
702 TLan_Eisa_Devices = priv->nextDevice;
703 free_netdev( dev );
704 tlan_have_eisa--;
705 }
706}
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400707
708
Linus Torvalds1da177e2005-04-16 15:20:36 -0700709static void __exit tlan_exit(void)
710{
711 pci_unregister_driver(&tlan_driver);
712
713 if (tlan_have_eisa)
714 TLan_Eisa_Cleanup();
715
716 pci_free_consistent(NULL, TLAN_MIN_FRAME_SIZE, TLanPadBuffer, TLanPadBufferDMA);
717
718}
719
720
721/* Module loading/unloading */
722module_init(tlan_probe);
723module_exit(tlan_exit);
724
725
726
727 /**************************************************************
728 * TLan_EisaProbe
729 *
730 * Returns: 0 on success, 1 otherwise
731 *
732 * Parms: None
733 *
734 *
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400735 * This functions probes for EISA devices and calls
736 * TLan_probe1 when one is found.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700737 *
738 *************************************************************/
739
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400740static void __init TLan_EisaProbe (void)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700741{
742 long ioaddr;
743 int rc = -ENODEV;
744 int irq;
745 u16 device_id;
746
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400747 if (!EISA_bus) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700748 TLAN_DBG(TLAN_DEBUG_PROBE, "No EISA bus present\n");
749 return;
750 }
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400751
Linus Torvalds1da177e2005-04-16 15:20:36 -0700752 /* Loop through all slots of the EISA bus */
753 for (ioaddr = 0x1000; ioaddr < 0x9000; ioaddr += 0x1000) {
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400754
755 TLAN_DBG(TLAN_DEBUG_PROBE,"EISA_ID 0x%4x: 0x%4x\n", (int) ioaddr + 0xC80, inw(ioaddr + EISA_ID));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700756 TLAN_DBG(TLAN_DEBUG_PROBE,"EISA_ID 0x%4x: 0x%4x\n", (int) ioaddr + 0xC82, inw(ioaddr + EISA_ID2));
757
758
759 TLAN_DBG(TLAN_DEBUG_PROBE, "Probing for EISA adapter at IO: 0x%4x : ",
760 (int) ioaddr);
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400761 if (request_region(ioaddr, 0x10, TLanSignature) == NULL)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700762 goto out;
763
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400764 if (inw(ioaddr + EISA_ID) != 0x110E) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700765 release_region(ioaddr, 0x10);
766 goto out;
767 }
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400768
Linus Torvalds1da177e2005-04-16 15:20:36 -0700769 device_id = inw(ioaddr + EISA_ID2);
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400770 if (device_id != 0x20F1 && device_id != 0x40F1) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700771 release_region (ioaddr, 0x10);
772 goto out;
773 }
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400774
Linus Torvalds1da177e2005-04-16 15:20:36 -0700775 if (inb(ioaddr + EISA_CR) != 0x1) { /* Check if adapter is enabled */
776 release_region (ioaddr, 0x10);
777 goto out2;
778 }
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400779
780 if (debug == 0x10)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700781 printk("Found one\n");
782
783
784 /* Get irq from board */
785 switch (inb(ioaddr + 0xCC0)) {
786 case(0x10):
787 irq=5;
788 break;
789 case(0x20):
790 irq=9;
791 break;
792 case(0x40):
793 irq=10;
794 break;
795 case(0x80):
796 irq=11;
797 break;
798 default:
799 goto out;
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400800 }
801
802
Linus Torvalds1da177e2005-04-16 15:20:36 -0700803 /* Setup the newly found eisa adapter */
804 rc = TLan_probe1( NULL, ioaddr, irq,
805 12, NULL);
806 continue;
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400807
Linus Torvalds1da177e2005-04-16 15:20:36 -0700808 out:
809 if (debug == 0x10)
810 printk("None found\n");
811 continue;
812
813 out2: if (debug == 0x10)
814 printk("Card found but it is not enabled, skipping\n");
815 continue;
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400816
Linus Torvalds1da177e2005-04-16 15:20:36 -0700817 }
818
819} /* TLan_EisaProbe */
820
821#ifdef CONFIG_NET_POLL_CONTROLLER
822static void TLan_Poll(struct net_device *dev)
823{
824 disable_irq(dev->irq);
David Howells7d12e782006-10-05 14:55:46 +0100825 TLan_HandleInterrupt(dev->irq, dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700826 enable_irq(dev->irq);
827}
828#endif
829
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400830
Linus Torvalds1da177e2005-04-16 15:20:36 -0700831
832
833 /***************************************************************
834 * TLan_Init
835 *
836 * Returns:
837 * 0 on success, error code otherwise.
838 * Parms:
839 * dev The structure of the device to be
840 * init'ed.
841 *
842 * This function completes the initialization of the
843 * device structure and driver. It reserves the IO
844 * addresses, allocates memory for the lists and bounce
845 * buffers, retrieves the MAC address from the eeprom
846 * and assignes the device's methods.
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400847 *
Linus Torvalds1da177e2005-04-16 15:20:36 -0700848 **************************************************************/
849
850static int TLan_Init( struct net_device *dev )
851{
852 int dma_size;
853 int err;
854 int i;
855 TLanPrivateInfo *priv;
856
857 priv = netdev_priv(dev);
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400858
Linus Torvalds1da177e2005-04-16 15:20:36 -0700859 if ( bbuf ) {
860 dma_size = ( TLAN_NUM_RX_LISTS + TLAN_NUM_TX_LISTS )
861 * ( sizeof(TLanList) + TLAN_MAX_FRAME_SIZE );
862 } else {
863 dma_size = ( TLAN_NUM_RX_LISTS + TLAN_NUM_TX_LISTS )
864 * ( sizeof(TLanList) );
865 }
866 priv->dmaStorage = pci_alloc_consistent(priv->pciDev, dma_size, &priv->dmaStorageDMA);
867 priv->dmaSize = dma_size;
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400868
Linus Torvalds1da177e2005-04-16 15:20:36 -0700869 if ( priv->dmaStorage == NULL ) {
870 printk(KERN_ERR "TLAN: Could not allocate lists and buffers for %s.\n",
871 dev->name );
872 return -ENOMEM;
873 }
874 memset( priv->dmaStorage, 0, dma_size );
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400875 priv->rxList = (TLanList *)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700876 ( ( ( (u32) priv->dmaStorage ) + 7 ) & 0xFFFFFFF8 );
877 priv->rxListDMA = ( ( ( (u32) priv->dmaStorageDMA ) + 7 ) & 0xFFFFFFF8 );
878 priv->txList = priv->rxList + TLAN_NUM_RX_LISTS;
879 priv->txListDMA = priv->rxListDMA + sizeof(TLanList) * TLAN_NUM_RX_LISTS;
880 if ( bbuf ) {
881 priv->rxBuffer = (u8 *) ( priv->txList + TLAN_NUM_TX_LISTS );
882 priv->rxBufferDMA =priv->txListDMA + sizeof(TLanList) * TLAN_NUM_TX_LISTS;
883 priv->txBuffer = priv->rxBuffer + ( TLAN_NUM_RX_LISTS * TLAN_MAX_FRAME_SIZE );
884 priv->txBufferDMA = priv->rxBufferDMA + ( TLAN_NUM_RX_LISTS * TLAN_MAX_FRAME_SIZE );
885 }
886
887 err = 0;
888 for ( i = 0; i < 6 ; i++ )
889 err |= TLan_EeReadByte( dev,
890 (u8) priv->adapter->addrOfs + i,
891 (u8 *) &dev->dev_addr[i] );
892 if ( err ) {
893 printk(KERN_ERR "TLAN: %s: Error reading MAC from eeprom: %d\n",
894 dev->name,
895 err );
896 }
897 dev->addr_len = 6;
898
899 netif_carrier_off(dev);
900
901 /* Device methods */
902 dev->open = &TLan_Open;
903 dev->hard_start_xmit = &TLan_StartTx;
904 dev->stop = &TLan_Close;
905 dev->get_stats = &TLan_GetStats;
906 dev->set_multicast_list = &TLan_SetMulticastList;
907 dev->do_ioctl = &TLan_ioctl;
908#ifdef CONFIG_NET_POLL_CONTROLLER
909 dev->poll_controller = &TLan_Poll;
910#endif
911 dev->tx_timeout = &TLan_tx_timeout;
912 dev->watchdog_timeo = TX_TIMEOUT;
913
914 return 0;
915
916} /* TLan_Init */
917
918
919
920
921 /***************************************************************
922 * TLan_Open
923 *
924 * Returns:
925 * 0 on success, error code otherwise.
926 * Parms:
927 * dev Structure of device to be opened.
928 *
929 * This routine puts the driver and TLAN adapter in a
930 * state where it is ready to send and receive packets.
931 * It allocates the IRQ, resets and brings the adapter
932 * out of reset, and allows interrupts. It also delays
933 * the startup for autonegotiation or sends a Rx GO
934 * command to the adapter, as appropriate.
935 *
936 **************************************************************/
937
938static int TLan_Open( struct net_device *dev )
939{
940 TLanPrivateInfo *priv = netdev_priv(dev);
941 int err;
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400942
Linus Torvalds1da177e2005-04-16 15:20:36 -0700943 priv->tlanRev = TLan_DioRead8( dev->base_addr, TLAN_DEF_REVISION );
Thomas Gleixner1fb9df52006-07-01 19:29:39 -0700944 err = request_irq( dev->irq, TLan_HandleInterrupt, IRQF_SHARED, TLanSignature, dev );
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400945
Linus Torvalds1da177e2005-04-16 15:20:36 -0700946 if ( err ) {
947 printk(KERN_ERR "TLAN: Cannot open %s because IRQ %d is already in use.\n", dev->name, dev->irq );
948 return err;
949 }
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400950
Linus Torvalds1da177e2005-04-16 15:20:36 -0700951 init_timer(&priv->timer);
952 netif_start_queue(dev);
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400953
Linus Torvalds1da177e2005-04-16 15:20:36 -0700954 /* NOTE: It might not be necessary to read the stats before a
955 reset if you don't care what the values are.
956 */
957 TLan_ResetLists( dev );
958 TLan_ReadAndClearStats( dev, TLAN_IGNORE );
959 TLan_ResetAdapter( dev );
960
961 TLAN_DBG( TLAN_DEBUG_GNRL, "%s: Opened. TLAN Chip Rev: %x\n", dev->name, priv->tlanRev );
962
963 return 0;
964
965} /* TLan_Open */
966
967
968
969 /**************************************************************
970 * TLan_ioctl
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400971 *
Linus Torvalds1da177e2005-04-16 15:20:36 -0700972 * Returns:
973 * 0 on success, error code otherwise
974 * Params:
975 * dev structure of device to receive ioctl.
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400976 *
Linus Torvalds1da177e2005-04-16 15:20:36 -0700977 * rq ifreq structure to hold userspace data.
978 *
979 * cmd ioctl command.
980 *
981 *
982 *************************************************************/
983
984static int TLan_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
985{
986 TLanPrivateInfo *priv = netdev_priv(dev);
987 struct mii_ioctl_data *data = if_mii(rq);
988 u32 phy = priv->phy[priv->phyNum];
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400989
Linus Torvalds1da177e2005-04-16 15:20:36 -0700990 if (!priv->phyOnline)
991 return -EAGAIN;
992
993 switch(cmd) {
994 case SIOCGMIIPHY: /* Get address of MII PHY in use. */
995 data->phy_id = phy;
996
997
998 case SIOCGMIIREG: /* Read MII PHY register. */
999 TLan_MiiReadReg(dev, data->phy_id & 0x1f, data->reg_num & 0x1f, &data->val_out);
1000 return 0;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001001
Linus Torvalds1da177e2005-04-16 15:20:36 -07001002
1003 case SIOCSMIIREG: /* Write MII PHY register. */
1004 if (!capable(CAP_NET_ADMIN))
1005 return -EPERM;
1006 TLan_MiiWriteReg(dev, data->phy_id & 0x1f, data->reg_num & 0x1f, data->val_in);
1007 return 0;
1008 default:
1009 return -EOPNOTSUPP;
1010 }
1011} /* tlan_ioctl */
1012
1013
1014 /***************************************************************
1015 * TLan_tx_timeout
1016 *
1017 * Returns: nothing
1018 *
1019 * Params:
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001020 * dev structure of device which timed out
Linus Torvalds1da177e2005-04-16 15:20:36 -07001021 * during transmit.
1022 *
1023 **************************************************************/
1024
1025static void TLan_tx_timeout(struct net_device *dev)
1026{
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001027
Linus Torvalds1da177e2005-04-16 15:20:36 -07001028 TLAN_DBG( TLAN_DEBUG_GNRL, "%s: Transmit timed out.\n", dev->name);
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001029
Linus Torvalds1da177e2005-04-16 15:20:36 -07001030 /* Ok so we timed out, lets see what we can do about it...*/
1031 TLan_FreeLists( dev );
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001032 TLan_ResetLists( dev );
Linus Torvalds1da177e2005-04-16 15:20:36 -07001033 TLan_ReadAndClearStats( dev, TLAN_IGNORE );
1034 TLan_ResetAdapter( dev );
1035 dev->trans_start = jiffies;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001036 netif_wake_queue( dev );
Linus Torvalds1da177e2005-04-16 15:20:36 -07001037
1038}
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001039
Linus Torvalds1da177e2005-04-16 15:20:36 -07001040
David Howellsc4028952006-11-22 14:57:56 +00001041 /***************************************************************
1042 * TLan_tx_timeout_work
1043 *
1044 * Returns: nothing
1045 *
1046 * Params:
1047 * work work item of device which timed out
1048 *
1049 **************************************************************/
1050
1051static void TLan_tx_timeout_work(struct work_struct *work)
1052{
1053 TLanPrivateInfo *priv =
1054 container_of(work, TLanPrivateInfo, tlan_tqueue);
1055
1056 TLan_tx_timeout(priv->dev);
1057}
1058
1059
Linus Torvalds1da177e2005-04-16 15:20:36 -07001060
1061 /***************************************************************
1062 * TLan_StartTx
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001063 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07001064 * Returns:
1065 * 0 on success, non-zero on failure.
1066 * Parms:
1067 * skb A pointer to the sk_buff containing the
1068 * frame to be sent.
1069 * dev The device to send the data on.
1070 *
1071 * This function adds a frame to the Tx list to be sent
1072 * ASAP. First it verifies that the adapter is ready and
1073 * there is room in the queue. Then it sets up the next
1074 * available list, copies the frame to the corresponding
1075 * buffer. If the adapter Tx channel is idle, it gives
1076 * the adapter a Tx Go command on the list, otherwise it
1077 * sets the forward address of the previous list to point
1078 * to this one. Then it frees the sk_buff.
1079 *
1080 **************************************************************/
1081
1082static int TLan_StartTx( struct sk_buff *skb, struct net_device *dev )
1083{
1084 TLanPrivateInfo *priv = netdev_priv(dev);
1085 TLanList *tail_list;
1086 dma_addr_t tail_list_phys;
1087 u8 *tail_buffer;
1088 int pad;
1089 unsigned long flags;
1090
1091 if ( ! priv->phyOnline ) {
1092 TLAN_DBG( TLAN_DEBUG_TX, "TRANSMIT: %s PHY is not ready\n", dev->name );
1093 dev_kfree_skb_any(skb);
1094 return 0;
1095 }
1096
1097 tail_list = priv->txList + priv->txTail;
1098 tail_list_phys = priv->txListDMA + sizeof(TLanList) * priv->txTail;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001099
Linus Torvalds1da177e2005-04-16 15:20:36 -07001100 if ( tail_list->cStat != TLAN_CSTAT_UNUSED ) {
1101 TLAN_DBG( TLAN_DEBUG_TX, "TRANSMIT: %s is busy (Head=%d Tail=%d)\n", dev->name, priv->txHead, priv->txTail );
1102 netif_stop_queue(dev);
1103 priv->txBusyCount++;
1104 return 1;
1105 }
1106
1107 tail_list->forward = 0;
1108
1109 if ( bbuf ) {
1110 tail_buffer = priv->txBuffer + ( priv->txTail * TLAN_MAX_FRAME_SIZE );
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03001111 skb_copy_from_linear_data(skb, tail_buffer, skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001112 } else {
1113 tail_list->buffer[0].address = pci_map_single(priv->pciDev, skb->data, skb->len, PCI_DMA_TODEVICE);
1114 TLan_StoreSKB(tail_list, skb);
1115 }
1116
1117 pad = TLAN_MIN_FRAME_SIZE - skb->len;
1118
1119 if ( pad > 0 ) {
1120 tail_list->frameSize = (u16) skb->len + pad;
1121 tail_list->buffer[0].count = (u32) skb->len;
1122 tail_list->buffer[1].count = TLAN_LAST_BUFFER | (u32) pad;
1123 tail_list->buffer[1].address = TLanPadBufferDMA;
1124 } else {
1125 tail_list->frameSize = (u16) skb->len;
1126 tail_list->buffer[0].count = TLAN_LAST_BUFFER | (u32) skb->len;
1127 tail_list->buffer[1].count = 0;
1128 tail_list->buffer[1].address = 0;
1129 }
1130
1131 spin_lock_irqsave(&priv->lock, flags);
1132 tail_list->cStat = TLAN_CSTAT_READY;
1133 if ( ! priv->txInProgress ) {
1134 priv->txInProgress = 1;
1135 TLAN_DBG( TLAN_DEBUG_TX, "TRANSMIT: Starting TX on buffer %d\n", priv->txTail );
1136 outl( tail_list_phys, dev->base_addr + TLAN_CH_PARM );
1137 outl( TLAN_HC_GO, dev->base_addr + TLAN_HOST_CMD );
1138 } else {
1139 TLAN_DBG( TLAN_DEBUG_TX, "TRANSMIT: Adding buffer %d to TX channel\n", priv->txTail );
1140 if ( priv->txTail == 0 ) {
1141 ( priv->txList + ( TLAN_NUM_TX_LISTS - 1 ) )->forward = tail_list_phys;
1142 } else {
1143 ( priv->txList + ( priv->txTail - 1 ) )->forward = tail_list_phys;
1144 }
1145 }
1146 spin_unlock_irqrestore(&priv->lock, flags);
1147
1148 CIRC_INC( priv->txTail, TLAN_NUM_TX_LISTS );
1149
1150 if ( bbuf )
1151 dev_kfree_skb_any(skb);
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001152
Linus Torvalds1da177e2005-04-16 15:20:36 -07001153 dev->trans_start = jiffies;
1154 return 0;
1155
1156} /* TLan_StartTx */
1157
1158
1159
1160
1161 /***************************************************************
1162 * TLan_HandleInterrupt
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001163 *
1164 * Returns:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001165 * Nothing
1166 * Parms:
1167 * irq The line on which the interrupt
1168 * occurred.
1169 * dev_id A pointer to the device assigned to
1170 * this irq line.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001171 *
1172 * This function handles an interrupt generated by its
1173 * assigned TLAN adapter. The function deactivates
1174 * interrupts on its adapter, records the type of
1175 * interrupt, executes the appropriate subhandler, and
1176 * acknowdges the interrupt to the adapter (thus
1177 * re-enabling adapter interrupts.
1178 *
1179 **************************************************************/
1180
David Howells7d12e782006-10-05 14:55:46 +01001181static irqreturn_t TLan_HandleInterrupt(int irq, void *dev_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001182{
1183 u32 ack;
1184 struct net_device *dev;
1185 u32 host_cmd;
1186 u16 host_int;
1187 int type;
1188 TLanPrivateInfo *priv;
1189
1190 dev = dev_id;
1191 priv = netdev_priv(dev);
1192
1193 spin_lock(&priv->lock);
1194
1195 host_int = inw( dev->base_addr + TLAN_HOST_INT );
1196 outw( host_int, dev->base_addr + TLAN_HOST_INT );
1197
1198 type = ( host_int & TLAN_HI_IT_MASK ) >> 2;
1199
1200 ack = TLanIntVector[type]( dev, host_int );
1201
1202 if ( ack ) {
1203 host_cmd = TLAN_HC_ACK | ack | ( type << 18 );
1204 outl( host_cmd, dev->base_addr + TLAN_HOST_CMD );
1205 }
1206
1207 spin_unlock(&priv->lock);
1208
1209 return IRQ_HANDLED;
1210} /* TLan_HandleInterrupts */
1211
1212
1213
1214
1215 /***************************************************************
1216 * TLan_Close
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001217 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07001218 * Returns:
1219 * An error code.
1220 * Parms:
1221 * dev The device structure of the device to
1222 * close.
1223 *
1224 * This function shuts down the adapter. It records any
1225 * stats, puts the adapter into reset state, deactivates
1226 * its time as needed, and frees the irq it is using.
1227 *
1228 **************************************************************/
1229
1230static int TLan_Close(struct net_device *dev)
1231{
1232 TLanPrivateInfo *priv = netdev_priv(dev);
1233
1234 netif_stop_queue(dev);
1235 priv->neg_be_verbose = 0;
1236
1237 TLan_ReadAndClearStats( dev, TLAN_RECORD );
1238 outl( TLAN_HC_AD_RST, dev->base_addr + TLAN_HOST_CMD );
1239 if ( priv->timer.function != NULL ) {
1240 del_timer_sync( &priv->timer );
1241 priv->timer.function = NULL;
1242 }
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001243
Linus Torvalds1da177e2005-04-16 15:20:36 -07001244 free_irq( dev->irq, dev );
1245 TLan_FreeLists( dev );
1246 TLAN_DBG( TLAN_DEBUG_GNRL, "Device %s closed.\n", dev->name );
1247
1248 return 0;
1249
1250} /* TLan_Close */
1251
1252
1253
1254
1255 /***************************************************************
1256 * TLan_GetStats
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001257 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07001258 * Returns:
1259 * A pointer to the device's statistics structure.
1260 * Parms:
1261 * dev The device structure to return the
1262 * stats for.
1263 *
1264 * This function updates the devices statistics by reading
1265 * the TLAN chip's onboard registers. Then it returns the
1266 * address of the statistics structure.
1267 *
1268 **************************************************************/
1269
1270static struct net_device_stats *TLan_GetStats( struct net_device *dev )
1271{
1272 TLanPrivateInfo *priv = netdev_priv(dev);
1273 int i;
1274
1275 /* Should only read stats if open ? */
1276 TLan_ReadAndClearStats( dev, TLAN_RECORD );
1277
1278 TLAN_DBG( TLAN_DEBUG_RX, "RECEIVE: %s EOC count = %d\n", dev->name, priv->rxEocCount );
1279 TLAN_DBG( TLAN_DEBUG_TX, "TRANSMIT: %s Busy count = %d\n", dev->name, priv->txBusyCount );
1280 if ( debug & TLAN_DEBUG_GNRL ) {
1281 TLan_PrintDio( dev->base_addr );
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001282 TLan_PhyPrint( dev );
Linus Torvalds1da177e2005-04-16 15:20:36 -07001283 }
1284 if ( debug & TLAN_DEBUG_LIST ) {
1285 for ( i = 0; i < TLAN_NUM_RX_LISTS; i++ )
1286 TLan_PrintList( priv->rxList + i, "RX", i );
1287 for ( i = 0; i < TLAN_NUM_TX_LISTS; i++ )
1288 TLan_PrintList( priv->txList + i, "TX", i );
1289 }
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001290
Linus Torvalds1da177e2005-04-16 15:20:36 -07001291 return ( &( (TLanPrivateInfo *) netdev_priv(dev) )->stats );
1292
1293} /* TLan_GetStats */
1294
1295
1296
1297
1298 /***************************************************************
1299 * TLan_SetMulticastList
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001300 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07001301 * Returns:
1302 * Nothing
1303 * Parms:
1304 * dev The device structure to set the
1305 * multicast list for.
1306 *
1307 * This function sets the TLAN adaptor to various receive
1308 * modes. If the IFF_PROMISC flag is set, promiscuous
1309 * mode is acitviated. Otherwise, promiscuous mode is
1310 * turned off. If the IFF_ALLMULTI flag is set, then
1311 * the hash table is set to receive all group addresses.
1312 * Otherwise, the first three multicast addresses are
1313 * stored in AREG_1-3, and the rest are selected via the
1314 * hash table, as necessary.
1315 *
1316 **************************************************************/
1317
1318static void TLan_SetMulticastList( struct net_device *dev )
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001319{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001320 struct dev_mc_list *dmi = dev->mc_list;
1321 u32 hash1 = 0;
1322 u32 hash2 = 0;
1323 int i;
1324 u32 offset;
1325 u8 tmp;
1326
1327 if ( dev->flags & IFF_PROMISC ) {
1328 tmp = TLan_DioRead8( dev->base_addr, TLAN_NET_CMD );
1329 TLan_DioWrite8( dev->base_addr, TLAN_NET_CMD, tmp | TLAN_NET_CMD_CAF );
1330 } else {
1331 tmp = TLan_DioRead8( dev->base_addr, TLAN_NET_CMD );
1332 TLan_DioWrite8( dev->base_addr, TLAN_NET_CMD, tmp & ~TLAN_NET_CMD_CAF );
1333 if ( dev->flags & IFF_ALLMULTI ) {
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001334 for ( i = 0; i < 3; i++ )
Linus Torvalds1da177e2005-04-16 15:20:36 -07001335 TLan_SetMac( dev, i + 1, NULL );
1336 TLan_DioWrite32( dev->base_addr, TLAN_HASH_1, 0xFFFFFFFF );
1337 TLan_DioWrite32( dev->base_addr, TLAN_HASH_2, 0xFFFFFFFF );
1338 } else {
1339 for ( i = 0; i < dev->mc_count; i++ ) {
1340 if ( i < 3 ) {
1341 TLan_SetMac( dev, i + 1, (char *) &dmi->dmi_addr );
1342 } else {
1343 offset = TLan_HashFunc( (u8 *) &dmi->dmi_addr );
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001344 if ( offset < 32 )
Linus Torvalds1da177e2005-04-16 15:20:36 -07001345 hash1 |= ( 1 << offset );
1346 else
1347 hash2 |= ( 1 << ( offset - 32 ) );
1348 }
1349 dmi = dmi->next;
1350 }
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001351 for ( ; i < 3; i++ )
Linus Torvalds1da177e2005-04-16 15:20:36 -07001352 TLan_SetMac( dev, i + 1, NULL );
1353 TLan_DioWrite32( dev->base_addr, TLAN_HASH_1, hash1 );
1354 TLan_DioWrite32( dev->base_addr, TLAN_HASH_2, hash2 );
1355 }
1356 }
1357
1358} /* TLan_SetMulticastList */
1359
1360
1361
1362/*****************************************************************************
1363******************************************************************************
1364
1365 ThunderLAN Driver Interrupt Vectors and Table
1366
1367 Please see Chap. 4, "Interrupt Handling" of the "ThunderLAN
1368 Programmer's Guide" for more informations on handling interrupts
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001369 generated by TLAN based adapters.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001370
1371******************************************************************************
1372*****************************************************************************/
1373
1374
1375 /***************************************************************
1376 * TLan_HandleInvalid
1377 *
1378 * Returns:
1379 * 0
1380 * Parms:
1381 * dev Device assigned the IRQ that was
1382 * raised.
1383 * host_int The contents of the HOST_INT
1384 * port.
1385 *
1386 * This function handles invalid interrupts. This should
1387 * never happen unless some other adapter is trying to use
1388 * the IRQ line assigned to the device.
1389 *
1390 **************************************************************/
1391
1392u32 TLan_HandleInvalid( struct net_device *dev, u16 host_int )
1393{
1394 /* printk( "TLAN: Invalid interrupt on %s.\n", dev->name ); */
1395 return 0;
1396
1397} /* TLan_HandleInvalid */
1398
1399
1400
1401
1402 /***************************************************************
1403 * TLan_HandleTxEOF
1404 *
1405 * Returns:
1406 * 1
1407 * Parms:
1408 * dev Device assigned the IRQ that was
1409 * raised.
1410 * host_int The contents of the HOST_INT
1411 * port.
1412 *
1413 * This function handles Tx EOF interrupts which are raised
1414 * by the adapter when it has completed sending the
1415 * contents of a buffer. If detemines which list/buffer
1416 * was completed and resets it. If the buffer was the last
1417 * in the channel (EOC), then the function checks to see if
1418 * another buffer is ready to send, and if so, sends a Tx
1419 * Go command. Finally, the driver activates/continues the
1420 * activity LED.
1421 *
1422 **************************************************************/
1423
1424u32 TLan_HandleTxEOF( struct net_device *dev, u16 host_int )
1425{
1426 TLanPrivateInfo *priv = netdev_priv(dev);
1427 int eoc = 0;
1428 TLanList *head_list;
1429 dma_addr_t head_list_phys;
1430 u32 ack = 0;
1431 u16 tmpCStat;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001432
Linus Torvalds1da177e2005-04-16 15:20:36 -07001433 TLAN_DBG( TLAN_DEBUG_TX, "TRANSMIT: Handling TX EOF (Head=%d Tail=%d)\n", priv->txHead, priv->txTail );
1434 head_list = priv->txList + priv->txHead;
1435
1436 while (((tmpCStat = head_list->cStat ) & TLAN_CSTAT_FRM_CMP) && (ack < 255)) {
1437 ack++;
1438 if ( ! bbuf ) {
1439 struct sk_buff *skb = TLan_GetSKB(head_list);
1440 pci_unmap_single(priv->pciDev, head_list->buffer[0].address, skb->len, PCI_DMA_TODEVICE);
1441 dev_kfree_skb_any(skb);
1442 head_list->buffer[8].address = 0;
1443 head_list->buffer[9].address = 0;
1444 }
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001445
Linus Torvalds1da177e2005-04-16 15:20:36 -07001446 if ( tmpCStat & TLAN_CSTAT_EOC )
1447 eoc = 1;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001448
Linus Torvalds1da177e2005-04-16 15:20:36 -07001449 priv->stats.tx_bytes += head_list->frameSize;
1450
1451 head_list->cStat = TLAN_CSTAT_UNUSED;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001452 netif_start_queue(dev);
1453 CIRC_INC( priv->txHead, TLAN_NUM_TX_LISTS );
Linus Torvalds1da177e2005-04-16 15:20:36 -07001454 head_list = priv->txList + priv->txHead;
1455 }
1456
1457 if (!ack)
1458 printk(KERN_INFO "TLAN: Received interrupt for uncompleted TX frame.\n");
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001459
Linus Torvalds1da177e2005-04-16 15:20:36 -07001460 if ( eoc ) {
1461 TLAN_DBG( TLAN_DEBUG_TX, "TRANSMIT: Handling TX EOC (Head=%d Tail=%d)\n", priv->txHead, priv->txTail );
1462 head_list = priv->txList + priv->txHead;
1463 head_list_phys = priv->txListDMA + sizeof(TLanList) * priv->txHead;
1464 if ( ( head_list->cStat & TLAN_CSTAT_READY ) == TLAN_CSTAT_READY ) {
1465 outl(head_list_phys, dev->base_addr + TLAN_CH_PARM );
1466 ack |= TLAN_HC_GO;
1467 } else {
1468 priv->txInProgress = 0;
1469 }
1470 }
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001471
Linus Torvalds1da177e2005-04-16 15:20:36 -07001472 if ( priv->adapter->flags & TLAN_ADAPTER_ACTIVITY_LED ) {
1473 TLan_DioWrite8( dev->base_addr, TLAN_LED_REG, TLAN_LED_LINK | TLAN_LED_ACT );
1474 if ( priv->timer.function == NULL ) {
1475 priv->timer.function = &TLan_Timer;
1476 priv->timer.data = (unsigned long) dev;
1477 priv->timer.expires = jiffies + TLAN_TIMER_ACT_DELAY;
1478 priv->timerSetAt = jiffies;
1479 priv->timerType = TLAN_TIMER_ACTIVITY;
1480 add_timer(&priv->timer);
1481 } else if ( priv->timerType == TLAN_TIMER_ACTIVITY ) {
1482 priv->timerSetAt = jiffies;
1483 }
1484 }
1485
1486 return ack;
1487
1488} /* TLan_HandleTxEOF */
1489
1490
1491
1492
1493 /***************************************************************
1494 * TLan_HandleStatOverflow
1495 *
1496 * Returns:
1497 * 1
1498 * Parms:
1499 * dev Device assigned the IRQ that was
1500 * raised.
1501 * host_int The contents of the HOST_INT
1502 * port.
1503 *
1504 * This function handles the Statistics Overflow interrupt
1505 * which means that one or more of the TLAN statistics
1506 * registers has reached 1/2 capacity and needs to be read.
1507 *
1508 **************************************************************/
1509
1510u32 TLan_HandleStatOverflow( struct net_device *dev, u16 host_int )
1511{
1512 TLan_ReadAndClearStats( dev, TLAN_RECORD );
1513
1514 return 1;
1515
1516} /* TLan_HandleStatOverflow */
1517
1518
1519
1520
1521 /***************************************************************
1522 * TLan_HandleRxEOF
1523 *
1524 * Returns:
1525 * 1
1526 * Parms:
1527 * dev Device assigned the IRQ that was
1528 * raised.
1529 * host_int The contents of the HOST_INT
1530 * port.
1531 *
1532 * This function handles the Rx EOF interrupt which
1533 * indicates a frame has been received by the adapter from
1534 * the net and the frame has been transferred to memory.
1535 * The function determines the bounce buffer the frame has
1536 * been loaded into, creates a new sk_buff big enough to
1537 * hold the frame, and sends it to protocol stack. It
1538 * then resets the used buffer and appends it to the end
1539 * of the list. If the frame was the last in the Rx
1540 * channel (EOC), the function restarts the receive channel
1541 * by sending an Rx Go command to the adapter. Then it
1542 * activates/continues the activity LED.
1543 *
1544 **************************************************************/
1545
1546u32 TLan_HandleRxEOF( struct net_device *dev, u16 host_int )
1547{
1548 TLanPrivateInfo *priv = netdev_priv(dev);
1549 u32 ack = 0;
1550 int eoc = 0;
1551 u8 *head_buffer;
1552 TLanList *head_list;
1553 struct sk_buff *skb;
1554 TLanList *tail_list;
1555 void *t;
1556 u32 frameSize;
1557 u16 tmpCStat;
1558 dma_addr_t head_list_phys;
1559
1560 TLAN_DBG( TLAN_DEBUG_RX, "RECEIVE: Handling RX EOF (Head=%d Tail=%d)\n", priv->rxHead, priv->rxTail );
1561 head_list = priv->rxList + priv->rxHead;
1562 head_list_phys = priv->rxListDMA + sizeof(TLanList) * priv->rxHead;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001563
Linus Torvalds1da177e2005-04-16 15:20:36 -07001564 while (((tmpCStat = head_list->cStat) & TLAN_CSTAT_FRM_CMP) && (ack < 255)) {
1565 frameSize = head_list->frameSize;
1566 ack++;
1567 if (tmpCStat & TLAN_CSTAT_EOC)
1568 eoc = 1;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001569
Linus Torvalds1da177e2005-04-16 15:20:36 -07001570 if (bbuf) {
1571 skb = dev_alloc_skb(frameSize + 7);
1572 if (skb == NULL)
1573 printk(KERN_INFO "TLAN: Couldn't allocate memory for received data.\n");
1574 else {
1575 head_buffer = priv->rxBuffer + (priv->rxHead * TLAN_MAX_FRAME_SIZE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001576 skb_reserve(skb, 2);
1577 t = (void *) skb_put(skb, frameSize);
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001578
Linus Torvalds1da177e2005-04-16 15:20:36 -07001579 priv->stats.rx_bytes += head_list->frameSize;
1580
1581 memcpy( t, head_buffer, frameSize );
1582 skb->protocol = eth_type_trans( skb, dev );
1583 netif_rx( skb );
1584 }
1585 } else {
1586 struct sk_buff *new_skb;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001587
Linus Torvalds1da177e2005-04-16 15:20:36 -07001588 /*
1589 * I changed the algorithm here. What we now do
1590 * is allocate the new frame. If this fails we
1591 * simply recycle the frame.
1592 */
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001593
Linus Torvalds1da177e2005-04-16 15:20:36 -07001594 new_skb = dev_alloc_skb( TLAN_MAX_FRAME_SIZE + 7 );
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001595
Linus Torvalds1da177e2005-04-16 15:20:36 -07001596 if ( new_skb != NULL ) {
1597 skb = TLan_GetSKB(head_list);
1598 pci_unmap_single(priv->pciDev, head_list->buffer[0].address, TLAN_MAX_FRAME_SIZE, PCI_DMA_FROMDEVICE);
1599 skb_trim( skb, frameSize );
1600
1601 priv->stats.rx_bytes += frameSize;
1602
1603 skb->protocol = eth_type_trans( skb, dev );
1604 netif_rx( skb );
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001605
Linus Torvalds1da177e2005-04-16 15:20:36 -07001606 skb_reserve( new_skb, 2 );
1607 t = (void *) skb_put( new_skb, TLAN_MAX_FRAME_SIZE );
1608 head_list->buffer[0].address = pci_map_single(priv->pciDev, new_skb->data, TLAN_MAX_FRAME_SIZE, PCI_DMA_FROMDEVICE);
1609 head_list->buffer[8].address = (u32) t;
1610 TLan_StoreSKB(head_list, new_skb);
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001611 } else
Linus Torvalds1da177e2005-04-16 15:20:36 -07001612 printk(KERN_WARNING "TLAN: Couldn't allocate memory for received data.\n" );
1613 }
1614
1615 head_list->forward = 0;
1616 head_list->cStat = 0;
1617 tail_list = priv->rxList + priv->rxTail;
1618 tail_list->forward = head_list_phys;
1619
1620 CIRC_INC( priv->rxHead, TLAN_NUM_RX_LISTS );
1621 CIRC_INC( priv->rxTail, TLAN_NUM_RX_LISTS );
1622 head_list = priv->rxList + priv->rxHead;
1623 head_list_phys = priv->rxListDMA + sizeof(TLanList) * priv->rxHead;
1624 }
1625
1626 if (!ack)
1627 printk(KERN_INFO "TLAN: Received interrupt for uncompleted RX frame.\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001628
1629
1630
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001631
1632 if ( eoc ) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001633 TLAN_DBG( TLAN_DEBUG_RX, "RECEIVE: Handling RX EOC (Head=%d Tail=%d)\n", priv->rxHead, priv->rxTail );
1634 head_list = priv->rxList + priv->rxHead;
1635 head_list_phys = priv->rxListDMA + sizeof(TLanList) * priv->rxHead;
1636 outl(head_list_phys, dev->base_addr + TLAN_CH_PARM );
1637 ack |= TLAN_HC_GO | TLAN_HC_RT;
1638 priv->rxEocCount++;
1639 }
1640
1641 if ( priv->adapter->flags & TLAN_ADAPTER_ACTIVITY_LED ) {
1642 TLan_DioWrite8( dev->base_addr, TLAN_LED_REG, TLAN_LED_LINK | TLAN_LED_ACT );
1643 if ( priv->timer.function == NULL ) {
1644 priv->timer.function = &TLan_Timer;
1645 priv->timer.data = (unsigned long) dev;
1646 priv->timer.expires = jiffies + TLAN_TIMER_ACT_DELAY;
1647 priv->timerSetAt = jiffies;
1648 priv->timerType = TLAN_TIMER_ACTIVITY;
1649 add_timer(&priv->timer);
1650 } else if ( priv->timerType == TLAN_TIMER_ACTIVITY ) {
1651 priv->timerSetAt = jiffies;
1652 }
1653 }
1654
1655 dev->last_rx = jiffies;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001656
Linus Torvalds1da177e2005-04-16 15:20:36 -07001657 return ack;
1658
1659} /* TLan_HandleRxEOF */
1660
1661
1662
1663
1664 /***************************************************************
1665 * TLan_HandleDummy
1666 *
1667 * Returns:
1668 * 1
1669 * Parms:
1670 * dev Device assigned the IRQ that was
1671 * raised.
1672 * host_int The contents of the HOST_INT
1673 * port.
1674 *
1675 * This function handles the Dummy interrupt, which is
1676 * raised whenever a test interrupt is generated by setting
1677 * the Req_Int bit of HOST_CMD to 1.
1678 *
1679 **************************************************************/
1680
1681u32 TLan_HandleDummy( struct net_device *dev, u16 host_int )
1682{
1683 printk( "TLAN: Test interrupt on %s.\n", dev->name );
1684 return 1;
1685
1686} /* TLan_HandleDummy */
1687
1688
1689
1690
1691 /***************************************************************
1692 * TLan_HandleTxEOC
1693 *
1694 * Returns:
1695 * 1
1696 * Parms:
1697 * dev Device assigned the IRQ that was
1698 * raised.
1699 * host_int The contents of the HOST_INT
1700 * port.
1701 *
1702 * This driver is structured to determine EOC occurrences by
1703 * reading the CSTAT member of the list structure. Tx EOC
1704 * interrupts are disabled via the DIO INTDIS register.
1705 * However, TLAN chips before revision 3.0 didn't have this
1706 * functionality, so process EOC events if this is the
1707 * case.
1708 *
1709 **************************************************************/
1710
1711u32 TLan_HandleTxEOC( struct net_device *dev, u16 host_int )
1712{
1713 TLanPrivateInfo *priv = netdev_priv(dev);
1714 TLanList *head_list;
1715 dma_addr_t head_list_phys;
1716 u32 ack = 1;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001717
Linus Torvalds1da177e2005-04-16 15:20:36 -07001718 host_int = 0;
1719 if ( priv->tlanRev < 0x30 ) {
1720 TLAN_DBG( TLAN_DEBUG_TX, "TRANSMIT: Handling TX EOC (Head=%d Tail=%d) -- IRQ\n", priv->txHead, priv->txTail );
1721 head_list = priv->txList + priv->txHead;
1722 head_list_phys = priv->txListDMA + sizeof(TLanList) * priv->txHead;
1723 if ( ( head_list->cStat & TLAN_CSTAT_READY ) == TLAN_CSTAT_READY ) {
1724 netif_stop_queue(dev);
1725 outl( head_list_phys, dev->base_addr + TLAN_CH_PARM );
1726 ack |= TLAN_HC_GO;
1727 } else {
1728 priv->txInProgress = 0;
1729 }
1730 }
1731
1732 return ack;
1733
1734} /* TLan_HandleTxEOC */
1735
1736
1737
1738
1739 /***************************************************************
1740 * TLan_HandleStatusCheck
1741 *
1742 * Returns:
1743 * 0 if Adapter check, 1 if Network Status check.
1744 * Parms:
1745 * dev Device assigned the IRQ that was
1746 * raised.
1747 * host_int The contents of the HOST_INT
1748 * port.
1749 *
1750 * This function handles Adapter Check/Network Status
1751 * interrupts generated by the adapter. It checks the
1752 * vector in the HOST_INT register to determine if it is
1753 * an Adapter Check interrupt. If so, it resets the
1754 * adapter. Otherwise it clears the status registers
1755 * and services the PHY.
1756 *
1757 **************************************************************/
1758
1759u32 TLan_HandleStatusCheck( struct net_device *dev, u16 host_int )
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001760{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001761 TLanPrivateInfo *priv = netdev_priv(dev);
1762 u32 ack;
1763 u32 error;
1764 u8 net_sts;
1765 u32 phy;
1766 u16 tlphy_ctl;
1767 u16 tlphy_sts;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001768
Linus Torvalds1da177e2005-04-16 15:20:36 -07001769 ack = 1;
1770 if ( host_int & TLAN_HI_IV_MASK ) {
1771 netif_stop_queue( dev );
1772 error = inl( dev->base_addr + TLAN_CH_PARM );
1773 printk( "TLAN: %s: Adaptor Error = 0x%x\n", dev->name, error );
1774 TLan_ReadAndClearStats( dev, TLAN_RECORD );
1775 outl( TLAN_HC_AD_RST, dev->base_addr + TLAN_HOST_CMD );
1776
1777 schedule_work(&priv->tlan_tqueue);
1778
1779 netif_wake_queue(dev);
1780 ack = 0;
1781 } else {
1782 TLAN_DBG( TLAN_DEBUG_GNRL, "%s: Status Check\n", dev->name );
1783 phy = priv->phy[priv->phyNum];
1784
1785 net_sts = TLan_DioRead8( dev->base_addr, TLAN_NET_STS );
1786 if ( net_sts ) {
1787 TLan_DioWrite8( dev->base_addr, TLAN_NET_STS, net_sts );
1788 TLAN_DBG( TLAN_DEBUG_GNRL, "%s: Net_Sts = %x\n", dev->name, (unsigned) net_sts );
1789 }
1790 if ( ( net_sts & TLAN_NET_STS_MIRQ ) && ( priv->phyNum == 0 ) ) {
1791 TLan_MiiReadReg( dev, phy, TLAN_TLPHY_STS, &tlphy_sts );
1792 TLan_MiiReadReg( dev, phy, TLAN_TLPHY_CTL, &tlphy_ctl );
1793 if ( ! ( tlphy_sts & TLAN_TS_POLOK ) && ! ( tlphy_ctl & TLAN_TC_SWAPOL ) ) {
1794 tlphy_ctl |= TLAN_TC_SWAPOL;
1795 TLan_MiiWriteReg( dev, phy, TLAN_TLPHY_CTL, tlphy_ctl);
1796 } else if ( ( tlphy_sts & TLAN_TS_POLOK ) && ( tlphy_ctl & TLAN_TC_SWAPOL ) ) {
1797 tlphy_ctl &= ~TLAN_TC_SWAPOL;
1798 TLan_MiiWriteReg( dev, phy, TLAN_TLPHY_CTL, tlphy_ctl);
1799 }
1800
1801 if (debug) {
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001802 TLan_PhyPrint( dev );
Linus Torvalds1da177e2005-04-16 15:20:36 -07001803 }
1804 }
1805 }
1806
1807 return ack;
1808
1809} /* TLan_HandleStatusCheck */
1810
1811
1812
1813
1814 /***************************************************************
1815 * TLan_HandleRxEOC
1816 *
1817 * Returns:
1818 * 1
1819 * Parms:
1820 * dev Device assigned the IRQ that was
1821 * raised.
1822 * host_int The contents of the HOST_INT
1823 * port.
1824 *
1825 * This driver is structured to determine EOC occurrences by
1826 * reading the CSTAT member of the list structure. Rx EOC
1827 * interrupts are disabled via the DIO INTDIS register.
1828 * However, TLAN chips before revision 3.0 didn't have this
1829 * CSTAT member or a INTDIS register, so if this chip is
1830 * pre-3.0, process EOC interrupts normally.
1831 *
1832 **************************************************************/
1833
1834u32 TLan_HandleRxEOC( struct net_device *dev, u16 host_int )
1835{
1836 TLanPrivateInfo *priv = netdev_priv(dev);
1837 dma_addr_t head_list_phys;
1838 u32 ack = 1;
1839
1840 if ( priv->tlanRev < 0x30 ) {
1841 TLAN_DBG( TLAN_DEBUG_RX, "RECEIVE: Handling RX EOC (Head=%d Tail=%d) -- IRQ\n", priv->rxHead, priv->rxTail );
1842 head_list_phys = priv->rxListDMA + sizeof(TLanList) * priv->rxHead;
1843 outl( head_list_phys, dev->base_addr + TLAN_CH_PARM );
1844 ack |= TLAN_HC_GO | TLAN_HC_RT;
1845 priv->rxEocCount++;
1846 }
1847
1848 return ack;
1849
1850} /* TLan_HandleRxEOC */
1851
1852
1853
1854
1855/*****************************************************************************
1856******************************************************************************
1857
1858 ThunderLAN Driver Timer Function
1859
1860******************************************************************************
1861*****************************************************************************/
1862
1863
1864 /***************************************************************
1865 * TLan_Timer
1866 *
1867 * Returns:
1868 * Nothing
1869 * Parms:
1870 * data A value given to add timer when
1871 * add_timer was called.
1872 *
1873 * This function handles timed functionality for the
1874 * TLAN driver. The two current timer uses are for
1875 * delaying for autonegotionation and driving the ACT LED.
1876 * - Autonegotiation requires being allowed about
1877 * 2 1/2 seconds before attempting to transmit a
1878 * packet. It would be a very bad thing to hang
1879 * the kernel this long, so the driver doesn't
1880 * allow transmission 'til after this time, for
1881 * certain PHYs. It would be much nicer if all
1882 * PHYs were interrupt-capable like the internal
1883 * PHY.
1884 * - The ACT LED, which shows adapter activity, is
1885 * driven by the driver, and so must be left on
1886 * for a short period to power up the LED so it
1887 * can be seen. This delay can be changed by
1888 * changing the TLAN_TIMER_ACT_DELAY in tlan.h,
1889 * if desired. 100 ms produces a slightly
1890 * sluggish response.
1891 *
1892 **************************************************************/
1893
1894void TLan_Timer( unsigned long data )
1895{
1896 struct net_device *dev = (struct net_device *) data;
1897 TLanPrivateInfo *priv = netdev_priv(dev);
1898 u32 elapsed;
1899 unsigned long flags = 0;
1900
1901 priv->timer.function = NULL;
1902
1903 switch ( priv->timerType ) {
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001904#ifdef MONITOR
Linus Torvalds1da177e2005-04-16 15:20:36 -07001905 case TLAN_TIMER_LINK_BEAT:
1906 TLan_PhyMonitor( dev );
1907 break;
1908#endif
1909 case TLAN_TIMER_PHY_PDOWN:
1910 TLan_PhyPowerDown( dev );
1911 break;
1912 case TLAN_TIMER_PHY_PUP:
1913 TLan_PhyPowerUp( dev );
1914 break;
1915 case TLAN_TIMER_PHY_RESET:
1916 TLan_PhyReset( dev );
1917 break;
1918 case TLAN_TIMER_PHY_START_LINK:
1919 TLan_PhyStartLink( dev );
1920 break;
1921 case TLAN_TIMER_PHY_FINISH_AN:
1922 TLan_PhyFinishAutoNeg( dev );
1923 break;
1924 case TLAN_TIMER_FINISH_RESET:
1925 TLan_FinishReset( dev );
1926 break;
1927 case TLAN_TIMER_ACTIVITY:
1928 spin_lock_irqsave(&priv->lock, flags);
1929 if ( priv->timer.function == NULL ) {
1930 elapsed = jiffies - priv->timerSetAt;
1931 if ( elapsed >= TLAN_TIMER_ACT_DELAY ) {
1932 TLan_DioWrite8( dev->base_addr, TLAN_LED_REG, TLAN_LED_LINK );
1933 } else {
1934 priv->timer.function = &TLan_Timer;
1935 priv->timer.expires = priv->timerSetAt + TLAN_TIMER_ACT_DELAY;
1936 spin_unlock_irqrestore(&priv->lock, flags);
1937 add_timer( &priv->timer );
1938 break;
1939 }
1940 }
1941 spin_unlock_irqrestore(&priv->lock, flags);
1942 break;
1943 default:
1944 break;
1945 }
1946
1947} /* TLan_Timer */
1948
1949
1950
1951
1952/*****************************************************************************
1953******************************************************************************
1954
1955 ThunderLAN Driver Adapter Related Routines
1956
1957******************************************************************************
1958*****************************************************************************/
1959
1960
1961 /***************************************************************
1962 * TLan_ResetLists
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001963 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07001964 * Returns:
1965 * Nothing
1966 * Parms:
1967 * dev The device structure with the list
1968 * stuctures to be reset.
1969 *
1970 * This routine sets the variables associated with managing
1971 * the TLAN lists to their initial values.
1972 *
1973 **************************************************************/
1974
1975void TLan_ResetLists( struct net_device *dev )
1976{
1977 TLanPrivateInfo *priv = netdev_priv(dev);
1978 int i;
1979 TLanList *list;
1980 dma_addr_t list_phys;
1981 struct sk_buff *skb;
1982 void *t = NULL;
1983
1984 priv->txHead = 0;
1985 priv->txTail = 0;
1986 for ( i = 0; i < TLAN_NUM_TX_LISTS; i++ ) {
1987 list = priv->txList + i;
1988 list->cStat = TLAN_CSTAT_UNUSED;
1989 if ( bbuf ) {
1990 list->buffer[0].address = priv->txBufferDMA + ( i * TLAN_MAX_FRAME_SIZE );
1991 } else {
1992 list->buffer[0].address = 0;
1993 }
1994 list->buffer[2].count = 0;
1995 list->buffer[2].address = 0;
1996 list->buffer[8].address = 0;
1997 list->buffer[9].address = 0;
1998 }
1999
2000 priv->rxHead = 0;
2001 priv->rxTail = TLAN_NUM_RX_LISTS - 1;
2002 for ( i = 0; i < TLAN_NUM_RX_LISTS; i++ ) {
2003 list = priv->rxList + i;
2004 list_phys = priv->rxListDMA + sizeof(TLanList) * i;
2005 list->cStat = TLAN_CSTAT_READY;
2006 list->frameSize = TLAN_MAX_FRAME_SIZE;
2007 list->buffer[0].count = TLAN_MAX_FRAME_SIZE | TLAN_LAST_BUFFER;
2008 if ( bbuf ) {
2009 list->buffer[0].address = priv->rxBufferDMA + ( i * TLAN_MAX_FRAME_SIZE );
2010 } else {
2011 skb = dev_alloc_skb( TLAN_MAX_FRAME_SIZE + 7 );
2012 if ( skb == NULL ) {
2013 printk( "TLAN: Couldn't allocate memory for received data.\n" );
2014 /* If this ever happened it would be a problem */
2015 } else {
2016 skb->dev = dev;
2017 skb_reserve( skb, 2 );
2018 t = (void *) skb_put( skb, TLAN_MAX_FRAME_SIZE );
2019 }
2020 list->buffer[0].address = pci_map_single(priv->pciDev, t, TLAN_MAX_FRAME_SIZE, PCI_DMA_FROMDEVICE);
2021 list->buffer[8].address = (u32) t;
2022 TLan_StoreSKB(list, skb);
2023 }
2024 list->buffer[1].count = 0;
2025 list->buffer[1].address = 0;
2026 if ( i < TLAN_NUM_RX_LISTS - 1 )
2027 list->forward = list_phys + sizeof(TLanList);
2028 else
2029 list->forward = 0;
2030 }
2031
2032} /* TLan_ResetLists */
2033
2034
2035void TLan_FreeLists( struct net_device *dev )
2036{
2037 TLanPrivateInfo *priv = netdev_priv(dev);
2038 int i;
2039 TLanList *list;
2040 struct sk_buff *skb;
2041
2042 if ( ! bbuf ) {
2043 for ( i = 0; i < TLAN_NUM_TX_LISTS; i++ ) {
2044 list = priv->txList + i;
2045 skb = TLan_GetSKB(list);
2046 if ( skb ) {
2047 pci_unmap_single(priv->pciDev, list->buffer[0].address, skb->len, PCI_DMA_TODEVICE);
2048 dev_kfree_skb_any( skb );
2049 list->buffer[8].address = 0;
2050 list->buffer[9].address = 0;
2051 }
2052 }
2053
2054 for ( i = 0; i < TLAN_NUM_RX_LISTS; i++ ) {
2055 list = priv->rxList + i;
2056 skb = TLan_GetSKB(list);
2057 if ( skb ) {
2058 pci_unmap_single(priv->pciDev, list->buffer[0].address, TLAN_MAX_FRAME_SIZE, PCI_DMA_FROMDEVICE);
2059 dev_kfree_skb_any( skb );
2060 list->buffer[8].address = 0;
2061 list->buffer[9].address = 0;
2062 }
2063 }
2064 }
2065} /* TLan_FreeLists */
2066
2067
2068
2069
2070 /***************************************************************
2071 * TLan_PrintDio
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002072 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07002073 * Returns:
2074 * Nothing
2075 * Parms:
2076 * io_base Base IO port of the device of
2077 * which to print DIO registers.
2078 *
2079 * This function prints out all the internal (DIO)
2080 * registers of a TLAN chip.
2081 *
2082 **************************************************************/
2083
2084void TLan_PrintDio( u16 io_base )
2085{
2086 u32 data0, data1;
2087 int i;
2088
2089 printk( "TLAN: Contents of internal registers for io base 0x%04hx.\n", io_base );
2090 printk( "TLAN: Off. +0 +4\n" );
2091 for ( i = 0; i < 0x4C; i+= 8 ) {
2092 data0 = TLan_DioRead32( io_base, i );
2093 data1 = TLan_DioRead32( io_base, i + 0x4 );
2094 printk( "TLAN: 0x%02x 0x%08x 0x%08x\n", i, data0, data1 );
2095 }
2096
2097} /* TLan_PrintDio */
2098
2099
2100
2101
2102 /***************************************************************
2103 * TLan_PrintList
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002104 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07002105 * Returns:
2106 * Nothing
2107 * Parms:
2108 * list A pointer to the TLanList structure to
2109 * be printed.
2110 * type A string to designate type of list,
2111 * "Rx" or "Tx".
2112 * num The index of the list.
2113 *
2114 * This function prints out the contents of the list
2115 * pointed to by the list parameter.
2116 *
2117 **************************************************************/
2118
2119void TLan_PrintList( TLanList *list, char *type, int num)
2120{
2121 int i;
2122
2123 printk( "TLAN: %s List %d at 0x%08x\n", type, num, (u32) list );
2124 printk( "TLAN: Forward = 0x%08x\n", list->forward );
2125 printk( "TLAN: CSTAT = 0x%04hx\n", list->cStat );
2126 printk( "TLAN: Frame Size = 0x%04hx\n", list->frameSize );
2127 /* for ( i = 0; i < 10; i++ ) { */
2128 for ( i = 0; i < 2; i++ ) {
2129 printk( "TLAN: Buffer[%d].count, addr = 0x%08x, 0x%08x\n", i, list->buffer[i].count, list->buffer[i].address );
2130 }
2131
2132} /* TLan_PrintList */
2133
2134
2135
2136
2137 /***************************************************************
2138 * TLan_ReadAndClearStats
2139 *
2140 * Returns:
2141 * Nothing
2142 * Parms:
2143 * dev Pointer to device structure of adapter
2144 * to which to read stats.
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002145 * record Flag indicating whether to add
Linus Torvalds1da177e2005-04-16 15:20:36 -07002146 *
2147 * This functions reads all the internal status registers
2148 * of the TLAN chip, which clears them as a side effect.
2149 * It then either adds the values to the device's status
2150 * struct, or discards them, depending on whether record
2151 * is TLAN_RECORD (!=0) or TLAN_IGNORE (==0).
2152 *
2153 **************************************************************/
2154
2155void TLan_ReadAndClearStats( struct net_device *dev, int record )
2156{
2157 TLanPrivateInfo *priv = netdev_priv(dev);
2158 u32 tx_good, tx_under;
2159 u32 rx_good, rx_over;
2160 u32 def_tx, crc, code;
2161 u32 multi_col, single_col;
2162 u32 excess_col, late_col, loss;
2163
2164 outw( TLAN_GOOD_TX_FRMS, dev->base_addr + TLAN_DIO_ADR );
2165 tx_good = inb( dev->base_addr + TLAN_DIO_DATA );
2166 tx_good += inb( dev->base_addr + TLAN_DIO_DATA + 1 ) << 8;
2167 tx_good += inb( dev->base_addr + TLAN_DIO_DATA + 2 ) << 16;
2168 tx_under = inb( dev->base_addr + TLAN_DIO_DATA + 3 );
2169
2170 outw( TLAN_GOOD_RX_FRMS, dev->base_addr + TLAN_DIO_ADR );
2171 rx_good = inb( dev->base_addr + TLAN_DIO_DATA );
2172 rx_good += inb( dev->base_addr + TLAN_DIO_DATA + 1 ) << 8;
2173 rx_good += inb( dev->base_addr + TLAN_DIO_DATA + 2 ) << 16;
2174 rx_over = inb( dev->base_addr + TLAN_DIO_DATA + 3 );
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002175
Linus Torvalds1da177e2005-04-16 15:20:36 -07002176 outw( TLAN_DEFERRED_TX, dev->base_addr + TLAN_DIO_ADR );
2177 def_tx = inb( dev->base_addr + TLAN_DIO_DATA );
2178 def_tx += inb( dev->base_addr + TLAN_DIO_DATA + 1 ) << 8;
2179 crc = inb( dev->base_addr + TLAN_DIO_DATA + 2 );
2180 code = inb( dev->base_addr + TLAN_DIO_DATA + 3 );
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002181
Linus Torvalds1da177e2005-04-16 15:20:36 -07002182 outw( TLAN_MULTICOL_FRMS, dev->base_addr + TLAN_DIO_ADR );
2183 multi_col = inb( dev->base_addr + TLAN_DIO_DATA );
2184 multi_col += inb( dev->base_addr + TLAN_DIO_DATA + 1 ) << 8;
2185 single_col = inb( dev->base_addr + TLAN_DIO_DATA + 2 );
2186 single_col += inb( dev->base_addr + TLAN_DIO_DATA + 3 ) << 8;
2187
2188 outw( TLAN_EXCESSCOL_FRMS, dev->base_addr + TLAN_DIO_ADR );
2189 excess_col = inb( dev->base_addr + TLAN_DIO_DATA );
2190 late_col = inb( dev->base_addr + TLAN_DIO_DATA + 1 );
2191 loss = inb( dev->base_addr + TLAN_DIO_DATA + 2 );
2192
2193 if ( record ) {
2194 priv->stats.rx_packets += rx_good;
2195 priv->stats.rx_errors += rx_over + crc + code;
2196 priv->stats.tx_packets += tx_good;
2197 priv->stats.tx_errors += tx_under + loss;
2198 priv->stats.collisions += multi_col + single_col + excess_col + late_col;
2199
2200 priv->stats.rx_over_errors += rx_over;
2201 priv->stats.rx_crc_errors += crc;
2202 priv->stats.rx_frame_errors += code;
2203
2204 priv->stats.tx_aborted_errors += tx_under;
2205 priv->stats.tx_carrier_errors += loss;
2206 }
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002207
Linus Torvalds1da177e2005-04-16 15:20:36 -07002208} /* TLan_ReadAndClearStats */
2209
2210
2211
2212
2213 /***************************************************************
2214 * TLan_Reset
2215 *
2216 * Returns:
2217 * 0
2218 * Parms:
2219 * dev Pointer to device structure of adapter
2220 * to be reset.
2221 *
2222 * This function resets the adapter and it's physical
2223 * device. See Chap. 3, pp. 9-10 of the "ThunderLAN
2224 * Programmer's Guide" for details. The routine tries to
2225 * implement what is detailed there, though adjustments
2226 * have been made.
2227 *
2228 **************************************************************/
2229
2230void
2231TLan_ResetAdapter( struct net_device *dev )
2232{
2233 TLanPrivateInfo *priv = netdev_priv(dev);
2234 int i;
2235 u32 addr;
2236 u32 data;
2237 u8 data8;
2238
2239 priv->tlanFullDuplex = FALSE;
2240 priv->phyOnline=0;
2241 netif_carrier_off(dev);
2242
2243/* 1. Assert reset bit. */
2244
2245 data = inl(dev->base_addr + TLAN_HOST_CMD);
2246 data |= TLAN_HC_AD_RST;
2247 outl(data, dev->base_addr + TLAN_HOST_CMD);
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002248
Linus Torvalds1da177e2005-04-16 15:20:36 -07002249 udelay(1000);
2250
2251/* 2. Turn off interrupts. ( Probably isn't necessary ) */
2252
2253 data = inl(dev->base_addr + TLAN_HOST_CMD);
2254 data |= TLAN_HC_INT_OFF;
2255 outl(data, dev->base_addr + TLAN_HOST_CMD);
2256
2257/* 3. Clear AREGs and HASHs. */
2258
2259 for ( i = TLAN_AREG_0; i <= TLAN_HASH_2; i += 4 ) {
2260 TLan_DioWrite32( dev->base_addr, (u16) i, 0 );
2261 }
2262
2263/* 4. Setup NetConfig register. */
2264
2265 data = TLAN_NET_CFG_1FRAG | TLAN_NET_CFG_1CHAN | TLAN_NET_CFG_PHY_EN;
2266 TLan_DioWrite16( dev->base_addr, TLAN_NET_CONFIG, (u16) data );
2267
2268/* 5. Load Ld_Tmr and Ld_Thr in HOST_CMD. */
2269
2270 outl( TLAN_HC_LD_TMR | 0x3f, dev->base_addr + TLAN_HOST_CMD );
2271 outl( TLAN_HC_LD_THR | 0x9, dev->base_addr + TLAN_HOST_CMD );
2272
2273/* 6. Unreset the MII by setting NMRST (in NetSio) to 1. */
2274
2275 outw( TLAN_NET_SIO, dev->base_addr + TLAN_DIO_ADR );
2276 addr = dev->base_addr + TLAN_DIO_DATA + TLAN_NET_SIO;
2277 TLan_SetBit( TLAN_NET_SIO_NMRST, addr );
2278
2279/* 7. Setup the remaining registers. */
2280
2281 if ( priv->tlanRev >= 0x30 ) {
2282 data8 = TLAN_ID_TX_EOC | TLAN_ID_RX_EOC;
2283 TLan_DioWrite8( dev->base_addr, TLAN_INT_DIS, data8 );
2284 }
2285 TLan_PhyDetect( dev );
2286 data = TLAN_NET_CFG_1FRAG | TLAN_NET_CFG_1CHAN;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002287
Linus Torvalds1da177e2005-04-16 15:20:36 -07002288 if ( priv->adapter->flags & TLAN_ADAPTER_BIT_RATE_PHY ) {
2289 data |= TLAN_NET_CFG_BIT;
2290 if ( priv->aui == 1 ) {
2291 TLan_DioWrite8( dev->base_addr, TLAN_ACOMMIT, 0x0a );
2292 } else if ( priv->duplex == TLAN_DUPLEX_FULL ) {
2293 TLan_DioWrite8( dev->base_addr, TLAN_ACOMMIT, 0x00 );
2294 priv->tlanFullDuplex = TRUE;
2295 } else {
2296 TLan_DioWrite8( dev->base_addr, TLAN_ACOMMIT, 0x08 );
2297 }
2298 }
2299
2300 if ( priv->phyNum == 0 ) {
2301 data |= TLAN_NET_CFG_PHY_EN;
2302 }
2303 TLan_DioWrite16( dev->base_addr, TLAN_NET_CONFIG, (u16) data );
2304
2305 if ( priv->adapter->flags & TLAN_ADAPTER_UNMANAGED_PHY ) {
2306 TLan_FinishReset( dev );
2307 } else {
2308 TLan_PhyPowerDown( dev );
2309 }
2310
2311} /* TLan_ResetAdapter */
2312
2313
2314
2315
2316void
2317TLan_FinishReset( struct net_device *dev )
2318{
2319 TLanPrivateInfo *priv = netdev_priv(dev);
2320 u8 data;
2321 u32 phy;
2322 u8 sio;
2323 u16 status;
2324 u16 partner;
2325 u16 tlphy_ctl;
2326 u16 tlphy_par;
2327 u16 tlphy_id1, tlphy_id2;
2328 int i;
2329
2330 phy = priv->phy[priv->phyNum];
2331
2332 data = TLAN_NET_CMD_NRESET | TLAN_NET_CMD_NWRAP;
2333 if ( priv->tlanFullDuplex ) {
2334 data |= TLAN_NET_CMD_DUPLEX;
2335 }
2336 TLan_DioWrite8( dev->base_addr, TLAN_NET_CMD, data );
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002337 data = TLAN_NET_MASK_MASK4 | TLAN_NET_MASK_MASK5;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002338 if ( priv->phyNum == 0 ) {
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002339 data |= TLAN_NET_MASK_MASK7;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002340 }
2341 TLan_DioWrite8( dev->base_addr, TLAN_NET_MASK, data );
2342 TLan_DioWrite16( dev->base_addr, TLAN_MAX_RX, ((1536)+7)&~7 );
2343 TLan_MiiReadReg( dev, phy, MII_GEN_ID_HI, &tlphy_id1 );
2344 TLan_MiiReadReg( dev, phy, MII_GEN_ID_LO, &tlphy_id2 );
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002345
Linus Torvalds1da177e2005-04-16 15:20:36 -07002346 if ( ( priv->adapter->flags & TLAN_ADAPTER_UNMANAGED_PHY ) || ( priv->aui ) ) {
2347 status = MII_GS_LINK;
2348 printk( "TLAN: %s: Link forced.\n", dev->name );
2349 } else {
2350 TLan_MiiReadReg( dev, phy, MII_GEN_STS, &status );
2351 udelay( 1000 );
2352 TLan_MiiReadReg( dev, phy, MII_GEN_STS, &status );
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002353 if ( (status & MII_GS_LINK) && /* We only support link info on Nat.Sem. PHY's */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002354 (tlphy_id1 == NAT_SEM_ID1) &&
2355 (tlphy_id2 == NAT_SEM_ID2) ) {
2356 TLan_MiiReadReg( dev, phy, MII_AN_LPA, &partner );
2357 TLan_MiiReadReg( dev, phy, TLAN_TLPHY_PAR, &tlphy_par );
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002358
Linus Torvalds1da177e2005-04-16 15:20:36 -07002359 printk( "TLAN: %s: Link active with ", dev->name );
2360 if (!(tlphy_par & TLAN_PHY_AN_EN_STAT)) {
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002361 printk( "forced 10%sMbps %s-Duplex\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07002362 tlphy_par & TLAN_PHY_SPEED_100 ? "" : "0",
2363 tlphy_par & TLAN_PHY_DUPLEX_FULL ? "Full" : "Half");
2364 } else {
2365 printk( "AutoNegotiation enabled, at 10%sMbps %s-Duplex\n",
2366 tlphy_par & TLAN_PHY_SPEED_100 ? "" : "0",
2367 tlphy_par & TLAN_PHY_DUPLEX_FULL ? "Full" : "Half");
2368 printk("TLAN: Partner capability: ");
2369 for (i = 5; i <= 10; i++)
2370 if (partner & (1<<i))
2371 printk("%s",media[i-5]);
2372 printk("\n");
2373 }
2374
2375 TLan_DioWrite8( dev->base_addr, TLAN_LED_REG, TLAN_LED_LINK );
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002376#ifdef MONITOR
Linus Torvalds1da177e2005-04-16 15:20:36 -07002377 /* We have link beat..for now anyway */
2378 priv->link = 1;
2379 /*Enabling link beat monitoring */
2380 TLan_SetTimer( dev, (10*HZ), TLAN_TIMER_LINK_BEAT );
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002381#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07002382 } else if (status & MII_GS_LINK) {
2383 printk( "TLAN: %s: Link active\n", dev->name );
2384 TLan_DioWrite8( dev->base_addr, TLAN_LED_REG, TLAN_LED_LINK );
2385 }
2386 }
2387
2388 if ( priv->phyNum == 0 ) {
2389 TLan_MiiReadReg( dev, phy, TLAN_TLPHY_CTL, &tlphy_ctl );
2390 tlphy_ctl |= TLAN_TC_INTEN;
2391 TLan_MiiWriteReg( dev, phy, TLAN_TLPHY_CTL, tlphy_ctl );
2392 sio = TLan_DioRead8( dev->base_addr, TLAN_NET_SIO );
2393 sio |= TLAN_NET_SIO_MINTEN;
2394 TLan_DioWrite8( dev->base_addr, TLAN_NET_SIO, sio );
2395 }
2396
2397 if ( status & MII_GS_LINK ) {
2398 TLan_SetMac( dev, 0, dev->dev_addr );
2399 priv->phyOnline = 1;
2400 outb( ( TLAN_HC_INT_ON >> 8 ), dev->base_addr + TLAN_HOST_CMD + 1 );
2401 if ( debug >= 1 && debug != TLAN_DEBUG_PROBE ) {
2402 outb( ( TLAN_HC_REQ_INT >> 8 ), dev->base_addr + TLAN_HOST_CMD + 1 );
2403 }
2404 outl( priv->rxListDMA, dev->base_addr + TLAN_CH_PARM );
2405 outl( TLAN_HC_GO | TLAN_HC_RT, dev->base_addr + TLAN_HOST_CMD );
2406 netif_carrier_on(dev);
2407 } else {
2408 printk( "TLAN: %s: Link inactive, will retry in 10 secs...\n", dev->name );
2409 TLan_SetTimer( dev, (10*HZ), TLAN_TIMER_FINISH_RESET );
2410 return;
2411 }
James Harper562faf42005-05-05 15:14:18 -07002412 TLan_SetMulticastList(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002413
2414} /* TLan_FinishReset */
2415
2416
2417
2418
2419 /***************************************************************
2420 * TLan_SetMac
2421 *
2422 * Returns:
2423 * Nothing
2424 * Parms:
2425 * dev Pointer to device structure of adapter
2426 * on which to change the AREG.
2427 * areg The AREG to set the address in (0 - 3).
2428 * mac A pointer to an array of chars. Each
2429 * element stores one byte of the address.
2430 * IE, it isn't in ascii.
2431 *
2432 * This function transfers a MAC address to one of the
2433 * TLAN AREGs (address registers). The TLAN chip locks
2434 * the register on writing to offset 0 and unlocks the
2435 * register after writing to offset 5. If NULL is passed
2436 * in mac, then the AREG is filled with 0's.
2437 *
2438 **************************************************************/
2439
2440void TLan_SetMac( struct net_device *dev, int areg, char *mac )
2441{
2442 int i;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002443
Linus Torvalds1da177e2005-04-16 15:20:36 -07002444 areg *= 6;
2445
2446 if ( mac != NULL ) {
2447 for ( i = 0; i < 6; i++ )
2448 TLan_DioWrite8( dev->base_addr, TLAN_AREG_0 + areg + i, mac[i] );
2449 } else {
2450 for ( i = 0; i < 6; i++ )
2451 TLan_DioWrite8( dev->base_addr, TLAN_AREG_0 + areg + i, 0 );
2452 }
2453
2454} /* TLan_SetMac */
2455
2456
2457
2458
2459/*****************************************************************************
2460******************************************************************************
2461
2462 ThunderLAN Driver PHY Layer Routines
2463
2464******************************************************************************
2465*****************************************************************************/
2466
2467
2468
2469 /*********************************************************************
2470 * TLan_PhyPrint
2471 *
2472 * Returns:
2473 * Nothing
2474 * Parms:
2475 * dev A pointer to the device structure of the
2476 * TLAN device having the PHYs to be detailed.
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002477 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07002478 * This function prints the registers a PHY (aka transceiver).
2479 *
2480 ********************************************************************/
2481
2482void TLan_PhyPrint( struct net_device *dev )
2483{
2484 TLanPrivateInfo *priv = netdev_priv(dev);
2485 u16 i, data0, data1, data2, data3, phy;
2486
2487 phy = priv->phy[priv->phyNum];
2488
2489 if ( priv->adapter->flags & TLAN_ADAPTER_UNMANAGED_PHY ) {
2490 printk( "TLAN: Device %s, Unmanaged PHY.\n", dev->name );
2491 } else if ( phy <= TLAN_PHY_MAX_ADDR ) {
2492 printk( "TLAN: Device %s, PHY 0x%02x.\n", dev->name, phy );
2493 printk( "TLAN: Off. +0 +1 +2 +3 \n" );
2494 for ( i = 0; i < 0x20; i+= 4 ) {
2495 printk( "TLAN: 0x%02x", i );
2496 TLan_MiiReadReg( dev, phy, i, &data0 );
2497 printk( " 0x%04hx", data0 );
2498 TLan_MiiReadReg( dev, phy, i + 1, &data1 );
2499 printk( " 0x%04hx", data1 );
2500 TLan_MiiReadReg( dev, phy, i + 2, &data2 );
2501 printk( " 0x%04hx", data2 );
2502 TLan_MiiReadReg( dev, phy, i + 3, &data3 );
2503 printk( " 0x%04hx\n", data3 );
2504 }
2505 } else {
2506 printk( "TLAN: Device %s, Invalid PHY.\n", dev->name );
2507 }
2508
2509} /* TLan_PhyPrint */
2510
2511
2512
2513
2514 /*********************************************************************
2515 * TLan_PhyDetect
2516 *
2517 * Returns:
2518 * Nothing
2519 * Parms:
2520 * dev A pointer to the device structure of the adapter
2521 * for which the PHY needs determined.
2522 *
2523 * So far I've found that adapters which have external PHYs
2524 * may also use the internal PHY for part of the functionality.
2525 * (eg, AUI/Thinnet). This function finds out if this TLAN
2526 * chip has an internal PHY, and then finds the first external
2527 * PHY (starting from address 0) if it exists).
2528 *
2529 ********************************************************************/
2530
2531void TLan_PhyDetect( struct net_device *dev )
2532{
2533 TLanPrivateInfo *priv = netdev_priv(dev);
2534 u16 control;
2535 u16 hi;
2536 u16 lo;
2537 u32 phy;
2538
2539 if ( priv->adapter->flags & TLAN_ADAPTER_UNMANAGED_PHY ) {
2540 priv->phyNum = 0xFFFF;
2541 return;
2542 }
2543
2544 TLan_MiiReadReg( dev, TLAN_PHY_MAX_ADDR, MII_GEN_ID_HI, &hi );
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002545
Linus Torvalds1da177e2005-04-16 15:20:36 -07002546 if ( hi != 0xFFFF ) {
2547 priv->phy[0] = TLAN_PHY_MAX_ADDR;
2548 } else {
2549 priv->phy[0] = TLAN_PHY_NONE;
2550 }
2551
2552 priv->phy[1] = TLAN_PHY_NONE;
2553 for ( phy = 0; phy <= TLAN_PHY_MAX_ADDR; phy++ ) {
2554 TLan_MiiReadReg( dev, phy, MII_GEN_CTL, &control );
2555 TLan_MiiReadReg( dev, phy, MII_GEN_ID_HI, &hi );
2556 TLan_MiiReadReg( dev, phy, MII_GEN_ID_LO, &lo );
2557 if ( ( control != 0xFFFF ) || ( hi != 0xFFFF ) || ( lo != 0xFFFF ) ) {
2558 TLAN_DBG( TLAN_DEBUG_GNRL, "PHY found at %02x %04x %04x %04x\n", phy, control, hi, lo );
2559 if ( ( priv->phy[1] == TLAN_PHY_NONE ) && ( phy != TLAN_PHY_MAX_ADDR ) ) {
2560 priv->phy[1] = phy;
2561 }
2562 }
2563 }
2564
2565 if ( priv->phy[1] != TLAN_PHY_NONE ) {
2566 priv->phyNum = 1;
2567 } else if ( priv->phy[0] != TLAN_PHY_NONE ) {
2568 priv->phyNum = 0;
2569 } else {
2570 printk( "TLAN: Cannot initialize device, no PHY was found!\n" );
2571 }
2572
2573} /* TLan_PhyDetect */
2574
2575
2576
2577
2578void TLan_PhyPowerDown( struct net_device *dev )
2579{
2580 TLanPrivateInfo *priv = netdev_priv(dev);
2581 u16 value;
2582
2583 TLAN_DBG( TLAN_DEBUG_GNRL, "%s: Powering down PHY(s).\n", dev->name );
2584 value = MII_GC_PDOWN | MII_GC_LOOPBK | MII_GC_ISOLATE;
2585 TLan_MiiSync( dev->base_addr );
2586 TLan_MiiWriteReg( dev, priv->phy[priv->phyNum], MII_GEN_CTL, value );
2587 if ( ( priv->phyNum == 0 ) && ( priv->phy[1] != TLAN_PHY_NONE ) && ( ! ( priv->adapter->flags & TLAN_ADAPTER_USE_INTERN_10 ) ) ) {
2588 TLan_MiiSync( dev->base_addr );
2589 TLan_MiiWriteReg( dev, priv->phy[1], MII_GEN_CTL, value );
2590 }
2591
2592 /* Wait for 50 ms and powerup
2593 * This is abitrary. It is intended to make sure the
2594 * transceiver settles.
2595 */
2596 TLan_SetTimer( dev, (HZ/20), TLAN_TIMER_PHY_PUP );
2597
2598} /* TLan_PhyPowerDown */
2599
2600
2601
2602
2603void TLan_PhyPowerUp( struct net_device *dev )
2604{
2605 TLanPrivateInfo *priv = netdev_priv(dev);
2606 u16 value;
2607
2608 TLAN_DBG( TLAN_DEBUG_GNRL, "%s: Powering up PHY.\n", dev->name );
2609 TLan_MiiSync( dev->base_addr );
2610 value = MII_GC_LOOPBK;
2611 TLan_MiiWriteReg( dev, priv->phy[priv->phyNum], MII_GEN_CTL, value );
2612 TLan_MiiSync(dev->base_addr);
2613 /* Wait for 500 ms and reset the
2614 * transceiver. The TLAN docs say both 50 ms and
2615 * 500 ms, so do the longer, just in case.
2616 */
2617 TLan_SetTimer( dev, (HZ/20), TLAN_TIMER_PHY_RESET );
2618
2619} /* TLan_PhyPowerUp */
2620
2621
2622
2623
2624void TLan_PhyReset( struct net_device *dev )
2625{
2626 TLanPrivateInfo *priv = netdev_priv(dev);
2627 u16 phy;
2628 u16 value;
2629
2630 phy = priv->phy[priv->phyNum];
2631
2632 TLAN_DBG( TLAN_DEBUG_GNRL, "%s: Reseting PHY.\n", dev->name );
2633 TLan_MiiSync( dev->base_addr );
2634 value = MII_GC_LOOPBK | MII_GC_RESET;
2635 TLan_MiiWriteReg( dev, phy, MII_GEN_CTL, value );
2636 TLan_MiiReadReg( dev, phy, MII_GEN_CTL, &value );
2637 while ( value & MII_GC_RESET ) {
2638 TLan_MiiReadReg( dev, phy, MII_GEN_CTL, &value );
2639 }
2640
2641 /* Wait for 500 ms and initialize.
2642 * I don't remember why I wait this long.
2643 * I've changed this to 50ms, as it seems long enough.
2644 */
2645 TLan_SetTimer( dev, (HZ/20), TLAN_TIMER_PHY_START_LINK );
2646
2647} /* TLan_PhyReset */
2648
2649
2650
2651
2652void TLan_PhyStartLink( struct net_device *dev )
2653{
2654 TLanPrivateInfo *priv = netdev_priv(dev);
2655 u16 ability;
2656 u16 control;
2657 u16 data;
2658 u16 phy;
2659 u16 status;
2660 u16 tctl;
2661
2662 phy = priv->phy[priv->phyNum];
2663 TLAN_DBG( TLAN_DEBUG_GNRL, "%s: Trying to activate link.\n", dev->name );
2664 TLan_MiiReadReg( dev, phy, MII_GEN_STS, &status );
2665 TLan_MiiReadReg( dev, phy, MII_GEN_STS, &ability );
2666
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002667 if ( ( status & MII_GS_AUTONEG ) &&
Linus Torvalds1da177e2005-04-16 15:20:36 -07002668 ( ! priv->aui ) ) {
2669 ability = status >> 11;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002670 if ( priv->speed == TLAN_SPEED_10 &&
Linus Torvalds1da177e2005-04-16 15:20:36 -07002671 priv->duplex == TLAN_DUPLEX_HALF) {
2672 TLan_MiiWriteReg( dev, phy, MII_GEN_CTL, 0x0000);
2673 } else if ( priv->speed == TLAN_SPEED_10 &&
2674 priv->duplex == TLAN_DUPLEX_FULL) {
2675 priv->tlanFullDuplex = TRUE;
2676 TLan_MiiWriteReg( dev, phy, MII_GEN_CTL, 0x0100);
2677 } else if ( priv->speed == TLAN_SPEED_100 &&
2678 priv->duplex == TLAN_DUPLEX_HALF) {
2679 TLan_MiiWriteReg( dev, phy, MII_GEN_CTL, 0x2000);
2680 } else if ( priv->speed == TLAN_SPEED_100 &&
2681 priv->duplex == TLAN_DUPLEX_FULL) {
2682 priv->tlanFullDuplex = TRUE;
2683 TLan_MiiWriteReg( dev, phy, MII_GEN_CTL, 0x2100);
2684 } else {
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002685
Linus Torvalds1da177e2005-04-16 15:20:36 -07002686 /* Set Auto-Neg advertisement */
2687 TLan_MiiWriteReg( dev, phy, MII_AN_ADV, (ability << 5) | 1);
2688 /* Enablee Auto-Neg */
2689 TLan_MiiWriteReg( dev, phy, MII_GEN_CTL, 0x1000 );
2690 /* Restart Auto-Neg */
2691 TLan_MiiWriteReg( dev, phy, MII_GEN_CTL, 0x1200 );
2692 /* Wait for 4 sec for autonegotiation
2693 * to complete. The max spec time is less than this
2694 * but the card need additional time to start AN.
2695 * .5 sec should be plenty extra.
2696 */
2697 printk( "TLAN: %s: Starting autonegotiation.\n", dev->name );
2698 TLan_SetTimer( dev, (2*HZ), TLAN_TIMER_PHY_FINISH_AN );
2699 return;
2700 }
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002701
2702 }
2703
Linus Torvalds1da177e2005-04-16 15:20:36 -07002704 if ( ( priv->aui ) && ( priv->phyNum != 0 ) ) {
2705 priv->phyNum = 0;
2706 data = TLAN_NET_CFG_1FRAG | TLAN_NET_CFG_1CHAN | TLAN_NET_CFG_PHY_EN;
2707 TLan_DioWrite16( dev->base_addr, TLAN_NET_CONFIG, data );
2708 TLan_SetTimer( dev, (40*HZ/1000), TLAN_TIMER_PHY_PDOWN );
2709 return;
2710 } else if ( priv->phyNum == 0 ) {
2711 control = 0;
2712 TLan_MiiReadReg( dev, phy, TLAN_TLPHY_CTL, &tctl );
2713 if ( priv->aui ) {
2714 tctl |= TLAN_TC_AUISEL;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002715 } else {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002716 tctl &= ~TLAN_TC_AUISEL;
2717 if ( priv->duplex == TLAN_DUPLEX_FULL ) {
2718 control |= MII_GC_DUPLEX;
2719 priv->tlanFullDuplex = TRUE;
2720 }
2721 if ( priv->speed == TLAN_SPEED_100 ) {
2722 control |= MII_GC_SPEEDSEL;
2723 }
2724 }
2725 TLan_MiiWriteReg( dev, phy, MII_GEN_CTL, control );
2726 TLan_MiiWriteReg( dev, phy, TLAN_TLPHY_CTL, tctl );
2727 }
2728
2729 /* Wait for 2 sec to give the transceiver time
2730 * to establish link.
2731 */
2732 TLan_SetTimer( dev, (4*HZ), TLAN_TIMER_FINISH_RESET );
2733
2734} /* TLan_PhyStartLink */
2735
2736
2737
2738
2739void TLan_PhyFinishAutoNeg( struct net_device *dev )
2740{
2741 TLanPrivateInfo *priv = netdev_priv(dev);
2742 u16 an_adv;
2743 u16 an_lpa;
2744 u16 data;
2745 u16 mode;
2746 u16 phy;
2747 u16 status;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002748
Linus Torvalds1da177e2005-04-16 15:20:36 -07002749 phy = priv->phy[priv->phyNum];
2750
2751 TLan_MiiReadReg( dev, phy, MII_GEN_STS, &status );
2752 udelay( 1000 );
2753 TLan_MiiReadReg( dev, phy, MII_GEN_STS, &status );
2754
2755 if ( ! ( status & MII_GS_AUTOCMPLT ) ) {
2756 /* Wait for 8 sec to give the process
2757 * more time. Perhaps we should fail after a while.
2758 */
2759 if (!priv->neg_be_verbose++) {
2760 printk(KERN_INFO "TLAN: Giving autonegotiation more time.\n");
2761 printk(KERN_INFO "TLAN: Please check that your adapter has\n");
2762 printk(KERN_INFO "TLAN: been properly connected to a HUB or Switch.\n");
2763 printk(KERN_INFO "TLAN: Trying to establish link in the background...\n");
2764 }
2765 TLan_SetTimer( dev, (8*HZ), TLAN_TIMER_PHY_FINISH_AN );
2766 return;
2767 }
2768
2769 printk( "TLAN: %s: Autonegotiation complete.\n", dev->name );
2770 TLan_MiiReadReg( dev, phy, MII_AN_ADV, &an_adv );
2771 TLan_MiiReadReg( dev, phy, MII_AN_LPA, &an_lpa );
2772 mode = an_adv & an_lpa & 0x03E0;
2773 if ( mode & 0x0100 ) {
2774 priv->tlanFullDuplex = TRUE;
2775 } else if ( ! ( mode & 0x0080 ) && ( mode & 0x0040 ) ) {
2776 priv->tlanFullDuplex = TRUE;
2777 }
2778
2779 if ( ( ! ( mode & 0x0180 ) ) && ( priv->adapter->flags & TLAN_ADAPTER_USE_INTERN_10 ) && ( priv->phyNum != 0 ) ) {
2780 priv->phyNum = 0;
2781 data = TLAN_NET_CFG_1FRAG | TLAN_NET_CFG_1CHAN | TLAN_NET_CFG_PHY_EN;
2782 TLan_DioWrite16( dev->base_addr, TLAN_NET_CONFIG, data );
2783 TLan_SetTimer( dev, (400*HZ/1000), TLAN_TIMER_PHY_PDOWN );
2784 return;
2785 }
2786
2787 if ( priv->phyNum == 0 ) {
2788 if ( ( priv->duplex == TLAN_DUPLEX_FULL ) || ( an_adv & an_lpa & 0x0040 ) ) {
2789 TLan_MiiWriteReg( dev, phy, MII_GEN_CTL, MII_GC_AUTOENB | MII_GC_DUPLEX );
2790 printk( "TLAN: Starting internal PHY with FULL-DUPLEX\n" );
2791 } else {
2792 TLan_MiiWriteReg( dev, phy, MII_GEN_CTL, MII_GC_AUTOENB );
2793 printk( "TLAN: Starting internal PHY with HALF-DUPLEX\n" );
2794 }
2795 }
2796
2797 /* Wait for 100 ms. No reason in partiticular.
2798 */
2799 TLan_SetTimer( dev, (HZ/10), TLAN_TIMER_FINISH_RESET );
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002800
Linus Torvalds1da177e2005-04-16 15:20:36 -07002801} /* TLan_PhyFinishAutoNeg */
2802
2803#ifdef MONITOR
2804
2805 /*********************************************************************
2806 *
2807 * TLan_phyMonitor
2808 *
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002809 * Returns:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002810 * None
2811 *
2812 * Params:
2813 * dev The device structure of this device.
2814 *
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002815 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07002816 * This function monitors PHY condition by reading the status
2817 * register via the MII bus. This can be used to give info
2818 * about link changes (up/down), and possible switch to alternate
2819 * media.
2820 *
2821 * ******************************************************************/
2822
2823void TLan_PhyMonitor( struct net_device *dev )
2824{
2825 TLanPrivateInfo *priv = netdev_priv(dev);
2826 u16 phy;
2827 u16 phy_status;
2828
2829 phy = priv->phy[priv->phyNum];
2830
2831 /* Get PHY status register */
2832 TLan_MiiReadReg( dev, phy, MII_GEN_STS, &phy_status );
2833
2834 /* Check if link has been lost */
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002835 if (!(phy_status & MII_GS_LINK)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002836 if (priv->link) {
2837 priv->link = 0;
2838 printk(KERN_DEBUG "TLAN: %s has lost link\n", dev->name);
7d17c1d2005-05-12 19:45:25 -04002839 netif_carrier_off(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002840 TLan_SetTimer( dev, (2*HZ), TLAN_TIMER_LINK_BEAT );
2841 return;
2842 }
2843 }
2844
2845 /* Link restablished? */
2846 if ((phy_status & MII_GS_LINK) && !priv->link) {
2847 priv->link = 1;
2848 printk(KERN_DEBUG "TLAN: %s has reestablished link\n", dev->name);
7d17c1d2005-05-12 19:45:25 -04002849 netif_carrier_on(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002850 }
2851
2852 /* Setup a new monitor */
2853 TLan_SetTimer( dev, (2*HZ), TLAN_TIMER_LINK_BEAT );
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002854}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002855
2856#endif /* MONITOR */
2857
2858
2859/*****************************************************************************
2860******************************************************************************
2861
2862 ThunderLAN Driver MII Routines
2863
2864 These routines are based on the information in Chap. 2 of the
2865 "ThunderLAN Programmer's Guide", pp. 15-24.
2866
2867******************************************************************************
2868*****************************************************************************/
2869
2870
2871 /***************************************************************
2872 * TLan_MiiReadReg
2873 *
2874 * Returns:
2875 * 0 if ack received ok
2876 * 1 otherwise.
2877 *
2878 * Parms:
2879 * dev The device structure containing
2880 * The io address and interrupt count
2881 * for this device.
2882 * phy The address of the PHY to be queried.
2883 * reg The register whose contents are to be
Matt Mackall4a4efbd2006-01-03 13:27:11 +01002884 * retrieved.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002885 * val A pointer to a variable to store the
2886 * retrieved value.
2887 *
Matt Mackall4a4efbd2006-01-03 13:27:11 +01002888 * This function uses the TLAN's MII bus to retrieve the contents
Linus Torvalds1da177e2005-04-16 15:20:36 -07002889 * of a given register on a PHY. It sends the appropriate info
2890 * and then reads the 16-bit register value from the MII bus via
2891 * the TLAN SIO register.
2892 *
2893 **************************************************************/
2894
2895int TLan_MiiReadReg( struct net_device *dev, u16 phy, u16 reg, u16 *val )
2896{
2897 u8 nack;
2898 u16 sio, tmp;
2899 u32 i;
2900 int err;
2901 int minten;
2902 TLanPrivateInfo *priv = netdev_priv(dev);
2903 unsigned long flags = 0;
2904
2905 err = FALSE;
2906 outw(TLAN_NET_SIO, dev->base_addr + TLAN_DIO_ADR);
2907 sio = dev->base_addr + TLAN_DIO_DATA + TLAN_NET_SIO;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002908
Linus Torvalds1da177e2005-04-16 15:20:36 -07002909 if (!in_irq())
2910 spin_lock_irqsave(&priv->lock, flags);
2911
2912 TLan_MiiSync(dev->base_addr);
2913
2914 minten = TLan_GetBit( TLAN_NET_SIO_MINTEN, sio );
2915 if ( minten )
2916 TLan_ClearBit(TLAN_NET_SIO_MINTEN, sio);
2917
2918 TLan_MiiSendData( dev->base_addr, 0x1, 2 ); /* Start ( 01b ) */
2919 TLan_MiiSendData( dev->base_addr, 0x2, 2 ); /* Read ( 10b ) */
2920 TLan_MiiSendData( dev->base_addr, phy, 5 ); /* Device # */
2921 TLan_MiiSendData( dev->base_addr, reg, 5 ); /* Register # */
2922
2923
2924 TLan_ClearBit(TLAN_NET_SIO_MTXEN, sio); /* Change direction */
2925
2926 TLan_ClearBit(TLAN_NET_SIO_MCLK, sio); /* Clock Idle bit */
2927 TLan_SetBit(TLAN_NET_SIO_MCLK, sio);
2928 TLan_ClearBit(TLAN_NET_SIO_MCLK, sio); /* Wait 300ns */
2929
2930 nack = TLan_GetBit(TLAN_NET_SIO_MDATA, sio); /* Check for ACK */
2931 TLan_SetBit(TLAN_NET_SIO_MCLK, sio); /* Finish ACK */
2932 if (nack) { /* No ACK, so fake it */
2933 for (i = 0; i < 16; i++) {
2934 TLan_ClearBit(TLAN_NET_SIO_MCLK, sio);
2935 TLan_SetBit(TLAN_NET_SIO_MCLK, sio);
2936 }
2937 tmp = 0xffff;
2938 err = TRUE;
2939 } else { /* ACK, so read data */
2940 for (tmp = 0, i = 0x8000; i; i >>= 1) {
2941 TLan_ClearBit(TLAN_NET_SIO_MCLK, sio);
2942 if (TLan_GetBit(TLAN_NET_SIO_MDATA, sio))
2943 tmp |= i;
2944 TLan_SetBit(TLAN_NET_SIO_MCLK, sio);
2945 }
2946 }
2947
2948
2949 TLan_ClearBit(TLAN_NET_SIO_MCLK, sio); /* Idle cycle */
2950 TLan_SetBit(TLAN_NET_SIO_MCLK, sio);
2951
2952 if ( minten )
2953 TLan_SetBit(TLAN_NET_SIO_MINTEN, sio);
2954
2955 *val = tmp;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002956
Linus Torvalds1da177e2005-04-16 15:20:36 -07002957 if (!in_irq())
2958 spin_unlock_irqrestore(&priv->lock, flags);
2959
2960 return err;
2961
2962} /* TLan_MiiReadReg */
2963
2964
2965
2966
2967 /***************************************************************
2968 * TLan_MiiSendData
2969 *
2970 * Returns:
2971 * Nothing
2972 * Parms:
2973 * base_port The base IO port of the adapter in
2974 * question.
2975 * dev The address of the PHY to be queried.
2976 * data The value to be placed on the MII bus.
2977 * num_bits The number of bits in data that are to
2978 * be placed on the MII bus.
2979 *
2980 * This function sends on sequence of bits on the MII
2981 * configuration bus.
2982 *
2983 **************************************************************/
2984
2985void TLan_MiiSendData( u16 base_port, u32 data, unsigned num_bits )
2986{
2987 u16 sio;
2988 u32 i;
2989
2990 if ( num_bits == 0 )
2991 return;
2992
2993 outw( TLAN_NET_SIO, base_port + TLAN_DIO_ADR );
2994 sio = base_port + TLAN_DIO_DATA + TLAN_NET_SIO;
2995 TLan_SetBit( TLAN_NET_SIO_MTXEN, sio );
2996
2997 for ( i = ( 0x1 << ( num_bits - 1 ) ); i; i >>= 1 ) {
2998 TLan_ClearBit( TLAN_NET_SIO_MCLK, sio );
2999 (void) TLan_GetBit( TLAN_NET_SIO_MCLK, sio );
3000 if ( data & i )
3001 TLan_SetBit( TLAN_NET_SIO_MDATA, sio );
3002 else
3003 TLan_ClearBit( TLAN_NET_SIO_MDATA, sio );
3004 TLan_SetBit( TLAN_NET_SIO_MCLK, sio );
3005 (void) TLan_GetBit( TLAN_NET_SIO_MCLK, sio );
3006 }
3007
3008} /* TLan_MiiSendData */
3009
3010
3011
3012
3013 /***************************************************************
3014 * TLan_MiiSync
3015 *
3016 * Returns:
3017 * Nothing
3018 * Parms:
3019 * base_port The base IO port of the adapter in
3020 * question.
3021 *
3022 * This functions syncs all PHYs in terms of the MII configuration
3023 * bus.
3024 *
3025 **************************************************************/
3026
3027void TLan_MiiSync( u16 base_port )
3028{
3029 int i;
3030 u16 sio;
3031
3032 outw( TLAN_NET_SIO, base_port + TLAN_DIO_ADR );
3033 sio = base_port + TLAN_DIO_DATA + TLAN_NET_SIO;
3034
3035 TLan_ClearBit( TLAN_NET_SIO_MTXEN, sio );
3036 for ( i = 0; i < 32; i++ ) {
3037 TLan_ClearBit( TLAN_NET_SIO_MCLK, sio );
3038 TLan_SetBit( TLAN_NET_SIO_MCLK, sio );
3039 }
3040
3041} /* TLan_MiiSync */
3042
3043
3044
3045
3046 /***************************************************************
3047 * TLan_MiiWriteReg
3048 *
3049 * Returns:
3050 * Nothing
3051 * Parms:
3052 * dev The device structure for the device
3053 * to write to.
3054 * phy The address of the PHY to be written to.
3055 * reg The register whose contents are to be
3056 * written.
3057 * val The value to be written to the register.
3058 *
3059 * This function uses the TLAN's MII bus to write the contents of a
3060 * given register on a PHY. It sends the appropriate info and then
3061 * writes the 16-bit register value from the MII configuration bus
3062 * via the TLAN SIO register.
3063 *
3064 **************************************************************/
3065
3066void TLan_MiiWriteReg( struct net_device *dev, u16 phy, u16 reg, u16 val )
3067{
3068 u16 sio;
3069 int minten;
3070 unsigned long flags = 0;
3071 TLanPrivateInfo *priv = netdev_priv(dev);
3072
3073 outw(TLAN_NET_SIO, dev->base_addr + TLAN_DIO_ADR);
3074 sio = dev->base_addr + TLAN_DIO_DATA + TLAN_NET_SIO;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04003075
Linus Torvalds1da177e2005-04-16 15:20:36 -07003076 if (!in_irq())
3077 spin_lock_irqsave(&priv->lock, flags);
3078
3079 TLan_MiiSync( dev->base_addr );
3080
3081 minten = TLan_GetBit( TLAN_NET_SIO_MINTEN, sio );
3082 if ( minten )
3083 TLan_ClearBit( TLAN_NET_SIO_MINTEN, sio );
3084
3085 TLan_MiiSendData( dev->base_addr, 0x1, 2 ); /* Start ( 01b ) */
3086 TLan_MiiSendData( dev->base_addr, 0x1, 2 ); /* Write ( 01b ) */
3087 TLan_MiiSendData( dev->base_addr, phy, 5 ); /* Device # */
3088 TLan_MiiSendData( dev->base_addr, reg, 5 ); /* Register # */
3089
3090 TLan_MiiSendData( dev->base_addr, 0x2, 2 ); /* Send ACK */
3091 TLan_MiiSendData( dev->base_addr, val, 16 ); /* Send Data */
3092
3093 TLan_ClearBit( TLAN_NET_SIO_MCLK, sio ); /* Idle cycle */
3094 TLan_SetBit( TLAN_NET_SIO_MCLK, sio );
3095
3096 if ( minten )
3097 TLan_SetBit( TLAN_NET_SIO_MINTEN, sio );
Jeff Garzik6aa20a22006-09-13 13:24:59 -04003098
Linus Torvalds1da177e2005-04-16 15:20:36 -07003099 if (!in_irq())
3100 spin_unlock_irqrestore(&priv->lock, flags);
3101
3102} /* TLan_MiiWriteReg */
3103
3104
3105
3106
3107/*****************************************************************************
3108******************************************************************************
3109
3110 ThunderLAN Driver Eeprom routines
3111
3112 The Compaq Netelligent 10 and 10/100 cards use a Microchip 24C02A
3113 EEPROM. These functions are based on information in Microchip's
3114 data sheet. I don't know how well this functions will work with
3115 other EEPROMs.
3116
3117******************************************************************************
3118*****************************************************************************/
3119
3120
3121 /***************************************************************
3122 * TLan_EeSendStart
3123 *
3124 * Returns:
3125 * Nothing
Jeff Garzik6aa20a22006-09-13 13:24:59 -04003126 * Parms:
Linus Torvalds1da177e2005-04-16 15:20:36 -07003127 * io_base The IO port base address for the
3128 * TLAN device with the EEPROM to
3129 * use.
3130 *
3131 * This function sends a start cycle to an EEPROM attached
3132 * to a TLAN chip.
3133 *
3134 **************************************************************/
3135
3136void TLan_EeSendStart( u16 io_base )
3137{
3138 u16 sio;
3139
3140 outw( TLAN_NET_SIO, io_base + TLAN_DIO_ADR );
3141 sio = io_base + TLAN_DIO_DATA + TLAN_NET_SIO;
3142
3143 TLan_SetBit( TLAN_NET_SIO_ECLOK, sio );
3144 TLan_SetBit( TLAN_NET_SIO_EDATA, sio );
3145 TLan_SetBit( TLAN_NET_SIO_ETXEN, sio );
3146 TLan_ClearBit( TLAN_NET_SIO_EDATA, sio );
3147 TLan_ClearBit( TLAN_NET_SIO_ECLOK, sio );
3148
3149} /* TLan_EeSendStart */
3150
3151
3152
3153
3154 /***************************************************************
3155 * TLan_EeSendByte
3156 *
3157 * Returns:
3158 * If the correct ack was received, 0, otherwise 1
3159 * Parms: io_base The IO port base address for the
3160 * TLAN device with the EEPROM to
3161 * use.
3162 * data The 8 bits of information to
3163 * send to the EEPROM.
3164 * stop If TLAN_EEPROM_STOP is passed, a
3165 * stop cycle is sent after the
3166 * byte is sent after the ack is
3167 * read.
3168 *
3169 * This function sends a byte on the serial EEPROM line,
3170 * driving the clock to send each bit. The function then
3171 * reverses transmission direction and reads an acknowledge
3172 * bit.
3173 *
3174 **************************************************************/
3175
3176int TLan_EeSendByte( u16 io_base, u8 data, int stop )
3177{
3178 int err;
3179 u8 place;
3180 u16 sio;
3181
3182 outw( TLAN_NET_SIO, io_base + TLAN_DIO_ADR );
3183 sio = io_base + TLAN_DIO_DATA + TLAN_NET_SIO;
3184
3185 /* Assume clock is low, tx is enabled; */
3186 for ( place = 0x80; place != 0; place >>= 1 ) {
3187 if ( place & data )
3188 TLan_SetBit( TLAN_NET_SIO_EDATA, sio );
3189 else
3190 TLan_ClearBit( TLAN_NET_SIO_EDATA, sio );
3191 TLan_SetBit( TLAN_NET_SIO_ECLOK, sio );
3192 TLan_ClearBit( TLAN_NET_SIO_ECLOK, sio );
3193 }
3194 TLan_ClearBit( TLAN_NET_SIO_ETXEN, sio );
3195 TLan_SetBit( TLAN_NET_SIO_ECLOK, sio );
3196 err = TLan_GetBit( TLAN_NET_SIO_EDATA, sio );
3197 TLan_ClearBit( TLAN_NET_SIO_ECLOK, sio );
3198 TLan_SetBit( TLAN_NET_SIO_ETXEN, sio );
3199
3200 if ( ( ! err ) && stop ) {
3201 TLan_ClearBit( TLAN_NET_SIO_EDATA, sio ); /* STOP, raise data while clock is high */
3202 TLan_SetBit( TLAN_NET_SIO_ECLOK, sio );
3203 TLan_SetBit( TLAN_NET_SIO_EDATA, sio );
3204 }
3205
3206 return ( err );
3207
3208} /* TLan_EeSendByte */
3209
3210
3211
3212
3213 /***************************************************************
3214 * TLan_EeReceiveByte
3215 *
3216 * Returns:
3217 * Nothing
3218 * Parms:
3219 * io_base The IO port base address for the
3220 * TLAN device with the EEPROM to
3221 * use.
3222 * data An address to a char to hold the
3223 * data sent from the EEPROM.
3224 * stop If TLAN_EEPROM_STOP is passed, a
3225 * stop cycle is sent after the
3226 * byte is received, and no ack is
3227 * sent.
3228 *
3229 * This function receives 8 bits of data from the EEPROM
3230 * over the serial link. It then sends and ack bit, or no
3231 * ack and a stop bit. This function is used to retrieve
3232 * data after the address of a byte in the EEPROM has been
3233 * sent.
3234 *
3235 **************************************************************/
3236
3237void TLan_EeReceiveByte( u16 io_base, u8 *data, int stop )
3238{
3239 u8 place;
3240 u16 sio;
3241
3242 outw( TLAN_NET_SIO, io_base + TLAN_DIO_ADR );
3243 sio = io_base + TLAN_DIO_DATA + TLAN_NET_SIO;
3244 *data = 0;
3245
3246 /* Assume clock is low, tx is enabled; */
3247 TLan_ClearBit( TLAN_NET_SIO_ETXEN, sio );
3248 for ( place = 0x80; place; place >>= 1 ) {
3249 TLan_SetBit( TLAN_NET_SIO_ECLOK, sio );
3250 if ( TLan_GetBit( TLAN_NET_SIO_EDATA, sio ) )
3251 *data |= place;
3252 TLan_ClearBit( TLAN_NET_SIO_ECLOK, sio );
3253 }
3254
3255 TLan_SetBit( TLAN_NET_SIO_ETXEN, sio );
3256 if ( ! stop ) {
3257 TLan_ClearBit( TLAN_NET_SIO_EDATA, sio ); /* Ack = 0 */
3258 TLan_SetBit( TLAN_NET_SIO_ECLOK, sio );
3259 TLan_ClearBit( TLAN_NET_SIO_ECLOK, sio );
3260 } else {
3261 TLan_SetBit( TLAN_NET_SIO_EDATA, sio ); /* No ack = 1 (?) */
3262 TLan_SetBit( TLAN_NET_SIO_ECLOK, sio );
3263 TLan_ClearBit( TLAN_NET_SIO_ECLOK, sio );
3264 TLan_ClearBit( TLAN_NET_SIO_EDATA, sio ); /* STOP, raise data while clock is high */
3265 TLan_SetBit( TLAN_NET_SIO_ECLOK, sio );
3266 TLan_SetBit( TLAN_NET_SIO_EDATA, sio );
3267 }
3268
3269} /* TLan_EeReceiveByte */
3270
3271
3272
3273
3274 /***************************************************************
3275 * TLan_EeReadByte
3276 *
3277 * Returns:
3278 * No error = 0, else, the stage at which the error
3279 * occurred.
3280 * Parms:
3281 * io_base The IO port base address for the
3282 * TLAN device with the EEPROM to
3283 * use.
3284 * ee_addr The address of the byte in the
3285 * EEPROM whose contents are to be
3286 * retrieved.
3287 * data An address to a char to hold the
3288 * data obtained from the EEPROM.
3289 *
3290 * This function reads a byte of information from an byte
3291 * cell in the EEPROM.
3292 *
3293 **************************************************************/
3294
3295int TLan_EeReadByte( struct net_device *dev, u8 ee_addr, u8 *data )
3296{
3297 int err;
3298 TLanPrivateInfo *priv = netdev_priv(dev);
3299 unsigned long flags = 0;
3300 int ret=0;
3301
3302 spin_lock_irqsave(&priv->lock, flags);
3303
3304 TLan_EeSendStart( dev->base_addr );
3305 err = TLan_EeSendByte( dev->base_addr, 0xA0, TLAN_EEPROM_ACK );
3306 if (err)
3307 {
3308 ret=1;
3309 goto fail;
3310 }
3311 err = TLan_EeSendByte( dev->base_addr, ee_addr, TLAN_EEPROM_ACK );
3312 if (err)
3313 {
3314 ret=2;
3315 goto fail;
3316 }
3317 TLan_EeSendStart( dev->base_addr );
3318 err = TLan_EeSendByte( dev->base_addr, 0xA1, TLAN_EEPROM_ACK );
3319 if (err)
3320 {
3321 ret=3;
3322 goto fail;
3323 }
3324 TLan_EeReceiveByte( dev->base_addr, data, TLAN_EEPROM_STOP );
3325fail:
3326 spin_unlock_irqrestore(&priv->lock, flags);
3327
3328 return ret;
3329
3330} /* TLan_EeReadByte */
3331
3332
3333