New Sil3826 Backplanes for Pod 2.0

From 45 Drives Technical Information Wiki
Jump to: navigation, search

NOTE

This article is left here for legacy information This process is no longer needed for newer kernels - 3.10 and above. For those using CentOS6 you can simply install the kernel-lt package from the elrepo repository as per the instructions on this page: Elrepo


Legacy Systems

New backplanes based on sil3826 chipset manufactured to replace the EOL sil3726 based backplanes used in the Backblaze Storage Pod 2.0

This article assumes you are using Debian 6

SRST Errors - (Soft Reset) during boot-up resulting in long boot up times (and possibly failed boot due to excessive timeouts)

From the libata driver code: port 5 is for SEMB and doesn't like SRST [1]

The solution for this is to modify libata to add a definition for the sil3826 chipset to not send SRST and then rebuild our own customer kernel

Note: This entire process was performed as the root user. This not neccessary for every step and you can adjust if you so choose.



1. Make sure ncurses is installed

apt-get install libncurses5-dev

2. Make sure kernel-package is installed

apt-get install kernel-package

3. Install the kernel source code

apt-get install linux-source-2.6.32

4. Because /usr is too small .. extract to /home

tar xjf /usr/src/linux-source-2.6.32.tar.bz -C /home/linux-source-2.6.32

5. Move into the directory that we just created containing the kernel source code

cd /home/linux-source-2.6.32

6. Open and modify the libata-pmp.c file

vi drivers/ata/libata-pmp.c 

7. Change:

386        if (vendor == 0x1095 && devid == 0x3726) {
387                /* sil3726 quirks */
388                ata_for_each_link(link, ap, EDGE) {
389                        /* link reports offline after LPM */
390                        link->flags |= ATA_LFLAG_NO_LPM;
391
392                        /* Class code report is unreliable. */
393                        if (link->pmp < 5)
394                                link->flags |= ATA_LFLAG_ASSUME_ATA;
395
396                        /* port 5 is for SEMB device and it doesn't like SRST */
397                        if (link->pmp == 5)
398                                link->flags |= ATA_LFLAG_NO_SRST |
399                                               ATA_LFLAG_ASSUME_SEMB;
400                }

To this:

386        if (vendor == 0x1095 && (devid == 0x3726) || (devid == 0x3826)) {
387                /* sil3726, sil3826 quirks */
388                ata_for_each_link(link, ap, EDGE) {
389                        /* link reports offline after LPM */
390                        link->flags |= ATA_LFLAG_NO_LPM;
391
392                        /* Class code report is unreliable. */
393                        if (link->pmp < 5)
394                                link->flags |= ATA_LFLAG_ASSUME_ATA;
395
396                        /* port 5 is for SEMB device and it doesn't like SRST */
397                        if (link->pmp == 5)
398                                link->flags |= ATA_LFLAG_NO_SRST |
399                                               ATA_LFLAG_ASSUME_SEMB;
400                }

8. Save and exit the file

:wq

9. Make a new kernel build .config file

make menuconfig
- save an alternate configuration file (.config)
- exit

10. Perform the build process (Substitute "protocase1.0" with whatever name you want to use)

make-kpkg clean
fakeroot make-kpkg --initrd --revision=1protocase0 kernel_image 

11. Install the new kernel

dpkg -i ../linux-image-2.6.32_1protocase0_amd64.deb


After the new kernel is installed you can reboot and choose your new kernel from the grub menu. If the new kernel does not show up in the list, then boot into the original kernel and update grub by running (as root):

update-grub

Now when you reboot, the new kernel should appear in the grub boot menu.

Personal tools
Namespaces

Variants
Actions
Navigation
Toolbox