Date: Fri, 18 Jun 2010 17:57:02 GMT From: Alexandre Fiveg <afiveg@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 179777 for review Message-ID: <201006181757.o5IHv2bb062941@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@179777?ac=10 Change 179777 by afiveg@cottonmouth on 2010/06/18 17:56:52 Continue working on new ringmap designe + user-space tetst programms. open.c - for opening ringmap char device. The next task: read system messages to chek if it works in kernel space correctly close.c - only for closing device. The next task: reading system messages. mmap.c - in progress Affected files ... .. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/if_lem.c#5 edit .. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/if_lem.h#5 edit .. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/ringmap_8254.c#3 edit .. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/ringmap_e1000.h#4 edit .. //depot/projects/soc2010/ringmap/current/sys/modules/ringmap/Makefile#1 add .. //depot/projects/soc2010/ringmap/current/sys/net/ringmap.c#7 edit .. //depot/projects/soc2010/ringmap/current/sys/net/ringmap.h#7 edit .. //depot/projects/soc2010/ringmap/tests/README#1 add .. //depot/projects/soc2010/ringmap/tests/ringmap/Makefile#1 add .. //depot/projects/soc2010/ringmap/tests/ringmap/close.c#1 add .. //depot/projects/soc2010/ringmap/tests/ringmap/main.c#1 add .. //depot/projects/soc2010/ringmap/tests/ringmap/mmap.c#1 add .. //depot/projects/soc2010/ringmap/tests/ringmap/open.c#1 add .. //depot/projects/soc2010/ringmap/tests/ringmap/test#1 add .. //depot/projects/soc2010/ringmap/tests/ringmap/tests.h#1 add Differences ... ==== //depot/projects/soc2010/ringmap/current/sys/dev/e1000/if_lem.c#5 (text+ko) ==== ==== //depot/projects/soc2010/ringmap/current/sys/dev/e1000/if_lem.h#5 (text+ko) ==== ==== //depot/projects/soc2010/ringmap/current/sys/dev/e1000/ringmap_8254.c#3 (text+ko) ==== @@ -1,6 +1,7 @@ #include <sys/param.h> #include <sys/types.h> #include <sys/socket.h> +#include <sys/conf.h> #include <sys/taskqueue.h> #include <machine/bus.h> @@ -17,6 +18,31 @@ int rm_8254_set_ringmap_to_adapter(device_t, struct ringmap *); struct ringmap * rm_8254_get_ringmap_p(device_t); +device_t rm_8254_get_device_p(struct cdev *); + + +extern devclass_t em_devclass; + +/* + * Get pointer to device structure of adapter using our ringmap char device. + * This is a trick :) Our cdev must have the same unit number as dev of adapter. + * Look in ringmap.c: ringmap_attach() where we create our cdev. + */ +device_t +rm_8254_get_device_p(struct cdev *cdev) +{ + struct adapter *adapter; + + adapter = (struct adapter *)devclass_get_softc(em_devclass, dev2unit(cdev)); +#ifdef __RINGMAP_DEB + if (adapter == NULL){ + RINGMAP_WARN(Can not get pointer to adapter structure); + } +#endif + + return (adapter->dev); +} + /* * Set pointer to ringmap in the adapter structure. ==== //depot/projects/soc2010/ringmap/current/sys/dev/e1000/ringmap_e1000.h#4 (text+ko) ==== ==== //depot/projects/soc2010/ringmap/current/sys/net/ringmap.c#7 (text+ko) ==== @@ -42,13 +42,15 @@ int ringmap_attach (device_t); int ringmap_detach (device_t); int is_supported (unsigned int pci_dev_id); +int set_ringmap_funcs (struct ringmap *rm, unsigned int controller_type); void ringmap_close_cb (void *data); -int set_ringmap_funcs (struct ringmap *rm, unsigned int controller_type); + struct ringmap *(*get_ringmap_p)(device_t); +device_t (*get_device_p)(struct cdev *); extern int rm_8254_set_ringmap_to_adapter(device_t, struct ringmap *); extern struct ringmap * rm_8254_get_ringmap_p(device_t); - +extern device_t rm_8254_get_device_p(struct cdev *); //struct adapter* get_adapter_struct(struct cdev *dev); //int ringmap_print_ring_pointers(struct adapter *); @@ -124,6 +126,7 @@ rm->funcs->set_ringmap_to_adapter = rm_8254_set_ringmap_to_adapter; get_ringmap_p = rm_8254_get_ringmap_p; + get_device_p = rm_8254_get_device_p; break; case 8257: @@ -204,7 +207,7 @@ UID_ROOT, GID_WHEEL, 0666, RINGMAP_DEVICE); /* Device open counter */ - rm->open_cnt = 0; + rm->open_cnt = 1; /* Pointer to structure of process wich has opened the device */ rm->td = NULL; @@ -222,20 +225,20 @@ int -ringmap_detach(device_t devt) +ringmap_detach(device_t dev) { - struct ringmap *rm = NULL; RINGMAP_FUNC_DEBUG(start); - rm = get_ringmap_p (devt); + rm = get_ringmap_p (dev); 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->funcs, sizeof(struct ringmap_functions), M_DEVBUF); contigfree(rm, sizeof(struct ringmap), M_DEVBUF); @@ -253,19 +256,23 @@ * be placed and accesseble in this user proccess. ******************************************************************/ int -ringmap_open(struct cdev *dev, int flag, int otyp, struct thread *td) +ringmap_open(struct cdev *cdev, int flag, int otyp, struct thread *td) { // unsigned int i; // struct ring_slot; // struct adapter *adapter = (struct adapter *)get_adapter_struct(dev); -// struct ringmap *rm = adapter->rm; + struct ringmap *rm = NULL; RINGMAP_FUNC_DEBUG(start); #if (__RINGMAP_DEB) printf("[%s]: dev_t=%d, flag=%x, otyp=%x\n", - __func__, dev2udev(dev), flag, otyp); -#endif + __func__, dev2udev(cdev), flag, otyp); +#endif + + /* Now magic */ + rm = get_ringmap_p(get_device_p(cdev)); + printf("[%s] open counter: %d\n", __func__, rm->open_cnt); // // /** ==== //depot/projects/soc2010/ringmap/current/sys/net/ringmap.h#7 (text+ko) ==== @@ -8,24 +8,23 @@ #define SLOTS_NUMBER 16 /* Prefix for name of device (for example /dev/ringmap_cdev_0 will full name) */ -#define RINGMAP_DEVICE "ringmap_cdev" +#define RINGMAP_DEVICE "ringmap_cdev" /* Name of module to be loaded*/ -#define MOD_NAME "if_ringmap.ko" +#define MOD_NAME "if_ringmap.ko" /* Messaure statistics for each pkt */ #define EACH_PKT 20 -/* Driver have to work only with device wich has the following device ID - * if 0 then work with all devices that was found +/* + * Driver have to work only with device wich has the following device ID if 0 + * then work with all devices that was found and accepted in the "probe" + * function. + * + * #define DEV_ID 0x105E */ -// #define DEV_ID 0x105E #define DEV_ID 0 -struct device_type { - unsigned int pci_device_id; - unsigned int controller_type; -}; struct address { bus_addr_t phys; @@ -37,15 +36,15 @@ * This structure represents the ring slot. */ struct ring_slot { + struct address descriptor; struct address mbuf; struct address packet; + /** + ** Next fields are for statistics: + **/ - /* - * Next fields are for statistics - */ - /* Time stamp of packet which placed in the slot */ struct timeval ts; @@ -110,8 +109,13 @@ #ifdef _KERNEL struct ringmap_functions; +struct device_type { + unsigned int pci_device_id; + unsigned int controller_type; +}; + struct ringmap { - /* Device structure of network adapters driver */ + /* Device structure of network adapters */ device_t devt; /* Char device for communications between user and kernel spaces */ @@ -226,8 +230,9 @@ */ #endif + /* - * D E B U G O U T P U T + * DEBUG OUTPUT */ #ifndef IOCTL_DEB #define IOCTL_DEB 0
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201006181757.o5IHv2bb062941>