Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
View | Details | Raw Unified | Return to bug 83425
Collapse All | Expand All

(-)driver/ndis.c.orig (-3 / +57 lines)
Lines 22-27 Link Here
22
#include <linux/types.h>
22
#include <linux/types.h>
23
#include <linux/string.h>
23
#include <linux/string.h>
24
#include <linux/ctype.h>
24
#include <linux/ctype.h>
25
#include <linux/list.h>
25
26
26
#include "ndis.h"
27
#include "ndis.h"
27
#include "iw_ndis.h"
28
#include "iw_ndis.h"
Lines 1045-1050 Link Here
1045
	TRACEEXIT3(return);
1046
	TRACEEXIT3(return);
1046
}
1047
}
1047
1048
1049
struct virt_mem_map {
1050
	struct list_head list;
1051
	void* virt;
1052
	void* buffer;
1053
};
1054
typedef struct virt_mem_map virt_mem_map;
1055
1056
static LIST_HEAD(map_list);
1057
1048
STDCALL void WRAP_EXPORT(NdisAllocateBufferPool)
1058
STDCALL void WRAP_EXPORT(NdisAllocateBufferPool)
1049
	(NDIS_STATUS *status, void *poolhandle, UINT size)
1059
	(NDIS_STATUS *status, void *poolhandle, UINT size)
1050
{
1060
{
Lines 1064-1070 Link Here
1064
	(NDIS_STATUS *status, ndis_buffer **buffer,
1074
	(NDIS_STATUS *status, ndis_buffer **buffer,
1065
	 void *poolhandle, void *virt, UINT len)
1075
	 void *poolhandle, void *virt, UINT len)
1066
{
1076
{
1067
	ndis_buffer *buf = kmalloc(sizeof(ndis_buffer), GFP_ATOMIC);
1077
	struct list_head *tmp;
1078
	ndis_buffer *buf;
1079
	if(list_empty(&map_list)) {
1080
	goto doalloc;
1081
	}
1082
	list_for_each(tmp, &map_list){
1083
		struct virt_mem_map* map = list_entry(tmp, struct virt_mem_map, list);
1084
		if(map->virt == virt) {
1085
			buf = (ndis_buffer*) map->buffer;
1086
			memset(buf, 0, sizeof(ndis_buffer));
1087
			buf->startva = virt;
1088
			buf->byteoffset = 0;
1089
			buf->bytecount = len;
1090
			buf->next = NULL;
1091
			*buffer = buf;
1092
			*status = NDIS_STATUS_SUCCESS;
1093
			return;
1094
		}
1095
	}
1096
doalloc:
1097
	buf = kmalloc(sizeof(ndis_buffer), GFP_ATOMIC);
1068
	TRACEENTER4("%s", "");
1098
	TRACEENTER4("%s", "");
1069
	if (!buf) {
1099
	if (!buf) {
1070
		ERROR("%s", "Couldn't allocate memory");
1100
		ERROR("%s", "Couldn't allocate memory");
Lines 1080-1085 Link Here
1080
	buf->next = NULL;
1110
	buf->next = NULL;
1081
1111
1082
	*buffer = buf;
1112
	*buffer = buf;
1113
	
1114
	{
1115
		virt_mem_map *new_entry = kmalloc(sizeof(struct virt_mem_map), GFP_ATOMIC);
1116
		if(!new_entry) {
1117
			ERROR("%s", "Couldn't allocate memory");
1118
			*status = NDIS_STATUS_FAILURE;
1119
			TRACEEXIT4(return);
1120
		}
1121
	INIT_LIST_HEAD(&new_entry->list);
1122
	new_entry->virt = virt;
1123
	new_entry->buffer = buf;
1124
	list_add(&new_entry->list, &map_list);
1125
	}
1126
	
1083
1127
1084
	DBGTRACE4("allocated buffer: %p", buf);
1128
	DBGTRACE4("allocated buffer: %p", buf);
1085
	*status = NDIS_STATUS_SUCCESS;
1129
	*status = NDIS_STATUS_SUCCESS;
Lines 1089-1098 Link Here
1089
STDCALL void WRAP_EXPORT(NdisFreeBuffer)
1133
STDCALL void WRAP_EXPORT(NdisFreeBuffer)
1090
	(ndis_buffer *buffer)
1134
	(ndis_buffer *buffer)
1091
{
1135
{
1136
	struct list_head *tmp;
1092
	TRACEENTER4("%p", buffer);
1137
	TRACEENTER4("%p", buffer);
1138
	if (buffer) {
1139
		list_for_each(tmp, &map_list){
1140
		struct virt_mem_map* map = list_entry(tmp, struct virt_mem_map, list);
1141
		if(map->buffer == buffer) {
1142
			list_del(&map->list);
1143
			kfree(map->buffer);
1144
			kfree(map);
1145
			return;
1146
		}
1147
	   }
1093
1148
1094
	if (buffer)
1149
	}
1095
		kfree(buffer);
1096
	TRACEEXIT4(return);
1150
	TRACEEXIT4(return);
1097
}
1151
}
1098
1152

Return to bug 83425