Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 18 Apr 1998 23:57:38 +0200 (MET DST)
From:      Wolfgang Helbig <helbig@Informatik.BA-Stuttgart.DE>
To:        hm@hcs.de
Cc:        FreeBSD-ISDN@FreeBSD.ORG (FreeBSD ISDN mailinglist)
Subject:   Re: first ICMP reply
Message-ID:  <199804182157.XAA01345@rvc1.informatik.ba-stuttgart.de>
In-Reply-To: <m0yO0t1-0000bTC@hcswork.hcs.de> from Hellmuth Michaelis at "Apr 11, 98 04:04:03 pm"

next in thread | previous in thread | raw e-mail | index | archive | help
> >From the keyboard of Wolfgang Helbig:
> 
> > For whatever reason, if doing a ping -c1 via a raw IP interface,
> > the ICMP reply is not received.
> 
> I do receive a reply with a ping -c1 and 0.51. And i'd like to know
> the reason why you don't ;-)

So did I. It only happened with the CREATIX-Card (IOM-1, HSCX is
SAB 82525N) The transmit FIFO turned out not to be ready, even if
the XPF-interrupt is indicated, as opposed to the specs. The following
diff against i4b-00.51 is a workaround for this:

This patch also unifies some more IOM-1 and IOM-2 HSCX-init and again
includes the FreeBSD-current ,,time changes''.

But the really important part is the new line
	isic_hscx_waitxfw(sc, h_chan);
just before
	HSCX_WRFIFO(h_chan, chan->out_mbuf_cur_ptr, nextlen);
in isic_hscx_irq().

I measured up to 2 ms waiting time in isic_hscx_waitx.

Wolfgang

--- /home/helbig/src/i4b/layer1/i4b_hscx.c	Thu Mar 12 10:38:52 1998
+++ layer1/i4b_hscx.c	Sat Apr 18 22:48:12 1998
@@ -214,7 +214,11 @@
 					hdr.type = (h_chan == HSCX_CH_A ? TRC_CH_B1 : TRC_CH_B2);
 					hdr.dir = FROM_NT;
 					hdr.count = ++sc->sc_trace_bcount;
+#if defined(__FreeBSD__) && __FreeBSD__ >= 3
+					getmicrotime(&hdr.time);
+#else
 					hdr.time = time;
+#endif
 					MPH_Trace_Ind(&hdr, chan->in_mbuf->m_len, chan->in_mbuf->m_data);
 				}
 
@@ -288,7 +292,11 @@
 					hdr.type = (h_chan == HSCX_CH_A ? TRC_CH_B1 : TRC_CH_B2);
 					hdr.dir = FROM_NT;
 					hdr.count = ++sc->sc_trace_bcount;
+#if defined(__FreeBSD__) && __FreeBSD__ >= 3
+					getmicrotime(&hdr.time);
+#else
 					hdr.time = time;
+#endif
 					MPH_Trace_Ind(&hdr, chan->in_mbuf->m_len, chan->in_mbuf->m_data);
 				}
 
@@ -371,7 +379,11 @@
 					hdr.type = (h_chan == HSCX_CH_A ? TRC_CH_B1 : TRC_CH_B2);
 					hdr.dir = FROM_TE;
 					hdr.count = ++sc->sc_trace_bcount;
+#if defined(__FreeBSD__) && __FreeBSD__ >= 3
+					getmicrotime(&hdr.time);
+#else
 					hdr.time = time;
+#endif
 					MPH_Trace_Ind(&hdr, chan->out_mbuf_cur->m_len, chan->out_mbuf_cur->m_data);
 				}
 				
@@ -391,7 +403,6 @@
 
 		while(chan->out_mbuf_cur && len != HSCX_FIFO_LEN)
 		{
-			DBGL1(L1_H_IRQ, "isic_hscx_irq", ("out_mbuf_cur_len: %d\n", chan->out_mbuf_cur_len));
 			nextlen = min(chan->out_mbuf_cur_len, HSCX_FIFO_LEN - len);
 
 #ifdef NOTDEF			
@@ -404,6 +415,7 @@
 				next_len);
 #endif
 
+			isic_hscx_waitxfw(sc, h_chan);
 			HSCX_WRFIFO(h_chan, chan->out_mbuf_cur_ptr, nextlen);
 			cmd |= HSCX_CMDR_XTF;
 	
@@ -427,7 +439,11 @@
 						hdr.type = (h_chan == HSCX_CH_A ? TRC_CH_B1 : TRC_CH_B2);
 						hdr.dir = FROM_TE;
 						hdr.count = ++sc->sc_trace_bcount;
+#if defined(__FreeBSD__) && __FreeBSD__ >= 3
+						getmicrotime(&hdr.time);
+#else
 						hdr.time = time;
+#endif
 						MPH_Trace_Ind(&hdr, chan->out_mbuf_cur->m_len, chan->out_mbuf_cur->m_data);
 					}
 				}
@@ -474,14 +490,6 @@
 				      HSCX_CCR1_CM2 |	/* clock mode 5 */
 				      HSCX_CCR1_CM0);
 	
-		/* XAD1: Transmit Address Byte 1 */
-		HSCX_WRITE(h_chan, H_XAD1, 0xff);	/* fully transparent setup */
-	
-		/* XAD2: Transmit Address Byte 2 */
-		HSCX_WRITE(h_chan, H_XAD2, 0xff);	/* fully transparent setup */
-	
-		/* RAH2: Receive Address Byte High Reg. 2 */
-		HSCX_WRITE(h_chan, H_RAH2, 0xff);	/* fully transparent setup */
 	
 		/* XBCH: reset Transmit Byte Count High */
 		HSCX_WRITE(h_chan, H_XBCH, 0x00);
@@ -550,8 +558,6 @@
 	}
 	else	/* IOM 1 setup */
 	{
-		/* MASK */
-		HSCX_WRITE(h_chan, H_MASK, 0xff);
 
 		/* CCR1: Power Up, Clock Mode 1 */
 		HSCX_WRITE(h_chan, H_CCR1, HSCX_CCR1_PU  |	/* power up */
@@ -585,9 +591,6 @@
 			/* Raw Telephony, extended transparent mode 1 */
 			/* fully transparent, no framing, bitstuffing, CRC */
 
-			HSCX_WRITE(h_chan, H_XAD1, 0xff);	/* XAD1 */
-			HSCX_WRITE(h_chan, H_XAD2, 0xff);	/* XAD2 */
-			HSCX_WRITE(h_chan, H_RAH2, 0xff);	/* RAH2 */
 			HSCX_WRITE(h_chan, H_MODE, HSCX_MODE_MDS1|HSCX_MODE_MDS0|HSCX_MODE_ADM|HSCX_MODE_RTS);
 			HSCX_WRITE(h_chan, H_CCR1, HSCX_CCR1_PU|HSCX_CCR1_CM0);	/* CCR1 */
 		}
@@ -595,6 +598,15 @@
 
 	/* common IOM-1 and IOM-2 setup */
 	
+	/* XAD1: Transmit Address Byte 1 */
+	HSCX_WRITE(h_chan, H_XAD1, 0xff);	/* fully transparent setup */
+
+	/* XAD2: Transmit Address Byte 2 */
+	HSCX_WRITE(h_chan, H_XAD2, 0xff);	/* fully transparent setup */
+	
+	/* RAH2: Receive Address Byte High Reg. 2 */
+	HSCX_WRITE(h_chan, H_RAH2, 0xff);	/* fully transparent setup */
+
 	isic_hscx_cmd(sc, h_chan, HSCX_CMDR_RHR|HSCX_CMDR_XRES);
 
  	/* don't touch ICA, EXA and EXB bits, this could be HSCX_CH_B */	
@@ -685,7 +697,8 @@
 	if(timeout == 0)
 	{
 		DBGL1(L1_H_ERR, "isic_hscx_waitxfw", ("HSCX wait for XFW timeout!\n"))
-	}
+	} else if (timeout != 200) 
+		DBGL1(L1_H_ERR, "isic_hscx_waitxfw", ("timeout: %d\n", timeout))
 }
 		
 #endif /* NISIC > 0 */

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-isdn" in the body of the message



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199804182157.XAA01345>