New Sil3826 Backplanes for Pod 2.0
This article assumes you are using Debian 6
New backplanes based on sil3826 chipset - manufactured to replace the EOL sil3726 based backplanes used in the Backblaze Storage Pod 2.0
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=protocase1.0 kernel_image
11. Install the new kernel
dpkg -i ../linux-image-2.6.32-protocase_custom.1.0.x86_64.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.