lkml.org 
[lkml]   [2004]   [Jun]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: 2.6.7-rc1 breaks forcedeth
    Linus Torvalds wrote:

    >I suspect that the driver should at the very least make sure to disable
    >any potentially pending interrupts in the "nv_probe()" function. I have no
    >idea how to do that, but it looks like something like
    >
    > writel(0, base + NvRegIrqMask);
    > writel(NVREG_IRQSTAT_MASK, base + NvRegIrqStatus);
    >
    >should probably do it. It would be better to reset the thing completely,
    >methinks, but whatever.
    >
    >
    >
    I'll add that, but it's only a partial fix: what if ehci_hcd is loaded
    before the forcedeth driver?

    Luis, could you apply the patch and boot with it? It should print
    something like

    forcedeth: irq line 11, Status 0x00000020, Mask 0x00000020

    If mask and status are really not zero, then it explains your problems.
    Additionally I try to reset the nic in nv_probe - there were a few
    reports seemed to indicate that the nic generates timer interrupts even
    if the mask is zero.

    --
    Manfred
    --- 2.6/drivers/net/forcedeth.c 2004-05-10 04:31:59.000000000 +0200
    +++ build-2.6/drivers/net/forcedeth.c 2004-06-06 10:31:43.826368991 +0200
    @@ -1195,16 +1195,13 @@
    enable_irq(dev->irq);
    }

    -static int nv_open(struct net_device *dev)
    +static void nv_reset(struct net_device *dev)
    {
    - struct fe_priv *np = get_nvpriv(dev);
    u8 *base = get_hwbase(dev);
    - int ret, oom, i;

    - dprintk(KERN_DEBUG "nv_open: begin\n");
    + writel(0, base + NvRegIrqMask);
    + writel(NVREG_IRQSTAT_MASK, base + NvRegIrqStatus);

    - /* 1) erase previous misconfiguration */
    - /* 4.1-1: stop adapter: ignored, 4.3 seems to be overkill */
    writel(NVREG_MCASTADDRA_FORCE, base + NvRegMulticastAddrA);
    writel(0, base + NvRegMulticastAddrB);
    writel(0, base + NvRegMulticastMaskA);
    @@ -1215,6 +1212,20 @@
    writel(0, base + NvRegUnknownTransmitterReg);
    nv_txrx_reset(dev);
    writel(0, base + NvRegUnknownSetupReg6);
    + pci_push(base);
    +}
    +
    +static int nv_open(struct net_device *dev)
    +{
    + struct fe_priv *np = get_nvpriv(dev);
    + u8 *base = get_hwbase(dev);
    + int ret, oom, i;
    +
    + dprintk(KERN_DEBUG "nv_open: begin\n");
    +
    + /* 1) erase previous misconfiguration */
    + /* 4.1-1: stop adapter: ignored, 4.3 seems to be overkill */
    + nv_reset(dev);

    /* 2) initialize descriptor rings */
    np->in_shutdown = 0;
    @@ -1506,6 +1517,11 @@
    writel(0, base + NvRegWakeUpFlags);
    np->wolenabled = 0;

    +printk(KERN_ERR "forcedeth: irq line %d, Status 0x%8x, Mask %0x8x\n",
    + pci_dev->irq, readl(base + NvRegIrqStatus),
    + readl(base + NvRegIrqMask));
    + nv_reset(dev);
    +
    np->tx_flags = cpu_to_le16(NV_TX_LASTPACKET|NV_TX_LASTPACKET1|NV_TX_VALID);
    if (id->driver_data & DEV_NEED_LASTPACKET1)
    np->tx_flags |= cpu_to_le16(NV_TX_LASTPACKET1);
    \
     
     \ /
      Last update: 2005-03-22 14:03    [W:0.024 / U:30.304 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site