diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/acpi/Kconfig | 10 | ||||
| -rw-r--r-- | drivers/char/sx.c | 12 | ||||
| -rw-r--r-- | drivers/scsi/sd.c | 20 |
3 files changed, 29 insertions, 13 deletions
diff --git a/drivers/acpi/Kconfig b/drivers/acpi/Kconfig index 0cce28c4025b..33e2ca847a26 100644 --- a/drivers/acpi/Kconfig +++ b/drivers/acpi/Kconfig | |||
| @@ -247,7 +247,7 @@ config ACPI_CUSTOM_DSDT_FILE | |||
| 247 | Enter the full path name to the file wich includes the AmlCode declaration. | 247 | Enter the full path name to the file wich includes the AmlCode declaration. |
| 248 | 248 | ||
| 249 | config ACPI_BLACKLIST_YEAR | 249 | config ACPI_BLACKLIST_YEAR |
| 250 | int "Disable ACPI for systems before Jan 1st this year" if X86 | 250 | int "Disable ACPI for systems before Jan 1st this year" if X86_32 |
| 251 | default 0 | 251 | default 0 |
| 252 | help | 252 | help |
| 253 | enter a 4-digit year, eg. 2001 to disable ACPI by default | 253 | enter a 4-digit year, eg. 2001 to disable ACPI by default |
| @@ -285,9 +285,8 @@ config ACPI_SYSTEM | |||
| 285 | dump your ACPI DSDT table using /proc/acpi/dsdt. | 285 | dump your ACPI DSDT table using /proc/acpi/dsdt. |
| 286 | 286 | ||
| 287 | config X86_PM_TIMER | 287 | config X86_PM_TIMER |
| 288 | bool "Power Management Timer Support" | 288 | bool "Power Management Timer Support" if EMBEDDED |
| 289 | depends on X86 | 289 | depends on X86 |
| 290 | depends on !X86_64 | ||
| 291 | default y | 290 | default y |
| 292 | help | 291 | help |
| 293 | The Power Management Timer is available on all ACPI-capable, | 292 | The Power Management Timer is available on all ACPI-capable, |
| @@ -298,9 +297,8 @@ config X86_PM_TIMER | |||
| 298 | voltage scaling, unlike the commonly used Time Stamp Counter | 297 | voltage scaling, unlike the commonly used Time Stamp Counter |
| 299 | (TSC) timing source. | 298 | (TSC) timing source. |
| 300 | 299 | ||
| 301 | So, if you see messages like 'Losing too many ticks!' in the | 300 | You should nearly always say Y here because many modern |
| 302 | kernel logs, and/or you are using this on a notebook which | 301 | systems require this timer. |
| 303 | does not yet have an HPET, you should say "Y" here. | ||
| 304 | 302 | ||
| 305 | config ACPI_CONTAINER | 303 | config ACPI_CONTAINER |
| 306 | tristate "ACPI0004,PNP0A05 and PNP0A06 Container Driver (EXPERIMENTAL)" | 304 | tristate "ACPI0004,PNP0A05 and PNP0A06 Container Driver (EXPERIMENTAL)" |
diff --git a/drivers/char/sx.c b/drivers/char/sx.c index c2490e270f1f..588e75ec1630 100644 --- a/drivers/char/sx.c +++ b/drivers/char/sx.c | |||
| @@ -2173,15 +2173,17 @@ static int probe_si (struct sx_board *board) | |||
| 2173 | if ( IS_SI1_BOARD(board)) { | 2173 | if ( IS_SI1_BOARD(board)) { |
| 2174 | /* This should be an SI1 board, which has this | 2174 | /* This should be an SI1 board, which has this |
| 2175 | location writable... */ | 2175 | location writable... */ |
| 2176 | if (read_sx_byte (board, SI2_ISA_ID_BASE) != 0x10) | 2176 | if (read_sx_byte (board, SI2_ISA_ID_BASE) != 0x10) { |
| 2177 | func_exit (); | 2177 | func_exit (); |
| 2178 | return 0; | 2178 | return 0; |
| 2179 | } | ||
| 2179 | } else { | 2180 | } else { |
| 2180 | /* This should be an SI2 board, which has the bottom | 2181 | /* This should be an SI2 board, which has the bottom |
| 2181 | 3 bits non-writable... */ | 2182 | 3 bits non-writable... */ |
| 2182 | if (read_sx_byte (board, SI2_ISA_ID_BASE) == 0x10) | 2183 | if (read_sx_byte (board, SI2_ISA_ID_BASE) == 0x10) { |
| 2183 | func_exit (); | 2184 | func_exit (); |
| 2184 | return 0; | 2185 | return 0; |
| 2186 | } | ||
| 2185 | } | 2187 | } |
| 2186 | 2188 | ||
| 2187 | /* Now we're pretty much convinced that there is an SI board here, | 2189 | /* Now we're pretty much convinced that there is an SI board here, |
| @@ -2192,15 +2194,17 @@ static int probe_si (struct sx_board *board) | |||
| 2192 | if ( IS_SI1_BOARD(board)) { | 2194 | if ( IS_SI1_BOARD(board)) { |
| 2193 | /* This should be an SI1 board, which has this | 2195 | /* This should be an SI1 board, which has this |
| 2194 | location writable... */ | 2196 | location writable... */ |
| 2195 | if (read_sx_byte (board, SI2_ISA_ID_BASE) != 0x10) | 2197 | if (read_sx_byte (board, SI2_ISA_ID_BASE) != 0x10) { |
| 2196 | func_exit(); | 2198 | func_exit(); |
| 2197 | return 0; | 2199 | return 0; |
| 2200 | } | ||
| 2198 | } else { | 2201 | } else { |
| 2199 | /* This should be an SI2 board, which has the bottom | 2202 | /* This should be an SI2 board, which has the bottom |
| 2200 | 3 bits non-writable... */ | 2203 | 3 bits non-writable... */ |
| 2201 | if (read_sx_byte (board, SI2_ISA_ID_BASE) == 0x10) | 2204 | if (read_sx_byte (board, SI2_ISA_ID_BASE) == 0x10) { |
| 2202 | func_exit (); | 2205 | func_exit (); |
| 2203 | return 0; | 2206 | return 0; |
| 2207 | } | ||
| 2204 | } | 2208 | } |
| 2205 | 2209 | ||
| 2206 | printheader (); | 2210 | printheader (); |
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 930db398d107..9d9872347f56 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c | |||
| @@ -89,6 +89,11 @@ | |||
| 89 | #define SD_MAX_RETRIES 5 | 89 | #define SD_MAX_RETRIES 5 |
| 90 | #define SD_PASSTHROUGH_RETRIES 1 | 90 | #define SD_PASSTHROUGH_RETRIES 1 |
| 91 | 91 | ||
| 92 | /* | ||
| 93 | * Size of the initial data buffer for mode and read capacity data | ||
| 94 | */ | ||
| 95 | #define SD_BUF_SIZE 512 | ||
| 96 | |||
| 92 | static void scsi_disk_release(struct kref *kref); | 97 | static void scsi_disk_release(struct kref *kref); |
| 93 | 98 | ||
| 94 | struct scsi_disk { | 99 | struct scsi_disk { |
| @@ -1239,7 +1244,7 @@ sd_do_mode_sense(struct scsi_device *sdp, int dbd, int modepage, | |||
| 1239 | 1244 | ||
| 1240 | /* | 1245 | /* |
| 1241 | * read write protect setting, if possible - called only in sd_revalidate_disk() | 1246 | * read write protect setting, if possible - called only in sd_revalidate_disk() |
| 1242 | * called with buffer of length 512 | 1247 | * called with buffer of length SD_BUF_SIZE |
| 1243 | */ | 1248 | */ |
| 1244 | static void | 1249 | static void |
| 1245 | sd_read_write_protect_flag(struct scsi_disk *sdkp, char *diskname, | 1250 | sd_read_write_protect_flag(struct scsi_disk *sdkp, char *diskname, |
| @@ -1297,7 +1302,7 @@ sd_read_write_protect_flag(struct scsi_disk *sdkp, char *diskname, | |||
| 1297 | 1302 | ||
| 1298 | /* | 1303 | /* |
| 1299 | * sd_read_cache_type - called only from sd_revalidate_disk() | 1304 | * sd_read_cache_type - called only from sd_revalidate_disk() |
| 1300 | * called with buffer of length 512 | 1305 | * called with buffer of length SD_BUF_SIZE |
| 1301 | */ | 1306 | */ |
| 1302 | static void | 1307 | static void |
| 1303 | sd_read_cache_type(struct scsi_disk *sdkp, char *diskname, | 1308 | sd_read_cache_type(struct scsi_disk *sdkp, char *diskname, |
| @@ -1342,6 +1347,8 @@ sd_read_cache_type(struct scsi_disk *sdkp, char *diskname, | |||
| 1342 | 1347 | ||
| 1343 | /* Take headers and block descriptors into account */ | 1348 | /* Take headers and block descriptors into account */ |
| 1344 | len += data.header_length + data.block_descriptor_length; | 1349 | len += data.header_length + data.block_descriptor_length; |
| 1350 | if (len > SD_BUF_SIZE) | ||
| 1351 | goto bad_sense; | ||
| 1345 | 1352 | ||
| 1346 | /* Get the data */ | 1353 | /* Get the data */ |
| 1347 | res = sd_do_mode_sense(sdp, dbd, modepage, buffer, len, &data, &sshdr); | 1354 | res = sd_do_mode_sense(sdp, dbd, modepage, buffer, len, &data, &sshdr); |
| @@ -1354,6 +1361,12 @@ sd_read_cache_type(struct scsi_disk *sdkp, char *diskname, | |||
| 1354 | int ct = 0; | 1361 | int ct = 0; |
| 1355 | int offset = data.header_length + data.block_descriptor_length; | 1362 | int offset = data.header_length + data.block_descriptor_length; |
| 1356 | 1363 | ||
| 1364 | if (offset >= SD_BUF_SIZE - 2) { | ||
| 1365 | printk(KERN_ERR "%s: malformed MODE SENSE response", | ||
| 1366 | diskname); | ||
| 1367 | goto defaults; | ||
| 1368 | } | ||
| 1369 | |||
| 1357 | if ((buffer[offset] & 0x3f) != modepage) { | 1370 | if ((buffer[offset] & 0x3f) != modepage) { |
| 1358 | printk(KERN_ERR "%s: got wrong page\n", diskname); | 1371 | printk(KERN_ERR "%s: got wrong page\n", diskname); |
| 1359 | goto defaults; | 1372 | goto defaults; |
| @@ -1398,6 +1411,7 @@ defaults: | |||
| 1398 | diskname); | 1411 | diskname); |
| 1399 | sdkp->WCE = 0; | 1412 | sdkp->WCE = 0; |
| 1400 | sdkp->RCD = 0; | 1413 | sdkp->RCD = 0; |
| 1414 | sdkp->DPOFUA = 0; | ||
| 1401 | } | 1415 | } |
| 1402 | 1416 | ||
| 1403 | /** | 1417 | /** |
| @@ -1421,7 +1435,7 @@ static int sd_revalidate_disk(struct gendisk *disk) | |||
| 1421 | if (!scsi_device_online(sdp)) | 1435 | if (!scsi_device_online(sdp)) |
| 1422 | goto out; | 1436 | goto out; |
| 1423 | 1437 | ||
| 1424 | buffer = kmalloc(512, GFP_KERNEL | __GFP_DMA); | 1438 | buffer = kmalloc(SD_BUF_SIZE, GFP_KERNEL | __GFP_DMA); |
| 1425 | if (!buffer) { | 1439 | if (!buffer) { |
| 1426 | printk(KERN_WARNING "(sd_revalidate_disk:) Memory allocation " | 1440 | printk(KERN_WARNING "(sd_revalidate_disk:) Memory allocation " |
| 1427 | "failure.\n"); | 1441 | "failure.\n"); |
