lkml.org 
[lkml]   [2008]   [Dec]   [31]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH -stable] fix USB_STORAGE_CYPRESS_ATACB
    Hi Matthieu, Matthew

    I fixed lots of "mucking directly" with scsi_cmnd and scsi_eh_save
    internal members but the actual set of srb->cmnd{,_len} is needed
    still. Though we don't need the copy since we restore the original
    command right after. If anyone can test this to verify it could
    be grate.

    Sorry for the mishap
    Boaz

    ---
    From: Boaz Harrosh <bharrosh@panasas.com>
    Subject: [PATCH] fix USB_STORAGE_CYPRESS_ATACB

    commit 64a87b24: [SCSI] Let scsi_cmnd->cmnd use request->cmd buffer
    changed the scsi_eh_prep_cmnd logic by making it clear
    the ->cmnd buffer. But the sat to cypress atacb translation supposed
    the ->cmnd buffer wasn't modified.

    This patch makes it set the ->cmnd buffer after scsi_eh_prep_cmnd call.
    The problem and a fix was reported by Matthieu CASTET <castet.matthieu@free.fr>

    It also removes all the hackery fiddling of scsi_cmnd and scsi_eh_save by
    requesting from scsi_eh_prep_cmnd to prepare a read into ->sense_buffer,
    which is much more suitable a buffer for HW transfers, then after the command
    execution the regs read is copied into regs buffer before actual preparation
    of sense_buffer.

    Also fix an alien comment character to my utf-8 editor.

    Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
    Signed-off-by: Matthieu CASTET <castet.matthieu@free.fr>
    ---
    drivers/usb/storage/cypress_atacb.c | 15 +++++++--------
    1 files changed, 7 insertions(+), 8 deletions(-)

    diff --git a/drivers/usb/storage/cypress_atacb.c b/drivers/usb/storage/cypress_atacb.c
    index 898e67d..9466a99 100644
    --- a/drivers/usb/storage/cypress_atacb.c
    +++ b/drivers/usb/storage/cypress_atacb.c
    @@ -133,19 +133,18 @@ void cypress_atacb_passthrough(struct scsi_cmnd *srb, struct us_data *us)

    /* build the command for
    * reading the ATA registers */
    - scsi_eh_prep_cmnd(srb, &ses, NULL, 0, 0);
    - srb->sdb.length = sizeof(regs);
    - sg_init_one(&ses.sense_sgl, regs, srb->sdb.length);
    - srb->sdb.table.sgl = &ses.sense_sgl;
    - srb->sc_data_direction = DMA_FROM_DEVICE;
    - srb->sdb.table.nents = 1;
    + scsi_eh_prep_cmnd(srb, &ses, NULL, 0, sizeof(regs));
    +
    /* we use the same command as before, but we set
    * the read taskfile bit, for not executing atacb command,
    * but reading register selected in srb->cmnd[4]
    */
    + srb->cmd_len = 16;
    + srb->cmnd = ses.cmnd;
    srb->cmnd[2] = 1;

    usb_stor_transparent_scsi_command(srb, us);
    + memcpy(regs, srb->sense_buffer, sizeof(regs));
    tmp_result = srb->result;
    scsi_eh_restore_cmnd(srb, &ses);
    /* we fail to get registers, report invalid command */
    @@ -162,8 +161,8 @@ void cypress_atacb_passthrough(struct scsi_cmnd *srb, struct us_data *us)

    /* XXX we should generate sk, asc, ascq from status and error
    * regs
    - * (see 11.1 Error translation � ATA device error to SCSI error map)
    - * and ata_to_sense_error from libata.
    + * (see 11.1 Error translation ATA device error to SCSI error
    + * map, and ata_to_sense_error from libata.)
    */

    /* Sense data is current and format is descriptor. */
    --
    1.6.0.1
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2008-12-31 11:37    [W:4.693 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site