lkml.org 
[lkml]   [2002]   [Jul]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patches in this message
    /
    Date
    From
    Subject[PATCH] drivers/ide/qd65xx: no cli/sti (2.4.19-pre3 & 2.5.28)
    Hello,

    Here are patches for 2.4.19-pre3 & 2.5.28 which free them from using
    cli/sti in qd65xx stuff. (also using ide's OUT_BYTE / IN_BYTE btw)

    IMHO, it may use its own spinlock, instead of using io_request_lock as
    suggested in pre3-ac, since what we have to protect is this card from
    parallel selectprocing 2 channels at a time which may upset the board (I
    don't know, and don't have a vlb smp system to test)

    2 qd6500 boards may be ok to parallelize it, I don't know (I don't have
    any)...

    for 2.4.19rc3:

    --- linux-2.4.19rc3/drivers/ide/qd65xx.c Thu Jul 25 01:03:28 2002
    +++ linux-2.4.19rc3/drivers/ide/qd65xx.c Thu Jul 25 01:26:33 2002
    @@ -88,14 +88,15 @@

    static int timings[4]={-1,-1,-1,-1}; /* stores current timing for each timer */

    +static spinlock_t qd_lock = SPIN_LOCK_UNLOCKED; /* lock for i/o operations */
    +
    static void qd_write_reg (byte content, byte reg)
    {
    unsigned long flags;

    - save_flags(flags); /* all CPUs */
    - cli(); /* all CPUs */
    - outb(content,reg);
    - restore_flags(flags); /* all CPUs */
    + spin_lock_irqsave(&qd_lock, flags);
    + OUT_BYTE(content,reg);
    + spin_unlock_irqrestore(&qd_lock, flags);
    }

    byte __init qd_read_reg (byte reg)
    @@ -103,10 +104,9 @@
    unsigned long flags;
    byte read;

    - save_flags(flags); /* all CPUs */
    - cli(); /* all CPUs */
    - read = inb(reg);
    - restore_flags(flags); /* all CPUs */
    + spin_lock_irqsave(&qd_lock, flags);
    + read = IN_BYTE(reg);
    + spin_unlock_irqrestore(&qd_lock, flags);
    return read;
    }

    @@ -311,13 +311,12 @@
    byte readreg;
    unsigned long flags;

    - save_flags(flags); /* all CPUs */
    - cli(); /* all CPUs */
    - savereg = inb_p(port);
    - outb_p(QD_TESTVAL,port); /* safe value */
    - readreg = inb_p(port);
    - outb(savereg,port);
    - restore_flags(flags); /* all CPUs */
    + spin_lock_irqsave(&qd_lock, flags);
    + savereg = IN_BYTE(port);
    + OUT_BYTE(QD_TESTVAL,port); /* safe value */
    + readreg = IN_BYTE(port);
    + OUT_BYTE(savereg,port);
    + spin_unlock_irqrestore(&qd_lock, flags);

    if (savereg == QD_TESTVAL) {
    printk(KERN_ERR "Outch ! the probe for qd65xx isn't reliable !\n");
    @@ -336,7 +335,7 @@
    * return 1 if another qd may be probed
    */

    -int __init probe (int base)
    +static int __init qd_probe(int base)
    {
    byte config;
    byte index;
    @@ -449,5 +448,5 @@

    void __init init_qd65xx (void)
    {
    - if (probe(0x30)) probe(0xb0);
    + if (qd_probe(0x30)) qd_probe(0xb0);
    }
    (also corrected silly non-static probe function !)

    for 2.5.28:

    --- linux-2.5.28/drivers/ide/qd65xx.c Thu Jul 25 01:10:26 2002
    +++ linux-2.5.28/drivers/ide/qd65xx.c Thu Jul 25 01:09:09 2002
    @@ -85,14 +85,15 @@

    static int timings[4]={-1,-1,-1,-1}; /* stores current timing for each timer */

    +static spinlock_t qd_lock = SPIN_LOCK_UNLOCKED; /* lock for i/o operations */
    +
    static void qd_write_reg(byte content, byte reg)
    {
    unsigned long flags;

    - save_flags(flags); /* all CPUs */
    - cli(); /* all CPUs */
    - outb(content,reg);
    - restore_flags(flags); /* all CPUs */
    + spin_lock_irqsave(&qd_lock, flags);
    + OUT_BYTE(content,reg);
    + spin_unlock_irqrestore(&qd_lock, flags);
    }

    byte __init qd_read_reg(byte reg)
    @@ -100,10 +101,9 @@
    unsigned long flags;
    byte read;

    - save_flags(flags); /* all CPUs */
    - cli(); /* all CPUs */
    - read = inb(reg);
    - restore_flags(flags); /* all CPUs */
    + spin_lock_irqsave(&qd_lock, flags);
    + read = IN_BYTE(reg);
    + spin_unlock_irqrestore(&qd_lock, flags);
    return read;
    }

    @@ -309,13 +309,12 @@
    byte readreg;
    unsigned long flags;

    - save_flags(flags); /* all CPUs */
    - cli(); /* all CPUs */
    - savereg = inb_p(port);
    - outb_p(QD_TESTVAL, port); /* safe value */
    - readreg = inb_p(port);
    - outb(savereg, port);
    - restore_flags(flags); /* all CPUs */
    + spin_lock_irqsave(&qd_lock, flags);
    + savereg = IN_BYTE(port);
    + OUT_BYTE(QD_TESTVAL,port); /* safe value */
    + readreg = IN_BYTE(port);
    + OUT_BYTE(savereg,port);
    + spin_unlock_irqrestore(&qd_lock, flags);

    if (savereg == QD_TESTVAL) {
    printk(KERN_ERR "Outch ! the probe for qd65xx isn't reliable !\n");

    Regards,

    Samuel Thibault

    -
    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: 2005-03-22 13:27    [W:0.034 / U:30.764 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site