Site hosted by Angelfire.com: Build your free website today!
INTRODUCTION

The Motorola sm56 soft modem driver has been tested to work for Mandrake Linux 8.0 (i386).  However, Motorola discontinued their support for the sm56 soft modem later in <DATE>.  The Motorola sm56 soft modem driver found in the Motorola website only works for Mandrake Linux 8.0 (i386) as tested on my machine.  When the driver is installed on Mandrake Linux 8.2, the driver stops responding and does not work.  This webpage details the steps that I have done in order to make the soft modem driver works on Mandrake Linux 8.2.


DISCLAIMER:

The steps outlined in this page is not guaranteed to be fully working.  It may caused incompatibilities, bugs, and data corruption when the kernel source code is modified.  The author does not know the effect and the full consequence of the solution suggested in this page.  However, to the best of his knowledge, the steps outlined so far does not caused any problem.  Please report any problems found or comments to the author's email address at the bottom of the webpage.

PROBLEM


The following error messages are produced when you load the sm56 driver.  It is assumed that you have already installed the sm56 driver on your system:

Log-in as root and type the following command on the shell:

[root@localhost darwin]# insmod sm56
Using /lib/modules/2.4.18-6mdk/kernel/drivers/char/sm56
Warning: loading /lib/modules/2.4.48-6mdk/kernel/drivers/char/sm56 will taint the kernel: no license
Segmentation fault
[root@localhost darwin]#


To get more information on the error message, type the following command on the shell:

[root@localhost darwin]# dmesg

We obtained the following details:

kernel BUG at slab.c:1099!
invalid operand: 0000
CPU: 0
EIP: 0010:[<c012b4a6>] Tainted: P
EFLAGS: 00010282
eax: 0000001b ebx: d3fdc2f0 ecx: 00000001 edx: 00001799
esi: d3fdc2f0 edi: 00000007 ebp: d3fdc2f0 esp: cf8f5e1c
ds: 0018 es: 0018 ss: 0018
Process insmod (pid: 1401, stackpage=cf8f5000)
Stack: c02314e3 0000044b 00000001 c012da15 c02d6f90 00001030 d3fd9800 c0146590
00000282 d3fdc2f0 00000202 d3fdc2f8 d3fdc2f0 c012b84c d3fdc2f0 00000007
00000001 c012da15 c02d6f90 00000000 00000064 00000000 00000000 cf8f5e98
Call Trace: [<c012da15>] [<c0146590>] [<c012b84c>] [<c012da15>] [<d6981060>] [<c021074a>] [<d69c7d34>] [<d69c7a63>] [<c012da15>] [<c01174f5>] [<d6981060>] [<c0106f4b>]
Code: 0f 0b 5a 59 f7 c7 00 10 00 00 0f 85 d0 01 00 00 a1 c8 d3 33


Note the first line in the information above:

kernel BUG at slab.c:1099!


We can try to fix the error by modifying the kernel source file slab.c at line 1099.  The steps are outlined in the next section.


SOLUTION

It is assumed that you have installed the kernel source codes.  It is available from your Mandrake Linux 8.2 installation CDs.

Type the following command to locate the kernel source code slab.c:

[root@localhost darwin]# locate slab.c
/usr/src/linux-2.4.18-6mdk/drivers/media/radio/radio-aimslab.c
/usr/src/linux-2.4.18-6mdk/mm/slab.c
[root@localhost darwin]#

We are interested in the file /usr/src/linux-2.4.18-6mdk/mm/slab.c. View the file using any text editor and go to line 1099.  You can see the following C codes:

static int kmem_cache_grow (kmem_cache_t * cachep, int flags)
{
slab_t *slabp;
struct page *page;
void *objp;
size_t offset;
unsigned int i, local_flags;
unsigned long ctor_flags;
unsigned long save_flags;

/* Be lazy and only check for valid flags here,
* keeping it out of the critical path in kmem_cache_alloc().
*/

if (flags & ~(SLAB_DMA|SLAB_LEVEL_MASK|SLAB_NO_GROW))
BUG();


if (flags & SLAB_NO_GROW)
return 0;


Note the lines in bold and red color, it is located in lines 1098 and 1099.  If we removed these lines, we can avoid the error message that is preventing our sm56 driver from being installed.  Comment out the lines in bold and red color above:

/*
if (flags & ~(SLAB_DMA|SLAB_LEVEL_MASK|SLAB_NO_GROW))
BUG();
*/

Now recompile your kernel source code.  You can view the instructions located on the README.TXT in your kernel source code root directory.  Install your newly compiled kernel.  Reinstall the sm56 driver again if it is erased when installing the new kernel.  Then load the sm56 driver by typing insmod sm56.  Your driver should now install itself without the segmentation fault message.  Happy browsing using your sm56 and Linux!!!






If you found any problems, additional information, explanation, comments and suggestions, please send them to darwin_te@yahoo.com.

Last modified: 29 September 2002