Module Name:    src
Committed By:   mrg
Date:           Mon Aug 19 07:33:37 UTC 2019

Modified Files:
        src/sys/dev/usb: if_axe.c if_axen.c if_mue.c if_smsc.c if_ure.c
            usbnet.c

Log Message:
move the check against un_phyno from usbnet back into the drivers
that do this (axe, axen, mue, smsc, ure.)  it made mii scanning
only work for phy 0, and aue needs it for at least one device.

fix smsc to return usbd_status not -1 on failure.  XXX smsc was
writing to '*val' even in error cases, it does not now.

remove a double call to IFQ_SET_READY() (noticed by chuq).

avoid unlock+instant relock by using usbnet_lock_mii_un_locked().


To generate a diff of this commit:
cvs rdiff -u -r1.116 -r1.117 src/sys/dev/usb/if_axe.c
cvs rdiff -u -r1.64 -r1.65 src/sys/dev/usb/if_axen.c
cvs rdiff -u -r1.52 -r1.53 src/sys/dev/usb/if_mue.c
cvs rdiff -u -r1.58 -r1.59 src/sys/dev/usb/if_smsc.c
cvs rdiff -u -r1.28 -r1.29 src/sys/dev/usb/if_ure.c
cvs rdiff -u -r1.19 -r1.20 src/sys/dev/usb/usbnet.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/usb/if_axe.c
diff -u src/sys/dev/usb/if_axe.c:1.116 src/sys/dev/usb/if_axe.c:1.117
--- src/sys/dev/usb/if_axe.c:1.116	Fri Aug 16 08:29:20 2019
+++ src/sys/dev/usb/if_axe.c	Mon Aug 19 07:33:37 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_axe.c,v 1.116 2019/08/16 08:29:20 mrg Exp $	*/
+/*	$NetBSD: if_axe.c,v 1.117 2019/08/19 07:33:37 mrg Exp $	*/
 /*	$OpenBSD: if_axe.c,v 1.137 2016/04/13 11:03:37 mpi Exp $ */
 
 /*
@@ -87,7 +87,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_axe.c,v 1.116 2019/08/16 08:29:20 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_axe.c,v 1.117 2019/08/19 07:33:37 mrg Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -323,6 +323,9 @@ axe_mii_read_reg(struct usbnet *un, int 
 
 	DPRINTFN(30, "phy 0x%jx reg 0x%jx\n", phy, reg, 0, 0);
 
+	if (un->un_phyno != phy)
+		return USBD_INVAL;
+
 	axe_cmd(sc, AXE_CMD_MII_OPMODE_SW, 0, 0, NULL);
 
 	err = axe_cmd(sc, AXE_CMD_MII_READ_REG, reg, phy, &data);
@@ -356,6 +359,9 @@ axe_mii_write_reg(struct usbnet *un, int
 	usbd_status err;
 	uint16_t aval;
 
+	if (un->un_phyno != phy)
+		return USBD_INVAL;
+
 	aval = htole16(val);
 
 	axe_cmd(sc, AXE_CMD_MII_OPMODE_SW, 0, 0, NULL);

Index: src/sys/dev/usb/if_axen.c
diff -u src/sys/dev/usb/if_axen.c:1.64 src/sys/dev/usb/if_axen.c:1.65
--- src/sys/dev/usb/if_axen.c:1.64	Thu Aug 15 05:52:23 2019
+++ src/sys/dev/usb/if_axen.c	Mon Aug 19 07:33:37 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_axen.c,v 1.64 2019/08/15 05:52:23 mrg Exp $	*/
+/*	$NetBSD: if_axen.c,v 1.65 2019/08/19 07:33:37 mrg Exp $	*/
 /*	$OpenBSD: if_axen.c,v 1.3 2013/10/21 10:10:22 yuo Exp $	*/
 
 /*
@@ -23,7 +23,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_axen.c,v 1.64 2019/08/15 05:52:23 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_axen.c,v 1.65 2019/08/19 07:33:37 mrg Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -135,8 +135,11 @@ static usbd_status
 axen_mii_read_reg(struct usbnet *un, int phy, int reg, uint16_t *val)
 {
 	uint16_t data;
-	usbd_status err = axen_cmd(un, AXEN_CMD_MII_READ_REG, reg, phy, &data);
 
+	if (un->un_phyno != phy)
+		return USBD_INVAL;
+
+	usbd_status err = axen_cmd(un, AXEN_CMD_MII_READ_REG, reg, phy, &data);
 	if (!err) {
 		*val = le16toh(data);
 
@@ -152,6 +155,9 @@ axen_mii_write_reg(struct usbnet *un, in
 {
 	uint16_t uval = htole16(val);
 
+	if (un->un_phyno != phy)
+		return USBD_INVAL;
+
 	return axen_cmd(un, AXEN_CMD_MII_WRITE_REG, reg, phy, &uval);
 }
 

Index: src/sys/dev/usb/if_mue.c
diff -u src/sys/dev/usb/if_mue.c:1.52 src/sys/dev/usb/if_mue.c:1.53
--- src/sys/dev/usb/if_mue.c:1.52	Thu Aug 15 08:02:32 2019
+++ src/sys/dev/usb/if_mue.c	Mon Aug 19 07:33:37 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_mue.c,v 1.52 2019/08/15 08:02:32 mrg Exp $	*/
+/*	$NetBSD: if_mue.c,v 1.53 2019/08/19 07:33:37 mrg Exp $	*/
 /*	$OpenBSD: if_mue.c,v 1.3 2018/08/04 16:42:46 jsg Exp $	*/
 
 /*
@@ -20,7 +20,7 @@
 /* Driver for Microchip LAN7500/LAN7800 chipsets. */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_mue.c,v 1.52 2019/08/15 08:02:32 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_mue.c,v 1.53 2019/08/19 07:33:37 mrg Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -217,6 +217,9 @@ mue_mii_read_reg(struct usbnet *un, int 
 
 	usbnet_isowned_mii(un);
 
+	if (un->un_phyno != phy)
+		return USBD_INVAL;
+
 	if (MUE_WAIT_CLR(un, MUE_MII_ACCESS, MUE_MII_ACCESS_BUSY, 0)) {
 		MUE_PRINTF(un, "not ready\n");
 		return USBD_IN_USE;
@@ -242,6 +245,9 @@ mue_mii_write_reg(struct usbnet *un, int
 {
 	usbnet_isowned_mii(un);
 
+	if (un->un_phyno != phy)
+		return USBD_INVAL;
+
 	if (MUE_WAIT_CLR(un, MUE_MII_ACCESS, MUE_MII_ACCESS_BUSY, 0)) {
 		MUE_PRINTF(un, "not ready\n");
 		return USBD_IN_USE;

Index: src/sys/dev/usb/if_smsc.c
diff -u src/sys/dev/usb/if_smsc.c:1.58 src/sys/dev/usb/if_smsc.c:1.59
--- src/sys/dev/usb/if_smsc.c:1.58	Thu Aug 15 05:52:23 2019
+++ src/sys/dev/usb/if_smsc.c	Mon Aug 19 07:33:37 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_smsc.c,v 1.58 2019/08/15 05:52:23 mrg Exp $	*/
+/*	$NetBSD: if_smsc.c,v 1.59 2019/08/19 07:33:37 mrg Exp $	*/
 
 /*	$OpenBSD: if_smsc.c,v 1.4 2012/09/27 12:38:11 jsg Exp $	*/
 /*	$FreeBSD: src/sys/dev/usb/net/if_smsc.c,v 1.1 2012/08/15 04:03:55 gonzo Exp $ */
@@ -61,7 +61,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_smsc.c,v 1.58 2019/08/15 05:52:23 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_smsc.c,v 1.59 2019/08/19 07:33:37 mrg Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -279,14 +279,15 @@ smsc_miibus_readreg(struct usbnet *un, i
 {
 	uint32_t addr;
 	uint32_t data = 0;
-	int rv = 0;
 
 	usbnet_isowned_mii(un);
 
+	if (un->un_phyno != phy)
+		return USBD_INVAL;
+
 	if (smsc_wait_for_bits(un, SMSC_MII_ADDR, SMSC_MII_BUSY) != 0) {
 		smsc_warn_printf(un, "MII is busy\n");
-		rv = -1;
-		goto done;
+		return USBD_TIMEOUT;
 	}
 
 	addr = (phy << 11) | (reg << 6) | SMSC_MII_READ;
@@ -294,14 +295,13 @@ smsc_miibus_readreg(struct usbnet *un, i
 
 	if (smsc_wait_for_bits(un, SMSC_MII_ADDR, SMSC_MII_BUSY) != 0) {
 		smsc_warn_printf(un, "MII read timeout\n");
-		rv = ETIMEDOUT;
+		return USBD_TIMEOUT;
 	}
 
 	smsc_readreg(un, SMSC_MII_DATA, &data);
 
-done:
 	*val = data & 0xffff;
-	return rv;
+	return USBD_NORMAL_COMPLETION;
 }
 
 usbd_status
@@ -312,11 +312,11 @@ smsc_miibus_writereg(struct usbnet *un, 
 	usbnet_isowned_mii(un);
 
 	if (un->un_phyno != phy)
-		return -1;
+		return USBD_INVAL;
 
 	if (smsc_wait_for_bits(un, SMSC_MII_ADDR, SMSC_MII_BUSY) != 0) {
 		smsc_warn_printf(un, "MII is busy\n");
-		return -1;
+		return USBD_TIMEOUT;
 	}
 
 	smsc_writereg(un, SMSC_MII_DATA, val);
@@ -326,10 +326,10 @@ smsc_miibus_writereg(struct usbnet *un, 
 
 	if (smsc_wait_for_bits(un, SMSC_MII_ADDR, SMSC_MII_BUSY) != 0) {
 		smsc_warn_printf(un, "MII write timeout\n");
-		return ETIMEDOUT;
+		return USBD_TIMEOUT;
 	}
 
-	return 0;
+	return USBD_NORMAL_COMPLETION;
 }
 
 void

Index: src/sys/dev/usb/if_ure.c
diff -u src/sys/dev/usb/if_ure.c:1.28 src/sys/dev/usb/if_ure.c:1.29
--- src/sys/dev/usb/if_ure.c:1.28	Fri Aug 16 08:29:20 2019
+++ src/sys/dev/usb/if_ure.c	Mon Aug 19 07:33:37 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_ure.c,v 1.28 2019/08/16 08:29:20 mrg Exp $	*/
+/*	$NetBSD: if_ure.c,v 1.29 2019/08/19 07:33:37 mrg Exp $	*/
 /*	$OpenBSD: if_ure.c,v 1.10 2018/11/02 21:32:30 jcs Exp $	*/
 
 /*-
@@ -30,7 +30,7 @@
 /* RealTek RTL8152/RTL8153 10/100/Gigabit USB Ethernet device */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_ure.c,v 1.28 2019/08/16 08:29:20 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_ure.c,v 1.29 2019/08/19 07:33:37 mrg Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -271,6 +271,11 @@ ure_ocp_reg_write(struct usbnet *un, uin
 static usbd_status
 ure_mii_read_reg(struct usbnet *un, int phy, int reg, uint16_t *val)
 {
+	usbnet_isowned_mii(un);
+
+	if (un->un_phyno != phy)
+		return USBD_INVAL;
+
 	/* Let the rgephy driver read the URE_PLA_PHYSTATUS register. */
 	if (reg == RTK_GMEDIASTAT) {
 		*val = ure_read_1(un, URE_PLA_PHYSTATUS, URE_MCU_TYPE_PLA);
@@ -285,6 +290,11 @@ ure_mii_read_reg(struct usbnet *un, int 
 static usbd_status
 ure_mii_write_reg(struct usbnet *un, int phy, int reg, uint16_t val)
 {
+	usbnet_isowned_mii(un);
+
+	if (un->un_phyno != phy)
+		return USBD_INVAL;
+
 	ure_ocp_reg_write(un, URE_OCP_BASE_MII + reg * 2, val);
 
 	return USBD_NORMAL_COMPLETION;

Index: src/sys/dev/usb/usbnet.c
diff -u src/sys/dev/usb/usbnet.c:1.19 src/sys/dev/usb/usbnet.c:1.20
--- src/sys/dev/usb/usbnet.c:1.19	Mon Aug 19 06:35:14 2019
+++ src/sys/dev/usb/usbnet.c	Mon Aug 19 07:33:37 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: usbnet.c,v 1.19 2019/08/19 06:35:14 mrg Exp $	*/
+/*	$NetBSD: usbnet.c,v 1.20 2019/08/19 07:33:37 mrg Exp $	*/
 
 /*
  * Copyright (c) 2019 Matthew R. Green
@@ -33,7 +33,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: usbnet.c,v 1.19 2019/08/19 06:35:14 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: usbnet.c,v 1.20 2019/08/19 07:33:37 mrg Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -869,13 +869,13 @@ usbnet_mii_readreg(device_t dev, int phy
 	usbd_status err;
 
 	mutex_enter(&unp->unp_lock);
-	if (unp->unp_dying || un->un_phyno != phy) {
+	if (unp->unp_dying) {
 		mutex_exit(&unp->unp_lock);
 		return EIO;
 	}
-	mutex_exit(&unp->unp_lock);
 
-	usbnet_lock_mii(un);
+	usbnet_lock_mii_un_locked(un);
+	mutex_exit(&unp->unp_lock);
 	err = uno_read_reg(un, phy, reg, val);
 	usbnet_unlock_mii(un);
 
@@ -896,13 +896,13 @@ usbnet_mii_writereg(device_t dev, int ph
 	usbd_status err;
 
 	mutex_enter(&unp->unp_lock);
-	if (unp->unp_dying || un->un_phyno != phy) {
+	if (unp->unp_dying) {
 		mutex_exit(&unp->unp_lock);
 		return EIO;
 	}
-	mutex_exit(&unp->unp_lock);
 
-	usbnet_lock_mii(un);
+	usbnet_lock_mii_un_locked(un);
+	mutex_exit(&unp->unp_lock);
 	err = uno_write_reg(un, phy, reg, val);
 	usbnet_unlock_mii(un);
 
@@ -1087,8 +1087,9 @@ usbnet_watchdog(struct ifnet *ifp)
 
 	if (cd->uncd_tx_cnt > 0) {
 		err = usbd_abort_pipe(unp->unp_ep[USBNET_ENDPT_TX]);
-		aprint_error_dev(un->un_dev, "pipe abort failed: %s\n",
-		    usbd_errstr(err));
+		if (err)
+			aprint_error_dev(un->un_dev, "pipe abort failed: %s\n",
+			    usbd_errstr(err));
 	}
 
 	if (!IFQ_IS_EMPTY(&ifp->if_snd))
@@ -1373,8 +1374,6 @@ usbnet_attach_ifp(struct usbnet *un,
 	ifp->if_init = usbnet_init;
 	ifp->if_stop = usbnet_stop_ifp;
 
-	IFQ_SET_READY(&ifp->if_snd);
-
 	if (have_mii)
 		usbnet_attach_mii(un, mii_flags);
 	else

Reply via email to