blob: 88feced9a6293432e3dd5316a8ec48ab284ca3e7 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
Jeff Garzikf3b197a2006-05-26 21:39:03 -04002 * xircom_cb: A driver for the (tulip-like) Xircom Cardbus ethernet cards
Linus Torvalds1da177e2005-04-16 15:20:36 -07003 *
4 * This software is (C) by the respective authors, and licensed under the GPL
5 * License.
6 *
7 * Written by Arjan van de Ven for Red Hat, Inc.
Jeff Garzikf3b197a2006-05-26 21:39:03 -04008 * Based on work by Jeff Garzik, Doug Ledford and Donald Becker
Linus Torvalds1da177e2005-04-16 15:20:36 -07009 *
10 * This software may be used and distributed according to the terms
11 * of the GNU General Public License, incorporated herein by reference.
12 *
13 *
14 * $Id: xircom_cb.c,v 1.33 2001/03/19 14:02:07 arjanv Exp $
15 */
16
Joe Perches44298ec2010-01-28 20:59:29 +000017#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
18
Linus Torvalds1da177e2005-04-16 15:20:36 -070019#include <linux/module.h>
20#include <linux/kernel.h>
21#include <linux/string.h>
22#include <linux/errno.h>
23#include <linux/ioport.h>
24#include <linux/slab.h>
25#include <linux/interrupt.h>
26#include <linux/pci.h>
27#include <linux/netdevice.h>
28#include <linux/etherdevice.h>
29#include <linux/skbuff.h>
30#include <linux/delay.h>
31#include <linux/init.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070032#include <linux/bitops.h>
33
34#include <asm/uaccess.h>
35#include <asm/io.h>
Al Viro82729972005-12-06 05:53:04 -050036#ifdef CONFIG_NET_POLL_CONTROLLER
37#include <asm/irq.h>
38#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -070039
Linus Torvalds1da177e2005-04-16 15:20:36 -070040MODULE_DESCRIPTION("Xircom Cardbus ethernet driver");
41MODULE_AUTHOR("Arjan van de Ven <arjanv@redhat.com>");
42MODULE_LICENSE("GPL");
43
Francois Romieuebaf7f82012-03-13 09:27:47 +010044#define xw32(reg, val) iowrite32(val, ioaddr + (reg))
45#define xr32(reg) ioread32(ioaddr + (reg))
46#define xr8(reg) ioread8(ioaddr + (reg))
Linus Torvalds1da177e2005-04-16 15:20:36 -070047
48/* IO registers on the card, offsets */
49#define CSR0 0x00
50#define CSR1 0x08
51#define CSR2 0x10
52#define CSR3 0x18
53#define CSR4 0x20
54#define CSR5 0x28
55#define CSR6 0x30
56#define CSR7 0x38
57#define CSR8 0x40
58#define CSR9 0x48
59#define CSR10 0x50
60#define CSR11 0x58
61#define CSR12 0x60
62#define CSR13 0x68
63#define CSR14 0x70
64#define CSR15 0x78
65#define CSR16 0x80
66
67/* PCI registers */
68#define PCI_POWERMGMT 0x40
69
70/* Offsets of the buffers within the descriptor pages, in bytes */
71
72#define NUMDESCRIPTORS 4
73
74static int bufferoffsets[NUMDESCRIPTORS] = {128,2048,4096,6144};
75
76
77struct xircom_private {
78 /* Send and receive buffers, kernel-addressable and dma addressable forms */
79
Al Viro6f35d5d2007-12-23 20:01:04 +000080 __le32 *rx_buffer;
81 __le32 *tx_buffer;
Linus Torvalds1da177e2005-04-16 15:20:36 -070082
83 dma_addr_t rx_dma_handle;
84 dma_addr_t tx_dma_handle;
85
86 struct sk_buff *tx_skb[4];
87
Francois Romieuebaf7f82012-03-13 09:27:47 +010088 void __iomem *ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -070089 int open;
Jeff Garzikf3b197a2006-05-26 21:39:03 -040090
Linus Torvalds1da177e2005-04-16 15:20:36 -070091 /* transmit_used is the rotating counter that indicates which transmit
92 descriptor has to be used next */
93 int transmit_used;
94
95 /* Spinlock to serialize register operations.
96 It must be helt while manipulating the following registers:
97 CSR0, CSR6, CSR7, CSR9, CSR10, CSR15
98 */
99 spinlock_t lock;
100
Linus Torvalds1da177e2005-04-16 15:20:36 -0700101 struct pci_dev *pdev;
102 struct net_device *dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700103};
104
105
106/* Function prototypes */
107static int xircom_probe(struct pci_dev *pdev, const struct pci_device_id *id);
108static void xircom_remove(struct pci_dev *pdev);
David Howells7d12e782006-10-05 14:55:46 +0100109static irqreturn_t xircom_interrupt(int irq, void *dev_instance);
Stephen Hemmingerad096462009-08-31 19:50:53 +0000110static netdev_tx_t xircom_start_xmit(struct sk_buff *skb,
111 struct net_device *dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700112static int xircom_open(struct net_device *dev);
113static int xircom_close(struct net_device *dev);
114static void xircom_up(struct xircom_private *card);
Keith Owens3be034b2005-09-13 15:05:13 +1000115#ifdef CONFIG_NET_POLL_CONTROLLER
Linus Torvalds1da177e2005-04-16 15:20:36 -0700116static void xircom_poll_controller(struct net_device *dev);
117#endif
118
119static void investigate_read_descriptor(struct net_device *dev,struct xircom_private *card, int descnr, unsigned int bufferoffset);
120static void investigate_write_descriptor(struct net_device *dev, struct xircom_private *card, int descnr, unsigned int bufferoffset);
121static void read_mac_address(struct xircom_private *card);
122static void transceiver_voodoo(struct xircom_private *card);
123static void initialize_card(struct xircom_private *card);
124static void trigger_transmit(struct xircom_private *card);
125static void trigger_receive(struct xircom_private *card);
126static void setup_descriptors(struct xircom_private *card);
127static void remove_descriptors(struct xircom_private *card);
128static int link_status_changed(struct xircom_private *card);
129static void activate_receiver(struct xircom_private *card);
130static void deactivate_receiver(struct xircom_private *card);
131static void activate_transmitter(struct xircom_private *card);
132static void deactivate_transmitter(struct xircom_private *card);
133static void enable_transmit_interrupt(struct xircom_private *card);
134static void enable_receive_interrupt(struct xircom_private *card);
135static void enable_link_interrupt(struct xircom_private *card);
136static void disable_all_interrupts(struct xircom_private *card);
137static int link_status(struct xircom_private *card);
138
139
140
Alexey Dobriyana3aa1882010-01-07 11:58:11 +0000141static DEFINE_PCI_DEVICE_TABLE(xircom_pci_table) = {
Francois Romieuebaf7f82012-03-13 09:27:47 +0100142 { PCI_VDEVICE(XIRCOM, 0x0003), },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700143 {0,},
144};
145MODULE_DEVICE_TABLE(pci, xircom_pci_table);
146
147static struct pci_driver xircom_ops = {
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400148 .name = "xircom_cb",
149 .id_table = xircom_pci_table,
150 .probe = xircom_probe,
Bill Pemberton779c1a82012-12-03 09:23:41 -0500151 .remove = xircom_remove,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700152};
153
154
Joe Perches54668b82011-05-09 09:45:20 +0000155#if defined DEBUG && DEBUG > 1
Linus Torvalds1da177e2005-04-16 15:20:36 -0700156static void print_binary(unsigned int number)
157{
158 int i,i2;
159 char buffer[64];
160 memset(buffer,0,64);
161 i2=0;
162 for (i=31;i>=0;i--) {
163 if (number & (1<<i))
164 buffer[i2++]='1';
165 else
166 buffer[i2++]='0';
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400167 if ((i&3)==0)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700168 buffer[i2++]=' ';
169 }
Joe Perches54668b82011-05-09 09:45:20 +0000170 pr_debug("%s\n",buffer);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700171}
172#endif
173
Stephen Hemminger1034c9f2009-01-07 18:00:55 -0800174static const struct net_device_ops netdev_ops = {
175 .ndo_open = xircom_open,
176 .ndo_stop = xircom_close,
177 .ndo_start_xmit = xircom_start_xmit,
178 .ndo_change_mtu = eth_change_mtu,
179 .ndo_set_mac_address = eth_mac_addr,
180 .ndo_validate_addr = eth_validate_addr,
181#ifdef CONFIG_NET_POLL_CONTROLLER
182 .ndo_poll_controller = xircom_poll_controller,
183#endif
184};
185
Linus Torvalds1da177e2005-04-16 15:20:36 -0700186/* xircom_probe is the code that gets called on device insertion.
187 it sets up the hardware and registers the device to the networklayer.
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400188
Linus Torvalds1da177e2005-04-16 15:20:36 -0700189 TODO: Send 1 or 2 "dummy" packets here as the card seems to discard the
190 first two packets that get send, and pump hates that.
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400191
Linus Torvalds1da177e2005-04-16 15:20:36 -0700192 */
Bill Pemberton779c1a82012-12-03 09:23:41 -0500193static int xircom_probe(struct pci_dev *pdev, const struct pci_device_id *id)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700194{
Francois Romieud59a1882012-03-11 23:34:54 +0100195 struct device *d = &pdev->dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700196 struct net_device *dev = NULL;
197 struct xircom_private *private;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700198 unsigned long flags;
199 unsigned short tmp16;
Francois Romieud59a1882012-03-11 23:34:54 +0100200 int rc;
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400201
Linus Torvalds1da177e2005-04-16 15:20:36 -0700202 /* First do the PCI initialisation */
203
Francois Romieud59a1882012-03-11 23:34:54 +0100204 rc = pci_enable_device(pdev);
205 if (rc < 0)
206 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700207
208 /* disable all powermanagement */
209 pci_write_config_dword(pdev, PCI_POWERMGMT, 0x0000);
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400210
Linus Torvalds1da177e2005-04-16 15:20:36 -0700211 pci_set_master(pdev); /* Why isn't this done by pci_enable_device ?*/
212
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400213 /* clear PCI status, if any */
214 pci_read_config_word (pdev,PCI_STATUS, &tmp16);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700215 pci_write_config_word (pdev, PCI_STATUS,tmp16);
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400216
Francois Romieud59a1882012-03-11 23:34:54 +0100217 rc = pci_request_regions(pdev, "xircom_cb");
218 if (rc < 0) {
Joe Perches44298ec2010-01-28 20:59:29 +0000219 pr_err("%s: failed to allocate io-region\n", __func__);
Francois Romieud59a1882012-03-11 23:34:54 +0100220 goto err_disable;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700221 }
222
Francois Romieud59a1882012-03-11 23:34:54 +0100223 rc = -ENOMEM;
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400224 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700225 Before changing the hardware, allocate the memory.
226 This way, we can fail gracefully if not enough memory
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400227 is available.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700228 */
229 dev = alloc_etherdev(sizeof(struct xircom_private));
Joe Perches41de8d42012-01-29 13:47:52 +0000230 if (!dev)
Francois Romieud59a1882012-03-11 23:34:54 +0100231 goto err_release;
Joe Perches41de8d42012-01-29 13:47:52 +0000232
Linus Torvalds1da177e2005-04-16 15:20:36 -0700233 private = netdev_priv(dev);
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400234
Linus Torvalds1da177e2005-04-16 15:20:36 -0700235 /* Allocate the send/receive buffers */
Francois Romieud59a1882012-03-11 23:34:54 +0100236 private->rx_buffer = dma_alloc_coherent(d, 8192,
237 &private->rx_dma_handle,
238 GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700239 if (private->rx_buffer == NULL) {
Joe Perches44298ec2010-01-28 20:59:29 +0000240 pr_err("%s: no memory for rx buffer\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700241 goto rx_buf_fail;
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400242 }
Francois Romieud59a1882012-03-11 23:34:54 +0100243 private->tx_buffer = dma_alloc_coherent(d, 8192,
244 &private->tx_dma_handle,
245 GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700246 if (private->tx_buffer == NULL) {
Joe Perches44298ec2010-01-28 20:59:29 +0000247 pr_err("%s: no memory for tx buffer\n", __func__);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700248 goto tx_buf_fail;
249 }
250
Linus Torvalds1da177e2005-04-16 15:20:36 -0700251 SET_NETDEV_DEV(dev, &pdev->dev);
252
253
254 private->dev = dev;
255 private->pdev = pdev;
Francois Romieuebaf7f82012-03-13 09:27:47 +0100256
257 /* IO range. */
258 private->ioaddr = pci_iomap(pdev, 0, 0);
259 if (!private->ioaddr)
260 goto reg_fail;
261
Linus Torvalds1da177e2005-04-16 15:20:36 -0700262 spin_lock_init(&private->lock);
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400263
Linus Torvalds1da177e2005-04-16 15:20:36 -0700264 initialize_card(private);
265 read_mac_address(private);
266 setup_descriptors(private);
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400267
Stephen Hemminger1034c9f2009-01-07 18:00:55 -0800268 dev->netdev_ops = &netdev_ops;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700269 pci_set_drvdata(pdev, dev);
270
Francois Romieud59a1882012-03-11 23:34:54 +0100271 rc = register_netdev(dev);
272 if (rc < 0) {
Joe Perches44298ec2010-01-28 20:59:29 +0000273 pr_err("%s: netdevice registration failed\n", __func__);
Francois Romieuebaf7f82012-03-13 09:27:47 +0100274 goto err_unmap;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700275 }
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400276
Joe Perches163ef0b2011-05-09 09:45:21 +0000277 netdev_info(dev, "Xircom cardbus revision %i at irq %i\n",
278 pdev->revision, pdev->irq);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700279 /* start the transmitter to get a heartbeat */
280 /* TODO: send 2 dummy packets here */
281 transceiver_voodoo(private);
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400282
Linus Torvalds1da177e2005-04-16 15:20:36 -0700283 spin_lock_irqsave(&private->lock,flags);
284 activate_transmitter(private);
285 activate_receiver(private);
286 spin_unlock_irqrestore(&private->lock,flags);
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400287
Linus Torvalds1da177e2005-04-16 15:20:36 -0700288 trigger_receive(private);
Francois Romieud59a1882012-03-11 23:34:54 +0100289out:
290 return rc;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700291
Francois Romieuebaf7f82012-03-13 09:27:47 +0100292err_unmap:
293 pci_iounmap(pdev, private->ioaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700294reg_fail:
Francois Romieud59a1882012-03-11 23:34:54 +0100295 pci_set_drvdata(pdev, NULL);
296 dma_free_coherent(d, 8192, private->tx_buffer, private->tx_dma_handle);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700297tx_buf_fail:
Francois Romieud59a1882012-03-11 23:34:54 +0100298 dma_free_coherent(d, 8192, private->rx_buffer, private->rx_dma_handle);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700299rx_buf_fail:
300 free_netdev(dev);
Francois Romieud59a1882012-03-11 23:34:54 +0100301err_release:
302 pci_release_regions(pdev);
303err_disable:
304 pci_disable_device(pdev);
305 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700306}
307
308
309/*
310 xircom_remove is called on module-unload or on device-eject.
311 it unregisters the irq, io-region and network device.
312 Interrupts and such are already stopped in the "ifconfig ethX down"
313 code.
314 */
Bill Pemberton779c1a82012-12-03 09:23:41 -0500315static void xircom_remove(struct pci_dev *pdev)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700316{
317 struct net_device *dev = pci_get_drvdata(pdev);
318 struct xircom_private *card = netdev_priv(dev);
Francois Romieud59a1882012-03-11 23:34:54 +0100319 struct device *d = &pdev->dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700320
Linus Torvalds1da177e2005-04-16 15:20:36 -0700321 unregister_netdev(dev);
Francois Romieuebaf7f82012-03-13 09:27:47 +0100322 pci_iounmap(pdev, card->ioaddr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700323 pci_set_drvdata(pdev, NULL);
Francois Romieud59a1882012-03-11 23:34:54 +0100324 dma_free_coherent(d, 8192, card->tx_buffer, card->tx_dma_handle);
325 dma_free_coherent(d, 8192, card->rx_buffer, card->rx_dma_handle);
326 free_netdev(dev);
327 pci_release_regions(pdev);
328 pci_disable_device(pdev);
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400329}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700330
David Howells7d12e782006-10-05 14:55:46 +0100331static irqreturn_t xircom_interrupt(int irq, void *dev_instance)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700332{
333 struct net_device *dev = (struct net_device *) dev_instance;
334 struct xircom_private *card = netdev_priv(dev);
Francois Romieuebaf7f82012-03-13 09:27:47 +0100335 void __iomem *ioaddr = card->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700336 unsigned int status;
337 int i;
338
Linus Torvalds1da177e2005-04-16 15:20:36 -0700339 spin_lock(&card->lock);
Francois Romieuebaf7f82012-03-13 09:27:47 +0100340 status = xr32(CSR5);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700341
Joe Perches54668b82011-05-09 09:45:20 +0000342#if defined DEBUG && DEBUG > 1
Linus Torvalds1da177e2005-04-16 15:20:36 -0700343 print_binary(status);
Joe Perches54668b82011-05-09 09:45:20 +0000344 pr_debug("tx status 0x%08x 0x%08x\n",
345 card->tx_buffer[0], card->tx_buffer[4]);
346 pr_debug("rx status 0x%08x 0x%08x\n",
347 card->rx_buffer[0], card->rx_buffer[4]);
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400348#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -0700349 /* Handle shared irq and hotplug */
350 if (status == 0 || status == 0xffffffff) {
351 spin_unlock(&card->lock);
352 return IRQ_NONE;
353 }
354
355 if (link_status_changed(card)) {
356 int newlink;
Joe Perches726b65a2011-05-09 09:45:22 +0000357 netdev_dbg(dev, "Link status has changed\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700358 newlink = link_status(card);
Joe Perches163ef0b2011-05-09 09:45:21 +0000359 netdev_info(dev, "Link is %d mbit\n", newlink);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700360 if (newlink)
361 netif_carrier_on(dev);
362 else
363 netif_carrier_off(dev);
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400364
Linus Torvalds1da177e2005-04-16 15:20:36 -0700365 }
366
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400367 /* Clear all remaining interrupts */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700368 status |= 0xffffffff; /* FIXME: make this clear only the
369 real existing bits */
Francois Romieuebaf7f82012-03-13 09:27:47 +0100370 xw32(CSR5, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700371
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400372
373 for (i=0;i<NUMDESCRIPTORS;i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700374 investigate_write_descriptor(dev,card,i,bufferoffsets[i]);
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400375 for (i=0;i<NUMDESCRIPTORS;i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700376 investigate_read_descriptor(dev,card,i,bufferoffsets[i]);
377
Linus Torvalds1da177e2005-04-16 15:20:36 -0700378 spin_unlock(&card->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700379 return IRQ_HANDLED;
380}
381
Stephen Hemmingerad096462009-08-31 19:50:53 +0000382static netdev_tx_t xircom_start_xmit(struct sk_buff *skb,
383 struct net_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700384{
385 struct xircom_private *card;
386 unsigned long flags;
387 int nextdescriptor;
388 int desc;
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400389
Linus Torvalds1da177e2005-04-16 15:20:36 -0700390 card = netdev_priv(dev);
391 spin_lock_irqsave(&card->lock,flags);
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400392
Linus Torvalds1da177e2005-04-16 15:20:36 -0700393 /* First see if we can free some descriptors */
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400394 for (desc=0;desc<NUMDESCRIPTORS;desc++)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700395 investigate_write_descriptor(dev,card,desc,bufferoffsets[desc]);
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400396
397
Linus Torvalds1da177e2005-04-16 15:20:36 -0700398 nextdescriptor = (card->transmit_used +1) % (NUMDESCRIPTORS);
399 desc = card->transmit_used;
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400400
Linus Torvalds1da177e2005-04-16 15:20:36 -0700401 /* only send the packet if the descriptor is free */
402 if (card->tx_buffer[4*desc]==0) {
403 /* Copy the packet data; zero the memory first as the card
404 sometimes sends more than you ask it to. */
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400405
Linus Torvalds1da177e2005-04-16 15:20:36 -0700406 memset(&card->tx_buffer[bufferoffsets[desc]/4],0,1536);
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -0300407 skb_copy_from_linear_data(skb,
408 &(card->tx_buffer[bufferoffsets[desc] / 4]),
409 skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700410 /* FIXME: The specification tells us that the length we send HAS to be a multiple of
411 4 bytes. */
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400412
Al Viro6f35d5d2007-12-23 20:01:04 +0000413 card->tx_buffer[4*desc+1] = cpu_to_le32(skb->len);
414 if (desc == NUMDESCRIPTORS - 1) /* bit 25: last descriptor of the ring */
415 card->tx_buffer[4*desc+1] |= cpu_to_le32(1<<25);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700416
Al Viro6f35d5d2007-12-23 20:01:04 +0000417 card->tx_buffer[4*desc+1] |= cpu_to_le32(0xF0000000);
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400418 /* 0xF0... means want interrupts*/
Linus Torvalds1da177e2005-04-16 15:20:36 -0700419 card->tx_skb[desc] = skb;
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400420
Linus Torvalds1da177e2005-04-16 15:20:36 -0700421 wmb();
422 /* This gives the descriptor to the card */
Al Viro6f35d5d2007-12-23 20:01:04 +0000423 card->tx_buffer[4*desc] = cpu_to_le32(0x80000000);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700424 trigger_transmit(card);
Al Viro6f35d5d2007-12-23 20:01:04 +0000425 if (card->tx_buffer[nextdescriptor*4] & cpu_to_le32(0x8000000)) {
426 /* next descriptor is occupied... */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700427 netif_stop_queue(dev);
428 }
429 card->transmit_used = nextdescriptor;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700430 spin_unlock_irqrestore(&card->lock,flags);
Patrick McHardy6ed10652009-06-23 06:03:08 +0000431 return NETDEV_TX_OK;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700432 }
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400433
Linus Torvalds1da177e2005-04-16 15:20:36 -0700434 /* Uh oh... no free descriptor... drop the packet */
435 netif_stop_queue(dev);
436 spin_unlock_irqrestore(&card->lock,flags);
437 trigger_transmit(card);
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400438
Erik Mouw06f75252008-02-04 18:56:54 +0100439 return NETDEV_TX_BUSY;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700440}
441
442
443
444
445static int xircom_open(struct net_device *dev)
446{
447 struct xircom_private *xp = netdev_priv(dev);
Francois Romieuebaf7f82012-03-13 09:27:47 +0100448 const int irq = xp->pdev->irq;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700449 int retval;
Joe Perches54668b82011-05-09 09:45:20 +0000450
Francois Romieuebaf7f82012-03-13 09:27:47 +0100451 netdev_info(dev, "xircom cardbus adaptor found, using irq %i\n", irq);
452 retval = request_irq(irq, xircom_interrupt, IRQF_SHARED, dev->name, dev);
Joe Perches54668b82011-05-09 09:45:20 +0000453 if (retval)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700454 return retval;
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400455
Linus Torvalds1da177e2005-04-16 15:20:36 -0700456 xircom_up(xp);
457 xp->open = 1;
Joe Perches54668b82011-05-09 09:45:20 +0000458
Linus Torvalds1da177e2005-04-16 15:20:36 -0700459 return 0;
460}
461
462static int xircom_close(struct net_device *dev)
463{
464 struct xircom_private *card;
465 unsigned long flags;
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400466
Linus Torvalds1da177e2005-04-16 15:20:36 -0700467 card = netdev_priv(dev);
468 netif_stop_queue(dev); /* we don't want new packets */
469
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400470
Linus Torvalds1da177e2005-04-16 15:20:36 -0700471 spin_lock_irqsave(&card->lock,flags);
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400472
Linus Torvalds1da177e2005-04-16 15:20:36 -0700473 disable_all_interrupts(card);
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400474#if 0
Linus Torvalds1da177e2005-04-16 15:20:36 -0700475 /* We can enable this again once we send dummy packets on ifconfig ethX up */
476 deactivate_receiver(card);
477 deactivate_transmitter(card);
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400478#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -0700479 remove_descriptors(card);
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400480
Linus Torvalds1da177e2005-04-16 15:20:36 -0700481 spin_unlock_irqrestore(&card->lock,flags);
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400482
Linus Torvalds1da177e2005-04-16 15:20:36 -0700483 card->open = 0;
Francois Romieuebaf7f82012-03-13 09:27:47 +0100484 free_irq(card->pdev->irq, dev);
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400485
Linus Torvalds1da177e2005-04-16 15:20:36 -0700486 return 0;
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400487
Linus Torvalds1da177e2005-04-16 15:20:36 -0700488}
489
490
Linus Torvalds1da177e2005-04-16 15:20:36 -0700491#ifdef CONFIG_NET_POLL_CONTROLLER
492static void xircom_poll_controller(struct net_device *dev)
493{
Francois Romieuebaf7f82012-03-13 09:27:47 +0100494 struct xircom_private *xp = netdev_priv(dev);
495 const int irq = xp->pdev->irq;
496
497 disable_irq(irq);
498 xircom_interrupt(irq, dev);
499 enable_irq(irq);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700500}
501#endif
502
503
504static void initialize_card(struct xircom_private *card)
505{
Francois Romieuebaf7f82012-03-13 09:27:47 +0100506 void __iomem *ioaddr = card->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700507 unsigned long flags;
Francois Romieuebaf7f82012-03-13 09:27:47 +0100508 u32 val;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700509
510 spin_lock_irqsave(&card->lock, flags);
511
512 /* First: reset the card */
Francois Romieuebaf7f82012-03-13 09:27:47 +0100513 val = xr32(CSR0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700514 val |= 0x01; /* Software reset */
Francois Romieuebaf7f82012-03-13 09:27:47 +0100515 xw32(CSR0, val);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700516
517 udelay(100); /* give the card some time to reset */
518
Francois Romieuebaf7f82012-03-13 09:27:47 +0100519 val = xr32(CSR0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700520 val &= ~0x01; /* disable Software reset */
Francois Romieuebaf7f82012-03-13 09:27:47 +0100521 xw32(CSR0, val);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700522
523
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400524 val = 0; /* Value 0x00 is a safe and conservative value
Linus Torvalds1da177e2005-04-16 15:20:36 -0700525 for the PCI configuration settings */
Francois Romieuebaf7f82012-03-13 09:27:47 +0100526 xw32(CSR0, val);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700527
528
529 disable_all_interrupts(card);
530 deactivate_receiver(card);
531 deactivate_transmitter(card);
532
533 spin_unlock_irqrestore(&card->lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700534}
535
536/*
537trigger_transmit causes the card to check for frames to be transmitted.
538This is accomplished by writing to the CSR1 port. The documentation
539claims that the act of writing is sufficient and that the value is
540ignored; I chose zero.
541*/
542static void trigger_transmit(struct xircom_private *card)
543{
Francois Romieuebaf7f82012-03-13 09:27:47 +0100544 void __iomem *ioaddr = card->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700545
Francois Romieuebaf7f82012-03-13 09:27:47 +0100546 xw32(CSR1, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700547}
548
549/*
550trigger_receive causes the card to check for empty frames in the
551descriptor list in which packets can be received.
552This is accomplished by writing to the CSR2 port. The documentation
553claims that the act of writing is sufficient and that the value is
554ignored; I chose zero.
555*/
556static void trigger_receive(struct xircom_private *card)
557{
Francois Romieuebaf7f82012-03-13 09:27:47 +0100558 void __iomem *ioaddr = card->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700559
Francois Romieuebaf7f82012-03-13 09:27:47 +0100560 xw32(CSR2, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700561}
562
563/*
564setup_descriptors initializes the send and receive buffers to be valid
565descriptors and programs the addresses into the card.
566*/
567static void setup_descriptors(struct xircom_private *card)
568{
Francois Romieuebaf7f82012-03-13 09:27:47 +0100569 void __iomem *ioaddr = card->ioaddr;
Al Viro6f35d5d2007-12-23 20:01:04 +0000570 u32 address;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700571 int i;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700572
Eric Sesterhenn / snakebytea707cd62006-01-26 22:02:51 +0100573 BUG_ON(card->rx_buffer == NULL);
574 BUG_ON(card->tx_buffer == NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700575
576 /* Receive descriptors */
577 memset(card->rx_buffer, 0, 128); /* clear the descriptors */
578 for (i=0;i<NUMDESCRIPTORS;i++ ) {
579
580 /* Rx Descr0: It's empty, let the card own it, no errors -> 0x80000000 */
Al Viro6f35d5d2007-12-23 20:01:04 +0000581 card->rx_buffer[i*4 + 0] = cpu_to_le32(0x80000000);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700582 /* Rx Descr1: buffer 1 is 1536 bytes, buffer 2 is 0 bytes */
Al Viro6f35d5d2007-12-23 20:01:04 +0000583 card->rx_buffer[i*4 + 1] = cpu_to_le32(1536);
584 if (i == NUMDESCRIPTORS - 1) /* bit 25 is "last descriptor" */
585 card->rx_buffer[i*4 + 1] |= cpu_to_le32(1 << 25);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700586
587 /* Rx Descr2: address of the buffer
588 we store the buffer at the 2nd half of the page */
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400589
Al Viro6f35d5d2007-12-23 20:01:04 +0000590 address = card->rx_dma_handle;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700591 card->rx_buffer[i*4 + 2] = cpu_to_le32(address + bufferoffsets[i]);
592 /* Rx Desc3: address of 2nd buffer -> 0 */
593 card->rx_buffer[i*4 + 3] = 0;
594 }
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400595
Linus Torvalds1da177e2005-04-16 15:20:36 -0700596 wmb();
597 /* Write the receive descriptor ring address to the card */
Al Viro6f35d5d2007-12-23 20:01:04 +0000598 address = card->rx_dma_handle;
Francois Romieuebaf7f82012-03-13 09:27:47 +0100599 xw32(CSR3, address); /* Receive descr list address */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700600
601
602 /* transmit descriptors */
603 memset(card->tx_buffer, 0, 128); /* clear the descriptors */
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400604
Linus Torvalds1da177e2005-04-16 15:20:36 -0700605 for (i=0;i<NUMDESCRIPTORS;i++ ) {
606 /* Tx Descr0: Empty, we own it, no errors -> 0x00000000 */
607 card->tx_buffer[i*4 + 0] = 0x00000000;
608 /* Tx Descr1: buffer 1 is 1536 bytes, buffer 2 is 0 bytes */
Al Viro6f35d5d2007-12-23 20:01:04 +0000609 card->tx_buffer[i*4 + 1] = cpu_to_le32(1536);
610 if (i == NUMDESCRIPTORS - 1) /* bit 25 is "last descriptor" */
611 card->tx_buffer[i*4 + 1] |= cpu_to_le32(1 << 25);
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400612
Linus Torvalds1da177e2005-04-16 15:20:36 -0700613 /* Tx Descr2: address of the buffer
614 we store the buffer at the 2nd half of the page */
Al Viro6f35d5d2007-12-23 20:01:04 +0000615 address = card->tx_dma_handle;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700616 card->tx_buffer[i*4 + 2] = cpu_to_le32(address + bufferoffsets[i]);
617 /* Tx Desc3: address of 2nd buffer -> 0 */
618 card->tx_buffer[i*4 + 3] = 0;
619 }
620
621 wmb();
622 /* wite the transmit descriptor ring to the card */
Al Viro6f35d5d2007-12-23 20:01:04 +0000623 address = card->tx_dma_handle;
Francois Romieuebaf7f82012-03-13 09:27:47 +0100624 xw32(CSR4, address); /* xmit descr list address */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700625}
626
627/*
628remove_descriptors informs the card the descriptors are no longer
629valid by setting the address in the card to 0x00.
630*/
631static void remove_descriptors(struct xircom_private *card)
632{
Francois Romieuebaf7f82012-03-13 09:27:47 +0100633 void __iomem *ioaddr = card->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700634 unsigned int val;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700635
636 val = 0;
Francois Romieuebaf7f82012-03-13 09:27:47 +0100637 xw32(CSR3, val); /* Receive descriptor address */
638 xw32(CSR4, val); /* Send descriptor address */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700639}
640
641/*
642link_status_changed returns 1 if the card has indicated that
643the link status has changed. The new link status has to be read from CSR12.
644
645This function also clears the status-bit.
646*/
647static int link_status_changed(struct xircom_private *card)
648{
Francois Romieuebaf7f82012-03-13 09:27:47 +0100649 void __iomem *ioaddr = card->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700650 unsigned int val;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700651
Francois Romieuebaf7f82012-03-13 09:27:47 +0100652 val = xr32(CSR5); /* Status register */
653 if (!(val & (1 << 27))) /* no change */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700654 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700655
656 /* clear the event by writing a 1 to the bit in the
657 status register. */
658 val = (1 << 27);
Francois Romieuebaf7f82012-03-13 09:27:47 +0100659 xw32(CSR5, val);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700660
Linus Torvalds1da177e2005-04-16 15:20:36 -0700661 return 1;
662}
663
664
665/*
666transmit_active returns 1 if the transmitter on the card is
667in a non-stopped state.
668*/
669static int transmit_active(struct xircom_private *card)
670{
Francois Romieuebaf7f82012-03-13 09:27:47 +0100671 void __iomem *ioaddr = card->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700672
Francois Romieuebaf7f82012-03-13 09:27:47 +0100673 if (!(xr32(CSR5) & (7 << 20))) /* transmitter disabled */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700674 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700675
Linus Torvalds1da177e2005-04-16 15:20:36 -0700676 return 1;
677}
678
679/*
680receive_active returns 1 if the receiver on the card is
681in a non-stopped state.
682*/
683static int receive_active(struct xircom_private *card)
684{
Francois Romieuebaf7f82012-03-13 09:27:47 +0100685 void __iomem *ioaddr = card->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700686
Francois Romieuebaf7f82012-03-13 09:27:47 +0100687 if (!(xr32(CSR5) & (7 << 17))) /* receiver disabled */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700688 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700689
Linus Torvalds1da177e2005-04-16 15:20:36 -0700690 return 1;
691}
692
693/*
694activate_receiver enables the receiver on the card.
695Before being allowed to active the receiver, the receiver
696must be completely de-activated. To achieve this,
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400697this code actually disables the receiver first; then it waits for the
Linus Torvalds1da177e2005-04-16 15:20:36 -0700698receiver to become inactive, then it activates the receiver and then
699it waits for the receiver to be active.
700
701must be called with the lock held and interrupts disabled.
702*/
703static void activate_receiver(struct xircom_private *card)
704{
Francois Romieuebaf7f82012-03-13 09:27:47 +0100705 void __iomem *ioaddr = card->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700706 unsigned int val;
707 int counter;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700708
Francois Romieuebaf7f82012-03-13 09:27:47 +0100709 val = xr32(CSR6); /* Operation mode */
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400710
Linus Torvalds1da177e2005-04-16 15:20:36 -0700711 /* If the "active" bit is set and the receiver is already
712 active, no need to do the expensive thing */
713 if ((val&2) && (receive_active(card)))
714 return;
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400715
716
Linus Torvalds1da177e2005-04-16 15:20:36 -0700717 val = val & ~2; /* disable the receiver */
Francois Romieuebaf7f82012-03-13 09:27:47 +0100718 xw32(CSR6, val);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700719
720 counter = 10;
721 while (counter > 0) {
722 if (!receive_active(card))
723 break;
724 /* wait a while */
725 udelay(50);
726 counter--;
727 if (counter <= 0)
Joe Perches163ef0b2011-05-09 09:45:21 +0000728 netdev_err(card->dev, "Receiver failed to deactivate\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700729 }
730
731 /* enable the receiver */
Francois Romieuebaf7f82012-03-13 09:27:47 +0100732 val = xr32(CSR6); /* Operation mode */
733 val = val | 2; /* enable the receiver */
734 xw32(CSR6, val);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700735
736 /* now wait for the card to activate again */
737 counter = 10;
738 while (counter > 0) {
739 if (receive_active(card))
740 break;
741 /* wait a while */
742 udelay(50);
743 counter--;
744 if (counter <= 0)
Joe Perches163ef0b2011-05-09 09:45:21 +0000745 netdev_err(card->dev,
746 "Receiver failed to re-activate\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700747 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700748}
749
750/*
751deactivate_receiver disables the receiver on the card.
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400752To achieve this this code disables the receiver first;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700753then it waits for the receiver to become inactive.
754
755must be called with the lock held and interrupts disabled.
756*/
757static void deactivate_receiver(struct xircom_private *card)
758{
Francois Romieuebaf7f82012-03-13 09:27:47 +0100759 void __iomem *ioaddr = card->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700760 unsigned int val;
761 int counter;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700762
Francois Romieuebaf7f82012-03-13 09:27:47 +0100763 val = xr32(CSR6); /* Operation mode */
764 val = val & ~2; /* disable the receiver */
765 xw32(CSR6, val);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700766
767 counter = 10;
768 while (counter > 0) {
769 if (!receive_active(card))
770 break;
771 /* wait a while */
772 udelay(50);
773 counter--;
774 if (counter <= 0)
Joe Perches163ef0b2011-05-09 09:45:21 +0000775 netdev_err(card->dev, "Receiver failed to deactivate\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700776 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700777}
778
779
780/*
781activate_transmitter enables the transmitter on the card.
782Before being allowed to active the transmitter, the transmitter
783must be completely de-activated. To achieve this,
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400784this code actually disables the transmitter first; then it waits for the
Linus Torvalds1da177e2005-04-16 15:20:36 -0700785transmitter to become inactive, then it activates the transmitter and then
786it waits for the transmitter to be active again.
787
788must be called with the lock held and interrupts disabled.
789*/
790static void activate_transmitter(struct xircom_private *card)
791{
Francois Romieuebaf7f82012-03-13 09:27:47 +0100792 void __iomem *ioaddr = card->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700793 unsigned int val;
794 int counter;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700795
Francois Romieuebaf7f82012-03-13 09:27:47 +0100796 val = xr32(CSR6); /* Operation mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700797
798 /* If the "active" bit is set and the receiver is already
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400799 active, no need to do the expensive thing */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700800 if ((val&(1<<13)) && (transmit_active(card)))
801 return;
802
803 val = val & ~(1 << 13); /* disable the transmitter */
Francois Romieuebaf7f82012-03-13 09:27:47 +0100804 xw32(CSR6, val);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700805
806 counter = 10;
807 while (counter > 0) {
808 if (!transmit_active(card))
809 break;
810 /* wait a while */
811 udelay(50);
812 counter--;
813 if (counter <= 0)
Joe Perches163ef0b2011-05-09 09:45:21 +0000814 netdev_err(card->dev,
815 "Transmitter failed to deactivate\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700816 }
817
818 /* enable the transmitter */
Francois Romieuebaf7f82012-03-13 09:27:47 +0100819 val = xr32(CSR6); /* Operation mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700820 val = val | (1 << 13); /* enable the transmitter */
Francois Romieuebaf7f82012-03-13 09:27:47 +0100821 xw32(CSR6, val);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700822
823 /* now wait for the card to activate again */
824 counter = 10;
825 while (counter > 0) {
826 if (transmit_active(card))
827 break;
828 /* wait a while */
829 udelay(50);
830 counter--;
831 if (counter <= 0)
Joe Perches163ef0b2011-05-09 09:45:21 +0000832 netdev_err(card->dev,
833 "Transmitter failed to re-activate\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700834 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700835}
836
837/*
838deactivate_transmitter disables the transmitter on the card.
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400839To achieve this this code disables the transmitter first;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700840then it waits for the transmitter to become inactive.
841
842must be called with the lock held and interrupts disabled.
843*/
844static void deactivate_transmitter(struct xircom_private *card)
845{
Francois Romieuebaf7f82012-03-13 09:27:47 +0100846 void __iomem *ioaddr = card->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700847 unsigned int val;
848 int counter;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700849
Francois Romieuebaf7f82012-03-13 09:27:47 +0100850 val = xr32(CSR6); /* Operation mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700851 val = val & ~2; /* disable the transmitter */
Francois Romieuebaf7f82012-03-13 09:27:47 +0100852 xw32(CSR6, val);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700853
854 counter = 20;
855 while (counter > 0) {
856 if (!transmit_active(card))
857 break;
858 /* wait a while */
859 udelay(50);
860 counter--;
861 if (counter <= 0)
Joe Perches163ef0b2011-05-09 09:45:21 +0000862 netdev_err(card->dev,
863 "Transmitter failed to deactivate\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700864 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700865}
866
867
868/*
869enable_transmit_interrupt enables the transmit interrupt
870
871must be called with the lock held and interrupts disabled.
872*/
873static void enable_transmit_interrupt(struct xircom_private *card)
874{
Francois Romieuebaf7f82012-03-13 09:27:47 +0100875 void __iomem *ioaddr = card->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700876 unsigned int val;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700877
Francois Romieuebaf7f82012-03-13 09:27:47 +0100878 val = xr32(CSR7); /* Interrupt enable register */
879 val |= 1; /* enable the transmit interrupt */
880 xw32(CSR7, val);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700881}
882
883
884/*
885enable_receive_interrupt enables the receive interrupt
886
887must be called with the lock held and interrupts disabled.
888*/
889static void enable_receive_interrupt(struct xircom_private *card)
890{
Francois Romieuebaf7f82012-03-13 09:27:47 +0100891 void __iomem *ioaddr = card->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700892 unsigned int val;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700893
Francois Romieuebaf7f82012-03-13 09:27:47 +0100894 val = xr32(CSR7); /* Interrupt enable register */
895 val = val | (1 << 6); /* enable the receive interrupt */
896 xw32(CSR7, val);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700897}
898
899/*
900enable_link_interrupt enables the link status change interrupt
901
902must be called with the lock held and interrupts disabled.
903*/
904static void enable_link_interrupt(struct xircom_private *card)
905{
Francois Romieuebaf7f82012-03-13 09:27:47 +0100906 void __iomem *ioaddr = card->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700907 unsigned int val;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700908
Francois Romieuebaf7f82012-03-13 09:27:47 +0100909 val = xr32(CSR7); /* Interrupt enable register */
910 val = val | (1 << 27); /* enable the link status chage interrupt */
911 xw32(CSR7, val);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700912}
913
914
915
916/*
917disable_all_interrupts disables all interrupts
918
919must be called with the lock held and interrupts disabled.
920*/
921static void disable_all_interrupts(struct xircom_private *card)
922{
Francois Romieuebaf7f82012-03-13 09:27:47 +0100923 void __iomem *ioaddr = card->ioaddr;
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400924
Francois Romieuebaf7f82012-03-13 09:27:47 +0100925 xw32(CSR7, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700926}
927
928/*
929enable_common_interrupts enables several weird interrupts
930
931must be called with the lock held and interrupts disabled.
932*/
933static void enable_common_interrupts(struct xircom_private *card)
934{
Francois Romieuebaf7f82012-03-13 09:27:47 +0100935 void __iomem *ioaddr = card->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700936 unsigned int val;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700937
Francois Romieuebaf7f82012-03-13 09:27:47 +0100938 val = xr32(CSR7); /* Interrupt enable register */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700939 val |= (1<<16); /* Normal Interrupt Summary */
940 val |= (1<<15); /* Abnormal Interrupt Summary */
941 val |= (1<<13); /* Fatal bus error */
942 val |= (1<<8); /* Receive Process Stopped */
943 val |= (1<<7); /* Receive Buffer Unavailable */
944 val |= (1<<5); /* Transmit Underflow */
945 val |= (1<<2); /* Transmit Buffer Unavailable */
946 val |= (1<<1); /* Transmit Process Stopped */
Francois Romieuebaf7f82012-03-13 09:27:47 +0100947 xw32(CSR7, val);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700948}
949
950/*
951enable_promisc starts promisc mode
952
953must be called with the lock held and interrupts disabled.
954*/
955static int enable_promisc(struct xircom_private *card)
956{
Francois Romieuebaf7f82012-03-13 09:27:47 +0100957 void __iomem *ioaddr = card->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700958 unsigned int val;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700959
Francois Romieuebaf7f82012-03-13 09:27:47 +0100960 val = xr32(CSR6);
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400961 val = val | (1 << 6);
Francois Romieuebaf7f82012-03-13 09:27:47 +0100962 xw32(CSR6, val);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700963
Linus Torvalds1da177e2005-04-16 15:20:36 -0700964 return 1;
965}
966
967
968
969
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400970/*
Michael Opdenacker59c51592007-05-09 08:57:56 +0200971link_status() checks the links status and will return 0 for no link, 10 for 10mbit link and 100 for.. guess what.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700972
973Must be called in locked state with interrupts disabled
974*/
975static int link_status(struct xircom_private *card)
976{
Francois Romieuebaf7f82012-03-13 09:27:47 +0100977 void __iomem *ioaddr = card->ioaddr;
978 u8 val;
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400979
Francois Romieuebaf7f82012-03-13 09:27:47 +0100980 val = xr8(CSR12);
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400981
Francois Romieuebaf7f82012-03-13 09:27:47 +0100982 /* bit 2 is 0 for 10mbit link, 1 for not an 10mbit link */
983 if (!(val & (1 << 2)))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700984 return 10;
Francois Romieuebaf7f82012-03-13 09:27:47 +0100985 /* bit 1 is 0 for 100mbit link, 1 for not an 100mbit link */
986 if (!(val & (1 << 1)))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700987 return 100;
Jeff Garzikf3b197a2006-05-26 21:39:03 -0400988
989 /* If we get here -> no link at all */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700990
Linus Torvalds1da177e2005-04-16 15:20:36 -0700991 return 0;
992}
993
994
995
996
997
998/*
999 read_mac_address() reads the MAC address from the NIC and stores it in the "dev" structure.
Jeff Garzikf3b197a2006-05-26 21:39:03 -04001000
Linus Torvalds1da177e2005-04-16 15:20:36 -07001001 This function will take the spinlock itself and can, as a result, not be called with the lock helt.
1002 */
1003static void read_mac_address(struct xircom_private *card)
1004{
Francois Romieuebaf7f82012-03-13 09:27:47 +01001005 void __iomem *ioaddr = card->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001006 unsigned long flags;
Francois Romieuebaf7f82012-03-13 09:27:47 +01001007 u8 link;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001008 int i;
1009
Linus Torvalds1da177e2005-04-16 15:20:36 -07001010 spin_lock_irqsave(&card->lock, flags);
1011
Francois Romieuebaf7f82012-03-13 09:27:47 +01001012 xw32(CSR9, 1 << 12); /* enable boot rom access */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001013 for (i = 0x100; i < 0x1f7; i += link + 2) {
Francois Romieuebaf7f82012-03-13 09:27:47 +01001014 u8 tuple, data_id, data_count;
1015
1016 xw32(CSR10, i);
1017 tuple = xr32(CSR9);
1018 xw32(CSR10, i + 1);
1019 link = xr32(CSR9);
1020 xw32(CSR10, i + 2);
1021 data_id = xr32(CSR9);
1022 xw32(CSR10, i + 3);
1023 data_count = xr32(CSR9);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001024 if ((tuple == 0x22) && (data_id == 0x04) && (data_count == 0x06)) {
Francois Romieuebaf7f82012-03-13 09:27:47 +01001025 int j;
1026
Linus Torvalds1da177e2005-04-16 15:20:36 -07001027 for (j = 0; j < 6; j++) {
Francois Romieuebaf7f82012-03-13 09:27:47 +01001028 xw32(CSR10, i + j + 4);
1029 card->dev->dev_addr[j] = xr32(CSR9) & 0xff;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001030 }
1031 break;
1032 } else if (link == 0) {
1033 break;
1034 }
1035 }
1036 spin_unlock_irqrestore(&card->lock, flags);
Johannes Berge1749612008-10-27 15:59:26 -07001037 pr_debug(" %pM\n", card->dev->dev_addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001038}
1039
1040
1041/*
1042 transceiver_voodoo() enables the external UTP plug thingy.
1043 it's called voodoo as I stole this code and cannot cross-reference
1044 it with the specification.
1045 */
1046static void transceiver_voodoo(struct xircom_private *card)
1047{
Francois Romieuebaf7f82012-03-13 09:27:47 +01001048 void __iomem *ioaddr = card->ioaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001049 unsigned long flags;
1050
Linus Torvalds1da177e2005-04-16 15:20:36 -07001051 /* disable all powermanagement */
1052 pci_write_config_dword(card->pdev, PCI_POWERMGMT, 0x0000);
1053
1054 setup_descriptors(card);
1055
1056 spin_lock_irqsave(&card->lock, flags);
1057
Francois Romieuebaf7f82012-03-13 09:27:47 +01001058 xw32(CSR15, 0x0008);
1059 udelay(25);
1060 xw32(CSR15, 0xa8050000);
1061 udelay(25);
1062 xw32(CSR15, 0xa00f0000);
1063 udelay(25);
Jeff Garzikf3b197a2006-05-26 21:39:03 -04001064
Francois Romieuebaf7f82012-03-13 09:27:47 +01001065 spin_unlock_irqrestore(&card->lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001066
1067 netif_start_queue(card->dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001068}
1069
1070
1071static void xircom_up(struct xircom_private *card)
1072{
1073 unsigned long flags;
1074 int i;
1075
Linus Torvalds1da177e2005-04-16 15:20:36 -07001076 /* disable all powermanagement */
1077 pci_write_config_dword(card->pdev, PCI_POWERMGMT, 0x0000);
1078
1079 setup_descriptors(card);
1080
1081 spin_lock_irqsave(&card->lock, flags);
1082
Jeff Garzikf3b197a2006-05-26 21:39:03 -04001083
Linus Torvalds1da177e2005-04-16 15:20:36 -07001084 enable_link_interrupt(card);
1085 enable_transmit_interrupt(card);
1086 enable_receive_interrupt(card);
1087 enable_common_interrupts(card);
1088 enable_promisc(card);
Jeff Garzikf3b197a2006-05-26 21:39:03 -04001089
Linus Torvalds1da177e2005-04-16 15:20:36 -07001090 /* The card can have received packets already, read them away now */
Jeff Garzikf3b197a2006-05-26 21:39:03 -04001091 for (i=0;i<NUMDESCRIPTORS;i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001092 investigate_read_descriptor(card->dev,card,i,bufferoffsets[i]);
1093
1094
1095 spin_unlock_irqrestore(&card->lock, flags);
1096 trigger_receive(card);
1097 trigger_transmit(card);
1098 netif_start_queue(card->dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001099}
1100
1101/* Bufferoffset is in BYTES */
Joe Perches163ef0b2011-05-09 09:45:21 +00001102static void
1103investigate_read_descriptor(struct net_device *dev, struct xircom_private *card,
1104 int descnr, unsigned int bufferoffset)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001105{
Joe Perches163ef0b2011-05-09 09:45:21 +00001106 int status;
Jeff Garzikf3b197a2006-05-26 21:39:03 -04001107
Joe Perches163ef0b2011-05-09 09:45:21 +00001108 status = le32_to_cpu(card->rx_buffer[4*descnr]);
Jeff Garzikf3b197a2006-05-26 21:39:03 -04001109
Joe Perches163ef0b2011-05-09 09:45:21 +00001110 if (status > 0) { /* packet received */
Jeff Garzikf3b197a2006-05-26 21:39:03 -04001111
Joe Perches163ef0b2011-05-09 09:45:21 +00001112 /* TODO: discard error packets */
Jeff Garzikf3b197a2006-05-26 21:39:03 -04001113
Joe Perches163ef0b2011-05-09 09:45:21 +00001114 short pkt_len = ((status >> 16) & 0x7ff) - 4;
1115 /* minus 4, we don't want the CRC */
1116 struct sk_buff *skb;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001117
Joe Perches163ef0b2011-05-09 09:45:21 +00001118 if (pkt_len > 1518) {
1119 netdev_err(dev, "Packet length %i is bogus\n", pkt_len);
1120 pkt_len = 1518;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001121 }
Joe Perches163ef0b2011-05-09 09:45:21 +00001122
Pradeep A Dalvi21a4e462012-02-05 02:50:10 +00001123 skb = netdev_alloc_skb(dev, pkt_len + 2);
Joe Perches163ef0b2011-05-09 09:45:21 +00001124 if (skb == NULL) {
1125 dev->stats.rx_dropped++;
1126 goto out;
1127 }
1128 skb_reserve(skb, 2);
1129 skb_copy_to_linear_data(skb,
1130 &card->rx_buffer[bufferoffset / 4],
1131 pkt_len);
1132 skb_put(skb, pkt_len);
1133 skb->protocol = eth_type_trans(skb, dev);
1134 netif_rx(skb);
1135 dev->stats.rx_packets++;
1136 dev->stats.rx_bytes += pkt_len;
1137
1138out:
1139 /* give the buffer back to the card */
1140 card->rx_buffer[4*descnr] = cpu_to_le32(0x80000000);
1141 trigger_receive(card);
1142 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001143}
1144
1145
1146/* Bufferoffset is in BYTES */
Joe Perches163ef0b2011-05-09 09:45:21 +00001147static void
1148investigate_write_descriptor(struct net_device *dev,
1149 struct xircom_private *card,
1150 int descnr, unsigned int bufferoffset)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001151{
Joe Perches163ef0b2011-05-09 09:45:21 +00001152 int status;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001153
Joe Perches163ef0b2011-05-09 09:45:21 +00001154 status = le32_to_cpu(card->tx_buffer[4*descnr]);
Jeff Garzikf3b197a2006-05-26 21:39:03 -04001155#if 0
Joe Perches163ef0b2011-05-09 09:45:21 +00001156 if (status & 0x8000) { /* Major error */
1157 pr_err("Major transmit error status %x\n", status);
1158 card->tx_buffer[4*descnr] = 0;
1159 netif_wake_queue (dev);
1160 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001161#endif
Joe Perches163ef0b2011-05-09 09:45:21 +00001162 if (status > 0) { /* bit 31 is 0 when done */
1163 if (card->tx_skb[descnr]!=NULL) {
1164 dev->stats.tx_bytes += card->tx_skb[descnr]->len;
1165 dev_kfree_skb_irq(card->tx_skb[descnr]);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001166 }
Joe Perches163ef0b2011-05-09 09:45:21 +00001167 card->tx_skb[descnr] = NULL;
1168 /* Bit 8 in the status field is 1 if there was a collision */
1169 if (status & (1 << 8))
1170 dev->stats.collisions++;
1171 card->tx_buffer[4*descnr] = 0; /* descriptor is free again */
1172 netif_wake_queue (dev);
1173 dev->stats.tx_packets++;
1174 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001175}
1176
Linus Torvalds1da177e2005-04-16 15:20:36 -07001177static int __init xircom_init(void)
1178{
Alexey Dobriyanec42cdb2006-08-14 23:00:28 -07001179 return pci_register_driver(&xircom_ops);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001180}
1181
1182static void __exit xircom_exit(void)
1183{
1184 pci_unregister_driver(&xircom_ops);
Jeff Garzikf3b197a2006-05-26 21:39:03 -04001185}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001186
Jeff Garzikf3b197a2006-05-26 21:39:03 -04001187module_init(xircom_init)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001188module_exit(xircom_exit)
1189