Module Name:    src
Committed By:   riastradh
Date:           Wed Feb 19 16:02:34 UTC 2020

Modified Files:
        src/sys/dev/usb: umass.c

Log Message:
Consolidate logic to call the transfer callback.

No functional change intended.


To generate a diff of this commit:
cvs rdiff -u -r1.177 -r1.178 src/sys/dev/usb/umass.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/umass.c
diff -u src/sys/dev/usb/umass.c:1.177 src/sys/dev/usb/umass.c:1.178
--- src/sys/dev/usb/umass.c:1.177	Wed Feb 19 16:00:28 2020
+++ src/sys/dev/usb/umass.c	Wed Feb 19 16:02:33 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: umass.c,v 1.177 2020/02/19 16:00:28 riastradh Exp $	*/
+/*	$NetBSD: umass.c,v 1.178 2020/02/19 16:02:33 riastradh Exp $	*/
 
 /*
  * Copyright (c) 2003 The NetBSD Foundation, Inc.
@@ -124,7 +124,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: umass.c,v 1.177 2020/02/19 16:00:28 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: umass.c,v 1.178 2020/02/19 16:02:33 riastradh Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -236,6 +236,8 @@ Static usbd_status umass_setup_ctrl_tran
 				struct usbd_xfer *);
 Static void umass_clear_endpoint_stall(struct umass_softc *, int,
 				struct usbd_xfer *);
+Static void umass_transfer_done(struct umass_softc *, int, int);
+Static void umass_transfer_reset(struct umass_softc *);
 #if 0
 Static void umass_reset(struct umass_softc *, transfer_cb_f, void *);
 #endif
@@ -1009,6 +1011,26 @@ umass_clear_endpoint_stall(struct umass_
 	umass_setup_ctrl_transfer(sc, &sc->sc_req, NULL, 0, 0, xfer);
 }
 
+Static void
+umass_transfer_done(struct umass_softc *sc, int residue, int status)
+{
+	UMASSHIST_FUNC(); UMASSHIST_CALLED();
+
+	sc->transfer_state = TSTATE_IDLE;
+	sc->transfer_cb(sc, sc->transfer_priv, residue, status);
+}
+
+Static void
+umass_transfer_reset(struct umass_softc *sc)
+{
+	UMASSHIST_FUNC(); UMASSHIST_CALLED();
+
+	sc->transfer_state = TSTATE_IDLE;
+	if (sc->transfer_priv)
+		sc->transfer_cb(sc, sc->transfer_priv, sc->transfer_datalen,
+		    sc->transfer_status);
+}
+
 #if 0
 Static void
 umass_reset(struct umass_softc *sc, transfer_cb_f cb, void *priv)
@@ -1217,8 +1239,7 @@ umass_bbb_state(struct usbd_xfer *xfer, 
 		DPRINTFM(UDMASS_BBB, "sc %#jx xfer %#jx cancelled",
 		    (uintptr_t)sc, (uintptr_t)xfer, 0, 0);
 
-		sc->transfer_state = TSTATE_IDLE;
-		sc->transfer_cb(sc, sc->transfer_priv, 0, STATUS_TIMEOUT);
+		umass_transfer_done(sc, 0, STATUS_TIMEOUT);
 		return;
 	}
 
@@ -1454,17 +1475,11 @@ umass_bbb_state(struct usbd_xfer *xfer, 
 			    "res = %jd", (uintptr_t)sc, residue, 0, 0);
 
 			/* SCSI command failed but transfer was succesful */
-			sc->transfer_state = TSTATE_IDLE;
-			sc->transfer_cb(sc, sc->transfer_priv, residue,
-					STATUS_CMD_FAILED);
-
+			umass_transfer_done(sc, residue, STATUS_CMD_FAILED);
 			return;
 
 		} else {	/* success */
-			sc->transfer_state = TSTATE_IDLE;
-			sc->transfer_cb(sc, sc->transfer_priv, residue,
-					STATUS_CMD_OK);
-
+			umass_transfer_done(sc, residue, STATUS_CMD_OK);
 			return;
 		}
 
@@ -1496,12 +1511,7 @@ umass_bbb_state(struct usbd_xfer *xfer, 
 			       device_xname(sc->sc_dev), usbd_errstr(err));
 			/* no error recovery, otherwise we end up in a loop */
 
-		sc->transfer_state = TSTATE_IDLE;
-		if (sc->transfer_priv) {
-			sc->transfer_cb(sc, sc->transfer_priv,
-					sc->transfer_datalen,
-					sc->transfer_status);
-		}
+		umass_transfer_reset(sc);
 
 		return;
 
@@ -1669,8 +1679,7 @@ umass_cbi_state(struct usbd_xfer *xfer, 
 	if (err == USBD_CANCELLED) {
 		DPRINTFM(UDMASS_BBB, "sc %#jx xfer %#jx cancelled",
 			(uintptr_t)sc, (uintptr_t)xfer, 0, 0);
-		sc->transfer_state = TSTATE_IDLE;
-		sc->transfer_cb(sc, sc->transfer_priv, 0, STATUS_TIMEOUT);
+		umass_transfer_done(sc, 0, STATUS_TIMEOUT);
 		return;
 	}
 
@@ -1700,12 +1709,8 @@ umass_cbi_state(struct usbd_xfer *xfer, 
 			 * Section 2.4.3.1.1 states that the bulk in endpoints
 			 * should not stalled at this point.
 			 */
-
-			sc->transfer_state = TSTATE_IDLE;
-			sc->transfer_cb(sc, sc->transfer_priv,
-					sc->transfer_datalen,
-					STATUS_CMD_FAILED);
-
+			umass_transfer_done(sc, sc->transfer_datalen,
+			    STATUS_CMD_FAILED);
 			return;
 		} else if (err) {
 			DPRINTFM(UDMASS_CBI, "sc %#jx: failed to send ADSC",
@@ -1794,10 +1799,9 @@ umass_cbi_state(struct usbd_xfer *xfer, 
 			/* No command completion interrupt. Request
 			 * sense to get status of command.
 			 */
-			sc->transfer_state = TSTATE_IDLE;
-			sc->transfer_cb(sc, sc->transfer_priv,
-				sc->transfer_datalen - sc->transfer_actlen,
-				STATUS_CMD_UNKNOWN);
+			umass_transfer_done(sc,
+			    sc->transfer_datalen - sc->transfer_actlen,
+			    STATUS_CMD_UNKNOWN);
 		}
 		return;
 
@@ -1848,9 +1852,9 @@ umass_cbi_state(struct usbd_xfer *xfer, 
 				status = STATUS_CMD_FAILED;
 
 			/* No autosense, command successful */
-			sc->transfer_state = TSTATE_IDLE;
-			sc->transfer_cb(sc, sc->transfer_priv,
-			    sc->transfer_datalen - sc->transfer_actlen, status);
+			umass_transfer_done(sc,
+			    sc->transfer_datalen - sc->transfer_actlen,
+			    status);
 		} else {
 			int status;
 
@@ -1875,8 +1879,7 @@ umass_cbi_state(struct usbd_xfer *xfer, 
 					break;
 				}
 
-				sc->transfer_state = TSTATE_IDLE;
-				sc->transfer_cb(sc, sc->transfer_priv,
+				umass_transfer_done(sc,
 				    sc->transfer_datalen - sc->transfer_actlen,
 				    status);
 			}
@@ -1891,8 +1894,7 @@ umass_cbi_state(struct usbd_xfer *xfer, 
 			    usbd_errstr(err));
 			umass_cbi_reset(sc, STATUS_WIRE_FAILED);
 		} else {
-			sc->transfer_state = TSTATE_IDLE;
-			sc->transfer_cb(sc, sc->transfer_priv,
+			umass_transfer_done(sc,
 			    sc->transfer_datalen, STATUS_CMD_FAILED);
 		}
 		return;
@@ -1903,8 +1905,7 @@ umass_cbi_state(struct usbd_xfer *xfer, 
 			       device_xname(sc->sc_dev), usbd_errstr(err));
 			umass_cbi_reset(sc, STATUS_WIRE_FAILED);
 		} else {
-			sc->transfer_state = TSTATE_IDLE;
-			sc->transfer_cb(sc, sc->transfer_priv,
+			umass_transfer_done(sc,
 			    sc->transfer_datalen, STATUS_CMD_FAILED);
 		}
 		return;
@@ -1937,13 +1938,7 @@ umass_cbi_state(struct usbd_xfer *xfer, 
 			       device_xname(sc->sc_dev), usbd_errstr(err));
 			/* no error recovery, otherwise we end up in a loop */
 
-		sc->transfer_state = TSTATE_IDLE;
-		if (sc->transfer_priv) {
-			sc->transfer_cb(sc, sc->transfer_priv,
-					sc->transfer_datalen,
-					sc->transfer_status);
-		}
-
+		umass_transfer_reset(sc);
 		return;
 
 

Reply via email to