From owner-freebsd-drivers@FreeBSD.ORG Mon Jul 14 14:56:54 2008 Return-Path: Delivered-To: freebsd-drivers@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id EEEC91065672 for ; Mon, 14 Jul 2008 14:56:54 +0000 (UTC) (envelope-from mirnshi@gmail.com) Received: from el-out-1112.google.com (el-out-1112.google.com [209.85.162.180]) by mx1.freebsd.org (Postfix) with ESMTP id B97AB8FC17 for ; Mon, 14 Jul 2008 14:56:54 +0000 (UTC) (envelope-from mirnshi@gmail.com) Received: by el-out-1112.google.com with SMTP id v27so762748ele.13 for ; Mon, 14 Jul 2008 07:56:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:message-id:date:from:to :subject:mime-version:content-type; bh=rc7yXTmaympevNyXkHc3knsL1IqOGagyhVoDKOPt6Po=; b=eM4oVtE37JToidc2B4tctL0FSDyvoe32zX7oMBLDKS/9EKm7ui4GHlCjW8hjyGU9pm LaGAglfdqC1zyA85qWXBLe9A4YcbHRph5QTvSyBBrwLKnd+056QxBedsYYMeQVOpxcNE TNswZQ3Nr+rUsQkzIAqqcng4GkYeW19kC6Dds= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:date:from:to:subject:mime-version:content-type; b=ed/e2jZqCpwkOpIMtCrh80bR3HKdlnyrBM4JIDwkE32aJZqoYUv3N8GCyGPoX0HQFC Ggpzw0R8I6ARJCfH60EKwPvRM3PshJdr0FTM7MwGCaCdBPcIDtzNLjz5Vx8S8hVxp2zZ 3JCQHgT0sjDvguLLjeu5ktTomtnoPA6OD7OPE= Received: by 10.151.98.16 with SMTP id a16mr20326700ybm.233.1216045836307; Mon, 14 Jul 2008 07:30:36 -0700 (PDT) Received: by 10.150.157.5 with HTTP; Mon, 14 Jul 2008 07:30:36 -0700 (PDT) Message-ID: Date: Mon, 14 Jul 2008 22:30:36 +0800 From: mirnshi@gmail.com To: freebsd-drivers@freebsd.org MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_57398_27213851.1216045836272" X-Content-Filtered-By: Mailman/MimeDel 2.1.5 Subject: patch for Attansic L2 FastEthernet X-BeenThere: freebsd-drivers@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Writing device drivers for FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 14 Jul 2008 14:56:55 -0000 ------=_Part_57398_27213851.1216045836272 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline Recently, I got an eeepc 701. And I installed FreeBSD 7.0 on it . The url http://wiki.freebsd.org/AsusEee gives me a big hand. But, the driver of lan did not work. The problem is that the driver can be loaded by kldload, but the interrupt storm caused the system to stop responding when I use ifconfig to mark the nic 'up'. BTW, I used 10MB hub. The driver uses taskqueue_enqueue. 'ae_intr' reads nic register, but 'ae_int_task' reads it again. So I merge them into the new 'ae_intr'. I test 'ping' and 'ftp', it works well. Please refer to the patch for details. --- if_ae.c 2008-06-27 20:19:43.000000000 +0800 +++ /sys/dev/if_ae/if_ae.c 2008-07-14 21:54:06.000000000 +0800 @@ -1450,20 +1450,56 @@ { ae_softc_t *sc; uint32_t val; + struct ifnet *ifp; + struct mii_data *mii; sc = (ae_softc_t *)arg; + AE_LOCK(sc); KASSERT(sc != NULL, ("[ae, %d]: sc is null", __LINE__)); val = AE_READ_4(sc, AE_ISR_REG); - if (val == 0 || (val & AE_IMR_DEFAULT) == 0) + if (val == 0 || (val & AE_IMR_DEFAULT) == 0) { + AE_UNLOCK(sc); return FILTER_STRAY; + } - /* Disable interrupts. */ - AE_WRITE_4(sc, AE_ISR_REG, AE_ISR_DISABLE); + /* Clear interrupts and disable them. */ + AE_WRITE_4(sc, AE_ISR_REG, val | AE_ISR_DISABLE); - /* Schedule interrupt processing. */ - taskqueue_enqueue(sc->tq, &sc->int_task); + ifp = sc->ifp; + if ((val & AE_ISR_PHY) != 0) { + /* + * Clear PHY interrupt. Not sure if it needed. From Linux. + */ + ae_miibus_readreg(sc->miibus, 1, 19); + } + +#ifdef AE_DEBUG + if_printf(ifp, "Interrupt received: 0x%08x\n", val); +#endif + + if ((val & (AE_ISR_PHY | AE_ISR_MANUAL)) != 0) { + mii = device_get_softc(sc->miibus); + mii_mediachg(mii); + } + + if ((val & (AE_ISR_DMAR_TIMEOUT | AE_ISR_DMAW_TIMEOUT | + AE_ISR_PHY_LINKDOWN)) != 0) { + ae_init_locked(sc); + } + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) { + if ((val & AE_ISR_TX_EVENT) != 0) + ae_tx_intr(sc); + + if ((val & AE_ISR_RX_EVENT) != 0) + ae_rx_intr(sc); + } + + /* Re-enable interrupts. */ + AE_WRITE_4(sc, AE_ISR_REG, 0); + + AE_UNLOCK(sc); return (FILTER_HANDLED); } ------=_Part_57398_27213851.1216045836272--