blob: c14d2919c48a1449061defae1e165f735f8fab9a [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 char TLanSignature[] = "TLAN";
222static const char tlan_banner[] = "ThunderLAN driver v1.15\n";
223static int tlan_have_pci;
224static int tlan_have_eisa;
225
226static const char *media[] = {
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400227 "10BaseT-HD ", "10BaseT-FD ","100baseTx-HD ",
Linus Torvalds1da177e2005-04-16 15:20:36 -0700228 "100baseTx-FD", "100baseT4", NULL
229};
230
231static struct board {
232 const char *deviceLabel;
233 u32 flags;
234 u16 addrOfs;
235} board_info[] = {
236 { "Compaq Netelligent 10 T PCI UTP", TLAN_ADAPTER_ACTIVITY_LED, 0x83 },
237 { "Compaq Netelligent 10/100 TX PCI UTP", TLAN_ADAPTER_ACTIVITY_LED, 0x83 },
238 { "Compaq Integrated NetFlex-3/P", TLAN_ADAPTER_NONE, 0x83 },
239 { "Compaq NetFlex-3/P", TLAN_ADAPTER_UNMANAGED_PHY | TLAN_ADAPTER_BIT_RATE_PHY, 0x83 },
240 { "Compaq NetFlex-3/P", TLAN_ADAPTER_NONE, 0x83 },
241 { "Compaq Netelligent Integrated 10/100 TX UTP", TLAN_ADAPTER_ACTIVITY_LED, 0x83 },
242 { "Compaq Netelligent Dual 10/100 TX PCI UTP", TLAN_ADAPTER_NONE, 0x83 },
243 { "Compaq Netelligent 10/100 TX Embedded UTP", TLAN_ADAPTER_NONE, 0x83 },
244 { "Olicom OC-2183/2185", TLAN_ADAPTER_USE_INTERN_10, 0x83 },
245 { "Olicom OC-2325", TLAN_ADAPTER_UNMANAGED_PHY, 0xF8 },
246 { "Olicom OC-2326", TLAN_ADAPTER_USE_INTERN_10, 0xF8 },
247 { "Compaq Netelligent 10/100 TX UTP", TLAN_ADAPTER_ACTIVITY_LED, 0x83 },
248 { "Compaq Netelligent 10 T/2 PCI UTP/Coax", TLAN_ADAPTER_NONE, 0x83 },
249 { "Compaq NetFlex-3/E", TLAN_ADAPTER_ACTIVITY_LED | /* EISA card */
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400250 TLAN_ADAPTER_UNMANAGED_PHY | TLAN_ADAPTER_BIT_RATE_PHY, 0x83 },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700251 { "Compaq NetFlex-3/E", TLAN_ADAPTER_ACTIVITY_LED, 0x83 }, /* EISA card */
252};
253
254static struct pci_device_id tlan_pci_tbl[] = {
255 { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_NETEL10,
256 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
257 { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_NETEL100,
258 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1 },
259 { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_NETFLEX3I,
260 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 2 },
261 { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_THUNDER,
262 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 3 },
263 { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_NETFLEX3B,
264 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 4 },
265 { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_NETEL100PI,
266 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 5 },
267 { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_NETEL100D,
268 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 6 },
269 { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_NETEL100I,
270 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 7 },
271 { PCI_VENDOR_ID_OLICOM, PCI_DEVICE_ID_OLICOM_OC2183,
272 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 8 },
273 { PCI_VENDOR_ID_OLICOM, PCI_DEVICE_ID_OLICOM_OC2325,
274 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 9 },
275 { PCI_VENDOR_ID_OLICOM, PCI_DEVICE_ID_OLICOM_OC2326,
276 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 10 },
277 { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_NETELLIGENT_10_100_WS_5100,
278 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 11 },
279 { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_NETELLIGENT_10_T2,
280 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 12 },
281 { 0,}
282};
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400283MODULE_DEVICE_TABLE(pci, tlan_pci_tbl);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700284
285static void TLan_EisaProbe( void );
286static void TLan_Eisa_Cleanup( void );
287static int TLan_Init( struct net_device * );
288static int TLan_Open( struct net_device *dev );
289static int TLan_StartTx( struct sk_buff *, struct net_device *);
David Howells7d12e782006-10-05 14:55:46 +0100290static irqreturn_t TLan_HandleInterrupt( int, void *);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700291static int TLan_Close( struct net_device *);
292static struct net_device_stats *TLan_GetStats( struct net_device *);
293static void TLan_SetMulticastList( struct net_device *);
294static int TLan_ioctl( struct net_device *dev, struct ifreq *rq, int cmd);
295static int TLan_probe1( struct pci_dev *pdev, long ioaddr, int irq, int rev, const struct pci_device_id *ent);
296static void TLan_tx_timeout( struct net_device *dev);
David Howellsc4028952006-11-22 14:57:56 +0000297static void TLan_tx_timeout_work(struct work_struct *work);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700298static int tlan_init_one( struct pci_dev *pdev, const struct pci_device_id *ent);
299
300static u32 TLan_HandleInvalid( struct net_device *, u16 );
301static u32 TLan_HandleTxEOF( struct net_device *, u16 );
302static u32 TLan_HandleStatOverflow( struct net_device *, u16 );
303static u32 TLan_HandleRxEOF( struct net_device *, u16 );
304static u32 TLan_HandleDummy( struct net_device *, u16 );
305static u32 TLan_HandleTxEOC( struct net_device *, u16 );
306static u32 TLan_HandleStatusCheck( struct net_device *, u16 );
307static u32 TLan_HandleRxEOC( struct net_device *, u16 );
308
309static void TLan_Timer( unsigned long );
310
311static void TLan_ResetLists( struct net_device * );
312static void TLan_FreeLists( struct net_device * );
313static void TLan_PrintDio( u16 );
314static void TLan_PrintList( TLanList *, char *, int );
315static void TLan_ReadAndClearStats( struct net_device *, int );
316static void TLan_ResetAdapter( struct net_device * );
317static void TLan_FinishReset( struct net_device * );
318static void TLan_SetMac( struct net_device *, int areg, char *mac );
319
320static void TLan_PhyPrint( struct net_device * );
321static void TLan_PhyDetect( struct net_device * );
322static void TLan_PhyPowerDown( struct net_device * );
323static void TLan_PhyPowerUp( struct net_device * );
324static void TLan_PhyReset( struct net_device * );
325static void TLan_PhyStartLink( struct net_device * );
326static void TLan_PhyFinishAutoNeg( struct net_device * );
327#ifdef MONITOR
328static void TLan_PhyMonitor( struct net_device * );
329#endif
330
331/*
332static int TLan_PhyNop( struct net_device * );
333static int TLan_PhyInternalCheck( struct net_device * );
334static int TLan_PhyInternalService( struct net_device * );
335static int TLan_PhyDp83840aCheck( struct net_device * );
336*/
337
338static int TLan_MiiReadReg( struct net_device *, u16, u16, u16 * );
339static void TLan_MiiSendData( u16, u32, unsigned );
340static void TLan_MiiSync( u16 );
341static void TLan_MiiWriteReg( struct net_device *, u16, u16, u16 );
342
343static void TLan_EeSendStart( u16 );
344static int TLan_EeSendByte( u16, u8, int );
345static void TLan_EeReceiveByte( u16, u8 *, int );
346static int TLan_EeReadByte( struct net_device *, u8, u8 * );
347
348
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400349static void
Linus Torvalds1da177e2005-04-16 15:20:36 -0700350TLan_StoreSKB( struct tlan_list_tag *tag, struct sk_buff *skb)
351{
352 unsigned long addr = (unsigned long)skb;
353 tag->buffer[9].address = (u32)addr;
354 addr >>= 31; /* >>= 32 is undefined for 32bit arch, stupid C */
355 addr >>= 1;
356 tag->buffer[8].address = (u32)addr;
357}
358
359static struct sk_buff *
360TLan_GetSKB( struct tlan_list_tag *tag)
361{
362 unsigned long addr = tag->buffer[8].address;
363 addr <<= 31;
364 addr <<= 1;
365 addr |= tag->buffer[9].address;
366 return (struct sk_buff *) addr;
367}
368
369
370static TLanIntVectorFunc *TLanIntVector[TLAN_INT_NUMBER_OF_INTS] = {
371 TLan_HandleInvalid,
372 TLan_HandleTxEOF,
373 TLan_HandleStatOverflow,
374 TLan_HandleRxEOF,
375 TLan_HandleDummy,
376 TLan_HandleTxEOC,
377 TLan_HandleStatusCheck,
378 TLan_HandleRxEOC
379};
380
381static inline void
382TLan_SetTimer( struct net_device *dev, u32 ticks, u32 type )
383{
384 TLanPrivateInfo *priv = netdev_priv(dev);
385 unsigned long flags = 0;
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400386
Linus Torvalds1da177e2005-04-16 15:20:36 -0700387 if (!in_irq())
388 spin_lock_irqsave(&priv->lock, flags);
389 if ( priv->timer.function != NULL &&
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400390 priv->timerType != TLAN_TIMER_ACTIVITY ) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700391 if (!in_irq())
392 spin_unlock_irqrestore(&priv->lock, flags);
393 return;
394 }
395 priv->timer.function = &TLan_Timer;
396 if (!in_irq())
397 spin_unlock_irqrestore(&priv->lock, flags);
398
399 priv->timer.data = (unsigned long) dev;
400 priv->timerSetAt = jiffies;
401 priv->timerType = type;
402 mod_timer(&priv->timer, jiffies + ticks);
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400403
Linus Torvalds1da177e2005-04-16 15:20:36 -0700404} /* TLan_SetTimer */
405
406
407/*****************************************************************************
408******************************************************************************
409
410 ThunderLAN Driver Primary Functions
411
412 These functions are more or less common to all Linux network drivers.
413
414******************************************************************************
415*****************************************************************************/
416
417
418
419
420
421 /***************************************************************
422 * tlan_remove_one
423 *
424 * Returns:
425 * Nothing
426 * Parms:
427 * None
428 *
429 * Goes through the TLanDevices list and frees the device
430 * structs and memory associated with each device (lists
431 * and buffers). It also ureserves the IO port regions
432 * associated with this device.
433 *
434 **************************************************************/
435
436
437static void __devexit tlan_remove_one( struct pci_dev *pdev)
438{
439 struct net_device *dev = pci_get_drvdata( pdev );
440 TLanPrivateInfo *priv = netdev_priv(dev);
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400441
Linus Torvalds1da177e2005-04-16 15:20:36 -0700442 unregister_netdev( dev );
443
444 if ( priv->dmaStorage ) {
445 pci_free_consistent(priv->pciDev, priv->dmaSize, priv->dmaStorage, priv->dmaStorageDMA );
446 }
447
448#ifdef CONFIG_PCI
449 pci_release_regions(pdev);
450#endif
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400451
Linus Torvalds1da177e2005-04-16 15:20:36 -0700452 free_netdev( dev );
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400453
Linus Torvalds1da177e2005-04-16 15:20:36 -0700454 pci_set_drvdata( pdev, NULL );
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400455}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700456
457static struct pci_driver tlan_driver = {
458 .name = "tlan",
459 .id_table = tlan_pci_tbl,
460 .probe = tlan_init_one,
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400461 .remove = __devexit_p(tlan_remove_one),
Linus Torvalds1da177e2005-04-16 15:20:36 -0700462};
463
464static int __init tlan_probe(void)
465{
Leonardo Potenza6c04a512008-02-04 23:47:16 -0800466 int rc = -ENODEV;
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400467
Linus Torvalds1da177e2005-04-16 15:20:36 -0700468 printk(KERN_INFO "%s", tlan_banner);
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400469
Linus Torvalds1da177e2005-04-16 15:20:36 -0700470 TLAN_DBG(TLAN_DEBUG_PROBE, "Starting PCI Probe....\n");
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400471
Linus Torvalds1da177e2005-04-16 15:20:36 -0700472 /* Use new style PCI probing. Now the kernel will
473 do most of this for us */
Leonardo Potenza6c04a512008-02-04 23:47:16 -0800474 rc = pci_register_driver(&tlan_driver);
475
476 if (rc != 0) {
477 printk(KERN_ERR "TLAN: Could not register pci driver.\n");
478 goto err_out_pci_free;
479 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700480
481 TLAN_DBG(TLAN_DEBUG_PROBE, "Starting EISA Probe....\n");
482 TLan_EisaProbe();
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400483
484 printk(KERN_INFO "TLAN: %d device%s installed, PCI: %d EISA: %d\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -0700485 TLanDevicesInstalled, TLanDevicesInstalled == 1 ? "" : "s",
486 tlan_have_pci, tlan_have_eisa);
487
488 if (TLanDevicesInstalled == 0) {
Leonardo Potenza6c04a512008-02-04 23:47:16 -0800489 rc = -ENODEV;
490 goto err_out_pci_unreg;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700491 }
492 return 0;
Leonardo Potenza6c04a512008-02-04 23:47:16 -0800493
494err_out_pci_unreg:
495 pci_unregister_driver(&tlan_driver);
496err_out_pci_free:
Leonardo Potenza6c04a512008-02-04 23:47:16 -0800497 return rc;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700498}
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400499
Linus Torvalds1da177e2005-04-16 15:20:36 -0700500
501static int __devinit tlan_init_one( struct pci_dev *pdev,
502 const struct pci_device_id *ent)
503{
504 return TLan_probe1( pdev, -1, -1, 0, ent);
505}
506
507
508/*
509 ***************************************************************
510 * tlan_probe1
511 *
512 * Returns:
513 * 0 on success, error code on error
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400514 * Parms:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700515 * none
516 *
517 * The name is lower case to fit in with all the rest of
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400518 * the netcard_probe names. This function looks for
Linus Torvalds1da177e2005-04-16 15:20:36 -0700519 * another TLan based adapter, setting it up with the
520 * allocated device struct if one is found.
521 * tlan_probe has been ported to the new net API and
522 * now allocates its own device structure. This function
523 * is also used by modules.
524 *
525 **************************************************************/
526
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400527static int __devinit TLan_probe1(struct pci_dev *pdev,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700528 long ioaddr, int irq, int rev, const struct pci_device_id *ent )
529{
530
531 struct net_device *dev;
532 TLanPrivateInfo *priv;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700533 u16 device_id;
534 int reg, rc = -ENODEV;
535
Adrian Bunkad9f6712006-02-05 00:37:47 +0100536#ifdef CONFIG_PCI
Linus Torvalds1da177e2005-04-16 15:20:36 -0700537 if (pdev) {
538 rc = pci_enable_device(pdev);
539 if (rc)
540 return rc;
541
542 rc = pci_request_regions(pdev, TLanSignature);
543 if (rc) {
544 printk(KERN_ERR "TLAN: Could not reserve IO regions\n");
545 goto err_out;
546 }
547 }
Adrian Bunkad9f6712006-02-05 00:37:47 +0100548#endif /* CONFIG_PCI */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700549
550 dev = alloc_etherdev(sizeof(TLanPrivateInfo));
551 if (dev == NULL) {
552 printk(KERN_ERR "TLAN: Could not allocate memory for device.\n");
553 rc = -ENOMEM;
554 goto err_out_regions;
555 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700556 SET_NETDEV_DEV(dev, &pdev->dev);
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400557
Linus Torvalds1da177e2005-04-16 15:20:36 -0700558 priv = netdev_priv(dev);
559
560 priv->pciDev = pdev;
David Howellsc4028952006-11-22 14:57:56 +0000561 priv->dev = dev;
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400562
Linus Torvalds1da177e2005-04-16 15:20:36 -0700563 /* Is this a PCI device? */
564 if (pdev) {
565 u32 pci_io_base = 0;
566
567 priv->adapter = &board_info[ent->driver_data];
568
Domen Puncer1e7f0bd2005-06-26 18:22:14 -0400569 rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700570 if (rc) {
571 printk(KERN_ERR "TLAN: No suitable PCI mapping available.\n");
572 goto err_out_free_dev;
573 }
574
Linus Torvalds1da177e2005-04-16 15:20:36 -0700575 for ( reg= 0; reg <= 5; reg ++ ) {
576 if (pci_resource_flags(pdev, reg) & IORESOURCE_IO) {
577 pci_io_base = pci_resource_start(pdev, reg);
578 TLAN_DBG( TLAN_DEBUG_GNRL, "IO mapping is available at %x.\n",
579 pci_io_base);
580 break;
581 }
582 }
583 if (!pci_io_base) {
584 printk(KERN_ERR "TLAN: No IO mappings available\n");
585 rc = -EIO;
586 goto err_out_free_dev;
587 }
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400588
Linus Torvalds1da177e2005-04-16 15:20:36 -0700589 dev->base_addr = pci_io_base;
590 dev->irq = pdev->irq;
Auke Kok44c10132007-06-08 15:46:36 -0700591 priv->adapterRev = pdev->revision;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700592 pci_set_master(pdev);
593 pci_set_drvdata(pdev, dev);
594
595 } else { /* EISA card */
596 /* This is a hack. We need to know which board structure
597 * is suited for this adapter */
598 device_id = inw(ioaddr + EISA_ID2);
599 priv->is_eisa = 1;
600 if (device_id == 0x20F1) {
601 priv->adapter = &board_info[13]; /* NetFlex-3/E */
602 priv->adapterRev = 23; /* TLAN 2.3 */
603 } else {
604 priv->adapter = &board_info[14];
605 priv->adapterRev = 10; /* TLAN 1.0 */
606 }
607 dev->base_addr = ioaddr;
608 dev->irq = irq;
609 }
610
611 /* Kernel parameters */
612 if (dev->mem_start) {
613 priv->aui = dev->mem_start & 0x01;
614 priv->duplex = ((dev->mem_start & 0x06) == 0x06) ? 0 : (dev->mem_start & 0x06) >> 1;
615 priv->speed = ((dev->mem_start & 0x18) == 0x18) ? 0 : (dev->mem_start & 0x18) >> 3;
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400616
Linus Torvalds1da177e2005-04-16 15:20:36 -0700617 if (priv->speed == 0x1) {
618 priv->speed = TLAN_SPEED_10;
619 } else if (priv->speed == 0x2) {
620 priv->speed = TLAN_SPEED_100;
621 }
622 debug = priv->debug = dev->mem_end;
623 } else {
624 priv->aui = aui[boards_found];
625 priv->speed = speed[boards_found];
626 priv->duplex = duplex[boards_found];
627 priv->debug = debug;
628 }
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400629
Linus Torvalds1da177e2005-04-16 15:20:36 -0700630 /* This will be used when we get an adapter error from
631 * within our irq handler */
David Howellsc4028952006-11-22 14:57:56 +0000632 INIT_WORK(&priv->tlan_tqueue, TLan_tx_timeout_work);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700633
634 spin_lock_init(&priv->lock);
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400635
Linus Torvalds1da177e2005-04-16 15:20:36 -0700636 rc = TLan_Init(dev);
637 if (rc) {
638 printk(KERN_ERR "TLAN: Could not set up device.\n");
639 goto err_out_free_dev;
640 }
641
642 rc = register_netdev(dev);
643 if (rc) {
644 printk(KERN_ERR "TLAN: Could not register device.\n");
645 goto err_out_uninit;
646 }
647
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400648
Linus Torvalds1da177e2005-04-16 15:20:36 -0700649 TLanDevicesInstalled++;
650 boards_found++;
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400651
Linus Torvalds1da177e2005-04-16 15:20:36 -0700652 /* pdev is NULL if this is an EISA device */
653 if (pdev)
654 tlan_have_pci++;
655 else {
656 priv->nextDevice = TLan_Eisa_Devices;
657 TLan_Eisa_Devices = dev;
658 tlan_have_eisa++;
659 }
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400660
Linus Torvalds1da177e2005-04-16 15:20:36 -0700661 printk(KERN_INFO "TLAN: %s irq=%2d, io=%04x, %s, Rev. %d\n",
662 dev->name,
663 (int) dev->irq,
664 (int) dev->base_addr,
665 priv->adapter->deviceLabel,
666 priv->adapterRev);
667 return 0;
668
669err_out_uninit:
670 pci_free_consistent(priv->pciDev, priv->dmaSize, priv->dmaStorage,
671 priv->dmaStorageDMA );
672err_out_free_dev:
673 free_netdev(dev);
674err_out_regions:
675#ifdef CONFIG_PCI
676 if (pdev)
677 pci_release_regions(pdev);
678#endif
679err_out:
680 if (pdev)
681 pci_disable_device(pdev);
682 return rc;
683}
684
685
686static void TLan_Eisa_Cleanup(void)
687{
688 struct net_device *dev;
689 TLanPrivateInfo *priv;
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400690
Linus Torvalds1da177e2005-04-16 15:20:36 -0700691 while( tlan_have_eisa ) {
692 dev = TLan_Eisa_Devices;
693 priv = netdev_priv(dev);
694 if (priv->dmaStorage) {
695 pci_free_consistent(priv->pciDev, priv->dmaSize, priv->dmaStorage, priv->dmaStorageDMA );
696 }
697 release_region( dev->base_addr, 0x10);
698 unregister_netdev( dev );
699 TLan_Eisa_Devices = priv->nextDevice;
700 free_netdev( dev );
701 tlan_have_eisa--;
702 }
703}
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400704
705
Linus Torvalds1da177e2005-04-16 15:20:36 -0700706static void __exit tlan_exit(void)
707{
708 pci_unregister_driver(&tlan_driver);
709
710 if (tlan_have_eisa)
711 TLan_Eisa_Cleanup();
712
Linus Torvalds1da177e2005-04-16 15:20:36 -0700713}
714
715
716/* Module loading/unloading */
717module_init(tlan_probe);
718module_exit(tlan_exit);
719
720
721
722 /**************************************************************
723 * TLan_EisaProbe
724 *
725 * Returns: 0 on success, 1 otherwise
726 *
727 * Parms: None
728 *
729 *
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400730 * This functions probes for EISA devices and calls
731 * TLan_probe1 when one is found.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700732 *
733 *************************************************************/
734
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400735static void __init TLan_EisaProbe (void)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700736{
737 long ioaddr;
738 int rc = -ENODEV;
739 int irq;
740 u16 device_id;
741
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400742 if (!EISA_bus) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700743 TLAN_DBG(TLAN_DEBUG_PROBE, "No EISA bus present\n");
744 return;
745 }
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400746
Linus Torvalds1da177e2005-04-16 15:20:36 -0700747 /* Loop through all slots of the EISA bus */
748 for (ioaddr = 0x1000; ioaddr < 0x9000; ioaddr += 0x1000) {
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400749
750 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 -0700751 TLAN_DBG(TLAN_DEBUG_PROBE,"EISA_ID 0x%4x: 0x%4x\n", (int) ioaddr + 0xC82, inw(ioaddr + EISA_ID2));
752
753
754 TLAN_DBG(TLAN_DEBUG_PROBE, "Probing for EISA adapter at IO: 0x%4x : ",
755 (int) ioaddr);
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400756 if (request_region(ioaddr, 0x10, TLanSignature) == NULL)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700757 goto out;
758
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400759 if (inw(ioaddr + EISA_ID) != 0x110E) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700760 release_region(ioaddr, 0x10);
761 goto out;
762 }
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400763
Linus Torvalds1da177e2005-04-16 15:20:36 -0700764 device_id = inw(ioaddr + EISA_ID2);
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400765 if (device_id != 0x20F1 && device_id != 0x40F1) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700766 release_region (ioaddr, 0x10);
767 goto out;
768 }
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400769
Linus Torvalds1da177e2005-04-16 15:20:36 -0700770 if (inb(ioaddr + EISA_CR) != 0x1) { /* Check if adapter is enabled */
771 release_region (ioaddr, 0x10);
772 goto out2;
773 }
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400774
775 if (debug == 0x10)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700776 printk("Found one\n");
777
778
779 /* Get irq from board */
780 switch (inb(ioaddr + 0xCC0)) {
781 case(0x10):
782 irq=5;
783 break;
784 case(0x20):
785 irq=9;
786 break;
787 case(0x40):
788 irq=10;
789 break;
790 case(0x80):
791 irq=11;
792 break;
793 default:
794 goto out;
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400795 }
796
797
Linus Torvalds1da177e2005-04-16 15:20:36 -0700798 /* Setup the newly found eisa adapter */
799 rc = TLan_probe1( NULL, ioaddr, irq,
800 12, NULL);
801 continue;
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400802
Linus Torvalds1da177e2005-04-16 15:20:36 -0700803 out:
804 if (debug == 0x10)
805 printk("None found\n");
806 continue;
807
808 out2: if (debug == 0x10)
809 printk("Card found but it is not enabled, skipping\n");
810 continue;
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400811
Linus Torvalds1da177e2005-04-16 15:20:36 -0700812 }
813
814} /* TLan_EisaProbe */
815
816#ifdef CONFIG_NET_POLL_CONTROLLER
817static void TLan_Poll(struct net_device *dev)
818{
819 disable_irq(dev->irq);
David Howells7d12e782006-10-05 14:55:46 +0100820 TLan_HandleInterrupt(dev->irq, dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700821 enable_irq(dev->irq);
822}
823#endif
824
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400825
Linus Torvalds1da177e2005-04-16 15:20:36 -0700826
827
828 /***************************************************************
829 * TLan_Init
830 *
831 * Returns:
832 * 0 on success, error code otherwise.
833 * Parms:
834 * dev The structure of the device to be
835 * init'ed.
836 *
837 * This function completes the initialization of the
838 * device structure and driver. It reserves the IO
839 * addresses, allocates memory for the lists and bounce
840 * buffers, retrieves the MAC address from the eeprom
841 * and assignes the device's methods.
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400842 *
Linus Torvalds1da177e2005-04-16 15:20:36 -0700843 **************************************************************/
844
845static int TLan_Init( struct net_device *dev )
846{
847 int dma_size;
848 int err;
849 int i;
850 TLanPrivateInfo *priv;
851
852 priv = netdev_priv(dev);
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400853
Linus Torvalds1da177e2005-04-16 15:20:36 -0700854 if ( bbuf ) {
855 dma_size = ( TLAN_NUM_RX_LISTS + TLAN_NUM_TX_LISTS )
856 * ( sizeof(TLanList) + TLAN_MAX_FRAME_SIZE );
857 } else {
858 dma_size = ( TLAN_NUM_RX_LISTS + TLAN_NUM_TX_LISTS )
859 * ( sizeof(TLanList) );
860 }
861 priv->dmaStorage = pci_alloc_consistent(priv->pciDev, dma_size, &priv->dmaStorageDMA);
862 priv->dmaSize = dma_size;
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400863
Linus Torvalds1da177e2005-04-16 15:20:36 -0700864 if ( priv->dmaStorage == NULL ) {
865 printk(KERN_ERR "TLAN: Could not allocate lists and buffers for %s.\n",
866 dev->name );
867 return -ENOMEM;
868 }
869 memset( priv->dmaStorage, 0, dma_size );
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400870 priv->rxList = (TLanList *)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700871 ( ( ( (u32) priv->dmaStorage ) + 7 ) & 0xFFFFFFF8 );
872 priv->rxListDMA = ( ( ( (u32) priv->dmaStorageDMA ) + 7 ) & 0xFFFFFFF8 );
873 priv->txList = priv->rxList + TLAN_NUM_RX_LISTS;
874 priv->txListDMA = priv->rxListDMA + sizeof(TLanList) * TLAN_NUM_RX_LISTS;
875 if ( bbuf ) {
876 priv->rxBuffer = (u8 *) ( priv->txList + TLAN_NUM_TX_LISTS );
877 priv->rxBufferDMA =priv->txListDMA + sizeof(TLanList) * TLAN_NUM_TX_LISTS;
878 priv->txBuffer = priv->rxBuffer + ( TLAN_NUM_RX_LISTS * TLAN_MAX_FRAME_SIZE );
879 priv->txBufferDMA = priv->rxBufferDMA + ( TLAN_NUM_RX_LISTS * TLAN_MAX_FRAME_SIZE );
880 }
881
882 err = 0;
883 for ( i = 0; i < 6 ; i++ )
884 err |= TLan_EeReadByte( dev,
885 (u8) priv->adapter->addrOfs + i,
886 (u8 *) &dev->dev_addr[i] );
887 if ( err ) {
888 printk(KERN_ERR "TLAN: %s: Error reading MAC from eeprom: %d\n",
889 dev->name,
890 err );
891 }
892 dev->addr_len = 6;
893
894 netif_carrier_off(dev);
895
896 /* Device methods */
897 dev->open = &TLan_Open;
898 dev->hard_start_xmit = &TLan_StartTx;
899 dev->stop = &TLan_Close;
900 dev->get_stats = &TLan_GetStats;
901 dev->set_multicast_list = &TLan_SetMulticastList;
902 dev->do_ioctl = &TLan_ioctl;
903#ifdef CONFIG_NET_POLL_CONTROLLER
904 dev->poll_controller = &TLan_Poll;
905#endif
906 dev->tx_timeout = &TLan_tx_timeout;
907 dev->watchdog_timeo = TX_TIMEOUT;
908
909 return 0;
910
911} /* TLan_Init */
912
913
914
915
916 /***************************************************************
917 * TLan_Open
918 *
919 * Returns:
920 * 0 on success, error code otherwise.
921 * Parms:
922 * dev Structure of device to be opened.
923 *
924 * This routine puts the driver and TLAN adapter in a
925 * state where it is ready to send and receive packets.
926 * It allocates the IRQ, resets and brings the adapter
927 * out of reset, and allows interrupts. It also delays
928 * the startup for autonegotiation or sends a Rx GO
929 * command to the adapter, as appropriate.
930 *
931 **************************************************************/
932
933static int TLan_Open( struct net_device *dev )
934{
935 TLanPrivateInfo *priv = netdev_priv(dev);
936 int err;
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400937
Linus Torvalds1da177e2005-04-16 15:20:36 -0700938 priv->tlanRev = TLan_DioRead8( dev->base_addr, TLAN_DEF_REVISION );
Thomas Gleixner1fb9df52006-07-01 19:29:39 -0700939 err = request_irq( dev->irq, TLan_HandleInterrupt, IRQF_SHARED, TLanSignature, dev );
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400940
Linus Torvalds1da177e2005-04-16 15:20:36 -0700941 if ( err ) {
942 printk(KERN_ERR "TLAN: Cannot open %s because IRQ %d is already in use.\n", dev->name, dev->irq );
943 return err;
944 }
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400945
Linus Torvalds1da177e2005-04-16 15:20:36 -0700946 init_timer(&priv->timer);
947 netif_start_queue(dev);
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400948
Linus Torvalds1da177e2005-04-16 15:20:36 -0700949 /* NOTE: It might not be necessary to read the stats before a
950 reset if you don't care what the values are.
951 */
952 TLan_ResetLists( dev );
953 TLan_ReadAndClearStats( dev, TLAN_IGNORE );
954 TLan_ResetAdapter( dev );
955
956 TLAN_DBG( TLAN_DEBUG_GNRL, "%s: Opened. TLAN Chip Rev: %x\n", dev->name, priv->tlanRev );
957
958 return 0;
959
960} /* TLan_Open */
961
962
963
964 /**************************************************************
965 * TLan_ioctl
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400966 *
Linus Torvalds1da177e2005-04-16 15:20:36 -0700967 * Returns:
968 * 0 on success, error code otherwise
969 * Params:
970 * dev structure of device to receive ioctl.
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400971 *
Linus Torvalds1da177e2005-04-16 15:20:36 -0700972 * rq ifreq structure to hold userspace data.
973 *
974 * cmd ioctl command.
975 *
976 *
977 *************************************************************/
978
979static int TLan_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
980{
981 TLanPrivateInfo *priv = netdev_priv(dev);
982 struct mii_ioctl_data *data = if_mii(rq);
983 u32 phy = priv->phy[priv->phyNum];
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400984
Linus Torvalds1da177e2005-04-16 15:20:36 -0700985 if (!priv->phyOnline)
986 return -EAGAIN;
987
988 switch(cmd) {
989 case SIOCGMIIPHY: /* Get address of MII PHY in use. */
990 data->phy_id = phy;
991
992
993 case SIOCGMIIREG: /* Read MII PHY register. */
994 TLan_MiiReadReg(dev, data->phy_id & 0x1f, data->reg_num & 0x1f, &data->val_out);
995 return 0;
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400996
Linus Torvalds1da177e2005-04-16 15:20:36 -0700997
998 case SIOCSMIIREG: /* Write MII PHY register. */
999 if (!capable(CAP_NET_ADMIN))
1000 return -EPERM;
1001 TLan_MiiWriteReg(dev, data->phy_id & 0x1f, data->reg_num & 0x1f, data->val_in);
1002 return 0;
1003 default:
1004 return -EOPNOTSUPP;
1005 }
1006} /* tlan_ioctl */
1007
1008
1009 /***************************************************************
1010 * TLan_tx_timeout
1011 *
1012 * Returns: nothing
1013 *
1014 * Params:
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001015 * dev structure of device which timed out
Linus Torvalds1da177e2005-04-16 15:20:36 -07001016 * during transmit.
1017 *
1018 **************************************************************/
1019
1020static void TLan_tx_timeout(struct net_device *dev)
1021{
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001022
Linus Torvalds1da177e2005-04-16 15:20:36 -07001023 TLAN_DBG( TLAN_DEBUG_GNRL, "%s: Transmit timed out.\n", dev->name);
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001024
Linus Torvalds1da177e2005-04-16 15:20:36 -07001025 /* Ok so we timed out, lets see what we can do about it...*/
1026 TLan_FreeLists( dev );
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001027 TLan_ResetLists( dev );
Linus Torvalds1da177e2005-04-16 15:20:36 -07001028 TLan_ReadAndClearStats( dev, TLAN_IGNORE );
1029 TLan_ResetAdapter( dev );
1030 dev->trans_start = jiffies;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001031 netif_wake_queue( dev );
Linus Torvalds1da177e2005-04-16 15:20:36 -07001032
1033}
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001034
Linus Torvalds1da177e2005-04-16 15:20:36 -07001035
David Howellsc4028952006-11-22 14:57:56 +00001036 /***************************************************************
1037 * TLan_tx_timeout_work
1038 *
1039 * Returns: nothing
1040 *
1041 * Params:
1042 * work work item of device which timed out
1043 *
1044 **************************************************************/
1045
1046static void TLan_tx_timeout_work(struct work_struct *work)
1047{
1048 TLanPrivateInfo *priv =
1049 container_of(work, TLanPrivateInfo, tlan_tqueue);
1050
1051 TLan_tx_timeout(priv->dev);
1052}
1053
1054
Linus Torvalds1da177e2005-04-16 15:20:36 -07001055
1056 /***************************************************************
1057 * TLan_StartTx
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001058 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07001059 * Returns:
1060 * 0 on success, non-zero on failure.
1061 * Parms:
1062 * skb A pointer to the sk_buff containing the
1063 * frame to be sent.
1064 * dev The device to send the data on.
1065 *
1066 * This function adds a frame to the Tx list to be sent
1067 * ASAP. First it verifies that the adapter is ready and
1068 * there is room in the queue. Then it sets up the next
1069 * available list, copies the frame to the corresponding
1070 * buffer. If the adapter Tx channel is idle, it gives
1071 * the adapter a Tx Go command on the list, otherwise it
1072 * sets the forward address of the previous list to point
1073 * to this one. Then it frees the sk_buff.
1074 *
1075 **************************************************************/
1076
1077static int TLan_StartTx( struct sk_buff *skb, struct net_device *dev )
1078{
1079 TLanPrivateInfo *priv = netdev_priv(dev);
1080 TLanList *tail_list;
1081 dma_addr_t tail_list_phys;
1082 u8 *tail_buffer;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001083 unsigned long flags;
1084
1085 if ( ! priv->phyOnline ) {
1086 TLAN_DBG( TLAN_DEBUG_TX, "TRANSMIT: %s PHY is not ready\n", dev->name );
1087 dev_kfree_skb_any(skb);
1088 return 0;
1089 }
1090
Stephen Hemminger41873e92008-05-30 09:49:52 -07001091 if (skb_padto(skb, TLAN_MIN_FRAME_SIZE))
1092 return 0;
1093
Linus Torvalds1da177e2005-04-16 15:20:36 -07001094 tail_list = priv->txList + priv->txTail;
1095 tail_list_phys = priv->txListDMA + sizeof(TLanList) * priv->txTail;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001096
Linus Torvalds1da177e2005-04-16 15:20:36 -07001097 if ( tail_list->cStat != TLAN_CSTAT_UNUSED ) {
1098 TLAN_DBG( TLAN_DEBUG_TX, "TRANSMIT: %s is busy (Head=%d Tail=%d)\n", dev->name, priv->txHead, priv->txTail );
1099 netif_stop_queue(dev);
1100 priv->txBusyCount++;
1101 return 1;
1102 }
1103
1104 tail_list->forward = 0;
1105
1106 if ( bbuf ) {
1107 tail_buffer = priv->txBuffer + ( priv->txTail * TLAN_MAX_FRAME_SIZE );
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03001108 skb_copy_from_linear_data(skb, tail_buffer, skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001109 } else {
1110 tail_list->buffer[0].address = pci_map_single(priv->pciDev, skb->data, skb->len, PCI_DMA_TODEVICE);
1111 TLan_StoreSKB(tail_list, skb);
1112 }
1113
Stephen Hemminger41873e92008-05-30 09:49:52 -07001114 tail_list->frameSize = (u16) skb->len;
1115 tail_list->buffer[0].count = TLAN_LAST_BUFFER | (u32) skb->len;
1116 tail_list->buffer[1].count = 0;
1117 tail_list->buffer[1].address = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001118
1119 spin_lock_irqsave(&priv->lock, flags);
1120 tail_list->cStat = TLAN_CSTAT_READY;
1121 if ( ! priv->txInProgress ) {
1122 priv->txInProgress = 1;
1123 TLAN_DBG( TLAN_DEBUG_TX, "TRANSMIT: Starting TX on buffer %d\n", priv->txTail );
1124 outl( tail_list_phys, dev->base_addr + TLAN_CH_PARM );
1125 outl( TLAN_HC_GO, dev->base_addr + TLAN_HOST_CMD );
1126 } else {
1127 TLAN_DBG( TLAN_DEBUG_TX, "TRANSMIT: Adding buffer %d to TX channel\n", priv->txTail );
1128 if ( priv->txTail == 0 ) {
1129 ( priv->txList + ( TLAN_NUM_TX_LISTS - 1 ) )->forward = tail_list_phys;
1130 } else {
1131 ( priv->txList + ( priv->txTail - 1 ) )->forward = tail_list_phys;
1132 }
1133 }
1134 spin_unlock_irqrestore(&priv->lock, flags);
1135
1136 CIRC_INC( priv->txTail, TLAN_NUM_TX_LISTS );
1137
1138 if ( bbuf )
1139 dev_kfree_skb_any(skb);
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001140
Linus Torvalds1da177e2005-04-16 15:20:36 -07001141 dev->trans_start = jiffies;
1142 return 0;
1143
1144} /* TLan_StartTx */
1145
1146
1147
1148
1149 /***************************************************************
1150 * TLan_HandleInterrupt
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001151 *
1152 * Returns:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001153 * Nothing
1154 * Parms:
1155 * irq The line on which the interrupt
1156 * occurred.
1157 * dev_id A pointer to the device assigned to
1158 * this irq line.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001159 *
1160 * This function handles an interrupt generated by its
1161 * assigned TLAN adapter. The function deactivates
1162 * interrupts on its adapter, records the type of
1163 * interrupt, executes the appropriate subhandler, and
1164 * acknowdges the interrupt to the adapter (thus
1165 * re-enabling adapter interrupts.
1166 *
1167 **************************************************************/
1168
David Howells7d12e782006-10-05 14:55:46 +01001169static irqreturn_t TLan_HandleInterrupt(int irq, void *dev_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001170{
1171 u32 ack;
1172 struct net_device *dev;
1173 u32 host_cmd;
1174 u16 host_int;
1175 int type;
1176 TLanPrivateInfo *priv;
1177
1178 dev = dev_id;
1179 priv = netdev_priv(dev);
1180
1181 spin_lock(&priv->lock);
1182
1183 host_int = inw( dev->base_addr + TLAN_HOST_INT );
1184 outw( host_int, dev->base_addr + TLAN_HOST_INT );
1185
1186 type = ( host_int & TLAN_HI_IT_MASK ) >> 2;
1187
1188 ack = TLanIntVector[type]( dev, host_int );
1189
1190 if ( ack ) {
1191 host_cmd = TLAN_HC_ACK | ack | ( type << 18 );
1192 outl( host_cmd, dev->base_addr + TLAN_HOST_CMD );
1193 }
1194
1195 spin_unlock(&priv->lock);
1196
1197 return IRQ_HANDLED;
1198} /* TLan_HandleInterrupts */
1199
1200
1201
1202
1203 /***************************************************************
1204 * TLan_Close
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001205 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07001206 * Returns:
1207 * An error code.
1208 * Parms:
1209 * dev The device structure of the device to
1210 * close.
1211 *
1212 * This function shuts down the adapter. It records any
1213 * stats, puts the adapter into reset state, deactivates
1214 * its time as needed, and frees the irq it is using.
1215 *
1216 **************************************************************/
1217
1218static int TLan_Close(struct net_device *dev)
1219{
1220 TLanPrivateInfo *priv = netdev_priv(dev);
1221
1222 netif_stop_queue(dev);
1223 priv->neg_be_verbose = 0;
1224
1225 TLan_ReadAndClearStats( dev, TLAN_RECORD );
1226 outl( TLAN_HC_AD_RST, dev->base_addr + TLAN_HOST_CMD );
1227 if ( priv->timer.function != NULL ) {
1228 del_timer_sync( &priv->timer );
1229 priv->timer.function = NULL;
1230 }
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001231
Linus Torvalds1da177e2005-04-16 15:20:36 -07001232 free_irq( dev->irq, dev );
1233 TLan_FreeLists( dev );
1234 TLAN_DBG( TLAN_DEBUG_GNRL, "Device %s closed.\n", dev->name );
1235
1236 return 0;
1237
1238} /* TLan_Close */
1239
1240
1241
1242
1243 /***************************************************************
1244 * TLan_GetStats
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001245 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07001246 * Returns:
1247 * A pointer to the device's statistics structure.
1248 * Parms:
1249 * dev The device structure to return the
1250 * stats for.
1251 *
1252 * This function updates the devices statistics by reading
1253 * the TLAN chip's onboard registers. Then it returns the
1254 * address of the statistics structure.
1255 *
1256 **************************************************************/
1257
1258static struct net_device_stats *TLan_GetStats( struct net_device *dev )
1259{
1260 TLanPrivateInfo *priv = netdev_priv(dev);
1261 int i;
1262
1263 /* Should only read stats if open ? */
1264 TLan_ReadAndClearStats( dev, TLAN_RECORD );
1265
1266 TLAN_DBG( TLAN_DEBUG_RX, "RECEIVE: %s EOC count = %d\n", dev->name, priv->rxEocCount );
1267 TLAN_DBG( TLAN_DEBUG_TX, "TRANSMIT: %s Busy count = %d\n", dev->name, priv->txBusyCount );
1268 if ( debug & TLAN_DEBUG_GNRL ) {
1269 TLan_PrintDio( dev->base_addr );
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001270 TLan_PhyPrint( dev );
Linus Torvalds1da177e2005-04-16 15:20:36 -07001271 }
1272 if ( debug & TLAN_DEBUG_LIST ) {
1273 for ( i = 0; i < TLAN_NUM_RX_LISTS; i++ )
1274 TLan_PrintList( priv->rxList + i, "RX", i );
1275 for ( i = 0; i < TLAN_NUM_TX_LISTS; i++ )
1276 TLan_PrintList( priv->txList + i, "TX", i );
1277 }
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001278
Stephen Hemmingerf8f31542008-05-30 09:49:53 -07001279 return &dev->stats;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001280
1281} /* TLan_GetStats */
1282
1283
1284
1285
1286 /***************************************************************
1287 * TLan_SetMulticastList
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001288 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07001289 * Returns:
1290 * Nothing
1291 * Parms:
1292 * dev The device structure to set the
1293 * multicast list for.
1294 *
1295 * This function sets the TLAN adaptor to various receive
1296 * modes. If the IFF_PROMISC flag is set, promiscuous
1297 * mode is acitviated. Otherwise, promiscuous mode is
1298 * turned off. If the IFF_ALLMULTI flag is set, then
1299 * the hash table is set to receive all group addresses.
1300 * Otherwise, the first three multicast addresses are
1301 * stored in AREG_1-3, and the rest are selected via the
1302 * hash table, as necessary.
1303 *
1304 **************************************************************/
1305
1306static void TLan_SetMulticastList( struct net_device *dev )
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001307{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001308 struct dev_mc_list *dmi = dev->mc_list;
1309 u32 hash1 = 0;
1310 u32 hash2 = 0;
1311 int i;
1312 u32 offset;
1313 u8 tmp;
1314
1315 if ( dev->flags & IFF_PROMISC ) {
1316 tmp = TLan_DioRead8( dev->base_addr, TLAN_NET_CMD );
1317 TLan_DioWrite8( dev->base_addr, TLAN_NET_CMD, tmp | TLAN_NET_CMD_CAF );
1318 } else {
1319 tmp = TLan_DioRead8( dev->base_addr, TLAN_NET_CMD );
1320 TLan_DioWrite8( dev->base_addr, TLAN_NET_CMD, tmp & ~TLAN_NET_CMD_CAF );
1321 if ( dev->flags & IFF_ALLMULTI ) {
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001322 for ( i = 0; i < 3; i++ )
Linus Torvalds1da177e2005-04-16 15:20:36 -07001323 TLan_SetMac( dev, i + 1, NULL );
1324 TLan_DioWrite32( dev->base_addr, TLAN_HASH_1, 0xFFFFFFFF );
1325 TLan_DioWrite32( dev->base_addr, TLAN_HASH_2, 0xFFFFFFFF );
1326 } else {
1327 for ( i = 0; i < dev->mc_count; i++ ) {
1328 if ( i < 3 ) {
1329 TLan_SetMac( dev, i + 1, (char *) &dmi->dmi_addr );
1330 } else {
1331 offset = TLan_HashFunc( (u8 *) &dmi->dmi_addr );
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001332 if ( offset < 32 )
Linus Torvalds1da177e2005-04-16 15:20:36 -07001333 hash1 |= ( 1 << offset );
1334 else
1335 hash2 |= ( 1 << ( offset - 32 ) );
1336 }
1337 dmi = dmi->next;
1338 }
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001339 for ( ; i < 3; i++ )
Linus Torvalds1da177e2005-04-16 15:20:36 -07001340 TLan_SetMac( dev, i + 1, NULL );
1341 TLan_DioWrite32( dev->base_addr, TLAN_HASH_1, hash1 );
1342 TLan_DioWrite32( dev->base_addr, TLAN_HASH_2, hash2 );
1343 }
1344 }
1345
1346} /* TLan_SetMulticastList */
1347
1348
1349
1350/*****************************************************************************
1351******************************************************************************
1352
1353 ThunderLAN Driver Interrupt Vectors and Table
1354
1355 Please see Chap. 4, "Interrupt Handling" of the "ThunderLAN
1356 Programmer's Guide" for more informations on handling interrupts
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001357 generated by TLAN based adapters.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001358
1359******************************************************************************
1360*****************************************************************************/
1361
1362
1363 /***************************************************************
1364 * TLan_HandleInvalid
1365 *
1366 * Returns:
1367 * 0
1368 * Parms:
1369 * dev Device assigned the IRQ that was
1370 * raised.
1371 * host_int The contents of the HOST_INT
1372 * port.
1373 *
1374 * This function handles invalid interrupts. This should
1375 * never happen unless some other adapter is trying to use
1376 * the IRQ line assigned to the device.
1377 *
1378 **************************************************************/
1379
Harvey Harrison98e0f522008-02-18 10:04:38 -08001380static u32 TLan_HandleInvalid( struct net_device *dev, u16 host_int )
Linus Torvalds1da177e2005-04-16 15:20:36 -07001381{
1382 /* printk( "TLAN: Invalid interrupt on %s.\n", dev->name ); */
1383 return 0;
1384
1385} /* TLan_HandleInvalid */
1386
1387
1388
1389
1390 /***************************************************************
1391 * TLan_HandleTxEOF
1392 *
1393 * Returns:
1394 * 1
1395 * Parms:
1396 * dev Device assigned the IRQ that was
1397 * raised.
1398 * host_int The contents of the HOST_INT
1399 * port.
1400 *
1401 * This function handles Tx EOF interrupts which are raised
1402 * by the adapter when it has completed sending the
1403 * contents of a buffer. If detemines which list/buffer
1404 * was completed and resets it. If the buffer was the last
1405 * in the channel (EOC), then the function checks to see if
1406 * another buffer is ready to send, and if so, sends a Tx
1407 * Go command. Finally, the driver activates/continues the
1408 * activity LED.
1409 *
1410 **************************************************************/
1411
Harvey Harrison98e0f522008-02-18 10:04:38 -08001412static u32 TLan_HandleTxEOF( struct net_device *dev, u16 host_int )
Linus Torvalds1da177e2005-04-16 15:20:36 -07001413{
1414 TLanPrivateInfo *priv = netdev_priv(dev);
1415 int eoc = 0;
1416 TLanList *head_list;
1417 dma_addr_t head_list_phys;
1418 u32 ack = 0;
1419 u16 tmpCStat;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001420
Linus Torvalds1da177e2005-04-16 15:20:36 -07001421 TLAN_DBG( TLAN_DEBUG_TX, "TRANSMIT: Handling TX EOF (Head=%d Tail=%d)\n", priv->txHead, priv->txTail );
1422 head_list = priv->txList + priv->txHead;
1423
1424 while (((tmpCStat = head_list->cStat ) & TLAN_CSTAT_FRM_CMP) && (ack < 255)) {
1425 ack++;
1426 if ( ! bbuf ) {
1427 struct sk_buff *skb = TLan_GetSKB(head_list);
1428 pci_unmap_single(priv->pciDev, head_list->buffer[0].address, skb->len, PCI_DMA_TODEVICE);
1429 dev_kfree_skb_any(skb);
1430 head_list->buffer[8].address = 0;
1431 head_list->buffer[9].address = 0;
1432 }
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001433
Linus Torvalds1da177e2005-04-16 15:20:36 -07001434 if ( tmpCStat & TLAN_CSTAT_EOC )
1435 eoc = 1;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001436
Stephen Hemmingerf8f31542008-05-30 09:49:53 -07001437 dev->stats.tx_bytes += head_list->frameSize;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001438
1439 head_list->cStat = TLAN_CSTAT_UNUSED;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001440 netif_start_queue(dev);
1441 CIRC_INC( priv->txHead, TLAN_NUM_TX_LISTS );
Linus Torvalds1da177e2005-04-16 15:20:36 -07001442 head_list = priv->txList + priv->txHead;
1443 }
1444
1445 if (!ack)
1446 printk(KERN_INFO "TLAN: Received interrupt for uncompleted TX frame.\n");
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001447
Linus Torvalds1da177e2005-04-16 15:20:36 -07001448 if ( eoc ) {
1449 TLAN_DBG( TLAN_DEBUG_TX, "TRANSMIT: Handling TX EOC (Head=%d Tail=%d)\n", priv->txHead, priv->txTail );
1450 head_list = priv->txList + priv->txHead;
1451 head_list_phys = priv->txListDMA + sizeof(TLanList) * priv->txHead;
1452 if ( ( head_list->cStat & TLAN_CSTAT_READY ) == TLAN_CSTAT_READY ) {
1453 outl(head_list_phys, dev->base_addr + TLAN_CH_PARM );
1454 ack |= TLAN_HC_GO;
1455 } else {
1456 priv->txInProgress = 0;
1457 }
1458 }
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001459
Linus Torvalds1da177e2005-04-16 15:20:36 -07001460 if ( priv->adapter->flags & TLAN_ADAPTER_ACTIVITY_LED ) {
1461 TLan_DioWrite8( dev->base_addr, TLAN_LED_REG, TLAN_LED_LINK | TLAN_LED_ACT );
1462 if ( priv->timer.function == NULL ) {
1463 priv->timer.function = &TLan_Timer;
1464 priv->timer.data = (unsigned long) dev;
1465 priv->timer.expires = jiffies + TLAN_TIMER_ACT_DELAY;
1466 priv->timerSetAt = jiffies;
1467 priv->timerType = TLAN_TIMER_ACTIVITY;
1468 add_timer(&priv->timer);
1469 } else if ( priv->timerType == TLAN_TIMER_ACTIVITY ) {
1470 priv->timerSetAt = jiffies;
1471 }
1472 }
1473
1474 return ack;
1475
1476} /* TLan_HandleTxEOF */
1477
1478
1479
1480
1481 /***************************************************************
1482 * TLan_HandleStatOverflow
1483 *
1484 * Returns:
1485 * 1
1486 * Parms:
1487 * dev Device assigned the IRQ that was
1488 * raised.
1489 * host_int The contents of the HOST_INT
1490 * port.
1491 *
1492 * This function handles the Statistics Overflow interrupt
1493 * which means that one or more of the TLAN statistics
1494 * registers has reached 1/2 capacity and needs to be read.
1495 *
1496 **************************************************************/
1497
Harvey Harrison98e0f522008-02-18 10:04:38 -08001498static u32 TLan_HandleStatOverflow( struct net_device *dev, u16 host_int )
Linus Torvalds1da177e2005-04-16 15:20:36 -07001499{
1500 TLan_ReadAndClearStats( dev, TLAN_RECORD );
1501
1502 return 1;
1503
1504} /* TLan_HandleStatOverflow */
1505
1506
1507
1508
1509 /***************************************************************
1510 * TLan_HandleRxEOF
1511 *
1512 * Returns:
1513 * 1
1514 * Parms:
1515 * dev Device assigned the IRQ that was
1516 * raised.
1517 * host_int The contents of the HOST_INT
1518 * port.
1519 *
1520 * This function handles the Rx EOF interrupt which
1521 * indicates a frame has been received by the adapter from
1522 * the net and the frame has been transferred to memory.
1523 * The function determines the bounce buffer the frame has
1524 * been loaded into, creates a new sk_buff big enough to
1525 * hold the frame, and sends it to protocol stack. It
1526 * then resets the used buffer and appends it to the end
1527 * of the list. If the frame was the last in the Rx
1528 * channel (EOC), the function restarts the receive channel
1529 * by sending an Rx Go command to the adapter. Then it
1530 * activates/continues the activity LED.
1531 *
1532 **************************************************************/
1533
Harvey Harrison98e0f522008-02-18 10:04:38 -08001534static u32 TLan_HandleRxEOF( struct net_device *dev, u16 host_int )
Linus Torvalds1da177e2005-04-16 15:20:36 -07001535{
1536 TLanPrivateInfo *priv = netdev_priv(dev);
1537 u32 ack = 0;
1538 int eoc = 0;
1539 u8 *head_buffer;
1540 TLanList *head_list;
1541 struct sk_buff *skb;
1542 TLanList *tail_list;
1543 void *t;
1544 u32 frameSize;
1545 u16 tmpCStat;
1546 dma_addr_t head_list_phys;
1547
1548 TLAN_DBG( TLAN_DEBUG_RX, "RECEIVE: Handling RX EOF (Head=%d Tail=%d)\n", priv->rxHead, priv->rxTail );
1549 head_list = priv->rxList + priv->rxHead;
1550 head_list_phys = priv->rxListDMA + sizeof(TLanList) * priv->rxHead;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001551
Linus Torvalds1da177e2005-04-16 15:20:36 -07001552 while (((tmpCStat = head_list->cStat) & TLAN_CSTAT_FRM_CMP) && (ack < 255)) {
1553 frameSize = head_list->frameSize;
1554 ack++;
1555 if (tmpCStat & TLAN_CSTAT_EOC)
1556 eoc = 1;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001557
Linus Torvalds1da177e2005-04-16 15:20:36 -07001558 if (bbuf) {
1559 skb = dev_alloc_skb(frameSize + 7);
1560 if (skb == NULL)
1561 printk(KERN_INFO "TLAN: Couldn't allocate memory for received data.\n");
1562 else {
1563 head_buffer = priv->rxBuffer + (priv->rxHead * TLAN_MAX_FRAME_SIZE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001564 skb_reserve(skb, 2);
1565 t = (void *) skb_put(skb, frameSize);
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001566
Stephen Hemmingerf8f31542008-05-30 09:49:53 -07001567 dev->stats.rx_bytes += head_list->frameSize;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001568
1569 memcpy( t, head_buffer, frameSize );
1570 skb->protocol = eth_type_trans( skb, dev );
1571 netif_rx( skb );
1572 }
1573 } else {
1574 struct sk_buff *new_skb;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001575
Linus Torvalds1da177e2005-04-16 15:20:36 -07001576 /*
1577 * I changed the algorithm here. What we now do
1578 * is allocate the new frame. If this fails we
1579 * simply recycle the frame.
1580 */
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001581
Linus Torvalds1da177e2005-04-16 15:20:36 -07001582 new_skb = dev_alloc_skb( TLAN_MAX_FRAME_SIZE + 7 );
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001583
Linus Torvalds1da177e2005-04-16 15:20:36 -07001584 if ( new_skb != NULL ) {
1585 skb = TLan_GetSKB(head_list);
1586 pci_unmap_single(priv->pciDev, head_list->buffer[0].address, TLAN_MAX_FRAME_SIZE, PCI_DMA_FROMDEVICE);
1587 skb_trim( skb, frameSize );
1588
Stephen Hemmingerf8f31542008-05-30 09:49:53 -07001589 dev->stats.rx_bytes += frameSize;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001590
1591 skb->protocol = eth_type_trans( skb, dev );
1592 netif_rx( skb );
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001593
Linus Torvalds1da177e2005-04-16 15:20:36 -07001594 skb_reserve( new_skb, 2 );
1595 t = (void *) skb_put( new_skb, TLAN_MAX_FRAME_SIZE );
1596 head_list->buffer[0].address = pci_map_single(priv->pciDev, new_skb->data, TLAN_MAX_FRAME_SIZE, PCI_DMA_FROMDEVICE);
1597 head_list->buffer[8].address = (u32) t;
1598 TLan_StoreSKB(head_list, new_skb);
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001599 } else
Linus Torvalds1da177e2005-04-16 15:20:36 -07001600 printk(KERN_WARNING "TLAN: Couldn't allocate memory for received data.\n" );
1601 }
1602
1603 head_list->forward = 0;
1604 head_list->cStat = 0;
1605 tail_list = priv->rxList + priv->rxTail;
1606 tail_list->forward = head_list_phys;
1607
1608 CIRC_INC( priv->rxHead, TLAN_NUM_RX_LISTS );
1609 CIRC_INC( priv->rxTail, TLAN_NUM_RX_LISTS );
1610 head_list = priv->rxList + priv->rxHead;
1611 head_list_phys = priv->rxListDMA + sizeof(TLanList) * priv->rxHead;
1612 }
1613
1614 if (!ack)
1615 printk(KERN_INFO "TLAN: Received interrupt for uncompleted RX frame.\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001616
1617
1618
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001619
1620 if ( eoc ) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001621 TLAN_DBG( TLAN_DEBUG_RX, "RECEIVE: Handling RX EOC (Head=%d Tail=%d)\n", priv->rxHead, priv->rxTail );
1622 head_list = priv->rxList + priv->rxHead;
1623 head_list_phys = priv->rxListDMA + sizeof(TLanList) * priv->rxHead;
1624 outl(head_list_phys, dev->base_addr + TLAN_CH_PARM );
1625 ack |= TLAN_HC_GO | TLAN_HC_RT;
1626 priv->rxEocCount++;
1627 }
1628
1629 if ( priv->adapter->flags & TLAN_ADAPTER_ACTIVITY_LED ) {
1630 TLan_DioWrite8( dev->base_addr, TLAN_LED_REG, TLAN_LED_LINK | TLAN_LED_ACT );
1631 if ( priv->timer.function == NULL ) {
1632 priv->timer.function = &TLan_Timer;
1633 priv->timer.data = (unsigned long) dev;
1634 priv->timer.expires = jiffies + TLAN_TIMER_ACT_DELAY;
1635 priv->timerSetAt = jiffies;
1636 priv->timerType = TLAN_TIMER_ACTIVITY;
1637 add_timer(&priv->timer);
1638 } else if ( priv->timerType == TLAN_TIMER_ACTIVITY ) {
1639 priv->timerSetAt = jiffies;
1640 }
1641 }
1642
1643 dev->last_rx = jiffies;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001644
Linus Torvalds1da177e2005-04-16 15:20:36 -07001645 return ack;
1646
1647} /* TLan_HandleRxEOF */
1648
1649
1650
1651
1652 /***************************************************************
1653 * TLan_HandleDummy
1654 *
1655 * Returns:
1656 * 1
1657 * Parms:
1658 * dev Device assigned the IRQ that was
1659 * raised.
1660 * host_int The contents of the HOST_INT
1661 * port.
1662 *
1663 * This function handles the Dummy interrupt, which is
1664 * raised whenever a test interrupt is generated by setting
1665 * the Req_Int bit of HOST_CMD to 1.
1666 *
1667 **************************************************************/
1668
Harvey Harrison98e0f522008-02-18 10:04:38 -08001669static u32 TLan_HandleDummy( struct net_device *dev, u16 host_int )
Linus Torvalds1da177e2005-04-16 15:20:36 -07001670{
1671 printk( "TLAN: Test interrupt on %s.\n", dev->name );
1672 return 1;
1673
1674} /* TLan_HandleDummy */
1675
1676
1677
1678
1679 /***************************************************************
1680 * TLan_HandleTxEOC
1681 *
1682 * Returns:
1683 * 1
1684 * Parms:
1685 * dev Device assigned the IRQ that was
1686 * raised.
1687 * host_int The contents of the HOST_INT
1688 * port.
1689 *
1690 * This driver is structured to determine EOC occurrences by
1691 * reading the CSTAT member of the list structure. Tx EOC
1692 * interrupts are disabled via the DIO INTDIS register.
1693 * However, TLAN chips before revision 3.0 didn't have this
1694 * functionality, so process EOC events if this is the
1695 * case.
1696 *
1697 **************************************************************/
1698
Harvey Harrison98e0f522008-02-18 10:04:38 -08001699static u32 TLan_HandleTxEOC( struct net_device *dev, u16 host_int )
Linus Torvalds1da177e2005-04-16 15:20:36 -07001700{
1701 TLanPrivateInfo *priv = netdev_priv(dev);
1702 TLanList *head_list;
1703 dma_addr_t head_list_phys;
1704 u32 ack = 1;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001705
Linus Torvalds1da177e2005-04-16 15:20:36 -07001706 host_int = 0;
1707 if ( priv->tlanRev < 0x30 ) {
1708 TLAN_DBG( TLAN_DEBUG_TX, "TRANSMIT: Handling TX EOC (Head=%d Tail=%d) -- IRQ\n", priv->txHead, priv->txTail );
1709 head_list = priv->txList + priv->txHead;
1710 head_list_phys = priv->txListDMA + sizeof(TLanList) * priv->txHead;
1711 if ( ( head_list->cStat & TLAN_CSTAT_READY ) == TLAN_CSTAT_READY ) {
1712 netif_stop_queue(dev);
1713 outl( head_list_phys, dev->base_addr + TLAN_CH_PARM );
1714 ack |= TLAN_HC_GO;
1715 } else {
1716 priv->txInProgress = 0;
1717 }
1718 }
1719
1720 return ack;
1721
1722} /* TLan_HandleTxEOC */
1723
1724
1725
1726
1727 /***************************************************************
1728 * TLan_HandleStatusCheck
1729 *
1730 * Returns:
1731 * 0 if Adapter check, 1 if Network Status check.
1732 * Parms:
1733 * dev Device assigned the IRQ that was
1734 * raised.
1735 * host_int The contents of the HOST_INT
1736 * port.
1737 *
1738 * This function handles Adapter Check/Network Status
1739 * interrupts generated by the adapter. It checks the
1740 * vector in the HOST_INT register to determine if it is
1741 * an Adapter Check interrupt. If so, it resets the
1742 * adapter. Otherwise it clears the status registers
1743 * and services the PHY.
1744 *
1745 **************************************************************/
1746
Harvey Harrison98e0f522008-02-18 10:04:38 -08001747static u32 TLan_HandleStatusCheck( struct net_device *dev, u16 host_int )
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001748{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001749 TLanPrivateInfo *priv = netdev_priv(dev);
1750 u32 ack;
1751 u32 error;
1752 u8 net_sts;
1753 u32 phy;
1754 u16 tlphy_ctl;
1755 u16 tlphy_sts;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001756
Linus Torvalds1da177e2005-04-16 15:20:36 -07001757 ack = 1;
1758 if ( host_int & TLAN_HI_IV_MASK ) {
1759 netif_stop_queue( dev );
1760 error = inl( dev->base_addr + TLAN_CH_PARM );
1761 printk( "TLAN: %s: Adaptor Error = 0x%x\n", dev->name, error );
1762 TLan_ReadAndClearStats( dev, TLAN_RECORD );
1763 outl( TLAN_HC_AD_RST, dev->base_addr + TLAN_HOST_CMD );
1764
1765 schedule_work(&priv->tlan_tqueue);
1766
1767 netif_wake_queue(dev);
1768 ack = 0;
1769 } else {
1770 TLAN_DBG( TLAN_DEBUG_GNRL, "%s: Status Check\n", dev->name );
1771 phy = priv->phy[priv->phyNum];
1772
1773 net_sts = TLan_DioRead8( dev->base_addr, TLAN_NET_STS );
1774 if ( net_sts ) {
1775 TLan_DioWrite8( dev->base_addr, TLAN_NET_STS, net_sts );
1776 TLAN_DBG( TLAN_DEBUG_GNRL, "%s: Net_Sts = %x\n", dev->name, (unsigned) net_sts );
1777 }
1778 if ( ( net_sts & TLAN_NET_STS_MIRQ ) && ( priv->phyNum == 0 ) ) {
1779 TLan_MiiReadReg( dev, phy, TLAN_TLPHY_STS, &tlphy_sts );
1780 TLan_MiiReadReg( dev, phy, TLAN_TLPHY_CTL, &tlphy_ctl );
1781 if ( ! ( tlphy_sts & TLAN_TS_POLOK ) && ! ( tlphy_ctl & TLAN_TC_SWAPOL ) ) {
1782 tlphy_ctl |= TLAN_TC_SWAPOL;
1783 TLan_MiiWriteReg( dev, phy, TLAN_TLPHY_CTL, tlphy_ctl);
1784 } else if ( ( tlphy_sts & TLAN_TS_POLOK ) && ( tlphy_ctl & TLAN_TC_SWAPOL ) ) {
1785 tlphy_ctl &= ~TLAN_TC_SWAPOL;
1786 TLan_MiiWriteReg( dev, phy, TLAN_TLPHY_CTL, tlphy_ctl);
1787 }
1788
1789 if (debug) {
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001790 TLan_PhyPrint( dev );
Linus Torvalds1da177e2005-04-16 15:20:36 -07001791 }
1792 }
1793 }
1794
1795 return ack;
1796
1797} /* TLan_HandleStatusCheck */
1798
1799
1800
1801
1802 /***************************************************************
1803 * TLan_HandleRxEOC
1804 *
1805 * Returns:
1806 * 1
1807 * Parms:
1808 * dev Device assigned the IRQ that was
1809 * raised.
1810 * host_int The contents of the HOST_INT
1811 * port.
1812 *
1813 * This driver is structured to determine EOC occurrences by
1814 * reading the CSTAT member of the list structure. Rx EOC
1815 * interrupts are disabled via the DIO INTDIS register.
1816 * However, TLAN chips before revision 3.0 didn't have this
1817 * CSTAT member or a INTDIS register, so if this chip is
1818 * pre-3.0, process EOC interrupts normally.
1819 *
1820 **************************************************************/
1821
Harvey Harrison98e0f522008-02-18 10:04:38 -08001822static u32 TLan_HandleRxEOC( struct net_device *dev, u16 host_int )
Linus Torvalds1da177e2005-04-16 15:20:36 -07001823{
1824 TLanPrivateInfo *priv = netdev_priv(dev);
1825 dma_addr_t head_list_phys;
1826 u32 ack = 1;
1827
1828 if ( priv->tlanRev < 0x30 ) {
1829 TLAN_DBG( TLAN_DEBUG_RX, "RECEIVE: Handling RX EOC (Head=%d Tail=%d) -- IRQ\n", priv->rxHead, priv->rxTail );
1830 head_list_phys = priv->rxListDMA + sizeof(TLanList) * priv->rxHead;
1831 outl( head_list_phys, dev->base_addr + TLAN_CH_PARM );
1832 ack |= TLAN_HC_GO | TLAN_HC_RT;
1833 priv->rxEocCount++;
1834 }
1835
1836 return ack;
1837
1838} /* TLan_HandleRxEOC */
1839
1840
1841
1842
1843/*****************************************************************************
1844******************************************************************************
1845
1846 ThunderLAN Driver Timer Function
1847
1848******************************************************************************
1849*****************************************************************************/
1850
1851
1852 /***************************************************************
1853 * TLan_Timer
1854 *
1855 * Returns:
1856 * Nothing
1857 * Parms:
1858 * data A value given to add timer when
1859 * add_timer was called.
1860 *
1861 * This function handles timed functionality for the
1862 * TLAN driver. The two current timer uses are for
1863 * delaying for autonegotionation and driving the ACT LED.
1864 * - Autonegotiation requires being allowed about
1865 * 2 1/2 seconds before attempting to transmit a
1866 * packet. It would be a very bad thing to hang
1867 * the kernel this long, so the driver doesn't
1868 * allow transmission 'til after this time, for
1869 * certain PHYs. It would be much nicer if all
1870 * PHYs were interrupt-capable like the internal
1871 * PHY.
1872 * - The ACT LED, which shows adapter activity, is
1873 * driven by the driver, and so must be left on
1874 * for a short period to power up the LED so it
1875 * can be seen. This delay can be changed by
1876 * changing the TLAN_TIMER_ACT_DELAY in tlan.h,
1877 * if desired. 100 ms produces a slightly
1878 * sluggish response.
1879 *
1880 **************************************************************/
1881
Harvey Harrison98e0f522008-02-18 10:04:38 -08001882static void TLan_Timer( unsigned long data )
Linus Torvalds1da177e2005-04-16 15:20:36 -07001883{
1884 struct net_device *dev = (struct net_device *) data;
1885 TLanPrivateInfo *priv = netdev_priv(dev);
1886 u32 elapsed;
1887 unsigned long flags = 0;
1888
1889 priv->timer.function = NULL;
1890
1891 switch ( priv->timerType ) {
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001892#ifdef MONITOR
Linus Torvalds1da177e2005-04-16 15:20:36 -07001893 case TLAN_TIMER_LINK_BEAT:
1894 TLan_PhyMonitor( dev );
1895 break;
1896#endif
1897 case TLAN_TIMER_PHY_PDOWN:
1898 TLan_PhyPowerDown( dev );
1899 break;
1900 case TLAN_TIMER_PHY_PUP:
1901 TLan_PhyPowerUp( dev );
1902 break;
1903 case TLAN_TIMER_PHY_RESET:
1904 TLan_PhyReset( dev );
1905 break;
1906 case TLAN_TIMER_PHY_START_LINK:
1907 TLan_PhyStartLink( dev );
1908 break;
1909 case TLAN_TIMER_PHY_FINISH_AN:
1910 TLan_PhyFinishAutoNeg( dev );
1911 break;
1912 case TLAN_TIMER_FINISH_RESET:
1913 TLan_FinishReset( dev );
1914 break;
1915 case TLAN_TIMER_ACTIVITY:
1916 spin_lock_irqsave(&priv->lock, flags);
1917 if ( priv->timer.function == NULL ) {
1918 elapsed = jiffies - priv->timerSetAt;
1919 if ( elapsed >= TLAN_TIMER_ACT_DELAY ) {
1920 TLan_DioWrite8( dev->base_addr, TLAN_LED_REG, TLAN_LED_LINK );
1921 } else {
1922 priv->timer.function = &TLan_Timer;
1923 priv->timer.expires = priv->timerSetAt + TLAN_TIMER_ACT_DELAY;
1924 spin_unlock_irqrestore(&priv->lock, flags);
1925 add_timer( &priv->timer );
1926 break;
1927 }
1928 }
1929 spin_unlock_irqrestore(&priv->lock, flags);
1930 break;
1931 default:
1932 break;
1933 }
1934
1935} /* TLan_Timer */
1936
1937
1938
1939
1940/*****************************************************************************
1941******************************************************************************
1942
1943 ThunderLAN Driver Adapter Related Routines
1944
1945******************************************************************************
1946*****************************************************************************/
1947
1948
1949 /***************************************************************
1950 * TLan_ResetLists
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001951 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07001952 * Returns:
1953 * Nothing
1954 * Parms:
1955 * dev The device structure with the list
1956 * stuctures to be reset.
1957 *
1958 * This routine sets the variables associated with managing
1959 * the TLAN lists to their initial values.
1960 *
1961 **************************************************************/
1962
Harvey Harrison98e0f522008-02-18 10:04:38 -08001963static void TLan_ResetLists( struct net_device *dev )
Linus Torvalds1da177e2005-04-16 15:20:36 -07001964{
1965 TLanPrivateInfo *priv = netdev_priv(dev);
1966 int i;
1967 TLanList *list;
1968 dma_addr_t list_phys;
1969 struct sk_buff *skb;
1970 void *t = NULL;
1971
1972 priv->txHead = 0;
1973 priv->txTail = 0;
1974 for ( i = 0; i < TLAN_NUM_TX_LISTS; i++ ) {
1975 list = priv->txList + i;
1976 list->cStat = TLAN_CSTAT_UNUSED;
1977 if ( bbuf ) {
1978 list->buffer[0].address = priv->txBufferDMA + ( i * TLAN_MAX_FRAME_SIZE );
1979 } else {
1980 list->buffer[0].address = 0;
1981 }
1982 list->buffer[2].count = 0;
1983 list->buffer[2].address = 0;
1984 list->buffer[8].address = 0;
1985 list->buffer[9].address = 0;
1986 }
1987
1988 priv->rxHead = 0;
1989 priv->rxTail = TLAN_NUM_RX_LISTS - 1;
1990 for ( i = 0; i < TLAN_NUM_RX_LISTS; i++ ) {
1991 list = priv->rxList + i;
1992 list_phys = priv->rxListDMA + sizeof(TLanList) * i;
1993 list->cStat = TLAN_CSTAT_READY;
1994 list->frameSize = TLAN_MAX_FRAME_SIZE;
1995 list->buffer[0].count = TLAN_MAX_FRAME_SIZE | TLAN_LAST_BUFFER;
1996 if ( bbuf ) {
1997 list->buffer[0].address = priv->rxBufferDMA + ( i * TLAN_MAX_FRAME_SIZE );
1998 } else {
1999 skb = dev_alloc_skb( TLAN_MAX_FRAME_SIZE + 7 );
2000 if ( skb == NULL ) {
2001 printk( "TLAN: Couldn't allocate memory for received data.\n" );
2002 /* If this ever happened it would be a problem */
2003 } else {
2004 skb->dev = dev;
2005 skb_reserve( skb, 2 );
2006 t = (void *) skb_put( skb, TLAN_MAX_FRAME_SIZE );
2007 }
2008 list->buffer[0].address = pci_map_single(priv->pciDev, t, TLAN_MAX_FRAME_SIZE, PCI_DMA_FROMDEVICE);
2009 list->buffer[8].address = (u32) t;
2010 TLan_StoreSKB(list, skb);
2011 }
2012 list->buffer[1].count = 0;
2013 list->buffer[1].address = 0;
2014 if ( i < TLAN_NUM_RX_LISTS - 1 )
2015 list->forward = list_phys + sizeof(TLanList);
2016 else
2017 list->forward = 0;
2018 }
2019
2020} /* TLan_ResetLists */
2021
2022
Harvey Harrison98e0f522008-02-18 10:04:38 -08002023static void TLan_FreeLists( struct net_device *dev )
Linus Torvalds1da177e2005-04-16 15:20:36 -07002024{
2025 TLanPrivateInfo *priv = netdev_priv(dev);
2026 int i;
2027 TLanList *list;
2028 struct sk_buff *skb;
2029
2030 if ( ! bbuf ) {
2031 for ( i = 0; i < TLAN_NUM_TX_LISTS; i++ ) {
2032 list = priv->txList + i;
2033 skb = TLan_GetSKB(list);
2034 if ( skb ) {
2035 pci_unmap_single(priv->pciDev, list->buffer[0].address, skb->len, PCI_DMA_TODEVICE);
2036 dev_kfree_skb_any( skb );
2037 list->buffer[8].address = 0;
2038 list->buffer[9].address = 0;
2039 }
2040 }
2041
2042 for ( i = 0; i < TLAN_NUM_RX_LISTS; i++ ) {
2043 list = priv->rxList + i;
2044 skb = TLan_GetSKB(list);
2045 if ( skb ) {
2046 pci_unmap_single(priv->pciDev, list->buffer[0].address, TLAN_MAX_FRAME_SIZE, PCI_DMA_FROMDEVICE);
2047 dev_kfree_skb_any( skb );
2048 list->buffer[8].address = 0;
2049 list->buffer[9].address = 0;
2050 }
2051 }
2052 }
2053} /* TLan_FreeLists */
2054
2055
2056
2057
2058 /***************************************************************
2059 * TLan_PrintDio
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002060 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07002061 * Returns:
2062 * Nothing
2063 * Parms:
2064 * io_base Base IO port of the device of
2065 * which to print DIO registers.
2066 *
2067 * This function prints out all the internal (DIO)
2068 * registers of a TLAN chip.
2069 *
2070 **************************************************************/
2071
Harvey Harrison98e0f522008-02-18 10:04:38 -08002072static void TLan_PrintDio( u16 io_base )
Linus Torvalds1da177e2005-04-16 15:20:36 -07002073{
2074 u32 data0, data1;
2075 int i;
2076
2077 printk( "TLAN: Contents of internal registers for io base 0x%04hx.\n", io_base );
2078 printk( "TLAN: Off. +0 +4\n" );
2079 for ( i = 0; i < 0x4C; i+= 8 ) {
2080 data0 = TLan_DioRead32( io_base, i );
2081 data1 = TLan_DioRead32( io_base, i + 0x4 );
2082 printk( "TLAN: 0x%02x 0x%08x 0x%08x\n", i, data0, data1 );
2083 }
2084
2085} /* TLan_PrintDio */
2086
2087
2088
2089
2090 /***************************************************************
2091 * TLan_PrintList
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002092 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07002093 * Returns:
2094 * Nothing
2095 * Parms:
2096 * list A pointer to the TLanList structure to
2097 * be printed.
2098 * type A string to designate type of list,
2099 * "Rx" or "Tx".
2100 * num The index of the list.
2101 *
2102 * This function prints out the contents of the list
2103 * pointed to by the list parameter.
2104 *
2105 **************************************************************/
2106
Harvey Harrison98e0f522008-02-18 10:04:38 -08002107static void TLan_PrintList( TLanList *list, char *type, int num)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002108{
2109 int i;
2110
2111 printk( "TLAN: %s List %d at 0x%08x\n", type, num, (u32) list );
2112 printk( "TLAN: Forward = 0x%08x\n", list->forward );
2113 printk( "TLAN: CSTAT = 0x%04hx\n", list->cStat );
2114 printk( "TLAN: Frame Size = 0x%04hx\n", list->frameSize );
2115 /* for ( i = 0; i < 10; i++ ) { */
2116 for ( i = 0; i < 2; i++ ) {
2117 printk( "TLAN: Buffer[%d].count, addr = 0x%08x, 0x%08x\n", i, list->buffer[i].count, list->buffer[i].address );
2118 }
2119
2120} /* TLan_PrintList */
2121
2122
2123
2124
2125 /***************************************************************
2126 * TLan_ReadAndClearStats
2127 *
2128 * Returns:
2129 * Nothing
2130 * Parms:
2131 * dev Pointer to device structure of adapter
2132 * to which to read stats.
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002133 * record Flag indicating whether to add
Linus Torvalds1da177e2005-04-16 15:20:36 -07002134 *
2135 * This functions reads all the internal status registers
2136 * of the TLAN chip, which clears them as a side effect.
2137 * It then either adds the values to the device's status
2138 * struct, or discards them, depending on whether record
2139 * is TLAN_RECORD (!=0) or TLAN_IGNORE (==0).
2140 *
2141 **************************************************************/
2142
Harvey Harrison98e0f522008-02-18 10:04:38 -08002143static void TLan_ReadAndClearStats( struct net_device *dev, int record )
Linus Torvalds1da177e2005-04-16 15:20:36 -07002144{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002145 u32 tx_good, tx_under;
2146 u32 rx_good, rx_over;
2147 u32 def_tx, crc, code;
2148 u32 multi_col, single_col;
2149 u32 excess_col, late_col, loss;
2150
2151 outw( TLAN_GOOD_TX_FRMS, dev->base_addr + TLAN_DIO_ADR );
2152 tx_good = inb( dev->base_addr + TLAN_DIO_DATA );
2153 tx_good += inb( dev->base_addr + TLAN_DIO_DATA + 1 ) << 8;
2154 tx_good += inb( dev->base_addr + TLAN_DIO_DATA + 2 ) << 16;
2155 tx_under = inb( dev->base_addr + TLAN_DIO_DATA + 3 );
2156
2157 outw( TLAN_GOOD_RX_FRMS, dev->base_addr + TLAN_DIO_ADR );
2158 rx_good = inb( dev->base_addr + TLAN_DIO_DATA );
2159 rx_good += inb( dev->base_addr + TLAN_DIO_DATA + 1 ) << 8;
2160 rx_good += inb( dev->base_addr + TLAN_DIO_DATA + 2 ) << 16;
2161 rx_over = inb( dev->base_addr + TLAN_DIO_DATA + 3 );
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002162
Linus Torvalds1da177e2005-04-16 15:20:36 -07002163 outw( TLAN_DEFERRED_TX, dev->base_addr + TLAN_DIO_ADR );
2164 def_tx = inb( dev->base_addr + TLAN_DIO_DATA );
2165 def_tx += inb( dev->base_addr + TLAN_DIO_DATA + 1 ) << 8;
2166 crc = inb( dev->base_addr + TLAN_DIO_DATA + 2 );
2167 code = inb( dev->base_addr + TLAN_DIO_DATA + 3 );
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002168
Linus Torvalds1da177e2005-04-16 15:20:36 -07002169 outw( TLAN_MULTICOL_FRMS, dev->base_addr + TLAN_DIO_ADR );
2170 multi_col = inb( dev->base_addr + TLAN_DIO_DATA );
2171 multi_col += inb( dev->base_addr + TLAN_DIO_DATA + 1 ) << 8;
2172 single_col = inb( dev->base_addr + TLAN_DIO_DATA + 2 );
2173 single_col += inb( dev->base_addr + TLAN_DIO_DATA + 3 ) << 8;
2174
2175 outw( TLAN_EXCESSCOL_FRMS, dev->base_addr + TLAN_DIO_ADR );
2176 excess_col = inb( dev->base_addr + TLAN_DIO_DATA );
2177 late_col = inb( dev->base_addr + TLAN_DIO_DATA + 1 );
2178 loss = inb( dev->base_addr + TLAN_DIO_DATA + 2 );
2179
2180 if ( record ) {
Stephen Hemmingerf8f31542008-05-30 09:49:53 -07002181 dev->stats.rx_packets += rx_good;
2182 dev->stats.rx_errors += rx_over + crc + code;
2183 dev->stats.tx_packets += tx_good;
2184 dev->stats.tx_errors += tx_under + loss;
2185 dev->stats.collisions += multi_col + single_col + excess_col + late_col;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002186
Stephen Hemmingerf8f31542008-05-30 09:49:53 -07002187 dev->stats.rx_over_errors += rx_over;
2188 dev->stats.rx_crc_errors += crc;
2189 dev->stats.rx_frame_errors += code;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002190
Stephen Hemmingerf8f31542008-05-30 09:49:53 -07002191 dev->stats.tx_aborted_errors += tx_under;
2192 dev->stats.tx_carrier_errors += loss;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002193 }
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002194
Linus Torvalds1da177e2005-04-16 15:20:36 -07002195} /* TLan_ReadAndClearStats */
2196
2197
2198
2199
2200 /***************************************************************
2201 * TLan_Reset
2202 *
2203 * Returns:
2204 * 0
2205 * Parms:
2206 * dev Pointer to device structure of adapter
2207 * to be reset.
2208 *
2209 * This function resets the adapter and it's physical
2210 * device. See Chap. 3, pp. 9-10 of the "ThunderLAN
2211 * Programmer's Guide" for details. The routine tries to
2212 * implement what is detailed there, though adjustments
2213 * have been made.
2214 *
2215 **************************************************************/
2216
Harvey Harrison98e0f522008-02-18 10:04:38 -08002217static void
Linus Torvalds1da177e2005-04-16 15:20:36 -07002218TLan_ResetAdapter( struct net_device *dev )
2219{
2220 TLanPrivateInfo *priv = netdev_priv(dev);
2221 int i;
2222 u32 addr;
2223 u32 data;
2224 u8 data8;
2225
2226 priv->tlanFullDuplex = FALSE;
2227 priv->phyOnline=0;
2228 netif_carrier_off(dev);
2229
2230/* 1. Assert reset bit. */
2231
2232 data = inl(dev->base_addr + TLAN_HOST_CMD);
2233 data |= TLAN_HC_AD_RST;
2234 outl(data, dev->base_addr + TLAN_HOST_CMD);
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002235
Linus Torvalds1da177e2005-04-16 15:20:36 -07002236 udelay(1000);
2237
2238/* 2. Turn off interrupts. ( Probably isn't necessary ) */
2239
2240 data = inl(dev->base_addr + TLAN_HOST_CMD);
2241 data |= TLAN_HC_INT_OFF;
2242 outl(data, dev->base_addr + TLAN_HOST_CMD);
2243
2244/* 3. Clear AREGs and HASHs. */
2245
2246 for ( i = TLAN_AREG_0; i <= TLAN_HASH_2; i += 4 ) {
2247 TLan_DioWrite32( dev->base_addr, (u16) i, 0 );
2248 }
2249
2250/* 4. Setup NetConfig register. */
2251
2252 data = TLAN_NET_CFG_1FRAG | TLAN_NET_CFG_1CHAN | TLAN_NET_CFG_PHY_EN;
2253 TLan_DioWrite16( dev->base_addr, TLAN_NET_CONFIG, (u16) data );
2254
2255/* 5. Load Ld_Tmr and Ld_Thr in HOST_CMD. */
2256
2257 outl( TLAN_HC_LD_TMR | 0x3f, dev->base_addr + TLAN_HOST_CMD );
2258 outl( TLAN_HC_LD_THR | 0x9, dev->base_addr + TLAN_HOST_CMD );
2259
2260/* 6. Unreset the MII by setting NMRST (in NetSio) to 1. */
2261
2262 outw( TLAN_NET_SIO, dev->base_addr + TLAN_DIO_ADR );
2263 addr = dev->base_addr + TLAN_DIO_DATA + TLAN_NET_SIO;
2264 TLan_SetBit( TLAN_NET_SIO_NMRST, addr );
2265
2266/* 7. Setup the remaining registers. */
2267
2268 if ( priv->tlanRev >= 0x30 ) {
2269 data8 = TLAN_ID_TX_EOC | TLAN_ID_RX_EOC;
2270 TLan_DioWrite8( dev->base_addr, TLAN_INT_DIS, data8 );
2271 }
2272 TLan_PhyDetect( dev );
2273 data = TLAN_NET_CFG_1FRAG | TLAN_NET_CFG_1CHAN;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002274
Linus Torvalds1da177e2005-04-16 15:20:36 -07002275 if ( priv->adapter->flags & TLAN_ADAPTER_BIT_RATE_PHY ) {
2276 data |= TLAN_NET_CFG_BIT;
2277 if ( priv->aui == 1 ) {
2278 TLan_DioWrite8( dev->base_addr, TLAN_ACOMMIT, 0x0a );
2279 } else if ( priv->duplex == TLAN_DUPLEX_FULL ) {
2280 TLan_DioWrite8( dev->base_addr, TLAN_ACOMMIT, 0x00 );
2281 priv->tlanFullDuplex = TRUE;
2282 } else {
2283 TLan_DioWrite8( dev->base_addr, TLAN_ACOMMIT, 0x08 );
2284 }
2285 }
2286
2287 if ( priv->phyNum == 0 ) {
2288 data |= TLAN_NET_CFG_PHY_EN;
2289 }
2290 TLan_DioWrite16( dev->base_addr, TLAN_NET_CONFIG, (u16) data );
2291
2292 if ( priv->adapter->flags & TLAN_ADAPTER_UNMANAGED_PHY ) {
2293 TLan_FinishReset( dev );
2294 } else {
2295 TLan_PhyPowerDown( dev );
2296 }
2297
2298} /* TLan_ResetAdapter */
2299
2300
2301
2302
Harvey Harrison98e0f522008-02-18 10:04:38 -08002303static void
Linus Torvalds1da177e2005-04-16 15:20:36 -07002304TLan_FinishReset( struct net_device *dev )
2305{
2306 TLanPrivateInfo *priv = netdev_priv(dev);
2307 u8 data;
2308 u32 phy;
2309 u8 sio;
2310 u16 status;
2311 u16 partner;
2312 u16 tlphy_ctl;
2313 u16 tlphy_par;
2314 u16 tlphy_id1, tlphy_id2;
2315 int i;
2316
2317 phy = priv->phy[priv->phyNum];
2318
2319 data = TLAN_NET_CMD_NRESET | TLAN_NET_CMD_NWRAP;
2320 if ( priv->tlanFullDuplex ) {
2321 data |= TLAN_NET_CMD_DUPLEX;
2322 }
2323 TLan_DioWrite8( dev->base_addr, TLAN_NET_CMD, data );
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002324 data = TLAN_NET_MASK_MASK4 | TLAN_NET_MASK_MASK5;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002325 if ( priv->phyNum == 0 ) {
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002326 data |= TLAN_NET_MASK_MASK7;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002327 }
2328 TLan_DioWrite8( dev->base_addr, TLAN_NET_MASK, data );
2329 TLan_DioWrite16( dev->base_addr, TLAN_MAX_RX, ((1536)+7)&~7 );
2330 TLan_MiiReadReg( dev, phy, MII_GEN_ID_HI, &tlphy_id1 );
2331 TLan_MiiReadReg( dev, phy, MII_GEN_ID_LO, &tlphy_id2 );
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002332
Linus Torvalds1da177e2005-04-16 15:20:36 -07002333 if ( ( priv->adapter->flags & TLAN_ADAPTER_UNMANAGED_PHY ) || ( priv->aui ) ) {
2334 status = MII_GS_LINK;
2335 printk( "TLAN: %s: Link forced.\n", dev->name );
2336 } else {
2337 TLan_MiiReadReg( dev, phy, MII_GEN_STS, &status );
2338 udelay( 1000 );
2339 TLan_MiiReadReg( dev, phy, MII_GEN_STS, &status );
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002340 if ( (status & MII_GS_LINK) && /* We only support link info on Nat.Sem. PHY's */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002341 (tlphy_id1 == NAT_SEM_ID1) &&
2342 (tlphy_id2 == NAT_SEM_ID2) ) {
2343 TLan_MiiReadReg( dev, phy, MII_AN_LPA, &partner );
2344 TLan_MiiReadReg( dev, phy, TLAN_TLPHY_PAR, &tlphy_par );
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002345
Linus Torvalds1da177e2005-04-16 15:20:36 -07002346 printk( "TLAN: %s: Link active with ", dev->name );
2347 if (!(tlphy_par & TLAN_PHY_AN_EN_STAT)) {
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002348 printk( "forced 10%sMbps %s-Duplex\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07002349 tlphy_par & TLAN_PHY_SPEED_100 ? "" : "0",
2350 tlphy_par & TLAN_PHY_DUPLEX_FULL ? "Full" : "Half");
2351 } else {
2352 printk( "AutoNegotiation enabled, at 10%sMbps %s-Duplex\n",
2353 tlphy_par & TLAN_PHY_SPEED_100 ? "" : "0",
2354 tlphy_par & TLAN_PHY_DUPLEX_FULL ? "Full" : "Half");
2355 printk("TLAN: Partner capability: ");
2356 for (i = 5; i <= 10; i++)
2357 if (partner & (1<<i))
2358 printk("%s",media[i-5]);
2359 printk("\n");
2360 }
2361
2362 TLan_DioWrite8( dev->base_addr, TLAN_LED_REG, TLAN_LED_LINK );
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002363#ifdef MONITOR
Linus Torvalds1da177e2005-04-16 15:20:36 -07002364 /* We have link beat..for now anyway */
2365 priv->link = 1;
2366 /*Enabling link beat monitoring */
2367 TLan_SetTimer( dev, (10*HZ), TLAN_TIMER_LINK_BEAT );
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002368#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07002369 } else if (status & MII_GS_LINK) {
2370 printk( "TLAN: %s: Link active\n", dev->name );
2371 TLan_DioWrite8( dev->base_addr, TLAN_LED_REG, TLAN_LED_LINK );
2372 }
2373 }
2374
2375 if ( priv->phyNum == 0 ) {
2376 TLan_MiiReadReg( dev, phy, TLAN_TLPHY_CTL, &tlphy_ctl );
2377 tlphy_ctl |= TLAN_TC_INTEN;
2378 TLan_MiiWriteReg( dev, phy, TLAN_TLPHY_CTL, tlphy_ctl );
2379 sio = TLan_DioRead8( dev->base_addr, TLAN_NET_SIO );
2380 sio |= TLAN_NET_SIO_MINTEN;
2381 TLan_DioWrite8( dev->base_addr, TLAN_NET_SIO, sio );
2382 }
2383
2384 if ( status & MII_GS_LINK ) {
2385 TLan_SetMac( dev, 0, dev->dev_addr );
2386 priv->phyOnline = 1;
2387 outb( ( TLAN_HC_INT_ON >> 8 ), dev->base_addr + TLAN_HOST_CMD + 1 );
2388 if ( debug >= 1 && debug != TLAN_DEBUG_PROBE ) {
2389 outb( ( TLAN_HC_REQ_INT >> 8 ), dev->base_addr + TLAN_HOST_CMD + 1 );
2390 }
2391 outl( priv->rxListDMA, dev->base_addr + TLAN_CH_PARM );
2392 outl( TLAN_HC_GO | TLAN_HC_RT, dev->base_addr + TLAN_HOST_CMD );
2393 netif_carrier_on(dev);
2394 } else {
2395 printk( "TLAN: %s: Link inactive, will retry in 10 secs...\n", dev->name );
2396 TLan_SetTimer( dev, (10*HZ), TLAN_TIMER_FINISH_RESET );
2397 return;
2398 }
James Harper562faf42005-05-05 15:14:18 -07002399 TLan_SetMulticastList(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002400
2401} /* TLan_FinishReset */
2402
2403
2404
2405
2406 /***************************************************************
2407 * TLan_SetMac
2408 *
2409 * Returns:
2410 * Nothing
2411 * Parms:
2412 * dev Pointer to device structure of adapter
2413 * on which to change the AREG.
2414 * areg The AREG to set the address in (0 - 3).
2415 * mac A pointer to an array of chars. Each
2416 * element stores one byte of the address.
2417 * IE, it isn't in ascii.
2418 *
2419 * This function transfers a MAC address to one of the
2420 * TLAN AREGs (address registers). The TLAN chip locks
2421 * the register on writing to offset 0 and unlocks the
2422 * register after writing to offset 5. If NULL is passed
2423 * in mac, then the AREG is filled with 0's.
2424 *
2425 **************************************************************/
2426
Harvey Harrison98e0f522008-02-18 10:04:38 -08002427static void TLan_SetMac( struct net_device *dev, int areg, char *mac )
Linus Torvalds1da177e2005-04-16 15:20:36 -07002428{
2429 int i;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002430
Linus Torvalds1da177e2005-04-16 15:20:36 -07002431 areg *= 6;
2432
2433 if ( mac != NULL ) {
2434 for ( i = 0; i < 6; i++ )
2435 TLan_DioWrite8( dev->base_addr, TLAN_AREG_0 + areg + i, mac[i] );
2436 } else {
2437 for ( i = 0; i < 6; i++ )
2438 TLan_DioWrite8( dev->base_addr, TLAN_AREG_0 + areg + i, 0 );
2439 }
2440
2441} /* TLan_SetMac */
2442
2443
2444
2445
2446/*****************************************************************************
2447******************************************************************************
2448
2449 ThunderLAN Driver PHY Layer Routines
2450
2451******************************************************************************
2452*****************************************************************************/
2453
2454
2455
2456 /*********************************************************************
2457 * TLan_PhyPrint
2458 *
2459 * Returns:
2460 * Nothing
2461 * Parms:
2462 * dev A pointer to the device structure of the
2463 * TLAN device having the PHYs to be detailed.
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002464 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07002465 * This function prints the registers a PHY (aka transceiver).
2466 *
2467 ********************************************************************/
2468
Harvey Harrison98e0f522008-02-18 10:04:38 -08002469static void TLan_PhyPrint( struct net_device *dev )
Linus Torvalds1da177e2005-04-16 15:20:36 -07002470{
2471 TLanPrivateInfo *priv = netdev_priv(dev);
2472 u16 i, data0, data1, data2, data3, phy;
2473
2474 phy = priv->phy[priv->phyNum];
2475
2476 if ( priv->adapter->flags & TLAN_ADAPTER_UNMANAGED_PHY ) {
2477 printk( "TLAN: Device %s, Unmanaged PHY.\n", dev->name );
2478 } else if ( phy <= TLAN_PHY_MAX_ADDR ) {
2479 printk( "TLAN: Device %s, PHY 0x%02x.\n", dev->name, phy );
2480 printk( "TLAN: Off. +0 +1 +2 +3 \n" );
2481 for ( i = 0; i < 0x20; i+= 4 ) {
2482 printk( "TLAN: 0x%02x", i );
2483 TLan_MiiReadReg( dev, phy, i, &data0 );
2484 printk( " 0x%04hx", data0 );
2485 TLan_MiiReadReg( dev, phy, i + 1, &data1 );
2486 printk( " 0x%04hx", data1 );
2487 TLan_MiiReadReg( dev, phy, i + 2, &data2 );
2488 printk( " 0x%04hx", data2 );
2489 TLan_MiiReadReg( dev, phy, i + 3, &data3 );
2490 printk( " 0x%04hx\n", data3 );
2491 }
2492 } else {
2493 printk( "TLAN: Device %s, Invalid PHY.\n", dev->name );
2494 }
2495
2496} /* TLan_PhyPrint */
2497
2498
2499
2500
2501 /*********************************************************************
2502 * TLan_PhyDetect
2503 *
2504 * Returns:
2505 * Nothing
2506 * Parms:
2507 * dev A pointer to the device structure of the adapter
2508 * for which the PHY needs determined.
2509 *
2510 * So far I've found that adapters which have external PHYs
2511 * may also use the internal PHY for part of the functionality.
2512 * (eg, AUI/Thinnet). This function finds out if this TLAN
2513 * chip has an internal PHY, and then finds the first external
2514 * PHY (starting from address 0) if it exists).
2515 *
2516 ********************************************************************/
2517
Harvey Harrison98e0f522008-02-18 10:04:38 -08002518static void TLan_PhyDetect( struct net_device *dev )
Linus Torvalds1da177e2005-04-16 15:20:36 -07002519{
2520 TLanPrivateInfo *priv = netdev_priv(dev);
2521 u16 control;
2522 u16 hi;
2523 u16 lo;
2524 u32 phy;
2525
2526 if ( priv->adapter->flags & TLAN_ADAPTER_UNMANAGED_PHY ) {
2527 priv->phyNum = 0xFFFF;
2528 return;
2529 }
2530
2531 TLan_MiiReadReg( dev, TLAN_PHY_MAX_ADDR, MII_GEN_ID_HI, &hi );
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002532
Linus Torvalds1da177e2005-04-16 15:20:36 -07002533 if ( hi != 0xFFFF ) {
2534 priv->phy[0] = TLAN_PHY_MAX_ADDR;
2535 } else {
2536 priv->phy[0] = TLAN_PHY_NONE;
2537 }
2538
2539 priv->phy[1] = TLAN_PHY_NONE;
2540 for ( phy = 0; phy <= TLAN_PHY_MAX_ADDR; phy++ ) {
2541 TLan_MiiReadReg( dev, phy, MII_GEN_CTL, &control );
2542 TLan_MiiReadReg( dev, phy, MII_GEN_ID_HI, &hi );
2543 TLan_MiiReadReg( dev, phy, MII_GEN_ID_LO, &lo );
2544 if ( ( control != 0xFFFF ) || ( hi != 0xFFFF ) || ( lo != 0xFFFF ) ) {
2545 TLAN_DBG( TLAN_DEBUG_GNRL, "PHY found at %02x %04x %04x %04x\n", phy, control, hi, lo );
2546 if ( ( priv->phy[1] == TLAN_PHY_NONE ) && ( phy != TLAN_PHY_MAX_ADDR ) ) {
2547 priv->phy[1] = phy;
2548 }
2549 }
2550 }
2551
2552 if ( priv->phy[1] != TLAN_PHY_NONE ) {
2553 priv->phyNum = 1;
2554 } else if ( priv->phy[0] != TLAN_PHY_NONE ) {
2555 priv->phyNum = 0;
2556 } else {
2557 printk( "TLAN: Cannot initialize device, no PHY was found!\n" );
2558 }
2559
2560} /* TLan_PhyDetect */
2561
2562
2563
2564
Harvey Harrison98e0f522008-02-18 10:04:38 -08002565static void TLan_PhyPowerDown( struct net_device *dev )
Linus Torvalds1da177e2005-04-16 15:20:36 -07002566{
2567 TLanPrivateInfo *priv = netdev_priv(dev);
2568 u16 value;
2569
2570 TLAN_DBG( TLAN_DEBUG_GNRL, "%s: Powering down PHY(s).\n", dev->name );
2571 value = MII_GC_PDOWN | MII_GC_LOOPBK | MII_GC_ISOLATE;
2572 TLan_MiiSync( dev->base_addr );
2573 TLan_MiiWriteReg( dev, priv->phy[priv->phyNum], MII_GEN_CTL, value );
2574 if ( ( priv->phyNum == 0 ) && ( priv->phy[1] != TLAN_PHY_NONE ) && ( ! ( priv->adapter->flags & TLAN_ADAPTER_USE_INTERN_10 ) ) ) {
2575 TLan_MiiSync( dev->base_addr );
2576 TLan_MiiWriteReg( dev, priv->phy[1], MII_GEN_CTL, value );
2577 }
2578
2579 /* Wait for 50 ms and powerup
2580 * This is abitrary. It is intended to make sure the
2581 * transceiver settles.
2582 */
2583 TLan_SetTimer( dev, (HZ/20), TLAN_TIMER_PHY_PUP );
2584
2585} /* TLan_PhyPowerDown */
2586
2587
2588
2589
Harvey Harrison98e0f522008-02-18 10:04:38 -08002590static void TLan_PhyPowerUp( struct net_device *dev )
Linus Torvalds1da177e2005-04-16 15:20:36 -07002591{
2592 TLanPrivateInfo *priv = netdev_priv(dev);
2593 u16 value;
2594
2595 TLAN_DBG( TLAN_DEBUG_GNRL, "%s: Powering up PHY.\n", dev->name );
2596 TLan_MiiSync( dev->base_addr );
2597 value = MII_GC_LOOPBK;
2598 TLan_MiiWriteReg( dev, priv->phy[priv->phyNum], MII_GEN_CTL, value );
2599 TLan_MiiSync(dev->base_addr);
2600 /* Wait for 500 ms and reset the
2601 * transceiver. The TLAN docs say both 50 ms and
2602 * 500 ms, so do the longer, just in case.
2603 */
2604 TLan_SetTimer( dev, (HZ/20), TLAN_TIMER_PHY_RESET );
2605
2606} /* TLan_PhyPowerUp */
2607
2608
2609
2610
Harvey Harrison98e0f522008-02-18 10:04:38 -08002611static void TLan_PhyReset( struct net_device *dev )
Linus Torvalds1da177e2005-04-16 15:20:36 -07002612{
2613 TLanPrivateInfo *priv = netdev_priv(dev);
2614 u16 phy;
2615 u16 value;
2616
2617 phy = priv->phy[priv->phyNum];
2618
2619 TLAN_DBG( TLAN_DEBUG_GNRL, "%s: Reseting PHY.\n", dev->name );
2620 TLan_MiiSync( dev->base_addr );
2621 value = MII_GC_LOOPBK | MII_GC_RESET;
2622 TLan_MiiWriteReg( dev, phy, MII_GEN_CTL, value );
2623 TLan_MiiReadReg( dev, phy, MII_GEN_CTL, &value );
2624 while ( value & MII_GC_RESET ) {
2625 TLan_MiiReadReg( dev, phy, MII_GEN_CTL, &value );
2626 }
2627
2628 /* Wait for 500 ms and initialize.
2629 * I don't remember why I wait this long.
2630 * I've changed this to 50ms, as it seems long enough.
2631 */
2632 TLan_SetTimer( dev, (HZ/20), TLAN_TIMER_PHY_START_LINK );
2633
2634} /* TLan_PhyReset */
2635
2636
2637
2638
Harvey Harrison98e0f522008-02-18 10:04:38 -08002639static void TLan_PhyStartLink( struct net_device *dev )
Linus Torvalds1da177e2005-04-16 15:20:36 -07002640{
2641 TLanPrivateInfo *priv = netdev_priv(dev);
2642 u16 ability;
2643 u16 control;
2644 u16 data;
2645 u16 phy;
2646 u16 status;
2647 u16 tctl;
2648
2649 phy = priv->phy[priv->phyNum];
2650 TLAN_DBG( TLAN_DEBUG_GNRL, "%s: Trying to activate link.\n", dev->name );
2651 TLan_MiiReadReg( dev, phy, MII_GEN_STS, &status );
2652 TLan_MiiReadReg( dev, phy, MII_GEN_STS, &ability );
2653
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002654 if ( ( status & MII_GS_AUTONEG ) &&
Linus Torvalds1da177e2005-04-16 15:20:36 -07002655 ( ! priv->aui ) ) {
2656 ability = status >> 11;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002657 if ( priv->speed == TLAN_SPEED_10 &&
Linus Torvalds1da177e2005-04-16 15:20:36 -07002658 priv->duplex == TLAN_DUPLEX_HALF) {
2659 TLan_MiiWriteReg( dev, phy, MII_GEN_CTL, 0x0000);
2660 } else if ( priv->speed == TLAN_SPEED_10 &&
2661 priv->duplex == TLAN_DUPLEX_FULL) {
2662 priv->tlanFullDuplex = TRUE;
2663 TLan_MiiWriteReg( dev, phy, MII_GEN_CTL, 0x0100);
2664 } else if ( priv->speed == TLAN_SPEED_100 &&
2665 priv->duplex == TLAN_DUPLEX_HALF) {
2666 TLan_MiiWriteReg( dev, phy, MII_GEN_CTL, 0x2000);
2667 } else if ( priv->speed == TLAN_SPEED_100 &&
2668 priv->duplex == TLAN_DUPLEX_FULL) {
2669 priv->tlanFullDuplex = TRUE;
2670 TLan_MiiWriteReg( dev, phy, MII_GEN_CTL, 0x2100);
2671 } else {
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002672
Linus Torvalds1da177e2005-04-16 15:20:36 -07002673 /* Set Auto-Neg advertisement */
2674 TLan_MiiWriteReg( dev, phy, MII_AN_ADV, (ability << 5) | 1);
2675 /* Enablee Auto-Neg */
2676 TLan_MiiWriteReg( dev, phy, MII_GEN_CTL, 0x1000 );
2677 /* Restart Auto-Neg */
2678 TLan_MiiWriteReg( dev, phy, MII_GEN_CTL, 0x1200 );
2679 /* Wait for 4 sec for autonegotiation
2680 * to complete. The max spec time is less than this
2681 * but the card need additional time to start AN.
2682 * .5 sec should be plenty extra.
2683 */
2684 printk( "TLAN: %s: Starting autonegotiation.\n", dev->name );
2685 TLan_SetTimer( dev, (2*HZ), TLAN_TIMER_PHY_FINISH_AN );
2686 return;
2687 }
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002688
2689 }
2690
Linus Torvalds1da177e2005-04-16 15:20:36 -07002691 if ( ( priv->aui ) && ( priv->phyNum != 0 ) ) {
2692 priv->phyNum = 0;
2693 data = TLAN_NET_CFG_1FRAG | TLAN_NET_CFG_1CHAN | TLAN_NET_CFG_PHY_EN;
2694 TLan_DioWrite16( dev->base_addr, TLAN_NET_CONFIG, data );
2695 TLan_SetTimer( dev, (40*HZ/1000), TLAN_TIMER_PHY_PDOWN );
2696 return;
2697 } else if ( priv->phyNum == 0 ) {
2698 control = 0;
2699 TLan_MiiReadReg( dev, phy, TLAN_TLPHY_CTL, &tctl );
2700 if ( priv->aui ) {
2701 tctl |= TLAN_TC_AUISEL;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002702 } else {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002703 tctl &= ~TLAN_TC_AUISEL;
2704 if ( priv->duplex == TLAN_DUPLEX_FULL ) {
2705 control |= MII_GC_DUPLEX;
2706 priv->tlanFullDuplex = TRUE;
2707 }
2708 if ( priv->speed == TLAN_SPEED_100 ) {
2709 control |= MII_GC_SPEEDSEL;
2710 }
2711 }
2712 TLan_MiiWriteReg( dev, phy, MII_GEN_CTL, control );
2713 TLan_MiiWriteReg( dev, phy, TLAN_TLPHY_CTL, tctl );
2714 }
2715
2716 /* Wait for 2 sec to give the transceiver time
2717 * to establish link.
2718 */
2719 TLan_SetTimer( dev, (4*HZ), TLAN_TIMER_FINISH_RESET );
2720
2721} /* TLan_PhyStartLink */
2722
2723
2724
2725
Harvey Harrison98e0f522008-02-18 10:04:38 -08002726static void TLan_PhyFinishAutoNeg( struct net_device *dev )
Linus Torvalds1da177e2005-04-16 15:20:36 -07002727{
2728 TLanPrivateInfo *priv = netdev_priv(dev);
2729 u16 an_adv;
2730 u16 an_lpa;
2731 u16 data;
2732 u16 mode;
2733 u16 phy;
2734 u16 status;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002735
Linus Torvalds1da177e2005-04-16 15:20:36 -07002736 phy = priv->phy[priv->phyNum];
2737
2738 TLan_MiiReadReg( dev, phy, MII_GEN_STS, &status );
2739 udelay( 1000 );
2740 TLan_MiiReadReg( dev, phy, MII_GEN_STS, &status );
2741
2742 if ( ! ( status & MII_GS_AUTOCMPLT ) ) {
2743 /* Wait for 8 sec to give the process
2744 * more time. Perhaps we should fail after a while.
2745 */
2746 if (!priv->neg_be_verbose++) {
2747 printk(KERN_INFO "TLAN: Giving autonegotiation more time.\n");
2748 printk(KERN_INFO "TLAN: Please check that your adapter has\n");
2749 printk(KERN_INFO "TLAN: been properly connected to a HUB or Switch.\n");
2750 printk(KERN_INFO "TLAN: Trying to establish link in the background...\n");
2751 }
2752 TLan_SetTimer( dev, (8*HZ), TLAN_TIMER_PHY_FINISH_AN );
2753 return;
2754 }
2755
2756 printk( "TLAN: %s: Autonegotiation complete.\n", dev->name );
2757 TLan_MiiReadReg( dev, phy, MII_AN_ADV, &an_adv );
2758 TLan_MiiReadReg( dev, phy, MII_AN_LPA, &an_lpa );
2759 mode = an_adv & an_lpa & 0x03E0;
2760 if ( mode & 0x0100 ) {
2761 priv->tlanFullDuplex = TRUE;
2762 } else if ( ! ( mode & 0x0080 ) && ( mode & 0x0040 ) ) {
2763 priv->tlanFullDuplex = TRUE;
2764 }
2765
2766 if ( ( ! ( mode & 0x0180 ) ) && ( priv->adapter->flags & TLAN_ADAPTER_USE_INTERN_10 ) && ( priv->phyNum != 0 ) ) {
2767 priv->phyNum = 0;
2768 data = TLAN_NET_CFG_1FRAG | TLAN_NET_CFG_1CHAN | TLAN_NET_CFG_PHY_EN;
2769 TLan_DioWrite16( dev->base_addr, TLAN_NET_CONFIG, data );
2770 TLan_SetTimer( dev, (400*HZ/1000), TLAN_TIMER_PHY_PDOWN );
2771 return;
2772 }
2773
2774 if ( priv->phyNum == 0 ) {
2775 if ( ( priv->duplex == TLAN_DUPLEX_FULL ) || ( an_adv & an_lpa & 0x0040 ) ) {
2776 TLan_MiiWriteReg( dev, phy, MII_GEN_CTL, MII_GC_AUTOENB | MII_GC_DUPLEX );
2777 printk( "TLAN: Starting internal PHY with FULL-DUPLEX\n" );
2778 } else {
2779 TLan_MiiWriteReg( dev, phy, MII_GEN_CTL, MII_GC_AUTOENB );
2780 printk( "TLAN: Starting internal PHY with HALF-DUPLEX\n" );
2781 }
2782 }
2783
2784 /* Wait for 100 ms. No reason in partiticular.
2785 */
2786 TLan_SetTimer( dev, (HZ/10), TLAN_TIMER_FINISH_RESET );
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002787
Linus Torvalds1da177e2005-04-16 15:20:36 -07002788} /* TLan_PhyFinishAutoNeg */
2789
2790#ifdef MONITOR
2791
2792 /*********************************************************************
2793 *
2794 * TLan_phyMonitor
2795 *
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002796 * Returns:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002797 * None
2798 *
2799 * Params:
2800 * dev The device structure of this device.
2801 *
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002802 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07002803 * This function monitors PHY condition by reading the status
2804 * register via the MII bus. This can be used to give info
2805 * about link changes (up/down), and possible switch to alternate
2806 * media.
2807 *
2808 * ******************************************************************/
2809
2810void TLan_PhyMonitor( struct net_device *dev )
2811{
2812 TLanPrivateInfo *priv = netdev_priv(dev);
2813 u16 phy;
2814 u16 phy_status;
2815
2816 phy = priv->phy[priv->phyNum];
2817
2818 /* Get PHY status register */
2819 TLan_MiiReadReg( dev, phy, MII_GEN_STS, &phy_status );
2820
2821 /* Check if link has been lost */
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002822 if (!(phy_status & MII_GS_LINK)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002823 if (priv->link) {
2824 priv->link = 0;
2825 printk(KERN_DEBUG "TLAN: %s has lost link\n", dev->name);
7d17c1d2005-05-12 19:45:25 -04002826 netif_carrier_off(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002827 TLan_SetTimer( dev, (2*HZ), TLAN_TIMER_LINK_BEAT );
2828 return;
2829 }
2830 }
2831
2832 /* Link restablished? */
2833 if ((phy_status & MII_GS_LINK) && !priv->link) {
2834 priv->link = 1;
2835 printk(KERN_DEBUG "TLAN: %s has reestablished link\n", dev->name);
7d17c1d2005-05-12 19:45:25 -04002836 netif_carrier_on(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002837 }
2838
2839 /* Setup a new monitor */
2840 TLan_SetTimer( dev, (2*HZ), TLAN_TIMER_LINK_BEAT );
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002841}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002842
2843#endif /* MONITOR */
2844
2845
2846/*****************************************************************************
2847******************************************************************************
2848
2849 ThunderLAN Driver MII Routines
2850
2851 These routines are based on the information in Chap. 2 of the
2852 "ThunderLAN Programmer's Guide", pp. 15-24.
2853
2854******************************************************************************
2855*****************************************************************************/
2856
2857
2858 /***************************************************************
2859 * TLan_MiiReadReg
2860 *
2861 * Returns:
2862 * 0 if ack received ok
2863 * 1 otherwise.
2864 *
2865 * Parms:
2866 * dev The device structure containing
2867 * The io address and interrupt count
2868 * for this device.
2869 * phy The address of the PHY to be queried.
2870 * reg The register whose contents are to be
Matt Mackall4a4efbd2006-01-03 13:27:11 +01002871 * retrieved.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002872 * val A pointer to a variable to store the
2873 * retrieved value.
2874 *
Matt Mackall4a4efbd2006-01-03 13:27:11 +01002875 * This function uses the TLAN's MII bus to retrieve the contents
Linus Torvalds1da177e2005-04-16 15:20:36 -07002876 * of a given register on a PHY. It sends the appropriate info
2877 * and then reads the 16-bit register value from the MII bus via
2878 * the TLAN SIO register.
2879 *
2880 **************************************************************/
2881
Harvey Harrison98e0f522008-02-18 10:04:38 -08002882static int TLan_MiiReadReg( struct net_device *dev, u16 phy, u16 reg, u16 *val )
Linus Torvalds1da177e2005-04-16 15:20:36 -07002883{
2884 u8 nack;
2885 u16 sio, tmp;
2886 u32 i;
2887 int err;
2888 int minten;
2889 TLanPrivateInfo *priv = netdev_priv(dev);
2890 unsigned long flags = 0;
2891
2892 err = FALSE;
2893 outw(TLAN_NET_SIO, dev->base_addr + TLAN_DIO_ADR);
2894 sio = dev->base_addr + TLAN_DIO_DATA + TLAN_NET_SIO;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002895
Linus Torvalds1da177e2005-04-16 15:20:36 -07002896 if (!in_irq())
2897 spin_lock_irqsave(&priv->lock, flags);
2898
2899 TLan_MiiSync(dev->base_addr);
2900
2901 minten = TLan_GetBit( TLAN_NET_SIO_MINTEN, sio );
2902 if ( minten )
2903 TLan_ClearBit(TLAN_NET_SIO_MINTEN, sio);
2904
2905 TLan_MiiSendData( dev->base_addr, 0x1, 2 ); /* Start ( 01b ) */
2906 TLan_MiiSendData( dev->base_addr, 0x2, 2 ); /* Read ( 10b ) */
2907 TLan_MiiSendData( dev->base_addr, phy, 5 ); /* Device # */
2908 TLan_MiiSendData( dev->base_addr, reg, 5 ); /* Register # */
2909
2910
2911 TLan_ClearBit(TLAN_NET_SIO_MTXEN, sio); /* Change direction */
2912
2913 TLan_ClearBit(TLAN_NET_SIO_MCLK, sio); /* Clock Idle bit */
2914 TLan_SetBit(TLAN_NET_SIO_MCLK, sio);
2915 TLan_ClearBit(TLAN_NET_SIO_MCLK, sio); /* Wait 300ns */
2916
2917 nack = TLan_GetBit(TLAN_NET_SIO_MDATA, sio); /* Check for ACK */
2918 TLan_SetBit(TLAN_NET_SIO_MCLK, sio); /* Finish ACK */
2919 if (nack) { /* No ACK, so fake it */
2920 for (i = 0; i < 16; i++) {
2921 TLan_ClearBit(TLAN_NET_SIO_MCLK, sio);
2922 TLan_SetBit(TLAN_NET_SIO_MCLK, sio);
2923 }
2924 tmp = 0xffff;
2925 err = TRUE;
2926 } else { /* ACK, so read data */
2927 for (tmp = 0, i = 0x8000; i; i >>= 1) {
2928 TLan_ClearBit(TLAN_NET_SIO_MCLK, sio);
2929 if (TLan_GetBit(TLAN_NET_SIO_MDATA, sio))
2930 tmp |= i;
2931 TLan_SetBit(TLAN_NET_SIO_MCLK, sio);
2932 }
2933 }
2934
2935
2936 TLan_ClearBit(TLAN_NET_SIO_MCLK, sio); /* Idle cycle */
2937 TLan_SetBit(TLAN_NET_SIO_MCLK, sio);
2938
2939 if ( minten )
2940 TLan_SetBit(TLAN_NET_SIO_MINTEN, sio);
2941
2942 *val = tmp;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002943
Linus Torvalds1da177e2005-04-16 15:20:36 -07002944 if (!in_irq())
2945 spin_unlock_irqrestore(&priv->lock, flags);
2946
2947 return err;
2948
2949} /* TLan_MiiReadReg */
2950
2951
2952
2953
2954 /***************************************************************
2955 * TLan_MiiSendData
2956 *
2957 * Returns:
2958 * Nothing
2959 * Parms:
2960 * base_port The base IO port of the adapter in
2961 * question.
2962 * dev The address of the PHY to be queried.
2963 * data The value to be placed on the MII bus.
2964 * num_bits The number of bits in data that are to
2965 * be placed on the MII bus.
2966 *
2967 * This function sends on sequence of bits on the MII
2968 * configuration bus.
2969 *
2970 **************************************************************/
2971
Harvey Harrison98e0f522008-02-18 10:04:38 -08002972static void TLan_MiiSendData( u16 base_port, u32 data, unsigned num_bits )
Linus Torvalds1da177e2005-04-16 15:20:36 -07002973{
2974 u16 sio;
2975 u32 i;
2976
2977 if ( num_bits == 0 )
2978 return;
2979
2980 outw( TLAN_NET_SIO, base_port + TLAN_DIO_ADR );
2981 sio = base_port + TLAN_DIO_DATA + TLAN_NET_SIO;
2982 TLan_SetBit( TLAN_NET_SIO_MTXEN, sio );
2983
2984 for ( i = ( 0x1 << ( num_bits - 1 ) ); i; i >>= 1 ) {
2985 TLan_ClearBit( TLAN_NET_SIO_MCLK, sio );
2986 (void) TLan_GetBit( TLAN_NET_SIO_MCLK, sio );
2987 if ( data & i )
2988 TLan_SetBit( TLAN_NET_SIO_MDATA, sio );
2989 else
2990 TLan_ClearBit( TLAN_NET_SIO_MDATA, sio );
2991 TLan_SetBit( TLAN_NET_SIO_MCLK, sio );
2992 (void) TLan_GetBit( TLAN_NET_SIO_MCLK, sio );
2993 }
2994
2995} /* TLan_MiiSendData */
2996
2997
2998
2999
3000 /***************************************************************
3001 * TLan_MiiSync
3002 *
3003 * Returns:
3004 * Nothing
3005 * Parms:
3006 * base_port The base IO port of the adapter in
3007 * question.
3008 *
3009 * This functions syncs all PHYs in terms of the MII configuration
3010 * bus.
3011 *
3012 **************************************************************/
3013
Harvey Harrison98e0f522008-02-18 10:04:38 -08003014static void TLan_MiiSync( u16 base_port )
Linus Torvalds1da177e2005-04-16 15:20:36 -07003015{
3016 int i;
3017 u16 sio;
3018
3019 outw( TLAN_NET_SIO, base_port + TLAN_DIO_ADR );
3020 sio = base_port + TLAN_DIO_DATA + TLAN_NET_SIO;
3021
3022 TLan_ClearBit( TLAN_NET_SIO_MTXEN, sio );
3023 for ( i = 0; i < 32; i++ ) {
3024 TLan_ClearBit( TLAN_NET_SIO_MCLK, sio );
3025 TLan_SetBit( TLAN_NET_SIO_MCLK, sio );
3026 }
3027
3028} /* TLan_MiiSync */
3029
3030
3031
3032
3033 /***************************************************************
3034 * TLan_MiiWriteReg
3035 *
3036 * Returns:
3037 * Nothing
3038 * Parms:
3039 * dev The device structure for the device
3040 * to write to.
3041 * phy The address of the PHY to be written to.
3042 * reg The register whose contents are to be
3043 * written.
3044 * val The value to be written to the register.
3045 *
3046 * This function uses the TLAN's MII bus to write the contents of a
3047 * given register on a PHY. It sends the appropriate info and then
3048 * writes the 16-bit register value from the MII configuration bus
3049 * via the TLAN SIO register.
3050 *
3051 **************************************************************/
3052
Harvey Harrison98e0f522008-02-18 10:04:38 -08003053static void TLan_MiiWriteReg( struct net_device *dev, u16 phy, u16 reg, u16 val )
Linus Torvalds1da177e2005-04-16 15:20:36 -07003054{
3055 u16 sio;
3056 int minten;
3057 unsigned long flags = 0;
3058 TLanPrivateInfo *priv = netdev_priv(dev);
3059
3060 outw(TLAN_NET_SIO, dev->base_addr + TLAN_DIO_ADR);
3061 sio = dev->base_addr + TLAN_DIO_DATA + TLAN_NET_SIO;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04003062
Linus Torvalds1da177e2005-04-16 15:20:36 -07003063 if (!in_irq())
3064 spin_lock_irqsave(&priv->lock, flags);
3065
3066 TLan_MiiSync( dev->base_addr );
3067
3068 minten = TLan_GetBit( TLAN_NET_SIO_MINTEN, sio );
3069 if ( minten )
3070 TLan_ClearBit( TLAN_NET_SIO_MINTEN, sio );
3071
3072 TLan_MiiSendData( dev->base_addr, 0x1, 2 ); /* Start ( 01b ) */
3073 TLan_MiiSendData( dev->base_addr, 0x1, 2 ); /* Write ( 01b ) */
3074 TLan_MiiSendData( dev->base_addr, phy, 5 ); /* Device # */
3075 TLan_MiiSendData( dev->base_addr, reg, 5 ); /* Register # */
3076
3077 TLan_MiiSendData( dev->base_addr, 0x2, 2 ); /* Send ACK */
3078 TLan_MiiSendData( dev->base_addr, val, 16 ); /* Send Data */
3079
3080 TLan_ClearBit( TLAN_NET_SIO_MCLK, sio ); /* Idle cycle */
3081 TLan_SetBit( TLAN_NET_SIO_MCLK, sio );
3082
3083 if ( minten )
3084 TLan_SetBit( TLAN_NET_SIO_MINTEN, sio );
Jeff Garzik6aa20a22006-09-13 13:24:59 -04003085
Linus Torvalds1da177e2005-04-16 15:20:36 -07003086 if (!in_irq())
3087 spin_unlock_irqrestore(&priv->lock, flags);
3088
3089} /* TLan_MiiWriteReg */
3090
3091
3092
3093
3094/*****************************************************************************
3095******************************************************************************
3096
3097 ThunderLAN Driver Eeprom routines
3098
3099 The Compaq Netelligent 10 and 10/100 cards use a Microchip 24C02A
3100 EEPROM. These functions are based on information in Microchip's
3101 data sheet. I don't know how well this functions will work with
3102 other EEPROMs.
3103
3104******************************************************************************
3105*****************************************************************************/
3106
3107
3108 /***************************************************************
3109 * TLan_EeSendStart
3110 *
3111 * Returns:
3112 * Nothing
Jeff Garzik6aa20a22006-09-13 13:24:59 -04003113 * Parms:
Linus Torvalds1da177e2005-04-16 15:20:36 -07003114 * io_base The IO port base address for the
3115 * TLAN device with the EEPROM to
3116 * use.
3117 *
3118 * This function sends a start cycle to an EEPROM attached
3119 * to a TLAN chip.
3120 *
3121 **************************************************************/
3122
Harvey Harrison98e0f522008-02-18 10:04:38 -08003123static void TLan_EeSendStart( u16 io_base )
Linus Torvalds1da177e2005-04-16 15:20:36 -07003124{
3125 u16 sio;
3126
3127 outw( TLAN_NET_SIO, io_base + TLAN_DIO_ADR );
3128 sio = io_base + TLAN_DIO_DATA + TLAN_NET_SIO;
3129
3130 TLan_SetBit( TLAN_NET_SIO_ECLOK, sio );
3131 TLan_SetBit( TLAN_NET_SIO_EDATA, sio );
3132 TLan_SetBit( TLAN_NET_SIO_ETXEN, sio );
3133 TLan_ClearBit( TLAN_NET_SIO_EDATA, sio );
3134 TLan_ClearBit( TLAN_NET_SIO_ECLOK, sio );
3135
3136} /* TLan_EeSendStart */
3137
3138
3139
3140
3141 /***************************************************************
3142 * TLan_EeSendByte
3143 *
3144 * Returns:
3145 * If the correct ack was received, 0, otherwise 1
3146 * Parms: io_base The IO port base address for the
3147 * TLAN device with the EEPROM to
3148 * use.
3149 * data The 8 bits of information to
3150 * send to the EEPROM.
3151 * stop If TLAN_EEPROM_STOP is passed, a
3152 * stop cycle is sent after the
3153 * byte is sent after the ack is
3154 * read.
3155 *
3156 * This function sends a byte on the serial EEPROM line,
3157 * driving the clock to send each bit. The function then
3158 * reverses transmission direction and reads an acknowledge
3159 * bit.
3160 *
3161 **************************************************************/
3162
Harvey Harrison98e0f522008-02-18 10:04:38 -08003163static int TLan_EeSendByte( u16 io_base, u8 data, int stop )
Linus Torvalds1da177e2005-04-16 15:20:36 -07003164{
3165 int err;
3166 u8 place;
3167 u16 sio;
3168
3169 outw( TLAN_NET_SIO, io_base + TLAN_DIO_ADR );
3170 sio = io_base + TLAN_DIO_DATA + TLAN_NET_SIO;
3171
3172 /* Assume clock is low, tx is enabled; */
3173 for ( place = 0x80; place != 0; place >>= 1 ) {
3174 if ( place & data )
3175 TLan_SetBit( TLAN_NET_SIO_EDATA, sio );
3176 else
3177 TLan_ClearBit( TLAN_NET_SIO_EDATA, sio );
3178 TLan_SetBit( TLAN_NET_SIO_ECLOK, sio );
3179 TLan_ClearBit( TLAN_NET_SIO_ECLOK, sio );
3180 }
3181 TLan_ClearBit( TLAN_NET_SIO_ETXEN, sio );
3182 TLan_SetBit( TLAN_NET_SIO_ECLOK, sio );
3183 err = TLan_GetBit( TLAN_NET_SIO_EDATA, sio );
3184 TLan_ClearBit( TLAN_NET_SIO_ECLOK, sio );
3185 TLan_SetBit( TLAN_NET_SIO_ETXEN, sio );
3186
3187 if ( ( ! err ) && stop ) {
3188 TLan_ClearBit( TLAN_NET_SIO_EDATA, sio ); /* STOP, raise data while clock is high */
3189 TLan_SetBit( TLAN_NET_SIO_ECLOK, sio );
3190 TLan_SetBit( TLAN_NET_SIO_EDATA, sio );
3191 }
3192
3193 return ( err );
3194
3195} /* TLan_EeSendByte */
3196
3197
3198
3199
3200 /***************************************************************
3201 * TLan_EeReceiveByte
3202 *
3203 * Returns:
3204 * Nothing
3205 * Parms:
3206 * io_base The IO port base address for the
3207 * TLAN device with the EEPROM to
3208 * use.
3209 * data An address to a char to hold the
3210 * data sent from the EEPROM.
3211 * stop If TLAN_EEPROM_STOP is passed, a
3212 * stop cycle is sent after the
3213 * byte is received, and no ack is
3214 * sent.
3215 *
3216 * This function receives 8 bits of data from the EEPROM
3217 * over the serial link. It then sends and ack bit, or no
3218 * ack and a stop bit. This function is used to retrieve
3219 * data after the address of a byte in the EEPROM has been
3220 * sent.
3221 *
3222 **************************************************************/
3223
Harvey Harrison98e0f522008-02-18 10:04:38 -08003224static void TLan_EeReceiveByte( u16 io_base, u8 *data, int stop )
Linus Torvalds1da177e2005-04-16 15:20:36 -07003225{
3226 u8 place;
3227 u16 sio;
3228
3229 outw( TLAN_NET_SIO, io_base + TLAN_DIO_ADR );
3230 sio = io_base + TLAN_DIO_DATA + TLAN_NET_SIO;
3231 *data = 0;
3232
3233 /* Assume clock is low, tx is enabled; */
3234 TLan_ClearBit( TLAN_NET_SIO_ETXEN, sio );
3235 for ( place = 0x80; place; place >>= 1 ) {
3236 TLan_SetBit( TLAN_NET_SIO_ECLOK, sio );
3237 if ( TLan_GetBit( TLAN_NET_SIO_EDATA, sio ) )
3238 *data |= place;
3239 TLan_ClearBit( TLAN_NET_SIO_ECLOK, sio );
3240 }
3241
3242 TLan_SetBit( TLAN_NET_SIO_ETXEN, sio );
3243 if ( ! stop ) {
3244 TLan_ClearBit( TLAN_NET_SIO_EDATA, sio ); /* Ack = 0 */
3245 TLan_SetBit( TLAN_NET_SIO_ECLOK, sio );
3246 TLan_ClearBit( TLAN_NET_SIO_ECLOK, sio );
3247 } else {
3248 TLan_SetBit( TLAN_NET_SIO_EDATA, sio ); /* No ack = 1 (?) */
3249 TLan_SetBit( TLAN_NET_SIO_ECLOK, sio );
3250 TLan_ClearBit( TLAN_NET_SIO_ECLOK, sio );
3251 TLan_ClearBit( TLAN_NET_SIO_EDATA, sio ); /* STOP, raise data while clock is high */
3252 TLan_SetBit( TLAN_NET_SIO_ECLOK, sio );
3253 TLan_SetBit( TLAN_NET_SIO_EDATA, sio );
3254 }
3255
3256} /* TLan_EeReceiveByte */
3257
3258
3259
3260
3261 /***************************************************************
3262 * TLan_EeReadByte
3263 *
3264 * Returns:
3265 * No error = 0, else, the stage at which the error
3266 * occurred.
3267 * Parms:
3268 * io_base The IO port base address for the
3269 * TLAN device with the EEPROM to
3270 * use.
3271 * ee_addr The address of the byte in the
3272 * EEPROM whose contents are to be
3273 * retrieved.
3274 * data An address to a char to hold the
3275 * data obtained from the EEPROM.
3276 *
3277 * This function reads a byte of information from an byte
3278 * cell in the EEPROM.
3279 *
3280 **************************************************************/
3281
Harvey Harrison98e0f522008-02-18 10:04:38 -08003282static int TLan_EeReadByte( struct net_device *dev, u8 ee_addr, u8 *data )
Linus Torvalds1da177e2005-04-16 15:20:36 -07003283{
3284 int err;
3285 TLanPrivateInfo *priv = netdev_priv(dev);
3286 unsigned long flags = 0;
3287 int ret=0;
3288
3289 spin_lock_irqsave(&priv->lock, flags);
3290
3291 TLan_EeSendStart( dev->base_addr );
3292 err = TLan_EeSendByte( dev->base_addr, 0xA0, TLAN_EEPROM_ACK );
3293 if (err)
3294 {
3295 ret=1;
3296 goto fail;
3297 }
3298 err = TLan_EeSendByte( dev->base_addr, ee_addr, TLAN_EEPROM_ACK );
3299 if (err)
3300 {
3301 ret=2;
3302 goto fail;
3303 }
3304 TLan_EeSendStart( dev->base_addr );
3305 err = TLan_EeSendByte( dev->base_addr, 0xA1, TLAN_EEPROM_ACK );
3306 if (err)
3307 {
3308 ret=3;
3309 goto fail;
3310 }
3311 TLan_EeReceiveByte( dev->base_addr, data, TLAN_EEPROM_STOP );
3312fail:
3313 spin_unlock_irqrestore(&priv->lock, flags);
3314
3315 return ret;
3316
3317} /* TLan_EeReadByte */
3318
3319
3320