Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cf29bded authored by Alexander Kurz's avatar Alexander Kurz Committed by David S. Miller
Browse files

net: usb: asix88179_178a: de-duplicate code



Remove the duplicated code for asix88179_178a bind and reset methods.

Signed-off-by: default avatarAlexander Kurz <akurz@blala.de>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 84c4df40
Loading
Loading
Loading
Loading
+31 −86
Original line number Diff line number Diff line
@@ -1223,7 +1223,7 @@ static int ax88179_led_setting(struct usbnet *dev)
	return 0;
}

static int ax88179_bind(struct usbnet *dev, struct usb_interface *intf)
static int ax88179_link_bind_or_reset(struct usbnet *dev, bool do_reset)
{
	u8 buf[5];
	u16 *tmp16;
@@ -1231,11 +1231,10 @@ static int ax88179_bind(struct usbnet *dev, struct usb_interface *intf)
	struct ax88179_data *ax179_data = (struct ax88179_data *)dev->data;
	struct ethtool_eee eee_data;

	usbnet_get_endpoints(dev, intf);

	tmp16 = (u16 *)buf;
	tmp = (u8 *)buf;

	if (!do_reset)
		memset(ax179_data, 0, sizeof(*ax179_data));

	/* Power up ethernet PHY */
@@ -1249,8 +1248,12 @@ static int ax88179_bind(struct usbnet *dev, struct usb_interface *intf)
	ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_CLK_SELECT, 1, 1, tmp);
	msleep(100);

	if (do_reset)
		ax88179_auto_detach(dev, 0);

	ax88179_read_cmd(dev, AX_ACCESS_MAC, AX_NODE_ID, ETH_ALEN,
			 ETH_ALEN, dev->net->dev_addr);
	if (!do_reset)
		memcpy(dev->net->perm_addr, dev->net->dev_addr, ETH_ALEN);

	/* RX bulk configuration */
@@ -1266,6 +1269,7 @@ static int ax88179_bind(struct usbnet *dev, struct usb_interface *intf)
	ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_PAUSE_WATERLVL_HIGH,
			  1, 1, tmp);

	if (!do_reset) {
		dev->net->netdev_ops = &ax88179_netdev_ops;
		dev->net->ethtool_ops = &ax88179_ethtool_ops;
		dev->net->needed_headroom = 8;
@@ -1279,6 +1283,7 @@ static int ax88179_bind(struct usbnet *dev, struct usb_interface *intf)
		dev->mii.reg_num_mask = 0xff;
		dev->mii.phy_id = 0x03;
		dev->mii.supports_gmii = 1;
	}

	dev->net->features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
			      NETIF_F_RXCSUM;
@@ -1330,6 +1335,13 @@ static int ax88179_bind(struct usbnet *dev, struct usb_interface *intf)
	return 0;
}

static int ax88179_bind(struct usbnet *dev, struct usb_interface *intf)
{
	usbnet_get_endpoints(dev, intf);

	return ax88179_link_bind_or_reset(dev, false);
}

static void ax88179_unbind(struct usbnet *dev, struct usb_interface *intf)
{
	u16 tmp16;
@@ -1458,74 +1470,7 @@ ax88179_tx_fixup(struct usbnet *dev, struct sk_buff *skb, gfp_t flags)

static int ax88179_link_reset(struct usbnet *dev)
{
	struct ax88179_data *ax179_data = (struct ax88179_data *)dev->data;
	u8 tmp[5], link_sts;
	u16 mode, tmp16, delay = HZ / 10;
	u32 tmp32 = 0x40000000;
	unsigned long jtimeout;

	jtimeout = jiffies + delay;
	while (tmp32 & 0x40000000) {
		mode = 0;
		ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_RX_CTL, 2, 2, &mode);
		ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_RX_CTL, 2, 2,
				  &ax179_data->rxctl);

		/*link up, check the usb device control TX FIFO full or empty*/
		ax88179_read_cmd(dev, 0x81, 0x8c, 0, 4, &tmp32);

		if (time_after(jiffies, jtimeout))
			return 0;
	}

	mode = AX_MEDIUM_RECEIVE_EN | AX_MEDIUM_TXFLOW_CTRLEN |
	       AX_MEDIUM_RXFLOW_CTRLEN;

	ax88179_read_cmd(dev, AX_ACCESS_MAC, PHYSICAL_LINK_STATUS,
			 1, 1, &link_sts);

	ax88179_read_cmd(dev, AX_ACCESS_PHY, AX88179_PHY_ID,
			 GMII_PHY_PHYSR, 2, &tmp16);

	if (!(tmp16 & GMII_PHY_PHYSR_LINK)) {
		return 0;
	} else if (GMII_PHY_PHYSR_GIGA == (tmp16 & GMII_PHY_PHYSR_SMASK)) {
		mode |= AX_MEDIUM_GIGAMODE | AX_MEDIUM_EN_125MHZ;
		if (dev->net->mtu > 1500)
			mode |= AX_MEDIUM_JUMBO_EN;

		if (link_sts & AX_USB_SS)
			memcpy(tmp, &AX88179_BULKIN_SIZE[0], 5);
		else if (link_sts & AX_USB_HS)
			memcpy(tmp, &AX88179_BULKIN_SIZE[1], 5);
		else
			memcpy(tmp, &AX88179_BULKIN_SIZE[3], 5);
	} else if (GMII_PHY_PHYSR_100 == (tmp16 & GMII_PHY_PHYSR_SMASK)) {
		mode |= AX_MEDIUM_PS;

		if (link_sts & (AX_USB_SS | AX_USB_HS))
			memcpy(tmp, &AX88179_BULKIN_SIZE[2], 5);
		else
			memcpy(tmp, &AX88179_BULKIN_SIZE[3], 5);
	} else {
		memcpy(tmp, &AX88179_BULKIN_SIZE[3], 5);
	}

	/* RX bulk configuration */
	ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_RX_BULKIN_QCTRL, 5, 5, tmp);

	dev->rx_urb_size = (1024 * (tmp[3] + 2));

	if (tmp16 & GMII_PHY_PHYSR_FULL)
		mode |= AX_MEDIUM_FULL_DUPLEX;
	ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_MEDIUM_STATUS_MODE,
			  2, 2, &mode);

	ax179_data->eee_enabled = ax88179_chk_eee(dev);

	netif_carrier_on(dev->net);

	return 0;
	return ax88179_link_bind_or_reset(dev, true);
}

static int ax88179_reset(struct usbnet *dev)