smsc75xx.c 55.8 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
 /***************************************************************************
 *
 * Copyright (C) 2007-2010 SMSC
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, see <http://www.gnu.org/licenses/>.
17 18 19 20 21 22 23 24 25 26
 *
 *****************************************************************************/

#include <linux/module.h>
#include <linux/kmod.h>
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/ethtool.h>
#include <linux/mii.h>
#include <linux/usb.h>
27 28
#include <linux/bitrev.h>
#include <linux/crc16.h>
29 30
#include <linux/crc32.h>
#include <linux/usb/usbnet.h>
31
#include <linux/slab.h>
32
#include <linux/of_net.h>
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
#include "smsc75xx.h"

#define SMSC_CHIPNAME			"smsc75xx"
#define SMSC_DRIVER_VERSION		"1.0.0"
#define HS_USB_PKT_SIZE			(512)
#define FS_USB_PKT_SIZE			(64)
#define DEFAULT_HS_BURST_CAP_SIZE	(16 * 1024 + 5 * HS_USB_PKT_SIZE)
#define DEFAULT_FS_BURST_CAP_SIZE	(6 * 1024 + 33 * FS_USB_PKT_SIZE)
#define DEFAULT_BULK_IN_DELAY		(0x00002000)
#define MAX_SINGLE_PACKET_SIZE		(9000)
#define LAN75XX_EEPROM_MAGIC		(0x7500)
#define EEPROM_MAC_OFFSET		(0x01)
#define DEFAULT_TX_CSUM_ENABLE		(true)
#define DEFAULT_RX_CSUM_ENABLE		(true)
#define SMSC75XX_INTERNAL_PHY_ID	(1)
#define SMSC75XX_TX_OVERHEAD		(8)
#define MAX_RX_FIFO_SIZE		(20 * 1024)
#define MAX_TX_FIFO_SIZE		(12 * 1024)
#define USB_VENDOR_ID_SMSC		(0x0424)
#define USB_PRODUCT_ID_LAN7500		(0x7500)
#define USB_PRODUCT_ID_LAN7505		(0x7505)
54
#define RXW_PADDING			2
55
#define SUPPORTED_WAKE			(WAKE_PHY | WAKE_UCAST | WAKE_BCAST | \
56
					 WAKE_MCAST | WAKE_ARP | WAKE_MAGIC)
57

58 59 60 61 62 63 64
#define SUSPEND_SUSPEND0		(0x01)
#define SUSPEND_SUSPEND1		(0x02)
#define SUSPEND_SUSPEND2		(0x04)
#define SUSPEND_SUSPEND3		(0x08)
#define SUSPEND_ALLMODES		(SUSPEND_SUSPEND0 | SUSPEND_SUSPEND1 | \
					 SUSPEND_SUSPEND2 | SUSPEND_SUSPEND3)

65 66 67
struct smsc75xx_priv {
	struct usbnet *dev;
	u32 rfe_ctl;
68
	u32 wolopts;
69 70 71 72
	u32 multicast_hash_table[DP_SEL_VHF_HASH_LEN];
	struct mutex dataport_mutex;
	spinlock_t rfe_ctl_lock;
	struct work_struct set_multicast;
73
	u8 suspend_flags;
74 75 76 77 78 79 80
};

struct usb_context {
	struct usb_ctrlrequest req;
	struct usbnet *dev;
};

81
static bool turbo_mode = true;
82 83 84
module_param(turbo_mode, bool, 0644);
MODULE_PARM_DESC(turbo_mode, "Enable multiple frames per Rx transaction");

85 86
static int __must_check __smsc75xx_read_reg(struct usbnet *dev, u32 index,
					    u32 *data, int in_pm)
87
{
88
	u32 buf;
89
	int ret;
90
	int (*fn)(struct usbnet *, u8, u8, u16, u16, void *, u16);
91 92 93

	BUG_ON(!dev);

94 95 96 97 98 99 100 101
	if (!in_pm)
		fn = usbnet_read_cmd;
	else
		fn = usbnet_read_cmd_nopm;

	ret = fn(dev, USB_VENDOR_REQUEST_READ_REGISTER, USB_DIR_IN
		 | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
		 0, index, &buf, 4);
102
	if (unlikely(ret < 0)) {
103 104
		netdev_warn(dev->net, "Failed to read reg index 0x%08x: %d\n",
			    index, ret);
105 106
		return ret;
	}
107

108 109
	le32_to_cpus(&buf);
	*data = buf;
110 111 112 113

	return ret;
}

114 115
static int __must_check __smsc75xx_write_reg(struct usbnet *dev, u32 index,
					     u32 data, int in_pm)
116
{
117
	u32 buf;
118
	int ret;
119
	int (*fn)(struct usbnet *, u8, u8, u16, u16, const void *, u16);
120 121 122

	BUG_ON(!dev);

123 124 125 126 127
	if (!in_pm)
		fn = usbnet_write_cmd;
	else
		fn = usbnet_write_cmd_nopm;

128 129
	buf = data;
	cpu_to_le32s(&buf);
130

131 132 133
	ret = fn(dev, USB_VENDOR_REQUEST_WRITE_REGISTER, USB_DIR_OUT
		 | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
		 0, index, &buf, 4);
134
	if (unlikely(ret < 0))
135 136
		netdev_warn(dev->net, "Failed to write reg index 0x%08x: %d\n",
			    index, ret);
137 138 139 140

	return ret;
}

141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
static int __must_check smsc75xx_read_reg_nopm(struct usbnet *dev, u32 index,
					       u32 *data)
{
	return __smsc75xx_read_reg(dev, index, data, 1);
}

static int __must_check smsc75xx_write_reg_nopm(struct usbnet *dev, u32 index,
						u32 data)
{
	return __smsc75xx_write_reg(dev, index, data, 1);
}

static int __must_check smsc75xx_read_reg(struct usbnet *dev, u32 index,
					  u32 *data)
{
	return __smsc75xx_read_reg(dev, index, data, 0);
}

static int __must_check smsc75xx_write_reg(struct usbnet *dev, u32 index,
					   u32 data)
{
	return __smsc75xx_write_reg(dev, index, data, 0);
}

165 166
/* Loop until the read is completed with timeout
 * called with phy_mutex held */
167 168
static __must_check int __smsc75xx_phy_wait_not_busy(struct usbnet *dev,
						     int in_pm)
169 170 171 172 173 174
{
	unsigned long start_time = jiffies;
	u32 val;
	int ret;

	do {
175
		ret = __smsc75xx_read_reg(dev, MII_ACCESS, &val, in_pm);
176 177 178 179
		if (ret < 0) {
			netdev_warn(dev->net, "Error reading MII_ACCESS\n");
			return ret;
		}
180 181 182 183 184 185 186 187

		if (!(val & MII_ACCESS_BUSY))
			return 0;
	} while (!time_after(jiffies, start_time + HZ));

	return -EIO;
}

188 189
static int __smsc75xx_mdio_read(struct net_device *netdev, int phy_id, int idx,
				int in_pm)
190 191 192 193 194 195 196 197
{
	struct usbnet *dev = netdev_priv(netdev);
	u32 val, addr;
	int ret;

	mutex_lock(&dev->phy_mutex);

	/* confirm MII not busy */
198
	ret = __smsc75xx_phy_wait_not_busy(dev, in_pm);
199 200 201 202
	if (ret < 0) {
		netdev_warn(dev->net, "MII is busy in smsc75xx_mdio_read\n");
		goto done;
	}
203 204 205 206 207 208

	/* set the address, index & direction (read from PHY) */
	phy_id &= dev->mii.phy_id_mask;
	idx &= dev->mii.reg_num_mask;
	addr = ((phy_id << MII_ACCESS_PHY_ADDR_SHIFT) & MII_ACCESS_PHY_ADDR)
		| ((idx << MII_ACCESS_REG_ADDR_SHIFT) & MII_ACCESS_REG_ADDR)
209
		| MII_ACCESS_READ | MII_ACCESS_BUSY;
210
	ret = __smsc75xx_write_reg(dev, MII_ACCESS, addr, in_pm);
211 212 213 214
	if (ret < 0) {
		netdev_warn(dev->net, "Error writing MII_ACCESS\n");
		goto done;
	}
215

216
	ret = __smsc75xx_phy_wait_not_busy(dev, in_pm);
217 218 219 220
	if (ret < 0) {
		netdev_warn(dev->net, "Timed out reading MII reg %02X\n", idx);
		goto done;
	}
221

222
	ret = __smsc75xx_read_reg(dev, MII_DATA, &val, in_pm);
223 224 225 226
	if (ret < 0) {
		netdev_warn(dev->net, "Error reading MII_DATA\n");
		goto done;
	}
227 228 229 230 231 232 233 234

	ret = (u16)(val & 0xFFFF);

done:
	mutex_unlock(&dev->phy_mutex);
	return ret;
}

235 236
static void __smsc75xx_mdio_write(struct net_device *netdev, int phy_id,
				  int idx, int regval, int in_pm)
237 238 239 240 241 242 243 244
{
	struct usbnet *dev = netdev_priv(netdev);
	u32 val, addr;
	int ret;

	mutex_lock(&dev->phy_mutex);

	/* confirm MII not busy */
245
	ret = __smsc75xx_phy_wait_not_busy(dev, in_pm);
246 247 248 249
	if (ret < 0) {
		netdev_warn(dev->net, "MII is busy in smsc75xx_mdio_write\n");
		goto done;
	}
250 251

	val = regval;
252
	ret = __smsc75xx_write_reg(dev, MII_DATA, val, in_pm);
253 254 255 256
	if (ret < 0) {
		netdev_warn(dev->net, "Error writing MII_DATA\n");
		goto done;
	}
257 258 259 260 261 262

	/* set the address, index & direction (write to PHY) */
	phy_id &= dev->mii.phy_id_mask;
	idx &= dev->mii.reg_num_mask;
	addr = ((phy_id << MII_ACCESS_PHY_ADDR_SHIFT) & MII_ACCESS_PHY_ADDR)
		| ((idx << MII_ACCESS_REG_ADDR_SHIFT) & MII_ACCESS_REG_ADDR)
263
		| MII_ACCESS_WRITE | MII_ACCESS_BUSY;
264
	ret = __smsc75xx_write_reg(dev, MII_ACCESS, addr, in_pm);
265 266 267 268
	if (ret < 0) {
		netdev_warn(dev->net, "Error writing MII_ACCESS\n");
		goto done;
	}
269

270
	ret = __smsc75xx_phy_wait_not_busy(dev, in_pm);
271 272 273 274
	if (ret < 0) {
		netdev_warn(dev->net, "Timed out writing MII reg %02X\n", idx);
		goto done;
	}
275 276 277 278 279

done:
	mutex_unlock(&dev->phy_mutex);
}

280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302
static int smsc75xx_mdio_read_nopm(struct net_device *netdev, int phy_id,
				   int idx)
{
	return __smsc75xx_mdio_read(netdev, phy_id, idx, 1);
}

static void smsc75xx_mdio_write_nopm(struct net_device *netdev, int phy_id,
				     int idx, int regval)
{
	__smsc75xx_mdio_write(netdev, phy_id, idx, regval, 1);
}

static int smsc75xx_mdio_read(struct net_device *netdev, int phy_id, int idx)
{
	return __smsc75xx_mdio_read(netdev, phy_id, idx, 0);
}

static void smsc75xx_mdio_write(struct net_device *netdev, int phy_id, int idx,
				int regval)
{
	__smsc75xx_mdio_write(netdev, phy_id, idx, regval, 0);
}

303 304 305 306 307 308 309 310
static int smsc75xx_wait_eeprom(struct usbnet *dev)
{
	unsigned long start_time = jiffies;
	u32 val;
	int ret;

	do {
		ret = smsc75xx_read_reg(dev, E2P_CMD, &val);
311 312 313 314
		if (ret < 0) {
			netdev_warn(dev->net, "Error reading E2P_CMD\n");
			return ret;
		}
315 316 317 318 319 320 321

		if (!(val & E2P_CMD_BUSY) || (val & E2P_CMD_TIMEOUT))
			break;
		udelay(40);
	} while (!time_after(jiffies, start_time + HZ));

	if (val & (E2P_CMD_TIMEOUT | E2P_CMD_BUSY)) {
322
		netdev_warn(dev->net, "EEPROM read operation timeout\n");
323 324 325 326 327 328 329 330 331 332 333 334 335 336
		return -EIO;
	}

	return 0;
}

static int smsc75xx_eeprom_confirm_not_busy(struct usbnet *dev)
{
	unsigned long start_time = jiffies;
	u32 val;
	int ret;

	do {
		ret = smsc75xx_read_reg(dev, E2P_CMD, &val);
337 338 339 340
		if (ret < 0) {
			netdev_warn(dev->net, "Error reading E2P_CMD\n");
			return ret;
		}
341 342 343 344 345 346 347

		if (!(val & E2P_CMD_BUSY))
			return 0;

		udelay(40);
	} while (!time_after(jiffies, start_time + HZ));

348
	netdev_warn(dev->net, "EEPROM is busy\n");
349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367
	return -EIO;
}

static int smsc75xx_read_eeprom(struct usbnet *dev, u32 offset, u32 length,
				u8 *data)
{
	u32 val;
	int i, ret;

	BUG_ON(!dev);
	BUG_ON(!data);

	ret = smsc75xx_eeprom_confirm_not_busy(dev);
	if (ret)
		return ret;

	for (i = 0; i < length; i++) {
		val = E2P_CMD_BUSY | E2P_CMD_READ | (offset & E2P_CMD_ADDR);
		ret = smsc75xx_write_reg(dev, E2P_CMD, val);
368 369 370 371
		if (ret < 0) {
			netdev_warn(dev->net, "Error writing E2P_CMD\n");
			return ret;
		}
372 373 374 375 376 377

		ret = smsc75xx_wait_eeprom(dev);
		if (ret < 0)
			return ret;

		ret = smsc75xx_read_reg(dev, E2P_DATA, &val);
378 379 380 381
		if (ret < 0) {
			netdev_warn(dev->net, "Error reading E2P_DATA\n");
			return ret;
		}
382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405

		data[i] = val & 0xFF;
		offset++;
	}

	return 0;
}

static int smsc75xx_write_eeprom(struct usbnet *dev, u32 offset, u32 length,
				 u8 *data)
{
	u32 val;
	int i, ret;

	BUG_ON(!dev);
	BUG_ON(!data);

	ret = smsc75xx_eeprom_confirm_not_busy(dev);
	if (ret)
		return ret;

	/* Issue write/erase enable command */
	val = E2P_CMD_BUSY | E2P_CMD_EWEN;
	ret = smsc75xx_write_reg(dev, E2P_CMD, val);
406 407 408 409
	if (ret < 0) {
		netdev_warn(dev->net, "Error writing E2P_CMD\n");
		return ret;
	}
410 411 412 413 414 415 416 417 418 419

	ret = smsc75xx_wait_eeprom(dev);
	if (ret < 0)
		return ret;

	for (i = 0; i < length; i++) {

		/* Fill data register */
		val = data[i];
		ret = smsc75xx_write_reg(dev, E2P_DATA, val);
420 421 422 423
		if (ret < 0) {
			netdev_warn(dev->net, "Error writing E2P_DATA\n");
			return ret;
		}
424 425 426 427

		/* Send "write" command */
		val = E2P_CMD_BUSY | E2P_CMD_WRITE | (offset & E2P_CMD_ADDR);
		ret = smsc75xx_write_reg(dev, E2P_CMD, val);
428 429 430 431
		if (ret < 0) {
			netdev_warn(dev->net, "Error writing E2P_CMD\n");
			return ret;
		}
432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449

		ret = smsc75xx_wait_eeprom(dev);
		if (ret < 0)
			return ret;

		offset++;
	}

	return 0;
}

static int smsc75xx_dataport_wait_not_busy(struct usbnet *dev)
{
	int i, ret;

	for (i = 0; i < 100; i++) {
		u32 dp_sel;
		ret = smsc75xx_read_reg(dev, DP_SEL, &dp_sel);
450 451 452 453
		if (ret < 0) {
			netdev_warn(dev->net, "Error reading DP_SEL\n");
			return ret;
		}
454 455 456 457 458 459 460

		if (dp_sel & DP_SEL_DPRDY)
			return 0;

		udelay(40);
	}

461
	netdev_warn(dev->net, "smsc75xx_dataport_wait_not_busy timed out\n");
462 463 464 465 466 467 468 469 470 471 472 473 474 475

	return -EIO;
}

static int smsc75xx_dataport_write(struct usbnet *dev, u32 ram_select, u32 addr,
				   u32 length, u32 *buf)
{
	struct smsc75xx_priv *pdata = (struct smsc75xx_priv *)(dev->data[0]);
	u32 dp_sel;
	int i, ret;

	mutex_lock(&pdata->dataport_mutex);

	ret = smsc75xx_dataport_wait_not_busy(dev);
476 477 478 479
	if (ret < 0) {
		netdev_warn(dev->net, "smsc75xx_dataport_write busy on entry\n");
		goto done;
	}
480 481

	ret = smsc75xx_read_reg(dev, DP_SEL, &dp_sel);
482 483 484 485
	if (ret < 0) {
		netdev_warn(dev->net, "Error reading DP_SEL\n");
		goto done;
	}
486 487 488 489

	dp_sel &= ~DP_SEL_RSEL;
	dp_sel |= ram_select;
	ret = smsc75xx_write_reg(dev, DP_SEL, dp_sel);
490 491 492 493
	if (ret < 0) {
		netdev_warn(dev->net, "Error writing DP_SEL\n");
		goto done;
	}
494 495 496

	for (i = 0; i < length; i++) {
		ret = smsc75xx_write_reg(dev, DP_ADDR, addr + i);
497 498 499 500
		if (ret < 0) {
			netdev_warn(dev->net, "Error writing DP_ADDR\n");
			goto done;
		}
501 502

		ret = smsc75xx_write_reg(dev, DP_DATA, buf[i]);
503 504 505 506
		if (ret < 0) {
			netdev_warn(dev->net, "Error writing DP_DATA\n");
			goto done;
		}
507 508

		ret = smsc75xx_write_reg(dev, DP_CMD, DP_CMD_WRITE);
509 510 511 512
		if (ret < 0) {
			netdev_warn(dev->net, "Error writing DP_CMD\n");
			goto done;
		}
513 514

		ret = smsc75xx_dataport_wait_not_busy(dev);
515 516 517 518
		if (ret < 0) {
			netdev_warn(dev->net, "smsc75xx_dataport_write timeout\n");
			goto done;
		}
519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538
	}

done:
	mutex_unlock(&pdata->dataport_mutex);
	return ret;
}

/* returns hash bit number for given MAC address */
static u32 smsc75xx_hash(char addr[ETH_ALEN])
{
	return (ether_crc(ETH_ALEN, addr) >> 23) & 0x1ff;
}

static void smsc75xx_deferred_multicast_write(struct work_struct *param)
{
	struct smsc75xx_priv *pdata =
		container_of(param, struct smsc75xx_priv, set_multicast);
	struct usbnet *dev = pdata->dev;
	int ret;

539 540
	netif_dbg(dev, drv, dev->net, "deferred multicast write 0x%08x\n",
		  pdata->rfe_ctl);
541 542 543 544 545

	smsc75xx_dataport_write(dev, DP_SEL_VHF, DP_SEL_VHF_VLAN_LEN,
		DP_SEL_VHF_HASH_LEN, pdata->multicast_hash_table);

	ret = smsc75xx_write_reg(dev, RFE_CTL, pdata->rfe_ctl);
546 547
	if (ret < 0)
		netdev_warn(dev->net, "Error writing RFE_CRL\n");
548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566
}

static void smsc75xx_set_multicast(struct net_device *netdev)
{
	struct usbnet *dev = netdev_priv(netdev);
	struct smsc75xx_priv *pdata = (struct smsc75xx_priv *)(dev->data[0]);
	unsigned long flags;
	int i;

	spin_lock_irqsave(&pdata->rfe_ctl_lock, flags);

	pdata->rfe_ctl &=
		~(RFE_CTL_AU | RFE_CTL_AM | RFE_CTL_DPF | RFE_CTL_MHF);
	pdata->rfe_ctl |= RFE_CTL_AB;

	for (i = 0; i < DP_SEL_VHF_HASH_LEN; i++)
		pdata->multicast_hash_table[i] = 0;

	if (dev->net->flags & IFF_PROMISC) {
567
		netif_dbg(dev, drv, dev->net, "promiscuous mode enabled\n");
568 569
		pdata->rfe_ctl |= RFE_CTL_AM | RFE_CTL_AU;
	} else if (dev->net->flags & IFF_ALLMULTI) {
570
		netif_dbg(dev, drv, dev->net, "receive all multicast enabled\n");
571 572
		pdata->rfe_ctl |= RFE_CTL_AM | RFE_CTL_DPF;
	} else if (!netdev_mc_empty(dev->net)) {
573
		struct netdev_hw_addr *ha;
574

575
		netif_dbg(dev, drv, dev->net, "receive multicast hash filter\n");
576 577 578

		pdata->rfe_ctl |= RFE_CTL_MHF | RFE_CTL_DPF;

579 580
		netdev_for_each_mc_addr(ha, netdev) {
			u32 bitnum = smsc75xx_hash(ha->addr);
581 582 583 584
			pdata->multicast_hash_table[bitnum / 32] |=
				(1 << (bitnum % 32));
		}
	} else {
585
		netif_dbg(dev, drv, dev->net, "receive own packets only\n");
586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612
		pdata->rfe_ctl |= RFE_CTL_DPF;
	}

	spin_unlock_irqrestore(&pdata->rfe_ctl_lock, flags);

	/* defer register writes to a sleepable context */
	schedule_work(&pdata->set_multicast);
}

static int smsc75xx_update_flowcontrol(struct usbnet *dev, u8 duplex,
					    u16 lcladv, u16 rmtadv)
{
	u32 flow = 0, fct_flow = 0;
	int ret;

	if (duplex == DUPLEX_FULL) {
		u8 cap = mii_resolve_flowctrl_fdx(lcladv, rmtadv);

		if (cap & FLOW_CTRL_TX) {
			flow = (FLOW_TX_FCEN | 0xFFFF);
			/* set fct_flow thresholds to 20% and 80% */
			fct_flow = (8 << 8) | 32;
		}

		if (cap & FLOW_CTRL_RX)
			flow |= FLOW_RX_FCEN;

613 614 615
		netif_dbg(dev, link, dev->net, "rx pause %s, tx pause %s\n",
			  (cap & FLOW_CTRL_RX ? "enabled" : "disabled"),
			  (cap & FLOW_CTRL_TX ? "enabled" : "disabled"));
616
	} else {
617
		netif_dbg(dev, link, dev->net, "half duplex\n");
618 619 620
	}

	ret = smsc75xx_write_reg(dev, FLOW, flow);
621 622 623 624
	if (ret < 0) {
		netdev_warn(dev->net, "Error writing FLOW\n");
		return ret;
	}
625 626

	ret = smsc75xx_write_reg(dev, FCT_FLOW, fct_flow);
627 628 629 630
	if (ret < 0) {
		netdev_warn(dev->net, "Error writing FCT_FLOW\n");
		return ret;
	}
631 632 633 634 635 636 637

	return 0;
}

static int smsc75xx_link_reset(struct usbnet *dev)
{
	struct mii_if_info *mii = &dev->mii;
638
	struct ethtool_cmd ecmd = { .cmd = ETHTOOL_GSET };
639 640 641
	u16 lcladv, rmtadv;
	int ret;

642
	/* write to clear phy interrupt status */
643 644
	smsc75xx_mdio_write(dev->net, mii->phy_id, PHY_INT_SRC,
		PHY_INT_SRC_CLEAR_ALL);
645 646

	ret = smsc75xx_write_reg(dev, INT_STS, INT_STS_CLEAR_ALL);
647 648 649 650
	if (ret < 0) {
		netdev_warn(dev->net, "Error writing INT_STS\n");
		return ret;
	}
651 652 653 654 655 656

	mii_check_media(mii, 1, 1);
	mii_ethtool_gset(&dev->mii, &ecmd);
	lcladv = smsc75xx_mdio_read(dev->net, mii->phy_id, MII_ADVERTISE);
	rmtadv = smsc75xx_mdio_read(dev->net, mii->phy_id, MII_LPA);

657 658
	netif_dbg(dev, link, dev->net, "speed: %u duplex: %d lcladv: %04x rmtadv: %04x\n",
		  ethtool_cmd_speed(&ecmd), ecmd.duplex, lcladv, rmtadv);
659 660 661 662 663 664 665 666 667

	return smsc75xx_update_flowcontrol(dev, ecmd.duplex, lcladv, rmtadv);
}

static void smsc75xx_status(struct usbnet *dev, struct urb *urb)
{
	u32 intdata;

	if (urb->actual_length != 4) {
668 669
		netdev_warn(dev->net, "unexpected urb length %d\n",
			    urb->actual_length);
670 671 672 673 674 675
		return;
	}

	memcpy(&intdata, urb->transfer_buffer, 4);
	le32_to_cpus(&intdata);

676
	netif_dbg(dev, link, dev->net, "intdata: 0x%08X\n", intdata);
677 678 679 680

	if (intdata & INT_ENP_PHY_INT)
		usbnet_defer_kevent(dev, EVENT_LINK_RESET);
	else
681 682
		netdev_warn(dev->net, "unexpected interrupt, intdata=0x%08X\n",
			    intdata);
683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705
}

static int smsc75xx_ethtool_get_eeprom_len(struct net_device *net)
{
	return MAX_EEPROM_SIZE;
}

static int smsc75xx_ethtool_get_eeprom(struct net_device *netdev,
				       struct ethtool_eeprom *ee, u8 *data)
{
	struct usbnet *dev = netdev_priv(netdev);

	ee->magic = LAN75XX_EEPROM_MAGIC;

	return smsc75xx_read_eeprom(dev, ee->offset, ee->len, data);
}

static int smsc75xx_ethtool_set_eeprom(struct net_device *netdev,
				       struct ethtool_eeprom *ee, u8 *data)
{
	struct usbnet *dev = netdev_priv(netdev);

	if (ee->magic != LAN75XX_EEPROM_MAGIC) {
706 707
		netdev_warn(dev->net, "EEPROM: magic value mismatch: 0x%x\n",
			    ee->magic);
708 709 710 711 712 713
		return -EINVAL;
	}

	return smsc75xx_write_eeprom(dev, ee->offset, ee->len, data);
}

714 715 716 717 718 719 720 721 722 723 724 725 726 727 728
static void smsc75xx_ethtool_get_wol(struct net_device *net,
				     struct ethtool_wolinfo *wolinfo)
{
	struct usbnet *dev = netdev_priv(net);
	struct smsc75xx_priv *pdata = (struct smsc75xx_priv *)(dev->data[0]);

	wolinfo->supported = SUPPORTED_WAKE;
	wolinfo->wolopts = pdata->wolopts;
}

static int smsc75xx_ethtool_set_wol(struct net_device *net,
				    struct ethtool_wolinfo *wolinfo)
{
	struct usbnet *dev = netdev_priv(net);
	struct smsc75xx_priv *pdata = (struct smsc75xx_priv *)(dev->data[0]);
729
	int ret;
730 731

	pdata->wolopts = wolinfo->wolopts & SUPPORTED_WAKE;
732 733

	ret = device_set_wakeup_enable(&dev->udev->dev, pdata->wolopts);
734 735
	if (ret < 0)
		netdev_warn(dev->net, "device_set_wakeup_enable error %d\n", ret);
736

737
	return ret;
738 739
}

740 741 742 743 744 745 746 747 748 749 750
static const struct ethtool_ops smsc75xx_ethtool_ops = {
	.get_link	= usbnet_get_link,
	.nway_reset	= usbnet_nway_reset,
	.get_drvinfo	= usbnet_get_drvinfo,
	.get_msglevel	= usbnet_get_msglevel,
	.set_msglevel	= usbnet_set_msglevel,
	.get_settings	= usbnet_get_settings,
	.set_settings	= usbnet_set_settings,
	.get_eeprom_len	= smsc75xx_ethtool_get_eeprom_len,
	.get_eeprom	= smsc75xx_ethtool_get_eeprom,
	.set_eeprom	= smsc75xx_ethtool_set_eeprom,
751 752
	.get_wol	= smsc75xx_ethtool_get_wol,
	.set_wol	= smsc75xx_ethtool_set_wol,
753 754 755 756 757 758 759 760 761 762 763 764 765 766
};

static int smsc75xx_ioctl(struct net_device *netdev, struct ifreq *rq, int cmd)
{
	struct usbnet *dev = netdev_priv(netdev);

	if (!netif_running(netdev))
		return -EINVAL;

	return generic_mii_ioctl(&dev->mii, if_mii(rq), cmd, NULL);
}

static void smsc75xx_init_mac_address(struct usbnet *dev)
{
767 768 769 770 771 772 773 774 775
	const u8 *mac_addr;

	/* maybe the boot loader passed the MAC address in devicetree */
	mac_addr = of_get_mac_address(dev->udev->dev.of_node);
	if (mac_addr) {
		memcpy(dev->net->dev_addr, mac_addr, ETH_ALEN);
		return;
	}

776 777 778 779 780 781
	/* try reading mac address from EEPROM */
	if (smsc75xx_read_eeprom(dev, EEPROM_MAC_OFFSET, ETH_ALEN,
			dev->net->dev_addr) == 0) {
		if (is_valid_ether_addr(dev->net->dev_addr)) {
			/* eeprom values are valid so use them */
			netif_dbg(dev, ifup, dev->net,
782
				  "MAC address read from EEPROM\n");
783 784 785 786
			return;
		}
	}

787
	/* no useful static MAC address found. generate a random one */
788
	eth_hw_addr_random(dev->net);
789
	netif_dbg(dev, ifup, dev->net, "MAC address set to eth_random_addr\n");
790 791 792 793 794 795 796 797 798
}

static int smsc75xx_set_mac_address(struct usbnet *dev)
{
	u32 addr_lo = dev->net->dev_addr[0] | dev->net->dev_addr[1] << 8 |
		dev->net->dev_addr[2] << 16 | dev->net->dev_addr[3] << 24;
	u32 addr_hi = dev->net->dev_addr[4] | dev->net->dev_addr[5] << 8;

	int ret = smsc75xx_write_reg(dev, RX_ADDRH, addr_hi);
799 800 801 802
	if (ret < 0) {
		netdev_warn(dev->net, "Failed to write RX_ADDRH: %d\n", ret);
		return ret;
	}
803 804

	ret = smsc75xx_write_reg(dev, RX_ADDRL, addr_lo);
805 806 807 808
	if (ret < 0) {
		netdev_warn(dev->net, "Failed to write RX_ADDRL: %d\n", ret);
		return ret;
	}
809 810 811

	addr_hi |= ADDR_FILTX_FB_VALID;
	ret = smsc75xx_write_reg(dev, ADDR_FILTX, addr_hi);
812 813 814 815
	if (ret < 0) {
		netdev_warn(dev->net, "Failed to write ADDR_FILTX: %d\n", ret);
		return ret;
	}
816 817

	ret = smsc75xx_write_reg(dev, ADDR_FILTX + 4, addr_lo);
818 819
	if (ret < 0)
		netdev_warn(dev->net, "Failed to write ADDR_FILTX+4: %d\n", ret);
820

821
	return ret;
822 823 824 825
}

static int smsc75xx_phy_initialize(struct usbnet *dev)
{
826
	int bmcr, ret, timeout = 0;
827 828 829 830 831 832 833

	/* Initialize MII structure */
	dev->mii.dev = dev->net;
	dev->mii.mdio_read = smsc75xx_mdio_read;
	dev->mii.mdio_write = smsc75xx_mdio_write;
	dev->mii.phy_id_mask = 0x1f;
	dev->mii.reg_num_mask = 0x1f;
834
	dev->mii.supports_gmii = 1;
835 836 837 838 839 840 841 842
	dev->mii.phy_id = SMSC75XX_INTERNAL_PHY_ID;

	/* reset phy and wait for reset to complete */
	smsc75xx_mdio_write(dev->net, dev->mii.phy_id, MII_BMCR, BMCR_RESET);

	do {
		msleep(10);
		bmcr = smsc75xx_mdio_read(dev->net, dev->mii.phy_id, MII_BMCR);
843 844 845 846
		if (bmcr < 0) {
			netdev_warn(dev->net, "Error reading MII_BMCR\n");
			return bmcr;
		}
847
		timeout++;
848
	} while ((bmcr & BMCR_RESET) && (timeout < 100));
849 850

	if (timeout >= 100) {
851
		netdev_warn(dev->net, "timeout on PHY Reset\n");
852 853 854 855 856 857
		return -EIO;
	}

	smsc75xx_mdio_write(dev->net, dev->mii.phy_id, MII_ADVERTISE,
		ADVERTISE_ALL | ADVERTISE_CSMA | ADVERTISE_PAUSE_CAP |
		ADVERTISE_PAUSE_ASYM);
858 859
	smsc75xx_mdio_write(dev->net, dev->mii.phy_id, MII_CTRL1000,
		ADVERTISE_1000FULL);
860

861 862
	/* read and write to clear phy interrupt status */
	ret = smsc75xx_mdio_read(dev->net, dev->mii.phy_id, PHY_INT_SRC);
863 864 865 866 867
	if (ret < 0) {
		netdev_warn(dev->net, "Error reading PHY_INT_SRC\n");
		return ret;
	}

868
	smsc75xx_mdio_write(dev->net, dev->mii.phy_id, PHY_INT_SRC, 0xffff);
869 870 871 872 873

	smsc75xx_mdio_write(dev->net, dev->mii.phy_id, PHY_INT_MASK,
		PHY_INT_MASK_DEFAULT);
	mii_nway_restart(&dev->mii);

874
	netif_dbg(dev, ifup, dev->net, "phy initialised successfully\n");
875 876 877 878 879 880 881 882 883 884
	return 0;
}

static int smsc75xx_set_rx_max_frame_length(struct usbnet *dev, int size)
{
	int ret = 0;
	u32 buf;
	bool rxenabled;

	ret = smsc75xx_read_reg(dev, MAC_RX, &buf);
885 886 887 888
	if (ret < 0) {
		netdev_warn(dev->net, "Failed to read MAC_RX: %d\n", ret);
		return ret;
	}
889 890 891 892 893 894

	rxenabled = ((buf & MAC_RX_RXEN) != 0);

	if (rxenabled) {
		buf &= ~MAC_RX_RXEN;
		ret = smsc75xx_write_reg(dev, MAC_RX, buf);
895 896 897 898
		if (ret < 0) {
			netdev_warn(dev->net, "Failed to write MAC_RX: %d\n", ret);
			return ret;
		}
899 900 901 902 903 904 905
	}

	/* add 4 to size for FCS */
	buf &= ~MAC_RX_MAX_SIZE;
	buf |= (((size + 4) << MAC_RX_MAX_SIZE_SHIFT) & MAC_RX_MAX_SIZE);

	ret = smsc75xx_write_reg(dev, MAC_RX, buf);
906 907 908 909
	if (ret < 0) {
		netdev_warn(dev->net, "Failed to write MAC_RX: %d\n", ret);
		return ret;
	}
910 911 912 913

	if (rxenabled) {
		buf |= MAC_RX_RXEN;
		ret = smsc75xx_write_reg(dev, MAC_RX, buf);
914 915 916 917
		if (ret < 0) {
			netdev_warn(dev->net, "Failed to write MAC_RX: %d\n", ret);
			return ret;
		}
918 919 920 921 922 923 924 925
	}

	return 0;
}

static int smsc75xx_change_mtu(struct net_device *netdev, int new_mtu)
{
	struct usbnet *dev = netdev_priv(netdev);
926 927 928 929
	int ret;

	if (new_mtu > MAX_SINGLE_PACKET_SIZE)
		return -EINVAL;
930

931
	ret = smsc75xx_set_rx_max_frame_length(dev, new_mtu + ETH_HLEN);
932 933 934 935
	if (ret < 0) {
		netdev_warn(dev->net, "Failed to set mac rx frame length\n");
		return ret;
	}
936 937 938 939

	return usbnet_change_mtu(netdev, new_mtu);
}

940
/* Enable or disable Rx checksum offload engine */
941 942
static int smsc75xx_set_features(struct net_device *netdev,
	netdev_features_t features)
943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959
{
	struct usbnet *dev = netdev_priv(netdev);
	struct smsc75xx_priv *pdata = (struct smsc75xx_priv *)(dev->data[0]);
	unsigned long flags;
	int ret;

	spin_lock_irqsave(&pdata->rfe_ctl_lock, flags);

	if (features & NETIF_F_RXCSUM)
		pdata->rfe_ctl |= RFE_CTL_TCPUDP_CKM | RFE_CTL_IP_CKM;
	else
		pdata->rfe_ctl &= ~(RFE_CTL_TCPUDP_CKM | RFE_CTL_IP_CKM);

	spin_unlock_irqrestore(&pdata->rfe_ctl_lock, flags);
	/* it's racing here! */

	ret = smsc75xx_write_reg(dev, RFE_CTL, pdata->rfe_ctl);
960 961
	if (ret < 0)
		netdev_warn(dev->net, "Error writing RFE_CTL\n");
962

963
	return ret;
964 965
}

966
static int smsc75xx_wait_ready(struct usbnet *dev, int in_pm)
967 968 969 970 971
{
	int timeout = 0;

	do {
		u32 buf;
972 973 974 975
		int ret;

		ret = __smsc75xx_read_reg(dev, PMT_CTL, &buf, in_pm);

976 977 978 979
		if (ret < 0) {
			netdev_warn(dev->net, "Failed to read PMT_CTL: %d\n", ret);
			return ret;
		}
980 981 982 983 984 985 986 987

		if (buf & PMT_CTL_DEV_RDY)
			return 0;

		msleep(10);
		timeout++;
	} while (timeout < 100);

988
	netdev_warn(dev->net, "timeout waiting for device ready\n");
989 990 991
	return -EIO;
}

992 993 994 995 996 997
static int smsc75xx_reset(struct usbnet *dev)
{
	struct smsc75xx_priv *pdata = (struct smsc75xx_priv *)(dev->data[0]);
	u32 buf;
	int ret = 0, timeout;

998
	netif_dbg(dev, ifup, dev->net, "entering smsc75xx_reset\n");
999

1000
	ret = smsc75xx_wait_ready(dev, 0);
1001 1002 1003 1004
	if (ret < 0) {
		netdev_warn(dev->net, "device not ready in smsc75xx_reset\n");
		return ret;
	}
1005

1006
	ret = smsc75xx_read_reg(dev, HW_CFG, &buf);
1007 1008 1009 1010
	if (ret < 0) {
		netdev_warn(dev->net, "Failed to read HW_CFG: %d\n", ret);
		return ret;
	}
1011 1012 1013 1014

	buf |= HW_CFG_LRST;

	ret = smsc75xx_write_reg(dev, HW_CFG, buf);
1015 1016 1017 1018
	if (ret < 0) {
		netdev_warn(dev->net, "Failed to write HW_CFG: %d\n", ret);
		return ret;
	}
1019 1020 1021 1022 1023

	timeout = 0;
	do {
		msleep(10);
		ret = smsc75xx_read_reg(dev, HW_CFG, &buf);
1024 1025 1026 1027
		if (ret < 0) {
			netdev_warn(dev->net, "Failed to read HW_CFG: %d\n", ret);
			return ret;
		}
1028 1029 1030 1031
		timeout++;
	} while ((buf & HW_CFG_LRST) && (timeout < 100));

	if (timeout >= 100) {
1032
		netdev_warn(dev->net, "timeout on completion of Lite Reset\n");
1033 1034 1035
		return -EIO;
	}

1036
	netif_dbg(dev, ifup, dev->net, "Lite reset complete, resetting PHY\n");
1037 1038

	ret = smsc75xx_read_reg(dev, PMT_CTL, &buf);
1039 1040 1041 1042
	if (ret < 0) {
		netdev_warn(dev->net, "Failed to read PMT_CTL: %d\n", ret);
		return ret;
	}
1043 1044 1045 1046

	buf |= PMT_CTL_PHY_RST;

	ret = smsc75xx_write_reg(dev, PMT_CTL, buf);
1047 1048 1049 1050
	if (ret < 0) {
		netdev_warn(dev->net, "Failed to write PMT_CTL: %d\n", ret);
		return ret;
	}
1051 1052 1053 1054 1055

	timeout = 0;
	do {
		msleep(10);
		ret = smsc75xx_read_reg(dev, PMT_CTL, &buf);
1056 1057 1058 1059
		if (ret < 0) {
			netdev_warn(dev->net, "Failed to read PMT_CTL: %d\n", ret);
			return ret;
		}
1060 1061 1062 1063
		timeout++;
	} while ((buf & PMT_CTL_PHY_RST) && (timeout < 100));

	if (timeout >= 100) {
1064
		netdev_warn(dev->net, "timeout waiting for PHY Reset\n");
1065 1066 1067
		return -EIO;
	}

1068
	netif_dbg(dev, ifup, dev->net, "PHY reset complete\n");
1069 1070

	ret = smsc75xx_set_mac_address(dev);
1071 1072 1073 1074
	if (ret < 0) {
		netdev_warn(dev->net, "Failed to set mac address\n");
		return ret;
	}
1075

1076 1077
	netif_dbg(dev, ifup, dev->net, "MAC Address: %pM\n",
		  dev->net->dev_addr);
1078 1079

	ret = smsc75xx_read_reg(dev, HW_CFG, &buf);
1080 1081 1082 1083
	if (ret < 0) {
		netdev_warn(dev->net, "Failed to read HW_CFG: %d\n", ret);
		return ret;
	}
1084

1085 1086
	netif_dbg(dev, ifup, dev->net, "Read Value from HW_CFG : 0x%08x\n",
		  buf);
1087 1088 1089 1090

	buf |= HW_CFG_BIR;

	ret = smsc75xx_write_reg(dev, HW_CFG, buf);
1091 1092 1093 1094
	if (ret < 0) {
		netdev_warn(dev->net,  "Failed to write HW_CFG: %d\n", ret);
		return ret;
	}
1095 1096

	ret = smsc75xx_read_reg(dev, HW_CFG, &buf);
1097 1098 1099 1100
	if (ret < 0) {
		netdev_warn(dev->net, "Failed to read HW_CFG: %d\n", ret);
		return ret;
	}
1101

1102 1103
	netif_dbg(dev, ifup, dev->net, "Read Value from HW_CFG after writing HW_CFG_BIR: 0x%08x\n",
		  buf);
1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115

	if (!turbo_mode) {
		buf = 0;
		dev->rx_urb_size = MAX_SINGLE_PACKET_SIZE;
	} else if (dev->udev->speed == USB_SPEED_HIGH) {
		buf = DEFAULT_HS_BURST_CAP_SIZE / HS_USB_PKT_SIZE;
		dev->rx_urb_size = DEFAULT_HS_BURST_CAP_SIZE;
	} else {
		buf = DEFAULT_FS_BURST_CAP_SIZE / FS_USB_PKT_SIZE;
		dev->rx_urb_size = DEFAULT_FS_BURST_CAP_SIZE;
	}

1116 1117
	netif_dbg(dev, ifup, dev->net, "rx_urb_size=%ld\n",
		  (ulong)dev->rx_urb_size);
1118 1119

	ret = smsc75xx_write_reg(dev, BURST_CAP, buf);
1120 1121 1122 1123
	if (ret < 0) {
		netdev_warn(dev->net, "Failed to write BURST_CAP: %d\n", ret);
		return ret;
	}
1124 1125

	ret = smsc75xx_read_reg(dev, BURST_CAP, &buf);
1126 1127 1128 1129
	if (ret < 0) {
		netdev_warn(dev->net, "Failed to read BURST_CAP: %d\n", ret);
		return ret;
	}
1130 1131

	netif_dbg(dev, ifup, dev->net,
1132
		  "Read Value from BURST_CAP after writing: 0x%08x\n", buf);
1133 1134

	ret = smsc75xx_write_reg(dev, BULK_IN_DLY, DEFAULT_BULK_IN_DELAY);
1135 1136 1137 1138
	if (ret < 0) {
		netdev_warn(dev->net, "Failed to write BULK_IN_DLY: %d\n", ret);
		return ret;
	}
1139 1140

	ret = smsc75xx_read_reg(dev, BULK_IN_DLY, &buf);
1141 1142 1143 1144
	if (ret < 0) {
		netdev_warn(dev->net, "Failed to read BULK_IN_DLY: %d\n", ret);
		return ret;
	}
1145 1146

	netif_dbg(dev, ifup, dev->net,
1147
		  "Read Value from BULK_IN_DLY after writing: 0x%08x\n", buf);
1148 1149 1150

	if (turbo_mode) {
		ret = smsc75xx_read_reg(dev, HW_CFG, &buf);
1151 1152 1153 1154
		if (ret < 0) {
			netdev_warn(dev->net, "Failed to read HW_CFG: %d\n", ret);
			return ret;
		}
1155

1156
		netif_dbg(dev, ifup, dev->net, "HW_CFG: 0x%08x\n", buf);
1157 1158 1159 1160

		buf |= (HW_CFG_MEF | HW_CFG_BCE);

		ret = smsc75xx_write_reg(dev, HW_CFG, buf);
1161 1162 1163 1164
		if (ret < 0) {
			netdev_warn(dev->net, "Failed to write HW_CFG: %d\n", ret);
			return ret;
		}
1165 1166

		ret = smsc75xx_read_reg(dev, HW_CFG, &buf);
1167 1168 1169 1170
		if (ret < 0) {
			netdev_warn(dev->net, "Failed to read HW_CFG: %d\n", ret);
			return ret;
		}
1171

1172
		netif_dbg(dev, ifup, dev->net, "HW_CFG: 0x%08x\n", buf);
1173 1174 1175 1176 1177
	}

	/* set FIFO sizes */
	buf = (MAX_RX_FIFO_SIZE - 512) / 512;
	ret = smsc75xx_write_reg(dev, FCT_RX_FIFO_END, buf);
1178 1179 1180 1181
	if (ret < 0) {
		netdev_warn(dev->net, "Failed to write FCT_RX_FIFO_END: %d\n", ret);
		return ret;
	}
1182

1183
	netif_dbg(dev, ifup, dev->net, "FCT_RX_FIFO_END set to 0x%08x\n", buf);
1184 1185 1186

	buf = (MAX_TX_FIFO_SIZE - 512) / 512;
	ret = smsc75xx_write_reg(dev, FCT_TX_FIFO_END, buf);
1187 1188 1189 1190
	if (ret < 0) {
		netdev_warn(dev->net, "Failed to write FCT_TX_FIFO_END: %d\n", ret);
		return ret;
	}
1191

1192
	netif_dbg(dev, ifup, dev->net, "FCT_TX_FIFO_END set to 0x%08x\n", buf);
1193 1194

	ret = smsc75xx_write_reg(dev, INT_STS, INT_STS_CLEAR_ALL);
1195 1196 1197 1198
	if (ret < 0) {
		netdev_warn(dev->net, "Failed to write INT_STS: %d\n", ret);
		return ret;
	}
1199 1200

	ret = smsc75xx_read_reg(dev, ID_REV, &buf);
1201 1202 1203 1204
	if (ret < 0) {
		netdev_warn(dev->net, "Failed to read ID_REV: %d\n", ret);
		return ret;
	}
1205

1206
	netif_dbg(dev, ifup, dev->net, "ID_REV = 0x%08x\n", buf);
1207

1208
	ret = smsc75xx_read_reg(dev, E2P_CMD, &buf);
1209 1210 1211 1212
	if (ret < 0) {
		netdev_warn(dev->net, "Failed to read E2P_CMD: %d\n", ret);
		return ret;
	}
1213

1214 1215 1216
	/* only set default GPIO/LED settings if no EEPROM is detected */
	if (!(buf & E2P_CMD_LOADED)) {
		ret = smsc75xx_read_reg(dev, LED_GPIO_CFG, &buf);
1217 1218 1219 1220
		if (ret < 0) {
			netdev_warn(dev->net, "Failed to read LED_GPIO_CFG: %d\n", ret);
			return ret;
		}
1221

1222 1223 1224 1225
		buf &= ~(LED_GPIO_CFG_LED2_FUN_SEL | LED_GPIO_CFG_LED10_FUN_SEL);
		buf |= LED_GPIO_CFG_LEDGPIO_EN | LED_GPIO_CFG_LED2_FUN_SEL;

		ret = smsc75xx_write_reg(dev, LED_GPIO_CFG, buf);
1226 1227 1228 1229
		if (ret < 0) {
			netdev_warn(dev->net, "Failed to write LED_GPIO_CFG: %d\n", ret);
			return ret;
		}
1230
	}
1231 1232

	ret = smsc75xx_write_reg(dev, FLOW, 0);
1233 1234 1235 1236
	if (ret < 0) {
		netdev_warn(dev->net, "Failed to write FLOW: %d\n", ret);
		return ret;
	}
1237 1238

	ret = smsc75xx_write_reg(dev, FCT_FLOW, 0);
1239 1240 1241 1242
	if (ret < 0) {
		netdev_warn(dev->net, "Failed to write FCT_FLOW: %d\n", ret);
		return ret;
	}
1243 1244 1245

	/* Don't need rfe_ctl_lock during initialisation */
	ret = smsc75xx_read_reg(dev, RFE_CTL, &pdata->rfe_ctl);
1246 1247 1248 1249
	if (ret < 0) {
		netdev_warn(dev->net, "Failed to read RFE_CTL: %d\n", ret);
		return ret;
	}
1250 1251 1252 1253

	pdata->rfe_ctl |= RFE_CTL_AB | RFE_CTL_DPF;

	ret = smsc75xx_write_reg(dev, RFE_CTL, pdata->rfe_ctl);
1254 1255 1256 1257
	if (ret < 0) {
		netdev_warn(dev->net, "Failed to write RFE_CTL: %d\n", ret);
		return ret;
	}
1258 1259

	ret = smsc75xx_read_reg(dev, RFE_CTL, &pdata->rfe_ctl);
1260 1261 1262 1263
	if (ret < 0) {
		netdev_warn(dev->net, "Failed to read RFE_CTL: %d\n", ret);
		return ret;
	}
1264

1265 1266
	netif_dbg(dev, ifup, dev->net, "RFE_CTL set to 0x%08x\n",
		  pdata->rfe_ctl);
1267 1268

	/* Enable or disable checksum offload engines */
1269
	smsc75xx_set_features(dev->net, dev->net->features);
1270 1271 1272 1273

	smsc75xx_set_multicast(dev->net);

	ret = smsc75xx_phy_initialize(dev);
1274 1275 1276 1277
	if (ret < 0) {
		netdev_warn(dev->net, "Failed to initialize PHY: %d\n", ret);
		return ret;
	}
1278 1279

	ret = smsc75xx_read_reg(dev, INT_EP_CTL, &buf);
1280 1281 1282 1283
	if (ret < 0) {
		netdev_warn(dev->net, "Failed to read INT_EP_CTL: %d\n", ret);
		return ret;
	}
1284 1285 1286 1287 1288

	/* enable PHY interrupts */
	buf |= INT_ENP_PHY_INT;

	ret = smsc75xx_write_reg(dev, INT_EP_CTL, buf);
1289 1290 1291 1292
	if (ret < 0) {
		netdev_warn(dev->net, "Failed to write INT_EP_CTL: %d\n", ret);
		return ret;
	}
1293

1294 1295
	/* allow mac to detect speed and duplex from phy */
	ret = smsc75xx_read_reg(dev, MAC_CR, &buf);
1296 1297 1298 1299
	if (ret < 0) {
		netdev_warn(dev->net, "Failed to read MAC_CR: %d\n", ret);
		return ret;
	}
1300 1301 1302

	buf |= (MAC_CR_ADD | MAC_CR_ASD);
	ret = smsc75xx_write_reg(dev, MAC_CR, buf);
1303 1304 1305 1306
	if (ret < 0) {
		netdev_warn(dev->net, "Failed to write MAC_CR: %d\n", ret);
		return ret;
	}
1307

1308
	ret = smsc75xx_read_reg(dev, MAC_TX, &buf);
1309 1310 1311 1312
	if (ret < 0) {
		netdev_warn(dev->net, "Failed to read MAC_TX: %d\n", ret);
		return ret;
	}
1313 1314 1315 1316

	buf |= MAC_TX_TXEN;

	ret = smsc75xx_write_reg(dev, MAC_TX, buf);
1317 1318 1319 1320
	if (ret < 0) {
		netdev_warn(dev->net, "Failed to write MAC_TX: %d\n", ret);
		return ret;
	}
1321

1322
	netif_dbg(dev, ifup, dev->net, "MAC_TX set to 0x%08x\n", buf);
1323 1324

	ret = smsc75xx_read_reg(dev, FCT_TX_CTL, &buf);
1325 1326 1327 1328
	if (ret < 0) {
		netdev_warn(dev->net, "Failed to read FCT_TX_CTL: %d\n", ret);
		return ret;
	}
1329 1330 1331 1332

	buf |= FCT_TX_CTL_EN;

	ret = smsc75xx_write_reg(dev, FCT_TX_CTL, buf);
1333 1334 1335 1336
	if (ret < 0) {
		netdev_warn(dev->net, "Failed to write FCT_TX_CTL: %d\n", ret);
		return ret;
	}
1337

1338
	netif_dbg(dev, ifup, dev->net, "FCT_TX_CTL set to 0x%08x\n", buf);
1339

1340
	ret = smsc75xx_set_rx_max_frame_length(dev, dev->net->mtu + ETH_HLEN);
1341 1342 1343 1344
	if (ret < 0) {
		netdev_warn(dev->net, "Failed to set max rx frame length\n");
		return ret;
	}
1345 1346

	ret = smsc75xx_read_reg(dev, MAC_RX, &buf);
1347 1348 1349 1350
	if (ret < 0) {
		netdev_warn(dev->net, "Failed to read MAC_RX: %d\n", ret);
		return ret;
	}
1351 1352 1353 1354

	buf |= MAC_RX_RXEN;

	ret = smsc75xx_write_reg(dev, MAC_RX, buf);
1355 1356 1357 1358
	if (ret < 0) {
		netdev_warn(dev->net, "Failed to write MAC_RX: %d\n", ret);
		return ret;
	}
1359

1360
	netif_dbg(dev, ifup, dev->net, "MAC_RX set to 0x%08x\n", buf);
1361 1362

	ret = smsc75xx_read_reg(dev, FCT_RX_CTL, &buf);
1363 1364 1365 1366
	if (ret < 0) {
		netdev_warn(dev->net, "Failed to read FCT_RX_CTL: %d\n", ret);
		return ret;
	}
1367 1368 1369 1370

	buf |= FCT_RX_CTL_EN;

	ret = smsc75xx_write_reg(dev, FCT_RX_CTL, buf);
1371 1372 1373 1374
	if (ret < 0) {
		netdev_warn(dev->net, "Failed to write FCT_RX_CTL: %d\n", ret);
		return ret;
	}
1375

1376
	netif_dbg(dev, ifup, dev->net, "FCT_RX_CTL set to 0x%08x\n", buf);
1377

1378
	netif_dbg(dev, ifup, dev->net, "smsc75xx_reset, return 0\n");
1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390
	return 0;
}

static const struct net_device_ops smsc75xx_netdev_ops = {
	.ndo_open		= usbnet_open,
	.ndo_stop		= usbnet_stop,
	.ndo_start_xmit		= usbnet_start_xmit,
	.ndo_tx_timeout		= usbnet_tx_timeout,
	.ndo_change_mtu		= smsc75xx_change_mtu,
	.ndo_set_mac_address 	= eth_mac_addr,
	.ndo_validate_addr	= eth_validate_addr,
	.ndo_do_ioctl 		= smsc75xx_ioctl,
1391
	.ndo_set_rx_mode	= smsc75xx_set_multicast,
1392
	.ndo_set_features	= smsc75xx_set_features,
1393 1394 1395 1396 1397 1398 1399 1400 1401 1402
};

static int smsc75xx_bind(struct usbnet *dev, struct usb_interface *intf)
{
	struct smsc75xx_priv *pdata = NULL;
	int ret;

	printk(KERN_INFO SMSC_CHIPNAME " v" SMSC_DRIVER_VERSION "\n");

	ret = usbnet_get_endpoints(dev, intf);
1403 1404 1405 1406
	if (ret < 0) {
		netdev_warn(dev->net, "usbnet_get_endpoints failed: %d\n", ret);
		return ret;
	}
1407 1408

	dev->data[0] = (unsigned long)kzalloc(sizeof(struct smsc75xx_priv),
1409
					      GFP_KERNEL);
1410 1411

	pdata = (struct smsc75xx_priv *)(dev->data[0]);
1412
	if (!pdata)
1413 1414 1415 1416 1417 1418 1419 1420 1421
		return -ENOMEM;

	pdata->dev = dev;

	spin_lock_init(&pdata->rfe_ctl_lock);
	mutex_init(&pdata->dataport_mutex);

	INIT_WORK(&pdata->set_multicast, smsc75xx_deferred_multicast_write);

1422
	if (DEFAULT_TX_CSUM_ENABLE)
1423
		dev->net->features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
1424

1425 1426
	if (DEFAULT_RX_CSUM_ENABLE)
		dev->net->features |= NETIF_F_RXCSUM;
1427

1428
	dev->net->hw_features = NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
1429
				NETIF_F_RXCSUM;
1430

1431 1432 1433 1434 1435 1436 1437 1438
	ret = smsc75xx_wait_ready(dev, 0);
	if (ret < 0) {
		netdev_warn(dev->net, "device not ready in smsc75xx_bind\n");
		return ret;
	}

	smsc75xx_init_mac_address(dev);

1439 1440
	/* Init all registers */
	ret = smsc75xx_reset(dev);
1441 1442 1443 1444
	if (ret < 0) {
		netdev_warn(dev->net, "smsc75xx_reset error %d\n", ret);
		return ret;
	}
1445 1446 1447 1448 1449

	dev->net->netdev_ops = &smsc75xx_netdev_ops;
	dev->net->ethtool_ops = &smsc75xx_ethtool_ops;
	dev->net->flags |= IFF_MULTICAST;
	dev->net->hard_header_len += SMSC75XX_TX_OVERHEAD;
1450
	dev->hard_mtu = dev->net->mtu + dev->net->hard_header_len;
1451 1452 1453 1454 1455 1456 1457
	return 0;
}

static void smsc75xx_unbind(struct usbnet *dev, struct usb_interface *intf)
{
	struct smsc75xx_priv *pdata = (struct smsc75xx_priv *)(dev->data[0]);
	if (pdata) {
1458
		netif_dbg(dev, ifdown, dev->net, "free pdata\n");
1459 1460 1461 1462 1463 1464
		kfree(pdata);
		pdata = NULL;
		dev->data[0] = 0;
	}
}

1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477
static u16 smsc_crc(const u8 *buffer, size_t len)
{
	return bitrev16(crc16(0xFFFF, buffer, len));
}

static int smsc75xx_write_wuff(struct usbnet *dev, int filter, u32 wuf_cfg,
			       u32 wuf_mask1)
{
	int cfg_base = WUF_CFGX + filter * 4;
	int mask_base = WUF_MASKX + filter * 16;
	int ret;

	ret = smsc75xx_write_reg(dev, cfg_base, wuf_cfg);
1478 1479 1480 1481
	if (ret < 0) {
		netdev_warn(dev->net, "Error writing WUF_CFGX\n");
		return ret;
	}
1482 1483

	ret = smsc75xx_write_reg(dev, mask_base, wuf_mask1);
1484 1485 1486 1487
	if (ret < 0) {
		netdev_warn(dev->net, "Error writing WUF_MASKX\n");
		return ret;
	}
1488 1489

	ret = smsc75xx_write_reg(dev, mask_base + 4, 0);
1490 1491 1492 1493
	if (ret < 0) {
		netdev_warn(dev->net, "Error writing WUF_MASKX\n");
		return ret;
	}
1494 1495

	ret = smsc75xx_write_reg(dev, mask_base + 8, 0);
1496 1497 1498 1499
	if (ret < 0) {
		netdev_warn(dev->net, "Error writing WUF_MASKX\n");
		return ret;
	}
1500 1501

	ret = smsc75xx_write_reg(dev, mask_base + 12, 0);
1502 1503 1504 1505
	if (ret < 0) {
		netdev_warn(dev->net, "Error writing WUF_MASKX\n");
		return ret;
	}
1506 1507 1508 1509

	return 0;
}

1510 1511
static int smsc75xx_enter_suspend0(struct usbnet *dev)
{
1512
	struct smsc75xx_priv *pdata = (struct smsc75xx_priv *)(dev->data[0]);
1513 1514 1515 1516
	u32 val;
	int ret;

	ret = smsc75xx_read_reg_nopm(dev, PMT_CTL, &val);
1517 1518 1519 1520
	if (ret < 0) {
		netdev_warn(dev->net, "Error reading PMT_CTL\n");
		return ret;
	}
1521 1522 1523 1524 1525

	val &= (~(PMT_CTL_SUS_MODE | PMT_CTL_PHY_RST));
	val |= PMT_CTL_SUS_MODE_0 | PMT_CTL_WOL_EN | PMT_CTL_WUPS;

	ret = smsc75xx_write_reg_nopm(dev, PMT_CTL, val);
1526 1527 1528 1529
	if (ret < 0) {
		netdev_warn(dev->net, "Error writing PMT_CTL\n");
		return ret;
	}
1530

1531
	pdata->suspend_flags |= SUSPEND_SUSPEND0;
1532

1533 1534 1535
	return 0;
}

1536 1537
static int smsc75xx_enter_suspend1(struct usbnet *dev)
{
1538
	struct smsc75xx_priv *pdata = (struct smsc75xx_priv *)(dev->data[0]);
1539 1540 1541 1542
	u32 val;
	int ret;

	ret = smsc75xx_read_reg_nopm(dev, PMT_CTL, &val);
1543 1544 1545 1546
	if (ret < 0) {
		netdev_warn(dev->net, "Error reading PMT_CTL\n");
		return ret;
	}
1547 1548 1549 1550 1551

	val &= ~(PMT_CTL_SUS_MODE | PMT_CTL_WUPS | PMT_CTL_PHY_RST);
	val |= PMT_CTL_SUS_MODE_1;

	ret = smsc75xx_write_reg_nopm(dev, PMT_CTL, val);
1552 1553 1554 1555
	if (ret < 0) {
		netdev_warn(dev->net, "Error writing PMT_CTL\n");
		return ret;
	}
1556 1557 1558 1559 1560 1561

	/* clear wol status, enable energy detection */
	val &= ~PMT_CTL_WUPS;
	val |= (PMT_CTL_WUPS_ED | PMT_CTL_ED_EN);

	ret = smsc75xx_write_reg_nopm(dev, PMT_CTL, val);
1562 1563 1564 1565
	if (ret < 0) {
		netdev_warn(dev->net, "Error writing PMT_CTL\n");
		return ret;
	}
1566

1567
	pdata->suspend_flags |= SUSPEND_SUSPEND1;
1568

1569 1570 1571
	return 0;
}

1572 1573
static int smsc75xx_enter_suspend2(struct usbnet *dev)
{
1574
	struct smsc75xx_priv *pdata = (struct smsc75xx_priv *)(dev->data[0]);
1575 1576 1577 1578
	u32 val;
	int ret;

	ret = smsc75xx_read_reg_nopm(dev, PMT_CTL, &val);
1579 1580 1581 1582
	if (ret < 0) {
		netdev_warn(dev->net, "Error reading PMT_CTL\n");
		return ret;
	}
1583 1584 1585 1586 1587

	val &= ~(PMT_CTL_SUS_MODE | PMT_CTL_WUPS | PMT_CTL_PHY_RST);
	val |= PMT_CTL_SUS_MODE_2;

	ret = smsc75xx_write_reg_nopm(dev, PMT_CTL, val);
1588 1589 1590 1591
	if (ret < 0) {
		netdev_warn(dev->net, "Error writing PMT_CTL\n");
		return ret;
	}
1592

1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604
	pdata->suspend_flags |= SUSPEND_SUSPEND2;

	return 0;
}

static int smsc75xx_enter_suspend3(struct usbnet *dev)
{
	struct smsc75xx_priv *pdata = (struct smsc75xx_priv *)(dev->data[0]);
	u32 val;
	int ret;

	ret = smsc75xx_read_reg_nopm(dev, FCT_RX_CTL, &val);
1605 1606 1607 1608
	if (ret < 0) {
		netdev_warn(dev->net, "Error reading FCT_RX_CTL\n");
		return ret;
	}
1609 1610 1611 1612 1613 1614 1615

	if (val & FCT_RX_CTL_RXUSED) {
		netdev_dbg(dev->net, "rx fifo not empty in autosuspend\n");
		return -EBUSY;
	}

	ret = smsc75xx_read_reg_nopm(dev, PMT_CTL, &val);
1616 1617 1618 1619
	if (ret < 0) {
		netdev_warn(dev->net, "Error reading PMT_CTL\n");
		return ret;
	}
1620 1621 1622 1623 1624

	val &= ~(PMT_CTL_SUS_MODE | PMT_CTL_WUPS | PMT_CTL_PHY_RST);
	val |= PMT_CTL_SUS_MODE_3 | PMT_CTL_RES_CLR_WKP_EN;

	ret = smsc75xx_write_reg_nopm(dev, PMT_CTL, val);
1625 1626 1627 1628
	if (ret < 0) {
		netdev_warn(dev->net, "Error writing PMT_CTL\n");
		return ret;
	}
1629 1630 1631 1632 1633 1634

	/* clear wol status */
	val &= ~PMT_CTL_WUPS;
	val |= PMT_CTL_WUPS_WOL;

	ret = smsc75xx_write_reg_nopm(dev, PMT_CTL, val);
1635 1636 1637 1638
	if (ret < 0) {
		netdev_warn(dev->net, "Error writing PMT_CTL\n");
		return ret;
	}
1639

1640
	pdata->suspend_flags |= SUSPEND_SUSPEND3;
1641

1642 1643 1644
	return 0;
}

1645 1646 1647 1648 1649 1650 1651 1652 1653
static int smsc75xx_enable_phy_wakeup_interrupts(struct usbnet *dev, u16 mask)
{
	struct mii_if_info *mii = &dev->mii;
	int ret;

	netdev_dbg(dev->net, "enabling PHY wakeup interrupts\n");

	/* read to clear */
	ret = smsc75xx_mdio_read_nopm(dev->net, mii->phy_id, PHY_INT_SRC);
1654 1655 1656 1657
	if (ret < 0) {
		netdev_warn(dev->net, "Error reading PHY_INT_SRC\n");
		return ret;
	}
1658 1659 1660

	/* enable interrupt source */
	ret = smsc75xx_mdio_read_nopm(dev->net, mii->phy_id, PHY_INT_MASK);
1661 1662 1663 1664
	if (ret < 0) {
		netdev_warn(dev->net, "Error reading PHY_INT_MASK\n");
		return ret;
	}
1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679

	ret |= mask;

	smsc75xx_mdio_write_nopm(dev->net, mii->phy_id, PHY_INT_MASK, ret);

	return 0;
}

static int smsc75xx_link_ok_nopm(struct usbnet *dev)
{
	struct mii_if_info *mii = &dev->mii;
	int ret;

	/* first, a dummy read, needed to latch some MII phys */
	ret = smsc75xx_mdio_read_nopm(dev->net, mii->phy_id, MII_BMSR);
1680 1681 1682 1683
	if (ret < 0) {
		netdev_warn(dev->net, "Error reading MII_BMSR\n");
		return ret;
	}
1684 1685

	ret = smsc75xx_mdio_read_nopm(dev->net, mii->phy_id, MII_BMSR);
1686 1687 1688 1689
	if (ret < 0) {
		netdev_warn(dev->net, "Error reading MII_BMSR\n");
		return ret;
	}
1690 1691 1692 1693

	return !!(ret & BMSR_LSTATUS);
}

1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710
static int smsc75xx_autosuspend(struct usbnet *dev, u32 link_up)
{
	int ret;

	if (!netif_running(dev->net)) {
		/* interface is ifconfig down so fully power down hw */
		netdev_dbg(dev->net, "autosuspend entering SUSPEND2\n");
		return smsc75xx_enter_suspend2(dev);
	}

	if (!link_up) {
		/* link is down so enter EDPD mode */
		netdev_dbg(dev->net, "autosuspend entering SUSPEND1\n");

		/* enable PHY wakeup events for if cable is attached */
		ret = smsc75xx_enable_phy_wakeup_interrupts(dev,
			PHY_INT_MASK_ANEG_COMP);
1711 1712 1713 1714
		if (ret < 0) {
			netdev_warn(dev->net, "error enabling PHY wakeup ints\n");
			return ret;
		}
1715 1716 1717 1718 1719 1720 1721 1722

		netdev_info(dev->net, "entering SUSPEND1 mode\n");
		return smsc75xx_enter_suspend1(dev);
	}

	/* enable PHY wakeup events so we remote wakeup if cable is pulled */
	ret = smsc75xx_enable_phy_wakeup_interrupts(dev,
		PHY_INT_MASK_LINK_DOWN);
1723 1724 1725 1726
	if (ret < 0) {
		netdev_warn(dev->net, "error enabling PHY wakeup ints\n");
		return ret;
	}
1727 1728 1729 1730 1731

	netdev_dbg(dev->net, "autosuspend entering SUSPEND3\n");
	return smsc75xx_enter_suspend3(dev);
}

1732 1733 1734
static int smsc75xx_suspend(struct usb_interface *intf, pm_message_t message)
{
	struct usbnet *dev = usb_get_intfdata(intf);
1735
	struct smsc75xx_priv *pdata = (struct smsc75xx_priv *)(dev->data[0]);
1736
	u32 val, link_up;
1737 1738 1739
	int ret;

	ret = usbnet_suspend(intf, message);
1740 1741 1742 1743
	if (ret < 0) {
		netdev_warn(dev->net, "usbnet_suspend error\n");
		return ret;
	}
1744

1745 1746 1747 1748 1749
	if (pdata->suspend_flags) {
		netdev_warn(dev->net, "error during last resume\n");
		pdata->suspend_flags = 0;
	}

1750 1751 1752
	/* determine if link is up using only _nopm functions */
	link_up = smsc75xx_link_ok_nopm(dev);

1753 1754 1755 1756 1757 1758
	if (message.event == PM_EVENT_AUTO_SUSPEND) {
		ret = smsc75xx_autosuspend(dev, link_up);
		goto done;
	}

	/* if we get this far we're not autosuspending */
1759 1760 1761 1762 1763
	/* if no wol options set, or if link is down and we're not waking on
	 * PHY activity, enter lowest power SUSPEND2 mode
	 */
	if (!(pdata->wolopts & SUPPORTED_WAKE) ||
		!(link_up || (pdata->wolopts & WAKE_PHY))) {
1764
		netdev_info(dev->net, "entering SUSPEND2 mode\n");
1765 1766

		/* disable energy detect (link up) & wake up events */
1767
		ret = smsc75xx_read_reg_nopm(dev, WUCSR, &val);
1768 1769 1770 1771
		if (ret < 0) {
			netdev_warn(dev->net, "Error reading WUCSR\n");
			goto done;
		}
1772 1773 1774

		val &= ~(WUCSR_MPEN | WUCSR_WUEN);

1775
		ret = smsc75xx_write_reg_nopm(dev, WUCSR, val);
1776 1777 1778 1779
		if (ret < 0) {
			netdev_warn(dev->net, "Error writing WUCSR\n");
			goto done;
		}
1780

1781
		ret = smsc75xx_read_reg_nopm(dev, PMT_CTL, &val);
1782 1783 1784 1785
		if (ret < 0) {
			netdev_warn(dev->net, "Error reading PMT_CTL\n");
			goto done;
		}
1786 1787 1788

		val &= ~(PMT_CTL_ED_EN | PMT_CTL_WOL_EN);

1789
		ret = smsc75xx_write_reg_nopm(dev, PMT_CTL, val);
1790 1791 1792 1793
		if (ret < 0) {
			netdev_warn(dev->net, "Error writing PMT_CTL\n");
			goto done;
		}
1794

1795 1796
		ret = smsc75xx_enter_suspend2(dev);
		goto done;
1797 1798
	}

1799 1800 1801
	if (pdata->wolopts & WAKE_PHY) {
		ret = smsc75xx_enable_phy_wakeup_interrupts(dev,
			(PHY_INT_MASK_ANEG_COMP | PHY_INT_MASK_LINK_DOWN));
1802 1803 1804 1805
		if (ret < 0) {
			netdev_warn(dev->net, "error enabling PHY wakeup ints\n");
			goto done;
		}
1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816

		/* if link is down then configure EDPD and enter SUSPEND1,
		 * otherwise enter SUSPEND0 below
		 */
		if (!link_up) {
			struct mii_if_info *mii = &dev->mii;
			netdev_info(dev->net, "entering SUSPEND1 mode\n");

			/* enable energy detect power-down mode */
			ret = smsc75xx_mdio_read_nopm(dev->net, mii->phy_id,
				PHY_MODE_CTRL_STS);
1817 1818 1819 1820
			if (ret < 0) {
				netdev_warn(dev->net, "Error reading PHY_MODE_CTRL_STS\n");
				goto done;
			}
1821 1822 1823 1824 1825 1826 1827

			ret |= MODE_CTRL_STS_EDPWRDOWN;

			smsc75xx_mdio_write_nopm(dev->net, mii->phy_id,
				PHY_MODE_CTRL_STS, ret);

			/* enter SUSPEND1 mode */
1828 1829
			ret = smsc75xx_enter_suspend1(dev);
			goto done;
1830 1831 1832
		}
	}

1833 1834 1835 1836 1837
	if (pdata->wolopts & (WAKE_MCAST | WAKE_ARP)) {
		int i, filter = 0;

		/* disable all filters */
		for (i = 0; i < WUF_NUM; i++) {
1838
			ret = smsc75xx_write_reg_nopm(dev, WUF_CFGX + i * 4, 0);
1839 1840 1841 1842
			if (ret < 0) {
				netdev_warn(dev->net, "Error writing WUF_CFGX\n");
				goto done;
			}
1843 1844 1845 1846
		}

		if (pdata->wolopts & WAKE_MCAST) {
			const u8 mcast[] = {0x01, 0x00, 0x5E};
1847
			netdev_info(dev->net, "enabling multicast detection\n");
1848 1849 1850 1851

			val = WUF_CFGX_EN | WUF_CFGX_ATYPE_MULTICAST
				| smsc_crc(mcast, 3);
			ret = smsc75xx_write_wuff(dev, filter++, val, 0x0007);
1852 1853 1854 1855
			if (ret < 0) {
				netdev_warn(dev->net, "Error writing wakeup filter\n");
				goto done;
			}
1856 1857 1858 1859
		}

		if (pdata->wolopts & WAKE_ARP) {
			const u8 arp[] = {0x08, 0x06};
1860
			netdev_info(dev->net, "enabling ARP detection\n");
1861 1862 1863 1864

			val = WUF_CFGX_EN | WUF_CFGX_ATYPE_ALL | (0x0C << 16)
				| smsc_crc(arp, 2);
			ret = smsc75xx_write_wuff(dev, filter++, val, 0x0003);
1865 1866 1867 1868
			if (ret < 0) {
				netdev_warn(dev->net, "Error writing wakeup filter\n");
				goto done;
			}
1869 1870 1871
		}

		/* clear any pending pattern match packet status */
1872
		ret = smsc75xx_read_reg_nopm(dev, WUCSR, &val);
1873 1874 1875 1876
		if (ret < 0) {
			netdev_warn(dev->net, "Error reading WUCSR\n");
			goto done;
		}
1877 1878 1879

		val |= WUCSR_WUFR;

1880
		ret = smsc75xx_write_reg_nopm(dev, WUCSR, val);
1881 1882 1883 1884
		if (ret < 0) {
			netdev_warn(dev->net, "Error writing WUCSR\n");
			goto done;
		}
1885

1886
		netdev_info(dev->net, "enabling packet match detection\n");
1887
		ret = smsc75xx_read_reg_nopm(dev, WUCSR, &val);
1888 1889 1890 1891
		if (ret < 0) {
			netdev_warn(dev->net, "Error reading WUCSR\n");
			goto done;
		}
1892 1893 1894

		val |= WUCSR_WUEN;

1895
		ret = smsc75xx_write_reg_nopm(dev, WUCSR, val);
1896 1897 1898 1899
		if (ret < 0) {
			netdev_warn(dev->net, "Error writing WUCSR\n");
			goto done;
		}
1900
	} else {
1901
		netdev_info(dev->net, "disabling packet match detection\n");
1902
		ret = smsc75xx_read_reg_nopm(dev, WUCSR, &val);
1903 1904 1905 1906
		if (ret < 0) {
			netdev_warn(dev->net, "Error reading WUCSR\n");
			goto done;
		}
1907

1908
		val &= ~WUCSR_WUEN;
1909

1910
		ret = smsc75xx_write_reg_nopm(dev, WUCSR, val);
1911 1912 1913 1914
		if (ret < 0) {
			netdev_warn(dev->net, "Error writing WUCSR\n");
			goto done;
		}
1915 1916
	}

1917
	/* disable magic, bcast & unicast wakeup sources */
1918
	ret = smsc75xx_read_reg_nopm(dev, WUCSR, &val);
1919 1920 1921 1922
	if (ret < 0) {
		netdev_warn(dev->net, "Error reading WUCSR\n");
		goto done;
	}
1923

1924 1925
	val &= ~(WUCSR_MPEN | WUCSR_BCST_EN | WUCSR_PFDA_EN);

1926
	ret = smsc75xx_write_reg_nopm(dev, WUCSR, val);
1927 1928 1929 1930
	if (ret < 0) {
		netdev_warn(dev->net, "Error writing WUCSR\n");
		goto done;
	}
1931

1932 1933 1934 1935
	if (pdata->wolopts & WAKE_PHY) {
		netdev_info(dev->net, "enabling PHY wakeup\n");

		ret = smsc75xx_read_reg_nopm(dev, PMT_CTL, &val);
1936 1937 1938 1939
		if (ret < 0) {
			netdev_warn(dev->net, "Error reading PMT_CTL\n");
			goto done;
		}
1940 1941 1942 1943 1944 1945

		/* clear wol status, enable energy detection */
		val &= ~PMT_CTL_WUPS;
		val |= (PMT_CTL_WUPS_ED | PMT_CTL_ED_EN);

		ret = smsc75xx_write_reg_nopm(dev, PMT_CTL, val);
1946 1947 1948 1949
		if (ret < 0) {
			netdev_warn(dev->net, "Error writing PMT_CTL\n");
			goto done;
		}
1950 1951
	}

1952
	if (pdata->wolopts & WAKE_MAGIC) {
1953
		netdev_info(dev->net, "enabling magic packet wakeup\n");
1954
		ret = smsc75xx_read_reg_nopm(dev, WUCSR, &val);
1955 1956 1957 1958
		if (ret < 0) {
			netdev_warn(dev->net, "Error reading WUCSR\n");
			goto done;
		}
1959 1960 1961 1962

		/* clear any pending magic packet status */
		val |= WUCSR_MPR | WUCSR_MPEN;

1963
		ret = smsc75xx_write_reg_nopm(dev, WUCSR, val);
1964 1965 1966 1967
		if (ret < 0) {
			netdev_warn(dev->net, "Error writing WUCSR\n");
			goto done;
		}
1968 1969
	}

1970
	if (pdata->wolopts & WAKE_BCAST) {
1971
		netdev_info(dev->net, "enabling broadcast detection\n");
1972
		ret = smsc75xx_read_reg_nopm(dev, WUCSR, &val);
1973 1974 1975 1976
		if (ret < 0) {
			netdev_warn(dev->net, "Error reading WUCSR\n");
			goto done;
		}
1977

1978
		val |= WUCSR_BCAST_FR | WUCSR_BCST_EN;
1979

1980
		ret = smsc75xx_write_reg_nopm(dev, WUCSR, val);
1981 1982 1983 1984
		if (ret < 0) {
			netdev_warn(dev->net, "Error writing WUCSR\n");
			goto done;
		}
1985
	}
1986

1987
	if (pdata->wolopts & WAKE_UCAST) {
1988
		netdev_info(dev->net, "enabling unicast detection\n");
1989
		ret = smsc75xx_read_reg_nopm(dev, WUCSR, &val);
1990 1991 1992 1993
		if (ret < 0) {
			netdev_warn(dev->net, "Error reading WUCSR\n");
			goto done;
		}
1994 1995

		val |= WUCSR_WUFR | WUCSR_PFDA_EN;
1996

1997
		ret = smsc75xx_write_reg_nopm(dev, WUCSR, val);
1998 1999 2000 2001
		if (ret < 0) {
			netdev_warn(dev->net, "Error writing WUCSR\n");
			goto done;
		}
2002 2003 2004
	}

	/* enable receiver to enable frame reception */
2005
	ret = smsc75xx_read_reg_nopm(dev, MAC_RX, &val);
2006 2007 2008 2009
	if (ret < 0) {
		netdev_warn(dev->net, "Failed to read MAC_RX: %d\n", ret);
		goto done;
	}
2010 2011 2012

	val |= MAC_RX_RXEN;

2013
	ret = smsc75xx_write_reg_nopm(dev, MAC_RX, val);
2014 2015 2016 2017
	if (ret < 0) {
		netdev_warn(dev->net, "Failed to write MAC_RX: %d\n", ret);
		goto done;
	}
2018 2019

	/* some wol options are enabled, so enter SUSPEND0 */
2020
	netdev_info(dev->net, "entering SUSPEND0 mode\n");
2021 2022 2023
	ret = smsc75xx_enter_suspend0(dev);

done:
2024 2025 2026 2027 2028
	/*
	 * TODO: resume() might need to handle the suspend failure
	 * in system sleep
	 */
	if (ret && PMSG_IS_AUTO(message))
2029 2030
		usbnet_resume(intf);
	return ret;
2031 2032 2033 2034 2035
}

static int smsc75xx_resume(struct usb_interface *intf)
{
	struct usbnet *dev = usb_get_intfdata(intf);
2036
	struct smsc75xx_priv *pdata = (struct smsc75xx_priv *)(dev->data[0]);
2037
	u8 suspend_flags = pdata->suspend_flags;
2038 2039 2040
	int ret;
	u32 val;

2041
	netdev_dbg(dev->net, "resume suspend_flags=0x%02x\n", suspend_flags);
2042

2043 2044 2045 2046
	/* do this first to ensure it's cleared even in error case */
	pdata->suspend_flags = 0;

	if (suspend_flags & SUSPEND_ALLMODES) {
2047
		/* Disable wakeup sources */
2048
		ret = smsc75xx_read_reg_nopm(dev, WUCSR, &val);
2049 2050 2051 2052
		if (ret < 0) {
			netdev_warn(dev->net, "Error reading WUCSR\n");
			return ret;
		}
2053

2054 2055
		val &= ~(WUCSR_WUEN | WUCSR_MPEN | WUCSR_PFDA_EN
			| WUCSR_BCST_EN);
2056

2057
		ret = smsc75xx_write_reg_nopm(dev, WUCSR, val);
2058 2059 2060 2061
		if (ret < 0) {
			netdev_warn(dev->net, "Error writing WUCSR\n");
			return ret;
		}
2062 2063

		/* clear wake-up status */
2064
		ret = smsc75xx_read_reg_nopm(dev, PMT_CTL, &val);
2065 2066 2067 2068
		if (ret < 0) {
			netdev_warn(dev->net, "Error reading PMT_CTL\n");
			return ret;
		}
2069 2070 2071 2072

		val &= ~PMT_CTL_WOL_EN;
		val |= PMT_CTL_WUPS;

2073
		ret = smsc75xx_write_reg_nopm(dev, PMT_CTL, val);
2074 2075 2076 2077
		if (ret < 0) {
			netdev_warn(dev->net, "Error writing PMT_CTL\n");
			return ret;
		}
2078 2079 2080
	}

	if (suspend_flags & SUSPEND_SUSPEND2) {
2081
		netdev_info(dev->net, "resuming from SUSPEND2\n");
2082

2083
		ret = smsc75xx_read_reg_nopm(dev, PMT_CTL, &val);
2084 2085 2086 2087
		if (ret < 0) {
			netdev_warn(dev->net, "Error reading PMT_CTL\n");
			return ret;
		}
2088 2089 2090

		val |= PMT_CTL_PHY_PWRUP;

2091
		ret = smsc75xx_write_reg_nopm(dev, PMT_CTL, val);
2092 2093 2094 2095
		if (ret < 0) {
			netdev_warn(dev->net, "Error writing PMT_CTL\n");
			return ret;
		}
2096
	}
2097

2098
	ret = smsc75xx_wait_ready(dev, 1);
2099 2100 2101 2102
	if (ret < 0) {
		netdev_warn(dev->net, "device not ready in smsc75xx_resume\n");
		return ret;
	}
2103 2104 2105 2106

	return usbnet_resume(intf);
}

2107 2108
static void smsc75xx_rx_csum_offload(struct usbnet *dev, struct sk_buff *skb,
				     u32 rx_cmd_a, u32 rx_cmd_b)
2109
{
2110 2111
	if (!(dev->net->features & NETIF_F_RXCSUM) ||
	    unlikely(rx_cmd_a & RX_CMD_A_LCSM)) {
2112 2113 2114 2115 2116 2117 2118 2119 2120
		skb->ip_summed = CHECKSUM_NONE;
	} else {
		skb->csum = ntohs((u16)(rx_cmd_b >> RX_CMD_B_CSUM_SHIFT));
		skb->ip_summed = CHECKSUM_COMPLETE;
	}
}

static int smsc75xx_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
{
2121 2122 2123 2124
	/* This check is no longer done by usbnet */
	if (skb->len < dev->net->hard_header_len)
		return 0;

2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135
	while (skb->len > 0) {
		u32 rx_cmd_a, rx_cmd_b, align_count, size;
		struct sk_buff *ax_skb;
		unsigned char *packet;

		memcpy(&rx_cmd_a, skb->data, sizeof(rx_cmd_a));
		le32_to_cpus(&rx_cmd_a);
		skb_pull(skb, 4);

		memcpy(&rx_cmd_b, skb->data, sizeof(rx_cmd_b));
		le32_to_cpus(&rx_cmd_b);
2136
		skb_pull(skb, 4 + RXW_PADDING);
2137 2138 2139 2140

		packet = skb->data;

		/* get the packet length */
2141 2142
		size = (rx_cmd_a & RX_CMD_A_LEN) - RXW_PADDING;
		align_count = (4 - ((size + RXW_PADDING) % 4)) % 4;
2143 2144 2145

		if (unlikely(rx_cmd_a & RX_CMD_A_RED)) {
			netif_dbg(dev, rx_err, dev->net,
2146
				  "Error rx_cmd_a=0x%08x\n", rx_cmd_a);
2147 2148 2149 2150 2151 2152 2153 2154
			dev->net->stats.rx_errors++;
			dev->net->stats.rx_dropped++;

			if (rx_cmd_a & RX_CMD_A_FCS)
				dev->net->stats.rx_crc_errors++;
			else if (rx_cmd_a & (RX_CMD_A_LONG | RX_CMD_A_RUNT))
				dev->net->stats.rx_frame_errors++;
		} else {
2155 2156
			/* MAX_SINGLE_PACKET_SIZE + 4(CRC) + 2(COE) + 4(Vlan) */
			if (unlikely(size > (MAX_SINGLE_PACKET_SIZE + ETH_HLEN + 12))) {
2157
				netif_dbg(dev, rx_err, dev->net,
2158 2159
					  "size err rx_cmd_a=0x%08x\n",
					  rx_cmd_a);
2160 2161 2162 2163 2164
				return 0;
			}

			/* last frame in this batch */
			if (skb->len == size) {
2165 2166
				smsc75xx_rx_csum_offload(dev, skb, rx_cmd_a,
					rx_cmd_b);
2167 2168 2169 2170 2171 2172 2173 2174 2175

				skb_trim(skb, skb->len - 4); /* remove fcs */
				skb->truesize = size + sizeof(struct sk_buff);

				return 1;
			}

			ax_skb = skb_clone(skb, GFP_ATOMIC);
			if (unlikely(!ax_skb)) {
2176
				netdev_warn(dev->net, "Error allocating skb\n");
2177 2178 2179 2180 2181 2182 2183
				return 0;
			}

			ax_skb->len = size;
			ax_skb->data = packet;
			skb_set_tail_pointer(ax_skb, size);

2184 2185
			smsc75xx_rx_csum_offload(dev, ax_skb, rx_cmd_a,
				rx_cmd_b);
2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207

			skb_trim(ax_skb, ax_skb->len - 4); /* remove fcs */
			ax_skb->truesize = size + sizeof(struct sk_buff);

			usbnet_skb_return(dev, ax_skb);
		}

		skb_pull(skb, size);

		/* padding bytes before the next frame starts */
		if (skb->len)
			skb_pull(skb, align_count);
	}

	return 1;
}

static struct sk_buff *smsc75xx_tx_fixup(struct usbnet *dev,
					 struct sk_buff *skb, gfp_t flags)
{
	u32 tx_cmd_a, tx_cmd_b;

2208
	if (skb_cow_head(skb, SMSC75XX_TX_OVERHEAD)) {
2209
		dev_kfree_skb_any(skb);
2210
		return NULL;
2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237
	}

	tx_cmd_a = (u32)(skb->len & TX_CMD_A_LEN) | TX_CMD_A_FCS;

	if (skb->ip_summed == CHECKSUM_PARTIAL)
		tx_cmd_a |= TX_CMD_A_IPE | TX_CMD_A_TPE;

	if (skb_is_gso(skb)) {
		u16 mss = max(skb_shinfo(skb)->gso_size, TX_MSS_MIN);
		tx_cmd_b = (mss << TX_CMD_B_MSS_SHIFT) & TX_CMD_B_MSS;

		tx_cmd_a |= TX_CMD_A_LSO;
	} else {
		tx_cmd_b = 0;
	}

	skb_push(skb, 4);
	cpu_to_le32s(&tx_cmd_b);
	memcpy(skb->data, &tx_cmd_b, 4);

	skb_push(skb, 4);
	cpu_to_le32s(&tx_cmd_a);
	memcpy(skb->data, &tx_cmd_a, 4);

	return skb;
}

2238 2239 2240 2241 2242 2243
static int smsc75xx_manage_power(struct usbnet *dev, int on)
{
	dev->intf->needs_remote_wakeup = on;
	return 0;
}

2244 2245 2246 2247 2248 2249 2250 2251 2252
static const struct driver_info smsc75xx_info = {
	.description	= "smsc75xx USB 2.0 Gigabit Ethernet",
	.bind		= smsc75xx_bind,
	.unbind		= smsc75xx_unbind,
	.link_reset	= smsc75xx_link_reset,
	.reset		= smsc75xx_reset,
	.rx_fixup	= smsc75xx_rx_fixup,
	.tx_fixup	= smsc75xx_tx_fixup,
	.status		= smsc75xx_status,
2253
	.manage_power	= smsc75xx_manage_power,
2254
	.flags		= FLAG_ETHER | FLAG_SEND_ZLP | FLAG_LINK_INTR,
2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275
};

static const struct usb_device_id products[] = {
	{
		/* SMSC7500 USB Gigabit Ethernet Device */
		USB_DEVICE(USB_VENDOR_ID_SMSC, USB_PRODUCT_ID_LAN7500),
		.driver_info = (unsigned long) &smsc75xx_info,
	},
	{
		/* SMSC7500 USB Gigabit Ethernet Device */
		USB_DEVICE(USB_VENDOR_ID_SMSC, USB_PRODUCT_ID_LAN7505),
		.driver_info = (unsigned long) &smsc75xx_info,
	},
	{ },		/* END */
};
MODULE_DEVICE_TABLE(usb, products);

static struct usb_driver smsc75xx_driver = {
	.name		= SMSC_CHIPNAME,
	.id_table	= products,
	.probe		= usbnet_probe,
2276 2277 2278
	.suspend	= smsc75xx_suspend,
	.resume		= smsc75xx_resume,
	.reset_resume	= smsc75xx_resume,
2279
	.disconnect	= usbnet_disconnect,
2280
	.disable_hub_initiated_lpm = 1,
2281
	.supports_autosuspend = 1,
2282 2283
};

2284
module_usb_driver(smsc75xx_driver);
2285 2286

MODULE_AUTHOR("Nancy Lin");
2287
MODULE_AUTHOR("Steve Glendinning <steve.glendinning@shawell.net>");
2288 2289
MODULE_DESCRIPTION("SMSC75XX USB 2.0 Gigabit Ethernet Devices");
MODULE_LICENSE("GPL");