From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from list by lists.gnu.org with archive (Exim 4.71) id 1U9h2x-0004Yp-5e for mharc-grub-devel@gnu.org; Sun, 24 Feb 2013 14:15:39 -0500 Received: from eggs.gnu.org ([208.118.235.92]:49364) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1U9h2u-0004YS-1N for grub-devel@gnu.org; Sun, 24 Feb 2013 14:15:38 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1U9h2m-0008Fv-Jm for grub-devel@gnu.org; Sun, 24 Feb 2013 14:15:35 -0500 Received: from mail-wg0-f49.google.com ([74.125.82.49]:47509) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1U9h2m-0008Ff-AE for grub-devel@gnu.org; Sun, 24 Feb 2013 14:15:28 -0500 Received: by mail-wg0-f49.google.com with SMTP id 15so1809384wgd.4 for ; Sun, 24 Feb 2013 11:15:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:subject :references:in-reply-to:x-enigmail-version:content-type; bh=OCYoLx1KUM/p/0z5oXRHvrPieWhkw9TfKvKjgtjB2oQ=; b=tIPDbChRqxIKzKEUsJZiUQhUVq/Oa0MsPkNJz/BenbaAp+q+l1VWObpsvlQrtUGrDs saA2f60COWjykRiiKk1CP2m3jIZiPPoDyW4E5dxKTYHXVkNYHb3HxaNPXfjDQ9WCDydn WKJJ/ANnuJA6HLeZ1YQJhfF/xidBDBIye3gblJPrL5wf1XwNEGFThsSpbAH6DdYQ7/5e qIiDF7W4nLxqSP3DDa0rr3yPmGeptO4INLfF3h9Xqz0kpsxZsDlPtp1Q0tUz8/Lo7IIK 5R+f3pS9ZijQi4a1j+OPpzrn4qCdXGYRhk4ZXjgur7a+T0/3panxB5gk6vtrzkxQyU5/ WUBA== X-Received: by 10.180.92.129 with SMTP id cm1mr7982367wib.10.1361732990339; Sun, 24 Feb 2013 11:09:50 -0800 (PST) Received: from debian.x201.phnet (245-188.1-85.cust.bluewin.ch. [85.1.188.245]) by mx.google.com with ESMTPS id er3sm10660178wib.1.2013.02.24.11.09.49 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sun, 24 Feb 2013 11:09:49 -0800 (PST) Message-ID: <512A657A.5020307@gmail.com> Date: Sun, 24 Feb 2013 20:09:46 +0100 From: =?UTF-8?B?VmxhZGltaXIgJ8+GLWNvZGVyL3BoY29kZXInIFNlcmJpbmVua28=?= User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:10.0.12) Gecko/20130116 Icedove/10.0.12 MIME-Version: 1.0 To: The development of GNU GRUB Subject: Re: [PATCH] Long USB transfers problem References: <1354402009.2479.108.camel@pracovna> <50FC659C.6020105@gmail.com> <1360624408.2624.88.camel@pracovna> In-Reply-To: <1360624408.2624.88.camel@pracovna> X-Enigmail-Version: 1.4.1 Content-Type: multipart/signed; micalg=pgp-sha512; protocol="application/pgp-signature"; boundary="------------enig1E7FEB92BE749481E93857E3" X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 74.125.82.49 X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list Reply-To: The development of GNU GRUB List-Id: The development of GNU GRUB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 24 Feb 2013 19:15:38 -0000 This is an OpenPGP/MIME signed message (RFC 2440 and 3156) --------------enig1E7FEB92BE749481E93857E3 Content-Type: multipart/mixed; boundary="------------000809040209020800020202" This is a multi-part message in MIME format. --------------000809040209020800020202 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Please try attached patch --------------000809040209020800020202 Content-Type: text/x-diff; name="usb_packet.diff" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="usb_packet.diff" =3D=3D=3D modified file 'grub-core/bus/usb/serial/ftdi.c' --- grub-core/bus/usb/serial/ftdi.c 2013-02-01 20:49:29 +0000 +++ grub-core/bus/usb/serial/ftdi.c 2013-02-24 18:58:04 +0000 @@ -128,7 +128,7 @@ =20 real_config (port); =20 - grub_usb_bulk_write (port->usbdev, port->out_endp->endp_addr, 1, &cc);= + grub_usb_bulk_write (port->usbdev, port->out_endp, 1, &cc); } =20 static grub_err_t =3D=3D=3D modified file 'grub-core/bus/usb/serial/pl2303.c' --- grub-core/bus/usb/serial/pl2303.c 2013-02-01 20:49:29 +0000 +++ grub-core/bus/usb/serial/pl2303.c 2013-02-24 18:57:48 +0000 @@ -146,7 +146,7 @@ =20 real_config (port); =20 - grub_usb_bulk_write (port->usbdev, port->out_endp->endp_addr, 1, &cc);= + grub_usb_bulk_write (port->usbdev, port->out_endp, 1, &cc); } =20 static grub_err_t =3D=3D=3D modified file 'grub-core/bus/usb/serial/usbdebug_late.c' --- grub-core/bus/usb/serial/usbdebug_late.c 2013-02-01 20:49:29 +0000 +++ grub-core/bus/usb/serial/usbdebug_late.c 2013-02-24 18:57:54 +0000 @@ -41,7 +41,7 @@ { char cc =3D c; =20 - grub_usb_bulk_write (port->usbdev, port->out_endp->endp_addr, 1, &cc);= + grub_usb_bulk_write (port->usbdev, port->out_endp, 1, &cc); } =20 static grub_err_t =3D=3D=3D modified file 'grub-core/bus/usb/usbtrans.c' --- grub-core/bus/usb/usbtrans.c 2013-01-20 21:45:53 +0000 +++ grub-core/bus/usb/usbtrans.c 2013-02-24 18:57:19 +0000 @@ -333,38 +333,27 @@ return err; } =20 -grub_usb_err_t -grub_usb_bulk_write (grub_usb_device_t dev, - int endpoint, grub_size_t size, char *data) -{ - grub_size_t actual; - grub_usb_err_t err; - - err =3D grub_usb_bulk_readwrite (dev, endpoint, size, data, - GRUB_USB_TRANSFER_TYPE_OUT, 1000, &actual); - if (!err && actual !=3D size) - err =3D GRUB_USB_ERR_DATA; - return err; -} - -grub_usb_err_t -grub_usb_bulk_read (grub_usb_device_t dev, - int endpoint, grub_size_t size, char *data) +static grub_usb_err_t +grub_usb_bulk_readwrite_packetize (grub_usb_device_t dev, + struct grub_usb_desc_endp *endpoint, + grub_transfer_type_t type, + grub_size_t size, char *data) { grub_size_t actual, transferred; grub_usb_err_t err; grub_size_t current_size, position; + grub_size_t max_packet =3D endpoint->maxpacket; =20 for (position =3D 0, transferred =3D 0; - position < size; position +=3D MAX_USB_TRANSFER_LEN) + position < size; position +=3D max_packet) { current_size =3D size - position; - if (current_size >=3D MAX_USB_TRANSFER_LEN) - current_size =3D MAX_USB_TRANSFER_LEN; - err =3D grub_usb_bulk_readwrite (dev, endpoint, current_size, - &data[position], GRUB_USB_TRANSFER_TYPE_IN, 1000, &actual)= ; + if (current_size >=3D max_packet) + current_size =3D max_packet; + err =3D grub_usb_bulk_readwrite (dev, endpoint->endp_addr, current= _size, + &data[position], type, 1000, &actual); transferred +=3D actual; - if (err || (current_size !=3D actual) ) break; + if (err || (current_size !=3D actual)) break; } =20 if (!err && transferred !=3D size) @@ -373,6 +362,26 @@ } =20 grub_usb_err_t +grub_usb_bulk_read (grub_usb_device_t dev, + struct grub_usb_desc_endp *endpoint, + grub_size_t size, char *data) +{ + return grub_usb_bulk_readwrite_packetize (dev, endpoint, + GRUB_USB_TRANSFER_TYPE_IN, + size, data); +} + +grub_usb_err_t +grub_usb_bulk_write (grub_usb_device_t dev, + struct grub_usb_desc_endp *endpoint, + grub_size_t size, char *data) +{ + return grub_usb_bulk_readwrite_packetize (dev, endpoint, + GRUB_USB_TRANSFER_TYPE_OUT, + size, data); +} + +grub_usb_err_t grub_usb_check_transfer (grub_usb_transfer_t transfer, grub_size_t *actu= al) { grub_usb_err_t err; =3D=3D=3D modified file 'grub-core/disk/usbms.c' --- grub-core/disk/usbms.c 2013-01-20 15:52:15 +0000 +++ grub-core/disk/usbms.c 2013-02-24 18:56:43 +0000 @@ -326,7 +326,7 @@ =20 /* Write the request. * XXX: Error recovery is maybe still not fully correct. */ - err =3D grub_usb_bulk_write (dev->dev, dev->out->endp_addr, + err =3D grub_usb_bulk_write (dev->dev, dev->out, sizeof (cbw), (char *) &cbw); if (err) { @@ -341,7 +341,7 @@ /* Read/write the data, (maybe) according to specification. */ if (size && (read_write =3D=3D 0)) { - err =3D grub_usb_bulk_read (dev->dev, dev->in->endp_addr, size, bu= f); + err =3D grub_usb_bulk_read (dev->dev, dev->in, size, buf); grub_dprintf ("usb", "read: %d %d\n", err, GRUB_USB_ERR_STALL);=20 if (err) { @@ -362,7 +362,7 @@ } else if (size) { - err =3D grub_usb_bulk_write (dev->dev, dev->out->endp_addr, size, = buf); + err =3D grub_usb_bulk_write (dev->dev, dev->out, size, buf); grub_dprintf ("usb", "write: %d %d\n", err, GRUB_USB_ERR_STALL); grub_dprintf ("usb", "First 16 bytes of sent data:\n %02x %02x %02= x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", buf[ 0], buf[ 1], buf[ 2], buf[ 3], @@ -388,12 +388,12 @@ =20 /* Read the status - (maybe) according to specification. */ CheckCSW: - errCSW =3D grub_usb_bulk_read (dev->dev, dev->in->endp_addr, + errCSW =3D grub_usb_bulk_read (dev->dev, dev->in, sizeof (status), (char *) &status); if (errCSW) { grub_usb_clear_halt (dev->dev, dev->in->endp_addr); - errCSW =3D grub_usb_bulk_read (dev->dev, dev->in->endp_addr, + errCSW =3D grub_usb_bulk_read (dev->dev, dev->in, sizeof (status), (char *) &status); if (errCSW) { /* Bulk-only reset device. */ @@ -476,7 +476,7 @@ else if (dev->protocol =3D=3D GRUB_USBMS_PROTOCOL_CBI) { /* Try to get status from interrupt pipe */ - err =3D grub_usb_bulk_read (dev->dev, dev->intrpt->endp_addr, + err =3D grub_usb_bulk_read (dev->dev, dev->intrpt, 2, (char*)&status); grub_dprintf ("usb", "CBI cmdcb setup status: err=3D%d, status= =3D0x%x\n", err, status); } @@ -487,7 +487,7 @@ /* Read/write the data, (maybe) according to specification. */ if (size && (read_write =3D=3D 0)) { - err =3D grub_usb_bulk_read (dev->dev, dev->in->endp_addr, size, bu= f); + err =3D grub_usb_bulk_read (dev->dev, dev->in, size, buf); grub_dprintf ("usb", "read: %d\n", err);=20 if (err) { @@ -498,7 +498,7 @@ } else if (size) { - err =3D grub_usb_bulk_write (dev->dev, dev->out->endp_addr, size, = buf); + err =3D grub_usb_bulk_write (dev->dev, dev->out, size, buf); grub_dprintf ("usb", "write: %d\n", err); if (err) { @@ -517,7 +517,7 @@ * (we do not it yet) - ? */ if (dev->protocol =3D=3D GRUB_USBMS_PROTOCOL_CBI) { /* Check status in interrupt pipe */ - err =3D grub_usb_bulk_read (dev->dev, dev->intrpt->endp_addr, + err =3D grub_usb_bulk_read (dev->dev, dev->intrpt, 2, (char*)&status); grub_dprintf ("usb", "read status: %d\n", err); if (err) =3D=3D=3D modified file 'include/grub/usb.h' --- include/grub/usb.h 2013-01-21 21:02:24 +0000 +++ include/grub/usb.h 2013-02-24 18:47:19 +0000 @@ -87,10 +87,12 @@ =20 grub_usb_err_t grub_usb_bulk_read (grub_usb_device_t dev, - int endpoint, grub_size_t size, char *data); + struct grub_usb_desc_endp *endpoint, + grub_size_t size, char *data); grub_usb_err_t grub_usb_bulk_write (grub_usb_device_t dev, - int endpoint, grub_size_t size, char *data); + struct grub_usb_desc_endp *endpoint, + grub_size_t size, char *data); =20 grub_usb_err_t grub_usb_root_hub (grub_usb_controller_t controller); =3D=3D=3D modified file 'include/grub/usbtrans.h' --- include/grub/usbtrans.h 2013-01-20 21:45:53 +0000 +++ include/grub/usbtrans.h 2013-02-24 18:48:55 +0000 @@ -19,8 +19,6 @@ #ifndef GRUB_USBTRANS_H #define GRUB_USBTRANS_H 1 =20 -#define MAX_USB_TRANSFER_LEN 0x0800 - typedef enum { GRUB_USB_TRANSFER_TYPE_IN, --------------000809040209020800020202-- --------------enig1E7FEB92BE749481E93857E3 Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/ iF4EAREKAAYFAlEqZXsACgkQNak7dOguQgn89AD/amLd+xa98oiiQkc7cMZyFRG0 t+VU7JsQ/OUkxqkWoa8A/j1msLZcsCw9+7EhU//tpwriPAxHv5tleYzQ+U6VECBf =rSgw -----END PGP SIGNATURE----- --------------enig1E7FEB92BE749481E93857E3--