This HowTo details how to configure DKMS to build and install your RocketRaid driver. This will allow your driver to automatically migrate between kernel updates without your intervention. DKMS is automatically called by the Ubuntu kernel install scripts.

RocketRaid 62x and 64x Driver

Notice

Variations on these instructions will likely work with other RocketRaid (or even other hardware) drivers, but they've at least been tested with the rr62x and rr64x on Maverick 10.10, Natty 11.04, Oneiric 11.10, and Precise 12.04 LTS. In spite of this, this how-to may not be complete and require modifications particular to your setup. Feel free to add modifications in this wiki page. For clarifications on how to use DKMS, the Ubuntu help page and man dkms are always a good place to look.

Prerequisites

  • Ubuntu 10.10, 11.04, 11.10, 12.04 (other versions may work as well)
  • DKMS

  • RocketRaid 620, 622, 640 or 644 RAID Card

  • Kernel Tools and Headers

Aside from the RAID Card, the standard Ubuntu installation should have everything you need, but just in case, the following should pull in anything you're missing:

# sudo apt-get install dkms

Updated and simplified procedure for Ubuntu 13.04 or later

This procedure will work for both RAID and JBOD configurations, and includes dkms and the latest RocketRaid 62x, 64x, 64xl drivers (thank you to the brave sysadmins who have preceded me on this page).

The drivers are listed here: http://www.highpoint-tech.com/USA_new/series_rr600-download.htm

RocketRaid 62x

# wget http://www.highpoint-tech.com/BIOS_Driver/rr62x/linux/rr62x-linux-src-v1.2-120601-1355.tar.gz

RocketRaid 64x

# wget http://www.highpoint-tech.com/BIOS_Driver/rr64x/linux/v1.0.10.0112/RR64x-Linux-Src-v1.1-120528-1712.tar.gz

RocketRaid 64xl

# wget http://www.highpoint-tech.com/BIOS_Driver/RR64xL/Linux/RR64xl-Linux-Src-v1.3-130325-0207.tar.gz

Now untar/unzip the files and enter the installation directory. (Path to the directory should not contain any spaces, it could lead to errors when building module.)

RocketRaid 62x

# tar -xzf rr62x-linux-src-v1.2-120601-1355.tar.gz
# cd rr62x-linux-src-v1.2

RocketRaid 64x

# tar -xzf RR64x-Linux-Src-v1.1-120528-1712.tar.gz
# cd rr64x-linux-src-v1.1

RocketRaid 64xl

# tar -xzf RR64xl-Linux-Src-v1.3-130325-0207.tar.gz
# cd rr64xl-linux-src-v1.3

Fix the source code. There are four files to edit, and one to add.

1) Edit: inc/linux/Makefile.def ( rr64xl: inc/linux_32mpa/Makefile.def )

Replace these two lines:

MAJOR := $(shell expr `grep LINUX_VERSION_CODE $(KERNELDIR)/include/linux/version.h | cut -d\  -f3` / 65536 % 65536)
MINOR := $(shell expr `grep LINUX_VERSION_CODE $(KERNELDIR)/include/linux/version.h | cut -d\  -f3` / 256 % 256)

With these two lines:

MAJOR := $(shell uname -r | cut -f1 -d.)
MINOR := $(shell uname -r | cut -f2 -d.)

2) Edit: osm/linux/osm_linux.h

Comment out (or delete) this line:

#define HPT_KMAP_TYPE KM_BIO_SRC_IRQ

3 & 4) rr62x, rr64x only. Unnecessary for rr64xl

Edit: osm/linux/os_linux.c & osm/linux/osm_linux.c

For every kmap_atomic and kunmap_atomic comment out the second parameter. e.g.:

kmap_atomic(HPT_SG_PAGE(sg), HPT_KMAP_TYPE)

becomes:

kmap_atomic(HPT_SG_PAGE(sg)/*, HPT_KMAP_TYPE*/)

5) Create dkms.conf in the root of your build, containing:

RocketRaid 62x

MAKE="make -C product/rr62x/linux/ KERNELDIR=/lib/modules/${kernelver}/build"
CLEAN="make -C product/rr62x/linux/ clean"
BUILT_MODULE_NAME=rr62x
DEST_MODULE_LOCATION=/kernel/drivers/scsi/
BUILT_MODULE_LOCATION=product/rr62x/linux/
PACKAGE_NAME=rr62x
PACKAGE_VERSION=1.2
AUTOINSTALL=yes
REMAKE_INITRD=yes

RocketRaid 64x

MAKE="make -C product/rr64x/linux/ KERNELDIR=/lib/modules/${kernelver}/build"
CLEAN="make -C product/rr64x/linux/ clean"
BUILT_MODULE_NAME=rr64x
DEST_MODULE_LOCATION=/kernel/drivers/scsi/
BUILT_MODULE_LOCATION=product/rr64x/linux/
PACKAGE_NAME=rr64x
PACKAGE_VERSION=1.1
AUTOINSTALL=yes
REMAKE_INITRD=yes

RocketRaid 64xl

MAKE="make -C product/rr64xl/linux/ KERNELDIR=/lib/modules/${kernelver}/build"
CLEAN="make -C product/rr64xl/linux/ clean"
BUILT_MODULE_NAME=rr640l
DEST_MODULE_LOCATION=/kernel/drivers/scsi/
BUILT_MODULE_LOCATION=product/rr64xl/linux/
PACKAGE_NAME=rr64xl
PACKAGE_VERSION=1.3
AUTOINSTALL=yes
REMAKE_INITRD=yes

Now build and install.

The following is for rr62x v1.2. If you are building one of the others, please substitute rr64x v1.1, or rr64xl v1.3 wherever you see rr62x or v1.2. ( Also note that the rr64xl module is named rr640l, not rr64xl as we would expect. )

cd product/rr62x/linux
make

You should get something like this:

make[1]: Entering directory `/usr/src/linux-headers-3.8.0-34-generic'
  CC [M]  /home/kshepherd/rr622/rr62x-linux-src-v1.2/product/rr62x/linux/.build/os_linux.o
  CC [M]  /home/kshepherd/rr622/rr62x-linux-src-v1.2/product/rr62x/linux/.build/osm_linux.o
  CC [M]  /home/kshepherd/rr622/rr62x-linux-src-v1.2/product/rr62x/linux/.build/div64.o
  CC [M]  /home/kshepherd/rr622/rr62x-linux-src-v1.2/product/rr62x/linux/.build/hptinfo.o
  CC [M]  /home/kshepherd/rr622/rr62x-linux-src-v1.2/product/rr62x/linux/.build/config.o
  LD [M]  /home/kshepherd/rr622/rr62x-linux-src-v1.2/product/rr62x/linux/.build/rr62x.o
  Building modules, stage 2.
  MODPOST 1 modules
WARNING: could not find /home/kshepherd/rr622/rr62x-linux-src-v1.2/product/rr62x/linux/.build/.him_magni.o.cmd for /home/kshepherd/rr622/rr62x-linux-src-v1.2/product/rr62x/linux/.build/him_magni.o
  CC      /home/kshepherd/rr622/rr62x-linux-src-v1.2/product/rr62x/linux/.build/rr62x.mod.o
  LD [M]  /home/kshepherd/rr622/rr62x-linux-src-v1.2/product/rr62x/linux/.build/rr62x.ko
make[1]: Leaving directory `/usr/src/linux-headers-3.8.0-34-generic'

Now go back to the root of your rr62x installation, to register dkms, and install the driver:

cd ../../..
sudo cp -R . /usr/src/rr62x-1.2
sudo dkms add -m rr62x -v 1.2
sudo dkms build -m rr62x -v 1.2
sudo dkms install -m rr62x -v 1.2
sudo modprobe rr62x

Your output should look something like this:

# sudo dkms add -m rr62x -v 1.2

Creating symlink /var/lib/dkms/rr62x/1.2/source ->
                 /usr/src/rr62x-1.2

DKMS: add completed.
# sudo dkms build -m rr62x -v 1.2

Kernel preparation unnecessary for this kernel.  Skipping...

Building module:
cleaning build area....
make KERNELRELEASE=3.8.0-34-generic -C product/rr62x/linux/ KERNELDIR=/lib/modules/3.8.0-34-generic/build....
cleaning build area....

DKMS: build completed.
# sudo dkms install -m rr62x -v 1.2

rr62x:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /lib/modules/3.8.0-34-generic/updates/dkms/

depmod.....

Backing up initrd.img-3.8.0-34-generic to /boot/initrd.img-3.8.0-34-generic.old-dkms
Making new initrd.img-3.8.0-34-generic
(If next boot fails, revert to initrd.img-3.8.0-34-generic.old-dkms image)
update-initramfs..........

DKMS: install completed.

The last modprobe will hopefully cause all the attached drives to appear in your file manager.

Shortcut - DEB Packages for DKMS

If you use DKMS on your system, you can jump right to the nitty-gritty and install one of these packages, or follow the instructions below to roll your own as needed:

These packages have already been patched as necessary and make use of DKMS, which means the driver will be correctly recompiled whenever you update your kernel. Also, the deb packages contained in the tar.gz archive *SHOULD* work with all Ubuntu from 10.10 upward all the way to 12.04.

Note

One final change is that you should add a line to /etc/initramfs-tools/modules containing the name of the module (rr64x or rr62x).

These DEB packages haven't been modified to do that automatically. This helps the kernel to auto-load the module on boot, and put it in your initrd file to be available at that time. Otherwise, you may or may not be able to boot off of any disks attached to the controller(s).

Introduction

To use a module with DKMS, one places the module installation files (could be source code or binary) in /usr/src/<modulename>-<version>, along with a configuration file dkms.conf that tells DKMS how to build/configure the module and what its name is. Under more advanced scenarios, conditional build instructions and patching can be done by the dkms system, but in our case this is not necessary.

Setup

Fire up your favorite terminal and download the driver package you want to use. I use the "legacy" non-RAID driver that forces all disks to be recognized as pass-thru devices for direct disk access, but the RAID driver works in exactly the same way. The following links may not be up-to-date, but they work well as of kernel 2.6.35, and 2.6.38 works with some modifications, below.

# wget http://dl.sansdigital.com/images/downloads/TR8M-BP_TR8MP/Non_RAID_Driver_Linux-SourceCode-v1.0-100421-1320.tar.zip

or for RAID

RocketRaid 62x

# wget http://www.highpoint-tech.cn/BIOS_Driver/rr62x/linux/rr62x-linux-src-v1.1-091221-1456.tar.gz

RocketRaid 64x

# wget http://www.highpoint-tech.cn/BIOS_Driver/rr64x/linux/v1.0.10.0112/rr64x-linux-src-v1.0-100113-1722.tar.gz

Now untar/unzip the files and enter the installation directory. (Path to the directory should not contain any spaces, it could lead to errors when building module.) Non-RAID:

# unzip Non_RAID_Driver_Linux-SourceCode-v1.0-100421-1320.tar.zip
# tar -xzf rr62x-linuxla-src-v1.0-100421-1320.tar.gz
# cd rr62x-linuxla-src-v1.0/

RAID:

# tar -xzf rr62x-linux-src-v1.1-091221-1456.tar.gz
# cd rr62x-linux-src-v1.1/

Source modifications required in 11.04 (Natty), 11.10 (Oneiric) and 12.04 (Precise)

The linux kernel versions included in Natty, Oneiric and Precise includes some changes that break the rr62x/rr64x drivers referenced above, and as of this writing have not been updated. However, the changes required to the source code are fairly trivial. In fact, the changes are the same for the rr62x and rr26xx (below), with only the lines on which the offending code occurs changing between the versions.

If you are running Natty, Oneiric or Precise, make these changes in the osm/linux/ subdirectory ("+" and "-" preceding a line below indicates what is deleted and what is added to a file: do not include the "+" or "-" in the code).

* Fix the KERNEL_VER definition in inc/linux/Makefile.def

-KERNEL_VER := 2.$(shell expr `grep LINUX_VERSION_CODE $(KERNELDIR)/include/linux/version.h | cut -d\  -f3` / 256 % 256)
+KERNEL_VER := $(shell uname -r | cut -f1-2 -d.)

* Also in inc/linux/Makefile.def, add the KERNEL_VER check for the value 3.0 or 3.2

+ifneq ($(KERNEL_VER), 3.2)
+ifneq ($(KERNEL_VER), 3.0)
 ifneq ($(KERNEL_VER), 2.6)
 ifneq ($(KERNEL_VER), 2.4)
-$(error Only kernel 2.4/2.6 is supported but you use $(KERNEL_VER))
+$(error Only kernel 2.4/2.6/3.0/3.2 is supported but you use $(KERNEL_VER))
 endif
 endif
+endif
+endif

* Also in inc/linux/Makefile.def, fix the KERNEL_VER check for build configurations

-ifeq ($(KERNEL_VER), 2.6)
+ifeq ($(KERNEL_VER), $(filter $(KERNEL_VER),3.2 3.0 2.6))

* Remove the config.h include statement from osm_linux.h

-#ifndef AUTOCONF_INCLUDED
-#include <linux/config.h>
-#endif

* Fix :: I'm guessing this used to work, but not on 11.10, replace with the following (osm_linux.h)

+#include <generated/autoconf.h>

* Modify the method call to blkdev_get to include a third parameter, NULL, in os_linux.c:

-blkdev_get(bdev, FMODE_READ)
+blkdev_get(bdev, FMODE_READ, NULL)

* Rename the hpt_queuecommand function to hpt_queuecommand_lck in osm_linux.c:

-static int hpt_queuecommand (Scsi_Cmnd * SCpnt, void (*done) (Scsi_Cmnd *))
+static int hpt_queuecommand_lck (Scsi_Cmnd * SCpnt, void (*done) (Scsi_Cmnd *)) 

* Also in osm_linux.c, add a few lines before the hpt_reset function declaration:

+#ifdef DEF_SCSI_QCMD
+DEF_SCSI_QCMD(hpt_queuecommand)
+#else
+#define hpt_queuecommand hpt_queuecommand_lck
+#endif
static int hpt_reset (Scsi_Cmnd *SCpnt)
 {

* Fix install.sh to support 3.0 as a valid kernel version

 case ${KERNEL_VER} in
        2.4 )
        OBJ=o
        MODVER=`modinfo -f%{kernel_version} ${PWD}/${TARGETNAME}.${OBJ}`
        ;;
        2.6 )
        OBJ=ko
        MODVER=`modinfo -F vermagic ${PWD}/${TARGETNAME}.${OBJ} | cut -d' ' -f1`
        ;;
+       3.0 )
+       OBJ=ko
+       MODVER=`modinfo -F vermagic ${PWD}/${TARGETNAME}.${OBJ} | cut -d' ' -f1`
+       ;;
+       3.2 )
+       OBJ=ko
+       MODVER=`modinfo -F vermagic ${PWD}/${TARGETNAME}.${OBJ} | cut -d' ' -f1`
+       ;;
 esac

* Fix patch.sh (at about line 146) as follows:

                 fi
         fi
         ;;
-        2.6 )
+        2.6 | 3.0 | 3.2 )
         cd ${HPT_ROOT}/lib/linux/free-${ARCH}-regparm0
         ld -r -o ${ARCH}-${TARGETNAME}.obj ${TARGETMODS}
         mv ${ARCH}-${TARGETNAME}.obj $KERNELDIR/drivers/scsi/${TARGETNAME}/

A patch for the non-RAID version 1.0 driver (rr62x-linuxla-src-v1.0) is included here (created using diff -Naur original patched > output.patch): rr62x-linuxla-src-v1.0-oneiric.patch . Download this file into your rr62x-linuxla-src-v1.0/ source directory and run:

# patch -p1 -i rr62x-linuxla-src-v1.0-oneiric.patch

Running this patch on the sources implements the changes above. Once these changes are done, you can proceed with installation as usual.

Another minor but critical fix

In 11.10 (at least) the "asm" folder is missing from /lib/modules/*/build/include, before you can compile you need to do this;

cd /lib/modules/*/build/include
ln -s ../arch/x86/include/asm

* This is the same for x86 and x86_64 ...

Installation

From this point on, install instructions will be the same for the RAID and non-RAID drivers, except for the version difference (1.0 for non-RAID, 1.1 for RAID), and the "la" suffix is in various places for the non-RAID driver. I'll continue as if we're working with the non-RAID driver, though if you drop the "la" and change the version to 1.1 you have the instructions for the RAID driver.

Installation ''Without'' DKMS

First, let's see what we're looking at:

# ls
    inc  lib  osm  product  README

Take a look at the README. Following its instructions we do the following:

# cd product/rr62x/linuxla/
# ls
    config.c  Makefile
# make
    stuff happens... look for errors
# ls
    config.c  Makefile  rr62x.ko
# sudo make install
    rr62x.ko is copied to kernel tree, initrd is rebuilt

With DKMS, we tell DKMS how to do all that for you by creating a dkms.conf file with the appropriate entries.

Configure dkms.conf

Back in the "root" rr62x-linuxla-src-v1.0/, we create dkms.conf and open it in our favorite text editor:

# ls
    inc  lib  osm  product  README
# touch dkms.conf #create dkms.conf file
# texteditorofyourchoice dkms.conf

Inside dkms.conf, we add the lines:

MAKE="make -C product/rr62x/linuxla/ KERNELDIR=/lib/modules/${kernelver}/build"
CLEAN="make -C product/rr62x/linuxla/ clean"
BUILT_MODULE_NAME=rr62x
DEST_MODULE_LOCATION=/kernel/drivers/scsi/
BUILT_MODULE_LOCATION=product/rr62x/linuxla/
PACKAGE_NAME=rr62xla
PACKAGE_VERSION=1.O
AUTOINSTALL=yes
REMAKE_INITRD=yes

All directories are with respect to the location of the dkms.conf file. This tells DKMS

  • The command to build the module (run make in the directory product/rr62x/linuxla/).

  • The command to clean the source tree (run make clean in the directory product/rr62x/linuxla/).

  • The name of the module without the .o or .ko extension.

  • That DKMS can find the built module in product/rr62x/linuxla/.

  • The name and version DKMS should associate with the module.
  • To automatically install the module into a new kernel on boot if the capability exists (this isn't necessary if you use Ubuntu's prebuilt packages to update your kernels, but it doesn't hurt).
  • To remake the initrd image after installing the module.

Save the file.

Tell DKMS about the module

Next, we install the module into DKMS by copying the module installation files into the kernel source tree /usr/src/<modulename>-<version> and tell DKMS about the new module. In our case, this is:

# ls
    dkms.conf  inc  lib  osm  product  README
# sudo cp -R . /usr/src/rr62xla-1.0
# sudo dkms add -m rr62xla -v 1.0
    dkms does its thing...

Build and Install

DKMS has now added our module to its list of modules to build for future kernel installations. To make sure it works and to install the module into our current kernel, we can instruct dkms to build and install the module:

# sudo dkms build -m rr62xla -v 1.0
    dkms does its thing.... watch for build errors... you may need to tweak dkms.conf
# sudo dkms install -m rr62xla -v 1.0
    dkms does its thing.... module is copied into current kernel module tree

Your module will be installed and reinstalled into future kernel updates.

NOTE:

At this point it is possible to have DKMS produce a DEB package, by issuing the command:

# sudo dkms mkdeb -m rr62xla -v 1.0 --source-only

That way, if you need to repeat these steps, you can just install the generated .deb (in case you made your own modifications). One such deb package (for the RocketRAID 640) is here: rr64x-dkms_1.0_all.deb. *NOTE:* the --source-only flag is important to facilitate the compatibility of the module across versions - especially for precise.

RocketRaid 26xx Driver

Notice

This is wiki page is in its infancy. Please feel free to modify or offer suggestions if possible. Currently a lot of this was done from memory and notes, and should therefore be tested again. These instructions are a bit dated, and some success may be had using a variation or combination of these with the RocketRaid 62x instructions above.

Purpose

This mini-howto is intended to help others avoid the frustration I went through when updating kernels and having my root partition on a RocketRaid mirrored drive. While not complete, this mini-howto should get most users the ability to have the driver automatically compile and install on a kernel update using DKMS.

Prerequisites

  • Ubuntu 9.04 / 9.10
  • RocketRaid 26xx RAID Card

  • Kernel Tools and Headers
  • DKMS

  • Internet Access
  • Root/sudo Permission

Setup

First, install the build tools:

sudo apt-get install build-essential

"Note: Need to make sure kernel headers are installed"

Download the driver source from Highpoint: "I recommend verifying this link is the most recent before downloading"

lwp-download http://www.support-highpoint-tech.com/Main/rr26xx/264x/Linux/opensrc/rr2640-linux-src-v1.2-090925-0932.tar.gz

Extract the tar:

tar -zxvf rr2640-linux-src-v1.2-090925-0932.tar.gz

cd rr2640-linux-src-v1.2

Make sure DKMS is installed:

sudo aptitude install dkms

Create the DKMS configuration file:

cat >dkms.conf

Cut and Paste the following text:

BUILT_MODULE_NAME=rr26xx
DEST_MODULE_LOCATION=/kernel/drivers/scsi
PACKAGE_NAME=rr26xx
PACKAGE_VERSION=1.2
AUTOINSTALL=yes
POST_BUILD="do_Module.symvers rr26xx save $dkms_tree/$module/$module_version/build/Module.symvers"

Hit "Control-D" (as in Dog) to close the file.

Copy the Makefile and Config files up to the top directory:

cp product/rr2640/linux/* .
mv Makefile Makefile_orig

Modify the HPT_ROOT in the Makefile:

sed 's/HPT_ROOT := ..\/..\/../HPT_ROOT := \/var\/lib\/dkms\/rr26xx\/1.2\/build/' Makefile_orig >Makefile

Move the source into /usr/src for DKMS:

cd ..
mv rr2640-linux-src-v1.2 /usr/src/rr26xx-1.2

"Todo: Should probably verify permissions here..."

"Note: For some reason dkms will not copy object files (.o) when doing builds, so we need to fool it below."

Trick dkms into looking in the /usr/src directory for the precompiled RocketRaid object code:

mv /usr/src/rr26xx-1.2/lib /usr/src/rr26xx-1.2/real_lib
ln -s /usr/src/rr26xx-1.2/real_lib /usr/src/rr26xx-1.2/lib

"Note: Above symbolic link must be complete (absolute) path!"

Add the source to DKMS:

sudo dkms add -m rr26xx -v 1.2

Build the module:

sudo dkms build -k 2.6.31-14-generic -m rr26xx -v 1.2

This should hopefully compile correctly. If not send an email to "rocketraid at mark.org" with the output from the file "/var/lib/dkms/rr26xx/1.2/build/make.log"

Next install the module:

sudo dkms install -k 2.6.31-14-generic -m rr26xx -v 1.2

Finally, create the boot image:

sudo mkinitramfs -o /boot/initrd.img-2.6.31-14-generic 2.6.31-14-generic

This should install it into the named kernel listed above (2.6.31-14 in this example). It will also use DKMS to compile the module for future kernel update automatically. Please see note below.

Running mkinitramfs

The directions above seem to automatically recompile and install the module whenever a new kernel update comes out (at least for 9.04 and 9.10). However, so far it does not automatically add it to the boot image.

If after a kernel upgrade you reboot and it can't find the rr26xx module, then reboot in an old working kernel and run this:

sudo mkinitramfs -o /boot/initrd.img-2.6.31-14-generic 2.6.31-14-generic

Obviously, replace "2.6.31-14-generic" with the kernel that was just updated.

I'm looking for a way to do this post DKMS (maybe POST_BUILD???). If anyone has any suggestions, please let me know!

I'm currently experimenting with adding the file /etc/kernel/postinst.d/rr26xx with the following contents:

vi /etc/kernel/postinst.d/rr26xx

# We're passed the version of the kernel being installed
inst_kern=$1

echo "Trying mkinitramfs -o /boot/initrd.img-${inst_kern} ${inst_kern}..."
mkinitramfs -o /boot/initrd.img-$inst_kern $inst_kern

exit 0

in theory this should work, but I haven't tested it yet (will with next kernel upgrade)

Make problems with 2.6.38-8-generic

These notes come from my experience in getting a RocketRAID 2640x4 to work with 2.6.38-8-generic (Ubuntu 11.04).

Three problems exist with the version 1.2 source package.

  1. os_linux.h includes linux/config.h which yields file not found errors.
  2. The blkdev_get method has an additional parameter in this version of the kernel.
  3. A change with regards to SCSI requires a further code change in osm_linux.c, I found this problem here:

Highpoint RocketRAID problem with 2.6.37 onwards

I tackled these problems as follows:

  1. Removed the linux/config.h include statement from os_linux.h
  2. Modified the method call to blkdev_get at approximately line 348 of os_linux.c

blkdev_get(bdev, FMODE_READ, NULL)

The additional parameter is NULL
  1. Appended the following to osm_linux.c

Replace this line

static int hpt_queuecommand (Scsi_Cmnd * SCpnt, void (*done) (Scsi_Cmnd *))

with this

static int hpt_queuecommand_lck (Scsi_Cmnd * SCpnt, void (*done) (Scsi_Cmnd *)) 

Before the hpt_reset method, I appended the following lines

#ifdef DEF_SCSI_QCMD
DEF_SCSI_QCMD(hpt_queuecommand)
#else
#define hpt_queuecommand hpt_queuecommand_lck
#endif

These modifications allowed me to successfully make the kernel module and 2.6.38-8-generic is now running without issue.

Updating version rr286x-linux-src-v1.4

Thanks for the great Info! These instructions helped me with v1.4 of the RocketRAID 2680 driver, but there were some differences. As a result, I decided to add the steps I used to get the 2680 driver working with version 1.4 of the source.

You can get the source here:

http://www.highpoint-tech.cn/BIOS_Driver/rr26xx/RR268x/Linux/rr268x-linux-src-v1.4-091124-1558.tar.gz

Here are the steps I used (very similar as above):

Note: A patch which does the following changes can be found here: rr268x-linux-src-v1.4-natty.patch

  1. Removed the linux/config.h include statement from osm_linux.h
  2. Modified the method call to blkdev_get at line 263 of os_linux.c. There are several other calls to this function, but this was the only one that needed the extra NULL.

blkdev_get(bdev, FMODE_READ, NULL)

The additional parameter is NULL
  1. Update the following function in osm_linux.c, line 877

Replace this

static int hpt_queuecommand (Scsi_Cmnd * SCpnt, void (*done) (Scsi_Cmnd *))

with this (just add _lck to the function name)

static int hpt_queuecommand_lck (Scsi_Cmnd * SCpnt, void (*done) (Scsi_Cmnd *)) 

Before the hpt_reset method (line 1411), I appended the following lines

#ifdef DEF_SCSI_QCMD
DEF_SCSI_QCMD(hpt_queuecommand)
#else
#define hpt_queuecommand hpt_queuecommand_lck
#endif

After making these changes I was able to run  make  followed by  sudo make install  to build and install the new driver.

To load the driver you can restart or execute the following:

sudo modprobe rr2680

Mounting the RocketRAID drive array on boot

The instructions with the RocketRAID driver give the following example to be added to /etc/fstab so the array can be mounted. However, this would not work consistently.

/dev/sda1       /mnt/raid       ext3    defaults        0       0

The problem is that the main hard drive would sometimes use sda or sdb. As a result, the only thing that will work correctly is to use the UUID.

The easiest way to find the UUID is to mount the drive array manually and then use the following steps to find the UUID for your array.

After mounting the array run:

mount

This will provide a list (similar to the following) of mounted drives so you can see how your drive was mounted:

/dev/sda3 on / type ext4 (rw,errors=remount-ro,commit=0)
/dev/sda1 on /boot type ext4 (rw,commit=0)
/dev/sdb1 on /media/Media type ext3 (rw,commit=0)

In my system I used /media/Media for the mount point instead of /mnt/raid, you can use what ever mount point you like.

Now that I know my drive is mounted on /dev/sdb1 I can then use the following command to find the UUID:

ls -l /dev/disk/by-uuid/

This will produce a list similar to the following:

lrwxrwxrwx 1 root root 10 2011-05-29 02:13 1480d1c5-9790-4c0c-9f18-851f524b1191 -> ../../sdb1
lrwxrwxrwx 1 root root 10 2011-05-29 02:13 20c1dc68-9f8c-432b-af6e-a1bce6222fc8 -> ../../sda3
lrwxrwxrwx 1 root root 10 2011-05-29 02:13 bf285813-78d1-4d2f-b94f-dc54f3579515 -> ../../sda1
lrwxrwxrwx 1 root root 10 2011-05-29 02:13 cf7bbff0-aa4d-4e22-a02f-7cc269551d74 -> ../../sda2

The first one in this list for /dev/sdb1 gives me the UUID for my drive array. Next I updated /etc/fstab with the following;

UUID=1480d1c5-9790-4c0c-9f18-851f524b1191       /media/Media    ext3    defaults        0       0

Now on reboot my drive array is mounted to /media/Media and everything is good.

Hope this helps!

RocketRaid (last edited 2014-01-03 16:35:31 by c4zxx8)