mirror of
https://github.com/torvalds/linux.git
synced 2024-11-24 05:02:12 +00:00
Merge branch 'sbp2-spindown' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6
* 'sbp2-spindown' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6: ieee1394: sbp2: spin disks down on suspend and shutdown firewire: fw-sbp2: spin disks down on suspend and shutdown ieee1394: sbp2: fix spindown for PL-3507 and TSB42AA9 firmwares firewire: fw-sbp2: fix spindown for PL-3507 and TSB42AA9 firmwares scsi: sd: optionally set power condition in START STOP UNIT
This commit is contained in:
commit
22a37bcb78
@ -86,6 +86,11 @@ MODULE_PARM_DESC(exclusive_login, "Exclusive login to sbp2 device "
|
||||
* - delay inquiry
|
||||
* Wait extra SBP2_INQUIRY_DELAY seconds after login before SCSI inquiry.
|
||||
*
|
||||
* - power condition
|
||||
* Set the power condition field in the START STOP UNIT commands sent by
|
||||
* sd_mod on suspend, resume, and shutdown (if manage_start_stop is on).
|
||||
* Some disks need this to spin down or to resume properly.
|
||||
*
|
||||
* - override internal blacklist
|
||||
* Instead of adding to the built-in blacklist, use only the workarounds
|
||||
* specified in the module load parameter.
|
||||
@ -97,6 +102,7 @@ MODULE_PARM_DESC(exclusive_login, "Exclusive login to sbp2 device "
|
||||
#define SBP2_WORKAROUND_FIX_CAPACITY 0x8
|
||||
#define SBP2_WORKAROUND_DELAY_INQUIRY 0x10
|
||||
#define SBP2_INQUIRY_DELAY 12
|
||||
#define SBP2_WORKAROUND_POWER_CONDITION 0x20
|
||||
#define SBP2_WORKAROUND_OVERRIDE 0x100
|
||||
|
||||
static int sbp2_param_workarounds;
|
||||
@ -107,6 +113,8 @@ MODULE_PARM_DESC(workarounds, "Work around device bugs (default = 0"
|
||||
", skip mode page 8 = " __stringify(SBP2_WORKAROUND_MODE_SENSE_8)
|
||||
", fix capacity = " __stringify(SBP2_WORKAROUND_FIX_CAPACITY)
|
||||
", delay inquiry = " __stringify(SBP2_WORKAROUND_DELAY_INQUIRY)
|
||||
", set power condition in start stop unit = "
|
||||
__stringify(SBP2_WORKAROUND_POWER_CONDITION)
|
||||
", override internal blacklist = " __stringify(SBP2_WORKAROUND_OVERRIDE)
|
||||
", or a combination)");
|
||||
|
||||
@ -310,18 +318,25 @@ static const struct {
|
||||
.firmware_revision = 0x002800,
|
||||
.model = 0x001010,
|
||||
.workarounds = SBP2_WORKAROUND_INQUIRY_36 |
|
||||
SBP2_WORKAROUND_MODE_SENSE_8,
|
||||
SBP2_WORKAROUND_MODE_SENSE_8 |
|
||||
SBP2_WORKAROUND_POWER_CONDITION,
|
||||
},
|
||||
/* DViCO Momobay FX-3A with TSB42AA9A bridge */ {
|
||||
.firmware_revision = 0x002800,
|
||||
.model = 0x000000,
|
||||
.workarounds = SBP2_WORKAROUND_DELAY_INQUIRY,
|
||||
.workarounds = SBP2_WORKAROUND_DELAY_INQUIRY |
|
||||
SBP2_WORKAROUND_POWER_CONDITION,
|
||||
},
|
||||
/* Initio bridges, actually only needed for some older ones */ {
|
||||
.firmware_revision = 0x000200,
|
||||
.model = ~0,
|
||||
.workarounds = SBP2_WORKAROUND_INQUIRY_36,
|
||||
},
|
||||
/* PL-3507 bridge with Prolific firmware */ {
|
||||
.firmware_revision = 0x012800,
|
||||
.model = ~0,
|
||||
.workarounds = SBP2_WORKAROUND_POWER_CONDITION,
|
||||
},
|
||||
/* Symbios bridge */ {
|
||||
.firmware_revision = 0xa0b800,
|
||||
.model = ~0,
|
||||
@ -1530,6 +1545,9 @@ static int sbp2_scsi_slave_configure(struct scsi_device *sdev)
|
||||
|
||||
sdev->use_10_for_rw = 1;
|
||||
|
||||
if (sbp2_param_exclusive_login)
|
||||
sdev->manage_start_stop = 1;
|
||||
|
||||
if (sdev->type == TYPE_ROM)
|
||||
sdev->use_10_for_ms = 1;
|
||||
|
||||
@ -1540,6 +1558,9 @@ static int sbp2_scsi_slave_configure(struct scsi_device *sdev)
|
||||
if (lu->tgt->workarounds & SBP2_WORKAROUND_FIX_CAPACITY)
|
||||
sdev->fix_capacity = 1;
|
||||
|
||||
if (lu->tgt->workarounds & SBP2_WORKAROUND_POWER_CONDITION)
|
||||
sdev->start_stop_pwr_cond = 1;
|
||||
|
||||
if (lu->tgt->workarounds & SBP2_WORKAROUND_128K_MAX_TRANS)
|
||||
blk_queue_max_sectors(sdev->request_queue, 128 * 1024 / 512);
|
||||
|
||||
|
@ -186,6 +186,11 @@ MODULE_PARM_DESC(exclusive_login, "Exclusive login to sbp2 device "
|
||||
* - delay inquiry
|
||||
* Wait extra SBP2_INQUIRY_DELAY seconds after login before SCSI inquiry.
|
||||
*
|
||||
* - power condition
|
||||
* Set the power condition field in the START STOP UNIT commands sent by
|
||||
* sd_mod on suspend, resume, and shutdown (if manage_start_stop is on).
|
||||
* Some disks need this to spin down or to resume properly.
|
||||
*
|
||||
* - override internal blacklist
|
||||
* Instead of adding to the built-in blacklist, use only the workarounds
|
||||
* specified in the module load parameter.
|
||||
@ -199,6 +204,8 @@ MODULE_PARM_DESC(workarounds, "Work around device bugs (default = 0"
|
||||
", skip mode page 8 = " __stringify(SBP2_WORKAROUND_MODE_SENSE_8)
|
||||
", fix capacity = " __stringify(SBP2_WORKAROUND_FIX_CAPACITY)
|
||||
", delay inquiry = " __stringify(SBP2_WORKAROUND_DELAY_INQUIRY)
|
||||
", set power condition in start stop unit = "
|
||||
__stringify(SBP2_WORKAROUND_POWER_CONDITION)
|
||||
", override internal blacklist = " __stringify(SBP2_WORKAROUND_OVERRIDE)
|
||||
", or a combination)");
|
||||
|
||||
@ -359,18 +366,25 @@ static const struct {
|
||||
.firmware_revision = 0x002800,
|
||||
.model_id = 0x001010,
|
||||
.workarounds = SBP2_WORKAROUND_INQUIRY_36 |
|
||||
SBP2_WORKAROUND_MODE_SENSE_8,
|
||||
SBP2_WORKAROUND_MODE_SENSE_8 |
|
||||
SBP2_WORKAROUND_POWER_CONDITION,
|
||||
},
|
||||
/* DViCO Momobay FX-3A with TSB42AA9A bridge */ {
|
||||
.firmware_revision = 0x002800,
|
||||
.model_id = 0x000000,
|
||||
.workarounds = SBP2_WORKAROUND_DELAY_INQUIRY,
|
||||
.workarounds = SBP2_WORKAROUND_DELAY_INQUIRY |
|
||||
SBP2_WORKAROUND_POWER_CONDITION,
|
||||
},
|
||||
/* Initio bridges, actually only needed for some older ones */ {
|
||||
.firmware_revision = 0x000200,
|
||||
.model_id = SBP2_ROM_VALUE_WILDCARD,
|
||||
.workarounds = SBP2_WORKAROUND_INQUIRY_36,
|
||||
},
|
||||
/* PL-3507 bridge with Prolific firmware */ {
|
||||
.firmware_revision = 0x012800,
|
||||
.model_id = SBP2_ROM_VALUE_WILDCARD,
|
||||
.workarounds = SBP2_WORKAROUND_POWER_CONDITION,
|
||||
},
|
||||
/* Symbios bridge */ {
|
||||
.firmware_revision = 0xa0b800,
|
||||
.model_id = SBP2_ROM_VALUE_WILDCARD,
|
||||
@ -1995,6 +2009,8 @@ static int sbp2scsi_slave_configure(struct scsi_device *sdev)
|
||||
|
||||
sdev->use_10_for_rw = 1;
|
||||
|
||||
if (sbp2_exclusive_login)
|
||||
sdev->manage_start_stop = 1;
|
||||
if (sdev->type == TYPE_ROM)
|
||||
sdev->use_10_for_ms = 1;
|
||||
if (sdev->type == TYPE_DISK &&
|
||||
@ -2002,6 +2018,8 @@ static int sbp2scsi_slave_configure(struct scsi_device *sdev)
|
||||
sdev->skip_ms_page_8 = 1;
|
||||
if (lu->workarounds & SBP2_WORKAROUND_FIX_CAPACITY)
|
||||
sdev->fix_capacity = 1;
|
||||
if (lu->workarounds & SBP2_WORKAROUND_POWER_CONDITION)
|
||||
sdev->start_stop_pwr_cond = 1;
|
||||
if (lu->workarounds & SBP2_WORKAROUND_128K_MAX_TRANS)
|
||||
blk_queue_max_sectors(sdev->request_queue, 128 * 1024 / 512);
|
||||
return 0;
|
||||
|
@ -345,6 +345,7 @@ enum sbp2lu_state_types {
|
||||
#define SBP2_WORKAROUND_FIX_CAPACITY 0x8
|
||||
#define SBP2_WORKAROUND_DELAY_INQUIRY 0x10
|
||||
#define SBP2_INQUIRY_DELAY 12
|
||||
#define SBP2_WORKAROUND_POWER_CONDITION 0x20
|
||||
#define SBP2_WORKAROUND_OVERRIDE 0x100
|
||||
|
||||
#endif /* SBP2_H */
|
||||
|
@ -1124,6 +1124,8 @@ sd_spinup_disk(struct scsi_disk *sdkp)
|
||||
cmd[1] = 1; /* Return immediately */
|
||||
memset((void *) &cmd[2], 0, 8);
|
||||
cmd[4] = 1; /* Start spin cycle */
|
||||
if (sdkp->device->start_stop_pwr_cond)
|
||||
cmd[4] |= 1 << 4;
|
||||
scsi_execute_req(sdkp->device, cmd, DMA_NONE,
|
||||
NULL, 0, &sshdr,
|
||||
SD_TIMEOUT, SD_MAX_RETRIES);
|
||||
@ -1790,6 +1792,9 @@ static int sd_start_stop_device(struct scsi_disk *sdkp, int start)
|
||||
if (start)
|
||||
cmd[4] |= 1; /* START */
|
||||
|
||||
if (sdp->start_stop_pwr_cond)
|
||||
cmd[4] |= start ? 1 << 4 : 3 << 4; /* Active or Standby */
|
||||
|
||||
if (!scsi_device_online(sdp))
|
||||
return -ENODEV;
|
||||
|
||||
|
@ -134,6 +134,7 @@ struct scsi_device {
|
||||
unsigned no_start_on_add:1; /* do not issue start on add */
|
||||
unsigned allow_restart:1; /* issue START_UNIT in error handler */
|
||||
unsigned manage_start_stop:1; /* Let HLD (sd) manage start/stop */
|
||||
unsigned start_stop_pwr_cond:1; /* Set power cond. in START_STOP_UNIT */
|
||||
unsigned no_uld_attach:1; /* disable connecting to upper level drivers */
|
||||
unsigned select_no_atn:1;
|
||||
unsigned fix_capacity:1; /* READ_CAPACITY is too high by 1 */
|
||||
|
Loading…
Reference in New Issue
Block a user