lkml.org 
[lkml]   [2004]   [Dec]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[patch] scsi/libata: correct bug for ULi M5281
    From
    Date

    Hi, Jeff

    The sata_uli patch for m5281 looks fine,but some of M5281 chip's PHY
    is not stable sometime, so it need a workaround to correct the bug.

    patch_M5281workaround is just for it.

    The patch is applied to kernel 2.6.9. Pleases apply to new kernels, thanks
    a lot.

    Signed-off-by: Clear Zhang <Clear.Zhang@uli.com.tw>

    Thanks (See attached file: patch_M5281workaround)
    Clear




    Jeff Garzik
    <jgarzik@pobox.c 收件人: Clear.Zhang@uli.com.tw
    om> 抄送: Peer.Chen@uli.com.tw, Emily.Jiang@uli.com.tw, Eric.Lo@uli.com.tw
    主题: Re: [patch] net/tulip: Add support for ULi M526X
    2004-11-17 05:12





    The patch format looks good. I will review and apply, thanks.

    BTW, I just merged support for 5281 SATA.

    The email containing this patch is attached. This will appear in Linux
    kernel 2.4.29 and 2.6.11.

    Regards,

    Jeff




    -----来自 Jeff Garzik <jgarzik@pobox.com> 的消息,在 Tue, 16 Nov 2004
    02:21:31 -0500 -----

    收件人: linux-ide@vger.kernel.org

    抄送: linux-kernel@vger.kernel.org

    主题: [PATCH] ULi SATA fixes, new support




    Another one just checked into libata-dev-2.6.


    drivers/scsi/sata_uli.c | 51
    +++++++++++++++++++++---------------------------
    1 files changed, 23 insertions(+), 28 deletions(-)

    through these ChangeSets:

    <jgarzik@pobox.com> (04/11/16 1.2169)
    [libata sata_uli] add 5281 support, fix SATA phy setup for others

    Contributed by Peer Chen @ ULi and tested by a user.

    diff -Nru a/drivers/scsi/sata_uli.c b/drivers/scsi/sata_uli.c
    --- a/drivers/scsi/sata_uli.c 2004-11-16 02:19:58 -05:00
    +++ b/drivers/scsi/sata_uli.c 2004-11-16 02:19:58 -05:00
    @@ -32,16 +32,18 @@
    #include <linux/libata.h>

    #define DRV_NAME "sata_uli"
    -#define DRV_VERSION "0.2"
    +#define DRV_VERSION "0.5"

    enum {
    uli_5289 = 0,
    uli_5287 = 1,
    + uli_5281 = 2,

    /* PCI configuration registers */
    - ULI_SCR_BASE = 0x90, /* sata0 phy SCR
    registers */
    - ULI_SATA1_OFS = 0x10, /* offset from
    sata0->sata1 phy regs */
    -
    + ULI5287_BASE = 0x90, /* sata0 phy SCR
    registers */
    + ULI5287_OFFS = 0x10, /* offset from
    sata0->sata1 phy regs */
    + ULI5281_BASE = 0x60, /* sata0 phy SCR
    registers */
    + ULI5281_OFFS = 0x60, /* offset from
    sata0->sata1 phy regs */
    };

    static int uli_init_one (struct pci_dev *pdev, const struct pci_device_id
    *ent);
    @@ -51,6 +53,7 @@
    static struct pci_device_id uli_pci_tbl[] = {
    { PCI_VENDOR_ID_AL, 0x5289, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
    uli_5289 },
    { PCI_VENDOR_ID_AL, 0x5287, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
    uli_5287 },
    + { PCI_VENDOR_ID_AL, 0x5281, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
    uli_5281 },
    { } /* terminate list */
    };

    @@ -125,33 +128,15 @@
    MODULE_DEVICE_TABLE(pci, uli_pci_tbl);
    MODULE_VERSION(DRV_VERSION);

    -static unsigned int get_scr_cfg_addr(unsigned int port_no, unsigned int
    sc_reg)
    +static unsigned int get_scr_cfg_addr(struct ata_port *ap, unsigned int
    sc_reg)
    {
    - unsigned int addr = ULI_SCR_BASE + (4 * sc_reg);
    -
    - switch (port_no) {
    - case 0:
    - break;
    - case 1:
    - addr += ULI_SATA1_OFS;
    - break;
    - case 2:
    - addr += ULI_SATA1_OFS*4;
    - break;
    - case 3:
    - addr += ULI_SATA1_OFS*5;
    - break;
    - default:
    - BUG();
    - break;
    - }
    - return addr;
    + return ap->ioaddr.scr_addr + (4 * sc_reg);
    }

    static u32 uli_scr_cfg_read (struct ata_port *ap, unsigned int sc_reg)
    {
    struct pci_dev *pdev = to_pci_dev(ap->host_set->dev);
    - unsigned int cfg_addr = get_scr_cfg_addr(ap->port_no, sc_reg);
    + unsigned int cfg_addr = get_scr_cfg_addr(ap, sc_reg);
    u32 val;

    pci_read_config_dword(pdev, cfg_addr, &val);
    @@ -161,7 +146,7 @@
    static void uli_scr_cfg_write (struct ata_port *ap, unsigned int scr, u32
    val)
    {
    struct pci_dev *pdev = to_pci_dev(ap->host_set->dev);
    - unsigned int cfg_addr = get_scr_cfg_addr(ap->port_no, scr);
    + unsigned int cfg_addr = get_scr_cfg_addr(ap, scr);

    pci_write_config_dword(pdev, cfg_addr, val);
    }
    @@ -222,9 +207,11 @@
    rc = -ENOMEM;
    goto err_out_regions;
    }
    -
    +
    switch (board_idx) {
    case uli_5287:
    + probe_ent->port[0].scr_addr = ULI5287_BASE;
    + probe_ent->port[1].scr_addr = ULI5287_BASE +
    ULI5287_OFFS;
    probe_ent->n_ports = 4;

    probe_ent->port[2].cmd_addr =
    pci_resource_start(pdev, 0) + 8;
    @@ -232,19 +219,27 @@
    probe_ent->port[2].ctl_addr =
    (pci_resource_start(pdev, 1) |
    ATA_PCI_CTL_OFS) + 4;
    probe_ent->port[2].bmdma_addr =
    pci_resource_start(pdev, 4) + 16;
    + probe_ent->port[2].scr_addr = ULI5287_BASE +
    ULI5287_OFFS*4;

    probe_ent->port[3].cmd_addr =
    pci_resource_start(pdev, 2) + 8;
    probe_ent->port[3].altstatus_addr =
    probe_ent->port[3].ctl_addr =
    (pci_resource_start(pdev, 3) |
    ATA_PCI_CTL_OFS) + 4;
    probe_ent->port[3].bmdma_addr =
    pci_resource_start(pdev, 4) + 24;
    + probe_ent->port[3].scr_addr = ULI5287_BASE +
    ULI5287_OFFS*5;

    ata_std_ports(&probe_ent->port[2]);
    ata_std_ports(&probe_ent->port[3]);
    break;

    case uli_5289:
    - /* do nothing; ata_pci_init_native_mode did it all
    */
    + probe_ent->port[0].scr_addr = ULI5287_BASE;
    + probe_ent->port[1].scr_addr = ULI5287_BASE +
    ULI5287_OFFS;
    + break;
    +
    + case uli_5281:
    + probe_ent->port[0].scr_addr = ULI5281_BASE;
    + probe_ent->port[1].scr_addr = ULI5281_BASE +
    ULI5281_OFFS;
    break;

    default:





    [unhandled content-type:application/octet-stream]
    \
     
     \ /
      Last update: 2005-03-22 14:08    [W:0.034 / U:1.316 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site