ioc3-eth.c 41.8 KB
Newer Older
1 2
// SPDX-License-Identifier: GPL-2.0
/* Driver for SGI's IOC3 based Ethernet cards as found in the PCI card.
L
Linus Torvalds 已提交
3
 *
4
 * Copyright (C) 1999, 2000, 01, 03, 06 Ralf Baechle
L
Linus Torvalds 已提交
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
 * Copyright (C) 1995, 1999, 2000, 2001 by Silicon Graphics, Inc.
 *
 * References:
 *  o IOC3 ASIC specification 4.51, 1996-04-18
 *  o IEEE 802.3 specification, 2000 edition
 *  o DP38840A Specification, National Semiconductor, March 1997
 *
 * To do:
 *
 *  o Use prefetching for large packets.  What is a good lower limit for
 *    prefetching?
 *  o Use hardware checksums.
 *  o Convert to using a IOC3 meta driver.
 *  o Which PHYs might possibly be attached to the IOC3 in real live,
 *    which workarounds are required for them?  Do we ever have Lucent's?
 *  o For the 2.5 branch kill the mii-tool ioctls.
 */

#define IOC3_NAME	"ioc3-eth"
24
#define IOC3_VERSION	"2.6.3-4"
L
Linus Torvalds 已提交
25 26 27 28 29 30 31 32 33 34

#include <linux/delay.h>
#include <linux/kernel.h>
#include <linux/mm.h>
#include <linux/errno.h>
#include <linux/module.h>
#include <linux/pci.h>
#include <linux/crc32.h>
#include <linux/mii.h>
#include <linux/in.h>
35
#include <linux/io.h>
L
Linus Torvalds 已提交
36 37 38
#include <linux/ip.h>
#include <linux/tcp.h>
#include <linux/udp.h>
39
#include <linux/gfp.h>
L
Linus Torvalds 已提交
40 41

#ifdef CONFIG_SERIAL_8250
42 43
#include <linux/serial_core.h>
#include <linux/serial_8250.h>
R
Ralf Baechle 已提交
44
#include <linux/serial_reg.h>
L
Linus Torvalds 已提交
45 46 47 48 49 50
#endif

#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/ethtool.h>
#include <linux/skbuff.h>
51
#include <linux/dma-mapping.h>
52

L
Linus Torvalds 已提交
53 54 55 56
#include <net/ip.h>

#include <asm/byteorder.h>
#include <asm/pgtable.h>
57
#include <linux/uaccess.h>
L
Linus Torvalds 已提交
58 59 60 61
#include <asm/sn/types.h>
#include <asm/sn/ioc3.h>
#include <asm/pci/bridge.h>

62 63
/* Number of RX buffers.  This is tunable in the range of 16 <= x < 512.
 * The value must be a power of two.
L
Linus Torvalds 已提交
64
 */
65 66 67
#define RX_BUFFS		64
#define RX_RING_ENTRIES		512		/* fixed in hardware */
#define RX_RING_MASK		(RX_RING_ENTRIES - 1)
68
#define RX_RING_SIZE		(RX_RING_ENTRIES * sizeof(u64))
69 70 71 72

/* 128 TX buffers (not tunable) */
#define TX_RING_ENTRIES		128
#define TX_RING_MASK		(TX_RING_ENTRIES - 1)
73
#define TX_RING_SIZE		(TX_RING_ENTRIES * sizeof(struct ioc3_etxd))
L
Linus Torvalds 已提交
74

75 76 77 78 79 80 81
/* IOC3 does dma transfers in 128 byte blocks */
#define IOC3_DMA_XFER_LEN	128UL

/* Every RX buffer starts with 8 byte descriptor data */
#define RX_OFFSET		(sizeof(struct ioc3_erxbuf) + NET_IP_ALIGN)
#define RX_BUF_SIZE		(13 * IOC3_DMA_XFER_LEN)

82 83
#define ETCSR_FD   ((21 << ETCSR_IPGR2_SHIFT) | (21 << ETCSR_IPGR1_SHIFT) | 21)
#define ETCSR_HD   ((17 << ETCSR_IPGR2_SHIFT) | (11 << ETCSR_IPGR1_SHIFT) | 21)
L
Linus Torvalds 已提交
84 85 86

/* Private per NIC data of the driver.  */
struct ioc3_private {
87 88
	struct ioc3_ethregs *regs;
	struct ioc3 *all_regs;
89
	struct device *dma_dev;
90
	u32 *ssram;
L
Linus Torvalds 已提交
91 92
	unsigned long *rxr;		/* pointer to receiver ring */
	struct ioc3_etxd *txr;
93 94
	dma_addr_t rxr_dma;
	dma_addr_t txr_dma;
95 96
	struct sk_buff *rx_skbs[RX_RING_ENTRIES];
	struct sk_buff *tx_skbs[TX_RING_ENTRIES];
L
Linus Torvalds 已提交
97 98 99 100 101 102 103 104
	int rx_ci;			/* RX consumer index */
	int rx_pi;			/* RX producer index */
	int tx_ci;			/* TX consumer index */
	int tx_pi;			/* TX producer index */
	int txqlen;
	u32 emcr, ehar_h, ehar_l;
	spinlock_t ioc3_lock;
	struct mii_if_info mii;
105

106
	struct net_device *dev;
L
Linus Torvalds 已提交
107 108 109 110 111 112 113 114
	struct pci_dev *pdev;

	/* Members used by autonegotiation  */
	struct timer_list ioc3_timer;
};

static int ioc3_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
static void ioc3_set_multicast_list(struct net_device *dev);
115
static netdev_tx_t ioc3_start_xmit(struct sk_buff *skb, struct net_device *dev);
L
Linus Torvalds 已提交
116 117
static void ioc3_timeout(struct net_device *dev);
static inline unsigned int ioc3_hash(const unsigned char *addr);
118
static void ioc3_start(struct ioc3_private *ip);
L
Linus Torvalds 已提交
119 120
static inline void ioc3_stop(struct ioc3_private *ip);
static void ioc3_init(struct net_device *dev);
121
static int ioc3_alloc_rx_bufs(struct net_device *dev);
122 123
static void ioc3_free_rx_bufs(struct ioc3_private *ip);
static inline void ioc3_clean_tx_ring(struct ioc3_private *ip);
L
Linus Torvalds 已提交
124 125

static const char ioc3_str[] = "IOC3 Ethernet";
126
static const struct ethtool_ops ioc3_ethtool_ops;
L
Linus Torvalds 已提交
127 128 129 130


static inline unsigned long aligned_rx_skb_addr(unsigned long addr)
{
131
	return (~addr + 1) & (IOC3_DMA_XFER_LEN - 1UL);
L
Linus Torvalds 已提交
132 133
}

134 135
static inline int ioc3_alloc_skb(struct ioc3_private *ip, struct sk_buff **skb,
				 struct ioc3_erxbuf **rxb, dma_addr_t *rxb_dma)
L
Linus Torvalds 已提交
136
{
137
	struct sk_buff *new_skb;
138
	dma_addr_t d;
139
	int offset;
L
Linus Torvalds 已提交
140

141 142 143
	new_skb = alloc_skb(RX_BUF_SIZE + IOC3_DMA_XFER_LEN - 1, GFP_ATOMIC);
	if (!new_skb)
		return -ENOMEM;
144

145 146 147 148 149
	/* ensure buffer is aligned to IOC3_DMA_XFER_LEN */
	offset = aligned_rx_skb_addr((unsigned long)new_skb->data);
	if (offset)
		skb_reserve(new_skb, offset);

150 151 152 153 154 155 156 157
	d = dma_map_single(ip->dma_dev, new_skb->data,
			   RX_BUF_SIZE, DMA_FROM_DEVICE);

	if (dma_mapping_error(ip->dma_dev, d)) {
		dev_kfree_skb_any(new_skb);
		return -ENOMEM;
	}
	*rxb_dma = d;
158 159 160
	*rxb = (struct ioc3_erxbuf *)new_skb->data;
	skb_reserve(new_skb, RX_OFFSET);
	*skb = new_skb;
L
Linus Torvalds 已提交
161

162
	return 0;
L
Linus Torvalds 已提交
163 164
}

165 166
#ifdef CONFIG_PCI_XTALK_BRIDGE
static inline unsigned long ioc3_map(dma_addr_t addr, unsigned long attr)
L
Linus Torvalds 已提交
167
{
168 169
	return (addr & ~PCI64_ATTR_BAR) | attr;
}
L
Linus Torvalds 已提交
170

171
#define ERBAR_VAL	(ERBAR_BARRIER_BIT << ERBAR_RXBARR_SHIFT)
L
Linus Torvalds 已提交
172
#else
173 174 175
static inline unsigned long ioc3_map(dma_addr_t addr, unsigned long attr)
{
	return addr;
L
Linus Torvalds 已提交
176
}
177 178 179 180

#define ERBAR_VAL	0
#endif

L
Linus Torvalds 已提交
181 182 183 184 185 186 187
#define IOC3_SIZE 0x100000

static inline u32 mcr_pack(u32 pulse, u32 sample)
{
	return (pulse << 10) | (sample << 2);
}

188
static int nic_wait(u32 __iomem *mcr)
L
Linus Torvalds 已提交
189
{
190
	u32 m;
L
Linus Torvalds 已提交
191

192 193 194
	do {
		m = readl(mcr);
	} while (!(m & 2));
L
Linus Torvalds 已提交
195

196
	return m & 1;
L
Linus Torvalds 已提交
197 198
}

199
static int nic_reset(u32 __iomem *mcr)
L
Linus Torvalds 已提交
200
{
201
	int presence;
L
Linus Torvalds 已提交
202

203 204
	writel(mcr_pack(500, 65), mcr);
	presence = nic_wait(mcr);
L
Linus Torvalds 已提交
205

206 207
	writel(mcr_pack(0, 500), mcr);
	nic_wait(mcr);
L
Linus Torvalds 已提交
208

209
	return presence;
L
Linus Torvalds 已提交
210 211
}

212
static inline int nic_read_bit(u32 __iomem *mcr)
L
Linus Torvalds 已提交
213 214 215
{
	int result;

216 217 218 219
	writel(mcr_pack(6, 13), mcr);
	result = nic_wait(mcr);
	writel(mcr_pack(0, 100), mcr);
	nic_wait(mcr);
L
Linus Torvalds 已提交
220 221 222 223

	return result;
}

224
static inline void nic_write_bit(u32 __iomem *mcr, int bit)
L
Linus Torvalds 已提交
225 226
{
	if (bit)
227
		writel(mcr_pack(6, 110), mcr);
L
Linus Torvalds 已提交
228
	else
229
		writel(mcr_pack(80, 30), mcr);
L
Linus Torvalds 已提交
230

231
	nic_wait(mcr);
L
Linus Torvalds 已提交
232 233
}

234
/* Read a byte from an iButton device
L
Linus Torvalds 已提交
235
 */
236
static u32 nic_read_byte(u32 __iomem *mcr)
L
Linus Torvalds 已提交
237 238 239 240 241
{
	u32 result = 0;
	int i;

	for (i = 0; i < 8; i++)
242
		result = (result >> 1) | (nic_read_bit(mcr) << 7);
L
Linus Torvalds 已提交
243 244 245 246

	return result;
}

247
/* Write a byte to an iButton device
L
Linus Torvalds 已提交
248
 */
249
static void nic_write_byte(u32 __iomem *mcr, int byte)
L
Linus Torvalds 已提交
250 251 252 253 254 255 256
{
	int i, bit;

	for (i = 8; i; i--) {
		bit = byte & 1;
		byte >>= 1;

257
		nic_write_bit(mcr, bit);
L
Linus Torvalds 已提交
258 259 260
	}
}

261
static u64 nic_find(u32 __iomem *mcr, int *last)
L
Linus Torvalds 已提交
262 263 264 265
{
	int a, b, index, disc;
	u64 address = 0;

266
	nic_reset(mcr);
L
Linus Torvalds 已提交
267
	/* Search ROM.  */
268
	nic_write_byte(mcr, 0xf0);
L
Linus Torvalds 已提交
269 270 271

	/* Algorithm from ``Book of iButton Standards''.  */
	for (index = 0, disc = 0; index < 64; index++) {
272 273
		a = nic_read_bit(mcr);
		b = nic_read_bit(mcr);
L
Linus Torvalds 已提交
274 275

		if (a && b) {
276
			pr_warn("NIC search failed (not fatal).\n");
L
Linus Torvalds 已提交
277 278 279 280 281 282 283 284 285 286
			*last = 0;
			return 0;
		}

		if (!a && !b) {
			if (index == *last) {
				address |= 1UL << index;
			} else if (index > *last) {
				address &= ~(1UL << index);
				disc = index;
287
			} else if ((address & (1UL << index)) == 0) {
L
Linus Torvalds 已提交
288
				disc = index;
289
			}
290
			nic_write_bit(mcr, address & (1UL << index));
L
Linus Torvalds 已提交
291 292 293 294 295 296
			continue;
		} else {
			if (a)
				address |= 1UL << index;
			else
				address &= ~(1UL << index);
297
			nic_write_bit(mcr, a);
L
Linus Torvalds 已提交
298 299 300 301 302 303 304 305 306
			continue;
		}
	}

	*last = disc;

	return address;
}

307
static int nic_init(u32 __iomem *mcr)
L
Linus Torvalds 已提交
308
{
309 310
	const char *unknown = "unknown";
	const char *type = unknown;
L
Linus Torvalds 已提交
311 312 313 314 315 316
	u8 crc;
	u8 serial[6];
	int save = 0, i;

	while (1) {
		u64 reg;
317

318
		reg = nic_find(mcr, &save);
L
Linus Torvalds 已提交
319 320 321 322 323 324 325 326 327 328 329 330 331

		switch (reg & 0xff) {
		case 0x91:
			type = "DS1981U";
			break;
		default:
			if (save == 0) {
				/* Let the caller try again.  */
				return -1;
			}
			continue;
		}

332
		nic_reset(mcr);
L
Linus Torvalds 已提交
333 334

		/* Match ROM.  */
335
		nic_write_byte(mcr, 0x55);
L
Linus Torvalds 已提交
336
		for (i = 0; i < 8; i++)
337
			nic_write_byte(mcr, (reg >> (i << 3)) & 0xff);
L
Linus Torvalds 已提交
338 339 340 341 342 343 344 345 346 347

		reg >>= 8; /* Shift out type.  */
		for (i = 0; i < 6; i++) {
			serial[i] = reg & 0xff;
			reg >>= 8;
		}
		crc = reg & 0xff;
		break;
	}

348
	pr_info("Found %s NIC", type);
J
Johannes Berg 已提交
349
	if (type != unknown)
350 351
		pr_cont(" registration number %pM, CRC %02x", serial, crc);
	pr_cont(".\n");
L
Linus Torvalds 已提交
352 353 354 355

	return 0;
}

356
/* Read the NIC (Number-In-a-Can) device used to store the MAC address on
L
Linus Torvalds 已提交
357 358 359 360
 * SN0 / SN00 nodeboards and PCI cards.
 */
static void ioc3_get_eaddr_nic(struct ioc3_private *ip)
{
361
	u32 __iomem *mcr = &ip->all_regs->mcr;
L
Linus Torvalds 已提交
362
	int tries = 2; /* There may be some problem with the battery?  */
363
	u8 nic[14];
L
Linus Torvalds 已提交
364 365
	int i;

366
	writel(1 << 21, &ip->all_regs->gpcr_s);
L
Linus Torvalds 已提交
367 368

	while (tries--) {
369
		if (!nic_init(mcr))
L
Linus Torvalds 已提交
370 371 372 373 374
			break;
		udelay(500);
	}

	if (tries < 0) {
375
		pr_err("Failed to read MAC address\n");
L
Linus Torvalds 已提交
376 377 378 379
		return;
	}

	/* Read Memory.  */
380 381 382
	nic_write_byte(mcr, 0xf0);
	nic_write_byte(mcr, 0x00);
	nic_write_byte(mcr, 0x00);
L
Linus Torvalds 已提交
383 384

	for (i = 13; i >= 0; i--)
385
		nic[i] = nic_read_byte(mcr);
L
Linus Torvalds 已提交
386 387

	for (i = 2; i < 8; i++)
388
		ip->dev->dev_addr[i - 2] = nic[i];
L
Linus Torvalds 已提交
389 390
}

391
/* Ok, this is hosed by design.  It's necessary to know what machine the
L
Linus Torvalds 已提交
392 393 394 395 396 397 398
 * NIC is in in order to know how to read the NIC address.  We also have
 * to know if it's a PCI card or a NIC in on the node board ...
 */
static void ioc3_get_eaddr(struct ioc3_private *ip)
{
	ioc3_get_eaddr_nic(ip);

399
	pr_info("Ethernet address is %pM.\n", ip->dev->dev_addr);
L
Linus Torvalds 已提交
400 401 402 403 404 405
}

static void __ioc3_set_mac_address(struct net_device *dev)
{
	struct ioc3_private *ip = netdev_priv(dev);

406 407 408 409 410 411 412 413
	writel((dev->dev_addr[5] <<  8) |
	       dev->dev_addr[4],
	       &ip->regs->emar_h);
	writel((dev->dev_addr[3] << 24) |
	       (dev->dev_addr[2] << 16) |
	       (dev->dev_addr[1] <<  8) |
	       dev->dev_addr[0],
	       &ip->regs->emar_l);
L
Linus Torvalds 已提交
414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429
}

static int ioc3_set_mac_address(struct net_device *dev, void *addr)
{
	struct ioc3_private *ip = netdev_priv(dev);
	struct sockaddr *sa = addr;

	memcpy(dev->dev_addr, sa->sa_data, dev->addr_len);

	spin_lock_irq(&ip->ioc3_lock);
	__ioc3_set_mac_address(dev);
	spin_unlock_irq(&ip->ioc3_lock);

	return 0;
}

430
/* Caller must hold the ioc3_lock ever for MII readers.  This is also
L
Linus Torvalds 已提交
431 432 433 434 435
 * used to protect the transmitter side but it's low contention.
 */
static int ioc3_mdio_read(struct net_device *dev, int phy, int reg)
{
	struct ioc3_private *ip = netdev_priv(dev);
436
	struct ioc3_ethregs *regs = ip->regs;
L
Linus Torvalds 已提交
437

438 439 440 441 442 443
	while (readl(&regs->micr) & MICR_BUSY)
		;
	writel((phy << MICR_PHYADDR_SHIFT) | reg | MICR_READTRIG,
	       &regs->micr);
	while (readl(&regs->micr) & MICR_BUSY)
		;
L
Linus Torvalds 已提交
444

445
	return readl(&regs->midr_r) & MIDR_DATA_MASK;
L
Linus Torvalds 已提交
446 447 448 449 450
}

static void ioc3_mdio_write(struct net_device *dev, int phy, int reg, int data)
{
	struct ioc3_private *ip = netdev_priv(dev);
451 452 453 454 455 456 457 458
	struct ioc3_ethregs *regs = ip->regs;

	while (readl(&regs->micr) & MICR_BUSY)
		;
	writel(data, &regs->midr_w);
	writel((phy << MICR_PHYADDR_SHIFT) | reg, &regs->micr);
	while (readl(&regs->micr) & MICR_BUSY)
		;
L
Linus Torvalds 已提交
459 460 461 462 463 464 465
}

static int ioc3_mii_init(struct ioc3_private *ip);

static struct net_device_stats *ioc3_get_stats(struct net_device *dev)
{
	struct ioc3_private *ip = netdev_priv(dev);
466
	struct ioc3_ethregs *regs = ip->regs;
L
Linus Torvalds 已提交
467

468
	dev->stats.collisions += readl(&regs->etcdc) & ETCDC_COLLCNT_MASK;
469
	return &dev->stats;
L
Linus Torvalds 已提交
470 471
}

472
static void ioc3_tcpudp_checksum(struct sk_buff *skb, u32 hwsum, int len)
L
Linus Torvalds 已提交
473 474 475 476
{
	struct ethhdr *eh = eth_hdr(skb);
	unsigned int proto;
	unsigned char *cp;
477 478 479
	struct iphdr *ih;
	u32 csum, ehsum;
	u16 *ew;
L
Linus Torvalds 已提交
480

481
	/* Did hardware handle the checksum at all?  The cases we can handle
L
Linus Torvalds 已提交
482 483 484 485 486 487 488 489 490 491 492 493
	 * are:
	 *
	 * - TCP and UDP checksums of IPv4 only.
	 * - IPv6 would be doable but we keep that for later ...
	 * - Only unfragmented packets.  Did somebody already tell you
	 *   fragmentation is evil?
	 * - don't care about packet size.  Worst case when processing a
	 *   malformed packet we'll try to access the packet at ip header +
	 *   64 bytes which is still inside the skb.  Even in the unlikely
	 *   case where the checksum is right the higher layers will still
	 *   drop the packet as appropriate.
	 */
E
Eric Dumazet 已提交
494
	if (eh->h_proto != htons(ETH_P_IP))
L
Linus Torvalds 已提交
495 496
		return;

497
	ih = (struct iphdr *)((char *)eh + ETH_HLEN);
498
	if (ip_is_fragment(ih))
L
Linus Torvalds 已提交
499 500 501 502 503 504 505 506 507
		return;

	proto = ih->protocol;
	if (proto != IPPROTO_TCP && proto != IPPROTO_UDP)
		return;

	/* Same as tx - compute csum of pseudo header  */
	csum = hwsum +
	       (ih->tot_len - (ih->ihl << 2)) +
508
	       htons((u16)ih->protocol) +
L
Linus Torvalds 已提交
509 510 511 512
	       (ih->saddr >> 16) + (ih->saddr & 0xffff) +
	       (ih->daddr >> 16) + (ih->daddr & 0xffff);

	/* Sum up ethernet dest addr, src addr and protocol  */
513
	ew = (u16 *)eh;
L
Linus Torvalds 已提交
514 515 516 517 518 519 520 521
	ehsum = ew[0] + ew[1] + ew[2] + ew[3] + ew[4] + ew[5] + ew[6];

	ehsum = (ehsum & 0xffff) + (ehsum >> 16);
	ehsum = (ehsum & 0xffff) + (ehsum >> 16);

	csum += 0xffff ^ ehsum;

	/* In the next step we also subtract the 1's complement
522 523
	 * checksum of the trailing ethernet CRC.
	 */
L
Linus Torvalds 已提交
524 525
	cp = (char *)eh + len;	/* points at trailing CRC */
	if (len & 1) {
526 527
		csum += 0xffff ^ (u16)((cp[1] << 8) | cp[0]);
		csum += 0xffff ^ (u16)((cp[3] << 8) | cp[2]);
L
Linus Torvalds 已提交
528
	} else {
529 530
		csum += 0xffff ^ (u16)((cp[0] << 8) | cp[1]);
		csum += 0xffff ^ (u16)((cp[2] << 8) | cp[3]);
L
Linus Torvalds 已提交
531 532 533 534 535 536 537 538 539
	}

	csum = (csum & 0xffff) + (csum >> 16);
	csum = (csum & 0xffff) + (csum >> 16);

	if (csum == 0xffff)
		skb->ip_summed = CHECKSUM_UNNECESSARY;
}

540
static inline void ioc3_rx(struct net_device *dev)
L
Linus Torvalds 已提交
541
{
542
	struct ioc3_private *ip = netdev_priv(dev);
L
Linus Torvalds 已提交
543 544 545 546
	struct sk_buff *skb, *new_skb;
	int rx_entry, n_entry, len;
	struct ioc3_erxbuf *rxb;
	unsigned long *rxr;
547
	dma_addr_t d;
L
Linus Torvalds 已提交
548 549
	u32 w0, err;

550
	rxr = ip->rxr;		/* Ring base */
L
Linus Torvalds 已提交
551 552 553 554
	rx_entry = ip->rx_ci;				/* RX consume index */
	n_entry = ip->rx_pi;

	skb = ip->rx_skbs[rx_entry];
555
	rxb = (struct ioc3_erxbuf *)(skb->data - RX_OFFSET);
L
Linus Torvalds 已提交
556 557 558 559 560 561
	w0 = be32_to_cpu(rxb->w0);

	while (w0 & ERXBUF_V) {
		err = be32_to_cpu(rxb->err);		/* It's valid ...  */
		if (err & ERXBUF_GOODPKT) {
			len = ((w0 >> ERXBUF_BYTECNT_SHIFT) & 0x7ff) - 4;
562
			skb_put(skb, len);
563
			skb->protocol = eth_type_trans(skb, dev);
L
Linus Torvalds 已提交
564

565
			if (ioc3_alloc_skb(ip, &new_skb, &rxb, &d)) {
L
Linus Torvalds 已提交
566
				/* Ouch, drop packet and just recycle packet
567 568
				 * to keep the ring filled.
				 */
569
				dev->stats.rx_dropped++;
L
Linus Torvalds 已提交
570
				new_skb = skb;
571
				d = rxr[rx_entry];
L
Linus Torvalds 已提交
572 573 574
				goto next;
			}

575
			if (likely(dev->features & NETIF_F_RXCSUM))
576
				ioc3_tcpudp_checksum(skb,
577 578
						     w0 & ERXBUF_IPCKSUM_MASK,
						     len);
L
Linus Torvalds 已提交
579

580 581 582
			dma_unmap_single(ip->dma_dev, rxr[rx_entry],
					 RX_BUF_SIZE, DMA_FROM_DEVICE);

L
Linus Torvalds 已提交
583 584 585 586
			netif_rx(skb);

			ip->rx_skbs[rx_entry] = NULL;	/* Poison  */

587 588
			dev->stats.rx_packets++;		/* Statistics */
			dev->stats.rx_bytes += len;
L
Linus Torvalds 已提交
589
		} else {
590
			/* The frame is invalid and the skb never
591 592 593
			 * reached the network layer so we can just
			 * recycle it.
			 */
594
			new_skb = skb;
595
			d = rxr[rx_entry];
596
			dev->stats.rx_errors++;
L
Linus Torvalds 已提交
597 598
		}
		if (err & ERXBUF_CRCERR)	/* Statistics */
599
			dev->stats.rx_crc_errors++;
L
Linus Torvalds 已提交
600
		if (err & ERXBUF_FRAMERR)
601
			dev->stats.rx_frame_errors++;
602

L
Linus Torvalds 已提交
603 604
next:
		ip->rx_skbs[n_entry] = new_skb;
605
		rxr[n_entry] = cpu_to_be64(ioc3_map(d, PCI64_ATTR_BAR));
L
Linus Torvalds 已提交
606
		rxb->w0 = 0;				/* Clear valid flag */
607
		n_entry = (n_entry + 1) & RX_RING_MASK;	/* Update erpir */
L
Linus Torvalds 已提交
608 609

		/* Now go on to the next ring entry.  */
610
		rx_entry = (rx_entry + 1) & RX_RING_MASK;
L
Linus Torvalds 已提交
611
		skb = ip->rx_skbs[rx_entry];
612
		rxb = (struct ioc3_erxbuf *)(skb->data - RX_OFFSET);
L
Linus Torvalds 已提交
613 614
		w0 = be32_to_cpu(rxb->w0);
	}
615
	writel((n_entry << 3) | ERPIR_ARM, &ip->regs->erpir);
L
Linus Torvalds 已提交
616 617 618 619
	ip->rx_pi = n_entry;
	ip->rx_ci = rx_entry;
}

620
static inline void ioc3_tx(struct net_device *dev)
L
Linus Torvalds 已提交
621
{
622
	struct ioc3_private *ip = netdev_priv(dev);
623
	struct ioc3_ethregs *regs = ip->regs;
L
Linus Torvalds 已提交
624 625 626 627 628 629
	unsigned long packets, bytes;
	int tx_entry, o_entry;
	struct sk_buff *skb;
	u32 etcir;

	spin_lock(&ip->ioc3_lock);
630
	etcir = readl(&regs->etcir);
L
Linus Torvalds 已提交
631

632
	tx_entry = (etcir >> 7) & TX_RING_MASK;
L
Linus Torvalds 已提交
633 634 635 636 637 638 639 640
	o_entry = ip->tx_ci;
	packets = 0;
	bytes = 0;

	while (o_entry != tx_entry) {
		packets++;
		skb = ip->tx_skbs[o_entry];
		bytes += skb->len;
641
		dev_consume_skb_irq(skb);
L
Linus Torvalds 已提交
642 643
		ip->tx_skbs[o_entry] = NULL;

644
		o_entry = (o_entry + 1) & TX_RING_MASK;	/* Next */
L
Linus Torvalds 已提交
645

646
		etcir = readl(&regs->etcir);		/* More pkts sent?  */
647
		tx_entry = (etcir >> 7) & TX_RING_MASK;
L
Linus Torvalds 已提交
648 649
	}

650 651
	dev->stats.tx_packets += packets;
	dev->stats.tx_bytes += bytes;
L
Linus Torvalds 已提交
652 653
	ip->txqlen -= packets;

654
	if (netif_queue_stopped(dev) && ip->txqlen < TX_RING_ENTRIES)
655
		netif_wake_queue(dev);
L
Linus Torvalds 已提交
656 657 658 659 660

	ip->tx_ci = o_entry;
	spin_unlock(&ip->ioc3_lock);
}

661
/* Deal with fatal IOC3 errors.  This condition might be caused by a hard or
L
Linus Torvalds 已提交
662 663 664 665 666
 * software problems, so we should try to recover
 * more gracefully if this ever happens.  In theory we might be flooded
 * with such error interrupts if something really goes wrong, so we might
 * also consider to take the interface down.
 */
667
static void ioc3_error(struct net_device *dev, u32 eisr)
L
Linus Torvalds 已提交
668
{
669
	struct ioc3_private *ip = netdev_priv(dev);
L
Linus Torvalds 已提交
670 671 672 673

	spin_lock(&ip->ioc3_lock);

	if (eisr & EISR_RXOFLO)
674
		net_err_ratelimited("%s: RX overflow.\n", dev->name);
L
Linus Torvalds 已提交
675
	if (eisr & EISR_RXBUFOFLO)
676
		net_err_ratelimited("%s: RX buffer overflow.\n", dev->name);
L
Linus Torvalds 已提交
677
	if (eisr & EISR_RXMEMERR)
678
		net_err_ratelimited("%s: RX PCI error.\n", dev->name);
L
Linus Torvalds 已提交
679
	if (eisr & EISR_RXPARERR)
680
		net_err_ratelimited("%s: RX SSRAM parity error.\n", dev->name);
L
Linus Torvalds 已提交
681
	if (eisr & EISR_TXBUFUFLO)
682
		net_err_ratelimited("%s: TX buffer underflow.\n", dev->name);
L
Linus Torvalds 已提交
683
	if (eisr & EISR_TXMEMERR)
684
		net_err_ratelimited("%s: TX PCI error.\n", dev->name);
L
Linus Torvalds 已提交
685 686

	ioc3_stop(ip);
687 688 689
	ioc3_free_rx_bufs(ip);
	ioc3_clean_tx_ring(ip);

L
Linus Torvalds 已提交
690
	ioc3_init(dev);
691 692 693 694 695
	if (ioc3_alloc_rx_bufs(dev)) {
		netdev_err(dev, "%s: rx buffer allocation failed\n", __func__);
		spin_unlock(&ip->ioc3_lock);
		return;
	}
696
	ioc3_start(ip);
L
Linus Torvalds 已提交
697 698 699 700 701 702 703 704
	ioc3_mii_init(ip);

	netif_wake_queue(dev);

	spin_unlock(&ip->ioc3_lock);
}

/* The interrupt handler does all of the Rx thread work and cleans up
705 706
 * after the Tx thread.
 */
707
static irqreturn_t ioc3_interrupt(int irq, void *dev_id)
L
Linus Torvalds 已提交
708
{
709 710
	struct ioc3_private *ip = netdev_priv(dev_id);
	struct ioc3_ethregs *regs = ip->regs;
L
Linus Torvalds 已提交
711 712
	u32 eisr;

713 714 715
	eisr = readl(&regs->eisr);
	writel(eisr, &regs->eisr);
	readl(&regs->eisr);				/* Flush */
L
Linus Torvalds 已提交
716 717

	if (eisr & (EISR_RXOFLO | EISR_RXBUFOFLO | EISR_RXMEMERR |
718
		    EISR_RXPARERR | EISR_TXBUFUFLO | EISR_TXMEMERR))
719
		ioc3_error(dev_id, eisr);
L
Linus Torvalds 已提交
720
	if (eisr & EISR_RXTIMERINT)
721
		ioc3_rx(dev_id);
L
Linus Torvalds 已提交
722
	if (eisr & EISR_TXEXPLICIT)
723
		ioc3_tx(dev_id);
L
Linus Torvalds 已提交
724 725 726 727 728 729

	return IRQ_HANDLED;
}

static inline void ioc3_setup_duplex(struct ioc3_private *ip)
{
730
	struct ioc3_ethregs *regs = ip->regs;
L
Linus Torvalds 已提交
731

732 733
	spin_lock_irq(&ip->ioc3_lock);

L
Linus Torvalds 已提交
734
	if (ip->mii.full_duplex) {
735
		writel(ETCSR_FD, &regs->etcsr);
L
Linus Torvalds 已提交
736 737
		ip->emcr |= EMCR_DUPLEX;
	} else {
738
		writel(ETCSR_HD, &regs->etcsr);
L
Linus Torvalds 已提交
739 740
		ip->emcr &= ~EMCR_DUPLEX;
	}
741
	writel(ip->emcr, &regs->emcr);
742 743

	spin_unlock_irq(&ip->ioc3_lock);
L
Linus Torvalds 已提交
744 745
}

746
static void ioc3_timer(struct timer_list *t)
L
Linus Torvalds 已提交
747
{
748
	struct ioc3_private *ip = from_timer(ip, t, ioc3_timer);
L
Linus Torvalds 已提交
749 750 751 752 753

	/* Print the link status if it has changed */
	mii_check_media(&ip->mii, 1, 0);
	ioc3_setup_duplex(ip);

754
	ip->ioc3_timer.expires = jiffies + ((12 * HZ) / 10); /* 1.2s */
L
Linus Torvalds 已提交
755 756 757
	add_timer(&ip->ioc3_timer);
}

758
/* Try to find a PHY.  There is no apparent relation between the MII addresses
L
Linus Torvalds 已提交
759 760 761 762 763 764 765 766 767
 * in the SGI documentation and what we find in reality, so we simply probe
 * for the PHY.  It seems IOC3 PHYs usually live on address 31.  One of my
 * onboard IOC3s has the special oddity that probing doesn't seem to find it
 * yet the interface seems to work fine, so if probing fails we for now will
 * simply default to PHY 31 instead of bailing out.
 */
static int ioc3_mii_init(struct ioc3_private *ip)
{
	int ioc3_phy_workaround = 1;
768
	int i, found = 0, res = 0;
L
Linus Torvalds 已提交
769 770 771
	u16 word;

	for (i = 0; i < 32; i++) {
772
		word = ioc3_mdio_read(ip->dev, i, MII_PHYSID1);
L
Linus Torvalds 已提交
773 774 775 776 777 778 779 780

		if (word != 0xffff && word != 0x0000) {
			found = 1;
			break;			/* Found a PHY		*/
		}
	}

	if (!found) {
781
		if (ioc3_phy_workaround) {
L
Linus Torvalds 已提交
782
			i = 31;
783
		} else {
L
Linus Torvalds 已提交
784 785 786 787 788 789 790
			ip->mii.phy_id = -1;
			res = -ENODEV;
			goto out;
		}
	}

	ip->mii.phy_id = i;
R
Ralf Baechle 已提交
791 792 793 794 795 796 797

out:
	return res;
}

static void ioc3_mii_start(struct ioc3_private *ip)
{
798
	ip->ioc3_timer.expires = jiffies + (12 * HZ) / 10;  /* 1.2 sec. */
L
Linus Torvalds 已提交
799 800 801
	add_timer(&ip->ioc3_timer);
}

802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821
static inline void ioc3_tx_unmap(struct ioc3_private *ip, int entry)
{
	struct ioc3_etxd *desc;
	u32 cmd, bufcnt, len;

	desc = &ip->txr[entry];
	cmd = be32_to_cpu(desc->cmd);
	bufcnt = be32_to_cpu(desc->bufcnt);
	if (cmd & ETXD_B1V) {
		len = (bufcnt & ETXD_B1CNT_MASK) >> ETXD_B1CNT_SHIFT;
		dma_unmap_single(ip->dma_dev, be64_to_cpu(desc->p1),
				 len, DMA_TO_DEVICE);
	}
	if (cmd & ETXD_B2V) {
		len = (bufcnt & ETXD_B2CNT_MASK) >> ETXD_B2CNT_SHIFT;
		dma_unmap_single(ip->dma_dev, be64_to_cpu(desc->p2),
				 len, DMA_TO_DEVICE);
	}
}

L
Linus Torvalds 已提交
822 823 824 825 826
static inline void ioc3_clean_tx_ring(struct ioc3_private *ip)
{
	struct sk_buff *skb;
	int i;

827
	for (i = 0; i < TX_RING_ENTRIES; i++) {
L
Linus Torvalds 已提交
828 829
		skb = ip->tx_skbs[i];
		if (skb) {
830
			ioc3_tx_unmap(ip, i);
L
Linus Torvalds 已提交
831 832 833 834 835 836 837 838 839
			ip->tx_skbs[i] = NULL;
			dev_kfree_skb_any(skb);
		}
		ip->txr[i].cmd = 0;
	}
	ip->tx_pi = 0;
	ip->tx_ci = 0;
}

840
static void ioc3_free_rx_bufs(struct ioc3_private *ip)
L
Linus Torvalds 已提交
841 842
{
	int rx_entry, n_entry;
843
	struct sk_buff *skb;
L
Linus Torvalds 已提交
844

845 846
	n_entry = ip->rx_ci;
	rx_entry = ip->rx_pi;
L
Linus Torvalds 已提交
847

848
	while (n_entry != rx_entry) {
849 850 851 852 853 854 855
		skb = ip->rx_skbs[n_entry];
		if (skb) {
			dma_unmap_single(ip->dma_dev,
					 be64_to_cpu(ip->rxr[n_entry]),
					 RX_BUF_SIZE, DMA_FROM_DEVICE);
			dev_kfree_skb_any(skb);
		}
856
		n_entry = (n_entry + 1) & RX_RING_MASK;
L
Linus Torvalds 已提交
857 858 859
	}
}

860
static int ioc3_alloc_rx_bufs(struct net_device *dev)
L
Linus Torvalds 已提交
861 862 863
{
	struct ioc3_private *ip = netdev_priv(dev);
	struct ioc3_erxbuf *rxb;
864
	dma_addr_t d;
L
Linus Torvalds 已提交
865 866
	int i;

867 868 869 870 871
	/* Now the rx buffers.  The RX ring may be larger but
	 * we only allocate 16 buffers for now.  Need to tune
	 * this for performance and memory later.
	 */
	for (i = 0; i < RX_BUFFS; i++) {
872
		if (ioc3_alloc_skb(ip, &ip->rx_skbs[i], &rxb, &d))
873
			return -ENOMEM;
874

875
		rxb->w0 = 0;	/* Clear valid flag */
876
		ip->rxr[i] = cpu_to_be64(ioc3_map(d, PCI64_ATTR_BAR));
L
Linus Torvalds 已提交
877
	}
878 879
	ip->rx_ci = 0;
	ip->rx_pi = RX_BUFFS;
880 881

	return 0;
L
Linus Torvalds 已提交
882 883 884 885
}

static inline void ioc3_ssram_disc(struct ioc3_private *ip)
{
886 887 888 889
	struct ioc3_ethregs *regs = ip->regs;
	u32 *ssram0 = &ip->ssram[0x0000];
	u32 *ssram1 = &ip->ssram[0x4000];
	u32 pattern = 0x5555;
L
Linus Torvalds 已提交
890 891

	/* Assume the larger size SSRAM and enable parity checking */
892 893
	writel(readl(&regs->emcr) | (EMCR_BUFSIZ | EMCR_RAMPAR), &regs->emcr);
	readl(&regs->emcr); /* Flush */
L
Linus Torvalds 已提交
894

895 896
	writel(pattern, ssram0);
	writel(~pattern & IOC3_SSRAM_DM, ssram1);
L
Linus Torvalds 已提交
897

898 899
	if ((readl(ssram0) & IOC3_SSRAM_DM) != pattern ||
	    (readl(ssram1) & IOC3_SSRAM_DM) != (~pattern & IOC3_SSRAM_DM)) {
L
Linus Torvalds 已提交
900
		/* set ssram size to 64 KB */
901 902 903 904 905
		ip->emcr |= EMCR_RAMPAR;
		writel(readl(&regs->emcr) & ~EMCR_BUFSIZ, &regs->emcr);
	} else {
		ip->emcr |= EMCR_BUFSIZ | EMCR_RAMPAR;
	}
L
Linus Torvalds 已提交
906 907 908 909 910
}

static void ioc3_init(struct net_device *dev)
{
	struct ioc3_private *ip = netdev_priv(dev);
911
	struct ioc3_ethregs *regs = ip->regs;
L
Linus Torvalds 已提交
912

R
Ralf Baechle 已提交
913
	del_timer_sync(&ip->ioc3_timer);	/* Kill if running	*/
L
Linus Torvalds 已提交
914

915 916
	writel(EMCR_RST, &regs->emcr);		/* Reset		*/
	readl(&regs->emcr);			/* Flush WB		*/
L
Linus Torvalds 已提交
917
	udelay(4);				/* Give it time ...	*/
918 919
	writel(0, &regs->emcr);
	readl(&regs->emcr);
L
Linus Torvalds 已提交
920 921

	/* Misc registers  */
922
	writel(ERBAR_VAL, &regs->erbar);
923 924 925
	readl(&regs->etcdc);			/* Clear on read */
	writel(15, &regs->ercsr);		/* RX low watermark  */
	writel(0, &regs->ertr);			/* Interrupt immediately */
L
Linus Torvalds 已提交
926
	__ioc3_set_mac_address(dev);
927 928 929
	writel(ip->ehar_h, &regs->ehar_h);
	writel(ip->ehar_l, &regs->ehar_l);
	writel(42, &regs->ersr);		/* XXX should be random */
930 931 932 933 934 935 936 937
}

static void ioc3_start(struct ioc3_private *ip)
{
	struct ioc3_ethregs *regs = ip->regs;
	unsigned long ring;

	/* Now the rx ring base, consume & produce registers.  */
938
	ring = ioc3_map(ip->rxr_dma, PCI64_ATTR_PREC);
939 940 941 942 943
	writel(ring >> 32, &regs->erbr_h);
	writel(ring & 0xffffffff, &regs->erbr_l);
	writel(ip->rx_ci << 3, &regs->ercir);
	writel((ip->rx_pi << 3) | ERPIR_ARM, &regs->erpir);

944
	ring = ioc3_map(ip->txr_dma, PCI64_ATTR_PREC);
945 946 947 948 949 950 951 952 953

	ip->txqlen = 0;					/* nothing queued  */

	/* Now the tx ring base, consume & produce registers.  */
	writel(ring >> 32, &regs->etbr_h);
	writel(ring & 0xffffffff, &regs->etbr_l);
	writel(ip->tx_pi << 7, &regs->etpir);
	writel(ip->tx_ci << 7, &regs->etcir);
	readl(&regs->etcir);				/* Flush */
L
Linus Torvalds 已提交
954 955

	ip->emcr |= ((RX_OFFSET / 2) << EMCR_RXOFF_SHIFT) | EMCR_TXDMAEN |
956
		    EMCR_TXEN | EMCR_RXDMAEN | EMCR_RXEN | EMCR_PADEN;
957 958 959 960 961
	writel(ip->emcr, &regs->emcr);
	writel(EISR_RXTIMERINT | EISR_RXOFLO | EISR_RXBUFOFLO |
	       EISR_RXMEMERR | EISR_RXPARERR | EISR_TXBUFUFLO |
	       EISR_TXEXPLICIT | EISR_TXMEMERR, &regs->eier);
	readl(&regs->eier);
L
Linus Torvalds 已提交
962 963 964 965
}

static inline void ioc3_stop(struct ioc3_private *ip)
{
966
	struct ioc3_ethregs *regs = ip->regs;
L
Linus Torvalds 已提交
967

968 969 970
	writel(0, &regs->emcr);			/* Shutup */
	writel(0, &regs->eier);			/* Disable interrupts */
	readl(&regs->eier);			/* Flush */
L
Linus Torvalds 已提交
971 972 973 974 975 976
}

static int ioc3_open(struct net_device *dev)
{
	struct ioc3_private *ip = netdev_priv(dev);

977
	if (request_irq(dev->irq, ioc3_interrupt, IRQF_SHARED, ioc3_str, dev)) {
978
		netdev_err(dev, "Can't get irq %d\n", dev->irq);
L
Linus Torvalds 已提交
979 980 981 982 983 984

		return -EAGAIN;
	}

	ip->ehar_h = 0;
	ip->ehar_l = 0;
985

L
Linus Torvalds 已提交
986
	ioc3_init(dev);
987 988 989 990
	if (ioc3_alloc_rx_bufs(dev)) {
		netdev_err(dev, "%s: rx buffer allocation failed\n", __func__);
		return -ENOMEM;
	}
991
	ioc3_start(ip);
R
Ralf Baechle 已提交
992
	ioc3_mii_start(ip);
L
Linus Torvalds 已提交
993 994 995 996 997 998 999 1000 1001

	netif_start_queue(dev);
	return 0;
}

static int ioc3_close(struct net_device *dev)
{
	struct ioc3_private *ip = netdev_priv(dev);

R
Ralf Baechle 已提交
1002
	del_timer_sync(&ip->ioc3_timer);
L
Linus Torvalds 已提交
1003 1004 1005 1006 1007 1008

	netif_stop_queue(dev);

	ioc3_stop(ip);
	free_irq(dev->irq, dev);

1009 1010 1011
	ioc3_free_rx_bufs(ip);
	ioc3_clean_tx_ring(ip);

L
Linus Torvalds 已提交
1012 1013 1014
	return 0;
}

1015
/* MENET cards have four IOC3 chips, which are attached to two sets of
L
Linus Torvalds 已提交
1016 1017 1018 1019 1020 1021 1022 1023
 * PCI slot resources each: the primary connections are on slots
 * 0..3 and the secondaries are on 4..7
 *
 * All four ethernets are brought out to connectors; six serial ports
 * (a pair from each of the first three IOC3s) are brought out to
 * MiniDINs; all other subdevices are left swinging in the wind, leave
 * them disabled.
 */
1024 1025 1026 1027 1028 1029 1030 1031

static int ioc3_adjacent_is_ioc3(struct pci_dev *pdev, int slot)
{
	struct pci_dev *dev = pci_get_slot(pdev->bus, PCI_DEVFN(slot, 0));
	int ret = 0;

	if (dev) {
		if (dev->vendor == PCI_VENDOR_ID_SGI &&
1032
		    dev->device == PCI_DEVICE_ID_SGI_IOC3)
1033 1034 1035 1036 1037 1038 1039 1040
			ret = 1;
		pci_dev_put(dev);
	}

	return ret;
}

static int ioc3_is_menet(struct pci_dev *pdev)
L
Linus Torvalds 已提交
1041
{
1042
	return !pdev->bus->parent &&
1043 1044 1045
	       ioc3_adjacent_is_ioc3(pdev, 0) &&
	       ioc3_adjacent_is_ioc3(pdev, 1) &&
	       ioc3_adjacent_is_ioc3(pdev, 2);
L
Linus Torvalds 已提交
1046 1047 1048
}

#ifdef CONFIG_SERIAL_8250
1049
/* Note about serial ports and consoles:
L
Linus Torvalds 已提交
1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071
 * For console output, everyone uses the IOC3 UARTA (offset 0x178)
 * connected to the master node (look in ip27_setup_console() and
 * ip27prom_console_write()).
 *
 * For serial (/dev/ttyS0 etc), we can not have hardcoded serial port
 * addresses on a partitioned machine. Since we currently use the ioc3
 * serial ports, we use dynamic serial port discovery that the serial.c
 * driver uses for pci/pnp ports (there is an entry for the SGI ioc3
 * boards in pci_boards[]). Unfortunately, UARTA's pio address is greater
 * than UARTB's, although UARTA on o200s has traditionally been known as
 * port 0. So, we just use one serial port from each ioc3 (since the
 * serial driver adds addresses to get to higher ports).
 *
 * The first one to do a register_console becomes the preferred console
 * (if there is no kernel command line console= directive). /dev/console
 * (ie 5, 1) is then "aliased" into the device number returned by the
 * "device" routine referred to in this console structure
 * (ip27prom_console_dev).
 *
 * Also look in ip27-pci.c:pci_fixup_ioc3() for some comments on working
 * around ioc3 oddities in this respect.
 *
R
Ralf Baechle 已提交
1072 1073 1074 1075 1076 1077 1078 1079
 * The IOC3 serials use a 22MHz clock rate with an additional divider which
 * can be programmed in the SCR register if the DLAB bit is set.
 *
 * Register to interrupt zero because we share the interrupt with
 * the serial driver which we don't properly support yet.
 *
 * Can't use UPF_IOREMAP as the whole of IOC3 resources have already been
 * registered.
L
Linus Torvalds 已提交
1080
 */
B
Bill Pemberton 已提交
1081
static void ioc3_8250_register(struct ioc3_uartregs __iomem *uart)
R
Ralf Baechle 已提交
1082 1083 1084
{
#define COSMISC_CONSTANT 6

1085
	struct uart_8250_port port = {
1086
		.port = {
1087 1088 1089 1090 1091 1092
			.irq		= 0,
			.flags		= UPF_SKIP_TEST | UPF_BOOT_AUTOCONF,
			.iotype		= UPIO_MEM,
			.regshift	= 0,
			.uartclk	= (22000000 << 1) / COSMISC_CONSTANT,

1093 1094 1095
			.membase	= (unsigned char __iomem *)uart,
			.mapbase	= (unsigned long)uart,
		}
R
Ralf Baechle 已提交
1096 1097 1098
	};
	unsigned char lcr;

1099 1100 1101 1102 1103
	lcr = readb(&uart->iu_lcr);
	writeb(lcr | UART_LCR_DLAB, &uart->iu_lcr);
	writeb(COSMISC_CONSTANT, &uart->iu_scr);
	writeb(lcr, &uart->iu_lcr);
	readb(&uart->iu_lcr);
1104
	serial8250_register_8250_port(&port);
R
Ralf Baechle 已提交
1105
}
L
Linus Torvalds 已提交
1106

B
Bill Pemberton 已提交
1107
static void ioc3_serial_probe(struct pci_dev *pdev, struct ioc3 *ioc3)
L
Linus Torvalds 已提交
1108
{
1109 1110
	u32 sio_iec;

1111
	/* We need to recognice and treat the fourth MENET serial as it
L
Linus Torvalds 已提交
1112 1113 1114 1115 1116 1117 1118 1119 1120 1121
	 * does not have an SuperIO chip attached to it, therefore attempting
	 * to access it will result in bus errors.  We call something an
	 * MENET if PCI slot 0, 1, 2 and 3 of a master PCI bus all have an IOC3
	 * in it.  This is paranoid but we want to avoid blowing up on a
	 * showhorn PCI box that happens to have 4 IOC3 cards in it so it's
	 * not paranoid enough ...
	 */
	if (ioc3_is_menet(pdev) && PCI_SLOT(pdev->devfn) == 3)
		return;

1122
	/* Switch IOC3 to PIO mode.  It probably already was but let's be
R
Ralf Baechle 已提交
1123
	 * paranoid
1124
	 */
1125 1126 1127 1128 1129 1130 1131 1132 1133 1134
	writel(GPCR_UARTA_MODESEL | GPCR_UARTB_MODESEL, &ioc3->gpcr_s);
	readl(&ioc3->gpcr_s);
	writel(0, &ioc3->gppr[6]);
	readl(&ioc3->gppr[6]);
	writel(0, &ioc3->gppr[7]);
	readl(&ioc3->gppr[7]);
	writel(readl(&ioc3->port_a.sscr) & ~SSCR_DMA_EN, &ioc3->port_a.sscr);
	readl(&ioc3->port_a.sscr);
	writel(readl(&ioc3->port_b.sscr) & ~SSCR_DMA_EN, &ioc3->port_b.sscr);
	readl(&ioc3->port_b.sscr);
R
Ralf Baechle 已提交
1135
	/* Disable all SA/B interrupts except for SA/B_INT in SIO_IEC. */
1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149
	sio_iec = readl(&ioc3->sio_iec);
	sio_iec &= ~(SIO_IR_SA_TX_MT | SIO_IR_SA_RX_FULL |
		     SIO_IR_SA_RX_HIGH | SIO_IR_SA_RX_TIMER |
		     SIO_IR_SA_DELTA_DCD | SIO_IR_SA_DELTA_CTS |
		     SIO_IR_SA_TX_EXPLICIT | SIO_IR_SA_MEMERR);
	sio_iec |= SIO_IR_SA_INT;
	sio_iec &= ~(SIO_IR_SB_TX_MT | SIO_IR_SB_RX_FULL |
		     SIO_IR_SB_RX_HIGH | SIO_IR_SB_RX_TIMER |
		     SIO_IR_SB_DELTA_DCD | SIO_IR_SB_DELTA_CTS |
		     SIO_IR_SB_TX_EXPLICIT | SIO_IR_SB_MEMERR);
	sio_iec |= SIO_IR_SB_INT;
	writel(sio_iec, &ioc3->sio_iec);
	writel(0, &ioc3->port_a.sscr);
	writel(0, &ioc3->port_b.sscr);
R
Ralf Baechle 已提交
1150 1151 1152

	ioc3_8250_register(&ioc3->sregs.uarta);
	ioc3_8250_register(&ioc3->sregs.uartb);
L
Linus Torvalds 已提交
1153 1154 1155
}
#endif

1156 1157 1158 1159 1160 1161
static const struct net_device_ops ioc3_netdev_ops = {
	.ndo_open		= ioc3_open,
	.ndo_stop		= ioc3_close,
	.ndo_start_xmit		= ioc3_start_xmit,
	.ndo_tx_timeout		= ioc3_timeout,
	.ndo_get_stats		= ioc3_get_stats,
1162
	.ndo_set_rx_mode	= ioc3_set_multicast_list,
1163 1164 1165 1166 1167
	.ndo_do_ioctl		= ioc3_ioctl,
	.ndo_validate_addr	= eth_validate_addr,
	.ndo_set_mac_address	= ioc3_set_mac_address,
};

1168
static int ioc3_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
L
Linus Torvalds 已提交
1169 1170 1171 1172 1173 1174 1175
{
	unsigned int sw_physid1, sw_physid2;
	struct net_device *dev = NULL;
	struct ioc3_private *ip;
	struct ioc3 *ioc3;
	unsigned long ioc3_base, ioc3_size;
	u32 vendor, model, rev;
1176
	int err;
L
Linus Torvalds 已提交
1177 1178

	/* Configure DMA attributes. */
1179 1180 1181 1182 1183
	err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));
	if (err) {
		pr_err("%s: No usable DMA configuration, aborting.\n",
		       pci_name(pdev));
		goto out;
L
Linus Torvalds 已提交
1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194
	}

	if (pci_enable_device(pdev))
		return -ENODEV;

	dev = alloc_etherdev(sizeof(struct ioc3_private));
	if (!dev) {
		err = -ENOMEM;
		goto out_disable;
	}

1195
	dev->features |= NETIF_F_HIGHDMA;
L
Linus Torvalds 已提交
1196 1197 1198 1199 1200 1201 1202 1203

	err = pci_request_regions(pdev, "ioc3");
	if (err)
		goto out_free;

	SET_NETDEV_DEV(dev, &pdev->dev);

	ip = netdev_priv(dev);
1204
	ip->dev = dev;
1205
	ip->dma_dev = &pdev->dev;
L
Linus Torvalds 已提交
1206 1207 1208 1209 1210

	dev->irq = pdev->irq;

	ioc3_base = pci_resource_start(pdev, 0);
	ioc3_size = pci_resource_len(pdev, 0);
1211
	ioc3 = (struct ioc3 *)ioremap(ioc3_base, ioc3_size);
L
Linus Torvalds 已提交
1212
	if (!ioc3) {
1213
		pr_err("ioc3eth(%s): ioremap failed, goodbye.\n",
L
Linus Torvalds 已提交
1214 1215 1216 1217
		       pci_name(pdev));
		err = -ENOMEM;
		goto out_res;
	}
1218 1219 1220
	ip->regs = &ioc3->eth;
	ip->ssram = ioc3->ssram;
	ip->all_regs = ioc3;
L
Linus Torvalds 已提交
1221 1222 1223 1224 1225 1226

#ifdef CONFIG_SERIAL_8250
	ioc3_serial_probe(pdev, ioc3);
#endif

	spin_lock_init(&ip->ioc3_lock);
1227
	timer_setup(&ip->ioc3_timer, ioc3_timer, 0);
L
Linus Torvalds 已提交
1228 1229

	ioc3_stop(ip);
1230 1231

	/* Allocate rx ring.  4kb = 512 entries, must be 4kb aligned */
1232
	ip->rxr = dma_alloc_coherent(ip->dma_dev, RX_RING_SIZE, &ip->rxr_dma,
1233
				     GFP_KERNEL);
1234 1235 1236 1237 1238 1239 1240
	if (!ip->rxr) {
		pr_err("ioc3-eth: rx ring allocation failed\n");
		err = -ENOMEM;
		goto out_stop;
	}

	/* Allocate tx rings.  16kb = 128 bufs, must be 16kb aligned  */
1241
	ip->txr = dma_alloc_coherent(ip->dma_dev, TX_RING_SIZE, &ip->txr_dma,
1242
				     GFP_KERNEL);
1243 1244 1245 1246 1247 1248
	if (!ip->txr) {
		pr_err("ioc3-eth: tx ring allocation failed\n");
		err = -ENOMEM;
		goto out_stop;
	}

L
Linus Torvalds 已提交
1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261
	ioc3_init(dev);

	ip->pdev = pdev;

	ip->mii.phy_id_mask = 0x1f;
	ip->mii.reg_num_mask = 0x1f;
	ip->mii.dev = dev;
	ip->mii.mdio_read = ioc3_mdio_read;
	ip->mii.mdio_write = ioc3_mdio_write;

	ioc3_mii_init(ip);

	if (ip->mii.phy_id == -1) {
1262
		pr_err("ioc3-eth(%s): Didn't find a PHY, goodbye.\n",
L
Linus Torvalds 已提交
1263 1264 1265 1266 1267
		       pci_name(pdev));
		err = -ENODEV;
		goto out_stop;
	}

R
Ralf Baechle 已提交
1268
	ioc3_mii_start(ip);
L
Linus Torvalds 已提交
1269 1270 1271 1272 1273
	ioc3_ssram_disc(ip);
	ioc3_get_eaddr(ip);

	/* The IOC3-specific entries in the device structure. */
	dev->watchdog_timeo	= 5 * HZ;
1274
	dev->netdev_ops		= &ioc3_netdev_ops;
L
Linus Torvalds 已提交
1275
	dev->ethtool_ops	= &ioc3_ethtool_ops;
1276
	dev->hw_features	= NETIF_F_IP_CSUM | NETIF_F_RXCSUM;
L
Linus Torvalds 已提交
1277 1278 1279 1280 1281 1282 1283 1284 1285 1286
	dev->features		= NETIF_F_IP_CSUM;

	sw_physid1 = ioc3_mdio_read(dev, ip->mii.phy_id, MII_PHYSID1);
	sw_physid2 = ioc3_mdio_read(dev, ip->mii.phy_id, MII_PHYSID2);

	err = register_netdev(dev);
	if (err)
		goto out_stop;

	mii_check_media(&ip->mii, 1, 1);
R
Ralf Baechle 已提交
1287
	ioc3_setup_duplex(ip);
L
Linus Torvalds 已提交
1288 1289 1290 1291

	vendor = (sw_physid1 << 12) | (sw_physid2 >> 4);
	model  = (sw_physid2 >> 4) & 0x3f;
	rev    = sw_physid2 & 0xf;
1292 1293 1294 1295
	netdev_info(dev, "Using PHY %d, vendor 0x%x, model %d, rev %d.\n",
		    ip->mii.phy_id, vendor, model, rev);
	netdev_info(dev, "IOC3 SSRAM has %d kbyte.\n",
		    ip->emcr & EMCR_BUFSIZ ? 128 : 64);
L
Linus Torvalds 已提交
1296 1297 1298 1299

	return 0;

out_stop:
R
Ralf Baechle 已提交
1300
	del_timer_sync(&ip->ioc3_timer);
1301
	if (ip->rxr)
1302 1303
		dma_free_coherent(ip->dma_dev, RX_RING_SIZE, ip->rxr,
				  ip->rxr_dma);
1304
	if (ip->txr)
1305 1306
		dma_free_coherent(ip->dma_dev, TX_RING_SIZE, ip->txr,
				  ip->txr_dma);
L
Linus Torvalds 已提交
1307 1308 1309 1310 1311
out_res:
	pci_release_regions(pdev);
out_free:
	free_netdev(dev);
out_disable:
1312
	/* We should call pci_disable_device(pdev); here if the IOC3 wasn't
L
Linus Torvalds 已提交
1313 1314 1315 1316 1317 1318
	 * such a weird device ...
	 */
out:
	return err;
}

B
Bill Pemberton 已提交
1319
static void ioc3_remove_one(struct pci_dev *pdev)
L
Linus Torvalds 已提交
1320 1321 1322 1323
{
	struct net_device *dev = pci_get_drvdata(pdev);
	struct ioc3_private *ip = netdev_priv(dev);

1324 1325
	dma_free_coherent(ip->dma_dev, RX_RING_SIZE, ip->rxr, ip->rxr_dma);
	dma_free_coherent(ip->dma_dev, TX_RING_SIZE, ip->txr, ip->txr_dma);
1326

L
Linus Torvalds 已提交
1327
	unregister_netdev(dev);
R
Ralf Baechle 已提交
1328 1329
	del_timer_sync(&ip->ioc3_timer);

1330
	iounmap(ip->all_regs);
L
Linus Torvalds 已提交
1331 1332
	pci_release_regions(pdev);
	free_netdev(dev);
1333
	/* We should call pci_disable_device(pdev); here if the IOC3 wasn't
L
Linus Torvalds 已提交
1334 1335 1336 1337
	 * such a weird device ...
	 */
}

1338
static const struct pci_device_id ioc3_pci_tbl[] = {
L
Linus Torvalds 已提交
1339 1340 1341 1342 1343 1344 1345 1346 1347
	{ PCI_VENDOR_ID_SGI, PCI_DEVICE_ID_SGI_IOC3, PCI_ANY_ID, PCI_ANY_ID },
	{ 0 }
};
MODULE_DEVICE_TABLE(pci, ioc3_pci_tbl);

static struct pci_driver ioc3_driver = {
	.name		= "ioc3-eth",
	.id_table	= ioc3_pci_tbl,
	.probe		= ioc3_probe,
B
Bill Pemberton 已提交
1348
	.remove		= ioc3_remove_one,
L
Linus Torvalds 已提交
1349 1350
};

1351
static netdev_tx_t ioc3_start_xmit(struct sk_buff *skb, struct net_device *dev)
L
Linus Torvalds 已提交
1352 1353 1354
{
	struct ioc3_private *ip = netdev_priv(dev);
	struct ioc3_etxd *desc;
1355 1356
	unsigned long data;
	unsigned int len;
L
Linus Torvalds 已提交
1357
	int produce;
1358
	u32 w0 = 0;
L
Linus Torvalds 已提交
1359

1360
	/* IOC3 has a fairly simple minded checksumming hardware which simply
L
Linus Torvalds 已提交
1361 1362 1363 1364 1365 1366
	 * adds up the 1's complement checksum for the entire packet and
	 * inserts it at an offset which can be specified in the descriptor
	 * into the transmit packet.  This means we have to compensate for the
	 * MAC header which should not be summed and the TCP/UDP pseudo headers
	 * manually.
	 */
1367
	if (skb->ip_summed == CHECKSUM_PARTIAL) {
1368 1369
		const struct iphdr *ih = ip_hdr(skb);
		const int proto = ntohs(ih->protocol);
L
Linus Torvalds 已提交
1370
		unsigned int csoff;
1371 1372
		u32 csum, ehsum;
		u16 *eh;
L
Linus Torvalds 已提交
1373 1374

		/* The MAC header.  skb->mac seem the logic approach
1375 1376 1377
		 * to find the MAC header - except it's a NULL pointer ...
		 */
		eh = (u16 *)skb->data;
L
Linus Torvalds 已提交
1378 1379 1380 1381 1382

		/* Sum up dest addr, src addr and protocol  */
		ehsum = eh[0] + eh[1] + eh[2] + eh[3] + eh[4] + eh[5] + eh[6];

		/* Skip IP header; it's sum is always zero and was
1383 1384
		 * already filled in by ip_output.c
		 */
L
Linus Torvalds 已提交
1385
		csum = csum_tcpudp_nofold(ih->saddr, ih->daddr,
1386
					  ih->tot_len - (ih->ihl << 2),
1387
					  proto, csum_fold(ehsum));
L
Linus Torvalds 已提交
1388 1389 1390 1391 1392 1393 1394

		csum = (csum & 0xffff) + (csum >> 16);	/* Fold again */
		csum = (csum & 0xffff) + (csum >> 16);

		csoff = ETH_HLEN + (ih->ihl << 2);
		if (proto == IPPROTO_UDP) {
			csoff += offsetof(struct udphdr, check);
1395
			udp_hdr(skb)->check = csum;
L
Linus Torvalds 已提交
1396 1397 1398
		}
		if (proto == IPPROTO_TCP) {
			csoff += offsetof(struct tcphdr, check);
1399
			tcp_hdr(skb)->check = csum;
L
Linus Torvalds 已提交
1400 1401 1402 1403 1404 1405 1406
		}

		w0 = ETXD_DOCHECKSUM | (csoff << ETXD_CHKOFF_SHIFT);
	}

	spin_lock_irq(&ip->ioc3_lock);

1407
	data = (unsigned long)skb->data;
L
Linus Torvalds 已提交
1408 1409 1410 1411 1412 1413 1414
	len = skb->len;

	produce = ip->tx_pi;
	desc = &ip->txr[produce];

	if (len <= 104) {
		/* Short packet, let's copy it directly into the ring.  */
1415
		skb_copy_from_linear_data(skb, desc->data, skb->len);
L
Linus Torvalds 已提交
1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426
		if (len < ETH_ZLEN) {
			/* Very short packet, pad with zeros at the end. */
			memset(desc->data + len, 0, ETH_ZLEN - len);
			len = ETH_ZLEN;
		}
		desc->cmd = cpu_to_be32(len | ETXD_INTWHENDONE | ETXD_D0V | w0);
		desc->bufcnt = cpu_to_be32(len);
	} else if ((data ^ (data + len - 1)) & 0x4000) {
		unsigned long b2 = (data | 0x3fffUL) + 1UL;
		unsigned long s1 = b2 - data;
		unsigned long s2 = data + len - b2;
1427
		dma_addr_t d1, d2;
L
Linus Torvalds 已提交
1428 1429

		desc->cmd    = cpu_to_be32(len | ETXD_INTWHENDONE |
1430
					   ETXD_B1V | ETXD_B2V | w0);
L
Linus Torvalds 已提交
1431
		desc->bufcnt = cpu_to_be32((s1 << ETXD_B1CNT_SHIFT) |
1432
					   (s2 << ETXD_B2CNT_SHIFT));
1433 1434 1435 1436 1437 1438 1439 1440 1441 1442
		d1 = dma_map_single(ip->dma_dev, skb->data, s1, DMA_TO_DEVICE);
		if (dma_mapping_error(ip->dma_dev, d1))
			goto drop_packet;
		d2 = dma_map_single(ip->dma_dev, (void *)b2, s1, DMA_TO_DEVICE);
		if (dma_mapping_error(ip->dma_dev, d2)) {
			dma_unmap_single(ip->dma_dev, d1, len, DMA_TO_DEVICE);
			goto drop_packet;
		}
		desc->p1     = cpu_to_be64(ioc3_map(d1, PCI64_ATTR_PREF));
		desc->p2     = cpu_to_be64(ioc3_map(d2, PCI64_ATTR_PREF));
L
Linus Torvalds 已提交
1443
	} else {
1444 1445
		dma_addr_t d;

L
Linus Torvalds 已提交
1446 1447 1448
		/* Normal sized packet that doesn't cross a page boundary. */
		desc->cmd = cpu_to_be32(len | ETXD_INTWHENDONE | ETXD_B1V | w0);
		desc->bufcnt = cpu_to_be32(len << ETXD_B1CNT_SHIFT);
1449 1450 1451 1452
		d = dma_map_single(ip->dma_dev, skb->data, len, DMA_TO_DEVICE);
		if (dma_mapping_error(ip->dma_dev, d))
			goto drop_packet;
		desc->p1     = cpu_to_be64(ioc3_map(d, PCI64_ATTR_PREF));
L
Linus Torvalds 已提交
1453 1454
	}

1455
	mb(); /* make sure all descriptor changes are visible */
L
Linus Torvalds 已提交
1456 1457

	ip->tx_skbs[produce] = skb;			/* Remember skb */
1458
	produce = (produce + 1) & TX_RING_MASK;
L
Linus Torvalds 已提交
1459
	ip->tx_pi = produce;
1460
	writel(produce << 7, &ip->regs->etpir);		/* Fire ... */
L
Linus Torvalds 已提交
1461 1462 1463

	ip->txqlen++;

1464
	if (ip->txqlen >= (TX_RING_ENTRIES - 1))
L
Linus Torvalds 已提交
1465 1466 1467 1468
		netif_stop_queue(dev);

	spin_unlock_irq(&ip->ioc3_lock);

1469 1470 1471 1472 1473 1474 1475 1476
	return NETDEV_TX_OK;

drop_packet:
	dev_kfree_skb_any(skb);
	dev->stats.tx_dropped++;

	spin_unlock_irq(&ip->ioc3_lock);

1477
	return NETDEV_TX_OK;
L
Linus Torvalds 已提交
1478 1479 1480 1481 1482 1483
}

static void ioc3_timeout(struct net_device *dev)
{
	struct ioc3_private *ip = netdev_priv(dev);

1484
	netdev_err(dev, "transmit timed out, resetting\n");
L
Linus Torvalds 已提交
1485 1486 1487 1488

	spin_lock_irq(&ip->ioc3_lock);

	ioc3_stop(ip);
1489 1490 1491
	ioc3_free_rx_bufs(ip);
	ioc3_clean_tx_ring(ip);

L
Linus Torvalds 已提交
1492
	ioc3_init(dev);
1493 1494 1495 1496 1497
	if (ioc3_alloc_rx_bufs(dev)) {
		netdev_err(dev, "%s: rx buffer allocation failed\n", __func__);
		spin_unlock_irq(&ip->ioc3_lock);
		return;
	}
1498
	ioc3_start(ip);
L
Linus Torvalds 已提交
1499
	ioc3_mii_init(ip);
R
Ralf Baechle 已提交
1500
	ioc3_mii_start(ip);
L
Linus Torvalds 已提交
1501 1502 1503 1504 1505 1506

	spin_unlock_irq(&ip->ioc3_lock);

	netif_wake_queue(dev);
}

1507
/* Given a multicast ethernet address, this routine calculates the
L
Linus Torvalds 已提交
1508 1509 1510 1511 1512 1513
 * address's bit index in the logical address filter mask
 */
static inline unsigned int ioc3_hash(const unsigned char *addr)
{
	unsigned int temp = 0;
	int bits;
1514
	u32 crc;
L
Linus Torvalds 已提交
1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527

	crc = ether_crc_le(ETH_ALEN, addr);

	crc &= 0x3f;    /* bit reverse lowest 6 bits for hash index */
	for (bits = 6; --bits >= 0; ) {
		temp <<= 1;
		temp |= (crc & 0x1);
		crc >>= 1;
	}

	return temp;
}

1528 1529
static void ioc3_get_drvinfo(struct net_device *dev,
			     struct ethtool_drvinfo *info)
L
Linus Torvalds 已提交
1530 1531
{
	struct ioc3_private *ip = netdev_priv(dev);
R
Ralf Baechle 已提交
1532

1533 1534 1535
	strlcpy(info->driver, IOC3_NAME, sizeof(info->driver));
	strlcpy(info->version, IOC3_VERSION, sizeof(info->version));
	strlcpy(info->bus_info, pci_name(ip->pdev), sizeof(info->bus_info));
L
Linus Torvalds 已提交
1536 1537
}

1538 1539
static int ioc3_get_link_ksettings(struct net_device *dev,
				   struct ethtool_link_ksettings *cmd)
L
Linus Torvalds 已提交
1540 1541 1542 1543
{
	struct ioc3_private *ip = netdev_priv(dev);

	spin_lock_irq(&ip->ioc3_lock);
1544
	mii_ethtool_get_link_ksettings(&ip->mii, cmd);
L
Linus Torvalds 已提交
1545 1546
	spin_unlock_irq(&ip->ioc3_lock);

1547
	return 0;
L
Linus Torvalds 已提交
1548 1549
}

1550 1551
static int ioc3_set_link_ksettings(struct net_device *dev,
				   const struct ethtool_link_ksettings *cmd)
L
Linus Torvalds 已提交
1552 1553 1554 1555 1556
{
	struct ioc3_private *ip = netdev_priv(dev);
	int rc;

	spin_lock_irq(&ip->ioc3_lock);
1557
	rc = mii_ethtool_set_link_ksettings(&ip->mii, cmd);
L
Linus Torvalds 已提交
1558
	spin_unlock_irq(&ip->ioc3_lock);
R
Ralf Baechle 已提交
1559

L
Linus Torvalds 已提交
1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586
	return rc;
}

static int ioc3_nway_reset(struct net_device *dev)
{
	struct ioc3_private *ip = netdev_priv(dev);
	int rc;

	spin_lock_irq(&ip->ioc3_lock);
	rc = mii_nway_restart(&ip->mii);
	spin_unlock_irq(&ip->ioc3_lock);

	return rc;
}

static u32 ioc3_get_link(struct net_device *dev)
{
	struct ioc3_private *ip = netdev_priv(dev);
	int rc;

	spin_lock_irq(&ip->ioc3_lock);
	rc = mii_link_ok(&ip->mii);
	spin_unlock_irq(&ip->ioc3_lock);

	return rc;
}

1587
static const struct ethtool_ops ioc3_ethtool_ops = {
L
Linus Torvalds 已提交
1588 1589 1590
	.get_drvinfo		= ioc3_get_drvinfo,
	.nway_reset		= ioc3_nway_reset,
	.get_link		= ioc3_get_link,
1591 1592
	.get_link_ksettings	= ioc3_get_link_ksettings,
	.set_link_ksettings	= ioc3_set_link_ksettings,
L
Linus Torvalds 已提交
1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609
};

static int ioc3_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
{
	struct ioc3_private *ip = netdev_priv(dev);
	int rc;

	spin_lock_irq(&ip->ioc3_lock);
	rc = generic_mii_ioctl(&ip->mii, if_mii(rq), cmd, NULL);
	spin_unlock_irq(&ip->ioc3_lock);

	return rc;
}

static void ioc3_set_multicast_list(struct net_device *dev)
{
	struct ioc3_private *ip = netdev_priv(dev);
1610 1611
	struct ioc3_ethregs *regs = ip->regs;
	struct netdev_hw_addr *ha;
L
Linus Torvalds 已提交
1612 1613
	u64 ehar = 0;

1614 1615
	spin_lock_irq(&ip->ioc3_lock);

L
Linus Torvalds 已提交
1616 1617
	if (dev->flags & IFF_PROMISC) {			/* Set promiscuous.  */
		ip->emcr |= EMCR_PROMISC;
1618 1619
		writel(ip->emcr, &regs->emcr);
		readl(&regs->emcr);
L
Linus Torvalds 已提交
1620 1621
	} else {
		ip->emcr &= ~EMCR_PROMISC;
1622 1623
		writel(ip->emcr, &regs->emcr);		/* Clear promiscuous. */
		readl(&regs->emcr);
L
Linus Torvalds 已提交
1624

1625 1626
		if ((dev->flags & IFF_ALLMULTI) ||
		    (netdev_mc_count(dev) > 64)) {
L
Linus Torvalds 已提交
1627
			/* Too many for hashing to make sense or we want all
1628 1629 1630
			 * multicast packets anyway,  so skip computing all the
			 * hashes and just accept all packets.
			 */
L
Linus Torvalds 已提交
1631 1632 1633
			ip->ehar_h = 0xffffffff;
			ip->ehar_l = 0xffffffff;
		} else {
1634
			netdev_for_each_mc_addr(ha, dev) {
1635
				ehar |= (1UL << ioc3_hash(ha->addr));
L
Linus Torvalds 已提交
1636 1637 1638 1639
			}
			ip->ehar_h = ehar >> 32;
			ip->ehar_l = ehar & 0xffffffff;
		}
1640 1641
		writel(ip->ehar_h, &regs->ehar_h);
		writel(ip->ehar_l, &regs->ehar_l);
L
Linus Torvalds 已提交
1642 1643
	}

1644
	spin_unlock_irq(&ip->ioc3_lock);
L
Linus Torvalds 已提交
1645 1646
}

1647
module_pci_driver(ioc3_driver);
L
Linus Torvalds 已提交
1648 1649 1650
MODULE_AUTHOR("Ralf Baechle <ralf@linux-mips.org>");
MODULE_DESCRIPTION("SGI IOC3 Ethernet driver");
MODULE_LICENSE("GPL");