summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/dev/usb/umass.c28
1 files changed, 18 insertions, 10 deletions
diff --git a/sys/dev/usb/umass.c b/sys/dev/usb/umass.c
index 916483f..50b11cc 100644
--- a/sys/dev/usb/umass.c
+++ b/sys/dev/usb/umass.c
@@ -241,7 +241,7 @@ typedef void (*transfer_cb_f) (struct umass_softc *sc, void *priv,
typedef void (*wire_reset_f) (struct umass_softc *sc, int status);
typedef void (*wire_transfer_f) (struct umass_softc *sc, int lun,
void *cmd, int cmdlen, void *data, int datalen,
- int dir, transfer_cb_f cb, void *priv);
+ int dir, u_int timeout, transfer_cb_f cb, void *priv);
typedef void (*wire_state_f) (usbd_xfer_handle xfer,
usbd_private_handle priv, usbd_status err);
@@ -527,6 +527,8 @@ struct umass_softc {
struct scsi_sense cam_scsi_sense;
struct scsi_sense cam_scsi_test_unit_ready;
+ int timeout; /* in msecs */
+
int maxlun; /* maximum LUN number */
};
@@ -591,7 +593,7 @@ Static void umass_reset (struct umass_softc *sc,
Static void umass_bbb_reset (struct umass_softc *sc, int status);
Static void umass_bbb_transfer (struct umass_softc *sc, int lun,
void *cmd, int cmdlen,
- void *data, int datalen, int dir,
+ void *data, int datalen, int dir, u_int timeout,
transfer_cb_f cb, void *priv);
Static void umass_bbb_state (usbd_xfer_handle xfer,
usbd_private_handle priv,
@@ -606,7 +608,7 @@ Static int umass_cbi_adsc (struct umass_softc *sc,
Static void umass_cbi_reset (struct umass_softc *sc, int status);
Static void umass_cbi_transfer (struct umass_softc *sc, int lun,
void *cmd, int cmdlen,
- void *data, int datalen, int dir,
+ void *data, int datalen, int dir, u_int timeout,
transfer_cb_f cb, void *priv);
Static void umass_cbi_state (usbd_xfer_handle xfer,
usbd_private_handle priv, usbd_status err);
@@ -1125,7 +1127,7 @@ umass_setup_transfer(struct umass_softc *sc, usbd_pipe_handle pipe,
/* Initialiase a USB transfer and then schedule it */
(void) usbd_setup_xfer(xfer, pipe, (void *) sc, buffer, buflen, flags,
- UMASS_TIMEOUT, sc->state);
+ sc->timeout, sc->state);
err = usbd_transfer(xfer);
if (err && err != USBD_IN_PROGRESS) {
@@ -1149,7 +1151,7 @@ umass_setup_ctrl_transfer(struct umass_softc *sc, usbd_device_handle udev,
/* Initialiase a USB control transfer and then schedule it */
(void) usbd_setup_default_xfer(xfer, udev, (void *) sc,
- UMASS_TIMEOUT, req, buffer, buflen, flags, sc->state);
+ sc->timeout, req, buffer, buflen, flags, sc->state);
err = usbd_transfer(xfer);
if (err && err != USBD_IN_PROGRESS) {
@@ -1246,13 +1248,16 @@ umass_bbb_reset(struct umass_softc *sc, int status)
Static void
umass_bbb_transfer(struct umass_softc *sc, int lun, void *cmd, int cmdlen,
- void *data, int datalen, int dir,
+ void *data, int datalen, int dir, u_int timeout,
transfer_cb_f cb, void *priv)
{
KASSERT(sc->proto & UMASS_PROTO_BBB,
("%s: umass_bbb_transfer: wrong sc->proto 0x%02x\n",
USBDEVNAME(sc->sc_dev), sc->proto));
+ /* Be a little generous. */
+ sc->timeout = timeout + UMASS_TIMEOUT;
+
/*
* Do a Bulk-Only transfer with cmdlen bytes from cmd, possibly
* a data phase of datalen bytes from/to the device and finally a
@@ -1759,12 +1764,15 @@ umass_cbi_reset(struct umass_softc *sc, int status)
Static void
umass_cbi_transfer(struct umass_softc *sc, int lun,
void *cmd, int cmdlen, void *data, int datalen, int dir,
- transfer_cb_f cb, void *priv)
+ u_int timeout, transfer_cb_f cb, void *priv)
{
KASSERT(sc->proto & (UMASS_PROTO_CBI|UMASS_PROTO_CBI_I),
("%s: umass_cbi_transfer: wrong sc->proto 0x%02x\n",
USBDEVNAME(sc->sc_dev), sc->proto));
+ /* Be a little generous. */
+ sc->timeout = timeout + UMASS_TIMEOUT;
+
/*
* Do a CBI transfer with cmdlen bytes from cmd, possibly
* a data phase of datalen bytes from/to the device and finally a
@@ -2391,7 +2399,7 @@ umass_cam_action(struct cam_sim *sim, union ccb *ccb)
}
sc->transfer(sc, ccb->ccb_h.target_lun, rcmd, rcmdlen,
csio->data_ptr,
- csio->dxfer_len, dir,
+ csio->dxfer_len, dir, ccb->ccb_h.timeout,
umass_cam_cb, (void *) ccb);
} else {
ccb->ccb_h.status = CAM_REQ_INVALID;
@@ -2569,7 +2577,7 @@ umass_cam_cb(struct umass_softc *sc, void *priv, int residue, int status)
sc->transfer(sc, ccb->ccb_h.target_lun,
rcmd, rcmdlen,
&csio->sense_data,
- csio->sense_len, DIR_IN,
+ csio->sense_len, DIR_IN, ccb->ccb_h.timeout,
umass_cam_sense_cb, (void *) ccb);
} else {
panic("transform(REQUEST_SENSE) failed");
@@ -2669,7 +2677,7 @@ umass_cam_sense_cb(struct umass_softc *sc, void *priv, int residue, int status)
&rcmd, &rcmdlen)) {
sc->transfer(sc, ccb->ccb_h.target_lun,
rcmd, rcmdlen,
- NULL, 0, DIR_NONE,
+ NULL, 0, DIR_NONE, ccb->ccb_h.timeout,
umass_cam_quirk_cb, (void *) ccb);
} else {
panic("transform(TEST_UNIT_READY) failed");
OpenPOWER on IntegriCloud