Re: 7.0 BETA1 and Thinkpad T61p : Wireless misadventure




----- Original Message ----

From: Scot Hetzel <swhetzel@xxxxxxxxx>

To: Mike Pumford <mpumford@xxxxxxxxxxxxxx>

Cc: freebsd-mobile@xxxxxxxxxxx; freebsd-stable@xxxxxxxxxxx; Abdullah Ibn Hamad Al-Marri <wearabnet@xxxxxxxx>

Sent: Wednesday, October 31, 2007 6:56:58 AM

Subject: Re: 7.0 BETA1 and Thinkpad T61p : Wireless misadventure



On 10/30/07, Mike Pumford <mpumford@xxxxxxxxxxxxxx> wrote:

Abdullah Ibn Hamad Al-Marri wrote:





Previously I didn't mention that there are some functions missing from



the FreeBSD's NDIS api. These are:



With the help of NDIS reference and Linux ndiswrapper I have been able



to implement all but KeBugCheckEx (they are all rather simple but I



Can help you with this one. This is the Windows equivalent of panic().

So just call panic with an appropriate string. If the string includes

the bugcheck code and parameters so much the better.



Thanks for your hint to use panic() in the KeBugCheckEx function.

I have KeBugCheckEx partially implemented. It currently prints the

bugcheck code

and the 4 paramators that are sent to KeBugCheckEx.



The KeBugCheckEx function still needs to be changed to display

the right information depending on the bugcheck code.







Abdullah, I made a minor change to your patch, strncat should be

prefixed with ntoskrnl_strncat.

changed IMPORT_CFUNC(strncat..) to IMPORT_CFUNC_MAP(ntoskrnl_strncat..).



Scot





-----Inline Attachment Follows-----



Index: ndis_var.h

===================================================================

RCS file: /home/ncvs/src/sys/compat/ndis/ndis_var.h,v

retrieving revision 1.47

diff -u -r1.47 ndis_var.h

--- ndis_var.h 6 Apr 2007 11:18:57 -0000 1.47

+++ ndis_var.h 31 Oct 2007 03:31:24 -0000

@@ -49,6 +49,10 @@

typedef register_t ndis_kspin_lock;

typedef uint8_t ndis_kirql;



+/* Version of NDIS supported by FreeBSD */

+#define NDIS_VERSION_51 0x00050001

+#define NDIS_VERSION NDIS_VERSION_51

+

/*

* NDIS status codes (there are lots of them). The ones that

* don't seem to fit the pattern are actually mapped to generic

Index: ntoskrnl_var.h

===================================================================

RCS file: /home/ncvs/src/sys/compat/ndis/ntoskrnl_var.h,v

retrieving revision 1.43

diff -u -r1.43 ntoskrnl_var.h

--- ntoskrnl_var.h 17 Aug 2006 22:50:32 -0000 1.43

+++ ntoskrnl_var.h 31 Oct 2007 03:31:24 -0000

@@ -1202,14 +1202,22 @@



/* Memory pool types, for ExAllocatePoolWithTag() */



-#define NonPagedPool 0x00000000

-#define PagedPool 0x00000001

-#define NonPagedPoolMustSucceed 0x00000002

-#define DontUseThisType 0x00000003

-#define NonPagedPoolCacheAligned 0x00000004

-#define PagedPoolCacheAligned 0x00000005

-#define NonPagedPoolCacheAlignedMustS 0x00000006

-#define MaxPoolType 0x00000007

+#define NonPagedPool 0x00000000

+#define PagedPool 0x00000001

+#define NonPagedPoolMustSucceed 0x00000002

+#define DontUseThisType 0x00000003

+#define NonPagedPoolCacheAligned 0x00000004

+#define PagedPoolCacheAligned 0x00000005

+#define NonPagedPoolCacheAlignedMustS 0x00000006

+#define MaxPoolType 0x00000007

+

+#define NonPagedPoolSession 0x00000020

+#define PagedPoolSession 0x00000021

+#define NonPagedPoolMustSucceedSession 0x00000022

+#define DontUseThisTypeSession 0x00000023

+#define NonPagedPoolCacheAlignedSession 0x00000024

+#define PagedPoolCacheAlignedSession 0x00000025

+#define NonPagedPoolCacheAlignedMustSSession 0x00000026



/*

* IO_WORKITEM is an opaque structures that must be allocated

@@ -1357,8 +1365,12 @@

extern uint8_t KeSynchronizeExecution(kinterrupt *, void *, void *);

extern uintptr_t InterlockedExchange(volatile uint32_t *,

uintptr_t);

+extern void *ExAllocatePool(uint32_t, size_t);

+extern void *ExAllocatePoolWithQuota(uint32_t, size_t);

+extern void *ExAllocatePoolWithQuotaTag(uint32_t, size_t, uint32_t);

extern void *ExAllocatePoolWithTag(uint32_t, size_t, uint32_t);

extern void ExFreePool(void *);

+extern void ExFreePoolWithTag(void *, uint32_t);

extern uint32_t IoConnectInterrupt(kinterrupt **, void *, void *,

kspin_lock *, uint32_t, uint8_t, uint8_t, uint8_t, uint8_t,

uint32_t, uint8_t);

Index: subr_ndis.c

===================================================================

RCS file: /home/ncvs/src/sys/compat/ndis/subr_ndis.c,v

retrieving revision 1.108

diff -u -r1.108 subr_ndis.c

--- subr_ndis.c 31 May 2007 11:51:49 -0000 1.108

+++ subr_ndis.c 31 Oct 2007 03:31:24 -0000

@@ -272,6 +272,7 @@

static void NdisUnmapFile(ndis_handle);

static void NdisCloseFile(ndis_handle);

static uint8_t NdisSystemProcessorCount(void);

+static void NdisGetCurrentProcessorCounts(uint32_t *, uint32_t *, uint32_t*);

static void NdisMIndicateStatusComplete(ndis_handle);

static void NdisMIndicateStatus(ndis_handle, ndis_status,

void *, uint32_t);

@@ -282,6 +283,7 @@

uint32_t, uint32_t, ndis_packet *, uint32_t, uint32_t *);

static void NdisCopyFromPacketToPacketSafe(ndis_packet *,

uint32_t, uint32_t, ndis_packet *, uint32_t, uint32_t *, uint32_t);

+static void NdisIMCopySendPerPacketInfo(ndis_packet *, ndis_packet *);

static ndis_status NdisMRegisterDevice(ndis_handle,

unicode_string *, unicode_string *, driver_dispatch **,

void **, ndis_handle *);

@@ -3115,6 +3117,20 @@

return(mp_ncpus);

}



+static void

+NdisGetCurrentProcessorCounts(idlecount, kerneluser, index)

+ uint32_t *idlecount;

+ uint32_t *kerneluser;

+ uint32_t *index;

+{

+ int cpu = 0; /* Current CPU */

+

+ *idlecount = cp_time[CP_IDLE];

+ *kerneluser = (cp_time[CP_USER] + cp_time[CP_NICE]) + \

+ (cp_time[CP_SYS] + cp_time[CP_INTR]);

+ *index = cpu;

+}

+

typedef void (*ndis_statusdone_handler)(ndis_handle);

typedef void (*ndis_status_handler)(ndis_handle, ndis_status,

void *, uint32_t);

@@ -3288,6 +3304,14 @@

return;

}



+static void

+NdisIMCopySendPerPacketInfo(dpkt, spkt)

+ ndis_packet *dpkt;

+ ndis_packet *spkt;

+{

+ memcpy(&dpkt->np_ext, &spkt->np_ext, sizeof(ndis_packet_extension));

+}

+

static ndis_status

NdisMRegisterDevice(handle, devname, symname, majorfuncs, devobj, devhandle)

ndis_handle handle;

@@ -3346,6 +3370,12 @@

return;

}



+static uint32_t

+NdisGetVersion()

+{

+ return(NDIS_VERSION);

+}

+

static void

dummy()

{

@@ -3365,10 +3395,12 @@

image_patch_table ndis_functbl[] = {

IMPORT_SFUNC(NdisCopyFromPacketToPacket, 6),

IMPORT_SFUNC(NdisCopyFromPacketToPacketSafe, 7),

+ IMPORT_SFUNC(NdisIMCopySendPerPacketInfo, 2),

IMPORT_SFUNC(NdisScheduleWorkItem, 1),

IMPORT_SFUNC(NdisMIndicateStatusComplete, 1),

IMPORT_SFUNC(NdisMIndicateStatus, 4),

IMPORT_SFUNC(NdisSystemProcessorCount, 0),

+ IMPORT_SFUNC(NdisGetCurrentProcessorCounts, 3),

IMPORT_SFUNC(NdisUnchainBufferAtBack, 2),

IMPORT_SFUNC(NdisGetFirstBufferFromPacket, 5),

IMPORT_SFUNC(NdisGetFirstBufferFromPacketSafe, 6),

@@ -3482,6 +3514,7 @@

IMPORT_SFUNC(NdisMDeregisterDevice, 1),

IMPORT_SFUNC(NdisMQueryAdapterInstanceName, 2),

IMPORT_SFUNC(NdisMRegisterUnloadHandler, 2),

+ IMPORT_SFUNC(NdisGetVersion, 0),

IMPORT_SFUNC(ndis_timercall, 4),

IMPORT_SFUNC(ndis_asyncmem_complete, 2),

IMPORT_SFUNC(ndis_intr, 2),

Index: subr_ntoskrnl.c

===================================================================

RCS file: /home/ncvs/src/sys/compat/ndis/subr_ntoskrnl.c,v

retrieving revision 1.91

diff -u -r1.91 subr_ntoskrnl.c

--- subr_ntoskrnl.c 20 Oct 2007 23:23:12 -0000 1.91

+++ subr_ntoskrnl.c 31 Oct 2007 03:31:24 -0000

@@ -219,6 +219,8 @@

static int rand(void);

static void srand(unsigned int);

static void ntoskrnl_time(uint64_t *);

+static void KeQuerySystemTime(uint64_t *);

+static uint32_t KeTickCount(void);

static uint8_t IoIsWdmVersionAvailable(uint8_t, uint8_t);

static void ntoskrnl_thrfunc(void *);

static ndis_status PsCreateSystemThread(ndis_handle *,

@@ -226,6 +228,8 @@

static ndis_status PsTerminateSystemThread(ndis_status);

static ndis_status IoGetDeviceProperty(device_object *, uint32_t,

uint32_t, void *, uint32_t *);

+static void KeBugCheckEx(uint32_t , uint32_t *, uint32_t *, uint32_t *,

+ uint32_t *);

static void KeInitializeMutex(kmutant *, uint32_t);

static uint32_t KeReleaseMutex(kmutant *, uint8_t);

static uint32_t KeReadStateMutex(kmutant *);

@@ -238,8 +242,10 @@

static uint32_t WmiTraceMessage(uint64_t, uint32_t, void *, uint16_t, ...);

static uint32_t IoWMIRegistrationControl(device_object *, uint32_t);

static void *ntoskrnl_memset(void *, int, size_t);

+static int ntoskrnl_memcmp(void *, void *, size_t);

static void *ntoskrnl_memmove(void *, void *, size_t);

static void *ntoskrnl_memchr(void *, unsigned char, size_t);

+static char *ntoskrnl_strncat(char *, char *, size_t);

static char *ntoskrnl_strstr(char *, char *);

static int ntoskrnl_toupper(int);

static int ntoskrnl_tolower(int);

@@ -429,6 +435,16 @@

return(memset(buf, ch, size));

}



+

+static int

+ntoskrnl_memcmp(buf1, buf2, size)

+ void *buf1;

+ void *buf2;

+ size_t size;

+{

+ return(memcmp(buf1, buf2, size));

+}

+

static void *

ntoskrnl_memmove(dst, src, size)

void *src;

@@ -456,6 +472,29 @@

return (NULL);

}



+/* Taken from libc */

+char *

+ntoskrnl_strncat(dst, src, n)

+ char *dst;

+ char *src;

+ size_t n;

+{

+ if (n != 0) {

+ char *d = dst;

+ const char *s = src;

+

+ while (*d != 0)

+ d++;

+ do {

+ if ((*d = *s++) == 0)

+ break;

+ d++;

+ } while (--n != 0);

+ *d = 0;

+ }

+ return (dst);

+}

+

static char *

ntoskrnl_strstr(s, find)

char *s, *find;

@@ -624,6 +663,31 @@

}



void *

+ExAllocatePool(pooltype, len)

+ uint32_t pooltype;

+ size_t len;

+{

+ return(ExAllocatePoolWithTag(pooltype, len, 0));

+}

+

+void *

+ExAllocatePoolWithQuota(pooltype, len)

+ uint32_t pooltype;

+ size_t len;

+{

+ return(ExAllocatePoolWithTag(pooltype, len, 0));

+}

+

+void *

+ExAllocatePoolWithQuotaTag(pooltype, len, tag)

+ uint32_t pooltype;

+ size_t len;

+ uint32_t tag;

+{

+ return(ExAllocatePoolWithTag(pooltype, len, tag));

+}

+

+void *

ExAllocatePoolWithTag(pooltype, len, tag)

uint32_t pooltype;

size_t len;

@@ -642,6 +706,14 @@

ExFreePool(buf)

void *buf;

{

+ ExFreePoolWithTag(buf, 0);

+}

+

+void

+ExFreePoolWithTag(buf, tag)

+ void *buf;

+ uint32_t tag;

+{

free(buf, M_DEVBUF);

return;

}

@@ -1587,6 +1659,21 @@

return;

}



+static void

+KeQuerySystemTime(current_time)

+ uint64_t *current_time;

+{

+ ntoskrnl_time(current_time);

+}

+

+static uint32_t

+KeTickCount(void)

+{

+ struct timeval tv;

+ getmicrouptime(&tv);

+ return tvtohz(&tv);

+}

+

/*

* KeWaitForSingleObject() is a tricky beast, because it can be used

* with several different object types: semaphores, timers, events,

@@ -2316,6 +2403,22 @@

}



void

+KeBugCheckEx(bugcheck, param1, param2, param3, param4)

+ uint32_t bugcheck;

+ uint32_t *param1;

+ uint32_t *param2;

+ uint32_t *param3;

+ uint32_t *param4;

+{

+ /* http://msdn2.microsoft.com/en-us/library/ms801645.aspx */

+

+ panic("KeBugCheckEx: STOP: %#08x, (%8p, %8p, %8p, %8p)",

+ bugcheck, param1, param2, param3, param4);

+

+ return;

+}

+

+void

KeInitializeSpinLock(lock)

kspin_lock *lock;

{

@@ -2814,7 +2917,7 @@

for (i = 0; i < WORKITEM_THREADS; i++) {

kq = wq_queues + i;

kq->kq_exit = 1;

- KeSetEvent(&kq->kq_proc, IO_NO_INCREMENT, FALSE);

+ KeSetEvent(&kq->kq_proc, IO_NO_INCREMENT, FALSE);

while (kq->kq_exit)

tsleep(kq->kq_td->td_proc, PWAIT, "waitiw", hz/10);

}

@@ -3182,7 +3285,10 @@

uint8_t major;

uint8_t minor;

{

- if (major == WDM_MAJOR && minor == WDM_MINOR_WINXP)

+ if (major == WDM_MAJOR &&

+ (minor == WDM_MINOR_WIN2003 || /* Windows 2003 */

+ minor == WDM_MINOR_WINXP || /* Windows XP */

+ minor == WDM_MINOR_WIN2000)) /* Windows 2000 */

return(TRUE);

return(FALSE);

}

@@ -4218,6 +4324,7 @@

IMPORT_CFUNC(strncmp, 0),

IMPORT_CFUNC(strcmp, 0),

IMPORT_CFUNC_MAP(stricmp, strcasecmp, 0),

+ IMPORT_CFUNC_MAP(strncat, ntoskrnl_strncat, 0),

IMPORT_CFUNC(strncpy, 0),

IMPORT_CFUNC(strcpy, 0),

IMPORT_CFUNC(strlen, 0),

@@ -4229,6 +4336,7 @@

IMPORT_CFUNC(memcpy, 0),

IMPORT_CFUNC_MAP(memmove, ntoskrnl_memmove, 0),

IMPORT_CFUNC_MAP(memset, ntoskrnl_memset, 0),

+ IMPORT_CFUNC_MAP(memcmp, ntoskrnl_memcmp, 0),

IMPORT_CFUNC_MAP(memchr, ntoskrnl_memchr, 0),

IMPORT_SFUNC(IoAllocateDriverObjectExtension, 4),

IMPORT_SFUNC(IoGetDriverObjectExtension, 2),

@@ -4290,8 +4398,12 @@

InterlockedPushEntrySList, 2),

IMPORT_FFUNC(ExInterlockedPopEntrySList, 2),

IMPORT_FFUNC(ExInterlockedPushEntrySList, 3),

+ IMPORT_SFUNC(ExAllocatePool, 2),

+ IMPORT_SFUNC(ExAllocatePoolWithQuota, 2),

+ IMPORT_SFUNC(ExAllocatePoolWithQuotaTag, 3),

IMPORT_SFUNC(ExAllocatePoolWithTag, 3),

IMPORT_SFUNC(ExFreePool, 1),

+ IMPORT_SFUNC(ExFreePoolWithTag, 2),

#ifdef __i386__

IMPORT_FFUNC(KefAcquireSpinLockAtDpcLevel, 1),

IMPORT_FFUNC(KefReleaseSpinLockFromDpcLevel,1),

@@ -4336,6 +4448,7 @@

IMPORT_SFUNC(IoQueueWorkItem, 4),

IMPORT_SFUNC(ExQueueWorkItem, 2),

IMPORT_SFUNC(ntoskrnl_workitem, 2),

+ IMPORT_SFUNC(KeBugCheckEx, 5),

IMPORT_SFUNC(KeInitializeMutex, 2),

IMPORT_SFUNC(KeReleaseMutex, 2),

IMPORT_SFUNC(KeReadStateMutex, 1),

@@ -4365,6 +4478,8 @@

IMPORT_SFUNC(IoWMIRegistrationControl, 2),

IMPORT_SFUNC(WmiQueryTraceInformation, 5),

IMPORT_CFUNC(WmiTraceMessage, 0),

+ IMPORT_SFUNC(KeQuerySystemTime, 1),

+ IMPORT_CFUNC(KeTickCount, 0),



/*

* This last entry is a catch-all for any function we haven't







-----Inline Attachment Follows-----



____________


Hello Marcin,

Could you please try this patch which modified by Mr. Scot Hetzel please?



--

Regards,

-Abdullah Ibn Hamad Al-Marri

Arab Portal

http://www.WeArab.Net/










__________________________________________________
Do You Yahoo!?
Tired of spam? Yahoo! Mail has the best spam protection around
http://mail.yahoo.com
_______________________________________________
freebsd-stable@xxxxxxxxxxx mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-stable
To unsubscribe, send any mail to "freebsd-stable-unsubscribe@xxxxxxxxxxx"



Relevant Pages

  • Re: [PATCH/proposal] dm-crypt: add digest-based iv generation mode
    ... +static int crypto_copy_ops(struct crypto_tfm *tfm) ... static void crypto_exit_ops ... diff -Nur linux.orig/crypto/compress.c linux/crypto/compress.c ...
    (Linux-Kernel)
  • [TEST/REVIEW] boot0cfg/fdisk issue fix
    ... retrieving revision 1.65 ... diff -u -r1.65 geom_mbr.c ... static void dos; ... static int open_disk; ...
    (freebsd-current)
  • Re: 2.6.16rc1-git4 slab corruption.
    ... diff -r abc01241b9e0 drivers/char/Makefile ... +static int module_exiting; ... +static char *mem_alloc{ ... +static void mem_check{ ...
    (Linux-Kernel)
  • Re: HEADSUP!!! USB MFC committed..
    ... > and merge in the hacks from the earlier-mentioned diff. ... clarification of what is to be found in this hack. ... Static int ... Static void ...
    (freebsd-stable)
  • [git patches] new wireless stuffs
    ... patch with a Linksys WPC11v3. ... All this new wireless code adds near-infinite amounts of trailing whitespace. ... static void timer_func; ... static int takedown_proc_entry(struct net_device *dev, ...
    (Linux-Kernel)