PERFORCE change 179713 for review

Alexandre Fiveg afiveg at FreeBSD.org
Thu Jun 17 14:46:28 UTC 2010


http://p4web.freebsd.org/@@179713?ac=10

Change 179713 by afiveg at cottonmouth on 2010/06/17 14:46:03

	Begin with new design for ringmap: 
		1. The new structure with pointers to hardware dependent functions: 
			"struct ringmap_functions" (/net/ringmap.h)
		2. Pointer to this structure placed in ringmap structure. 
		3. In the ringmap_attach function look for pci Id of network controller, 
			and then, depending on controllers type, initialize the functions pointers:
			(ringmap.c: set_ringmap_funcs())

Affected files ...

.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/e1000_api.h#4 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/e1000_hw.h#4 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/if_em.c#7 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/if_lem.c#4 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/if_lem.h#4 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/ringmap_8254.c#2 edit
.. //depot/projects/soc2010/ringmap/current/sys/net/ringmap.c#6 edit
.. //depot/projects/soc2010/ringmap/current/sys/net/ringmap.h#6 edit

Differences ...

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


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


==== //depot/projects/soc2010/ringmap/current/sys/dev/e1000/if_em.c#7 (text+ko) ====

@@ -86,10 +86,9 @@
 #include "if_em.h"
 
 #ifdef RINGMAP
-#include <net/ringmap.h>
 
-extern int ringmap_attach (struct ringmap **);
-extern int ringmap_detach (struct ringmap *);
+extern int ringmap_attach (device_t);
+extern int ringmap_detach (device_t);
 #endif 
 
 /*********************************************************************

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

@@ -264,10 +264,9 @@
 
 
 #ifdef RINGMAP
-#include <net/ringmap.h>
 
-extern int ringmap_attach (struct ringmap **, device_t);
-extern int ringmap_detach (struct ringmap *);
+extern int ringmap_attach (device_t);
+extern int ringmap_detach (device_t);
 #endif 
 
 #ifdef DEVICE_POLLING
@@ -721,7 +720,7 @@
 	INIT_DEBUGOUT("em_detach: begin");
 
 #ifdef RINGMAP
-	ringmap_detach (adapter->rm);
+	ringmap_detach (dev);
 #endif 
 
 	/* Make sure VLANS are not using driver */

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


==== //depot/projects/soc2010/ringmap/current/sys/dev/e1000/ringmap_8254.c#2 (text+ko) ====

@@ -1,0 +1,45 @@
+#include <sys/param.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/taskqueue.h>
+
+#include <machine/bus.h>
+
+#include <net/if.h>
+#include <net/if_var.h>
+#include <net/if_types.h>
+#include <net/if_media.h>
+
+#include <net/ringmap.h>
+
+#include "e1000_api.h"
+#include "if_lem.h"
+
+int rm_8254_set_ringmap_to_adapter(device_t, struct ringmap *);
+struct ringmap * rm_8254_get_ringmap_p(device_t);
+
+/*
+ * Set pointer to ringmap in the adapter structure.
+ */
+int
+rm_8254_set_ringmap_to_adapter(device_t dev, struct ringmap *rm)
+{
+	struct adapter *adapter;
+
+	adapter = (struct adapter *)device_get_softc(dev);
+	adapter->rm = rm;
+
+	return (0);
+}
+
+/*
+ * Returns pointer to ringmap structure
+ */
+struct ringmap * 
+rm_8254_get_ringmap_p(device_t dev)
+{
+	struct adapter *adapter;
+
+	adapter = (struct adapter *)device_get_softc(dev);
+	return (adapter->rm);
+}

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

@@ -27,11 +27,9 @@
 #include <vm/vm_param.h>
 #include <vm/vm_kern.h>
 
+#include <dev/pci/pcivar.h>   /* For pci_get macros! */
+#include <dev/pci/pcireg.h>
 
-//#ifdef __E1000_RINGMAP__
-//#include "e1000_api.h"
-//#include "if_em.h"
-//
 //extern devclass_t em_devclass;
 //extern int	em_rxeof(struct rx_ring *, int);
 //extern bool	em_txeof(struct tx_ring *);
@@ -41,10 +39,17 @@
 
 #include "ringmap.h"
 
-/* F U N C T I O N S */
-int ringmap_attach(device_t);
-int ringmap_detach(device_t);
-int set_ringmap_to_adapter (device_t, ringmap *);
+int ringmap_attach (device_t);
+int ringmap_detach (device_t);
+int is_supported (unsigned int pci_dev_id);
+void ringmap_close_cb (void *data);
+int set_ringmap_funcs (struct ringmap *rm, unsigned int controller_type);
+struct ringmap *(*get_ringmap_p)(device_t);
+
+extern int rm_8254_set_ringmap_to_adapter(device_t, struct ringmap *);
+extern struct ringmap * rm_8254_get_ringmap_p(device_t);
+
+
 //struct adapter* get_adapter_struct(struct cdev *dev);
 //int ringmap_print_ring_pointers(struct adapter *);
 //void ringmap_print_ring (struct adapter *adapter, int level);
@@ -62,7 +67,6 @@
 d_ioctl_t	ringmap_ioctl;
 d_mmap_t	ringmap_mmap;
 
-void ringmap_close_cb (void *data);
 
 /*
  *	Character Device for access on if_em driver structures
@@ -76,16 +80,91 @@
 	/* 	name 	*/	.d_name 	= "ringmap_cdev"
 };
 
+struct device_type supported_devices[] =
+{
+	{ 0x1079, 8254 },	/* 8254GB, COPPER, Dual Port */
+	{ 0x105E, 8257 },	/* 82571EB, COPPER, PCIe Dual Port */ 	
+	{ 0, 0} 			/* last entry */
+};
+
+/*
+ * If pci_dev_id is supported by ringmap, then controller_type related to this
+ * pci_dev_id will be returned. Look for device_type structure in ringmap.h! 
+ * Now only 8254* and 8257* controllers are supported. The list of supported
+ * controllers doesn't include all of them, but only the controllers that I've
+ * tested.
+ */
+int 
+is_supported (unsigned int pci_dev_id)
+{
+	struct device_type *dt;
+
+	dt = supported_devices;
+	while (dt->pci_device_id != 0) {
+		if (pci_dev_id == dt->pci_device_id){
+			return (dt->controller_type);
+		}
+		dt++;
+	}
+	return (0);
+}
+
 /*
+ * Set hardware-dependent functions 
+ */
+int
+set_ringmap_funcs (struct ringmap *rm, unsigned int controller_type)
+{
+
+	switch(controller_type) {
+		case 8254:
+			RINGMAP_OUTPUT(Controller Type: 8254);
+			
+			/* Set ringmap pointer in the drivrs structure of adapter */
+			rm->funcs->set_ringmap_to_adapter = 
+				rm_8254_set_ringmap_to_adapter;
+			get_ringmap_p = rm_8254_get_ringmap_p;
+		break;
+
+		case 8257:
+			RINGMAP_OUTPUT(Controller Type: 8257);
+			RINGMAP_OUTPUT(Now not supported!);
+
+		break;
+
+		default:
+			RINGMAP_OUTPUT(Unsupported Controller Type!);
+	}
+	return (0);
+}
+
+/*
  * Will called from if_em.c before returning from 
  * em_attach() function.  
  */
-int ringmap_attach(device_t devt) {	
+int 
+ringmap_attach(device_t dev) 
+{	
 	struct ringmap *rm;
 	struct ring *ring;
+	struct ringmap_functions *ringmap_functions;
+	unsigned int pci_dev_id = 0;
+	unsigned int controller_type = 0;
 
 	RINGMAP_FUNC_DEBUG(begin);
 
+	pci_dev_id = pci_get_device(dev);
+	controller_type = is_supported(pci_dev_id);
+
+	/* Make sure we are support this controller */
+	if (!(controller_type))
+		return (-1);
+
+	/* 
+	 * Allocate memory for ringmap structures: ringmap and ring. 
+	 * Use contigmalloc(9) to get PAGE_SIZE alignment that is needed 
+	 * for memory mapping.  
+	 */
 	rm = (struct ringmap *) contigmalloc (sizeof(struct ringmap), 
 			M_DEVBUF, M_ZERO, 0, -1L, PAGE_SIZE, 0);
 
@@ -101,7 +180,16 @@
 		return (-1); 
 	}
 
-	rm->ring = ring;
+	ringmap_functions = 
+		(struct ringmap_functions *) contigmalloc (sizeof (struct ringmap_functions),
+				M_DEVBUF, M_ZERO, 0, -1L, PAGE_SIZE, 0);
+	if (ringmap_functions == NULL) { 
+		RINGMAP_ERROR(Can not allocate space for ringmap_functions structure); 
+		return (-1); 
+	}
+
+	rm->ring 	= ring;
+	rm->funcs 	= ringmap_functions;
 
 	/* 
 	 * Create char device for communication with user space. User space process
@@ -112,18 +200,21 @@
 	 *
 	 * -	controll packet capturing: start, stop, sleep to wait for packets.
 	 */
-	rm->ringmap_dev = make_dev(&ringmap_devsw, device_get_unit(adapter_dev),
-			UID_ROOT, GID_WHEEL, 0666, RINGMAP_DEVICE);
+	rm->cdev = make_dev(&ringmap_devsw, device_get_unit(dev),
+						UID_ROOT, GID_WHEEL, 0666, RINGMAP_DEVICE);
 
 	/* Device open counter */
 	rm->open_cnt = 0;
 
 	/* Pointer to structure of process wich has opened the device */	
-	rm->procp = NULL;
+	rm->td = NULL;
+
+	/* Set functions for ringmap functionality depending on controller type */
+	set_ringmap_funcs(rm, controller_type);
 
 	/* set the pointer to ringmap in the adapters structure */
+	rm->funcs->set_ringmap_to_adapter(dev, rm);
 
-
 	RINGMAP_FUNC_DEBUG(end); 
 
 	return (0);	
@@ -131,16 +222,23 @@
 
 
 int
-ringmap_detach(struct ringmap *rm)
+ringmap_detach(device_t devt)
 {
 
+	struct ringmap *rm = NULL;
+
 	RINGMAP_FUNC_DEBUG(start);
 	
-	destroy_dev(rm->ringmap_dev);
+	rm = get_ringmap_p (devt);
+	if (rm == NULL){
+		RINGMAP_WARN(Can not get pointer to ringmap structure);
+		return (-1);
+	}
 
+	destroy_dev(rm->cdev);
 	contigfree(rm->ring, sizeof(struct ring), M_DEVBUF);
-
-	contigfree(rm, sizeof(struct ring), M_DEVBUF);
+	contigfree(rm->funcs, sizeof(struct ringmap_functions), M_DEVBUF);
+	contigfree(rm, sizeof(struct ringmap), M_DEVBUF);
 	
 	RINGMAP_FUNC_DEBUG(end);
 
@@ -489,3 +587,6 @@
 //
 //	return (0);
 //}
+
+
+

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

@@ -1,8 +1,3 @@
-//#ifdef __E1000_RINGMAP__
-//#ifdef _KERNEL
-//#include "ringmap_e1000.h"
-//#endif 
-//#endif
 
 /* Minimum distance to be kept between the userrp and RDT to provide a
  * guarantee  to userspace processes that the previous n buffer positions
@@ -27,9 +22,10 @@
 // #define DEV_ID 	0x105E 
 #define DEV_ID 	0
 
-#ifndef _KERNEL
-#include <machine/bus.h>
-#endif
+struct device_type {
+	unsigned int pci_device_id;
+	unsigned int controller_type;
+};
 
 struct address {
 	bus_addr_t 	phys;
@@ -110,15 +106,16 @@
 	struct ring_slot slot[SLOTS_NUMBER];
 };
 
+
 #ifdef _KERNEL
-struct adapter;
+struct ringmap_functions;
 
 struct ringmap {
 	/* Device structure of network adapters driver */
 	device_t devt;
 
 	/* Char device for communications between user and kernel spaces */
-	struct 	cdev 	*ringmap_cdev;
+	struct 	cdev 	*cdev;
 
 	/* Capturing thread */
 	struct 	thread 	*td;
@@ -129,10 +126,16 @@
 	/* How many packets have counted driver in RAM */
 	unsigned long long 	pkts_counter;
 
+	/* Hardware dependent functions */
+	struct ringmap_functions *funcs;
+
 	/* Our ring that have to be mapped in space of user process */
 	struct ring *ring;
 };
 
+struct ringmap_functions {
+	int (*set_ringmap_to_adapter)(device_t, struct ringmap*);
+};
 #endif /* _KERNEL */
 
 


More information about the p4-projects mailing list