cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

sr9800.c (21015B)


      1/* CoreChip-sz SR9800 one chip USB 2.0 Ethernet Devices
      2 *
      3 * Author : Liu Junliang <liujunliang_ljl@163.com>
      4 *
      5 * Based on asix_common.c, asix_devices.c
      6 *
      7 * This file is licensed under the terms of the GNU General Public License
      8 * version 2.  This program is licensed "as is" without any warranty of any
      9 * kind, whether express or implied.*
     10 */
     11
     12#include <linux/module.h>
     13#include <linux/kmod.h>
     14#include <linux/init.h>
     15#include <linux/netdevice.h>
     16#include <linux/etherdevice.h>
     17#include <linux/ethtool.h>
     18#include <linux/workqueue.h>
     19#include <linux/mii.h>
     20#include <linux/usb.h>
     21#include <linux/crc32.h>
     22#include <linux/usb/usbnet.h>
     23#include <linux/slab.h>
     24#include <linux/if_vlan.h>
     25
     26#include "sr9800.h"
     27
     28static int sr_read_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index,
     29			    u16 size, void *data)
     30{
     31	int err;
     32
     33	err = usbnet_read_cmd(dev, cmd, SR_REQ_RD_REG, value, index,
     34			      data, size);
     35	if ((err != size) && (err >= 0))
     36		err = -EINVAL;
     37
     38	return err;
     39}
     40
     41static int sr_write_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index,
     42			     u16 size, void *data)
     43{
     44	int err;
     45
     46	err = usbnet_write_cmd(dev, cmd, SR_REQ_WR_REG, value, index,
     47			      data, size);
     48	if ((err != size) && (err >= 0))
     49		err = -EINVAL;
     50
     51	return err;
     52}
     53
     54static void
     55sr_write_cmd_async(struct usbnet *dev, u8 cmd, u16 value, u16 index,
     56		   u16 size, void *data)
     57{
     58	usbnet_write_cmd_async(dev, cmd, SR_REQ_WR_REG, value, index, data,
     59			       size);
     60}
     61
     62static int sr_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
     63{
     64	int offset = 0;
     65
     66	/* This check is no longer done by usbnet */
     67	if (skb->len < dev->net->hard_header_len)
     68		return 0;
     69
     70	while (offset + sizeof(u32) < skb->len) {
     71		struct sk_buff *sr_skb;
     72		u16 size;
     73		u32 header = get_unaligned_le32(skb->data + offset);
     74
     75		offset += sizeof(u32);
     76		/* get the packet length */
     77		size = (u16) (header & 0x7ff);
     78		if (size != ((~header >> 16) & 0x07ff)) {
     79			netdev_err(dev->net, "%s : Bad Header Length\n",
     80				   __func__);
     81			return 0;
     82		}
     83
     84		if ((size > dev->net->mtu + ETH_HLEN + VLAN_HLEN) ||
     85		    (size + offset > skb->len)) {
     86			netdev_err(dev->net, "%s : Bad RX Length %d\n",
     87				   __func__, size);
     88			return 0;
     89		}
     90		sr_skb = netdev_alloc_skb_ip_align(dev->net, size);
     91		if (!sr_skb)
     92			return 0;
     93
     94		skb_put(sr_skb, size);
     95		memcpy(sr_skb->data, skb->data + offset, size);
     96		usbnet_skb_return(dev, sr_skb);
     97
     98		offset += (size + 1) & 0xfffe;
     99	}
    100
    101	if (skb->len != offset) {
    102		netdev_err(dev->net, "%s : Bad SKB Length %d\n", __func__,
    103			   skb->len);
    104		return 0;
    105	}
    106
    107	return 1;
    108}
    109
    110static struct sk_buff *sr_tx_fixup(struct usbnet *dev, struct sk_buff *skb,
    111					gfp_t flags)
    112{
    113	int headroom = skb_headroom(skb);
    114	int tailroom = skb_tailroom(skb);
    115	u32 padbytes = 0xffff0000;
    116	u32 packet_len;
    117	int padlen;
    118	void *ptr;
    119
    120	padlen = ((skb->len + 4) % (dev->maxpacket - 1)) ? 0 : 4;
    121
    122	if ((!skb_cloned(skb)) && ((headroom + tailroom) >= (4 + padlen))) {
    123		if ((headroom < 4) || (tailroom < padlen)) {
    124			skb->data = memmove(skb->head + 4, skb->data,
    125					    skb->len);
    126			skb_set_tail_pointer(skb, skb->len);
    127		}
    128	} else {
    129		struct sk_buff *skb2;
    130		skb2 = skb_copy_expand(skb, 4, padlen, flags);
    131		dev_kfree_skb_any(skb);
    132		skb = skb2;
    133		if (!skb)
    134			return NULL;
    135	}
    136
    137	ptr = skb_push(skb, 4);
    138	packet_len = (((skb->len - 4) ^ 0x0000ffff) << 16) + (skb->len - 4);
    139	put_unaligned_le32(packet_len, ptr);
    140
    141	if (padlen) {
    142		put_unaligned_le32(padbytes, skb_tail_pointer(skb));
    143		skb_put(skb, sizeof(padbytes));
    144	}
    145
    146	usbnet_set_skb_tx_stats(skb, 1, 0);
    147	return skb;
    148}
    149
    150static void sr_status(struct usbnet *dev, struct urb *urb)
    151{
    152	struct sr9800_int_data *event;
    153	int link;
    154
    155	if (urb->actual_length < 8)
    156		return;
    157
    158	event = urb->transfer_buffer;
    159	link = event->link & 0x01;
    160	if (netif_carrier_ok(dev->net) != link) {
    161		usbnet_link_change(dev, link, 1);
    162		netdev_dbg(dev->net, "Link Status is: %d\n", link);
    163	}
    164
    165	return;
    166}
    167
    168static inline int sr_set_sw_mii(struct usbnet *dev)
    169{
    170	int ret;
    171
    172	ret = sr_write_cmd(dev, SR_CMD_SET_SW_MII, 0x0000, 0, 0, NULL);
    173	if (ret < 0)
    174		netdev_err(dev->net, "Failed to enable software MII access\n");
    175	return ret;
    176}
    177
    178static inline int sr_set_hw_mii(struct usbnet *dev)
    179{
    180	int ret;
    181
    182	ret = sr_write_cmd(dev, SR_CMD_SET_HW_MII, 0x0000, 0, 0, NULL);
    183	if (ret < 0)
    184		netdev_err(dev->net, "Failed to enable hardware MII access\n");
    185	return ret;
    186}
    187
    188static inline int sr_get_phy_addr(struct usbnet *dev)
    189{
    190	u8 buf[2];
    191	int ret;
    192
    193	ret = sr_read_cmd(dev, SR_CMD_READ_PHY_ID, 0, 0, 2, buf);
    194	if (ret < 0) {
    195		netdev_err(dev->net, "%s : Error reading PHYID register:%02x\n",
    196			   __func__, ret);
    197		goto out;
    198	}
    199	netdev_dbg(dev->net, "%s : returning 0x%04x\n", __func__,
    200		   *((__le16 *)buf));
    201
    202	ret = buf[1];
    203
    204out:
    205	return ret;
    206}
    207
    208static int sr_sw_reset(struct usbnet *dev, u8 flags)
    209{
    210	int ret;
    211
    212	ret = sr_write_cmd(dev, SR_CMD_SW_RESET, flags, 0, 0, NULL);
    213	if (ret < 0)
    214		netdev_err(dev->net, "Failed to send software reset:%02x\n",
    215			   ret);
    216
    217	return ret;
    218}
    219
    220static u16 sr_read_rx_ctl(struct usbnet *dev)
    221{
    222	__le16 v;
    223	int ret;
    224
    225	ret = sr_read_cmd(dev, SR_CMD_READ_RX_CTL, 0, 0, 2, &v);
    226	if (ret < 0) {
    227		netdev_err(dev->net, "Error reading RX_CTL register:%02x\n",
    228			   ret);
    229		goto out;
    230	}
    231
    232	ret = le16_to_cpu(v);
    233out:
    234	return ret;
    235}
    236
    237static int sr_write_rx_ctl(struct usbnet *dev, u16 mode)
    238{
    239	int ret;
    240
    241	netdev_dbg(dev->net, "%s : mode = 0x%04x\n", __func__, mode);
    242	ret = sr_write_cmd(dev, SR_CMD_WRITE_RX_CTL, mode, 0, 0, NULL);
    243	if (ret < 0)
    244		netdev_err(dev->net,
    245			   "Failed to write RX_CTL mode to 0x%04x:%02x\n",
    246			   mode, ret);
    247
    248	return ret;
    249}
    250
    251static u16 sr_read_medium_status(struct usbnet *dev)
    252{
    253	__le16 v;
    254	int ret;
    255
    256	ret = sr_read_cmd(dev, SR_CMD_READ_MEDIUM_STATUS, 0, 0, 2, &v);
    257	if (ret < 0) {
    258		netdev_err(dev->net,
    259			   "Error reading Medium Status register:%02x\n", ret);
    260		return ret;	/* TODO: callers not checking for error ret */
    261	}
    262
    263	return le16_to_cpu(v);
    264}
    265
    266static int sr_write_medium_mode(struct usbnet *dev, u16 mode)
    267{
    268	int ret;
    269
    270	netdev_dbg(dev->net, "%s : mode = 0x%04x\n", __func__, mode);
    271	ret = sr_write_cmd(dev, SR_CMD_WRITE_MEDIUM_MODE, mode, 0, 0, NULL);
    272	if (ret < 0)
    273		netdev_err(dev->net,
    274			   "Failed to write Medium Mode mode to 0x%04x:%02x\n",
    275			   mode, ret);
    276	return ret;
    277}
    278
    279static int sr_write_gpio(struct usbnet *dev, u16 value, int sleep)
    280{
    281	int ret;
    282
    283	netdev_dbg(dev->net, "%s : value = 0x%04x\n", __func__, value);
    284	ret = sr_write_cmd(dev, SR_CMD_WRITE_GPIOS, value, 0, 0, NULL);
    285	if (ret < 0)
    286		netdev_err(dev->net, "Failed to write GPIO value 0x%04x:%02x\n",
    287			   value, ret);
    288	if (sleep)
    289		msleep(sleep);
    290
    291	return ret;
    292}
    293
    294/* SR9800 have a 16-bit RX_CTL value */
    295static void sr_set_multicast(struct net_device *net)
    296{
    297	struct usbnet *dev = netdev_priv(net);
    298	struct sr_data *data = (struct sr_data *)&dev->data;
    299	u16 rx_ctl = SR_DEFAULT_RX_CTL;
    300
    301	if (net->flags & IFF_PROMISC) {
    302		rx_ctl |= SR_RX_CTL_PRO;
    303	} else if (net->flags & IFF_ALLMULTI ||
    304		   netdev_mc_count(net) > SR_MAX_MCAST) {
    305		rx_ctl |= SR_RX_CTL_AMALL;
    306	} else if (netdev_mc_empty(net)) {
    307		/* just broadcast and directed */
    308	} else {
    309		/* We use the 20 byte dev->data
    310		 * for our 8 byte filter buffer
    311		 * to avoid allocating memory that
    312		 * is tricky to free later
    313		 */
    314		struct netdev_hw_addr *ha;
    315		u32 crc_bits;
    316
    317		memset(data->multi_filter, 0, SR_MCAST_FILTER_SIZE);
    318
    319		/* Build the multicast hash filter. */
    320		netdev_for_each_mc_addr(ha, net) {
    321			crc_bits = ether_crc(ETH_ALEN, ha->addr) >> 26;
    322			data->multi_filter[crc_bits >> 3] |=
    323			    1 << (crc_bits & 7);
    324		}
    325
    326		sr_write_cmd_async(dev, SR_CMD_WRITE_MULTI_FILTER, 0, 0,
    327				   SR_MCAST_FILTER_SIZE, data->multi_filter);
    328
    329		rx_ctl |= SR_RX_CTL_AM;
    330	}
    331
    332	sr_write_cmd_async(dev, SR_CMD_WRITE_RX_CTL, rx_ctl, 0, 0, NULL);
    333}
    334
    335static int sr_mdio_read(struct net_device *net, int phy_id, int loc)
    336{
    337	struct usbnet *dev = netdev_priv(net);
    338	__le16 res = 0;
    339
    340	mutex_lock(&dev->phy_mutex);
    341	sr_set_sw_mii(dev);
    342	sr_read_cmd(dev, SR_CMD_READ_MII_REG, phy_id, (__u16)loc, 2, &res);
    343	sr_set_hw_mii(dev);
    344	mutex_unlock(&dev->phy_mutex);
    345
    346	netdev_dbg(dev->net,
    347		   "%s : phy_id=0x%02x, loc=0x%02x, returns=0x%04x\n", __func__,
    348		   phy_id, loc, le16_to_cpu(res));
    349
    350	return le16_to_cpu(res);
    351}
    352
    353static void
    354sr_mdio_write(struct net_device *net, int phy_id, int loc, int val)
    355{
    356	struct usbnet *dev = netdev_priv(net);
    357	__le16 res = cpu_to_le16(val);
    358
    359	netdev_dbg(dev->net,
    360		   "%s : phy_id=0x%02x, loc=0x%02x, val=0x%04x\n", __func__,
    361		   phy_id, loc, val);
    362	mutex_lock(&dev->phy_mutex);
    363	sr_set_sw_mii(dev);
    364	sr_write_cmd(dev, SR_CMD_WRITE_MII_REG, phy_id, (__u16)loc, 2, &res);
    365	sr_set_hw_mii(dev);
    366	mutex_unlock(&dev->phy_mutex);
    367}
    368
    369/* Get the PHY Identifier from the PHYSID1 & PHYSID2 MII registers */
    370static u32 sr_get_phyid(struct usbnet *dev)
    371{
    372	int phy_reg;
    373	u32 phy_id;
    374	int i;
    375
    376	/* Poll for the rare case the FW or phy isn't ready yet.  */
    377	for (i = 0; i < 100; i++) {
    378		phy_reg = sr_mdio_read(dev->net, dev->mii.phy_id, MII_PHYSID1);
    379		if (phy_reg != 0 && phy_reg != 0xFFFF)
    380			break;
    381		mdelay(1);
    382	}
    383
    384	if (phy_reg <= 0 || phy_reg == 0xFFFF)
    385		return 0;
    386
    387	phy_id = (phy_reg & 0xffff) << 16;
    388
    389	phy_reg = sr_mdio_read(dev->net, dev->mii.phy_id, MII_PHYSID2);
    390	if (phy_reg < 0)
    391		return 0;
    392
    393	phy_id |= (phy_reg & 0xffff);
    394
    395	return phy_id;
    396}
    397
    398static void
    399sr_get_wol(struct net_device *net, struct ethtool_wolinfo *wolinfo)
    400{
    401	struct usbnet *dev = netdev_priv(net);
    402	u8 opt;
    403
    404	if (sr_read_cmd(dev, SR_CMD_READ_MONITOR_MODE, 0, 0, 1, &opt) < 0) {
    405		wolinfo->supported = 0;
    406		wolinfo->wolopts = 0;
    407		return;
    408	}
    409	wolinfo->supported = WAKE_PHY | WAKE_MAGIC;
    410	wolinfo->wolopts = 0;
    411	if (opt & SR_MONITOR_LINK)
    412		wolinfo->wolopts |= WAKE_PHY;
    413	if (opt & SR_MONITOR_MAGIC)
    414		wolinfo->wolopts |= WAKE_MAGIC;
    415}
    416
    417static int
    418sr_set_wol(struct net_device *net, struct ethtool_wolinfo *wolinfo)
    419{
    420	struct usbnet *dev = netdev_priv(net);
    421	u8 opt = 0;
    422
    423	if (wolinfo->wolopts & ~(WAKE_PHY | WAKE_MAGIC))
    424		return -EINVAL;
    425
    426	if (wolinfo->wolopts & WAKE_PHY)
    427		opt |= SR_MONITOR_LINK;
    428	if (wolinfo->wolopts & WAKE_MAGIC)
    429		opt |= SR_MONITOR_MAGIC;
    430
    431	if (sr_write_cmd(dev, SR_CMD_WRITE_MONITOR_MODE,
    432			 opt, 0, 0, NULL) < 0)
    433		return -EINVAL;
    434
    435	return 0;
    436}
    437
    438static int sr_get_eeprom_len(struct net_device *net)
    439{
    440	struct usbnet *dev = netdev_priv(net);
    441	struct sr_data *data = (struct sr_data *)&dev->data;
    442
    443	return data->eeprom_len;
    444}
    445
    446static int sr_get_eeprom(struct net_device *net,
    447			      struct ethtool_eeprom *eeprom, u8 *data)
    448{
    449	struct usbnet *dev = netdev_priv(net);
    450	__le16 *ebuf = (__le16 *)data;
    451	int ret;
    452	int i;
    453
    454	/* Crude hack to ensure that we don't overwrite memory
    455	 * if an odd length is supplied
    456	 */
    457	if (eeprom->len % 2)
    458		return -EINVAL;
    459
    460	eeprom->magic = SR_EEPROM_MAGIC;
    461
    462	/* sr9800 returns 2 bytes from eeprom on read */
    463	for (i = 0; i < eeprom->len / 2; i++) {
    464		ret = sr_read_cmd(dev, SR_CMD_READ_EEPROM, eeprom->offset + i,
    465				  0, 2, &ebuf[i]);
    466		if (ret < 0)
    467			return -EINVAL;
    468	}
    469	return 0;
    470}
    471
    472static void sr_get_drvinfo(struct net_device *net,
    473				 struct ethtool_drvinfo *info)
    474{
    475	/* Inherit standard device info */
    476	usbnet_get_drvinfo(net, info);
    477	strncpy(info->driver, DRIVER_NAME, sizeof(info->driver));
    478	strncpy(info->version, DRIVER_VERSION, sizeof(info->version));
    479}
    480
    481static u32 sr_get_link(struct net_device *net)
    482{
    483	struct usbnet *dev = netdev_priv(net);
    484
    485	return mii_link_ok(&dev->mii);
    486}
    487
    488static int sr_ioctl(struct net_device *net, struct ifreq *rq, int cmd)
    489{
    490	struct usbnet *dev = netdev_priv(net);
    491
    492	return generic_mii_ioctl(&dev->mii, if_mii(rq), cmd, NULL);
    493}
    494
    495static int sr_set_mac_address(struct net_device *net, void *p)
    496{
    497	struct usbnet *dev = netdev_priv(net);
    498	struct sr_data *data = (struct sr_data *)&dev->data;
    499	struct sockaddr *addr = p;
    500
    501	if (netif_running(net))
    502		return -EBUSY;
    503	if (!is_valid_ether_addr(addr->sa_data))
    504		return -EADDRNOTAVAIL;
    505
    506	eth_hw_addr_set(net, addr->sa_data);
    507
    508	/* We use the 20 byte dev->data
    509	 * for our 6 byte mac buffer
    510	 * to avoid allocating memory that
    511	 * is tricky to free later
    512	 */
    513	memcpy(data->mac_addr, addr->sa_data, ETH_ALEN);
    514	sr_write_cmd_async(dev, SR_CMD_WRITE_NODE_ID, 0, 0, ETH_ALEN,
    515			   data->mac_addr);
    516
    517	return 0;
    518}
    519
    520static const struct ethtool_ops sr9800_ethtool_ops = {
    521	.get_drvinfo	= sr_get_drvinfo,
    522	.get_link	= sr_get_link,
    523	.get_msglevel	= usbnet_get_msglevel,
    524	.set_msglevel	= usbnet_set_msglevel,
    525	.get_wol	= sr_get_wol,
    526	.set_wol	= sr_set_wol,
    527	.get_eeprom_len	= sr_get_eeprom_len,
    528	.get_eeprom	= sr_get_eeprom,
    529	.nway_reset	= usbnet_nway_reset,
    530	.get_link_ksettings	= usbnet_get_link_ksettings_mii,
    531	.set_link_ksettings	= usbnet_set_link_ksettings_mii,
    532};
    533
    534static int sr9800_link_reset(struct usbnet *dev)
    535{
    536	struct ethtool_cmd ecmd = { .cmd = ETHTOOL_GSET };
    537	u16 mode;
    538
    539	mii_check_media(&dev->mii, 1, 1);
    540	mii_ethtool_gset(&dev->mii, &ecmd);
    541	mode = SR9800_MEDIUM_DEFAULT;
    542
    543	if (ethtool_cmd_speed(&ecmd) != SPEED_100)
    544		mode &= ~SR_MEDIUM_PS;
    545
    546	if (ecmd.duplex != DUPLEX_FULL)
    547		mode &= ~SR_MEDIUM_FD;
    548
    549	netdev_dbg(dev->net, "%s : speed: %u duplex: %d mode: 0x%04x\n",
    550		   __func__, ethtool_cmd_speed(&ecmd), ecmd.duplex, mode);
    551
    552	sr_write_medium_mode(dev, mode);
    553
    554	return 0;
    555}
    556
    557
    558static int sr9800_set_default_mode(struct usbnet *dev)
    559{
    560	u16 rx_ctl;
    561	int ret;
    562
    563	sr_mdio_write(dev->net, dev->mii.phy_id, MII_BMCR, BMCR_RESET);
    564	sr_mdio_write(dev->net, dev->mii.phy_id, MII_ADVERTISE,
    565		      ADVERTISE_ALL | ADVERTISE_CSMA);
    566	mii_nway_restart(&dev->mii);
    567
    568	ret = sr_write_medium_mode(dev, SR9800_MEDIUM_DEFAULT);
    569	if (ret < 0)
    570		goto out;
    571
    572	ret = sr_write_cmd(dev, SR_CMD_WRITE_IPG012,
    573				SR9800_IPG0_DEFAULT | SR9800_IPG1_DEFAULT,
    574				SR9800_IPG2_DEFAULT, 0, NULL);
    575	if (ret < 0) {
    576		netdev_dbg(dev->net, "Write IPG,IPG1,IPG2 failed: %d\n", ret);
    577		goto out;
    578	}
    579
    580	/* Set RX_CTL to default values with 2k buffer, and enable cactus */
    581	ret = sr_write_rx_ctl(dev, SR_DEFAULT_RX_CTL);
    582	if (ret < 0)
    583		goto out;
    584
    585	rx_ctl = sr_read_rx_ctl(dev);
    586	netdev_dbg(dev->net, "RX_CTL is 0x%04x after all initializations\n",
    587		   rx_ctl);
    588
    589	rx_ctl = sr_read_medium_status(dev);
    590	netdev_dbg(dev->net, "Medium Status:0x%04x after all initializations\n",
    591		   rx_ctl);
    592
    593	return 0;
    594out:
    595	return ret;
    596}
    597
    598static int sr9800_reset(struct usbnet *dev)
    599{
    600	struct sr_data *data = (struct sr_data *)&dev->data;
    601	int ret, embd_phy;
    602	u16 rx_ctl;
    603
    604	ret = sr_write_gpio(dev,
    605			SR_GPIO_RSE | SR_GPIO_GPO_2 | SR_GPIO_GPO2EN, 5);
    606	if (ret < 0)
    607		goto out;
    608
    609	embd_phy = ((sr_get_phy_addr(dev) & 0x1f) == 0x10 ? 1 : 0);
    610
    611	ret = sr_write_cmd(dev, SR_CMD_SW_PHY_SELECT, embd_phy, 0, 0, NULL);
    612	if (ret < 0) {
    613		netdev_dbg(dev->net, "Select PHY #1 failed: %d\n", ret);
    614		goto out;
    615	}
    616
    617	ret = sr_sw_reset(dev, SR_SWRESET_IPPD | SR_SWRESET_PRL);
    618	if (ret < 0)
    619		goto out;
    620
    621	msleep(150);
    622
    623	ret = sr_sw_reset(dev, SR_SWRESET_CLEAR);
    624	if (ret < 0)
    625		goto out;
    626
    627	msleep(150);
    628
    629	if (embd_phy) {
    630		ret = sr_sw_reset(dev, SR_SWRESET_IPRL);
    631		if (ret < 0)
    632			goto out;
    633	} else {
    634		ret = sr_sw_reset(dev, SR_SWRESET_PRTE);
    635		if (ret < 0)
    636			goto out;
    637	}
    638
    639	msleep(150);
    640	rx_ctl = sr_read_rx_ctl(dev);
    641	netdev_dbg(dev->net, "RX_CTL is 0x%04x after software reset\n", rx_ctl);
    642	ret = sr_write_rx_ctl(dev, 0x0000);
    643	if (ret < 0)
    644		goto out;
    645
    646	rx_ctl = sr_read_rx_ctl(dev);
    647	netdev_dbg(dev->net, "RX_CTL is 0x%04x setting to 0x0000\n", rx_ctl);
    648
    649	ret = sr_sw_reset(dev, SR_SWRESET_PRL);
    650	if (ret < 0)
    651		goto out;
    652
    653	msleep(150);
    654
    655	ret = sr_sw_reset(dev, SR_SWRESET_IPRL | SR_SWRESET_PRL);
    656	if (ret < 0)
    657		goto out;
    658
    659	msleep(150);
    660
    661	ret = sr9800_set_default_mode(dev);
    662	if (ret < 0)
    663		goto out;
    664
    665	/* Rewrite MAC address */
    666	memcpy(data->mac_addr, dev->net->dev_addr, ETH_ALEN);
    667	ret = sr_write_cmd(dev, SR_CMD_WRITE_NODE_ID, 0, 0, ETH_ALEN,
    668							data->mac_addr);
    669	if (ret < 0)
    670		goto out;
    671
    672	return 0;
    673
    674out:
    675	return ret;
    676}
    677
    678static const struct net_device_ops sr9800_netdev_ops = {
    679	.ndo_open		= usbnet_open,
    680	.ndo_stop		= usbnet_stop,
    681	.ndo_start_xmit		= usbnet_start_xmit,
    682	.ndo_tx_timeout		= usbnet_tx_timeout,
    683	.ndo_change_mtu		= usbnet_change_mtu,
    684	.ndo_get_stats64	= dev_get_tstats64,
    685	.ndo_set_mac_address	= sr_set_mac_address,
    686	.ndo_validate_addr	= eth_validate_addr,
    687	.ndo_eth_ioctl		= sr_ioctl,
    688	.ndo_set_rx_mode        = sr_set_multicast,
    689};
    690
    691static int sr9800_phy_powerup(struct usbnet *dev)
    692{
    693	int ret;
    694
    695	/* set the embedded Ethernet PHY in power-down state */
    696	ret = sr_sw_reset(dev, SR_SWRESET_IPPD | SR_SWRESET_IPRL);
    697	if (ret < 0) {
    698		netdev_err(dev->net, "Failed to power down PHY : %d\n", ret);
    699		return ret;
    700	}
    701	msleep(20);
    702
    703	/* set the embedded Ethernet PHY in power-up state */
    704	ret = sr_sw_reset(dev, SR_SWRESET_IPRL);
    705	if (ret < 0) {
    706		netdev_err(dev->net, "Failed to reset PHY: %d\n", ret);
    707		return ret;
    708	}
    709	msleep(600);
    710
    711	/* set the embedded Ethernet PHY in reset state */
    712	ret = sr_sw_reset(dev, SR_SWRESET_CLEAR);
    713	if (ret < 0) {
    714		netdev_err(dev->net, "Failed to power up PHY: %d\n", ret);
    715		return ret;
    716	}
    717	msleep(20);
    718
    719	/* set the embedded Ethernet PHY in power-up state */
    720	ret = sr_sw_reset(dev, SR_SWRESET_IPRL);
    721	if (ret < 0) {
    722		netdev_err(dev->net, "Failed to reset PHY: %d\n", ret);
    723		return ret;
    724	}
    725
    726	return 0;
    727}
    728
    729static int sr9800_bind(struct usbnet *dev, struct usb_interface *intf)
    730{
    731	struct sr_data *data = (struct sr_data *)&dev->data;
    732	u16 led01_mux, led23_mux;
    733	int ret, embd_phy;
    734	u8 addr[ETH_ALEN];
    735	u32 phyid;
    736	u16 rx_ctl;
    737
    738	data->eeprom_len = SR9800_EEPROM_LEN;
    739
    740	usbnet_get_endpoints(dev, intf);
    741
    742	/* LED Setting Rule :
    743	 * AABB:CCDD
    744	 * AA : MFA0(LED0)
    745	 * BB : MFA1(LED1)
    746	 * CC : MFA2(LED2), Reserved for SR9800
    747	 * DD : MFA3(LED3), Reserved for SR9800
    748	 */
    749	led01_mux = (SR_LED_MUX_LINK_ACTIVE << 8) | SR_LED_MUX_LINK;
    750	led23_mux = (SR_LED_MUX_LINK_ACTIVE << 8) | SR_LED_MUX_TX_ACTIVE;
    751	ret = sr_write_cmd(dev, SR_CMD_LED_MUX, led01_mux, led23_mux, 0, NULL);
    752	if (ret < 0) {
    753			netdev_err(dev->net, "set LINK LED failed : %d\n", ret);
    754			goto out;
    755	}
    756
    757	/* Get the MAC address */
    758	ret = sr_read_cmd(dev, SR_CMD_READ_NODE_ID, 0, 0, ETH_ALEN, addr);
    759	if (ret < 0) {
    760		netdev_dbg(dev->net, "Failed to read MAC address: %d\n", ret);
    761		return ret;
    762	}
    763	eth_hw_addr_set(dev->net, addr);
    764	netdev_dbg(dev->net, "mac addr : %pM\n", dev->net->dev_addr);
    765
    766	/* Initialize MII structure */
    767	dev->mii.dev = dev->net;
    768	dev->mii.mdio_read = sr_mdio_read;
    769	dev->mii.mdio_write = sr_mdio_write;
    770	dev->mii.phy_id_mask = 0x1f;
    771	dev->mii.reg_num_mask = 0x1f;
    772	dev->mii.phy_id = sr_get_phy_addr(dev);
    773
    774	dev->net->netdev_ops = &sr9800_netdev_ops;
    775	dev->net->ethtool_ops = &sr9800_ethtool_ops;
    776
    777	embd_phy = ((dev->mii.phy_id & 0x1f) == 0x10 ? 1 : 0);
    778	/* Reset the PHY to normal operation mode */
    779	ret = sr_write_cmd(dev, SR_CMD_SW_PHY_SELECT, embd_phy, 0, 0, NULL);
    780	if (ret < 0) {
    781		netdev_dbg(dev->net, "Select PHY #1 failed: %d\n", ret);
    782		return ret;
    783	}
    784
    785	/* Init PHY routine */
    786	ret = sr9800_phy_powerup(dev);
    787	if (ret < 0)
    788		goto out;
    789
    790	rx_ctl = sr_read_rx_ctl(dev);
    791	netdev_dbg(dev->net, "RX_CTL is 0x%04x after software reset\n", rx_ctl);
    792	ret = sr_write_rx_ctl(dev, 0x0000);
    793	if (ret < 0)
    794		goto out;
    795
    796	rx_ctl = sr_read_rx_ctl(dev);
    797	netdev_dbg(dev->net, "RX_CTL is 0x%04x setting to 0x0000\n", rx_ctl);
    798
    799	/* Read PHYID register *AFTER* the PHY was reset properly */
    800	phyid = sr_get_phyid(dev);
    801	netdev_dbg(dev->net, "PHYID=0x%08x\n", phyid);
    802
    803	/* medium mode setting */
    804	ret = sr9800_set_default_mode(dev);
    805	if (ret < 0)
    806		goto out;
    807
    808	if (dev->udev->speed == USB_SPEED_HIGH) {
    809		ret = sr_write_cmd(dev, SR_CMD_BULKIN_SIZE,
    810			SR9800_BULKIN_SIZE[SR9800_MAX_BULKIN_4K].byte_cnt,
    811			SR9800_BULKIN_SIZE[SR9800_MAX_BULKIN_4K].threshold,
    812			0, NULL);
    813		if (ret < 0) {
    814			netdev_err(dev->net, "Reset RX_CTL failed: %d\n", ret);
    815			goto out;
    816		}
    817		dev->rx_urb_size =
    818			SR9800_BULKIN_SIZE[SR9800_MAX_BULKIN_4K].size;
    819	} else {
    820		ret = sr_write_cmd(dev, SR_CMD_BULKIN_SIZE,
    821			SR9800_BULKIN_SIZE[SR9800_MAX_BULKIN_2K].byte_cnt,
    822			SR9800_BULKIN_SIZE[SR9800_MAX_BULKIN_2K].threshold,
    823			0, NULL);
    824		if (ret < 0) {
    825			netdev_err(dev->net, "Reset RX_CTL failed: %d\n", ret);
    826			goto out;
    827		}
    828		dev->rx_urb_size =
    829			SR9800_BULKIN_SIZE[SR9800_MAX_BULKIN_2K].size;
    830	}
    831	netdev_dbg(dev->net, "%s : setting rx_urb_size with : %zu\n", __func__,
    832		   dev->rx_urb_size);
    833	return 0;
    834
    835out:
    836	return ret;
    837}
    838
    839static const struct driver_info sr9800_driver_info = {
    840	.description	= "CoreChip SR9800 USB 2.0 Ethernet",
    841	.bind		= sr9800_bind,
    842	.status		= sr_status,
    843	.link_reset	= sr9800_link_reset,
    844	.reset		= sr9800_reset,
    845	.flags		= DRIVER_FLAG,
    846	.rx_fixup	= sr_rx_fixup,
    847	.tx_fixup	= sr_tx_fixup,
    848};
    849
    850static const struct usb_device_id	products[] = {
    851	{
    852		USB_DEVICE(0x0fe6, 0x9800),	/* SR9800 Device  */
    853		.driver_info = (unsigned long) &sr9800_driver_info,
    854	},
    855	{},		/* END */
    856};
    857
    858MODULE_DEVICE_TABLE(usb, products);
    859
    860static struct usb_driver sr_driver = {
    861	.name		= DRIVER_NAME,
    862	.id_table	= products,
    863	.probe		= usbnet_probe,
    864	.suspend	= usbnet_suspend,
    865	.resume		= usbnet_resume,
    866	.disconnect	= usbnet_disconnect,
    867	.supports_autosuspend = 1,
    868};
    869
    870module_usb_driver(sr_driver);
    871
    872MODULE_AUTHOR("Liu Junliang <liujunliang_ljl@163.com");
    873MODULE_VERSION(DRIVER_VERSION);
    874MODULE_DESCRIPTION("SR9800 USB 2.0 USB2NET Dev : http://www.corechip-sz.com");
    875MODULE_LICENSE("GPL");