lkml.org 
[lkml]   [2007]   [Nov]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH] pf broken
    Date
    Hello,
    the pf driver for parallel port floppy drives seems to be broken. At least
    with Imation SuperDisk with EPAT chip, the driver calls pi_connect() and
    pi_disconnect after each transferred sector. At least with EPAT, this
    operation is very expensive - causes drive recalibration. Thus, transferring
    even a single byte (dd if=/dev/pf0 of=/dev/null bs=1 count=1) takes 20
    seconds, making the driver useless.

    The pf_next_buf() function seems to be broken as it returns 1 always (except
    when pf_run is non-zero), causing the loop in do_pf_read_drq (and
    do_pf_write_drq) to be executed only once.

    The following patch fixes this problem. It also fixes swapped descriptions in
    pf_lock() function and removes DBMSG macro, which seems useless.

    --
    Ondrej Zary

    --- linux-2.6.23-orig/drivers/block/paride/pf.c 2007-10-09 22:31:38.000000000
    +0200
    +++ linux/drivers/block/paride/pf.c 2007-11-08 22:29:31.000000000 +0100
    @@ -488,13 +488,11 @@
    return r;
    }

    -#define DBMSG(msg) ((verbose>1)?(msg):NULL)
    -
    static void pf_lock(struct pf_unit *pf, int func)
    {
    char lo_cmd[12] = { ATAPI_LOCK, pf->lun << 5, 0, 0, func, 0, 0, 0, 0, 0, 0,
    0 };

    - pf_atapi(pf, lo_cmd, 0, pf_scratch, func ? "unlock" : "lock");
    + pf_atapi(pf, lo_cmd, 0, pf_scratch, func ? "lock" : "unlock");
    }

    static void pf_eject(struct pf_unit *pf)
    @@ -555,7 +553,7 @@
    { ATAPI_MODE_SENSE, pf->lun << 5, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0 };
    char buf[8];

    - pf_atapi(pf, ms_cmd, 8, buf, DBMSG("mode sense"));
    + pf_atapi(pf, ms_cmd, 8, buf, "mode sense");
    pf->media_status = PF_RW;
    if (buf[3] & 0x80)
    pf->media_status = PF_RO;
    @@ -591,7 +589,7 @@
    char buf[8];
    int bs;

    - if (pf_atapi(pf, rc_cmd, 8, buf, DBMSG("get capacity"))) {
    + if (pf_atapi(pf, rc_cmd, 8, buf, "get capacity")) {
    pf->media_status = PF_NM;
    return;
    }
    @@ -804,13 +802,18 @@
    pf_buf += 512;
    pf_block++;
    if (!pf_run)
    - return 0;
    - if (!pf_count)
    return 1;
    - spin_lock_irqsave(&pf_spin_lock, saved_flags);
    - pf_end_request(1);
    - spin_unlock_irqrestore(&pf_spin_lock, saved_flags);
    - return 1;
    + if (!pf_count) {
    + spin_lock_irqsave(&pf_spin_lock, saved_flags);
    + pf_end_request(1);
    + pf_req = elv_next_request(pf_queue);
    + spin_unlock_irqrestore(&pf_spin_lock, saved_flags);
    + if (!pf_req)
    + return 1;
    + pf_count = pf_req->current_nr_sectors;
    + pf_buf = pf_req->buffer;
    + }
    + return 0;
    }

    static inline void next_request(int success)
    -
    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: 2007-11-08 23:01    [W:3.379 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site