blob: 0678e7e71f190cfd258bc6fc425149537d555508 [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 *
Linus Torvalds1da177e2005-04-16 15:20:36 -070016 ** Useful (if not required) reading:
17 *
18 * Texas Instruments, ThunderLAN Programmer's Guide,
19 * TI Literature Number SPWU013A
20 * available in PDF format from www.ti.com
21 * Level One, LXT901 and LXT970 Data Sheets
22 * available in PDF format from www.level1.com
23 * National Semiconductor, DP83840A Data Sheet
24 * available in PDF format from www.national.com
25 * Microchip Technology, 24C01A/02A/04A Data Sheet
26 * available in PDF format from www.microchip.com
27 *
28 * Change History
29 *
30 * Tigran Aivazian <tigran@sco.com>: TLan_PciProbe() now uses
31 * new PCI BIOS interface.
Alan Cox113aa832008-10-13 19:01:08 -070032 * Alan Cox <alan@lxorguk.ukuu.org.uk>:
33 * Fixed the out of memory
Linus Torvalds1da177e2005-04-16 15:20:36 -070034 * handling.
Jeff Garzik6aa20a22006-09-13 13:24:59 -040035 *
Linus Torvalds1da177e2005-04-16 15:20:36 -070036 * Torben Mathiasen <torben.mathiasen@compaq.com> New Maintainer!
37 *
38 * v1.1 Dec 20, 1999 - Removed linux version checking
Jeff Garzik6aa20a22006-09-13 13:24:59 -040039 * Patch from Tigran Aivazian.
Linus Torvalds1da177e2005-04-16 15:20:36 -070040 * - v1.1 includes Alan's SMP updates.
41 * - We still have problems on SMP though,
Jeff Garzik6aa20a22006-09-13 13:24:59 -040042 * but I'm looking into that.
43 *
Linus Torvalds1da177e2005-04-16 15:20:36 -070044 * v1.2 Jan 02, 2000 - Hopefully fixed the SMP deadlock.
45 * - Removed dependency of HZ being 100.
Jeff Garzik6aa20a22006-09-13 13:24:59 -040046 * - We now allow higher priority timers to
Linus Torvalds1da177e2005-04-16 15:20:36 -070047 * overwrite timers like TLAN_TIMER_ACTIVITY
48 * Patch from John Cagle <john.cagle@compaq.com>.
49 * - Fixed a few compiler warnings.
50 *
51 * v1.3 Feb 04, 2000 - Fixed the remaining HZ issues.
Jeff Garzik6aa20a22006-09-13 13:24:59 -040052 * - Removed call to pci_present().
Linus Torvalds1da177e2005-04-16 15:20:36 -070053 * - Removed SA_INTERRUPT flag from irq handler.
Jeff Garzik6aa20a22006-09-13 13:24:59 -040054 * - Added __init and __initdata to reduce resisdent
Linus Torvalds1da177e2005-04-16 15:20:36 -070055 * code size.
56 * - Driver now uses module_init/module_exit.
57 * - Rewrote init_module and tlan_probe to
58 * share a lot more code. We now use tlan_probe
59 * with builtin and module driver.
Jeff Garzik6aa20a22006-09-13 13:24:59 -040060 * - Driver ported to new net API.
61 * - tlan.txt has been reworked to reflect current
Linus Torvalds1da177e2005-04-16 15:20:36 -070062 * driver (almost)
63 * - Other minor stuff
64 *
65 * v1.4 Feb 10, 2000 - Updated with more changes required after Dave's
Sakari Ailusc659c382011-01-21 10:59:30 +000066 * network cleanup in 2.3.43pre7 (Tigran & myself)
67 * - Minor stuff.
Linus Torvalds1da177e2005-04-16 15:20:36 -070068 *
Sakari Ailusc659c382011-01-21 10:59:30 +000069 * v1.5 March 22, 2000 - Fixed another timer bug that would hang the
70 * driver if no cable/link were present.
Linus Torvalds1da177e2005-04-16 15:20:36 -070071 * - Cosmetic changes.
72 * - TODO: Port completely to new PCI/DMA API
Sakari Ailusc659c382011-01-21 10:59:30 +000073 * Auto-Neg fallback.
Linus Torvalds1da177e2005-04-16 15:20:36 -070074 *
Sakari Ailusc659c382011-01-21 10:59:30 +000075 * v1.6 April 04, 2000 - Fixed driver support for kernel-parameters.
76 * Haven't tested it though, as the kernel support
77 * is currently broken (2.3.99p4p3).
78 * - Updated tlan.txt accordingly.
79 * - Adjusted minimum/maximum frame length.
80 * - There is now a TLAN website up at
81 * http://hp.sourceforge.net/
Linus Torvalds1da177e2005-04-16 15:20:36 -070082 *
Sakari Ailusc659c382011-01-21 10:59:30 +000083 * v1.7 April 07, 2000 - Started to implement custom ioctls. Driver now
84 * reports PHY information when used with Donald
85 * Beckers userspace MII diagnostics utility.
Linus Torvalds1da177e2005-04-16 15:20:36 -070086 *
Sakari Ailusc659c382011-01-21 10:59:30 +000087 * v1.8 April 23, 2000 - Fixed support for forced speed/duplex settings.
88 * - Added link information to Auto-Neg and forced
89 * modes. When NIC operates with auto-neg the driver
90 * will report Link speed & duplex modes as well as
91 * link partner abilities. When forced link is used,
92 * the driver will report status of the established
93 * link.
94 * Please read tlan.txt for additional information.
95 * - Removed call to check_region(), and used
96 * return value of request_region() instead.
Jeff Garzik6aa20a22006-09-13 13:24:59 -040097 *
Linus Torvalds1da177e2005-04-16 15:20:36 -070098 * v1.8a May 28, 2000 - Minor updates.
99 *
100 * v1.9 July 25, 2000 - Fixed a few remaining Full-Duplex issues.
Sakari Ailusc659c382011-01-21 10:59:30 +0000101 * - Updated with timer fixes from Andrew Morton.
102 * - Fixed module race in TLan_Open.
103 * - Added routine to monitor PHY status.
104 * - Added activity led support for Proliant devices.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700105 *
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400106 * v1.10 Aug 30, 2000 - Added support for EISA based tlan controllers
107 * like the Compaq NetFlex3/E.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700108 * - Rewrote tlan_probe to better handle multiple
109 * bus probes. Probing and device setup is now
110 * done through TLan_Probe and TLan_init_one. Actual
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400111 * hardware probe is done with kernel API and
Linus Torvalds1da177e2005-04-16 15:20:36 -0700112 * TLan_EisaProbe.
113 * - Adjusted debug information for probing.
Sakari Ailusc659c382011-01-21 10:59:30 +0000114 * - Fixed bug that would cause general debug
115 * information to be printed after driver removal.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700116 * - Added transmit timeout handling.
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400117 * - Fixed OOM return values in tlan_probe.
118 * - Fixed possible mem leak in tlan_exit
Linus Torvalds1da177e2005-04-16 15:20:36 -0700119 * (now tlan_remove_one).
120 * - Fixed timer bug in TLan_phyMonitor.
121 * - This driver version is alpha quality, please
122 * send me any bug issues you may encounter.
123 *
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400124 * v1.11 Aug 31, 2000 - Do not try to register irq 0 if no irq line was
Linus Torvalds1da177e2005-04-16 15:20:36 -0700125 * set for EISA cards.
126 * - Added support for NetFlex3/E with nibble-rate
127 * 10Base-T PHY. This is untestet as I haven't got
128 * one of these cards.
129 * - Fixed timer being added twice.
130 * - Disabled PhyMonitoring by default as this is
131 * work in progress. Define MONITOR to enable it.
132 * - Now we don't display link info with PHYs that
133 * doesn't support it (level1).
134 * - Incresed tx_timeout beacuse of auto-neg.
135 * - Adjusted timers for forced speeds.
136 *
137 * v1.12 Oct 12, 2000 - Minor fixes (memleak, init, etc.)
138 *
Sakari Ailusc659c382011-01-21 10:59:30 +0000139 * v1.13 Nov 28, 2000 - Stop flooding console with auto-neg issues
140 * when link can't be established.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700141 * - Added the bbuf option as a kernel parameter.
142 * - Fixed ioaddr probe bug.
143 * - Fixed stupid deadlock with MII interrupts.
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400144 * - Added support for speed/duplex selection with
Linus Torvalds1da177e2005-04-16 15:20:36 -0700145 * multiple nics.
146 * - Added partly fix for TX Channel lockup with
147 * TLAN v1.0 silicon. This needs to be investigated
148 * further.
149 *
Sakari Ailusc659c382011-01-21 10:59:30 +0000150 * v1.14 Dec 16, 2000 - Added support for servicing multiple frames per.
151 * interrupt. Thanks goes to
152 * Adam Keys <adam@ti.com>
153 * Denis Beaudoin <dbeaudoin@ti.com>
154 * for providing the patch.
155 * - Fixed auto-neg output when using multiple
156 * adapters.
157 * - Converted to use new taskq interface.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700158 *
Sakari Ailusc659c382011-01-21 10:59:30 +0000159 * v1.14a Jan 6, 2001 - Minor adjustments (spinlocks, etc.)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700160 *
161 * Samuel Chessman <chessman@tux.org> New Maintainer!
162 *
163 * v1.15 Apr 4, 2002 - Correct operation when aui=1 to be
Sakari Ailusc659c382011-01-21 10:59:30 +0000164 * 10T half duplex no loopback
165 * Thanks to Gunnar Eikman
Sakari Ailus5eeabf52008-12-16 15:24:05 -0800166 *
167 * Sakari Ailus <sakari.ailus@iki.fi>:
168 *
169 * v1.15a Dec 15 2008 - Remove bbuf support, it doesn't work anyway.
Sakari Ailusc659c382011-01-21 10:59:30 +0000170 * v1.16 Jan 6 2011 - Make checkpatch.pl happy.
Sakari Ailusfa6d5d42011-01-21 10:59:31 +0000171 * v1.17 Jan 6 2011 - Add suspend/resume support.
Sakari Ailus5eeabf52008-12-16 15:24:05 -0800172 *
Sakari Ailusc659c382011-01-21 10:59:30 +0000173 ******************************************************************************/
Linus Torvalds1da177e2005-04-16 15:20:36 -0700174
175#include <linux/module.h>
176#include <linux/init.h>
177#include <linux/ioport.h>
178#include <linux/eisa.h>
179#include <linux/pci.h>
Domen Puncer1e7f0bd2005-06-26 18:22:14 -0400180#include <linux/dma-mapping.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -0700181#include <linux/netdevice.h>
182#include <linux/etherdevice.h>
183#include <linux/delay.h>
184#include <linux/spinlock.h>
185#include <linux/workqueue.h>
186#include <linux/mii.h>
187
188#include "tlan.h"
189
Linus Torvalds1da177e2005-04-16 15:20:36 -0700190
191/* For removing EISA devices */
Sakari Ailusc659c382011-01-21 10:59:30 +0000192static struct net_device *tlan_eisa_devices;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700193
Sakari Ailusc659c382011-01-21 10:59:30 +0000194static int tlan_devices_installed;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700195
196/* Set speed, duplex and aui settings */
197static int aui[MAX_TLAN_BOARDS];
198static int duplex[MAX_TLAN_BOARDS];
199static int speed[MAX_TLAN_BOARDS];
200static int boards_found;
Stephen Hemminger15efa9b2005-05-04 15:33:11 -0700201module_param_array(aui, int, NULL, 0);
202module_param_array(duplex, int, NULL, 0);
203module_param_array(speed, int, NULL, 0);
204MODULE_PARM_DESC(aui, "ThunderLAN use AUI port(s) (0-1)");
Sakari Ailusc659c382011-01-21 10:59:30 +0000205MODULE_PARM_DESC(duplex,
206 "ThunderLAN duplex setting(s) (0-default, 1-half, 2-full)");
Stephen Hemminger15efa9b2005-05-04 15:33:11 -0700207MODULE_PARM_DESC(speed, "ThunderLAN port speen setting(s) (0,10,100)");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700208
209MODULE_AUTHOR("Maintainer: Samuel Chessman <chessman@tux.org>");
210MODULE_DESCRIPTION("Driver for TI ThunderLAN based ethernet PCI adapters");
211MODULE_LICENSE("GPL");
212
213
214/* Define this to enable Link beat monitoring */
215#undef MONITOR
216
217/* Turn on debugging. See Documentation/networking/tlan.txt for details */
218static int debug;
Stephen Hemminger15efa9b2005-05-04 15:33:11 -0700219module_param(debug, int, 0);
220MODULE_PARM_DESC(debug, "ThunderLAN debug mask");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700221
Sakari Ailusc659c382011-01-21 10:59:30 +0000222static const char tlan_signature[] = "TLAN";
Sakari Ailusfa6d5d42011-01-21 10:59:31 +0000223static const char tlan_banner[] = "ThunderLAN driver v1.17\n";
Linus Torvalds1da177e2005-04-16 15:20:36 -0700224static int tlan_have_pci;
225static int tlan_have_eisa;
226
Sakari Ailusc659c382011-01-21 10:59:30 +0000227static const char * const media[] = {
228 "10BaseT-HD", "10BaseT-FD", "100baseTx-HD",
229 "100BaseTx-FD", "100BaseT4", NULL
Linus Torvalds1da177e2005-04-16 15:20:36 -0700230};
231
232static struct board {
Sakari Ailusc659c382011-01-21 10:59:30 +0000233 const char *device_label;
234 u32 flags;
235 u16 addr_ofs;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700236} board_info[] = {
237 { "Compaq Netelligent 10 T PCI UTP", TLAN_ADAPTER_ACTIVITY_LED, 0x83 },
Sakari Ailusc659c382011-01-21 10:59:30 +0000238 { "Compaq Netelligent 10/100 TX PCI UTP",
239 TLAN_ADAPTER_ACTIVITY_LED, 0x83 },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700240 { "Compaq Integrated NetFlex-3/P", TLAN_ADAPTER_NONE, 0x83 },
Stephen Hemmingerdfc2c0a2008-05-30 09:49:58 -0700241 { "Compaq NetFlex-3/P",
242 TLAN_ADAPTER_UNMANAGED_PHY | TLAN_ADAPTER_BIT_RATE_PHY, 0x83 },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700243 { "Compaq NetFlex-3/P", TLAN_ADAPTER_NONE, 0x83 },
Stephen Hemmingerdfc2c0a2008-05-30 09:49:58 -0700244 { "Compaq Netelligent Integrated 10/100 TX UTP",
245 TLAN_ADAPTER_ACTIVITY_LED, 0x83 },
Sakari Ailusc659c382011-01-21 10:59:30 +0000246 { "Compaq Netelligent Dual 10/100 TX PCI UTP",
247 TLAN_ADAPTER_NONE, 0x83 },
248 { "Compaq Netelligent 10/100 TX Embedded UTP",
249 TLAN_ADAPTER_NONE, 0x83 },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700250 { "Olicom OC-2183/2185", TLAN_ADAPTER_USE_INTERN_10, 0x83 },
Sakari Ailusc659c382011-01-21 10:59:30 +0000251 { "Olicom OC-2325", TLAN_ADAPTER_UNMANAGED_PHY, 0xf8 },
252 { "Olicom OC-2326", TLAN_ADAPTER_USE_INTERN_10, 0xf8 },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700253 { "Compaq Netelligent 10/100 TX UTP", TLAN_ADAPTER_ACTIVITY_LED, 0x83 },
Sakari Ailusc659c382011-01-21 10:59:30 +0000254 { "Compaq Netelligent 10 T/2 PCI UTP/coax", TLAN_ADAPTER_NONE, 0x83 },
Stephen Hemmingerdfc2c0a2008-05-30 09:49:58 -0700255 { "Compaq NetFlex-3/E",
Sakari Ailusc659c382011-01-21 10:59:30 +0000256 TLAN_ADAPTER_ACTIVITY_LED | /* EISA card */
Stephen Hemmingerdfc2c0a2008-05-30 09:49:58 -0700257 TLAN_ADAPTER_UNMANAGED_PHY | TLAN_ADAPTER_BIT_RATE_PHY, 0x83 },
Sakari Ailusc659c382011-01-21 10:59:30 +0000258 { "Compaq NetFlex-3/E",
259 TLAN_ADAPTER_ACTIVITY_LED, 0x83 }, /* EISA card */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700260};
261
Alexey Dobriyana3aa1882010-01-07 11:58:11 +0000262static DEFINE_PCI_DEVICE_TABLE(tlan_pci_tbl) = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700263 { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_NETEL10,
Sakari Ailusc659c382011-01-21 10:59:30 +0000264 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700265 { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_NETEL100,
Sakari Ailusc659c382011-01-21 10:59:30 +0000266 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1 },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700267 { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_NETFLEX3I,
Sakari Ailusc659c382011-01-21 10:59:30 +0000268 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 2 },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700269 { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_THUNDER,
Sakari Ailusc659c382011-01-21 10:59:30 +0000270 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 3 },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700271 { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_NETFLEX3B,
Sakari Ailusc659c382011-01-21 10:59:30 +0000272 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 4 },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700273 { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_NETEL100PI,
Sakari Ailusc659c382011-01-21 10:59:30 +0000274 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 5 },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700275 { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_NETEL100D,
Sakari Ailusc659c382011-01-21 10:59:30 +0000276 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 6 },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700277 { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_NETEL100I,
Sakari Ailusc659c382011-01-21 10:59:30 +0000278 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 7 },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700279 { PCI_VENDOR_ID_OLICOM, PCI_DEVICE_ID_OLICOM_OC2183,
Sakari Ailusc659c382011-01-21 10:59:30 +0000280 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 8 },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700281 { PCI_VENDOR_ID_OLICOM, PCI_DEVICE_ID_OLICOM_OC2325,
Sakari Ailusc659c382011-01-21 10:59:30 +0000282 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 9 },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700283 { PCI_VENDOR_ID_OLICOM, PCI_DEVICE_ID_OLICOM_OC2326,
Sakari Ailusc659c382011-01-21 10:59:30 +0000284 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 10 },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700285 { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_NETELLIGENT_10_100_WS_5100,
Sakari Ailusc659c382011-01-21 10:59:30 +0000286 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 11 },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700287 { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_NETELLIGENT_10_T2,
Sakari Ailusc659c382011-01-21 10:59:30 +0000288 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 12 },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700289 { 0,}
290};
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400291MODULE_DEVICE_TABLE(pci, tlan_pci_tbl);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700292
Sakari Ailusc659c382011-01-21 10:59:30 +0000293static void tlan_eisa_probe(void);
294static void tlan_eisa_cleanup(void);
295static int tlan_init(struct net_device *);
296static int tlan_open(struct net_device *dev);
297static netdev_tx_t tlan_start_tx(struct sk_buff *, struct net_device *);
298static irqreturn_t tlan_handle_interrupt(int, void *);
299static int tlan_close(struct net_device *);
300static struct net_device_stats *tlan_get_stats(struct net_device *);
301static void tlan_set_multicast_list(struct net_device *);
302static int tlan_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
303static int tlan_probe1(struct pci_dev *pdev, long ioaddr,
304 int irq, int rev, const struct pci_device_id *ent);
305static void tlan_tx_timeout(struct net_device *dev);
306static void tlan_tx_timeout_work(struct work_struct *work);
307static int tlan_init_one(struct pci_dev *pdev,
308 const struct pci_device_id *ent);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700309
Sakari Ailusc659c382011-01-21 10:59:30 +0000310static u32 tlan_handle_tx_eof(struct net_device *, u16);
311static u32 tlan_handle_stat_overflow(struct net_device *, u16);
312static u32 tlan_handle_rx_eof(struct net_device *, u16);
313static u32 tlan_handle_dummy(struct net_device *, u16);
314static u32 tlan_handle_tx_eoc(struct net_device *, u16);
315static u32 tlan_handle_status_check(struct net_device *, u16);
316static u32 tlan_handle_rx_eoc(struct net_device *, u16);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700317
Sakari Ailusc659c382011-01-21 10:59:30 +0000318static void tlan_timer(unsigned long);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700319
Sakari Ailusc659c382011-01-21 10:59:30 +0000320static void tlan_reset_lists(struct net_device *);
321static void tlan_free_lists(struct net_device *);
322static void tlan_print_dio(u16);
323static void tlan_print_list(struct tlan_list *, char *, int);
324static void tlan_read_and_clear_stats(struct net_device *, int);
325static void tlan_reset_adapter(struct net_device *);
326static void tlan_finish_reset(struct net_device *);
327static void tlan_set_mac(struct net_device *, int areg, char *mac);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700328
Sakari Ailusc659c382011-01-21 10:59:30 +0000329static void tlan_phy_print(struct net_device *);
330static void tlan_phy_detect(struct net_device *);
331static void tlan_phy_power_down(struct net_device *);
332static void tlan_phy_power_up(struct net_device *);
333static void tlan_phy_reset(struct net_device *);
334static void tlan_phy_start_link(struct net_device *);
335static void tlan_phy_finish_auto_neg(struct net_device *);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700336#ifdef MONITOR
Sakari Ailusc659c382011-01-21 10:59:30 +0000337static void tlan_phy_monitor(struct net_device *);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700338#endif
339
340/*
Sakari Ailusc659c382011-01-21 10:59:30 +0000341 static int tlan_phy_nop(struct net_device *);
342 static int tlan_phy_internal_check(struct net_device *);
343 static int tlan_phy_internal_service(struct net_device *);
344 static int tlan_phy_dp83840a_check(struct net_device *);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700345*/
346
Sakari Ailusc659c382011-01-21 10:59:30 +0000347static bool tlan_mii_read_reg(struct net_device *, u16, u16, u16 *);
348static void tlan_mii_send_data(u16, u32, unsigned);
349static void tlan_mii_sync(u16);
350static void tlan_mii_write_reg(struct net_device *, u16, u16, u16);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700351
Sakari Ailusc659c382011-01-21 10:59:30 +0000352static void tlan_ee_send_start(u16);
353static int tlan_ee_send_byte(u16, u8, int);
354static void tlan_ee_receive_byte(u16, u8 *, int);
355static int tlan_ee_read_byte(struct net_device *, u8, u8 *);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700356
357
Stephen Hemminger93e16842008-05-30 09:49:55 -0700358static inline void
Sakari Ailusc659c382011-01-21 10:59:30 +0000359tlan_store_skb(struct tlan_list *tag, struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700360{
361 unsigned long addr = (unsigned long)skb;
Stephen Hemminger93e16842008-05-30 09:49:55 -0700362 tag->buffer[9].address = addr;
363 tag->buffer[8].address = upper_32_bits(addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700364}
365
Stephen Hemminger93e16842008-05-30 09:49:55 -0700366static inline struct sk_buff *
Sakari Ailusc659c382011-01-21 10:59:30 +0000367tlan_get_skb(const struct tlan_list *tag)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700368{
Stephen Hemminger93e16842008-05-30 09:49:55 -0700369 unsigned long addr;
370
Robert Fitzsimons0d63bea2008-08-09 17:54:02 +0100371 addr = tag->buffer[9].address;
372 addr |= (tag->buffer[8].address << 16) << 16;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700373 return (struct sk_buff *) addr;
374}
375
Sakari Ailusc659c382011-01-21 10:59:30 +0000376static u32
377(*tlan_int_vector[TLAN_INT_NUMBER_OF_INTS])(struct net_device *, u16) = {
Stephen Hemmingera3ccc782008-05-30 09:49:57 -0700378 NULL,
Sakari Ailusc659c382011-01-21 10:59:30 +0000379 tlan_handle_tx_eof,
380 tlan_handle_stat_overflow,
381 tlan_handle_rx_eof,
382 tlan_handle_dummy,
383 tlan_handle_tx_eoc,
384 tlan_handle_status_check,
385 tlan_handle_rx_eoc
Linus Torvalds1da177e2005-04-16 15:20:36 -0700386};
387
388static inline void
Sakari Ailusc659c382011-01-21 10:59:30 +0000389tlan_set_timer(struct net_device *dev, u32 ticks, u32 type)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700390{
Sakari Ailusc659c382011-01-21 10:59:30 +0000391 struct tlan_priv *priv = netdev_priv(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700392 unsigned long flags = 0;
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400393
Linus Torvalds1da177e2005-04-16 15:20:36 -0700394 if (!in_irq())
395 spin_lock_irqsave(&priv->lock, flags);
Sakari Ailusc659c382011-01-21 10:59:30 +0000396 if (priv->timer.function != NULL &&
397 priv->timer_type != TLAN_TIMER_ACTIVITY) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700398 if (!in_irq())
399 spin_unlock_irqrestore(&priv->lock, flags);
400 return;
401 }
Sakari Ailusc659c382011-01-21 10:59:30 +0000402 priv->timer.function = tlan_timer;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700403 if (!in_irq())
404 spin_unlock_irqrestore(&priv->lock, flags);
405
406 priv->timer.data = (unsigned long) dev;
Sakari Ailusc659c382011-01-21 10:59:30 +0000407 priv->timer_set_at = jiffies;
408 priv->timer_type = type;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700409 mod_timer(&priv->timer, jiffies + ticks);
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400410
Sakari Ailusc659c382011-01-21 10:59:30 +0000411}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700412
413
414/*****************************************************************************
415******************************************************************************
416
Sakari Ailusc659c382011-01-21 10:59:30 +0000417ThunderLAN driver primary functions
Linus Torvalds1da177e2005-04-16 15:20:36 -0700418
Sakari Ailusc659c382011-01-21 10:59:30 +0000419these functions are more or less common to all linux network drivers.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700420
421******************************************************************************
422*****************************************************************************/
423
424
425
426
427
Sakari Ailusc659c382011-01-21 10:59:30 +0000428/***************************************************************
429 * tlan_remove_one
430 *
431 * Returns:
432 * Nothing
433 * Parms:
434 * None
435 *
436 * Goes through the TLanDevices list and frees the device
437 * structs and memory associated with each device (lists
438 * and buffers). It also ureserves the IO port regions
439 * associated with this device.
440 *
441 **************************************************************/
Linus Torvalds1da177e2005-04-16 15:20:36 -0700442
443
Sakari Ailusc659c382011-01-21 10:59:30 +0000444static void __devexit tlan_remove_one(struct pci_dev *pdev)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700445{
Sakari Ailusc659c382011-01-21 10:59:30 +0000446 struct net_device *dev = pci_get_drvdata(pdev);
447 struct tlan_priv *priv = netdev_priv(dev);
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400448
Sakari Ailusc659c382011-01-21 10:59:30 +0000449 unregister_netdev(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700450
Sakari Ailusc659c382011-01-21 10:59:30 +0000451 if (priv->dma_storage) {
452 pci_free_consistent(priv->pci_dev,
453 priv->dma_size, priv->dma_storage,
454 priv->dma_storage_dma);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700455 }
456
457#ifdef CONFIG_PCI
458 pci_release_regions(pdev);
459#endif
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400460
Sakari Ailusc659c382011-01-21 10:59:30 +0000461 free_netdev(dev);
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400462
Sakari Ailusc659c382011-01-21 10:59:30 +0000463 pci_set_drvdata(pdev, NULL);
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400464}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700465
Sakari Ailusfa6d5d42011-01-21 10:59:31 +0000466static void tlan_start(struct net_device *dev)
467{
468 tlan_reset_lists(dev);
469 /* NOTE: It might not be necessary to read the stats before a
470 reset if you don't care what the values are.
471 */
472 tlan_read_and_clear_stats(dev, TLAN_IGNORE);
473 tlan_reset_adapter(dev);
474 netif_wake_queue(dev);
475}
476
477static void tlan_stop(struct net_device *dev)
478{
479 struct tlan_priv *priv = netdev_priv(dev);
480
481 tlan_read_and_clear_stats(dev, TLAN_RECORD);
482 outl(TLAN_HC_AD_RST, dev->base_addr + TLAN_HOST_CMD);
483 /* Reset and power down phy */
484 tlan_reset_adapter(dev);
485 if (priv->timer.function != NULL) {
486 del_timer_sync(&priv->timer);
487 priv->timer.function = NULL;
488 }
489}
490
491#ifdef CONFIG_PM
492
493static int tlan_suspend(struct pci_dev *pdev, pm_message_t state)
494{
495 struct net_device *dev = pci_get_drvdata(pdev);
496
497 if (netif_running(dev))
498 tlan_stop(dev);
499
500 netif_device_detach(dev);
501 pci_save_state(pdev);
502 pci_disable_device(pdev);
503 pci_wake_from_d3(pdev, false);
504 pci_set_power_state(pdev, PCI_D3hot);
505
506 return 0;
507}
508
509static int tlan_resume(struct pci_dev *pdev)
510{
511 struct net_device *dev = pci_get_drvdata(pdev);
512
513 pci_set_power_state(pdev, PCI_D0);
514 pci_restore_state(pdev);
515 pci_enable_wake(pdev, 0, 0);
516 netif_device_attach(dev);
517
518 if (netif_running(dev))
519 tlan_start(dev);
520
521 return 0;
522}
523
524#else /* CONFIG_PM */
525
526#define tlan_suspend NULL
527#define tlan_resume NULL
528
529#endif /* CONFIG_PM */
530
531
Linus Torvalds1da177e2005-04-16 15:20:36 -0700532static struct pci_driver tlan_driver = {
533 .name = "tlan",
534 .id_table = tlan_pci_tbl,
535 .probe = tlan_init_one,
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400536 .remove = __devexit_p(tlan_remove_one),
Sakari Ailusfa6d5d42011-01-21 10:59:31 +0000537 .suspend = tlan_suspend,
538 .resume = tlan_resume,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700539};
540
541static int __init tlan_probe(void)
542{
Leonardo Potenza6c04a512008-02-04 23:47:16 -0800543 int rc = -ENODEV;
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400544
Linus Torvalds1da177e2005-04-16 15:20:36 -0700545 printk(KERN_INFO "%s", tlan_banner);
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400546
Linus Torvalds1da177e2005-04-16 15:20:36 -0700547 TLAN_DBG(TLAN_DEBUG_PROBE, "Starting PCI Probe....\n");
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400548
Linus Torvalds1da177e2005-04-16 15:20:36 -0700549 /* Use new style PCI probing. Now the kernel will
550 do most of this for us */
Leonardo Potenza6c04a512008-02-04 23:47:16 -0800551 rc = pci_register_driver(&tlan_driver);
552
553 if (rc != 0) {
554 printk(KERN_ERR "TLAN: Could not register pci driver.\n");
555 goto err_out_pci_free;
556 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700557
558 TLAN_DBG(TLAN_DEBUG_PROBE, "Starting EISA Probe....\n");
Sakari Ailusc659c382011-01-21 10:59:30 +0000559 tlan_eisa_probe();
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400560
561 printk(KERN_INFO "TLAN: %d device%s installed, PCI: %d EISA: %d\n",
Sakari Ailusc659c382011-01-21 10:59:30 +0000562 tlan_devices_installed, tlan_devices_installed == 1 ? "" : "s",
563 tlan_have_pci, tlan_have_eisa);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700564
Sakari Ailusc659c382011-01-21 10:59:30 +0000565 if (tlan_devices_installed == 0) {
Leonardo Potenza6c04a512008-02-04 23:47:16 -0800566 rc = -ENODEV;
567 goto err_out_pci_unreg;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700568 }
569 return 0;
Leonardo Potenza6c04a512008-02-04 23:47:16 -0800570
571err_out_pci_unreg:
572 pci_unregister_driver(&tlan_driver);
573err_out_pci_free:
Leonardo Potenza6c04a512008-02-04 23:47:16 -0800574 return rc;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700575}
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400576
Linus Torvalds1da177e2005-04-16 15:20:36 -0700577
Sakari Ailusc659c382011-01-21 10:59:30 +0000578static int __devinit tlan_init_one(struct pci_dev *pdev,
579 const struct pci_device_id *ent)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700580{
Sakari Ailusc659c382011-01-21 10:59:30 +0000581 return tlan_probe1(pdev, -1, -1, 0, ent);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700582}
583
584
585/*
Sakari Ailusc659c382011-01-21 10:59:30 +0000586***************************************************************
587* tlan_probe1
588*
589* Returns:
590* 0 on success, error code on error
591* Parms:
592* none
593*
594* The name is lower case to fit in with all the rest of
595* the netcard_probe names. This function looks for
596* another TLan based adapter, setting it up with the
597* allocated device struct if one is found.
598* tlan_probe has been ported to the new net API and
599* now allocates its own device structure. This function
600* is also used by modules.
601*
602**************************************************************/
Linus Torvalds1da177e2005-04-16 15:20:36 -0700603
Sakari Ailusc659c382011-01-21 10:59:30 +0000604static int __devinit tlan_probe1(struct pci_dev *pdev,
Stephen Hemmingerdfc2c0a2008-05-30 09:49:58 -0700605 long ioaddr, int irq, int rev,
Sakari Ailusc659c382011-01-21 10:59:30 +0000606 const struct pci_device_id *ent)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700607{
608
609 struct net_device *dev;
Sakari Ailusc659c382011-01-21 10:59:30 +0000610 struct tlan_priv *priv;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700611 u16 device_id;
612 int reg, rc = -ENODEV;
613
Adrian Bunkad9f6712006-02-05 00:37:47 +0100614#ifdef CONFIG_PCI
Linus Torvalds1da177e2005-04-16 15:20:36 -0700615 if (pdev) {
616 rc = pci_enable_device(pdev);
617 if (rc)
618 return rc;
619
Sakari Ailusc659c382011-01-21 10:59:30 +0000620 rc = pci_request_regions(pdev, tlan_signature);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700621 if (rc) {
622 printk(KERN_ERR "TLAN: Could not reserve IO regions\n");
623 goto err_out;
624 }
625 }
Adrian Bunkad9f6712006-02-05 00:37:47 +0100626#endif /* CONFIG_PCI */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700627
Sakari Ailusc659c382011-01-21 10:59:30 +0000628 dev = alloc_etherdev(sizeof(struct tlan_priv));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700629 if (dev == NULL) {
630 printk(KERN_ERR "TLAN: Could not allocate memory for device.\n");
631 rc = -ENOMEM;
632 goto err_out_regions;
633 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700634 SET_NETDEV_DEV(dev, &pdev->dev);
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400635
Linus Torvalds1da177e2005-04-16 15:20:36 -0700636 priv = netdev_priv(dev);
637
Sakari Ailusc659c382011-01-21 10:59:30 +0000638 priv->pci_dev = pdev;
David Howellsc4028952006-11-22 14:57:56 +0000639 priv->dev = dev;
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400640
Linus Torvalds1da177e2005-04-16 15:20:36 -0700641 /* Is this a PCI device? */
642 if (pdev) {
Sakari Ailusc659c382011-01-21 10:59:30 +0000643 u32 pci_io_base = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700644
645 priv->adapter = &board_info[ent->driver_data];
646
Yang Hongyang284901a2009-04-06 19:01:15 -0700647 rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700648 if (rc) {
Sakari Ailusc659c382011-01-21 10:59:30 +0000649 printk(KERN_ERR
650 "TLAN: No suitable PCI mapping available.\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700651 goto err_out_free_dev;
652 }
653
Sakari Ailusc659c382011-01-21 10:59:30 +0000654 for (reg = 0; reg <= 5; reg++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700655 if (pci_resource_flags(pdev, reg) & IORESOURCE_IO) {
656 pci_io_base = pci_resource_start(pdev, reg);
Sakari Ailusc659c382011-01-21 10:59:30 +0000657 TLAN_DBG(TLAN_DEBUG_GNRL,
658 "IO mapping is available at %x.\n",
659 pci_io_base);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700660 break;
661 }
662 }
663 if (!pci_io_base) {
664 printk(KERN_ERR "TLAN: No IO mappings available\n");
665 rc = -EIO;
666 goto err_out_free_dev;
667 }
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400668
Linus Torvalds1da177e2005-04-16 15:20:36 -0700669 dev->base_addr = pci_io_base;
670 dev->irq = pdev->irq;
Sakari Ailusc659c382011-01-21 10:59:30 +0000671 priv->adapter_rev = pdev->revision;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700672 pci_set_master(pdev);
673 pci_set_drvdata(pdev, dev);
674
675 } else { /* EISA card */
676 /* This is a hack. We need to know which board structure
677 * is suited for this adapter */
678 device_id = inw(ioaddr + EISA_ID2);
679 priv->is_eisa = 1;
680 if (device_id == 0x20F1) {
Sakari Ailusc659c382011-01-21 10:59:30 +0000681 priv->adapter = &board_info[13]; /* NetFlex-3/E */
682 priv->adapter_rev = 23; /* TLAN 2.3 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700683 } else {
684 priv->adapter = &board_info[14];
Sakari Ailusc659c382011-01-21 10:59:30 +0000685 priv->adapter_rev = 10; /* TLAN 1.0 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700686 }
687 dev->base_addr = ioaddr;
688 dev->irq = irq;
689 }
690
691 /* Kernel parameters */
692 if (dev->mem_start) {
693 priv->aui = dev->mem_start & 0x01;
Stephen Hemmingerdfc2c0a2008-05-30 09:49:58 -0700694 priv->duplex = ((dev->mem_start & 0x06) == 0x06) ? 0
695 : (dev->mem_start & 0x06) >> 1;
696 priv->speed = ((dev->mem_start & 0x18) == 0x18) ? 0
697 : (dev->mem_start & 0x18) >> 3;
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400698
Sakari Ailusc659c382011-01-21 10:59:30 +0000699 if (priv->speed == 0x1)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700700 priv->speed = TLAN_SPEED_10;
Sakari Ailusc659c382011-01-21 10:59:30 +0000701 else if (priv->speed == 0x2)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700702 priv->speed = TLAN_SPEED_100;
Sakari Ailusc659c382011-01-21 10:59:30 +0000703
Linus Torvalds1da177e2005-04-16 15:20:36 -0700704 debug = priv->debug = dev->mem_end;
705 } else {
706 priv->aui = aui[boards_found];
707 priv->speed = speed[boards_found];
708 priv->duplex = duplex[boards_found];
709 priv->debug = debug;
710 }
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400711
Linus Torvalds1da177e2005-04-16 15:20:36 -0700712 /* This will be used when we get an adapter error from
713 * within our irq handler */
Sakari Ailusc659c382011-01-21 10:59:30 +0000714 INIT_WORK(&priv->tlan_tqueue, tlan_tx_timeout_work);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700715
716 spin_lock_init(&priv->lock);
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400717
Sakari Ailusc659c382011-01-21 10:59:30 +0000718 rc = tlan_init(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700719 if (rc) {
720 printk(KERN_ERR "TLAN: Could not set up device.\n");
721 goto err_out_free_dev;
722 }
723
724 rc = register_netdev(dev);
725 if (rc) {
726 printk(KERN_ERR "TLAN: Could not register device.\n");
727 goto err_out_uninit;
728 }
729
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400730
Sakari Ailusc659c382011-01-21 10:59:30 +0000731 tlan_devices_installed++;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700732 boards_found++;
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400733
Linus Torvalds1da177e2005-04-16 15:20:36 -0700734 /* pdev is NULL if this is an EISA device */
735 if (pdev)
736 tlan_have_pci++;
737 else {
Sakari Ailusc659c382011-01-21 10:59:30 +0000738 priv->next_device = tlan_eisa_devices;
739 tlan_eisa_devices = dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700740 tlan_have_eisa++;
741 }
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400742
Linus Torvalds1da177e2005-04-16 15:20:36 -0700743 printk(KERN_INFO "TLAN: %s irq=%2d, io=%04x, %s, Rev. %d\n",
Sakari Ailusc659c382011-01-21 10:59:30 +0000744 dev->name,
745 (int) dev->irq,
746 (int) dev->base_addr,
747 priv->adapter->device_label,
748 priv->adapter_rev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700749 return 0;
750
751err_out_uninit:
Sakari Ailusc659c382011-01-21 10:59:30 +0000752 pci_free_consistent(priv->pci_dev, priv->dma_size, priv->dma_storage,
753 priv->dma_storage_dma);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700754err_out_free_dev:
755 free_netdev(dev);
756err_out_regions:
757#ifdef CONFIG_PCI
758 if (pdev)
759 pci_release_regions(pdev);
760#endif
761err_out:
762 if (pdev)
763 pci_disable_device(pdev);
764 return rc;
765}
766
767
Sakari Ailusc659c382011-01-21 10:59:30 +0000768static void tlan_eisa_cleanup(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700769{
770 struct net_device *dev;
Sakari Ailusc659c382011-01-21 10:59:30 +0000771 struct tlan_priv *priv;
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400772
Sakari Ailusc659c382011-01-21 10:59:30 +0000773 while (tlan_have_eisa) {
774 dev = tlan_eisa_devices;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700775 priv = netdev_priv(dev);
Sakari Ailusc659c382011-01-21 10:59:30 +0000776 if (priv->dma_storage) {
777 pci_free_consistent(priv->pci_dev, priv->dma_size,
778 priv->dma_storage,
779 priv->dma_storage_dma);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700780 }
Sakari Ailusc659c382011-01-21 10:59:30 +0000781 release_region(dev->base_addr, 0x10);
782 unregister_netdev(dev);
783 tlan_eisa_devices = priv->next_device;
784 free_netdev(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700785 tlan_have_eisa--;
786 }
787}
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400788
789
Linus Torvalds1da177e2005-04-16 15:20:36 -0700790static void __exit tlan_exit(void)
791{
792 pci_unregister_driver(&tlan_driver);
793
794 if (tlan_have_eisa)
Sakari Ailusc659c382011-01-21 10:59:30 +0000795 tlan_eisa_cleanup();
Linus Torvalds1da177e2005-04-16 15:20:36 -0700796
Linus Torvalds1da177e2005-04-16 15:20:36 -0700797}
798
799
800/* Module loading/unloading */
801module_init(tlan_probe);
802module_exit(tlan_exit);
803
804
805
Sakari Ailusc659c382011-01-21 10:59:30 +0000806/**************************************************************
807 * tlan_eisa_probe
808 *
809 * Returns: 0 on success, 1 otherwise
810 *
811 * Parms: None
812 *
813 *
814 * This functions probes for EISA devices and calls
815 * TLan_probe1 when one is found.
816 *
817 *************************************************************/
Linus Torvalds1da177e2005-04-16 15:20:36 -0700818
Sakari Ailusc659c382011-01-21 10:59:30 +0000819static void __init tlan_eisa_probe(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700820{
Sakari Ailusc659c382011-01-21 10:59:30 +0000821 long ioaddr;
822 int rc = -ENODEV;
823 int irq;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700824 u16 device_id;
825
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400826 if (!EISA_bus) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700827 TLAN_DBG(TLAN_DEBUG_PROBE, "No EISA bus present\n");
828 return;
829 }
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400830
Linus Torvalds1da177e2005-04-16 15:20:36 -0700831 /* Loop through all slots of the EISA bus */
832 for (ioaddr = 0x1000; ioaddr < 0x9000; ioaddr += 0x1000) {
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400833
Sakari Ailusc659c382011-01-21 10:59:30 +0000834 TLAN_DBG(TLAN_DEBUG_PROBE, "EISA_ID 0x%4x: 0x%4x\n",
835 (int) ioaddr + 0xc80, inw(ioaddr + EISA_ID));
836 TLAN_DBG(TLAN_DEBUG_PROBE, "EISA_ID 0x%4x: 0x%4x\n",
837 (int) ioaddr + 0xc82, inw(ioaddr + EISA_ID2));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700838
839
Sakari Ailusc659c382011-01-21 10:59:30 +0000840 TLAN_DBG(TLAN_DEBUG_PROBE,
841 "Probing for EISA adapter at IO: 0x%4x : ",
842 (int) ioaddr);
843 if (request_region(ioaddr, 0x10, tlan_signature) == NULL)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700844 goto out;
845
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400846 if (inw(ioaddr + EISA_ID) != 0x110E) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700847 release_region(ioaddr, 0x10);
848 goto out;
849 }
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400850
Linus Torvalds1da177e2005-04-16 15:20:36 -0700851 device_id = inw(ioaddr + EISA_ID2);
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400852 if (device_id != 0x20F1 && device_id != 0x40F1) {
Sakari Ailusc659c382011-01-21 10:59:30 +0000853 release_region(ioaddr, 0x10);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700854 goto out;
855 }
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400856
Sakari Ailusc659c382011-01-21 10:59:30 +0000857 /* check if adapter is enabled */
858 if (inb(ioaddr + EISA_CR) != 0x1) {
859 release_region(ioaddr, 0x10);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700860 goto out2;
861 }
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400862
863 if (debug == 0x10)
Sakari Ailusc659c382011-01-21 10:59:30 +0000864 printk(KERN_INFO "Found one\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700865
866
867 /* Get irq from board */
Sakari Ailusc659c382011-01-21 10:59:30 +0000868 switch (inb(ioaddr + 0xcc0)) {
869 case(0x10):
870 irq = 5;
871 break;
872 case(0x20):
873 irq = 9;
874 break;
875 case(0x40):
876 irq = 10;
877 break;
878 case(0x80):
879 irq = 11;
880 break;
881 default:
882 goto out;
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400883 }
884
885
Linus Torvalds1da177e2005-04-16 15:20:36 -0700886 /* Setup the newly found eisa adapter */
Sakari Ailusc659c382011-01-21 10:59:30 +0000887 rc = tlan_probe1(NULL, ioaddr, irq,
888 12, NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700889 continue;
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400890
Sakari Ailusc659c382011-01-21 10:59:30 +0000891out:
892 if (debug == 0x10)
893 printk(KERN_INFO "None found\n");
894 continue;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700895
Sakari Ailusc659c382011-01-21 10:59:30 +0000896out2:
897 if (debug == 0x10)
898 printk(KERN_INFO "Card found but it is not enabled, skipping\n");
899 continue;
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400900
Linus Torvalds1da177e2005-04-16 15:20:36 -0700901 }
902
Sakari Ailusc659c382011-01-21 10:59:30 +0000903}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700904
905#ifdef CONFIG_NET_POLL_CONTROLLER
Sakari Ailusc659c382011-01-21 10:59:30 +0000906static void tlan_poll(struct net_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700907{
908 disable_irq(dev->irq);
Sakari Ailusc659c382011-01-21 10:59:30 +0000909 tlan_handle_interrupt(dev->irq, dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700910 enable_irq(dev->irq);
911}
912#endif
913
Sakari Ailusc659c382011-01-21 10:59:30 +0000914static const struct net_device_ops tlan_netdev_ops = {
915 .ndo_open = tlan_open,
916 .ndo_stop = tlan_close,
917 .ndo_start_xmit = tlan_start_tx,
918 .ndo_tx_timeout = tlan_tx_timeout,
919 .ndo_get_stats = tlan_get_stats,
920 .ndo_set_multicast_list = tlan_set_multicast_list,
921 .ndo_do_ioctl = tlan_ioctl,
Stephen Hemminger391c5e62009-01-07 17:27:15 -0800922 .ndo_change_mtu = eth_change_mtu,
Sakari Ailusc659c382011-01-21 10:59:30 +0000923 .ndo_set_mac_address = eth_mac_addr,
Stephen Hemminger391c5e62009-01-07 17:27:15 -0800924 .ndo_validate_addr = eth_validate_addr,
925#ifdef CONFIG_NET_POLL_CONTROLLER
Sakari Ailusc659c382011-01-21 10:59:30 +0000926 .ndo_poll_controller = tlan_poll,
Stephen Hemminger391c5e62009-01-07 17:27:15 -0800927#endif
928};
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400929
Linus Torvalds1da177e2005-04-16 15:20:36 -0700930
931
Sakari Ailusc659c382011-01-21 10:59:30 +0000932/***************************************************************
933 * tlan_init
934 *
935 * Returns:
936 * 0 on success, error code otherwise.
937 * Parms:
938 * dev The structure of the device to be
939 * init'ed.
940 *
941 * This function completes the initialization of the
942 * device structure and driver. It reserves the IO
943 * addresses, allocates memory for the lists and bounce
944 * buffers, retrieves the MAC address from the eeprom
945 * and assignes the device's methods.
946 *
947 **************************************************************/
Linus Torvalds1da177e2005-04-16 15:20:36 -0700948
Sakari Ailusc659c382011-01-21 10:59:30 +0000949static int tlan_init(struct net_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700950{
951 int dma_size;
Sakari Ailusc659c382011-01-21 10:59:30 +0000952 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700953 int i;
Sakari Ailusc659c382011-01-21 10:59:30 +0000954 struct tlan_priv *priv;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700955
956 priv = netdev_priv(dev);
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400957
Sakari Ailusc659c382011-01-21 10:59:30 +0000958 dma_size = (TLAN_NUM_RX_LISTS + TLAN_NUM_TX_LISTS)
959 * (sizeof(struct tlan_list));
960 priv->dma_storage = pci_alloc_consistent(priv->pci_dev,
961 dma_size,
962 &priv->dma_storage_dma);
963 priv->dma_size = dma_size;
Jeff Garzik6aa20a22006-09-13 13:24:59 -0400964
Sakari Ailusc659c382011-01-21 10:59:30 +0000965 if (priv->dma_storage == NULL) {
966 printk(KERN_ERR
967 "TLAN: Could not allocate lists and buffers for %s.\n",
968 dev->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700969 return -ENOMEM;
970 }
Sakari Ailusc659c382011-01-21 10:59:30 +0000971 memset(priv->dma_storage, 0, dma_size);
972 priv->rx_list = (struct tlan_list *)
973 ALIGN((unsigned long)priv->dma_storage, 8);
974 priv->rx_list_dma = ALIGN(priv->dma_storage_dma, 8);
975 priv->tx_list = priv->rx_list + TLAN_NUM_RX_LISTS;
976 priv->tx_list_dma =
977 priv->rx_list_dma + sizeof(struct tlan_list)*TLAN_NUM_RX_LISTS;
Stephen Hemminger93e16842008-05-30 09:49:55 -0700978
Linus Torvalds1da177e2005-04-16 15:20:36 -0700979 err = 0;
Sakari Ailusc659c382011-01-21 10:59:30 +0000980 for (i = 0; i < 6 ; i++)
981 err |= tlan_ee_read_byte(dev,
982 (u8) priv->adapter->addr_ofs + i,
983 (u8 *) &dev->dev_addr[i]);
984 if (err) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700985 printk(KERN_ERR "TLAN: %s: Error reading MAC from eeprom: %d\n",
Sakari Ailusc659c382011-01-21 10:59:30 +0000986 dev->name,
987 err);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700988 }
989 dev->addr_len = 6;
990
991 netif_carrier_off(dev);
992
993 /* Device methods */
Sakari Ailusc659c382011-01-21 10:59:30 +0000994 dev->netdev_ops = &tlan_netdev_ops;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700995 dev->watchdog_timeo = TX_TIMEOUT;
996
997 return 0;
998
Sakari Ailusc659c382011-01-21 10:59:30 +0000999}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001000
1001
1002
1003
Sakari Ailusc659c382011-01-21 10:59:30 +00001004/***************************************************************
1005 * tlan_open
1006 *
1007 * Returns:
1008 * 0 on success, error code otherwise.
1009 * Parms:
1010 * dev Structure of device to be opened.
1011 *
1012 * This routine puts the driver and TLAN adapter in a
1013 * state where it is ready to send and receive packets.
1014 * It allocates the IRQ, resets and brings the adapter
1015 * out of reset, and allows interrupts. It also delays
1016 * the startup for autonegotiation or sends a Rx GO
1017 * command to the adapter, as appropriate.
1018 *
1019 **************************************************************/
Linus Torvalds1da177e2005-04-16 15:20:36 -07001020
Sakari Ailusc659c382011-01-21 10:59:30 +00001021static int tlan_open(struct net_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001022{
Sakari Ailusc659c382011-01-21 10:59:30 +00001023 struct tlan_priv *priv = netdev_priv(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001024 int err;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001025
Sakari Ailusc659c382011-01-21 10:59:30 +00001026 priv->tlan_rev = tlan_dio_read8(dev->base_addr, TLAN_DEF_REVISION);
1027 err = request_irq(dev->irq, tlan_handle_interrupt, IRQF_SHARED,
1028 dev->name, dev);
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001029
Sakari Ailusc659c382011-01-21 10:59:30 +00001030 if (err) {
Stephen Hemmingerdfc2c0a2008-05-30 09:49:58 -07001031 pr_err("TLAN: Cannot open %s because IRQ %d is already in use.\n",
Sakari Ailusc659c382011-01-21 10:59:30 +00001032 dev->name, dev->irq);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001033 return err;
1034 }
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001035
Linus Torvalds1da177e2005-04-16 15:20:36 -07001036 init_timer(&priv->timer);
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001037
Sakari Ailusfa6d5d42011-01-21 10:59:31 +00001038 tlan_start(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001039
Sakari Ailusc659c382011-01-21 10:59:30 +00001040 TLAN_DBG(TLAN_DEBUG_GNRL, "%s: Opened. TLAN Chip Rev: %x\n",
1041 dev->name, priv->tlan_rev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001042
1043 return 0;
1044
Sakari Ailusc659c382011-01-21 10:59:30 +00001045}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001046
1047
1048
Sakari Ailusc659c382011-01-21 10:59:30 +00001049/**************************************************************
1050 * tlan_ioctl
1051 *
1052 * Returns:
1053 * 0 on success, error code otherwise
1054 * Params:
1055 * dev structure of device to receive ioctl.
1056 *
1057 * rq ifreq structure to hold userspace data.
1058 *
1059 * cmd ioctl command.
1060 *
1061 *
1062 *************************************************************/
Linus Torvalds1da177e2005-04-16 15:20:36 -07001063
Sakari Ailusc659c382011-01-21 10:59:30 +00001064static int tlan_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001065{
Sakari Ailusc659c382011-01-21 10:59:30 +00001066 struct tlan_priv *priv = netdev_priv(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001067 struct mii_ioctl_data *data = if_mii(rq);
Sakari Ailusc659c382011-01-21 10:59:30 +00001068 u32 phy = priv->phy[priv->phy_num];
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001069
Sakari Ailusc659c382011-01-21 10:59:30 +00001070 if (!priv->phy_online)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001071 return -EAGAIN;
1072
Sakari Ailusc659c382011-01-21 10:59:30 +00001073 switch (cmd) {
1074 case SIOCGMIIPHY: /* get address of MII PHY in use. */
1075 data->phy_id = phy;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001076
1077
Sakari Ailusc659c382011-01-21 10:59:30 +00001078 case SIOCGMIIREG: /* read MII PHY register. */
1079 tlan_mii_read_reg(dev, data->phy_id & 0x1f,
1080 data->reg_num & 0x1f, &data->val_out);
1081 return 0;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001082
Linus Torvalds1da177e2005-04-16 15:20:36 -07001083
Sakari Ailusc659c382011-01-21 10:59:30 +00001084 case SIOCSMIIREG: /* write MII PHY register. */
1085 tlan_mii_write_reg(dev, data->phy_id & 0x1f,
1086 data->reg_num & 0x1f, data->val_in);
1087 return 0;
1088 default:
1089 return -EOPNOTSUPP;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001090 }
Sakari Ailusc659c382011-01-21 10:59:30 +00001091}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001092
1093
Sakari Ailusc659c382011-01-21 10:59:30 +00001094/***************************************************************
1095 * tlan_tx_timeout
1096 *
1097 * Returns: nothing
1098 *
1099 * Params:
1100 * dev structure of device which timed out
1101 * during transmit.
1102 *
1103 **************************************************************/
Linus Torvalds1da177e2005-04-16 15:20:36 -07001104
Sakari Ailusc659c382011-01-21 10:59:30 +00001105static void tlan_tx_timeout(struct net_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001106{
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001107
Sakari Ailusc659c382011-01-21 10:59:30 +00001108 TLAN_DBG(TLAN_DEBUG_GNRL, "%s: Transmit timed out.\n", dev->name);
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001109
Linus Torvalds1da177e2005-04-16 15:20:36 -07001110 /* Ok so we timed out, lets see what we can do about it...*/
Sakari Ailusc659c382011-01-21 10:59:30 +00001111 tlan_free_lists(dev);
1112 tlan_reset_lists(dev);
1113 tlan_read_and_clear_stats(dev, TLAN_IGNORE);
1114 tlan_reset_adapter(dev);
Eric Dumazet1ae5dc32010-05-10 05:01:31 -07001115 dev->trans_start = jiffies; /* prevent tx timeout */
Sakari Ailusc659c382011-01-21 10:59:30 +00001116 netif_wake_queue(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001117
1118}
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001119
Linus Torvalds1da177e2005-04-16 15:20:36 -07001120
Sakari Ailusc659c382011-01-21 10:59:30 +00001121/***************************************************************
1122 * tlan_tx_timeout_work
1123 *
1124 * Returns: nothing
1125 *
1126 * Params:
1127 * work work item of device which timed out
1128 *
1129 **************************************************************/
David Howellsc4028952006-11-22 14:57:56 +00001130
Sakari Ailusc659c382011-01-21 10:59:30 +00001131static void tlan_tx_timeout_work(struct work_struct *work)
David Howellsc4028952006-11-22 14:57:56 +00001132{
Sakari Ailusc659c382011-01-21 10:59:30 +00001133 struct tlan_priv *priv =
1134 container_of(work, struct tlan_priv, tlan_tqueue);
David Howellsc4028952006-11-22 14:57:56 +00001135
Sakari Ailusc659c382011-01-21 10:59:30 +00001136 tlan_tx_timeout(priv->dev);
David Howellsc4028952006-11-22 14:57:56 +00001137}
1138
1139
Linus Torvalds1da177e2005-04-16 15:20:36 -07001140
Sakari Ailusc659c382011-01-21 10:59:30 +00001141/***************************************************************
1142 * tlan_start_tx
1143 *
1144 * Returns:
1145 * 0 on success, non-zero on failure.
1146 * Parms:
1147 * skb A pointer to the sk_buff containing the
1148 * frame to be sent.
1149 * dev The device to send the data on.
1150 *
1151 * This function adds a frame to the Tx list to be sent
1152 * ASAP. First it verifies that the adapter is ready and
1153 * there is room in the queue. Then it sets up the next
1154 * available list, copies the frame to the corresponding
1155 * buffer. If the adapter Tx channel is idle, it gives
1156 * the adapter a Tx Go command on the list, otherwise it
1157 * sets the forward address of the previous list to point
1158 * to this one. Then it frees the sk_buff.
1159 *
1160 **************************************************************/
Linus Torvalds1da177e2005-04-16 15:20:36 -07001161
Sakari Ailusc659c382011-01-21 10:59:30 +00001162static netdev_tx_t tlan_start_tx(struct sk_buff *skb, struct net_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001163{
Sakari Ailusc659c382011-01-21 10:59:30 +00001164 struct tlan_priv *priv = netdev_priv(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001165 dma_addr_t tail_list_phys;
Sakari Ailusc659c382011-01-21 10:59:30 +00001166 struct tlan_list *tail_list;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001167 unsigned long flags;
Sakari Ailus8953f122008-12-16 01:44:05 -08001168 unsigned int txlen;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001169
Sakari Ailusc659c382011-01-21 10:59:30 +00001170 if (!priv->phy_online) {
1171 TLAN_DBG(TLAN_DEBUG_TX, "TRANSMIT: %s PHY is not ready\n",
1172 dev->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001173 dev_kfree_skb_any(skb);
Patrick McHardy6ed10652009-06-23 06:03:08 +00001174 return NETDEV_TX_OK;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001175 }
1176
Stephen Hemminger41873e92008-05-30 09:49:52 -07001177 if (skb_padto(skb, TLAN_MIN_FRAME_SIZE))
Patrick McHardy6ed10652009-06-23 06:03:08 +00001178 return NETDEV_TX_OK;
Sakari Ailus8953f122008-12-16 01:44:05 -08001179 txlen = max(skb->len, (unsigned int)TLAN_MIN_FRAME_SIZE);
Stephen Hemminger41873e92008-05-30 09:49:52 -07001180
Sakari Ailusc659c382011-01-21 10:59:30 +00001181 tail_list = priv->tx_list + priv->tx_tail;
1182 tail_list_phys =
1183 priv->tx_list_dma + sizeof(struct tlan_list)*priv->tx_tail;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001184
Sakari Ailusc659c382011-01-21 10:59:30 +00001185 if (tail_list->c_stat != TLAN_CSTAT_UNUSED) {
1186 TLAN_DBG(TLAN_DEBUG_TX,
1187 "TRANSMIT: %s is busy (Head=%d Tail=%d)\n",
1188 dev->name, priv->tx_head, priv->tx_tail);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001189 netif_stop_queue(dev);
Sakari Ailusc659c382011-01-21 10:59:30 +00001190 priv->tx_busy_count++;
Patrick McHardy5b548142009-06-12 06:22:29 +00001191 return NETDEV_TX_BUSY;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001192 }
1193
1194 tail_list->forward = 0;
1195
Sakari Ailusc659c382011-01-21 10:59:30 +00001196 tail_list->buffer[0].address = pci_map_single(priv->pci_dev,
Sakari Ailus5eeabf52008-12-16 15:24:05 -08001197 skb->data, txlen,
1198 PCI_DMA_TODEVICE);
Sakari Ailusc659c382011-01-21 10:59:30 +00001199 tlan_store_skb(tail_list, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001200
Sakari Ailusc659c382011-01-21 10:59:30 +00001201 tail_list->frame_size = (u16) txlen;
Sakari Ailus8953f122008-12-16 01:44:05 -08001202 tail_list->buffer[0].count = TLAN_LAST_BUFFER | (u32) txlen;
Stephen Hemminger41873e92008-05-30 09:49:52 -07001203 tail_list->buffer[1].count = 0;
1204 tail_list->buffer[1].address = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001205
1206 spin_lock_irqsave(&priv->lock, flags);
Sakari Ailusc659c382011-01-21 10:59:30 +00001207 tail_list->c_stat = TLAN_CSTAT_READY;
1208 if (!priv->tx_in_progress) {
1209 priv->tx_in_progress = 1;
1210 TLAN_DBG(TLAN_DEBUG_TX,
1211 "TRANSMIT: Starting TX on buffer %d\n",
1212 priv->tx_tail);
1213 outl(tail_list_phys, dev->base_addr + TLAN_CH_PARM);
1214 outl(TLAN_HC_GO, dev->base_addr + TLAN_HOST_CMD);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001215 } else {
Sakari Ailusc659c382011-01-21 10:59:30 +00001216 TLAN_DBG(TLAN_DEBUG_TX,
1217 "TRANSMIT: Adding buffer %d to TX channel\n",
1218 priv->tx_tail);
1219 if (priv->tx_tail == 0) {
1220 (priv->tx_list + (TLAN_NUM_TX_LISTS - 1))->forward
Stephen Hemmingerdfc2c0a2008-05-30 09:49:58 -07001221 = tail_list_phys;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001222 } else {
Sakari Ailusc659c382011-01-21 10:59:30 +00001223 (priv->tx_list + (priv->tx_tail - 1))->forward
Stephen Hemmingerdfc2c0a2008-05-30 09:49:58 -07001224 = tail_list_phys;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001225 }
1226 }
1227 spin_unlock_irqrestore(&priv->lock, flags);
1228
Sakari Ailusc659c382011-01-21 10:59:30 +00001229 CIRC_INC(priv->tx_tail, TLAN_NUM_TX_LISTS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001230
Patrick McHardy6ed10652009-06-23 06:03:08 +00001231 return NETDEV_TX_OK;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001232
Sakari Ailusc659c382011-01-21 10:59:30 +00001233}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001234
1235
1236
1237
Sakari Ailusc659c382011-01-21 10:59:30 +00001238/***************************************************************
1239 * tlan_handle_interrupt
1240 *
1241 * Returns:
1242 * Nothing
1243 * Parms:
1244 * irq The line on which the interrupt
1245 * occurred.
1246 * dev_id A pointer to the device assigned to
1247 * this irq line.
1248 *
1249 * This function handles an interrupt generated by its
1250 * assigned TLAN adapter. The function deactivates
1251 * interrupts on its adapter, records the type of
1252 * interrupt, executes the appropriate subhandler, and
1253 * acknowdges the interrupt to the adapter (thus
1254 * re-enabling adapter interrupts.
1255 *
1256 **************************************************************/
Linus Torvalds1da177e2005-04-16 15:20:36 -07001257
Sakari Ailusc659c382011-01-21 10:59:30 +00001258static irqreturn_t tlan_handle_interrupt(int irq, void *dev_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001259{
Stephen Hemmingera3ccc782008-05-30 09:49:57 -07001260 struct net_device *dev = dev_id;
Sakari Ailusc659c382011-01-21 10:59:30 +00001261 struct tlan_priv *priv = netdev_priv(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001262 u16 host_int;
Stephen Hemmingera3ccc782008-05-30 09:49:57 -07001263 u16 type;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001264
1265 spin_lock(&priv->lock);
1266
Sakari Ailusc659c382011-01-21 10:59:30 +00001267 host_int = inw(dev->base_addr + TLAN_HOST_INT);
1268 type = (host_int & TLAN_HI_IT_MASK) >> 2;
1269 if (type) {
Stephen Hemmingera3ccc782008-05-30 09:49:57 -07001270 u32 ack;
1271 u32 host_cmd;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001272
Sakari Ailusc659c382011-01-21 10:59:30 +00001273 outw(host_int, dev->base_addr + TLAN_HOST_INT);
1274 ack = tlan_int_vector[type](dev, host_int);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001275
Sakari Ailusc659c382011-01-21 10:59:30 +00001276 if (ack) {
1277 host_cmd = TLAN_HC_ACK | ack | (type << 18);
1278 outl(host_cmd, dev->base_addr + TLAN_HOST_CMD);
Stephen Hemmingera3ccc782008-05-30 09:49:57 -07001279 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001280 }
1281
1282 spin_unlock(&priv->lock);
1283
Stephen Hemmingera3ccc782008-05-30 09:49:57 -07001284 return IRQ_RETVAL(type);
Sakari Ailusc659c382011-01-21 10:59:30 +00001285}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001286
1287
1288
1289
Sakari Ailusc659c382011-01-21 10:59:30 +00001290/***************************************************************
1291 * tlan_close
1292 *
1293 * Returns:
1294 * An error code.
1295 * Parms:
1296 * dev The device structure of the device to
1297 * close.
1298 *
1299 * This function shuts down the adapter. It records any
1300 * stats, puts the adapter into reset state, deactivates
1301 * its time as needed, and frees the irq it is using.
1302 *
1303 **************************************************************/
Linus Torvalds1da177e2005-04-16 15:20:36 -07001304
Sakari Ailusc659c382011-01-21 10:59:30 +00001305static int tlan_close(struct net_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001306{
Sakari Ailusc659c382011-01-21 10:59:30 +00001307 struct tlan_priv *priv = netdev_priv(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001308
Linus Torvalds1da177e2005-04-16 15:20:36 -07001309 priv->neg_be_verbose = 0;
Sakari Ailusfa6d5d42011-01-21 10:59:31 +00001310 tlan_stop(dev);
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001311
Sakari Ailusc659c382011-01-21 10:59:30 +00001312 free_irq(dev->irq, dev);
1313 tlan_free_lists(dev);
1314 TLAN_DBG(TLAN_DEBUG_GNRL, "Device %s closed.\n", dev->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001315
1316 return 0;
1317
Sakari Ailusc659c382011-01-21 10:59:30 +00001318}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001319
1320
1321
1322
Sakari Ailusc659c382011-01-21 10:59:30 +00001323/***************************************************************
1324 * tlan_get_stats
1325 *
1326 * Returns:
1327 * A pointer to the device's statistics structure.
1328 * Parms:
1329 * dev The device structure to return the
1330 * stats for.
1331 *
1332 * This function updates the devices statistics by reading
1333 * the TLAN chip's onboard registers. Then it returns the
1334 * address of the statistics structure.
1335 *
1336 **************************************************************/
Linus Torvalds1da177e2005-04-16 15:20:36 -07001337
Sakari Ailusc659c382011-01-21 10:59:30 +00001338static struct net_device_stats *tlan_get_stats(struct net_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001339{
Sakari Ailusc659c382011-01-21 10:59:30 +00001340 struct tlan_priv *priv = netdev_priv(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001341 int i;
1342
1343 /* Should only read stats if open ? */
Sakari Ailusc659c382011-01-21 10:59:30 +00001344 tlan_read_and_clear_stats(dev, TLAN_RECORD);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001345
Sakari Ailusc659c382011-01-21 10:59:30 +00001346 TLAN_DBG(TLAN_DEBUG_RX, "RECEIVE: %s EOC count = %d\n", dev->name,
1347 priv->rx_eoc_count);
1348 TLAN_DBG(TLAN_DEBUG_TX, "TRANSMIT: %s Busy count = %d\n", dev->name,
1349 priv->tx_busy_count);
1350 if (debug & TLAN_DEBUG_GNRL) {
1351 tlan_print_dio(dev->base_addr);
1352 tlan_phy_print(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001353 }
Sakari Ailusc659c382011-01-21 10:59:30 +00001354 if (debug & TLAN_DEBUG_LIST) {
1355 for (i = 0; i < TLAN_NUM_RX_LISTS; i++)
1356 tlan_print_list(priv->rx_list + i, "RX", i);
1357 for (i = 0; i < TLAN_NUM_TX_LISTS; i++)
1358 tlan_print_list(priv->tx_list + i, "TX", i);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001359 }
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001360
Stephen Hemmingerf8f31542008-05-30 09:49:53 -07001361 return &dev->stats;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001362
Sakari Ailusc659c382011-01-21 10:59:30 +00001363}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001364
1365
1366
1367
Sakari Ailusc659c382011-01-21 10:59:30 +00001368/***************************************************************
1369 * tlan_set_multicast_list
1370 *
1371 * Returns:
1372 * Nothing
1373 * Parms:
1374 * dev The device structure to set the
1375 * multicast list for.
1376 *
1377 * This function sets the TLAN adaptor to various receive
1378 * modes. If the IFF_PROMISC flag is set, promiscuous
1379 * mode is acitviated. Otherwise, promiscuous mode is
1380 * turned off. If the IFF_ALLMULTI flag is set, then
1381 * the hash table is set to receive all group addresses.
1382 * Otherwise, the first three multicast addresses are
1383 * stored in AREG_1-3, and the rest are selected via the
1384 * hash table, as necessary.
1385 *
1386 **************************************************************/
Linus Torvalds1da177e2005-04-16 15:20:36 -07001387
Sakari Ailusc659c382011-01-21 10:59:30 +00001388static void tlan_set_multicast_list(struct net_device *dev)
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001389{
Jiri Pirko22bedad32010-04-01 21:22:57 +00001390 struct netdev_hw_addr *ha;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001391 u32 hash1 = 0;
1392 u32 hash2 = 0;
1393 int i;
1394 u32 offset;
1395 u8 tmp;
1396
Sakari Ailusc659c382011-01-21 10:59:30 +00001397 if (dev->flags & IFF_PROMISC) {
1398 tmp = tlan_dio_read8(dev->base_addr, TLAN_NET_CMD);
1399 tlan_dio_write8(dev->base_addr,
1400 TLAN_NET_CMD, tmp | TLAN_NET_CMD_CAF);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001401 } else {
Sakari Ailusc659c382011-01-21 10:59:30 +00001402 tmp = tlan_dio_read8(dev->base_addr, TLAN_NET_CMD);
1403 tlan_dio_write8(dev->base_addr,
1404 TLAN_NET_CMD, tmp & ~TLAN_NET_CMD_CAF);
1405 if (dev->flags & IFF_ALLMULTI) {
1406 for (i = 0; i < 3; i++)
1407 tlan_set_mac(dev, i + 1, NULL);
1408 tlan_dio_write32(dev->base_addr, TLAN_HASH_1,
1409 0xffffffff);
1410 tlan_dio_write32(dev->base_addr, TLAN_HASH_2,
1411 0xffffffff);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001412 } else {
Jiri Pirko567ec872010-02-23 23:17:07 +00001413 i = 0;
Jiri Pirko22bedad32010-04-01 21:22:57 +00001414 netdev_for_each_mc_addr(ha, dev) {
Sakari Ailusc659c382011-01-21 10:59:30 +00001415 if (i < 3) {
1416 tlan_set_mac(dev, i + 1,
Jiri Pirko22bedad32010-04-01 21:22:57 +00001417 (char *) &ha->addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001418 } else {
Sakari Ailusc659c382011-01-21 10:59:30 +00001419 offset =
1420 tlan_hash_func((u8 *)&ha->addr);
1421 if (offset < 32)
1422 hash1 |= (1 << offset);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001423 else
Sakari Ailusc659c382011-01-21 10:59:30 +00001424 hash2 |= (1 << (offset - 32));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001425 }
Jiri Pirko567ec872010-02-23 23:17:07 +00001426 i++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001427 }
Sakari Ailusc659c382011-01-21 10:59:30 +00001428 for ( ; i < 3; i++)
1429 tlan_set_mac(dev, i + 1, NULL);
1430 tlan_dio_write32(dev->base_addr, TLAN_HASH_1, hash1);
1431 tlan_dio_write32(dev->base_addr, TLAN_HASH_2, hash2);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001432 }
1433 }
1434
Sakari Ailusc659c382011-01-21 10:59:30 +00001435}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001436
1437
1438
1439/*****************************************************************************
1440******************************************************************************
1441
Sakari Ailusc659c382011-01-21 10:59:30 +00001442ThunderLAN driver interrupt vectors and table
Linus Torvalds1da177e2005-04-16 15:20:36 -07001443
Sakari Ailusc659c382011-01-21 10:59:30 +00001444please see chap. 4, "Interrupt Handling" of the "ThunderLAN
1445Programmer's Guide" for more informations on handling interrupts
1446generated by TLAN based adapters.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001447
1448******************************************************************************
1449*****************************************************************************/
1450
1451
Linus Torvalds1da177e2005-04-16 15:20:36 -07001452
1453
Sakari Ailusc659c382011-01-21 10:59:30 +00001454/***************************************************************
1455 * tlan_handle_tx_eof
1456 *
1457 * Returns:
1458 * 1
1459 * Parms:
1460 * dev Device assigned the IRQ that was
1461 * raised.
1462 * host_int The contents of the HOST_INT
1463 * port.
1464 *
1465 * This function handles Tx EOF interrupts which are raised
1466 * by the adapter when it has completed sending the
1467 * contents of a buffer. If detemines which list/buffer
1468 * was completed and resets it. If the buffer was the last
1469 * in the channel (EOC), then the function checks to see if
1470 * another buffer is ready to send, and if so, sends a Tx
1471 * Go command. Finally, the driver activates/continues the
1472 * activity LED.
1473 *
1474 **************************************************************/
Linus Torvalds1da177e2005-04-16 15:20:36 -07001475
Sakari Ailusc659c382011-01-21 10:59:30 +00001476static u32 tlan_handle_tx_eof(struct net_device *dev, u16 host_int)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001477{
Sakari Ailusc659c382011-01-21 10:59:30 +00001478 struct tlan_priv *priv = netdev_priv(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001479 int eoc = 0;
Sakari Ailusc659c382011-01-21 10:59:30 +00001480 struct tlan_list *head_list;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001481 dma_addr_t head_list_phys;
1482 u32 ack = 0;
Sakari Ailusc659c382011-01-21 10:59:30 +00001483 u16 tmp_c_stat;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001484
Sakari Ailusc659c382011-01-21 10:59:30 +00001485 TLAN_DBG(TLAN_DEBUG_TX,
1486 "TRANSMIT: Handling TX EOF (Head=%d Tail=%d)\n",
1487 priv->tx_head, priv->tx_tail);
1488 head_list = priv->tx_list + priv->tx_head;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001489
Sakari Ailusc659c382011-01-21 10:59:30 +00001490 while (((tmp_c_stat = head_list->c_stat) & TLAN_CSTAT_FRM_CMP)
1491 && (ack < 255)) {
1492 struct sk_buff *skb = tlan_get_skb(head_list);
Sakari Ailus5eeabf52008-12-16 15:24:05 -08001493
Linus Torvalds1da177e2005-04-16 15:20:36 -07001494 ack++;
Sakari Ailusc659c382011-01-21 10:59:30 +00001495 pci_unmap_single(priv->pci_dev, head_list->buffer[0].address,
Sakari Ailus5eeabf52008-12-16 15:24:05 -08001496 max(skb->len,
1497 (unsigned int)TLAN_MIN_FRAME_SIZE),
1498 PCI_DMA_TODEVICE);
1499 dev_kfree_skb_any(skb);
1500 head_list->buffer[8].address = 0;
1501 head_list->buffer[9].address = 0;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001502
Sakari Ailusc659c382011-01-21 10:59:30 +00001503 if (tmp_c_stat & TLAN_CSTAT_EOC)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001504 eoc = 1;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001505
Sakari Ailusc659c382011-01-21 10:59:30 +00001506 dev->stats.tx_bytes += head_list->frame_size;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001507
Sakari Ailusc659c382011-01-21 10:59:30 +00001508 head_list->c_stat = TLAN_CSTAT_UNUSED;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001509 netif_start_queue(dev);
Sakari Ailusc659c382011-01-21 10:59:30 +00001510 CIRC_INC(priv->tx_head, TLAN_NUM_TX_LISTS);
1511 head_list = priv->tx_list + priv->tx_head;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001512 }
1513
1514 if (!ack)
Sakari Ailusc659c382011-01-21 10:59:30 +00001515 printk(KERN_INFO
1516 "TLAN: Received interrupt for uncompleted TX frame.\n");
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001517
Sakari Ailusc659c382011-01-21 10:59:30 +00001518 if (eoc) {
1519 TLAN_DBG(TLAN_DEBUG_TX,
1520 "TRANSMIT: handling TX EOC (Head=%d Tail=%d)\n",
1521 priv->tx_head, priv->tx_tail);
1522 head_list = priv->tx_list + priv->tx_head;
1523 head_list_phys = priv->tx_list_dma
1524 + sizeof(struct tlan_list)*priv->tx_head;
1525 if (head_list->c_stat & TLAN_CSTAT_READY) {
1526 outl(head_list_phys, dev->base_addr + TLAN_CH_PARM);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001527 ack |= TLAN_HC_GO;
1528 } else {
Sakari Ailusc659c382011-01-21 10:59:30 +00001529 priv->tx_in_progress = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001530 }
1531 }
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001532
Sakari Ailusc659c382011-01-21 10:59:30 +00001533 if (priv->adapter->flags & TLAN_ADAPTER_ACTIVITY_LED) {
1534 tlan_dio_write8(dev->base_addr,
1535 TLAN_LED_REG, TLAN_LED_LINK | TLAN_LED_ACT);
1536 if (priv->timer.function == NULL) {
1537 priv->timer.function = tlan_timer;
1538 priv->timer.data = (unsigned long) dev;
1539 priv->timer.expires = jiffies + TLAN_TIMER_ACT_DELAY;
1540 priv->timer_set_at = jiffies;
1541 priv->timer_type = TLAN_TIMER_ACTIVITY;
1542 add_timer(&priv->timer);
1543 } else if (priv->timer_type == TLAN_TIMER_ACTIVITY) {
1544 priv->timer_set_at = jiffies;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001545 }
1546 }
1547
1548 return ack;
1549
Sakari Ailusc659c382011-01-21 10:59:30 +00001550}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001551
1552
1553
1554
Sakari Ailusc659c382011-01-21 10:59:30 +00001555/***************************************************************
1556 * TLan_HandleStatOverflow
1557 *
1558 * Returns:
1559 * 1
1560 * Parms:
1561 * dev Device assigned the IRQ that was
1562 * raised.
1563 * host_int The contents of the HOST_INT
1564 * port.
1565 *
1566 * This function handles the Statistics Overflow interrupt
1567 * which means that one or more of the TLAN statistics
1568 * registers has reached 1/2 capacity and needs to be read.
1569 *
1570 **************************************************************/
Linus Torvalds1da177e2005-04-16 15:20:36 -07001571
Sakari Ailusc659c382011-01-21 10:59:30 +00001572static u32 tlan_handle_stat_overflow(struct net_device *dev, u16 host_int)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001573{
Sakari Ailusc659c382011-01-21 10:59:30 +00001574 tlan_read_and_clear_stats(dev, TLAN_RECORD);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001575
1576 return 1;
1577
Sakari Ailusc659c382011-01-21 10:59:30 +00001578}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001579
1580
1581
1582
Sakari Ailusc659c382011-01-21 10:59:30 +00001583/***************************************************************
1584 * TLan_HandleRxEOF
1585 *
1586 * Returns:
1587 * 1
1588 * Parms:
1589 * dev Device assigned the IRQ that was
1590 * raised.
1591 * host_int The contents of the HOST_INT
1592 * port.
1593 *
1594 * This function handles the Rx EOF interrupt which
1595 * indicates a frame has been received by the adapter from
1596 * the net and the frame has been transferred to memory.
1597 * The function determines the bounce buffer the frame has
1598 * been loaded into, creates a new sk_buff big enough to
1599 * hold the frame, and sends it to protocol stack. It
1600 * then resets the used buffer and appends it to the end
1601 * of the list. If the frame was the last in the Rx
1602 * channel (EOC), the function restarts the receive channel
1603 * by sending an Rx Go command to the adapter. Then it
1604 * activates/continues the activity LED.
1605 *
1606 **************************************************************/
Linus Torvalds1da177e2005-04-16 15:20:36 -07001607
Sakari Ailusc659c382011-01-21 10:59:30 +00001608static u32 tlan_handle_rx_eof(struct net_device *dev, u16 host_int)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001609{
Sakari Ailusc659c382011-01-21 10:59:30 +00001610 struct tlan_priv *priv = netdev_priv(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001611 u32 ack = 0;
1612 int eoc = 0;
Sakari Ailusc659c382011-01-21 10:59:30 +00001613 struct tlan_list *head_list;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001614 struct sk_buff *skb;
Sakari Ailusc659c382011-01-21 10:59:30 +00001615 struct tlan_list *tail_list;
1616 u16 tmp_c_stat;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001617 dma_addr_t head_list_phys;
1618
Sakari Ailusc659c382011-01-21 10:59:30 +00001619 TLAN_DBG(TLAN_DEBUG_RX, "RECEIVE: handling RX EOF (Head=%d Tail=%d)\n",
1620 priv->rx_head, priv->rx_tail);
1621 head_list = priv->rx_list + priv->rx_head;
1622 head_list_phys =
1623 priv->rx_list_dma + sizeof(struct tlan_list)*priv->rx_head;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001624
Sakari Ailusc659c382011-01-21 10:59:30 +00001625 while (((tmp_c_stat = head_list->c_stat) & TLAN_CSTAT_FRM_CMP)
1626 && (ack < 255)) {
1627 dma_addr_t frame_dma = head_list->buffer[0].address;
1628 u32 frame_size = head_list->frame_size;
Sakari Ailus5eeabf52008-12-16 15:24:05 -08001629 struct sk_buff *new_skb;
1630
Linus Torvalds1da177e2005-04-16 15:20:36 -07001631 ack++;
Sakari Ailusc659c382011-01-21 10:59:30 +00001632 if (tmp_c_stat & TLAN_CSTAT_EOC)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001633 eoc = 1;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001634
Eric Dumazet89d71a62009-10-13 05:34:20 +00001635 new_skb = netdev_alloc_skb_ip_align(dev,
1636 TLAN_MAX_FRAME_SIZE + 5);
Sakari Ailusc659c382011-01-21 10:59:30 +00001637 if (!new_skb)
Sakari Ailus5eeabf52008-12-16 15:24:05 -08001638 goto drop_and_reuse;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001639
Sakari Ailusc659c382011-01-21 10:59:30 +00001640 skb = tlan_get_skb(head_list);
1641 pci_unmap_single(priv->pci_dev, frame_dma,
Sakari Ailus5eeabf52008-12-16 15:24:05 -08001642 TLAN_MAX_FRAME_SIZE, PCI_DMA_FROMDEVICE);
Sakari Ailusc659c382011-01-21 10:59:30 +00001643 skb_put(skb, frame_size);
Stephen Hemmingerdfc2c0a2008-05-30 09:49:58 -07001644
Sakari Ailusc659c382011-01-21 10:59:30 +00001645 dev->stats.rx_bytes += frame_size;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001646
Sakari Ailusc659c382011-01-21 10:59:30 +00001647 skb->protocol = eth_type_trans(skb, dev);
1648 netif_rx(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001649
Sakari Ailusc659c382011-01-21 10:59:30 +00001650 head_list->buffer[0].address =
1651 pci_map_single(priv->pci_dev, new_skb->data,
1652 TLAN_MAX_FRAME_SIZE, PCI_DMA_FROMDEVICE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001653
Sakari Ailusc659c382011-01-21 10:59:30 +00001654 tlan_store_skb(head_list, new_skb);
Stephen Hemmingerdfc2c0a2008-05-30 09:49:58 -07001655drop_and_reuse:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001656 head_list->forward = 0;
Sakari Ailusc659c382011-01-21 10:59:30 +00001657 head_list->c_stat = 0;
1658 tail_list = priv->rx_list + priv->rx_tail;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001659 tail_list->forward = head_list_phys;
1660
Sakari Ailusc659c382011-01-21 10:59:30 +00001661 CIRC_INC(priv->rx_head, TLAN_NUM_RX_LISTS);
1662 CIRC_INC(priv->rx_tail, TLAN_NUM_RX_LISTS);
1663 head_list = priv->rx_list + priv->rx_head;
1664 head_list_phys = priv->rx_list_dma
1665 + sizeof(struct tlan_list)*priv->rx_head;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001666 }
1667
1668 if (!ack)
Sakari Ailusc659c382011-01-21 10:59:30 +00001669 printk(KERN_INFO
1670 "TLAN: Received interrupt for uncompleted RX frame.\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001671
1672
Sakari Ailusc659c382011-01-21 10:59:30 +00001673 if (eoc) {
1674 TLAN_DBG(TLAN_DEBUG_RX,
1675 "RECEIVE: handling RX EOC (Head=%d Tail=%d)\n",
1676 priv->rx_head, priv->rx_tail);
1677 head_list = priv->rx_list + priv->rx_head;
1678 head_list_phys = priv->rx_list_dma
1679 + sizeof(struct tlan_list)*priv->rx_head;
1680 outl(head_list_phys, dev->base_addr + TLAN_CH_PARM);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001681 ack |= TLAN_HC_GO | TLAN_HC_RT;
Sakari Ailusc659c382011-01-21 10:59:30 +00001682 priv->rx_eoc_count++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001683 }
1684
Sakari Ailusc659c382011-01-21 10:59:30 +00001685 if (priv->adapter->flags & TLAN_ADAPTER_ACTIVITY_LED) {
1686 tlan_dio_write8(dev->base_addr,
1687 TLAN_LED_REG, TLAN_LED_LINK | TLAN_LED_ACT);
1688 if (priv->timer.function == NULL) {
1689 priv->timer.function = tlan_timer;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001690 priv->timer.data = (unsigned long) dev;
1691 priv->timer.expires = jiffies + TLAN_TIMER_ACT_DELAY;
Sakari Ailusc659c382011-01-21 10:59:30 +00001692 priv->timer_set_at = jiffies;
1693 priv->timer_type = TLAN_TIMER_ACTIVITY;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001694 add_timer(&priv->timer);
Sakari Ailusc659c382011-01-21 10:59:30 +00001695 } else if (priv->timer_type == TLAN_TIMER_ACTIVITY) {
1696 priv->timer_set_at = jiffies;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001697 }
1698 }
1699
Linus Torvalds1da177e2005-04-16 15:20:36 -07001700 return ack;
1701
Sakari Ailusc659c382011-01-21 10:59:30 +00001702}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001703
1704
1705
1706
Sakari Ailusc659c382011-01-21 10:59:30 +00001707/***************************************************************
1708 * tlan_handle_dummy
1709 *
1710 * Returns:
1711 * 1
1712 * Parms:
1713 * dev Device assigned the IRQ that was
1714 * raised.
1715 * host_int The contents of the HOST_INT
1716 * port.
1717 *
1718 * This function handles the Dummy interrupt, which is
1719 * raised whenever a test interrupt is generated by setting
1720 * the Req_Int bit of HOST_CMD to 1.
1721 *
1722 **************************************************************/
Linus Torvalds1da177e2005-04-16 15:20:36 -07001723
Sakari Ailusc659c382011-01-21 10:59:30 +00001724static u32 tlan_handle_dummy(struct net_device *dev, u16 host_int)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001725{
Sakari Ailusc659c382011-01-21 10:59:30 +00001726 pr_info("TLAN: Test interrupt on %s.\n", dev->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001727 return 1;
1728
Sakari Ailusc659c382011-01-21 10:59:30 +00001729}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001730
1731
1732
1733
Sakari Ailusc659c382011-01-21 10:59:30 +00001734/***************************************************************
1735 * tlan_handle_tx_eoc
1736 *
1737 * Returns:
1738 * 1
1739 * Parms:
1740 * dev Device assigned the IRQ that was
1741 * raised.
1742 * host_int The contents of the HOST_INT
1743 * port.
1744 *
1745 * This driver is structured to determine EOC occurrences by
1746 * reading the CSTAT member of the list structure. Tx EOC
1747 * interrupts are disabled via the DIO INTDIS register.
1748 * However, TLAN chips before revision 3.0 didn't have this
1749 * functionality, so process EOC events if this is the
1750 * case.
1751 *
1752 **************************************************************/
Linus Torvalds1da177e2005-04-16 15:20:36 -07001753
Sakari Ailusc659c382011-01-21 10:59:30 +00001754static u32 tlan_handle_tx_eoc(struct net_device *dev, u16 host_int)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001755{
Sakari Ailusc659c382011-01-21 10:59:30 +00001756 struct tlan_priv *priv = netdev_priv(dev);
1757 struct tlan_list *head_list;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001758 dma_addr_t head_list_phys;
1759 u32 ack = 1;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001760
Linus Torvalds1da177e2005-04-16 15:20:36 -07001761 host_int = 0;
Sakari Ailusc659c382011-01-21 10:59:30 +00001762 if (priv->tlan_rev < 0x30) {
1763 TLAN_DBG(TLAN_DEBUG_TX,
1764 "TRANSMIT: handling TX EOC (Head=%d Tail=%d) -- IRQ\n",
1765 priv->tx_head, priv->tx_tail);
1766 head_list = priv->tx_list + priv->tx_head;
1767 head_list_phys = priv->tx_list_dma
1768 + sizeof(struct tlan_list)*priv->tx_head;
1769 if (head_list->c_stat & TLAN_CSTAT_READY) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001770 netif_stop_queue(dev);
Sakari Ailusc659c382011-01-21 10:59:30 +00001771 outl(head_list_phys, dev->base_addr + TLAN_CH_PARM);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001772 ack |= TLAN_HC_GO;
1773 } else {
Sakari Ailusc659c382011-01-21 10:59:30 +00001774 priv->tx_in_progress = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001775 }
1776 }
1777
1778 return ack;
1779
Sakari Ailusc659c382011-01-21 10:59:30 +00001780}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001781
1782
1783
1784
Sakari Ailusc659c382011-01-21 10:59:30 +00001785/***************************************************************
1786 * tlan_handle_status_check
1787 *
1788 * Returns:
1789 * 0 if Adapter check, 1 if Network Status check.
1790 * Parms:
1791 * dev Device assigned the IRQ that was
1792 * raised.
1793 * host_int The contents of the HOST_INT
1794 * port.
1795 *
1796 * This function handles Adapter Check/Network Status
1797 * interrupts generated by the adapter. It checks the
1798 * vector in the HOST_INT register to determine if it is
1799 * an Adapter Check interrupt. If so, it resets the
1800 * adapter. Otherwise it clears the status registers
1801 * and services the PHY.
1802 *
1803 **************************************************************/
Linus Torvalds1da177e2005-04-16 15:20:36 -07001804
Sakari Ailusc659c382011-01-21 10:59:30 +00001805static u32 tlan_handle_status_check(struct net_device *dev, u16 host_int)
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001806{
Sakari Ailusc659c382011-01-21 10:59:30 +00001807 struct tlan_priv *priv = netdev_priv(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001808 u32 ack;
1809 u32 error;
1810 u8 net_sts;
1811 u32 phy;
1812 u16 tlphy_ctl;
1813 u16 tlphy_sts;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001814
Linus Torvalds1da177e2005-04-16 15:20:36 -07001815 ack = 1;
Sakari Ailusc659c382011-01-21 10:59:30 +00001816 if (host_int & TLAN_HI_IV_MASK) {
1817 netif_stop_queue(dev);
1818 error = inl(dev->base_addr + TLAN_CH_PARM);
1819 pr_info("TLAN: %s: Adaptor Error = 0x%x\n", dev->name, error);
1820 tlan_read_and_clear_stats(dev, TLAN_RECORD);
1821 outl(TLAN_HC_AD_RST, dev->base_addr + TLAN_HOST_CMD);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001822
1823 schedule_work(&priv->tlan_tqueue);
1824
1825 netif_wake_queue(dev);
1826 ack = 0;
1827 } else {
Sakari Ailusc659c382011-01-21 10:59:30 +00001828 TLAN_DBG(TLAN_DEBUG_GNRL, "%s: Status Check\n", dev->name);
1829 phy = priv->phy[priv->phy_num];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001830
Sakari Ailusc659c382011-01-21 10:59:30 +00001831 net_sts = tlan_dio_read8(dev->base_addr, TLAN_NET_STS);
1832 if (net_sts) {
1833 tlan_dio_write8(dev->base_addr, TLAN_NET_STS, net_sts);
1834 TLAN_DBG(TLAN_DEBUG_GNRL, "%s: Net_Sts = %x\n",
1835 dev->name, (unsigned) net_sts);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001836 }
Sakari Ailusc659c382011-01-21 10:59:30 +00001837 if ((net_sts & TLAN_NET_STS_MIRQ) && (priv->phy_num == 0)) {
1838 tlan_mii_read_reg(dev, phy, TLAN_TLPHY_STS, &tlphy_sts);
1839 tlan_mii_read_reg(dev, phy, TLAN_TLPHY_CTL, &tlphy_ctl);
1840 if (!(tlphy_sts & TLAN_TS_POLOK) &&
1841 !(tlphy_ctl & TLAN_TC_SWAPOL)) {
1842 tlphy_ctl |= TLAN_TC_SWAPOL;
1843 tlan_mii_write_reg(dev, phy, TLAN_TLPHY_CTL,
1844 tlphy_ctl);
1845 } else if ((tlphy_sts & TLAN_TS_POLOK) &&
1846 (tlphy_ctl & TLAN_TC_SWAPOL)) {
1847 tlphy_ctl &= ~TLAN_TC_SWAPOL;
1848 tlan_mii_write_reg(dev, phy, TLAN_TLPHY_CTL,
1849 tlphy_ctl);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001850 }
Sakari Ailusc659c382011-01-21 10:59:30 +00001851
1852 if (debug)
1853 tlan_phy_print(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001854 }
1855 }
1856
1857 return ack;
1858
Sakari Ailusc659c382011-01-21 10:59:30 +00001859}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001860
1861
1862
1863
Sakari Ailusc659c382011-01-21 10:59:30 +00001864/***************************************************************
1865 * tlan_handle_rx_eoc
1866 *
1867 * Returns:
1868 * 1
1869 * Parms:
1870 * dev Device assigned the IRQ that was
1871 * raised.
1872 * host_int The contents of the HOST_INT
1873 * port.
1874 *
1875 * This driver is structured to determine EOC occurrences by
1876 * reading the CSTAT member of the list structure. Rx EOC
1877 * interrupts are disabled via the DIO INTDIS register.
1878 * However, TLAN chips before revision 3.0 didn't have this
1879 * CSTAT member or a INTDIS register, so if this chip is
1880 * pre-3.0, process EOC interrupts normally.
1881 *
1882 **************************************************************/
Linus Torvalds1da177e2005-04-16 15:20:36 -07001883
Sakari Ailusc659c382011-01-21 10:59:30 +00001884static u32 tlan_handle_rx_eoc(struct net_device *dev, u16 host_int)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001885{
Sakari Ailusc659c382011-01-21 10:59:30 +00001886 struct tlan_priv *priv = netdev_priv(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001887 dma_addr_t head_list_phys;
1888 u32 ack = 1;
1889
Sakari Ailusc659c382011-01-21 10:59:30 +00001890 if (priv->tlan_rev < 0x30) {
1891 TLAN_DBG(TLAN_DEBUG_RX,
1892 "RECEIVE: Handling RX EOC (head=%d tail=%d) -- IRQ\n",
1893 priv->rx_head, priv->rx_tail);
1894 head_list_phys = priv->rx_list_dma
1895 + sizeof(struct tlan_list)*priv->rx_head;
1896 outl(head_list_phys, dev->base_addr + TLAN_CH_PARM);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001897 ack |= TLAN_HC_GO | TLAN_HC_RT;
Sakari Ailusc659c382011-01-21 10:59:30 +00001898 priv->rx_eoc_count++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001899 }
1900
1901 return ack;
1902
Sakari Ailusc659c382011-01-21 10:59:30 +00001903}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001904
1905
1906
1907
1908/*****************************************************************************
1909******************************************************************************
1910
Sakari Ailusc659c382011-01-21 10:59:30 +00001911ThunderLAN driver timer function
Linus Torvalds1da177e2005-04-16 15:20:36 -07001912
1913******************************************************************************
1914*****************************************************************************/
1915
1916
Sakari Ailusc659c382011-01-21 10:59:30 +00001917/***************************************************************
1918 * tlan_timer
1919 *
1920 * Returns:
1921 * Nothing
1922 * Parms:
1923 * data A value given to add timer when
1924 * add_timer was called.
1925 *
1926 * This function handles timed functionality for the
1927 * TLAN driver. The two current timer uses are for
1928 * delaying for autonegotionation and driving the ACT LED.
1929 * - Autonegotiation requires being allowed about
1930 * 2 1/2 seconds before attempting to transmit a
1931 * packet. It would be a very bad thing to hang
1932 * the kernel this long, so the driver doesn't
1933 * allow transmission 'til after this time, for
1934 * certain PHYs. It would be much nicer if all
1935 * PHYs were interrupt-capable like the internal
1936 * PHY.
1937 * - The ACT LED, which shows adapter activity, is
1938 * driven by the driver, and so must be left on
1939 * for a short period to power up the LED so it
1940 * can be seen. This delay can be changed by
1941 * changing the TLAN_TIMER_ACT_DELAY in tlan.h,
1942 * if desired. 100 ms produces a slightly
1943 * sluggish response.
1944 *
1945 **************************************************************/
Linus Torvalds1da177e2005-04-16 15:20:36 -07001946
Sakari Ailusc659c382011-01-21 10:59:30 +00001947static void tlan_timer(unsigned long data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001948{
1949 struct net_device *dev = (struct net_device *) data;
Sakari Ailusc659c382011-01-21 10:59:30 +00001950 struct tlan_priv *priv = netdev_priv(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001951 u32 elapsed;
1952 unsigned long flags = 0;
1953
1954 priv->timer.function = NULL;
1955
Sakari Ailusc659c382011-01-21 10:59:30 +00001956 switch (priv->timer_type) {
Jeff Garzik6aa20a22006-09-13 13:24:59 -04001957#ifdef MONITOR
Sakari Ailusc659c382011-01-21 10:59:30 +00001958 case TLAN_TIMER_LINK_BEAT:
1959 tlan_phy_monitor(dev);
1960 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001961#endif
Sakari Ailusc659c382011-01-21 10:59:30 +00001962 case TLAN_TIMER_PHY_PDOWN:
1963 tlan_phy_power_down(dev);
1964 break;
1965 case TLAN_TIMER_PHY_PUP:
1966 tlan_phy_power_up(dev);
1967 break;
1968 case TLAN_TIMER_PHY_RESET:
1969 tlan_phy_reset(dev);
1970 break;
1971 case TLAN_TIMER_PHY_START_LINK:
1972 tlan_phy_start_link(dev);
1973 break;
1974 case TLAN_TIMER_PHY_FINISH_AN:
1975 tlan_phy_finish_auto_neg(dev);
1976 break;
1977 case TLAN_TIMER_FINISH_RESET:
1978 tlan_finish_reset(dev);
1979 break;
1980 case TLAN_TIMER_ACTIVITY:
1981 spin_lock_irqsave(&priv->lock, flags);
1982 if (priv->timer.function == NULL) {
1983 elapsed = jiffies - priv->timer_set_at;
1984 if (elapsed >= TLAN_TIMER_ACT_DELAY) {
1985 tlan_dio_write8(dev->base_addr,
1986 TLAN_LED_REG, TLAN_LED_LINK);
1987 } else {
1988 priv->timer.function = tlan_timer;
1989 priv->timer.expires = priv->timer_set_at
1990 + TLAN_TIMER_ACT_DELAY;
1991 spin_unlock_irqrestore(&priv->lock, flags);
1992 add_timer(&priv->timer);
1993 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001994 }
Sakari Ailusc659c382011-01-21 10:59:30 +00001995 }
1996 spin_unlock_irqrestore(&priv->lock, flags);
1997 break;
1998 default:
1999 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002000 }
2001
Sakari Ailusc659c382011-01-21 10:59:30 +00002002}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002003
2004
2005
2006
2007/*****************************************************************************
2008******************************************************************************
2009
Sakari Ailusc659c382011-01-21 10:59:30 +00002010ThunderLAN driver adapter related routines
Linus Torvalds1da177e2005-04-16 15:20:36 -07002011
2012******************************************************************************
2013*****************************************************************************/
2014
2015
Sakari Ailusc659c382011-01-21 10:59:30 +00002016/***************************************************************
2017 * tlan_reset_lists
2018 *
2019 * Returns:
2020 * Nothing
2021 * Parms:
2022 * dev The device structure with the list
2023 * stuctures to be reset.
2024 *
2025 * This routine sets the variables associated with managing
2026 * the TLAN lists to their initial values.
2027 *
2028 **************************************************************/
Linus Torvalds1da177e2005-04-16 15:20:36 -07002029
Sakari Ailusc659c382011-01-21 10:59:30 +00002030static void tlan_reset_lists(struct net_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002031{
Sakari Ailusc659c382011-01-21 10:59:30 +00002032 struct tlan_priv *priv = netdev_priv(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002033 int i;
Sakari Ailusc659c382011-01-21 10:59:30 +00002034 struct tlan_list *list;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002035 dma_addr_t list_phys;
2036 struct sk_buff *skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002037
Sakari Ailusc659c382011-01-21 10:59:30 +00002038 priv->tx_head = 0;
2039 priv->tx_tail = 0;
2040 for (i = 0; i < TLAN_NUM_TX_LISTS; i++) {
2041 list = priv->tx_list + i;
2042 list->c_stat = TLAN_CSTAT_UNUSED;
Sakari Ailus5eeabf52008-12-16 15:24:05 -08002043 list->buffer[0].address = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002044 list->buffer[2].count = 0;
2045 list->buffer[2].address = 0;
2046 list->buffer[8].address = 0;
2047 list->buffer[9].address = 0;
2048 }
2049
Sakari Ailusc659c382011-01-21 10:59:30 +00002050 priv->rx_head = 0;
2051 priv->rx_tail = TLAN_NUM_RX_LISTS - 1;
2052 for (i = 0; i < TLAN_NUM_RX_LISTS; i++) {
2053 list = priv->rx_list + i;
2054 list_phys = priv->rx_list_dma + sizeof(struct tlan_list)*i;
2055 list->c_stat = TLAN_CSTAT_READY;
2056 list->frame_size = TLAN_MAX_FRAME_SIZE;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002057 list->buffer[0].count = TLAN_MAX_FRAME_SIZE | TLAN_LAST_BUFFER;
Eric Dumazet89d71a62009-10-13 05:34:20 +00002058 skb = netdev_alloc_skb_ip_align(dev, TLAN_MAX_FRAME_SIZE + 5);
Sakari Ailusc659c382011-01-21 10:59:30 +00002059 if (!skb) {
2060 pr_err("TLAN: out of memory for received data.\n");
Sakari Ailus5eeabf52008-12-16 15:24:05 -08002061 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002062 }
Sakari Ailus5eeabf52008-12-16 15:24:05 -08002063
Sakari Ailusc659c382011-01-21 10:59:30 +00002064 list->buffer[0].address = pci_map_single(priv->pci_dev,
Sakari Ailus5eeabf52008-12-16 15:24:05 -08002065 skb->data,
2066 TLAN_MAX_FRAME_SIZE,
2067 PCI_DMA_FROMDEVICE);
Sakari Ailusc659c382011-01-21 10:59:30 +00002068 tlan_store_skb(list, skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002069 list->buffer[1].count = 0;
2070 list->buffer[1].address = 0;
Sakari Ailusc659c382011-01-21 10:59:30 +00002071 list->forward = list_phys + sizeof(struct tlan_list);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002072 }
2073
Stephen Hemminger9ded65a2008-05-30 09:49:56 -07002074 /* in case ran out of memory early, clear bits */
2075 while (i < TLAN_NUM_RX_LISTS) {
Sakari Ailusc659c382011-01-21 10:59:30 +00002076 tlan_store_skb(priv->rx_list + i, NULL);
Stephen Hemminger9ded65a2008-05-30 09:49:56 -07002077 ++i;
2078 }
2079 list->forward = 0;
2080
Sakari Ailusc659c382011-01-21 10:59:30 +00002081}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002082
2083
Sakari Ailusc659c382011-01-21 10:59:30 +00002084static void tlan_free_lists(struct net_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002085{
Sakari Ailusc659c382011-01-21 10:59:30 +00002086 struct tlan_priv *priv = netdev_priv(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002087 int i;
Sakari Ailusc659c382011-01-21 10:59:30 +00002088 struct tlan_list *list;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002089 struct sk_buff *skb;
2090
Sakari Ailusc659c382011-01-21 10:59:30 +00002091 for (i = 0; i < TLAN_NUM_TX_LISTS; i++) {
2092 list = priv->tx_list + i;
2093 skb = tlan_get_skb(list);
2094 if (skb) {
Sakari Ailus5eeabf52008-12-16 15:24:05 -08002095 pci_unmap_single(
Sakari Ailusc659c382011-01-21 10:59:30 +00002096 priv->pci_dev,
Sakari Ailus5eeabf52008-12-16 15:24:05 -08002097 list->buffer[0].address,
2098 max(skb->len,
2099 (unsigned int)TLAN_MIN_FRAME_SIZE),
2100 PCI_DMA_TODEVICE);
Sakari Ailusc659c382011-01-21 10:59:30 +00002101 dev_kfree_skb_any(skb);
Sakari Ailus5eeabf52008-12-16 15:24:05 -08002102 list->buffer[8].address = 0;
2103 list->buffer[9].address = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002104 }
Sakari Ailus5eeabf52008-12-16 15:24:05 -08002105 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002106
Sakari Ailusc659c382011-01-21 10:59:30 +00002107 for (i = 0; i < TLAN_NUM_RX_LISTS; i++) {
2108 list = priv->rx_list + i;
2109 skb = tlan_get_skb(list);
2110 if (skb) {
2111 pci_unmap_single(priv->pci_dev,
Sakari Ailus5eeabf52008-12-16 15:24:05 -08002112 list->buffer[0].address,
2113 TLAN_MAX_FRAME_SIZE,
2114 PCI_DMA_FROMDEVICE);
Sakari Ailusc659c382011-01-21 10:59:30 +00002115 dev_kfree_skb_any(skb);
Sakari Ailus5eeabf52008-12-16 15:24:05 -08002116 list->buffer[8].address = 0;
2117 list->buffer[9].address = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002118 }
2119 }
Sakari Ailusc659c382011-01-21 10:59:30 +00002120}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002121
2122
2123
2124
Sakari Ailusc659c382011-01-21 10:59:30 +00002125/***************************************************************
2126 * tlan_print_dio
2127 *
2128 * Returns:
2129 * Nothing
2130 * Parms:
2131 * io_base Base IO port of the device of
2132 * which to print DIO registers.
2133 *
2134 * This function prints out all the internal (DIO)
2135 * registers of a TLAN chip.
2136 *
2137 **************************************************************/
Linus Torvalds1da177e2005-04-16 15:20:36 -07002138
Sakari Ailusc659c382011-01-21 10:59:30 +00002139static void tlan_print_dio(u16 io_base)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002140{
2141 u32 data0, data1;
2142 int i;
2143
Sakari Ailusc659c382011-01-21 10:59:30 +00002144 pr_info("TLAN: Contents of internal registers for io base 0x%04hx.\n",
2145 io_base);
2146 pr_info("TLAN: Off. +0 +4\n");
2147 for (i = 0; i < 0x4C; i += 8) {
2148 data0 = tlan_dio_read32(io_base, i);
2149 data1 = tlan_dio_read32(io_base, i + 0x4);
2150 pr_info("TLAN: 0x%02x 0x%08x 0x%08x\n", i, data0, data1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002151 }
2152
Sakari Ailusc659c382011-01-21 10:59:30 +00002153}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002154
2155
2156
2157
Sakari Ailusc659c382011-01-21 10:59:30 +00002158/***************************************************************
2159 * TLan_PrintList
2160 *
2161 * Returns:
2162 * Nothing
2163 * Parms:
2164 * list A pointer to the struct tlan_list structure to
2165 * be printed.
2166 * type A string to designate type of list,
2167 * "Rx" or "Tx".
2168 * num The index of the list.
2169 *
2170 * This function prints out the contents of the list
2171 * pointed to by the list parameter.
2172 *
2173 **************************************************************/
Linus Torvalds1da177e2005-04-16 15:20:36 -07002174
Sakari Ailusc659c382011-01-21 10:59:30 +00002175static void tlan_print_list(struct tlan_list *list, char *type, int num)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002176{
2177 int i;
2178
Sakari Ailusc659c382011-01-21 10:59:30 +00002179 pr_info("TLAN: %s List %d at %p\n", type, num, list);
2180 pr_info("TLAN: Forward = 0x%08x\n", list->forward);
2181 pr_info("TLAN: CSTAT = 0x%04hx\n", list->c_stat);
2182 pr_info("TLAN: Frame Size = 0x%04hx\n", list->frame_size);
2183 /* for (i = 0; i < 10; i++) { */
2184 for (i = 0; i < 2; i++) {
2185 pr_info("TLAN: Buffer[%d].count, addr = 0x%08x, 0x%08x\n",
2186 i, list->buffer[i].count, list->buffer[i].address);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002187 }
2188
Sakari Ailusc659c382011-01-21 10:59:30 +00002189}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002190
2191
2192
2193
Sakari Ailusc659c382011-01-21 10:59:30 +00002194/***************************************************************
2195 * tlan_read_and_clear_stats
2196 *
2197 * Returns:
2198 * Nothing
2199 * Parms:
2200 * dev Pointer to device structure of adapter
2201 * to which to read stats.
2202 * record Flag indicating whether to add
2203 *
2204 * This functions reads all the internal status registers
2205 * of the TLAN chip, which clears them as a side effect.
2206 * It then either adds the values to the device's status
2207 * struct, or discards them, depending on whether record
2208 * is TLAN_RECORD (!=0) or TLAN_IGNORE (==0).
2209 *
2210 **************************************************************/
Linus Torvalds1da177e2005-04-16 15:20:36 -07002211
Sakari Ailusc659c382011-01-21 10:59:30 +00002212static void tlan_read_and_clear_stats(struct net_device *dev, int record)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002213{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002214 u32 tx_good, tx_under;
2215 u32 rx_good, rx_over;
2216 u32 def_tx, crc, code;
2217 u32 multi_col, single_col;
2218 u32 excess_col, late_col, loss;
2219
Sakari Ailusc659c382011-01-21 10:59:30 +00002220 outw(TLAN_GOOD_TX_FRMS, dev->base_addr + TLAN_DIO_ADR);
2221 tx_good = inb(dev->base_addr + TLAN_DIO_DATA);
2222 tx_good += inb(dev->base_addr + TLAN_DIO_DATA + 1) << 8;
2223 tx_good += inb(dev->base_addr + TLAN_DIO_DATA + 2) << 16;
2224 tx_under = inb(dev->base_addr + TLAN_DIO_DATA + 3);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002225
Sakari Ailusc659c382011-01-21 10:59:30 +00002226 outw(TLAN_GOOD_RX_FRMS, dev->base_addr + TLAN_DIO_ADR);
2227 rx_good = inb(dev->base_addr + TLAN_DIO_DATA);
2228 rx_good += inb(dev->base_addr + TLAN_DIO_DATA + 1) << 8;
2229 rx_good += inb(dev->base_addr + TLAN_DIO_DATA + 2) << 16;
2230 rx_over = inb(dev->base_addr + TLAN_DIO_DATA + 3);
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002231
Sakari Ailusc659c382011-01-21 10:59:30 +00002232 outw(TLAN_DEFERRED_TX, dev->base_addr + TLAN_DIO_ADR);
2233 def_tx = inb(dev->base_addr + TLAN_DIO_DATA);
2234 def_tx += inb(dev->base_addr + TLAN_DIO_DATA + 1) << 8;
2235 crc = inb(dev->base_addr + TLAN_DIO_DATA + 2);
2236 code = inb(dev->base_addr + TLAN_DIO_DATA + 3);
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002237
Sakari Ailusc659c382011-01-21 10:59:30 +00002238 outw(TLAN_MULTICOL_FRMS, dev->base_addr + TLAN_DIO_ADR);
2239 multi_col = inb(dev->base_addr + TLAN_DIO_DATA);
2240 multi_col += inb(dev->base_addr + TLAN_DIO_DATA + 1) << 8;
2241 single_col = inb(dev->base_addr + TLAN_DIO_DATA + 2);
2242 single_col += inb(dev->base_addr + TLAN_DIO_DATA + 3) << 8;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002243
Sakari Ailusc659c382011-01-21 10:59:30 +00002244 outw(TLAN_EXCESSCOL_FRMS, dev->base_addr + TLAN_DIO_ADR);
2245 excess_col = inb(dev->base_addr + TLAN_DIO_DATA);
2246 late_col = inb(dev->base_addr + TLAN_DIO_DATA + 1);
2247 loss = inb(dev->base_addr + TLAN_DIO_DATA + 2);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002248
Sakari Ailusc659c382011-01-21 10:59:30 +00002249 if (record) {
Stephen Hemmingerf8f31542008-05-30 09:49:53 -07002250 dev->stats.rx_packets += rx_good;
2251 dev->stats.rx_errors += rx_over + crc + code;
2252 dev->stats.tx_packets += tx_good;
2253 dev->stats.tx_errors += tx_under + loss;
Sakari Ailusc659c382011-01-21 10:59:30 +00002254 dev->stats.collisions += multi_col
2255 + single_col + excess_col + late_col;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002256
Stephen Hemmingerf8f31542008-05-30 09:49:53 -07002257 dev->stats.rx_over_errors += rx_over;
2258 dev->stats.rx_crc_errors += crc;
2259 dev->stats.rx_frame_errors += code;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002260
Stephen Hemmingerf8f31542008-05-30 09:49:53 -07002261 dev->stats.tx_aborted_errors += tx_under;
2262 dev->stats.tx_carrier_errors += loss;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002263 }
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002264
Sakari Ailusc659c382011-01-21 10:59:30 +00002265}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002266
2267
2268
2269
Sakari Ailusc659c382011-01-21 10:59:30 +00002270/***************************************************************
2271 * TLan_Reset
2272 *
2273 * Returns:
2274 * 0
2275 * Parms:
2276 * dev Pointer to device structure of adapter
2277 * to be reset.
2278 *
2279 * This function resets the adapter and it's physical
2280 * device. See Chap. 3, pp. 9-10 of the "ThunderLAN
2281 * Programmer's Guide" for details. The routine tries to
2282 * implement what is detailed there, though adjustments
2283 * have been made.
2284 *
2285 **************************************************************/
Linus Torvalds1da177e2005-04-16 15:20:36 -07002286
Harvey Harrison98e0f522008-02-18 10:04:38 -08002287static void
Sakari Ailusc659c382011-01-21 10:59:30 +00002288tlan_reset_adapter(struct net_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002289{
Sakari Ailusc659c382011-01-21 10:59:30 +00002290 struct tlan_priv *priv = netdev_priv(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002291 int i;
2292 u32 addr;
2293 u32 data;
2294 u8 data8;
2295
Sakari Ailusc659c382011-01-21 10:59:30 +00002296 priv->tlan_full_duplex = false;
2297 priv->phy_online = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002298 netif_carrier_off(dev);
2299
2300/* 1. Assert reset bit. */
2301
2302 data = inl(dev->base_addr + TLAN_HOST_CMD);
2303 data |= TLAN_HC_AD_RST;
2304 outl(data, dev->base_addr + TLAN_HOST_CMD);
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002305
Linus Torvalds1da177e2005-04-16 15:20:36 -07002306 udelay(1000);
2307
Sakari Ailusc659c382011-01-21 10:59:30 +00002308/* 2. Turn off interrupts. (Probably isn't necessary) */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002309
2310 data = inl(dev->base_addr + TLAN_HOST_CMD);
2311 data |= TLAN_HC_INT_OFF;
2312 outl(data, dev->base_addr + TLAN_HOST_CMD);
2313
2314/* 3. Clear AREGs and HASHs. */
2315
Sakari Ailusc659c382011-01-21 10:59:30 +00002316 for (i = TLAN_AREG_0; i <= TLAN_HASH_2; i += 4)
2317 tlan_dio_write32(dev->base_addr, (u16) i, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002318
2319/* 4. Setup NetConfig register. */
2320
2321 data = TLAN_NET_CFG_1FRAG | TLAN_NET_CFG_1CHAN | TLAN_NET_CFG_PHY_EN;
Sakari Ailusc659c382011-01-21 10:59:30 +00002322 tlan_dio_write16(dev->base_addr, TLAN_NET_CONFIG, (u16) data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002323
2324/* 5. Load Ld_Tmr and Ld_Thr in HOST_CMD. */
2325
Sakari Ailusc659c382011-01-21 10:59:30 +00002326 outl(TLAN_HC_LD_TMR | 0x3f, dev->base_addr + TLAN_HOST_CMD);
2327 outl(TLAN_HC_LD_THR | 0x9, dev->base_addr + TLAN_HOST_CMD);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002328
2329/* 6. Unreset the MII by setting NMRST (in NetSio) to 1. */
2330
Sakari Ailusc659c382011-01-21 10:59:30 +00002331 outw(TLAN_NET_SIO, dev->base_addr + TLAN_DIO_ADR);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002332 addr = dev->base_addr + TLAN_DIO_DATA + TLAN_NET_SIO;
Sakari Ailusc659c382011-01-21 10:59:30 +00002333 tlan_set_bit(TLAN_NET_SIO_NMRST, addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002334
2335/* 7. Setup the remaining registers. */
2336
Sakari Ailusc659c382011-01-21 10:59:30 +00002337 if (priv->tlan_rev >= 0x30) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002338 data8 = TLAN_ID_TX_EOC | TLAN_ID_RX_EOC;
Sakari Ailusc659c382011-01-21 10:59:30 +00002339 tlan_dio_write8(dev->base_addr, TLAN_INT_DIS, data8);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002340 }
Sakari Ailusc659c382011-01-21 10:59:30 +00002341 tlan_phy_detect(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002342 data = TLAN_NET_CFG_1FRAG | TLAN_NET_CFG_1CHAN;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002343
Sakari Ailusc659c382011-01-21 10:59:30 +00002344 if (priv->adapter->flags & TLAN_ADAPTER_BIT_RATE_PHY) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002345 data |= TLAN_NET_CFG_BIT;
Sakari Ailusc659c382011-01-21 10:59:30 +00002346 if (priv->aui == 1) {
2347 tlan_dio_write8(dev->base_addr, TLAN_ACOMMIT, 0x0a);
2348 } else if (priv->duplex == TLAN_DUPLEX_FULL) {
2349 tlan_dio_write8(dev->base_addr, TLAN_ACOMMIT, 0x00);
2350 priv->tlan_full_duplex = true;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002351 } else {
Sakari Ailusc659c382011-01-21 10:59:30 +00002352 tlan_dio_write8(dev->base_addr, TLAN_ACOMMIT, 0x08);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002353 }
2354 }
2355
Sakari Ailusc659c382011-01-21 10:59:30 +00002356 if (priv->phy_num == 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002357 data |= TLAN_NET_CFG_PHY_EN;
Sakari Ailusc659c382011-01-21 10:59:30 +00002358 tlan_dio_write16(dev->base_addr, TLAN_NET_CONFIG, (u16) data);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002359
Sakari Ailusc659c382011-01-21 10:59:30 +00002360 if (priv->adapter->flags & TLAN_ADAPTER_UNMANAGED_PHY)
2361 tlan_finish_reset(dev);
2362 else
2363 tlan_phy_power_down(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002364
Sakari Ailusc659c382011-01-21 10:59:30 +00002365}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002366
2367
2368
2369
Harvey Harrison98e0f522008-02-18 10:04:38 -08002370static void
Sakari Ailusc659c382011-01-21 10:59:30 +00002371tlan_finish_reset(struct net_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002372{
Sakari Ailusc659c382011-01-21 10:59:30 +00002373 struct tlan_priv *priv = netdev_priv(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002374 u8 data;
2375 u32 phy;
2376 u8 sio;
2377 u16 status;
2378 u16 partner;
2379 u16 tlphy_ctl;
Sakari Ailusc659c382011-01-21 10:59:30 +00002380 u16 tlphy_par;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002381 u16 tlphy_id1, tlphy_id2;
Sakari Ailusc659c382011-01-21 10:59:30 +00002382 int i;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002383
Sakari Ailusc659c382011-01-21 10:59:30 +00002384 phy = priv->phy[priv->phy_num];
Linus Torvalds1da177e2005-04-16 15:20:36 -07002385
2386 data = TLAN_NET_CMD_NRESET | TLAN_NET_CMD_NWRAP;
Sakari Ailusc659c382011-01-21 10:59:30 +00002387 if (priv->tlan_full_duplex)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002388 data |= TLAN_NET_CMD_DUPLEX;
Sakari Ailusc659c382011-01-21 10:59:30 +00002389 tlan_dio_write8(dev->base_addr, TLAN_NET_CMD, data);
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002390 data = TLAN_NET_MASK_MASK4 | TLAN_NET_MASK_MASK5;
Sakari Ailusc659c382011-01-21 10:59:30 +00002391 if (priv->phy_num == 0)
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002392 data |= TLAN_NET_MASK_MASK7;
Sakari Ailusc659c382011-01-21 10:59:30 +00002393 tlan_dio_write8(dev->base_addr, TLAN_NET_MASK, data);
2394 tlan_dio_write16(dev->base_addr, TLAN_MAX_RX, ((1536)+7)&~7);
2395 tlan_mii_read_reg(dev, phy, MII_GEN_ID_HI, &tlphy_id1);
2396 tlan_mii_read_reg(dev, phy, MII_GEN_ID_LO, &tlphy_id2);
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002397
Sakari Ailusc659c382011-01-21 10:59:30 +00002398 if ((priv->adapter->flags & TLAN_ADAPTER_UNMANAGED_PHY) ||
2399 (priv->aui)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002400 status = MII_GS_LINK;
Sakari Ailusc659c382011-01-21 10:59:30 +00002401 pr_info("TLAN: %s: Link forced.\n", dev->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002402 } else {
Sakari Ailusc659c382011-01-21 10:59:30 +00002403 tlan_mii_read_reg(dev, phy, MII_GEN_STS, &status);
2404 udelay(1000);
2405 tlan_mii_read_reg(dev, phy, MII_GEN_STS, &status);
2406 if ((status & MII_GS_LINK) &&
2407 /* We only support link info on Nat.Sem. PHY's */
2408 (tlphy_id1 == NAT_SEM_ID1) &&
2409 (tlphy_id2 == NAT_SEM_ID2)) {
2410 tlan_mii_read_reg(dev, phy, MII_AN_LPA, &partner);
2411 tlan_mii_read_reg(dev, phy, TLAN_TLPHY_PAR, &tlphy_par);
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002412
Sakari Ailusc659c382011-01-21 10:59:30 +00002413 pr_info("TLAN: %s: Link active with ", dev->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002414 if (!(tlphy_par & TLAN_PHY_AN_EN_STAT)) {
Sakari Ailusc659c382011-01-21 10:59:30 +00002415 pr_info("forced 10%sMbps %s-Duplex\n",
2416 tlphy_par & TLAN_PHY_SPEED_100
2417 ? "" : "0",
2418 tlphy_par & TLAN_PHY_DUPLEX_FULL
2419 ? "Full" : "Half");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002420 } else {
Sakari Ailusc659c382011-01-21 10:59:30 +00002421 pr_info("Autonegotiation enabled, at 10%sMbps %s-Duplex\n",
2422 tlphy_par & TLAN_PHY_SPEED_100
2423 ? "" : "0",
2424 tlphy_par & TLAN_PHY_DUPLEX_FULL
2425 ? "Full" : "half");
2426 pr_info("TLAN: Partner capability: ");
2427 for (i = 5; i <= 10; i++)
2428 if (partner & (1<<i))
2429 printk("%s", media[i-5]);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002430 printk("\n");
2431 }
2432
Sakari Ailusc659c382011-01-21 10:59:30 +00002433 tlan_dio_write8(dev->base_addr, TLAN_LED_REG,
2434 TLAN_LED_LINK);
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002435#ifdef MONITOR
Linus Torvalds1da177e2005-04-16 15:20:36 -07002436 /* We have link beat..for now anyway */
Sakari Ailusc659c382011-01-21 10:59:30 +00002437 priv->link = 1;
2438 /*Enabling link beat monitoring */
2439 tlan_set_timer(dev, (10*HZ), TLAN_TIMER_LINK_BEAT);
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002440#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07002441 } else if (status & MII_GS_LINK) {
Sakari Ailusc659c382011-01-21 10:59:30 +00002442 pr_info("TLAN: %s: Link active\n", dev->name);
2443 tlan_dio_write8(dev->base_addr, TLAN_LED_REG,
2444 TLAN_LED_LINK);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002445 }
2446 }
2447
Sakari Ailusc659c382011-01-21 10:59:30 +00002448 if (priv->phy_num == 0) {
2449 tlan_mii_read_reg(dev, phy, TLAN_TLPHY_CTL, &tlphy_ctl);
2450 tlphy_ctl |= TLAN_TC_INTEN;
2451 tlan_mii_write_reg(dev, phy, TLAN_TLPHY_CTL, tlphy_ctl);
2452 sio = tlan_dio_read8(dev->base_addr, TLAN_NET_SIO);
2453 sio |= TLAN_NET_SIO_MINTEN;
2454 tlan_dio_write8(dev->base_addr, TLAN_NET_SIO, sio);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002455 }
2456
Sakari Ailusc659c382011-01-21 10:59:30 +00002457 if (status & MII_GS_LINK) {
2458 tlan_set_mac(dev, 0, dev->dev_addr);
2459 priv->phy_online = 1;
2460 outb((TLAN_HC_INT_ON >> 8), dev->base_addr + TLAN_HOST_CMD + 1);
2461 if (debug >= 1 && debug != TLAN_DEBUG_PROBE)
2462 outb((TLAN_HC_REQ_INT >> 8),
2463 dev->base_addr + TLAN_HOST_CMD + 1);
2464 outl(priv->rx_list_dma, dev->base_addr + TLAN_CH_PARM);
2465 outl(TLAN_HC_GO | TLAN_HC_RT, dev->base_addr + TLAN_HOST_CMD);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002466 netif_carrier_on(dev);
2467 } else {
Sakari Ailusc659c382011-01-21 10:59:30 +00002468 pr_info("TLAN: %s: Link inactive, will retry in 10 secs...\n",
2469 dev->name);
2470 tlan_set_timer(dev, (10*HZ), TLAN_TIMER_FINISH_RESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002471 return;
2472 }
Sakari Ailusc659c382011-01-21 10:59:30 +00002473 tlan_set_multicast_list(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002474
Sakari Ailusc659c382011-01-21 10:59:30 +00002475}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002476
2477
2478
2479
Sakari Ailusc659c382011-01-21 10:59:30 +00002480/***************************************************************
2481 * tlan_set_mac
2482 *
2483 * Returns:
2484 * Nothing
2485 * Parms:
2486 * dev Pointer to device structure of adapter
2487 * on which to change the AREG.
2488 * areg The AREG to set the address in (0 - 3).
2489 * mac A pointer to an array of chars. Each
2490 * element stores one byte of the address.
2491 * IE, it isn't in ascii.
2492 *
2493 * This function transfers a MAC address to one of the
2494 * TLAN AREGs (address registers). The TLAN chip locks
2495 * the register on writing to offset 0 and unlocks the
2496 * register after writing to offset 5. If NULL is passed
2497 * in mac, then the AREG is filled with 0's.
2498 *
2499 **************************************************************/
Linus Torvalds1da177e2005-04-16 15:20:36 -07002500
Sakari Ailusc659c382011-01-21 10:59:30 +00002501static void tlan_set_mac(struct net_device *dev, int areg, char *mac)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002502{
2503 int i;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002504
Linus Torvalds1da177e2005-04-16 15:20:36 -07002505 areg *= 6;
2506
Sakari Ailusc659c382011-01-21 10:59:30 +00002507 if (mac != NULL) {
2508 for (i = 0; i < 6; i++)
2509 tlan_dio_write8(dev->base_addr,
2510 TLAN_AREG_0 + areg + i, mac[i]);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002511 } else {
Sakari Ailusc659c382011-01-21 10:59:30 +00002512 for (i = 0; i < 6; i++)
2513 tlan_dio_write8(dev->base_addr,
2514 TLAN_AREG_0 + areg + i, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002515 }
2516
Sakari Ailusc659c382011-01-21 10:59:30 +00002517}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002518
2519
2520
2521
2522/*****************************************************************************
2523******************************************************************************
2524
Sakari Ailusc659c382011-01-21 10:59:30 +00002525ThunderLAN driver PHY layer routines
Linus Torvalds1da177e2005-04-16 15:20:36 -07002526
2527******************************************************************************
2528*****************************************************************************/
2529
2530
2531
Sakari Ailusc659c382011-01-21 10:59:30 +00002532/*********************************************************************
2533 * tlan_phy_print
2534 *
2535 * Returns:
2536 * Nothing
2537 * Parms:
2538 * dev A pointer to the device structure of the
2539 * TLAN device having the PHYs to be detailed.
2540 *
2541 * This function prints the registers a PHY (aka transceiver).
2542 *
2543 ********************************************************************/
Linus Torvalds1da177e2005-04-16 15:20:36 -07002544
Sakari Ailusc659c382011-01-21 10:59:30 +00002545static void tlan_phy_print(struct net_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002546{
Sakari Ailusc659c382011-01-21 10:59:30 +00002547 struct tlan_priv *priv = netdev_priv(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002548 u16 i, data0, data1, data2, data3, phy;
2549
Sakari Ailusc659c382011-01-21 10:59:30 +00002550 phy = priv->phy[priv->phy_num];
Linus Torvalds1da177e2005-04-16 15:20:36 -07002551
Sakari Ailusc659c382011-01-21 10:59:30 +00002552 if (priv->adapter->flags & TLAN_ADAPTER_UNMANAGED_PHY) {
2553 pr_info("TLAN: Device %s, Unmanaged PHY.\n", dev->name);
2554 } else if (phy <= TLAN_PHY_MAX_ADDR) {
2555 pr_info("TLAN: Device %s, PHY 0x%02x.\n", dev->name, phy);
2556 pr_info("TLAN: Off. +0 +1 +2 +3\n");
2557 for (i = 0; i < 0x20; i += 4) {
2558 pr_info("TLAN: 0x%02x", i);
2559 tlan_mii_read_reg(dev, phy, i, &data0);
2560 printk(" 0x%04hx", data0);
2561 tlan_mii_read_reg(dev, phy, i + 1, &data1);
2562 printk(" 0x%04hx", data1);
2563 tlan_mii_read_reg(dev, phy, i + 2, &data2);
2564 printk(" 0x%04hx", data2);
2565 tlan_mii_read_reg(dev, phy, i + 3, &data3);
2566 printk(" 0x%04hx\n", data3);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002567 }
2568 } else {
Sakari Ailusc659c382011-01-21 10:59:30 +00002569 pr_info("TLAN: Device %s, Invalid PHY.\n", dev->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002570 }
2571
Sakari Ailusc659c382011-01-21 10:59:30 +00002572}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002573
2574
2575
2576
Sakari Ailusc659c382011-01-21 10:59:30 +00002577/*********************************************************************
2578 * tlan_phy_detect
2579 *
2580 * Returns:
2581 * Nothing
2582 * Parms:
2583 * dev A pointer to the device structure of the adapter
2584 * for which the PHY needs determined.
2585 *
2586 * So far I've found that adapters which have external PHYs
2587 * may also use the internal PHY for part of the functionality.
2588 * (eg, AUI/Thinnet). This function finds out if this TLAN
2589 * chip has an internal PHY, and then finds the first external
2590 * PHY (starting from address 0) if it exists).
2591 *
2592 ********************************************************************/
Linus Torvalds1da177e2005-04-16 15:20:36 -07002593
Sakari Ailusc659c382011-01-21 10:59:30 +00002594static void tlan_phy_detect(struct net_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002595{
Sakari Ailusc659c382011-01-21 10:59:30 +00002596 struct tlan_priv *priv = netdev_priv(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002597 u16 control;
2598 u16 hi;
2599 u16 lo;
2600 u32 phy;
2601
Sakari Ailusc659c382011-01-21 10:59:30 +00002602 if (priv->adapter->flags & TLAN_ADAPTER_UNMANAGED_PHY) {
2603 priv->phy_num = 0xffff;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002604 return;
2605 }
2606
Sakari Ailusc659c382011-01-21 10:59:30 +00002607 tlan_mii_read_reg(dev, TLAN_PHY_MAX_ADDR, MII_GEN_ID_HI, &hi);
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002608
Sakari Ailusc659c382011-01-21 10:59:30 +00002609 if (hi != 0xffff)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002610 priv->phy[0] = TLAN_PHY_MAX_ADDR;
Sakari Ailusc659c382011-01-21 10:59:30 +00002611 else
Linus Torvalds1da177e2005-04-16 15:20:36 -07002612 priv->phy[0] = TLAN_PHY_NONE;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002613
2614 priv->phy[1] = TLAN_PHY_NONE;
Sakari Ailusc659c382011-01-21 10:59:30 +00002615 for (phy = 0; phy <= TLAN_PHY_MAX_ADDR; phy++) {
2616 tlan_mii_read_reg(dev, phy, MII_GEN_CTL, &control);
2617 tlan_mii_read_reg(dev, phy, MII_GEN_ID_HI, &hi);
2618 tlan_mii_read_reg(dev, phy, MII_GEN_ID_LO, &lo);
2619 if ((control != 0xffff) ||
2620 (hi != 0xffff) || (lo != 0xffff)) {
2621 TLAN_DBG(TLAN_DEBUG_GNRL,
2622 "PHY found at %02x %04x %04x %04x\n",
2623 phy, control, hi, lo);
2624 if ((priv->phy[1] == TLAN_PHY_NONE) &&
2625 (phy != TLAN_PHY_MAX_ADDR)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002626 priv->phy[1] = phy;
2627 }
2628 }
2629 }
2630
Sakari Ailusc659c382011-01-21 10:59:30 +00002631 if (priv->phy[1] != TLAN_PHY_NONE)
2632 priv->phy_num = 1;
2633 else if (priv->phy[0] != TLAN_PHY_NONE)
2634 priv->phy_num = 0;
2635 else
2636 pr_info("TLAN: Cannot initialize device, no PHY was found!\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002637
Sakari Ailusc659c382011-01-21 10:59:30 +00002638}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002639
2640
2641
2642
Sakari Ailusc659c382011-01-21 10:59:30 +00002643static void tlan_phy_power_down(struct net_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002644{
Sakari Ailusc659c382011-01-21 10:59:30 +00002645 struct tlan_priv *priv = netdev_priv(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002646 u16 value;
2647
Sakari Ailusc659c382011-01-21 10:59:30 +00002648 TLAN_DBG(TLAN_DEBUG_GNRL, "%s: Powering down PHY(s).\n", dev->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002649 value = MII_GC_PDOWN | MII_GC_LOOPBK | MII_GC_ISOLATE;
Sakari Ailusc659c382011-01-21 10:59:30 +00002650 tlan_mii_sync(dev->base_addr);
2651 tlan_mii_write_reg(dev, priv->phy[priv->phy_num], MII_GEN_CTL, value);
2652 if ((priv->phy_num == 0) &&
2653 (priv->phy[1] != TLAN_PHY_NONE) &&
2654 (!(priv->adapter->flags & TLAN_ADAPTER_USE_INTERN_10))) {
2655 tlan_mii_sync(dev->base_addr);
2656 tlan_mii_write_reg(dev, priv->phy[1], MII_GEN_CTL, value);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002657 }
2658
2659 /* Wait for 50 ms and powerup
2660 * This is abitrary. It is intended to make sure the
2661 * transceiver settles.
2662 */
Sakari Ailusc659c382011-01-21 10:59:30 +00002663 tlan_set_timer(dev, (HZ/20), TLAN_TIMER_PHY_PUP);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002664
Sakari Ailusc659c382011-01-21 10:59:30 +00002665}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002666
2667
2668
2669
Sakari Ailusc659c382011-01-21 10:59:30 +00002670static void tlan_phy_power_up(struct net_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002671{
Sakari Ailusc659c382011-01-21 10:59:30 +00002672 struct tlan_priv *priv = netdev_priv(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002673 u16 value;
2674
Sakari Ailusc659c382011-01-21 10:59:30 +00002675 TLAN_DBG(TLAN_DEBUG_GNRL, "%s: Powering up PHY.\n", dev->name);
2676 tlan_mii_sync(dev->base_addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002677 value = MII_GC_LOOPBK;
Sakari Ailusc659c382011-01-21 10:59:30 +00002678 tlan_mii_write_reg(dev, priv->phy[priv->phy_num], MII_GEN_CTL, value);
2679 tlan_mii_sync(dev->base_addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002680 /* Wait for 500 ms and reset the
2681 * transceiver. The TLAN docs say both 50 ms and
2682 * 500 ms, so do the longer, just in case.
2683 */
Sakari Ailusc659c382011-01-21 10:59:30 +00002684 tlan_set_timer(dev, (HZ/20), TLAN_TIMER_PHY_RESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002685
Sakari Ailusc659c382011-01-21 10:59:30 +00002686}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002687
2688
2689
2690
Sakari Ailusc659c382011-01-21 10:59:30 +00002691static void tlan_phy_reset(struct net_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002692{
Sakari Ailusc659c382011-01-21 10:59:30 +00002693 struct tlan_priv *priv = netdev_priv(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002694 u16 phy;
2695 u16 value;
2696
Sakari Ailusc659c382011-01-21 10:59:30 +00002697 phy = priv->phy[priv->phy_num];
Linus Torvalds1da177e2005-04-16 15:20:36 -07002698
Sakari Ailusc659c382011-01-21 10:59:30 +00002699 TLAN_DBG(TLAN_DEBUG_GNRL, "%s: Reseting PHY.\n", dev->name);
2700 tlan_mii_sync(dev->base_addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002701 value = MII_GC_LOOPBK | MII_GC_RESET;
Sakari Ailusc659c382011-01-21 10:59:30 +00002702 tlan_mii_write_reg(dev, phy, MII_GEN_CTL, value);
2703 tlan_mii_read_reg(dev, phy, MII_GEN_CTL, &value);
2704 while (value & MII_GC_RESET)
2705 tlan_mii_read_reg(dev, phy, MII_GEN_CTL, &value);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002706
2707 /* Wait for 500 ms and initialize.
2708 * I don't remember why I wait this long.
2709 * I've changed this to 50ms, as it seems long enough.
2710 */
Sakari Ailusc659c382011-01-21 10:59:30 +00002711 tlan_set_timer(dev, (HZ/20), TLAN_TIMER_PHY_START_LINK);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002712
Sakari Ailusc659c382011-01-21 10:59:30 +00002713}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002714
2715
2716
2717
Sakari Ailusc659c382011-01-21 10:59:30 +00002718static void tlan_phy_start_link(struct net_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002719{
Sakari Ailusc659c382011-01-21 10:59:30 +00002720 struct tlan_priv *priv = netdev_priv(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002721 u16 ability;
2722 u16 control;
2723 u16 data;
2724 u16 phy;
2725 u16 status;
2726 u16 tctl;
2727
Sakari Ailusc659c382011-01-21 10:59:30 +00002728 phy = priv->phy[priv->phy_num];
2729 TLAN_DBG(TLAN_DEBUG_GNRL, "%s: Trying to activate link.\n", dev->name);
2730 tlan_mii_read_reg(dev, phy, MII_GEN_STS, &status);
2731 tlan_mii_read_reg(dev, phy, MII_GEN_STS, &ability);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002732
Sakari Ailusc659c382011-01-21 10:59:30 +00002733 if ((status & MII_GS_AUTONEG) &&
2734 (!priv->aui)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002735 ability = status >> 11;
Sakari Ailusc659c382011-01-21 10:59:30 +00002736 if (priv->speed == TLAN_SPEED_10 &&
2737 priv->duplex == TLAN_DUPLEX_HALF) {
2738 tlan_mii_write_reg(dev, phy, MII_GEN_CTL, 0x0000);
2739 } else if (priv->speed == TLAN_SPEED_10 &&
2740 priv->duplex == TLAN_DUPLEX_FULL) {
2741 priv->tlan_full_duplex = true;
2742 tlan_mii_write_reg(dev, phy, MII_GEN_CTL, 0x0100);
2743 } else if (priv->speed == TLAN_SPEED_100 &&
2744 priv->duplex == TLAN_DUPLEX_HALF) {
2745 tlan_mii_write_reg(dev, phy, MII_GEN_CTL, 0x2000);
2746 } else if (priv->speed == TLAN_SPEED_100 &&
2747 priv->duplex == TLAN_DUPLEX_FULL) {
2748 priv->tlan_full_duplex = true;
2749 tlan_mii_write_reg(dev, phy, MII_GEN_CTL, 0x2100);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002750 } else {
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002751
Linus Torvalds1da177e2005-04-16 15:20:36 -07002752 /* Set Auto-Neg advertisement */
Sakari Ailusc659c382011-01-21 10:59:30 +00002753 tlan_mii_write_reg(dev, phy, MII_AN_ADV,
2754 (ability << 5) | 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002755 /* Enablee Auto-Neg */
Sakari Ailusc659c382011-01-21 10:59:30 +00002756 tlan_mii_write_reg(dev, phy, MII_GEN_CTL, 0x1000);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002757 /* Restart Auto-Neg */
Sakari Ailusc659c382011-01-21 10:59:30 +00002758 tlan_mii_write_reg(dev, phy, MII_GEN_CTL, 0x1200);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002759 /* Wait for 4 sec for autonegotiation
Sakari Ailusc659c382011-01-21 10:59:30 +00002760 * to complete. The max spec time is less than this
2761 * but the card need additional time to start AN.
2762 * .5 sec should be plenty extra.
2763 */
2764 pr_info("TLAN: %s: Starting autonegotiation.\n",
2765 dev->name);
2766 tlan_set_timer(dev, (2*HZ), TLAN_TIMER_PHY_FINISH_AN);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002767 return;
2768 }
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002769
2770 }
2771
Sakari Ailusc659c382011-01-21 10:59:30 +00002772 if ((priv->aui) && (priv->phy_num != 0)) {
2773 priv->phy_num = 0;
2774 data = TLAN_NET_CFG_1FRAG | TLAN_NET_CFG_1CHAN
2775 | TLAN_NET_CFG_PHY_EN;
2776 tlan_dio_write16(dev->base_addr, TLAN_NET_CONFIG, data);
2777 tlan_set_timer(dev, (40*HZ/1000), TLAN_TIMER_PHY_PDOWN);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002778 return;
Sakari Ailusc659c382011-01-21 10:59:30 +00002779 } else if (priv->phy_num == 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002780 control = 0;
Sakari Ailusc659c382011-01-21 10:59:30 +00002781 tlan_mii_read_reg(dev, phy, TLAN_TLPHY_CTL, &tctl);
2782 if (priv->aui) {
2783 tctl |= TLAN_TC_AUISEL;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002784 } else {
Sakari Ailusc659c382011-01-21 10:59:30 +00002785 tctl &= ~TLAN_TC_AUISEL;
2786 if (priv->duplex == TLAN_DUPLEX_FULL) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002787 control |= MII_GC_DUPLEX;
Sakari Ailusc659c382011-01-21 10:59:30 +00002788 priv->tlan_full_duplex = true;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002789 }
Sakari Ailusc659c382011-01-21 10:59:30 +00002790 if (priv->speed == TLAN_SPEED_100)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002791 control |= MII_GC_SPEEDSEL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002792 }
Sakari Ailusc659c382011-01-21 10:59:30 +00002793 tlan_mii_write_reg(dev, phy, MII_GEN_CTL, control);
2794 tlan_mii_write_reg(dev, phy, TLAN_TLPHY_CTL, tctl);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002795 }
2796
2797 /* Wait for 2 sec to give the transceiver time
2798 * to establish link.
2799 */
Sakari Ailusc659c382011-01-21 10:59:30 +00002800 tlan_set_timer(dev, (4*HZ), TLAN_TIMER_FINISH_RESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002801
Sakari Ailusc659c382011-01-21 10:59:30 +00002802}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002803
2804
2805
2806
Sakari Ailusc659c382011-01-21 10:59:30 +00002807static void tlan_phy_finish_auto_neg(struct net_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002808{
Sakari Ailusc659c382011-01-21 10:59:30 +00002809 struct tlan_priv *priv = netdev_priv(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002810 u16 an_adv;
2811 u16 an_lpa;
2812 u16 data;
2813 u16 mode;
2814 u16 phy;
2815 u16 status;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002816
Sakari Ailusc659c382011-01-21 10:59:30 +00002817 phy = priv->phy[priv->phy_num];
Linus Torvalds1da177e2005-04-16 15:20:36 -07002818
Sakari Ailusc659c382011-01-21 10:59:30 +00002819 tlan_mii_read_reg(dev, phy, MII_GEN_STS, &status);
2820 udelay(1000);
2821 tlan_mii_read_reg(dev, phy, MII_GEN_STS, &status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002822
Sakari Ailusc659c382011-01-21 10:59:30 +00002823 if (!(status & MII_GS_AUTOCMPLT)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002824 /* Wait for 8 sec to give the process
2825 * more time. Perhaps we should fail after a while.
2826 */
Sakari Ailusc659c382011-01-21 10:59:30 +00002827 if (!priv->neg_be_verbose++) {
2828 pr_info("TLAN: Giving autonegotiation more time.\n");
2829 pr_info("TLAN: Please check that your adapter has\n");
2830 pr_info("TLAN: been properly connected to a HUB or Switch.\n");
2831 pr_info("TLAN: Trying to establish link in the background...\n");
2832 }
2833 tlan_set_timer(dev, (8*HZ), TLAN_TIMER_PHY_FINISH_AN);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002834 return;
2835 }
2836
Sakari Ailusc659c382011-01-21 10:59:30 +00002837 pr_info("TLAN: %s: Autonegotiation complete.\n", dev->name);
2838 tlan_mii_read_reg(dev, phy, MII_AN_ADV, &an_adv);
2839 tlan_mii_read_reg(dev, phy, MII_AN_LPA, &an_lpa);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002840 mode = an_adv & an_lpa & 0x03E0;
Sakari Ailusc659c382011-01-21 10:59:30 +00002841 if (mode & 0x0100)
2842 priv->tlan_full_duplex = true;
2843 else if (!(mode & 0x0080) && (mode & 0x0040))
2844 priv->tlan_full_duplex = true;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002845
Sakari Ailusc659c382011-01-21 10:59:30 +00002846 if ((!(mode & 0x0180)) &&
2847 (priv->adapter->flags & TLAN_ADAPTER_USE_INTERN_10) &&
2848 (priv->phy_num != 0)) {
2849 priv->phy_num = 0;
2850 data = TLAN_NET_CFG_1FRAG | TLAN_NET_CFG_1CHAN
2851 | TLAN_NET_CFG_PHY_EN;
2852 tlan_dio_write16(dev->base_addr, TLAN_NET_CONFIG, data);
2853 tlan_set_timer(dev, (400*HZ/1000), TLAN_TIMER_PHY_PDOWN);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002854 return;
2855 }
2856
Sakari Ailusc659c382011-01-21 10:59:30 +00002857 if (priv->phy_num == 0) {
2858 if ((priv->duplex == TLAN_DUPLEX_FULL) ||
2859 (an_adv & an_lpa & 0x0040)) {
2860 tlan_mii_write_reg(dev, phy, MII_GEN_CTL,
2861 MII_GC_AUTOENB | MII_GC_DUPLEX);
2862 pr_info("TLAN: Starting internal PHY with FULL-DUPLEX\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002863 } else {
Sakari Ailusc659c382011-01-21 10:59:30 +00002864 tlan_mii_write_reg(dev, phy, MII_GEN_CTL,
2865 MII_GC_AUTOENB);
2866 pr_info("TLAN: Starting internal PHY with HALF-DUPLEX\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002867 }
2868 }
2869
2870 /* Wait for 100 ms. No reason in partiticular.
2871 */
Sakari Ailusc659c382011-01-21 10:59:30 +00002872 tlan_set_timer(dev, (HZ/10), TLAN_TIMER_FINISH_RESET);
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002873
Sakari Ailusc659c382011-01-21 10:59:30 +00002874}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002875
2876#ifdef MONITOR
2877
Sakari Ailusc659c382011-01-21 10:59:30 +00002878/*********************************************************************
2879 *
2880 * tlan_phy_monitor
2881 *
2882 * Returns:
2883 * None
2884 *
2885 * Params:
2886 * dev The device structure of this device.
2887 *
2888 *
2889 * This function monitors PHY condition by reading the status
2890 * register via the MII bus. This can be used to give info
2891 * about link changes (up/down), and possible switch to alternate
2892 * media.
2893 *
2894 *******************************************************************/
Linus Torvalds1da177e2005-04-16 15:20:36 -07002895
Sakari Ailusc659c382011-01-21 10:59:30 +00002896void tlan_phy_monitor(struct net_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002897{
Sakari Ailusc659c382011-01-21 10:59:30 +00002898 struct tlan_priv *priv = netdev_priv(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002899 u16 phy;
2900 u16 phy_status;
2901
Sakari Ailusc659c382011-01-21 10:59:30 +00002902 phy = priv->phy[priv->phy_num];
Linus Torvalds1da177e2005-04-16 15:20:36 -07002903
Sakari Ailusc659c382011-01-21 10:59:30 +00002904 /* Get PHY status register */
2905 tlan_mii_read_reg(dev, phy, MII_GEN_STS, &phy_status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002906
Sakari Ailusc659c382011-01-21 10:59:30 +00002907 /* Check if link has been lost */
2908 if (!(phy_status & MII_GS_LINK)) {
2909 if (priv->link) {
2910 priv->link = 0;
2911 printk(KERN_DEBUG "TLAN: %s has lost link\n",
2912 dev->name);
2913 netif_carrier_off(dev);
2914 tlan_set_timer(dev, (2*HZ), TLAN_TIMER_LINK_BEAT);
2915 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002916 }
2917 }
2918
Sakari Ailusc659c382011-01-21 10:59:30 +00002919 /* Link restablished? */
2920 if ((phy_status & MII_GS_LINK) && !priv->link) {
2921 priv->link = 1;
2922 printk(KERN_DEBUG "TLAN: %s has reestablished link\n",
2923 dev->name);
7d17c1d2005-05-12 19:45:25 -04002924 netif_carrier_on(dev);
Sakari Ailusc659c382011-01-21 10:59:30 +00002925 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002926
2927 /* Setup a new monitor */
Sakari Ailusc659c382011-01-21 10:59:30 +00002928 tlan_set_timer(dev, (2*HZ), TLAN_TIMER_LINK_BEAT);
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002929}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002930
2931#endif /* MONITOR */
2932
2933
2934/*****************************************************************************
2935******************************************************************************
2936
Sakari Ailusc659c382011-01-21 10:59:30 +00002937ThunderLAN driver MII routines
Linus Torvalds1da177e2005-04-16 15:20:36 -07002938
Sakari Ailusc659c382011-01-21 10:59:30 +00002939these routines are based on the information in chap. 2 of the
2940"ThunderLAN Programmer's Guide", pp. 15-24.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002941
2942******************************************************************************
2943*****************************************************************************/
2944
2945
Sakari Ailusc659c382011-01-21 10:59:30 +00002946/***************************************************************
2947 * tlan_mii_read_reg
2948 *
2949 * Returns:
2950 * false if ack received ok
2951 * true if no ack received or other error
2952 *
2953 * Parms:
2954 * dev The device structure containing
2955 * The io address and interrupt count
2956 * for this device.
2957 * phy The address of the PHY to be queried.
2958 * reg The register whose contents are to be
2959 * retrieved.
2960 * val A pointer to a variable to store the
2961 * retrieved value.
2962 *
2963 * This function uses the TLAN's MII bus to retrieve the contents
2964 * of a given register on a PHY. It sends the appropriate info
2965 * and then reads the 16-bit register value from the MII bus via
2966 * the TLAN SIO register.
2967 *
2968 **************************************************************/
Linus Torvalds1da177e2005-04-16 15:20:36 -07002969
Sakari Ailusc659c382011-01-21 10:59:30 +00002970static bool
2971tlan_mii_read_reg(struct net_device *dev, u16 phy, u16 reg, u16 *val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002972{
2973 u8 nack;
2974 u16 sio, tmp;
Sakari Ailusc659c382011-01-21 10:59:30 +00002975 u32 i;
Joe Perches37fce432010-01-12 20:59:13 +00002976 bool err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002977 int minten;
Sakari Ailusc659c382011-01-21 10:59:30 +00002978 struct tlan_priv *priv = netdev_priv(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002979 unsigned long flags = 0;
2980
Joe Perches37fce432010-01-12 20:59:13 +00002981 err = false;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002982 outw(TLAN_NET_SIO, dev->base_addr + TLAN_DIO_ADR);
2983 sio = dev->base_addr + TLAN_DIO_DATA + TLAN_NET_SIO;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04002984
Linus Torvalds1da177e2005-04-16 15:20:36 -07002985 if (!in_irq())
2986 spin_lock_irqsave(&priv->lock, flags);
2987
Sakari Ailusc659c382011-01-21 10:59:30 +00002988 tlan_mii_sync(dev->base_addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002989
Sakari Ailusc659c382011-01-21 10:59:30 +00002990 minten = tlan_get_bit(TLAN_NET_SIO_MINTEN, sio);
2991 if (minten)
2992 tlan_clear_bit(TLAN_NET_SIO_MINTEN, sio);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002993
Sakari Ailusc659c382011-01-21 10:59:30 +00002994 tlan_mii_send_data(dev->base_addr, 0x1, 2); /* start (01b) */
2995 tlan_mii_send_data(dev->base_addr, 0x2, 2); /* read (10b) */
2996 tlan_mii_send_data(dev->base_addr, phy, 5); /* device # */
2997 tlan_mii_send_data(dev->base_addr, reg, 5); /* register # */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002998
2999
Sakari Ailusc659c382011-01-21 10:59:30 +00003000 tlan_clear_bit(TLAN_NET_SIO_MTXEN, sio); /* change direction */
Linus Torvalds1da177e2005-04-16 15:20:36 -07003001
Sakari Ailusc659c382011-01-21 10:59:30 +00003002 tlan_clear_bit(TLAN_NET_SIO_MCLK, sio); /* clock idle bit */
3003 tlan_set_bit(TLAN_NET_SIO_MCLK, sio);
3004 tlan_clear_bit(TLAN_NET_SIO_MCLK, sio); /* wait 300ns */
Linus Torvalds1da177e2005-04-16 15:20:36 -07003005
Sakari Ailusc659c382011-01-21 10:59:30 +00003006 nack = tlan_get_bit(TLAN_NET_SIO_MDATA, sio); /* check for ACK */
3007 tlan_set_bit(TLAN_NET_SIO_MCLK, sio); /* finish ACK */
3008 if (nack) { /* no ACK, so fake it */
Linus Torvalds1da177e2005-04-16 15:20:36 -07003009 for (i = 0; i < 16; i++) {
Sakari Ailusc659c382011-01-21 10:59:30 +00003010 tlan_clear_bit(TLAN_NET_SIO_MCLK, sio);
3011 tlan_set_bit(TLAN_NET_SIO_MCLK, sio);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003012 }
3013 tmp = 0xffff;
Joe Perches37fce432010-01-12 20:59:13 +00003014 err = true;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003015 } else { /* ACK, so read data */
3016 for (tmp = 0, i = 0x8000; i; i >>= 1) {
Sakari Ailusc659c382011-01-21 10:59:30 +00003017 tlan_clear_bit(TLAN_NET_SIO_MCLK, sio);
3018 if (tlan_get_bit(TLAN_NET_SIO_MDATA, sio))
Linus Torvalds1da177e2005-04-16 15:20:36 -07003019 tmp |= i;
Sakari Ailusc659c382011-01-21 10:59:30 +00003020 tlan_set_bit(TLAN_NET_SIO_MCLK, sio);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003021 }
3022 }
3023
3024
Sakari Ailusc659c382011-01-21 10:59:30 +00003025 tlan_clear_bit(TLAN_NET_SIO_MCLK, sio); /* idle cycle */
3026 tlan_set_bit(TLAN_NET_SIO_MCLK, sio);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003027
Sakari Ailusc659c382011-01-21 10:59:30 +00003028 if (minten)
3029 tlan_set_bit(TLAN_NET_SIO_MINTEN, sio);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003030
3031 *val = tmp;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04003032
Linus Torvalds1da177e2005-04-16 15:20:36 -07003033 if (!in_irq())
3034 spin_unlock_irqrestore(&priv->lock, flags);
3035
3036 return err;
3037
Sakari Ailusc659c382011-01-21 10:59:30 +00003038}
Linus Torvalds1da177e2005-04-16 15:20:36 -07003039
3040
3041
3042
Sakari Ailusc659c382011-01-21 10:59:30 +00003043/***************************************************************
3044 * tlan_mii_send_data
3045 *
3046 * Returns:
3047 * Nothing
3048 * Parms:
3049 * base_port The base IO port of the adapter in
3050 * question.
3051 * dev The address of the PHY to be queried.
3052 * data The value to be placed on the MII bus.
3053 * num_bits The number of bits in data that are to
3054 * be placed on the MII bus.
3055 *
3056 * This function sends on sequence of bits on the MII
3057 * configuration bus.
3058 *
3059 **************************************************************/
Linus Torvalds1da177e2005-04-16 15:20:36 -07003060
Sakari Ailusc659c382011-01-21 10:59:30 +00003061static void tlan_mii_send_data(u16 base_port, u32 data, unsigned num_bits)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003062{
3063 u16 sio;
3064 u32 i;
3065
Sakari Ailusc659c382011-01-21 10:59:30 +00003066 if (num_bits == 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003067 return;
3068
Sakari Ailusc659c382011-01-21 10:59:30 +00003069 outw(TLAN_NET_SIO, base_port + TLAN_DIO_ADR);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003070 sio = base_port + TLAN_DIO_DATA + TLAN_NET_SIO;
Sakari Ailusc659c382011-01-21 10:59:30 +00003071 tlan_set_bit(TLAN_NET_SIO_MTXEN, sio);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003072
Sakari Ailusc659c382011-01-21 10:59:30 +00003073 for (i = (0x1 << (num_bits - 1)); i; i >>= 1) {
3074 tlan_clear_bit(TLAN_NET_SIO_MCLK, sio);
3075 (void) tlan_get_bit(TLAN_NET_SIO_MCLK, sio);
3076 if (data & i)
3077 tlan_set_bit(TLAN_NET_SIO_MDATA, sio);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003078 else
Sakari Ailusc659c382011-01-21 10:59:30 +00003079 tlan_clear_bit(TLAN_NET_SIO_MDATA, sio);
3080 tlan_set_bit(TLAN_NET_SIO_MCLK, sio);
3081 (void) tlan_get_bit(TLAN_NET_SIO_MCLK, sio);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003082 }
3083
Sakari Ailusc659c382011-01-21 10:59:30 +00003084}
Linus Torvalds1da177e2005-04-16 15:20:36 -07003085
3086
3087
3088
Sakari Ailusc659c382011-01-21 10:59:30 +00003089/***************************************************************
3090 * TLan_MiiSync
3091 *
3092 * Returns:
3093 * Nothing
3094 * Parms:
3095 * base_port The base IO port of the adapter in
3096 * question.
3097 *
3098 * This functions syncs all PHYs in terms of the MII configuration
3099 * bus.
3100 *
3101 **************************************************************/
Linus Torvalds1da177e2005-04-16 15:20:36 -07003102
Sakari Ailusc659c382011-01-21 10:59:30 +00003103static void tlan_mii_sync(u16 base_port)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003104{
3105 int i;
3106 u16 sio;
3107
Sakari Ailusc659c382011-01-21 10:59:30 +00003108 outw(TLAN_NET_SIO, base_port + TLAN_DIO_ADR);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003109 sio = base_port + TLAN_DIO_DATA + TLAN_NET_SIO;
3110
Sakari Ailusc659c382011-01-21 10:59:30 +00003111 tlan_clear_bit(TLAN_NET_SIO_MTXEN, sio);
3112 for (i = 0; i < 32; i++) {
3113 tlan_clear_bit(TLAN_NET_SIO_MCLK, sio);
3114 tlan_set_bit(TLAN_NET_SIO_MCLK, sio);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003115 }
3116
Sakari Ailusc659c382011-01-21 10:59:30 +00003117}
Linus Torvalds1da177e2005-04-16 15:20:36 -07003118
3119
3120
3121
Sakari Ailusc659c382011-01-21 10:59:30 +00003122/***************************************************************
3123 * tlan_mii_write_reg
3124 *
3125 * Returns:
3126 * Nothing
3127 * Parms:
3128 * dev The device structure for the device
3129 * to write to.
3130 * phy The address of the PHY to be written to.
3131 * reg The register whose contents are to be
3132 * written.
3133 * val The value to be written to the register.
3134 *
3135 * This function uses the TLAN's MII bus to write the contents of a
3136 * given register on a PHY. It sends the appropriate info and then
3137 * writes the 16-bit register value from the MII configuration bus
3138 * via the TLAN SIO register.
3139 *
3140 **************************************************************/
Linus Torvalds1da177e2005-04-16 15:20:36 -07003141
Sakari Ailusc659c382011-01-21 10:59:30 +00003142static void
3143tlan_mii_write_reg(struct net_device *dev, u16 phy, u16 reg, u16 val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003144{
3145 u16 sio;
3146 int minten;
3147 unsigned long flags = 0;
Sakari Ailusc659c382011-01-21 10:59:30 +00003148 struct tlan_priv *priv = netdev_priv(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003149
3150 outw(TLAN_NET_SIO, dev->base_addr + TLAN_DIO_ADR);
3151 sio = dev->base_addr + TLAN_DIO_DATA + TLAN_NET_SIO;
Jeff Garzik6aa20a22006-09-13 13:24:59 -04003152
Linus Torvalds1da177e2005-04-16 15:20:36 -07003153 if (!in_irq())
3154 spin_lock_irqsave(&priv->lock, flags);
3155
Sakari Ailusc659c382011-01-21 10:59:30 +00003156 tlan_mii_sync(dev->base_addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003157
Sakari Ailusc659c382011-01-21 10:59:30 +00003158 minten = tlan_get_bit(TLAN_NET_SIO_MINTEN, sio);
3159 if (minten)
3160 tlan_clear_bit(TLAN_NET_SIO_MINTEN, sio);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003161
Sakari Ailusc659c382011-01-21 10:59:30 +00003162 tlan_mii_send_data(dev->base_addr, 0x1, 2); /* start (01b) */
3163 tlan_mii_send_data(dev->base_addr, 0x1, 2); /* write (01b) */
3164 tlan_mii_send_data(dev->base_addr, phy, 5); /* device # */
3165 tlan_mii_send_data(dev->base_addr, reg, 5); /* register # */
Linus Torvalds1da177e2005-04-16 15:20:36 -07003166
Sakari Ailusc659c382011-01-21 10:59:30 +00003167 tlan_mii_send_data(dev->base_addr, 0x2, 2); /* send ACK */
3168 tlan_mii_send_data(dev->base_addr, val, 16); /* send data */
Linus Torvalds1da177e2005-04-16 15:20:36 -07003169
Sakari Ailusc659c382011-01-21 10:59:30 +00003170 tlan_clear_bit(TLAN_NET_SIO_MCLK, sio); /* idle cycle */
3171 tlan_set_bit(TLAN_NET_SIO_MCLK, sio);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003172
Sakari Ailusc659c382011-01-21 10:59:30 +00003173 if (minten)
3174 tlan_set_bit(TLAN_NET_SIO_MINTEN, sio);
Jeff Garzik6aa20a22006-09-13 13:24:59 -04003175
Linus Torvalds1da177e2005-04-16 15:20:36 -07003176 if (!in_irq())
3177 spin_unlock_irqrestore(&priv->lock, flags);
3178
Sakari Ailusc659c382011-01-21 10:59:30 +00003179}
Linus Torvalds1da177e2005-04-16 15:20:36 -07003180
3181
3182
3183
3184/*****************************************************************************
3185******************************************************************************
3186
Sakari Ailusc659c382011-01-21 10:59:30 +00003187ThunderLAN driver eeprom routines
Linus Torvalds1da177e2005-04-16 15:20:36 -07003188
Sakari Ailusc659c382011-01-21 10:59:30 +00003189the Compaq netelligent 10 and 10/100 cards use a microchip 24C02A
3190EEPROM. these functions are based on information in microchip's
3191data sheet. I don't know how well this functions will work with
3192other Eeproms.
Linus Torvalds1da177e2005-04-16 15:20:36 -07003193
3194******************************************************************************
3195*****************************************************************************/
3196
3197
Sakari Ailusc659c382011-01-21 10:59:30 +00003198/***************************************************************
3199 * tlan_ee_send_start
3200 *
3201 * Returns:
3202 * Nothing
3203 * Parms:
3204 * io_base The IO port base address for the
3205 * TLAN device with the EEPROM to
3206 * use.
3207 *
3208 * This function sends a start cycle to an EEPROM attached
3209 * to a TLAN chip.
3210 *
3211 **************************************************************/
Linus Torvalds1da177e2005-04-16 15:20:36 -07003212
Sakari Ailusc659c382011-01-21 10:59:30 +00003213static void tlan_ee_send_start(u16 io_base)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003214{
3215 u16 sio;
3216
Sakari Ailusc659c382011-01-21 10:59:30 +00003217 outw(TLAN_NET_SIO, io_base + TLAN_DIO_ADR);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003218 sio = io_base + TLAN_DIO_DATA + TLAN_NET_SIO;
3219
Sakari Ailusc659c382011-01-21 10:59:30 +00003220 tlan_set_bit(TLAN_NET_SIO_ECLOK, sio);
3221 tlan_set_bit(TLAN_NET_SIO_EDATA, sio);
3222 tlan_set_bit(TLAN_NET_SIO_ETXEN, sio);
3223 tlan_clear_bit(TLAN_NET_SIO_EDATA, sio);
3224 tlan_clear_bit(TLAN_NET_SIO_ECLOK, sio);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003225
Sakari Ailusc659c382011-01-21 10:59:30 +00003226}
Linus Torvalds1da177e2005-04-16 15:20:36 -07003227
3228
3229
3230
Sakari Ailusc659c382011-01-21 10:59:30 +00003231/***************************************************************
3232 * tlan_ee_send_byte
3233 *
3234 * Returns:
3235 * If the correct ack was received, 0, otherwise 1
3236 * Parms: io_base The IO port base address for the
3237 * TLAN device with the EEPROM to
3238 * use.
3239 * data The 8 bits of information to
3240 * send to the EEPROM.
3241 * stop If TLAN_EEPROM_STOP is passed, a
3242 * stop cycle is sent after the
3243 * byte is sent after the ack is
3244 * read.
3245 *
3246 * This function sends a byte on the serial EEPROM line,
3247 * driving the clock to send each bit. The function then
3248 * reverses transmission direction and reads an acknowledge
3249 * bit.
3250 *
3251 **************************************************************/
Linus Torvalds1da177e2005-04-16 15:20:36 -07003252
Sakari Ailusc659c382011-01-21 10:59:30 +00003253static int tlan_ee_send_byte(u16 io_base, u8 data, int stop)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003254{
3255 int err;
3256 u8 place;
3257 u16 sio;
3258
Sakari Ailusc659c382011-01-21 10:59:30 +00003259 outw(TLAN_NET_SIO, io_base + TLAN_DIO_ADR);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003260 sio = io_base + TLAN_DIO_DATA + TLAN_NET_SIO;
3261
3262 /* Assume clock is low, tx is enabled; */
Sakari Ailusc659c382011-01-21 10:59:30 +00003263 for (place = 0x80; place != 0; place >>= 1) {
3264 if (place & data)
3265 tlan_set_bit(TLAN_NET_SIO_EDATA, sio);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003266 else
Sakari Ailusc659c382011-01-21 10:59:30 +00003267 tlan_clear_bit(TLAN_NET_SIO_EDATA, sio);
3268 tlan_set_bit(TLAN_NET_SIO_ECLOK, sio);
3269 tlan_clear_bit(TLAN_NET_SIO_ECLOK, sio);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003270 }
Sakari Ailusc659c382011-01-21 10:59:30 +00003271 tlan_clear_bit(TLAN_NET_SIO_ETXEN, sio);
3272 tlan_set_bit(TLAN_NET_SIO_ECLOK, sio);
3273 err = tlan_get_bit(TLAN_NET_SIO_EDATA, sio);
3274 tlan_clear_bit(TLAN_NET_SIO_ECLOK, sio);
3275 tlan_set_bit(TLAN_NET_SIO_ETXEN, sio);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003276
Sakari Ailusc659c382011-01-21 10:59:30 +00003277 if ((!err) && stop) {
Stephen Hemmingerdfc2c0a2008-05-30 09:49:58 -07003278 /* STOP, raise data while clock is high */
Sakari Ailusc659c382011-01-21 10:59:30 +00003279 tlan_clear_bit(TLAN_NET_SIO_EDATA, sio);
3280 tlan_set_bit(TLAN_NET_SIO_ECLOK, sio);
3281 tlan_set_bit(TLAN_NET_SIO_EDATA, sio);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003282 }
3283
Eric Dumazet807540b2010-09-23 05:40:09 +00003284 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003285
Sakari Ailusc659c382011-01-21 10:59:30 +00003286}
Linus Torvalds1da177e2005-04-16 15:20:36 -07003287
3288
3289
3290
Sakari Ailusc659c382011-01-21 10:59:30 +00003291/***************************************************************
3292 * tlan_ee_receive_byte
3293 *
3294 * Returns:
3295 * Nothing
3296 * Parms:
3297 * io_base The IO port base address for the
3298 * TLAN device with the EEPROM to
3299 * use.
3300 * data An address to a char to hold the
3301 * data sent from the EEPROM.
3302 * stop If TLAN_EEPROM_STOP is passed, a
3303 * stop cycle is sent after the
3304 * byte is received, and no ack is
3305 * sent.
3306 *
3307 * This function receives 8 bits of data from the EEPROM
3308 * over the serial link. It then sends and ack bit, or no
3309 * ack and a stop bit. This function is used to retrieve
3310 * data after the address of a byte in the EEPROM has been
3311 * sent.
3312 *
3313 **************************************************************/
Linus Torvalds1da177e2005-04-16 15:20:36 -07003314
Sakari Ailusc659c382011-01-21 10:59:30 +00003315static void tlan_ee_receive_byte(u16 io_base, u8 *data, int stop)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003316{
3317 u8 place;
3318 u16 sio;
3319
Sakari Ailusc659c382011-01-21 10:59:30 +00003320 outw(TLAN_NET_SIO, io_base + TLAN_DIO_ADR);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003321 sio = io_base + TLAN_DIO_DATA + TLAN_NET_SIO;
3322 *data = 0;
3323
3324 /* Assume clock is low, tx is enabled; */
Sakari Ailusc659c382011-01-21 10:59:30 +00003325 tlan_clear_bit(TLAN_NET_SIO_ETXEN, sio);
3326 for (place = 0x80; place; place >>= 1) {
3327 tlan_set_bit(TLAN_NET_SIO_ECLOK, sio);
3328 if (tlan_get_bit(TLAN_NET_SIO_EDATA, sio))
Linus Torvalds1da177e2005-04-16 15:20:36 -07003329 *data |= place;
Sakari Ailusc659c382011-01-21 10:59:30 +00003330 tlan_clear_bit(TLAN_NET_SIO_ECLOK, sio);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003331 }
3332
Sakari Ailusc659c382011-01-21 10:59:30 +00003333 tlan_set_bit(TLAN_NET_SIO_ETXEN, sio);
3334 if (!stop) {
3335 tlan_clear_bit(TLAN_NET_SIO_EDATA, sio); /* ack = 0 */
3336 tlan_set_bit(TLAN_NET_SIO_ECLOK, sio);
3337 tlan_clear_bit(TLAN_NET_SIO_ECLOK, sio);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003338 } else {
Sakari Ailusc659c382011-01-21 10:59:30 +00003339 tlan_set_bit(TLAN_NET_SIO_EDATA, sio); /* no ack = 1 (?) */
3340 tlan_set_bit(TLAN_NET_SIO_ECLOK, sio);
3341 tlan_clear_bit(TLAN_NET_SIO_ECLOK, sio);
Stephen Hemmingerdfc2c0a2008-05-30 09:49:58 -07003342 /* STOP, raise data while clock is high */
Sakari Ailusc659c382011-01-21 10:59:30 +00003343 tlan_clear_bit(TLAN_NET_SIO_EDATA, sio);
3344 tlan_set_bit(TLAN_NET_SIO_ECLOK, sio);
3345 tlan_set_bit(TLAN_NET_SIO_EDATA, sio);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003346 }
3347
Sakari Ailusc659c382011-01-21 10:59:30 +00003348}
Linus Torvalds1da177e2005-04-16 15:20:36 -07003349
3350
3351
3352
Sakari Ailusc659c382011-01-21 10:59:30 +00003353/***************************************************************
3354 * tlan_ee_read_byte
3355 *
3356 * Returns:
3357 * No error = 0, else, the stage at which the error
3358 * occurred.
3359 * Parms:
3360 * io_base The IO port base address for the
3361 * TLAN device with the EEPROM to
3362 * use.
3363 * ee_addr The address of the byte in the
3364 * EEPROM whose contents are to be
3365 * retrieved.
3366 * data An address to a char to hold the
3367 * data obtained from the EEPROM.
3368 *
3369 * This function reads a byte of information from an byte
3370 * cell in the EEPROM.
3371 *
3372 **************************************************************/
Linus Torvalds1da177e2005-04-16 15:20:36 -07003373
Sakari Ailusc659c382011-01-21 10:59:30 +00003374static int tlan_ee_read_byte(struct net_device *dev, u8 ee_addr, u8 *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003375{
3376 int err;
Sakari Ailusc659c382011-01-21 10:59:30 +00003377 struct tlan_priv *priv = netdev_priv(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003378 unsigned long flags = 0;
Sakari Ailusc659c382011-01-21 10:59:30 +00003379 int ret = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003380
3381 spin_lock_irqsave(&priv->lock, flags);
3382
Sakari Ailusc659c382011-01-21 10:59:30 +00003383 tlan_ee_send_start(dev->base_addr);
3384 err = tlan_ee_send_byte(dev->base_addr, 0xa0, TLAN_EEPROM_ACK);
3385 if (err) {
3386 ret = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003387 goto fail;
3388 }
Sakari Ailusc659c382011-01-21 10:59:30 +00003389 err = tlan_ee_send_byte(dev->base_addr, ee_addr, TLAN_EEPROM_ACK);
3390 if (err) {
3391 ret = 2;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003392 goto fail;
3393 }
Sakari Ailusc659c382011-01-21 10:59:30 +00003394 tlan_ee_send_start(dev->base_addr);
3395 err = tlan_ee_send_byte(dev->base_addr, 0xa1, TLAN_EEPROM_ACK);
3396 if (err) {
3397 ret = 3;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003398 goto fail;
3399 }
Sakari Ailusc659c382011-01-21 10:59:30 +00003400 tlan_ee_receive_byte(dev->base_addr, data, TLAN_EEPROM_STOP);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003401fail:
3402 spin_unlock_irqrestore(&priv->lock, flags);
3403
3404 return ret;
3405
Sakari Ailusc659c382011-01-21 10:59:30 +00003406}
Linus Torvalds1da177e2005-04-16 15:20:36 -07003407
3408
3409