Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 35071
b: refs/heads/master
c: dfdc58b
h: refs/heads/master
i:
  35069: b4dd5f8
  35067: a1dfa14
  35063: 99c160d
  35055: 0fbfc8e
  35039: db61f26
  35007: dbb6ba9
  34943: 6abb836
  34815: ef8e8ab
v: v3
  • Loading branch information
James Bottomley authored and James Bottomley committed Sep 24, 2006
1 parent 954dcdc commit fd9a325
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 9 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: a07f353701acae77e023f6270e8af353b37af7c4
refs/heads/master: dfdc58ba354adb80d67c99f7be84f95a8e02e466
30 changes: 23 additions & 7 deletions trunk/drivers/scsi/scsi_transport_spi.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@

/* Private data accessors (keep these out of the header file) */
#define spi_dv_pending(x) (((struct spi_transport_attrs *)&(x)->starget_data)->dv_pending)
#define spi_dv_in_progress(x) (((struct spi_transport_attrs *)&(x)->starget_data)->dv_in_progress)
#define spi_dv_mutex(x) (((struct spi_transport_attrs *)&(x)->starget_data)->dv_mutex)

struct spi_internal {
Expand Down Expand Up @@ -240,6 +241,7 @@ static int spi_setup_transport_attrs(struct transport_container *tc,
spi_pcomp_en(starget) = 0;
spi_hold_mcs(starget) = 0;
spi_dv_pending(starget) = 0;
spi_dv_in_progress(starget) = 0;
spi_initial_dv(starget) = 0;
mutex_init(&spi_dv_mutex(starget));

Expand Down Expand Up @@ -830,28 +832,37 @@ spi_dv_device_internal(struct scsi_device *sdev, u8 *buffer)
DV_SET(period, spi_min_period(starget));
/* try QAS requests; this should be harmless to set if the
* target supports it */
if (scsi_device_qas(sdev))
if (scsi_device_qas(sdev)) {
DV_SET(qas, 1);
/* Also try IU transfers */
if (scsi_device_ius(sdev))
} else {
DV_SET(qas, 0);
}

if (scsi_device_ius(sdev) && spi_min_period(starget) < 9) {
/* This u320 (or u640). Set IU transfers */
DV_SET(iu, 1);
if (spi_min_period(starget) < 9) {
/* This u320 (or u640). Ignore the coupled parameters
* like DT and IU, but set the optional ones */
/* Then set the optional parameters */
DV_SET(rd_strm, 1);
DV_SET(wr_flow, 1);
DV_SET(rti, 1);
if (spi_min_period(starget) == 8)
DV_SET(pcomp_en, 1);
} else {
DV_SET(iu, 0);
}

/* now that we've done all this, actually check the bus
* signal type (if known). Some devices are stupid on
* a SE bus and still claim they can try LVD only settings */
if (i->f->get_signalling)
i->f->get_signalling(shost);
if (spi_signalling(shost) == SPI_SIGNAL_SE ||
spi_signalling(shost) == SPI_SIGNAL_HVD)
spi_signalling(shost) == SPI_SIGNAL_HVD ||
!scsi_device_dt(sdev)) {
DV_SET(dt, 0);
} else {
DV_SET(dt, 1);
}
/* Do the read only INQUIRY tests */
spi_dv_retrain(sdev, buffer, buffer + sdev->inquiry_len,
spi_dv_device_compare_inquiry);
Expand Down Expand Up @@ -907,6 +918,10 @@ spi_dv_device(struct scsi_device *sdev)
if (unlikely(scsi_device_get(sdev)))
return;

if (unlikely(spi_dv_in_progress(starget)))
return;
spi_dv_in_progress(starget) = 1;

buffer = kzalloc(len, GFP_KERNEL);

if (unlikely(!buffer))
Expand Down Expand Up @@ -938,6 +953,7 @@ spi_dv_device(struct scsi_device *sdev)
out_free:
kfree(buffer);
out_put:
spi_dv_in_progress(starget) = 0;
scsi_device_put(sdev);
}
EXPORT_SYMBOL(spi_dv_device);
Expand Down
3 changes: 2 additions & 1 deletion trunk/include/scsi/scsi_transport_spi.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,8 @@ struct spi_transport_attrs {
unsigned int support_ius; /* support Information Units */
unsigned int support_qas; /* supports quick arbitration and selection */
/* Private Fields */
unsigned int dv_pending:1; /* Internal flag */
unsigned int dv_pending:1; /* Internal flag: DV Requested */
unsigned int dv_in_progress:1; /* Internal: DV started */
struct mutex dv_mutex; /* semaphore to serialise dv */
};

Expand Down

0 comments on commit fd9a325

Please sign in to comment.