diff options
author | Sumant Patro <sumantp@lsil.com> | 2007-02-14 12:41:55 -0800 |
---|---|---|
committer | James Bottomley <jejb@mulgrave.il.steeleye.com> | 2007-02-16 10:19:53 -0600 |
commit | cf62a0a543fbab15286509d2e04e3dcf5549e966 (patch) | |
tree | 9ed2070713deb33db6557031923be7cfe3ef1e68 /drivers/scsi/megaraid | |
parent | af37acfb63d8e924550e67b884dbd1c478e26c96 (diff) | |
download | linux-3.10-cf62a0a543fbab15286509d2e04e3dcf5549e966.tar.gz linux-3.10-cf62a0a543fbab15286509d2e04e3dcf5549e966.tar.bz2 linux-3.10-cf62a0a543fbab15286509d2e04e3dcf5549e966.zip |
[SCSI] megaraid_sas: add bios_param in scsi_host_template
Signed-off-by: Sumant Patro <sumant.patro@lsi.com>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers/scsi/megaraid')
-rw-r--r-- | drivers/scsi/megaraid/megaraid_sas.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/drivers/scsi/megaraid/megaraid_sas.c b/drivers/scsi/megaraid/megaraid_sas.c index 6ff54014080..9c5e4da5a13 100644 --- a/drivers/scsi/megaraid/megaraid_sas.c +++ b/drivers/scsi/megaraid/megaraid_sas.c @@ -35,6 +35,7 @@ #include <asm/uaccess.h> #include <linux/fs.h> #include <linux/compat.h> +#include <linux/blkdev.h> #include <linux/mutex.h> #include <scsi/scsi.h> @@ -1015,6 +1016,49 @@ static int megasas_reset_bus_host(struct scsi_cmnd *scmd) } /** + * megasas_bios_param - Returns disk geometry for a disk + * @sdev: device handle + * @bdev: block device + * @capacity: drive capacity + * @geom: geometry parameters + */ +static int +megasas_bios_param(struct scsi_device *sdev, struct block_device *bdev, + sector_t capacity, int geom[]) +{ + int heads; + int sectors; + sector_t cylinders; + unsigned long tmp; + /* Default heads (64) & sectors (32) */ + heads = 64; + sectors = 32; + + tmp = heads * sectors; + cylinders = capacity; + + sector_div(cylinders, tmp); + + /* + * Handle extended translation size for logical drives > 1Gb + */ + + if (capacity >= 0x200000) { + heads = 255; + sectors = 63; + tmp = heads*sectors; + cylinders = capacity; + sector_div(cylinders, tmp); + } + + geom[0] = heads; + geom[1] = sectors; + geom[2] = cylinders; + + return 0; +} + +/** * megasas_service_aen - Processes an event notification * @instance: Adapter soft state * @cmd: AEN command completed by the ISR @@ -1054,6 +1098,7 @@ static struct scsi_host_template megasas_template = { .eh_device_reset_handler = megasas_reset_device, .eh_bus_reset_handler = megasas_reset_bus_host, .eh_host_reset_handler = megasas_reset_bus_host, + .bios_param = megasas_bios_param, .use_clustering = ENABLE_CLUSTERING, }; |