Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 19 Jul 2010 00:16:42 GMT
From:      Alexandre Fiveg <afiveg@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 181158 for review
Message-ID:  <201007190016.o6J0Gghc036670@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@181158?ac=10

Change 181158 by afiveg@ringmap-2 on 2010/07/19 00:16:37

	Macroses for accessing 8259x registers (ringmap_8259.h)

Affected files ...

.. //depot/projects/soc2010/ringmap/current/sys/dev/ixgbe/ixgbe.c#5 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/ixgbe/ixgbe.h#4 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/ixgbe/ringmap_8259.h#3 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/ixgbe/ringmap_ixgbe.c#4 edit
.. //depot/projects/soc2010/ringmap/current/sys/net/ringmap.c#34 edit
.. //depot/projects/soc2010/ringmap/current/sys/net/ringmap.h#34 edit
.. //depot/projects/soc2010/ringmap/current/sys/net/ringmap_kernel.h#4 edit

Differences ...

==== //depot/projects/soc2010/ringmap/current/sys/dev/ixgbe/ixgbe.c#5 (text+ko) ====

@@ -1429,7 +1429,7 @@
 
 #ifdef RINGMAP
 	struct capt_object *co = NULL; 
-	adapter->rm->funcs->delayed_isr(adapter);
+	adapter->rm->funcs->delayed_isr(que);
 #endif
 	++que->irqs;
 
@@ -2180,8 +2180,6 @@
 	struct 		ix_queue *que = adapter->queues;
 	int 		error, rid, vector = 0;
 
-/*TODO: remove it ASAP */
-	RINGMAP_FUNC_DEBUG(start);
 
 	for (int i = 0; i < adapter->num_queues; i++, vector++, que++) {
 		rid = vector + 1;
@@ -4344,7 +4342,7 @@
 		}
 #else
 		if (adapter->rm != NULL) 
-			adapter->rm->funcs->delayed_isr_per_packet(adapter->dev, 
+			adapter->rm->funcs->delayed_isr_per_packet(que, 
 					R_MODULO(i-1));
 #endif
 	}

==== //depot/projects/soc2010/ringmap/current/sys/dev/ixgbe/ixgbe.h#4 (text+ko) ====


==== //depot/projects/soc2010/ringmap/current/sys/dev/ixgbe/ringmap_8259.h#3 (text+ko) ====

@@ -1,0 +1,49 @@
+#define DESC_AREA(que)	(que)->rxr->rx_base
+#define MBUF_AREA(que)	(que)->rxr->rx_buffers
+
+
+/* Kernel address of mbuf wich placed in the slot "i" */
+#define GET_MBUF_P(que)			\
+	(MBUF_AREA(que)[(que)->rxr->me].m_head)
+
+
+/* Kernel address of the packet wich placed in the slot "i" */
+#define GET_PACKET_P(que)		\
+	(MBUF_AREA(que)[(que)->rxr->me].m_head->m_data)
+
+
+/* Kernel address of the descriptor wich placed in the slot "i" */
+#define GET_DESCRIPTOR_P(que)	\
+	(&(DESC_AREA(que)[(que)->rxr->me]))
+
+
+/* Registers access */
+#define RINGMAP_HW_READ_REG IXGBE_READ_REG
+#define RINGMAP_HW_WRITE_REG IXGBE_WRITE_REG
+
+#define HW_RDT(que) IXGBE_RDT((que)->rxr->me)
+#define HW_RDH(que) IXGBE_RDH((que)->rxr->me)
+
+#define HW_STRUCT(que)	(&(que)->adapter->hw)
+
+#define HW_READ_REG(que, reg)							\
+	RINGMAP_HW_READ_REG(HW_STRUCT(que), (reg))
+
+#define HW_WRITE_REG(que, reg, val)						\
+	RINGMAP_HW_READ_REG(HW_STRUCT(que), (reg), (val))
+
+#define RINGMAP_HW_READ_HEAD(que)						\
+		HW_READ_REG((que), HW_RDH(que))
+
+#define RINGMAP_HW_SYNC_HEAD(que, ring)					\
+		SW_HEAD(ring) = RINGMAP_HW_READ_HEAD(que);	
+
+#define RINGMAP_HW_SYNC_TAIL(que, ring)					\
+		HW_WRITE_REG((que), HW_RDT(que), SW_TAIL(ring))
+
+#define RINGMAP_HW_WRITE_TAIL(que, val)					\
+		HW_WRITE_REG((que), HW_RDT(que), (val))
+
+#define RINGMAP_HW_READ_TAIL(que)						\
+		HW_READ_REG((que), HW_RDT(que))
+

==== //depot/projects/soc2010/ringmap/current/sys/dev/ixgbe/ringmap_ixgbe.c#4 (text+ko) ====

@@ -26,11 +26,11 @@
 int rm_8259_set_slot(struct ring *, device_t, unsigned int);
 void rm_8259_interrupt(void *);
 void rm_8259_delayed_interrupt(void *);
-int rm_8259_print_ring_pointers(struct adapter *);
+int rm_8259_print_ring_pointers(void *);
 void rm_8259_sync_head_tail(device_t);
 void rm_8259_sync_tail(device_t);
 void rm_8259_sync_head(device_t);
-void rm_8259_delayed_interrupt_per_packet(device_t, int);
+void rm_8259_delayed_interrupt_per_packet(void *, int);
 
 extern devclass_t ixgbe_devclass;
 extern void	ixgbe_enable_intr(struct adapter *);
@@ -135,12 +135,14 @@
 void 
 rm_8259_delayed_interrupt(void *context)
 {
-	struct adapter	*adapter = (struct adapter *)context;
+	struct ix_queue	*que	= (struct ix_queue *)context;
+	struct adapter	*adapter = (struct adapter *)que->adapter;
 	struct timeval	last_ts;
 
 	RINGMAP_LOCK(adapter->rm);
 
 	if ( adapter->rm->open_cnt > 0 ) {
+
 		adapter->rm->interrupts_counter++;
 		getmicrotime(&last_ts);
 		rm_8259_sync_tail(adapter->dev);
@@ -151,18 +153,20 @@
 
 
 void 
-rm_8259_delayed_interrupt_per_packet(device_t dev, int slot_num)
+rm_8259_delayed_interrupt_per_packet(void *context, int slot_num)
 {
-	struct adapter *adapter = NULL;
-	struct ringmap *rm = NULL;
+	struct ix_queue	*que	= (struct ix_queue *)context;
+	struct adapter	*adapter = (struct adapter *)que->adapter;
+	struct ringmap *rm = adapter->rm;;
 
-	adapter = (struct adapter *)device_get_softc(dev);
-	rm = adapter->rm;
-
 	RINGMAP_INTR(start);
 
 	RINGMAP_LOCK(rm);
 
+#if (RINGMAP_INTR_DEB)
+	rm_8259_print_ring_pointers(que);
+#endif
+
 	RINGMAP_UNLOCK(rm);
 
 	RINGMAP_INTR(end);
@@ -252,24 +256,20 @@
 
 
 int 
-rm_8259_print_ring_pointers(struct adapter *adapter)
+rm_8259_print_ring_pointers(void *context)
 {
+	struct ix_queue	*que	= (struct ix_queue *)context;
 	unsigned int rdt, rdh;
-	struct ringmap *rm = NULL;
 
-	rm = adapter->rm;
-	
-	if (rm == NULL)
-		goto out;
+	rdh = RINGMAP_HW_READ_HEAD(que); 
+	rdt = RINGMAP_HW_READ_TAIL(que);
 
-	rdh = 0; 
-	rdt = 0;
-
 	printf("\n==  +++++++++  RING POINTERS  ++++++++++++ \n");
+	printf("==  + Queue Number: %d\n", que->rxr->me);
+	printf("==  + \n");
 	printf("==  +  HW HEAD = %d (KERN POINTER)\n", rdh);
 	printf("==  +  HW TAIL = %d (USER POINTER)\n", rdt);
 	printf("==  ++++++++++++++++++++++++++++++++++++++ \n\n");
 
-out:
 	return (0);
 }

==== //depot/projects/soc2010/ringmap/current/sys/net/ringmap.c#34 (text+ko) ====

@@ -176,6 +176,12 @@
 
 	RINGMAP_LOCK(rm);
 
+	if (rm->open_cnt == RINGMAP_MAX_THREADS){
+		RINGMAP_ERROR(Can not open device!);
+
+		err = EIO; goto out;
+	}
+
 	/* check: the current thread shouldn't open(2) more than one time */
 	if (rm->open_cnt) {
 		SLIST_FOREACH(co, &rm->object_list, objects) {

==== //depot/projects/soc2010/ringmap/current/sys/net/ringmap.h#34 (text+ko) ====

@@ -8,9 +8,6 @@
  */
 #define RINGMAP_DEVICE 		"ringmap"
 
-/* Name of module to be loaded*/
-#define MOD_NAME 			"if_ringmap.ko"
-
 /* 
  * Driver works only with device wich has the following device ID. If 0
  * then work with all devices that was found and accepted in the "probe"
@@ -73,8 +70,8 @@
  * This structure represents the packets ringbuffer.  The structure should be
  * mapped into the user-space to be visible and accessible from the user
  * capturing application. The ring contains the pointer to SLOTs array. Each
- * SLOT represents one packet. Additionaly, the structure the ring-HEAD
- * (kernrp) and ring-TAIL (userrp). 
+ * SLOT represents one packet. Additionaly, the structure contains 
+ * ring-HEAD (kernrp) and ring-TAIL (userrp) poiners. 
  */
 struct ring {
 
@@ -154,10 +151,10 @@
  * Disable interrupts on NIC. In some cases it is safe 
  * to disable interrupts in order to avoid kernel panics 
  */
-#define IOCTL_DISABLE_INTR		_IO(RINGMAP_IOC_MAGIC, 4)
+#define IOCTL_DISABLE_INTR		_IO(RINGMAP_IOC_MAGIC, 3)
 
 /* Enable interrupts on NIC */
-#define IOCTL_ENABLE_INTR		_IO(RINGMAP_IOC_MAGIC, 3)
+#define IOCTL_ENABLE_INTR		_IO(RINGMAP_IOC_MAGIC, 4)
 
 /* 
  * Sleep and wait for new pkts in ring buffer. By this 
@@ -205,37 +202,37 @@
 	((SW_TAIL(ringp) == SW_HEAD(ringp)) ? SLOTS_NUMBER : 	\
 	R_DISTANCE(SW_TAIL(ringp), SW_HEAD(ringp)))
 
-#define SW_INCR_TAIL(ringp)									\
+#define SW_INCR_TAIL(ringp)								\
 	(SW_TAIL(ringp)) = R_MODULO(SW_TAIL(ringp) + 1);
 
-#define RING_IS_EMPTY(ringp)					\
+#define RING_IS_EMPTY(ringp)				\
 	((SW_TAIL_TO_HEAD_DIST(ringp)) == 1)
 
-#define RING_NOT_EMPTY(ringp)					\
+#define RING_NOT_EMPTY(ringp)				\
 	((SW_TAIL_TO_HEAD_DIST(ringp)) != 1)
 
-#define RING_IS_FULL(ringp)						\
+#define RING_IS_FULL(ringp)					\
 	((SW_HEAD_TO_TAIL_DIST(ringp)) == 0)
 
-#define RING_SLOT(ringp, i)						\
+#define RING_SLOT(ringp, i)					\
 	((ringp)->slot[(i)])
 
-#define TAIL_SLOT(ringp)						\
+#define TAIL_SLOT(ringp)					\
 	RING_SLOT((ringp), (SW_TAIL((ringp))))
 
-#define TAIL_PACKET(ringp)						\
+#define TAIL_PACKET(ringp)					\
 	TAIL_SLOT(ringp).packet
 
-#define U_MBUF(ringp, i)						\
+#define U_MBUF(ringp, i)					\
 	RING_SLOT((ringp), (i)).mbuf.user
 
-#define K_MBUF(ringp, i)						\
+#define K_MBUF(ringp, i)					\
 	RING_SLOT((ringp), (i)).mbuf.kern
 
-#define U_PACKET(ringp, i)						\
+#define U_PACKET(ringp, i)					\
 	RING_SLOT((ringp), (i)).packet.user
 
-#define K_PACKET(ringp, i)						\
+#define K_PACKET(ringp, i)					\
 	RING_SLOT((ringp), (i)).packet.kern
 
 /*
@@ -285,22 +282,28 @@
 	   __func__, pktp[0], pktp[1], pktp[16], pktp[32], pktp[59]);
 
 #define PRINT_PACKET_ADDR(ring, i)	\
-printf("=+= packet.user=0x%X, packet.phys=0x%X, packet.kern=0x%X\n",  \
+	do {							\
+		printf("=+= packet.user=0x%X, packet.phys=0x%X, packet.kern=0x%X\n",\
 		(unsigned int)ring->slot[i].packet.user, 	\
-		ring->slot[i].packet.phys, 					\
-		ring->slot[i].packet.kern);
+		(unsigned int)ring->slot[i].packet.phys, 	\
+		(unsigned int)ring->slot[i].packet.kern);	\
+	} while (0);
 
 #define PRINT_MBUF_ADDR(ring, i)	\
-printf("=+= mbuf.user=0x%X, mbuf.phys=0x%X, mbuf.kern=0x%X\n",  \
+	do {							\
+		printf("=+= mbuf.user=0x%X, mbuf.phys=0x%X, mbuf.kern=0x%X\n",  \
 		(unsigned int)ring->slot[i].mbuf.user, 	\
-		ring->slot[i].mbuf.phys, 					\
-		ring->slot[i].mbuf.kern);
+		(unsigned int)ring->slot[i].mbuf.phys, 	\
+		(unsigned int)ring->slot[i].mbuf.kern);	\
+	} while (0);
 
 #define PRINT_DECRIPTOR_ADDR(ring, i)	\
-printf("=+= descr.user=0x%X, descr.phys=0x%X, descr.kern=0x%X\n",  \
+	do {								\
+		printf("=+= descr.user=0x%X, descr.phys=0x%X, descr.kern=0x%X\n",  \
 		(unsigned int)ring->slot[i].descriptor.user, 	\
-		ring->slot[i].descriptor.phys, 					\
-		ring->slot[i].descriptor.kern);
+		(unsigned int)ring->slot[i].descriptor.phys, 	\
+		(unsigned int)ring->slot[i].descriptor.kern);	\
+	} while (0);
 
 #define PRINT_SLOT(ring, i)												\
 	if (((ring) != NULL) && ((i) < SLOTS_NUMBER)){ 						\
@@ -328,9 +331,11 @@
 	printf("=+= [%s] head = %d\n", __func__, SW_HEAD(ring));
 
 #define PRINT_RING_PTRS(ring)		\
-	PRINT_TAIL(ring)				\
-	PRINT_HEAD(ring)				\
-	printf("=+= [%s] pid = %d\n", __func__, ring->pid);
+	do {							\
+		printf("=+= [%s] pid = %d\n", __func__, ring->pid);	\
+		PRINT_TAIL(ring)				\
+		PRINT_HEAD(ring)				\
+	} while (0);
 
 
 

==== //depot/projects/soc2010/ringmap/current/sys/net/ringmap_kernel.h#4 (text+ko) ====

@@ -75,7 +75,7 @@
 	 * should be called from this cycle, so it will be called 
 	 * per packet.
 	 */
-	void (*delayed_isr_per_packet)(device_t, int);
+	void (*delayed_isr_per_packet)(void *, int);
 
 	/* 
 	 * Next functions synchronize the tail and head hardware registers



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