From owner-svn-src-user@FreeBSD.ORG Mon Apr 26 19:19:01 2010 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 9BFB81065673; Mon, 26 Apr 2010 19:19:01 +0000 (UTC) (envelope-from jmallett@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 8A7AE8FC0C; Mon, 26 Apr 2010 19:19:01 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o3QJJ1x1076022; Mon, 26 Apr 2010 19:19:01 GMT (envelope-from jmallett@svn.freebsd.org) Received: (from jmallett@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o3QJJ1eK076018; Mon, 26 Apr 2010 19:19:01 GMT (envelope-from jmallett@svn.freebsd.org) Message-Id: <201004261919.o3QJJ1eK076018@svn.freebsd.org> From: Juli Mallett Date: Mon, 26 Apr 2010 19:19:01 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r207244 - user/jmallett/octeon/sys/mips/cavium/octe X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 26 Apr 2010 19:19:01 -0000 Author: jmallett Date: Mon Apr 26 19:19:01 2010 New Revision: 207244 URL: http://svn.freebsd.org/changeset/base/207244 Log: Add support for the driver's polling timer. This updates link status and drains the mbuf transmit free list (and clears OACTIVE if it was set.) Modified: user/jmallett/octeon/sys/mips/cavium/octe/ethernet-mdio.c user/jmallett/octeon/sys/mips/cavium/octe/ethernet-mdio.h user/jmallett/octeon/sys/mips/cavium/octe/ethernet.c Modified: user/jmallett/octeon/sys/mips/cavium/octe/ethernet-mdio.c ============================================================================== --- user/jmallett/octeon/sys/mips/cavium/octe/ethernet-mdio.c Mon Apr 26 19:13:10 2010 (r207243) +++ user/jmallett/octeon/sys/mips/cavium/octe/ethernet-mdio.c Mon Apr 26 19:19:01 2010 (r207244) @@ -43,11 +43,8 @@ AND WITH ALL FAULTS AND CAVIUM NETWORKS #include "wrapper-cvmx-includes.h" #include "ethernet-headers.h" -static struct mtx mdio_mtx; -MTX_SYSINIT(cvm_oct_mdio, &mdio_mtx, "MDIO", MTX_DEF); - -#define MDIO_LOCK() mtx_lock(&mdio_mtx) -#define MDIO_UNLOCK() mtx_unlock(&mdio_mtx) +struct mtx cvm_oct_mdio_mtx; +MTX_SYSINIT(cvm_oct_mdio, &cvm_oct_mdio_mtx, "MDIO", MTX_DEF); /** * Perform an MII read. Called by the generic MII routines Modified: user/jmallett/octeon/sys/mips/cavium/octe/ethernet-mdio.h ============================================================================== --- user/jmallett/octeon/sys/mips/cavium/octe/ethernet-mdio.h Mon Apr 26 19:13:10 2010 (r207243) +++ user/jmallett/octeon/sys/mips/cavium/octe/ethernet-mdio.h Mon Apr 26 19:19:01 2010 (r207244) @@ -27,6 +27,12 @@ AND WITH ALL FAULTS AND CAVIUM NETWORKS *************************************************************************/ +extern struct mtx cvm_oct_mdio_mtx; + +#define MDIO_LOCK() mtx_lock(&cvm_oct_mdio_mtx) +#define MDIO_UNLOCK() mtx_unlock(&cvm_oct_mdio_mtx) +#define MDIO_TRYLOCK() mtx_trylock(&cvm_oct_mdio_mtx) + int cvm_oct_mdio_read(struct ifnet *ifp, int phy_id, int location); void cvm_oct_mdio_write(struct ifnet *ifp, int phy_id, int location, int val); int cvm_oct_mdio_setup_device(struct ifnet *ifp); Modified: user/jmallett/octeon/sys/mips/cavium/octe/ethernet.c ============================================================================== --- user/jmallett/octeon/sys/mips/cavium/octe/ethernet.c Mon Apr 26 19:13:10 2010 (r207243) +++ user/jmallett/octeon/sys/mips/cavium/octe/ethernet.c Mon Apr 26 19:19:01 2010 (r207244) @@ -115,16 +115,10 @@ extern int octeon_is_simulation(void); */ extern cvmx_bootinfo_t *octeon_bootinfo; -/* - * XXX - * This should be a per-if callout? - */ -#if 0 /** * Periodic timer to check auto negotiation */ -static struct timer_list cvm_oct_poll_timer; -#endif +static struct callout cvm_oct_poll_timer; /** * Array of every ethernet device owned by this driver indexed by @@ -132,76 +126,63 @@ static struct timer_list cvm_oct_poll_ti */ struct ifnet *cvm_oct_device[TOTAL_NUMBER_OF_PORTS]; -#if 0 -extern struct semaphore mdio_sem; -#endif - /** * Periodic timer tick for slow management operations * * @param arg Device to check */ -#if 0 -static void cvm_do_timer(unsigned long arg) +static void cvm_do_timer(void *arg) { static int port; if (port < CVMX_PIP_NUM_INPUT_PORTS) { if (cvm_oct_device[port]) { int queues_per_port; -#if 0 int qos; -#endif cvm_oct_private_t *priv = (cvm_oct_private_t *)cvm_oct_device[port]->if_softc; if (priv->poll) { -#if 0 /* skip polling if we don't get the lock */ - if(!down_trylock(&mdio_sem)) { + if (MDIO_TRYLOCK()) { priv->poll(cvm_oct_device[port]); - up(&mdio_sem); + MDIO_UNLOCK(); } -#else - panic("%s: wrap priv->poll with an mdio lock.", __func__); -#endif } queues_per_port = cvmx_pko_get_num_queues(port); /* Drain any pending packets in the free list */ -#if 0 for (qos = 0; qos < queues_per_port; qos++) { - if (m_queue_len(&priv->tx_free_list[qos])) { - spin_lock(&priv->tx_free_list[qos].lock); - while (m_queue_len(&priv->tx_free_list[qos]) > cvmx_fau_fetch_and_add32(priv->fau+qos*4, 0)) - dev_kfree_m(__m_dequeue(&priv->tx_free_list[qos])); - spin_unlock(&priv->tx_free_list[qos].lock); + if (_IF_QLEN(&priv->tx_free_queue[qos]) > 0) { + IF_LOCK(&priv->tx_free_queue[qos]); + while (_IF_QLEN(&priv->tx_free_queue[qos]) > cvmx_fau_fetch_and_add32(priv->fau+qos*4, 0)) { + struct mbuf *m; + + _IF_DEQUEUE(&priv->tx_free_queue[qos], m); + m_freem(m); + } + IF_UNLOCK(&priv->tx_free_queue[qos]); + + /* + * XXX locking! + */ + priv->ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; } } -#else - panic("%s: need to implement Tx queue draining.", __func__); -#endif #if 0 cvm_oct_device[port]->get_stats(cvm_oct_device[port]); -#else - panic("%s: need to implement stats getting.", __func__); #endif } port++; -#if 0 /* Poll the next port in a 50th of a second. This spreads the polling of ports out a little bit */ - mod_timer(&cvm_oct_poll_timer, jiffies + HZ/50); -#endif + callout_reset(&cvm_oct_poll_timer, hz / 50, cvm_do_timer, NULL); } else { port = 0; -#if 0 /* All ports have been polled. Start the next iteration through the ports in one second */ - mod_timer(&cvm_oct_poll_timer, jiffies + HZ); -#endif + callout_reset(&cvm_oct_poll_timer, hz, cvm_do_timer, NULL); } } -#endif /** @@ -528,13 +509,8 @@ int cvm_oct_init_module(device_t bus) cvmx_write_csr(CVMX_POW_WQ_INT_THRX(pow_receive_group), 0x1001); } -#if 0 - /* Enable the poll timer for checking RGMII status */ - init_timer(&cvm_oct_poll_timer); - cvm_oct_poll_timer.data = 0; - cvm_oct_poll_timer.function = cvm_do_timer; - mod_timer(&cvm_oct_poll_timer, jiffies + HZ); -#endif + callout_init(&cvm_oct_poll_timer, CALLOUT_MPSAFE); + callout_reset(&cvm_oct_poll_timer, hz, cvm_do_timer, NULL); return 0; } @@ -559,9 +535,7 @@ void cvm_oct_cleanup_module(void) free_irq(8 + pow_receive_group, cvm_oct_device); #endif -#if 0 - del_timer(&cvm_oct_poll_timer); -#endif + callout_stop(&cvm_oct_poll_timer); cvm_oct_rx_shutdown(); cvmx_pko_disable();