diff options
Diffstat (limited to 'drivers')
-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 6ff540140807..9c5e4da5a132 100644 --- a/drivers/scsi/megaraid/megaraid_sas.c +++ b/drivers/scsi/megaraid/megaraid_sas.c | |||
@@ -35,6 +35,7 @@ | |||
35 | #include <asm/uaccess.h> | 35 | #include <asm/uaccess.h> |
36 | #include <linux/fs.h> | 36 | #include <linux/fs.h> |
37 | #include <linux/compat.h> | 37 | #include <linux/compat.h> |
38 | #include <linux/blkdev.h> | ||
38 | #include <linux/mutex.h> | 39 | #include <linux/mutex.h> |
39 | 40 | ||
40 | #include <scsi/scsi.h> | 41 | #include <scsi/scsi.h> |
@@ -1015,6 +1016,49 @@ static int megasas_reset_bus_host(struct scsi_cmnd *scmd) | |||
1015 | } | 1016 | } |
1016 | 1017 | ||
1017 | /** | 1018 | /** |
1019 | * megasas_bios_param - Returns disk geometry for a disk | ||
1020 | * @sdev: device handle | ||
1021 | * @bdev: block device | ||
1022 | * @capacity: drive capacity | ||
1023 | * @geom: geometry parameters | ||
1024 | */ | ||
1025 | static int | ||
1026 | megasas_bios_param(struct scsi_device *sdev, struct block_device *bdev, | ||
1027 | sector_t capacity, int geom[]) | ||
1028 | { | ||
1029 | int heads; | ||
1030 | int sectors; | ||
1031 | sector_t cylinders; | ||
1032 | unsigned long tmp; | ||
1033 | /* Default heads (64) & sectors (32) */ | ||
1034 | heads = 64; | ||
1035 | sectors = 32; | ||
1036 | |||
1037 | tmp = heads * sectors; | ||
1038 | cylinders = capacity; | ||
1039 | |||
1040 | sector_div(cylinders, tmp); | ||
1041 | |||
1042 | /* | ||
1043 | * Handle extended translation size for logical drives > 1Gb | ||
1044 | */ | ||
1045 | |||
1046 | if (capacity >= 0x200000) { | ||
1047 | heads = 255; | ||
1048 | sectors = 63; | ||
1049 | tmp = heads*sectors; | ||
1050 | cylinders = capacity; | ||
1051 | sector_div(cylinders, tmp); | ||
1052 | } | ||
1053 | |||
1054 | geom[0] = heads; | ||
1055 | geom[1] = sectors; | ||
1056 | geom[2] = cylinders; | ||
1057 | |||
1058 | return 0; | ||
1059 | } | ||
1060 | |||
1061 | /** | ||
1018 | * megasas_service_aen - Processes an event notification | 1062 | * megasas_service_aen - Processes an event notification |
1019 | * @instance: Adapter soft state | 1063 | * @instance: Adapter soft state |
1020 | * @cmd: AEN command completed by the ISR | 1064 | * @cmd: AEN command completed by the ISR |
@@ -1054,6 +1098,7 @@ static struct scsi_host_template megasas_template = { | |||
1054 | .eh_device_reset_handler = megasas_reset_device, | 1098 | .eh_device_reset_handler = megasas_reset_device, |
1055 | .eh_bus_reset_handler = megasas_reset_bus_host, | 1099 | .eh_bus_reset_handler = megasas_reset_bus_host, |
1056 | .eh_host_reset_handler = megasas_reset_bus_host, | 1100 | .eh_host_reset_handler = megasas_reset_bus_host, |
1101 | .bios_param = megasas_bios_param, | ||
1057 | .use_clustering = ENABLE_CLUSTERING, | 1102 | .use_clustering = ENABLE_CLUSTERING, |
1058 | }; | 1103 | }; |
1059 | 1104 | ||