usb : mass storage : short_not_ok for non usb3 udc

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



The short_not_ok field is used by class drivers to indicate udc whether short packet is expected during a particular transfer.
In case of mass storage, during command and status phase this field is set as false and set to true during data phase.
musb driver uses this field to decide whether to program DMA for mode1.
This code is essential for musb driver to program DMA.

Signed-off-by: Balakumar Rajendran <balakumar.rajendran@xxxxxxxxxxxxxx>
Signed-off-by: Rajaram R <ragupathy.rajaram@xxxxxxxxxxxxxx>
---
 drivers/usb/gadget/f_mass_storage.c |    9 +++++++++
 1 files changed, 9 insertions(+), 0 deletions(-)

diff --git a/drivers/usb/gadget/f_mass_storage.c b/drivers/usb/gadget/f_mass_storage.c
index f67b453..db8bf4a 100644
--- a/drivers/usb/gadget/f_mass_storage.c
+++ b/drivers/usb/gadget/f_mass_storage.c
@@ -878,6 +878,7 @@ static int do_write(struct fsg_common *common)
 	unsigned int		amount;
 	ssize_t			nwritten;
 	int			rc;
+	struct usb_gadget *gadget = common->cdev->gadget;
 
 	if (curlun->ro) {
 		curlun->sense_data = SS_WRITE_PROTECTED; @@ -960,6 +961,8 @@ static int do_write(struct fsg_common *common)
 			 * the bulk-out maxpacket size.
 			 */
 			set_bulk_out_req_length(common, bh, amount);
+			if (!gadget_is_superspeed(gadget))
+				bh->outreq->short_not_ok = 1;
 			if (!start_out_transfer(common, bh))
 				/* Dunno what to do if common->fsg is NULL */
 				return -EIO;
@@ -1584,6 +1587,7 @@ static int throw_away_data(struct fsg_common *common)
 	struct fsg_buffhd	*bh;
 	u32			amount;
 	int			rc;
+	struct usb_gadget *gadget = common->cdev->gadget;
 
 	for (bh = common->next_buffhd_to_drain;
 	     bh->state != BUF_STATE_EMPTY || common->usb_amount_left > 0; @@ -1617,6 +1621,8 @@ static int throw_away_data(struct fsg_common *common)
 			 * the bulk-out maxpacket size.
 			 */
 			set_bulk_out_req_length(common, bh, amount);
+			if (!gadget_is_superspeed(gadget))
+				bh->outreq->short_not_ok = 1;
 			if (!start_out_transfer(common, bh))
 				/* Dunno what to do if common->fsg is NULL */
 				return -EIO;
@@ -2292,6 +2298,7 @@ static int get_next_command(struct fsg_common *common)  {
 	struct fsg_buffhd	*bh;
 	int			rc = 0;
+	struct usb_gadget *gadget = common->cdev->gadget;
 
 	/* Wait for the next buffer to become available */
 	bh = common->next_buffhd_to_fill;
@@ -2303,6 +2310,8 @@ static int get_next_command(struct fsg_common *common)
 
 	/* Queue a request to read a Bulk-only CBW */
 	set_bulk_out_req_length(common, bh, US_BULK_CB_WRAP_LEN);
+	if (!gadget_is_superspeed(gadget))
+		bh->outreq->short_not_ok = 0;
 	if (!start_out_transfer(common, bh))
 		/* Don't know what to do if common->fsg is NULL */
 		return -EIO;
--
1.7.4.3

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux