The parenthesis was misplaced
Signed-off-by: Roel Kluin <[email protected]>
---
Is this maybe, as the comment states, why blanking a cdrw at speed 4
was unreliable?
diff --git a/drivers/usb/storage/shuttle_usbat.c b/drivers/usb/storage/shuttle_usbat.c
index b62a288..b958db5 100644
--- a/drivers/usb/storage/shuttle_usbat.c
+++ b/drivers/usb/storage/shuttle_usbat.c
@@ -1645,8 +1645,8 @@ static int usbat_hp8200e_transport(struct scsi_cmnd *srb, struct us_data *us)
if ((result = usbat_write_block(us,
USBAT_ATA, srb->cmnd, 12,
- (srb->cmnd[0]==GPCMD_BLANK ? 75 : 10), 0) !=
- USB_STOR_TRANSPORT_GOOD)) {
+ (srb->cmnd[0]==GPCMD_BLANK ? 75 : 10), 0)) !=
+ USB_STOR_TRANSPORT_GOOD) {
return result;
}
On Mon, 2010-02-15 at 23:40 +0100, Roel Kluin wrote:
> The parenthesis was misplaced
>
> Signed-off-by: Roel Kluin <[email protected]>
> ---
> Is this maybe, as the comment states, why blanking a cdrw at speed 4
> was unreliable?
>
> diff --git a/drivers/usb/storage/shuttle_usbat.c b/drivers/usb/storage/shuttle_usbat.c
> index b62a288..b958db5 100644
> --- a/drivers/usb/storage/shuttle_usbat.c
> +++ b/drivers/usb/storage/shuttle_usbat.c
> @@ -1645,8 +1645,8 @@ static int usbat_hp8200e_transport(struct scsi_cmnd *srb, struct us_data *us)
>
> if ((result = usbat_write_block(us,
> USBAT_ATA, srb->cmnd, 12,
> - (srb->cmnd[0]==GPCMD_BLANK ? 75 : 10), 0) !=
> - USB_STOR_TRANSPORT_GOOD)) {
> + (srb->cmnd[0]==GPCMD_BLANK ? 75 : 10), 0)) !=
> + USB_STOR_TRANSPORT_GOOD) {
> return result;
> }
I think it'd be better if you hoisted the set'n'test out of the if()
Isn't this the current logic?
result = usbat_write_block(us, USBAT_ATA, srb->cmnd, 12,
srb->cmnd[0] == GPCMD_BLANK ? 75 : 10, 0);
result = result != USB_STOR_TRANSPORT_GOOD;
if (result)
return result;
I wonder if it should be:
result = usbat_write_block(us, USBAT_ATA, srb->cmnd, 12,
srb->cmnd[0] == GPCMD_BLANK ? 75 : 10, 0);
if (result != USB_STOR_TRANSPORT_GOOD)
return result;
> I think it'd be better if you hoisted the set'n'test out of the if()
ok, I agree.
> Isn't this the current logic?
>
> result = usbat_write_block(us, USBAT_ATA, srb->cmnd, 12,
> srb->cmnd[0] == GPCMD_BLANK ? 75 : 10, 0);
> result = result != USB_STOR_TRANSPORT_GOOD;
> if (result)
> return result;
Thanks for your comments, Yes that was the current logic, which I thought
was wrong, but now I think it could also be obscurely written but right:
in drivers/usb/storage/transport.h line 100 note the definitions:
#define USB_STOR_TRANSPORT_GOOD 0 /* Transport good, command good */
#define USB_STOR_TRANSPORT_FAILED 1 /* Transport good, command failed */
#define USB_STOR_TRANSPORT_NO_SENSE 2 /* Command failed, no auto-sense */
#define USB_STOR_TRANSPORT_ERROR 3 /* Transport bad (i.e. device dead) */
With the current logic usbat_hp8200e_transport() returns TRANSPORT_FAILED,
even if usbat_write_block() returned TRANSPORT_NO_SENSE or TRANSPORT_ERROR.
This could be intended, but then the author chose a very obscure way to write:
if (usbat_write_block(us, USBAT_ATA, srb->cmnd, 12,
srb->cmnd[0] == GPCMD_BLANK ? 75 : 10, 0) !=
USB_STOR_TRANSPORT_GOOD)
return USB_STOR_TRANSPORT_FAILED;
Or was the parenthesis misplaced and should it really be:
result = usbat_write_block(us, USBAT_ATA, srb->cmnd, 12,
srb->cmnd[0] == GPCMD_BLANK ? 75 : 10, 0);
if (result != USB_STOR_TRANSPORT_GOOD)
return result;
Maybe someone with the specs/more knowledge of this driver could look into
this?
Thanks, Roel
On Tue, 16 Feb 2010, Roel Kluin wrote:
> > I think it'd be better if you hoisted the set'n'test out of the if()
>
> ok, I agree.
>
> > Isn't this the current logic?
> >
> > result = usbat_write_block(us, USBAT_ATA, srb->cmnd, 12,
> > srb->cmnd[0] == GPCMD_BLANK ? 75 : 10, 0);
> > result = result != USB_STOR_TRANSPORT_GOOD;
> > if (result)
> > return result;
>
> Thanks for your comments, Yes that was the current logic, which I thought
> was wrong, but now I think it could also be obscurely written but right:
>
> in drivers/usb/storage/transport.h line 100 note the definitions:
>
> #define USB_STOR_TRANSPORT_GOOD 0 /* Transport good, command good */
> #define USB_STOR_TRANSPORT_FAILED 1 /* Transport good, command failed */
> #define USB_STOR_TRANSPORT_NO_SENSE 2 /* Command failed, no auto-sense */
> #define USB_STOR_TRANSPORT_ERROR 3 /* Transport bad (i.e. device dead) */
>
> With the current logic usbat_hp8200e_transport() returns TRANSPORT_FAILED,
> even if usbat_write_block() returned TRANSPORT_NO_SENSE or TRANSPORT_ERROR.
>
> This could be intended, but then the author chose a very obscure way to write:
>
> if (usbat_write_block(us, USBAT_ATA, srb->cmnd, 12,
> srb->cmnd[0] == GPCMD_BLANK ? 75 : 10, 0) !=
> USB_STOR_TRANSPORT_GOOD)
> return USB_STOR_TRANSPORT_FAILED;
>
> Or was the parenthesis misplaced and should it really be:
>
> result = usbat_write_block(us, USBAT_ATA, srb->cmnd, 12,
> srb->cmnd[0] == GPCMD_BLANK ? 75 : 10, 0);
>
> if (result != USB_STOR_TRANSPORT_GOOD)
> return result;
>
> Maybe someone with the specs/more knowledge of this driver could look into
> this?
It seems pretty clear that your patch was correct and the parens were
misplaced. In usb-storage, transport routines like
usbat_hp8200e_transport() are supposed to return one of the
USB_STOR_TRANSPORT_* codes, not a Boolean value.
I do agree with Joe that it would be better form to separate the
function call and the "if" into two statements, as in your second
version above. Compare with the code a few lines higher:
if ( (result = usbat_multiple_write(us,
registers, data, 7)) != USB_STOR_TRANSPORT_GOOD) {
return result;
}
The meaning is clear, even though this also unnecessarily squeezes a
function call and a test into one statement and includes unneeded {}'s.
Alan Stern
Due to a misplaced parenthesis the usbat_write_block() return value was not
stored, but a boolean. USB_STOR_TRANSPORT_NO_SENSE and USB_STOR_TRANSPORT_ERROR
were returned as USB_STOR_TRANSPORT_FAILED.
Signed-off-by: Roel Kluin <[email protected]>
---
>> in drivers/usb/storage/transport.h line 100 note the definitions:
>>
>> #define USB_STOR_TRANSPORT_GOOD 0 /* Transport good, command good */
>> #define USB_STOR_TRANSPORT_FAILED 1 /* Transport good, command failed */
>> #define USB_STOR_TRANSPORT_NO_SENSE 2 /* Command failed, no auto-sense */
>> #define USB_STOR_TRANSPORT_ERROR 3 /* Transport bad (i.e. device dead) */
> It seems pretty clear that your patch was correct and the parens were
> misplaced. In usb-storage, transport routines like
> usbat_hp8200e_transport() are supposed to return one of the
> USB_STOR_TRANSPORT_* codes, not a Boolean value.
>
> I do agree with Joe that it would be better form to separate the
> function call and the "if" into two statements, as in your second
> version above.
Ok, thanks for comments, This should fix and separate the assignment as desired.
Roel
diff --git a/drivers/usb/storage/shuttle_usbat.c b/drivers/usb/storage/shuttle_usbat.c
index b62a288..bd3f415 100644
--- a/drivers/usb/storage/shuttle_usbat.c
+++ b/drivers/usb/storage/shuttle_usbat.c
@@ -1628,10 +1628,10 @@ static int usbat_hp8200e_transport(struct scsi_cmnd *srb, struct us_data *us)
return USB_STOR_TRANSPORT_ERROR;
}
- if ( (result = usbat_multiple_write(us,
- registers, data, 7)) != USB_STOR_TRANSPORT_GOOD) {
+ result = usbat_multiple_write(us, registers, data, 7);
+
+ if (result != USB_STOR_TRANSPORT_GOOD)
return result;
- }
/*
* Write the 12-byte command header.
@@ -1643,12 +1643,11 @@ static int usbat_hp8200e_transport(struct scsi_cmnd *srb, struct us_data *us)
* AT SPEED 4 IS UNRELIABLE!!!
*/
- if ((result = usbat_write_block(us,
- USBAT_ATA, srb->cmnd, 12,
- (srb->cmnd[0]==GPCMD_BLANK ? 75 : 10), 0) !=
- USB_STOR_TRANSPORT_GOOD)) {
+ result = usbat_write_block(us, USBAT_ATA, srb->cmnd, 12,
+ srb->cmnd[0] == GPCMD_BLANK ? 75 : 10, 0);
+
+ if (result != USB_STOR_TRANSPORT_GOOD)
return result;
- }
/* If there is response data to be read in then do it here. */