Lacie 5bign_v2 support

Here we continue from general nas-central topic to develop support for 5bign_v2
Ooops, I forgot this disk has been formated by using fvdw-sl console.Jocko wrote:Yes, you have...
look at your last fdisk output :
- Code: Select all
Disk /dev/sdb: 500.1 GB, 500107862016 bytes
256 heads, 63 sectors/track, 60563 cylinders
Units = cylinders of 16128 * 512 = 8257536 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 1 60564 488386583+ ee EFI GPT
You should read it from bottom up. It first checks sda10, then sdb10, ...., then sda7, sdb7, ....fvdw wrote:I think the disk with the fvdw-sl firmware must be the last one
also I need to have a look to u-boot. This 5big2 has a funny start up sequence.
- Code: Select all
setenv("boot_disk10","disk ${kernel_addr} 5:${primaryPart}; setenv rootfs /dev/sde7;");
setenv("boot_disk9","if disk ${kernel_addr} 6:${primaryPart}; then setenv rootfs /dev/sdd7; else run boot_disk10; fi");
setenv("boot_disk8","if disk ${kernel_addr} 1:${primaryPart}; then setenv rootfs /dev/sdc7; else run boot_disk9; fi");
setenv("boot_disk7","if disk ${kernel_addr} 2:${primaryPart}; then setenv rootfs /dev/sdb7; else run boot_disk8; fi");
setenv("boot_disk6","if disk ${kernel_addr} 3:${primaryPart}; then setenv rootfs /dev/sda7; else run boot_disk7; fi");
setenv("boot_disk5","if disk ${kernel_addr} 5:${secondaryPart}; then setenv rootfs /dev/sde7; else run boot_disk6; fi");
setenv("boot_disk4","if disk ${kernel_addr} 6:${secondaryPart}; then setenv rootfs /dev/sdd7; else run boot_disk5; fi");
setenv("boot_disk3","if disk ${kernel_addr} 1:${secondaryPart}; then setenv rootfs /dev/sdc7; else run boot_disk4; fi");
setenv("boot_disk2","if disk ${kernel_addr} 2:${secondaryPart}; then setenv rootfs /dev/sdb7; else run boot_disk3; fi");
setenv("boot_disk1","if disk ${kernel_addr} 3:${secondaryPart}; then setenv rootfs /dev/sda7; else run boot_disk2; fi");
We need to understand this to avoid the need to use fvdw-sl console to start up the nas
We should have only one disk with a partition 6 and a kernel and ensure that this one is detected gets id sda for the kernel
/**
* lacie_get_disk_num - could be called by the SCSI layer sd.c or
* by a low level SCSI driver (SATA driver for example).
* This function allow to get the case disk number associated with
* a SCSI disk.
* @sdp: scsi device
*
* Returns "disk number" or -1
*
**/
int lacie_get_disk_num(struct scsi_device *sdp)
{
int i;
struct lacie_disk *disk;
if (unlikely(!lacie_disk_map))
return -1;
for (i = 0; i < lacie_disk_map->num_disks; i++) {
disk = &lacie_disk_map->disks[i];
if (sdp->channel == disk->channel && sdp->id == disk->id &&
sdp->host->host_no == disk->host_no) {
return i;
}
}
return -1;
}
static struct lacie_disk net5big_v2_disks[] = {
{
.host_no = 0,
.channel = 3,
.id = 0,
.letter = 'a',
},
{
.host_no = 0,
.channel = 2,
.id = 0,
.letter = 'b',
},
{
.host_no = 0,
.channel = 1,
.id = 0,
.letter = 'c',
},
{
.host_no = 1,
.channel = 2,
.id = 0,
.letter = 'd',
},
{
.host_no = 1,
.channel = 1,
.id = 0,
.letter = 'e',
},
};
static struct mv_sata_platform_data netxbig_v2_sata_data = {
.n_ports = 2,
};
kirkwood_sata_init(&netxbig_v2_sata_data);
void __init kirkwood_sata_init(struct mv_sata_platform_data *sata_data)
{
kirkwood_clk_ctrl |= CGC_SATA0;
if (sata_data->n_ports > 1)
kirkwood_clk_ctrl |= CGC_SATA1;
sata_data->dram = &kirkwood_mbus_dram_info;
kirkwood_sata.dev.platform_data = sata_data;
platform_device_register(&kirkwood_sata);
}
/*****************************************************************************
* SATA
****************************************************************************/
static struct resource kirkwood_sata_resources[] = {
{
.name = "sata base",
.start = SATA_PHYS_BASE,
.end = SATA_PHYS_BASE + 0x5000 - 1,
.flags = IORESOURCE_MEM,
}, {
.name = "sata irq",
.start = IRQ_KIRKWOOD_SATA,
.end = IRQ_KIRKWOOD_SATA,
.flags = IORESOURCE_IRQ,
},
};
static struct platform_device kirkwood_sata = {
.name = "sata_mv",
.id = 0,
.dev = {
.coherent_dma_mask = 0xffffffff,
},
.num_resources = ARRAY_SIZE(kirkwood_sata_resources),
.resource = kirkwood_sata_resources,
};
/**
* sd_format_disk_name - format disk name
* @prefix: name prefix - ie. "sd" for SCSI disks
* @index: index of the disk to format name for
* @buf: output buffer
* @buflen: length of the output buffer
*
* SCSI disk names starts at sda. The 26th device is sdz and the
* 27th is sdaa. The last one for two lettered suffix is sdzz
* which is followed by sdaaa.
*
* This is basically 26 base counting with one extra 'nil' entry
* at the beginning from the second digit on and can be
* determined using similar method as 26 base conversion with the
* index shifted -1 after each digit is computed.
*
* CONTEXT:
* Don't care.
*
* RETURNS:
* 0 on success, -errno on failure.
*/
static int sd_format_disk_name(char *prefix, int index, char *buf, int buflen)
{
const int base = 'z' - 'a' + 1;
char *begin = buf + strlen(prefix);
char *end = buf + buflen;
char *p;
int unit;
p = end - 1;
*p = '\0';
unit = base;
do {
if (p == begin)
return -EINVAL;
*--p = 'a' + (index % unit);
index = (index / unit) - 1;
} while (index >= 0);
memmove(begin, p, end - p);
memcpy(buf, prefix, strlen(prefix));
return 0;
}
#if defined(CONFIG_LACIE_SCSI_DISK_RENAMING)
extern int lacie_get_sd_name(struct scsi_device *sdp, char *prefix_letter, u32 *index);
#endif
<snip>
static int sd_probe(struct device *dev)
{
<snip>
sdkp->index = index;
#if defined(CONFIG_LACIE_SCSI_DISK_RENAMING)
lacie_get_sd_name(sdp, &prefix[1], &index);
#endif
error = sd_format_disk_name(prefix, index, gd->disk_name,
DISK_NAME_LEN);
if (index >= SD_MAX_DISKS) {
error = -ENODEV;
sdev_printk(KERN_WARNING, sdp, "SCSI disk (sd) name space exhausted.\n");
goto out_free_index;
}
error = sd_format_disk_name("sd", index, gd->disk_name, DISK_NAME_LEN);
if (error)
goto out_free_index;
sdkp->device = sdp;
sdkp->driver = &sd_template;
sdkp->disk = gd;
sdkp->index = index;
atomic_set(&sdkp->openers, 0);