From owner-svn-src-projects@FreeBSD.ORG Tue Nov 10 13:41:01 2009 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 52AEB106566B; Tue, 10 Nov 2009 13:41:01 +0000 (UTC) (envelope-from rrs@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 420AC8FC24; Tue, 10 Nov 2009 13:41: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 nAADf17m060818; Tue, 10 Nov 2009 13:41:01 GMT (envelope-from rrs@svn.freebsd.org) Received: (from rrs@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id nAADf1O2060816; Tue, 10 Nov 2009 13:41:01 GMT (envelope-from rrs@svn.freebsd.org) Message-Id: <200911101341.nAADf1O2060816@svn.freebsd.org> From: Randall Stewart Date: Tue, 10 Nov 2009 13:41:01 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r199139 - projects/mips/sys/dev/rmi/xlr X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 10 Nov 2009 13:41:01 -0000 Author: rrs Date: Tue Nov 10 13:41:00 2009 New Revision: 199139 URL: http://svn.freebsd.org/changeset/base/199139 Log: Ok, the 40bit reads were causing crashes when they did their thing i.e. enabling SX mode and then trying to load in. Since we are o32 this is all un-needed. So I have re-structured the code to work without doing this special set of code. Packets now flow in and out.. however for some reason dhcp/bootp response comes in and the kernel does not proceed. Not sure if we have a UDP checksum error or ?? The packets look all there by comparing wireshark and the first 64 bytes of the TX and RX packets. Modified: projects/mips/sys/dev/rmi/xlr/rge.c Modified: projects/mips/sys/dev/rmi/xlr/rge.c ============================================================================== --- projects/mips/sys/dev/rmi/xlr/rge.c Tue Nov 10 13:35:34 2009 (r199138) +++ projects/mips/sys/dev/rmi/xlr/rge.c Tue Nov 10 13:41:00 2009 (r199139) @@ -332,7 +332,7 @@ DRIVER_MODULE(miibus, rge, miibus_driver #endif #define XKPHYS 0x8000000000000000 - +/* -- No longer needed RRS static __inline__ uint32_t lw_40bit_phys(uint64_t phys, int cca) { @@ -355,8 +355,8 @@ lw_40bit_phys(uint64_t phys, int cca) disable_KX(flags); return value; } - - +*/ +/* -- No longer used RRS static __inline__ uint64_t ld_40bit_phys(uint64_t phys, int cca) { @@ -379,7 +379,7 @@ ld_40bit_phys(uint64_t phys, int cca) disable_KX(flags); return value; } - +*/ void *xlr_tx_ring_mem; @@ -411,7 +411,7 @@ TAILQ_HEAD(, tx_desc_node) tx_frag_desc[ }; /* This contains a list of free tx frag node descriptors */ -static +static TAILQ_HEAD(, tx_desc_node) free_tx_frag_desc[XLR_MAX_CORE] = { TAILQ_HEAD_INITIALIZER(free_tx_frag_desc[0]), @@ -617,23 +617,33 @@ build_frag_list(struct mbuf *m_head, str static void release_tx_desc(struct msgrng_msg *msg, int rel_buf) { - vm_paddr_t paddr = msg->msg0 & 0xffffffffffULL; - uint64_t temp; - struct p2d_tx_desc *tx_desc; + /* + * OLD code: vm_paddr_t paddr = msg->msg0 & 0xffffffffffULL; + * uint64_t temp; struct p2d_tx_desc *tx_desc; struct mbuf *m; + * + * paddr += (XLR_MAX_TX_FRAGS * sizeof(uint64_t)); *** In o32 we will + * crash here ****** temp = ld_40bit_phys(paddr, 3); tx_desc = + * (struct p2d_tx_desc *)((vm_offset_t)temp); + * + * if (rel_buf) { paddr += sizeof(uint64_t); + * + * temp = ld_40bit_phys(paddr, 3); + * + * m = (struct mbuf *)((vm_offset_t)temp); m_freem(m); } printf("Call + * fre_p2d_desc\n"); free_p2d_desc(tx_desc); + */ + struct p2d_tx_desc *tx_desc, *chk_addr; struct mbuf *m; - paddr += (XLR_MAX_TX_FRAGS * sizeof(uint64_t)); - - temp = ld_40bit_phys(paddr, 3); - - tx_desc = (struct p2d_tx_desc *)((vm_offset_t)temp); - + tx_desc = (struct p2d_tx_desc *)MIPS_PHYS_TO_KSEG0(msg->msg0); + chk_addr = (struct p2d_tx_desc *)(uint32_t) (tx_desc->frag[XLR_MAX_TX_FRAGS] & 0x00000000ffffffff); + if (tx_desc != chk_addr) { + printf("Address %p does not match with stored addr %p - we leaked a descriptor\n", + tx_desc, chk_addr); + return; + } if (rel_buf) { - paddr += sizeof(uint64_t); - - temp = ld_40bit_phys(paddr, 3); - - m = (struct mbuf *)((vm_offset_t)temp); + m = (struct mbuf *)(uint32_t) (tx_desc->frag[XLR_MAX_TX_FRAGS + 1] & 0x00000000ffffffff); m_freem(m); } free_p2d_desc(tx_desc); @@ -703,10 +713,26 @@ static void free_buf(vm_paddr_t paddr) { struct mbuf *m; - vm_offset_t temp; + uint32_t *temp; + uint32_t mag, um; - temp = lw_40bit_phys((paddr - XLR_CACHELINE_SIZE), 3); - m = (struct mbuf *)temp; + /* + * This will crash I think. RRS temp = lw_40bit_phys((paddr - + * XLR_CACHELINE_SIZE), 3); m = (struct mbuf *)temp; + */ + /* + * This gets us a kseg0 address for the mbuf/magic on the ring but + * we need to get the va to free the mbuf. This is stored at *temp; + */ + temp = (uint32_t *) MIPS_PHYS_TO_KSEG0(paddr - XLR_CACHELINE_SIZE); + um = temp[0]; + mag = temp[1]; + if (mag != 0xf00bad) { + printf("Something is wrong kseg:%p found mag:%x not 0xf00bad\n", + temp, mag); + return; + } + m = (struct mbuf *)um; if (m != NULL) m_freem(m); } @@ -1015,7 +1041,7 @@ serdes_regs_init(struct driver_data *pri return; } -static void +static void serdes_autoconfig(struct driver_data *priv) { int delay = 100000; @@ -1742,7 +1768,6 @@ rmi_xlr_mac_msgring_handler(int bucket, /* int logical_cpu = 0; */ dbg_msg("Received packet, port = %d\n", port); - /* * if num frins to be sent exceeds threshold, wake up the * helper thread @@ -1753,7 +1778,6 @@ rmi_xlr_mac_msgring_handler(int bucket, } dbg_msg("gmac_%d: rx packet: phys_addr = %llx, length = %x\n", priv->instance, phys_addr, length); - mac_stats_add(priv->stats.rx_packets, 1); mac_stats_add(priv->stats.rx_bytes, length); xlr_inc_counter(NETIF_RX); @@ -1779,7 +1803,7 @@ rge_probe(dev) volatile unsigned long xlr_debug_enabled; struct callout rge_dbg_count; -static void +static void xlr_debug_count(void *addr) { struct driver_data *priv = &dev_mac[0]->priv; @@ -1792,7 +1816,7 @@ xlr_debug_count(void *addr) } -static void +static void xlr_tx_q_wakeup(void *addr) { int i = 0; @@ -1925,7 +1949,10 @@ rge_attach(device_t dev) sc->irq = gmac_conf->baseirq + priv->instance % 4; /* Set the IRQ into the rid field */ - /* note this is a hack to pass the irq to the iodi interrupt setup routines */ + /* + * note this is a hack to pass the irq to the iodi interrupt setup + * routines + */ sc->rge_irq.__r_i = (struct resource_i *)sc->irq; ret = bus_setup_intr(dev, &sc->rge_irq, INTR_FAST | INTR_TYPE_NET | INTR_MPSAFE, @@ -2077,13 +2104,14 @@ rge_rx(struct rge_softc *sc, vm_paddr_t */ struct mbuf *m; void *ptr; - vm_offset_t temp; + uint32_t *temp; struct ifnet *ifp = sc->rge_ifp; unsigned long msgrng_flags; int cpu = PCPU_GET(cpuid); - temp = lw_40bit_phys((paddr - XLR_CACHELINE_SIZE), 3); + temp = (uint32_t *) MIPS_PHYS_TO_KSEG0(paddr - XLR_CACHELINE_SIZE); + ptr = (void *)(temp + XLR_CACHELINE_SIZE); m = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR); if (m != NULL) { @@ -2132,15 +2160,15 @@ rge_rx(struct rge_softc *sc, vm_paddr_t * XLR_CACHELINE_SIZE); */ struct mbuf *m; - vm_offset_t temp; - unsigned int mag; - struct ifnet *ifp = sc->rge_ifp; + uint32_t *temp, tm, mag; - temp = lw_40bit_phys((paddr - XLR_CACHELINE_SIZE), 3); - mag = lw_40bit_phys((paddr - XLR_CACHELINE_SIZE + 4), 3); + struct ifnet *ifp = sc->rge_ifp; - m = (struct mbuf *)temp; + temp = (uint32_t *) MIPS_PHYS_TO_KSEG0(paddr - XLR_CACHELINE_SIZE); + tm = temp[0]; + mag = temp[1]; + m = (struct mbuf *)tm; if (mag != 0xf00bad) { /* somebody else packet Error - FIXME in intialization */ printf("cpu %d: *ERROR* Not my packet paddr %p\n", xlr_cpu_id(), (void *)paddr);