Date: Tue, 10 Nov 2009 13:41:01 +0000 (UTC) From: Randall Stewart <rrs@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r199139 - projects/mips/sys/dev/rmi/xlr Message-ID: <200911101341.nAADf1O2060816@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200911101341.nAADf1O2060816>