|
@@ -122,6 +122,11 @@ static const char *const scsi_device_types[] = {
|
|
"Automation/Drive ",
|
|
"Automation/Drive ",
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * scsi_device_type - Return 17 char string indicating device type.
|
|
|
|
+ * @type: type number to look up
|
|
|
|
+ */
|
|
|
|
+
|
|
const char * scsi_device_type(unsigned type)
|
|
const char * scsi_device_type(unsigned type)
|
|
{
|
|
{
|
|
if (type == 0x1e)
|
|
if (type == 0x1e)
|
|
@@ -156,6 +161,14 @@ static struct scsi_host_cmd_pool scsi_cmd_dma_pool = {
|
|
|
|
|
|
static DEFINE_MUTEX(host_cmd_pool_mutex);
|
|
static DEFINE_MUTEX(host_cmd_pool_mutex);
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * __scsi_get_command - Allocate a struct scsi_cmnd
|
|
|
|
+ * @shost: host to transmit command
|
|
|
|
+ * @gfp_mask: allocation mask
|
|
|
|
+ *
|
|
|
|
+ * Description: allocate a struct scsi_cmd from host's slab, recycling from the
|
|
|
|
+ * host's free_list if necessary.
|
|
|
|
+ */
|
|
struct scsi_cmnd *__scsi_get_command(struct Scsi_Host *shost, gfp_t gfp_mask)
|
|
struct scsi_cmnd *__scsi_get_command(struct Scsi_Host *shost, gfp_t gfp_mask)
|
|
{
|
|
{
|
|
struct scsi_cmnd *cmd;
|
|
struct scsi_cmnd *cmd;
|
|
@@ -179,13 +192,10 @@ struct scsi_cmnd *__scsi_get_command(struct Scsi_Host *shost, gfp_t gfp_mask)
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(__scsi_get_command);
|
|
EXPORT_SYMBOL_GPL(__scsi_get_command);
|
|
|
|
|
|
-/*
|
|
|
|
- * Function: scsi_get_command()
|
|
|
|
- *
|
|
|
|
- * Purpose: Allocate and setup a scsi command block
|
|
|
|
- *
|
|
|
|
- * Arguments: dev - parent scsi device
|
|
|
|
- * gfp_mask- allocator flags
|
|
|
|
|
|
+/**
|
|
|
|
+ * scsi_get_command - Allocate and setup a scsi command block
|
|
|
|
+ * @dev: parent scsi device
|
|
|
|
+ * @gfp_mask: allocator flags
|
|
*
|
|
*
|
|
* Returns: The allocated scsi command structure.
|
|
* Returns: The allocated scsi command structure.
|
|
*/
|
|
*/
|
|
@@ -217,6 +227,12 @@ struct scsi_cmnd *scsi_get_command(struct scsi_device *dev, gfp_t gfp_mask)
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(scsi_get_command);
|
|
EXPORT_SYMBOL(scsi_get_command);
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * __scsi_put_command - Free a struct scsi_cmnd
|
|
|
|
+ * @shost: dev->host
|
|
|
|
+ * @cmd: Command to free
|
|
|
|
+ * @dev: parent scsi device
|
|
|
|
+ */
|
|
void __scsi_put_command(struct Scsi_Host *shost, struct scsi_cmnd *cmd,
|
|
void __scsi_put_command(struct Scsi_Host *shost, struct scsi_cmnd *cmd,
|
|
struct device *dev)
|
|
struct device *dev)
|
|
{
|
|
{
|
|
@@ -237,12 +253,9 @@ void __scsi_put_command(struct Scsi_Host *shost, struct scsi_cmnd *cmd,
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(__scsi_put_command);
|
|
EXPORT_SYMBOL(__scsi_put_command);
|
|
|
|
|
|
-/*
|
|
|
|
- * Function: scsi_put_command()
|
|
|
|
- *
|
|
|
|
- * Purpose: Free a scsi command block
|
|
|
|
- *
|
|
|
|
- * Arguments: cmd - command block to free
|
|
|
|
|
|
+/**
|
|
|
|
+ * scsi_put_command - Free a scsi command block
|
|
|
|
+ * @cmd: command block to free
|
|
*
|
|
*
|
|
* Returns: Nothing.
|
|
* Returns: Nothing.
|
|
*
|
|
*
|
|
@@ -263,12 +276,13 @@ void scsi_put_command(struct scsi_cmnd *cmd)
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(scsi_put_command);
|
|
EXPORT_SYMBOL(scsi_put_command);
|
|
|
|
|
|
-/*
|
|
|
|
- * Function: scsi_setup_command_freelist()
|
|
|
|
- *
|
|
|
|
- * Purpose: Setup the command freelist for a scsi host.
|
|
|
|
|
|
+/**
|
|
|
|
+ * scsi_setup_command_freelist - Setup the command freelist for a scsi host.
|
|
|
|
+ * @shost: host to allocate the freelist for.
|
|
*
|
|
*
|
|
- * Arguments: shost - host to allocate the freelist for.
|
|
|
|
|
|
+ * Description: The command freelist protects against system-wide out of memory
|
|
|
|
+ * deadlock by preallocating one SCSI command structure for each host, so the
|
|
|
|
+ * system can always write to a swap file on a device associated with that host.
|
|
*
|
|
*
|
|
* Returns: Nothing.
|
|
* Returns: Nothing.
|
|
*/
|
|
*/
|
|
@@ -282,7 +296,7 @@ int scsi_setup_command_freelist(struct Scsi_Host *shost)
|
|
|
|
|
|
/*
|
|
/*
|
|
* Select a command slab for this host and create it if not
|
|
* Select a command slab for this host and create it if not
|
|
- * yet existant.
|
|
|
|
|
|
+ * yet existent.
|
|
*/
|
|
*/
|
|
mutex_lock(&host_cmd_pool_mutex);
|
|
mutex_lock(&host_cmd_pool_mutex);
|
|
pool = (shost->unchecked_isa_dma ? &scsi_cmd_dma_pool : &scsi_cmd_pool);
|
|
pool = (shost->unchecked_isa_dma ? &scsi_cmd_dma_pool : &scsi_cmd_pool);
|
|
@@ -318,12 +332,9 @@ int scsi_setup_command_freelist(struct Scsi_Host *shost)
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
-/*
|
|
|
|
- * Function: scsi_destroy_command_freelist()
|
|
|
|
- *
|
|
|
|
- * Purpose: Release the command freelist for a scsi host.
|
|
|
|
- *
|
|
|
|
- * Arguments: shost - host that's freelist is going to be destroyed
|
|
|
|
|
|
+/**
|
|
|
|
+ * scsi_destroy_command_freelist - Release the command freelist for a scsi host.
|
|
|
|
+ * @shost: host whose freelist is going to be destroyed
|
|
*/
|
|
*/
|
|
void scsi_destroy_command_freelist(struct Scsi_Host *shost)
|
|
void scsi_destroy_command_freelist(struct Scsi_Host *shost)
|
|
{
|
|
{
|
|
@@ -441,8 +452,12 @@ void scsi_log_completion(struct scsi_cmnd *cmd, int disposition)
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
|
|
-/*
|
|
|
|
- * Assign a serial number to the request for error recovery
|
|
|
|
|
|
+/**
|
|
|
|
+ * scsi_cmd_get_serial - Assign a serial number to a command
|
|
|
|
+ * @host: the scsi host
|
|
|
|
+ * @cmd: command to assign serial number to
|
|
|
|
+ *
|
|
|
|
+ * Description: a serial number identifies a request for error recovery
|
|
* and debugging purposes. Protected by the Host_Lock of host.
|
|
* and debugging purposes. Protected by the Host_Lock of host.
|
|
*/
|
|
*/
|
|
static inline void scsi_cmd_get_serial(struct Scsi_Host *host, struct scsi_cmnd *cmd)
|
|
static inline void scsi_cmd_get_serial(struct Scsi_Host *host, struct scsi_cmnd *cmd)
|
|
@@ -452,14 +467,12 @@ static inline void scsi_cmd_get_serial(struct Scsi_Host *host, struct scsi_cmnd
|
|
cmd->serial_number = host->cmd_serial_number++;
|
|
cmd->serial_number = host->cmd_serial_number++;
|
|
}
|
|
}
|
|
|
|
|
|
-/*
|
|
|
|
- * Function: scsi_dispatch_command
|
|
|
|
- *
|
|
|
|
- * Purpose: Dispatch a command to the low-level driver.
|
|
|
|
- *
|
|
|
|
- * Arguments: cmd - command block we are dispatching.
|
|
|
|
|
|
+/**
|
|
|
|
+ * scsi_dispatch_command - Dispatch a command to the low-level driver.
|
|
|
|
+ * @cmd: command block we are dispatching.
|
|
*
|
|
*
|
|
- * Notes:
|
|
|
|
|
|
+ * Return: nonzero return request was rejected and device's queue needs to be
|
|
|
|
+ * plugged.
|
|
*/
|
|
*/
|
|
int scsi_dispatch_cmd(struct scsi_cmnd *cmd)
|
|
int scsi_dispatch_cmd(struct scsi_cmnd *cmd)
|
|
{
|
|
{
|
|
@@ -585,7 +598,7 @@ int scsi_dispatch_cmd(struct scsi_cmnd *cmd)
|
|
|
|
|
|
/**
|
|
/**
|
|
* scsi_req_abort_cmd -- Request command recovery for the specified command
|
|
* scsi_req_abort_cmd -- Request command recovery for the specified command
|
|
- * cmd: pointer to the SCSI command of interest
|
|
|
|
|
|
+ * @cmd: pointer to the SCSI command of interest
|
|
*
|
|
*
|
|
* This function requests that SCSI Core start recovery for the
|
|
* This function requests that SCSI Core start recovery for the
|
|
* command by deleting the timer and adding the command to the eh
|
|
* command by deleting the timer and adding the command to the eh
|
|
@@ -606,9 +619,9 @@ EXPORT_SYMBOL(scsi_req_abort_cmd);
|
|
* @cmd: The SCSI Command for which a low-level device driver (LLDD) gives
|
|
* @cmd: The SCSI Command for which a low-level device driver (LLDD) gives
|
|
* ownership back to SCSI Core -- i.e. the LLDD has finished with it.
|
|
* ownership back to SCSI Core -- i.e. the LLDD has finished with it.
|
|
*
|
|
*
|
|
- * This function is the mid-level's (SCSI Core) interrupt routine, which
|
|
|
|
- * regains ownership of the SCSI command (de facto) from a LLDD, and enqueues
|
|
|
|
- * the command to the done queue for further processing.
|
|
|
|
|
|
+ * Description: This function is the mid-level's (SCSI Core) interrupt routine,
|
|
|
|
+ * which regains ownership of the SCSI command (de facto) from a LLDD, and
|
|
|
|
+ * enqueues the command to the done queue for further processing.
|
|
*
|
|
*
|
|
* This is the producer of the done queue who enqueues at the tail.
|
|
* This is the producer of the done queue who enqueues at the tail.
|
|
*
|
|
*
|
|
@@ -617,7 +630,7 @@ EXPORT_SYMBOL(scsi_req_abort_cmd);
|
|
static void scsi_done(struct scsi_cmnd *cmd)
|
|
static void scsi_done(struct scsi_cmnd *cmd)
|
|
{
|
|
{
|
|
/*
|
|
/*
|
|
- * We don't have to worry about this one timing out any more.
|
|
|
|
|
|
+ * We don't have to worry about this one timing out anymore.
|
|
* If we are unable to remove the timer, then the command
|
|
* If we are unable to remove the timer, then the command
|
|
* has already timed out. In which case, we have no choice but to
|
|
* has already timed out. In which case, we have no choice but to
|
|
* let the timeout function run, as we have no idea where in fact
|
|
* let the timeout function run, as we have no idea where in fact
|
|
@@ -660,10 +673,11 @@ static struct scsi_driver *scsi_cmd_to_driver(struct scsi_cmnd *cmd)
|
|
return *(struct scsi_driver **)cmd->request->rq_disk->private_data;
|
|
return *(struct scsi_driver **)cmd->request->rq_disk->private_data;
|
|
}
|
|
}
|
|
|
|
|
|
-/*
|
|
|
|
- * Function: scsi_finish_command
|
|
|
|
|
|
+/**
|
|
|
|
+ * scsi_finish_command - cleanup and pass command back to upper layer
|
|
|
|
+ * @cmd: the command
|
|
*
|
|
*
|
|
- * Purpose: Pass command off to upper layer for finishing of I/O
|
|
|
|
|
|
+ * Description: Pass command off to upper layer for finishing of I/O
|
|
* request, waking processes that are waiting on results,
|
|
* request, waking processes that are waiting on results,
|
|
* etc.
|
|
* etc.
|
|
*/
|
|
*/
|
|
@@ -708,18 +722,14 @@ void scsi_finish_command(struct scsi_cmnd *cmd)
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(scsi_finish_command);
|
|
EXPORT_SYMBOL(scsi_finish_command);
|
|
|
|
|
|
-/*
|
|
|
|
- * Function: scsi_adjust_queue_depth()
|
|
|
|
- *
|
|
|
|
- * Purpose: Allow low level drivers to tell us to change the queue depth
|
|
|
|
- * on a specific SCSI device
|
|
|
|
- *
|
|
|
|
- * Arguments: sdev - SCSI Device in question
|
|
|
|
- * tagged - Do we use tagged queueing (non-0) or do we treat
|
|
|
|
- * this device as an untagged device (0)
|
|
|
|
- * tags - Number of tags allowed if tagged queueing enabled,
|
|
|
|
- * or number of commands the low level driver can
|
|
|
|
- * queue up in non-tagged mode (as per cmd_per_lun).
|
|
|
|
|
|
+/**
|
|
|
|
+ * scsi_adjust_queue_depth - Let low level drivers change a device's queue depth
|
|
|
|
+ * @sdev: SCSI Device in question
|
|
|
|
+ * @tagged: Do we use tagged queueing (non-0) or do we treat
|
|
|
|
+ * this device as an untagged device (0)
|
|
|
|
+ * @tags: Number of tags allowed if tagged queueing enabled,
|
|
|
|
+ * or number of commands the low level driver can
|
|
|
|
+ * queue up in non-tagged mode (as per cmd_per_lun).
|
|
*
|
|
*
|
|
* Returns: Nothing
|
|
* Returns: Nothing
|
|
*
|
|
*
|
|
@@ -742,8 +752,8 @@ void scsi_adjust_queue_depth(struct scsi_device *sdev, int tagged, int tags)
|
|
|
|
|
|
spin_lock_irqsave(sdev->request_queue->queue_lock, flags);
|
|
spin_lock_irqsave(sdev->request_queue->queue_lock, flags);
|
|
|
|
|
|
- /* Check to see if the queue is managed by the block layer
|
|
|
|
- * if it is, and we fail to adjust the depth, exit */
|
|
|
|
|
|
+ /* Check to see if the queue is managed by the block layer.
|
|
|
|
+ * If it is, and we fail to adjust the depth, exit. */
|
|
if (blk_queue_tagged(sdev->request_queue) &&
|
|
if (blk_queue_tagged(sdev->request_queue) &&
|
|
blk_queue_resize_tags(sdev->request_queue, tags) != 0)
|
|
blk_queue_resize_tags(sdev->request_queue, tags) != 0)
|
|
goto out;
|
|
goto out;
|
|
@@ -772,20 +782,17 @@ void scsi_adjust_queue_depth(struct scsi_device *sdev, int tagged, int tags)
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(scsi_adjust_queue_depth);
|
|
EXPORT_SYMBOL(scsi_adjust_queue_depth);
|
|
|
|
|
|
-/*
|
|
|
|
- * Function: scsi_track_queue_full()
|
|
|
|
|
|
+/**
|
|
|
|
+ * scsi_track_queue_full - track QUEUE_FULL events to adjust queue depth
|
|
|
|
+ * @sdev: SCSI Device in question
|
|
|
|
+ * @depth: Current number of outstanding SCSI commands on this device,
|
|
|
|
+ * not counting the one returned as QUEUE_FULL.
|
|
*
|
|
*
|
|
- * Purpose: This function will track successive QUEUE_FULL events on a
|
|
|
|
|
|
+ * Description: This function will track successive QUEUE_FULL events on a
|
|
* specific SCSI device to determine if and when there is a
|
|
* specific SCSI device to determine if and when there is a
|
|
* need to adjust the queue depth on the device.
|
|
* need to adjust the queue depth on the device.
|
|
*
|
|
*
|
|
- * Arguments: sdev - SCSI Device in question
|
|
|
|
- * depth - Current number of outstanding SCSI commands on
|
|
|
|
- * this device, not counting the one returned as
|
|
|
|
- * QUEUE_FULL.
|
|
|
|
- *
|
|
|
|
- * Returns: 0 - No change needed
|
|
|
|
- * >0 - Adjust queue depth to this new depth
|
|
|
|
|
|
+ * Returns: 0 - No change needed, >0 - Adjust queue depth to this new depth,
|
|
* -1 - Drop back to untagged operation using host->cmd_per_lun
|
|
* -1 - Drop back to untagged operation using host->cmd_per_lun
|
|
* as the untagged command depth
|
|
* as the untagged command depth
|
|
*
|
|
*
|
|
@@ -824,10 +831,10 @@ int scsi_track_queue_full(struct scsi_device *sdev, int depth)
|
|
EXPORT_SYMBOL(scsi_track_queue_full);
|
|
EXPORT_SYMBOL(scsi_track_queue_full);
|
|
|
|
|
|
/**
|
|
/**
|
|
- * scsi_device_get - get an addition reference to a scsi_device
|
|
|
|
|
|
+ * scsi_device_get - get an additional reference to a scsi_device
|
|
* @sdev: device to get a reference to
|
|
* @sdev: device to get a reference to
|
|
*
|
|
*
|
|
- * Gets a reference to the scsi_device and increments the use count
|
|
|
|
|
|
+ * Description: Gets a reference to the scsi_device and increments the use count
|
|
* of the underlying LLDD module. You must hold host_lock of the
|
|
* of the underlying LLDD module. You must hold host_lock of the
|
|
* parent Scsi_Host or already have a reference when calling this.
|
|
* parent Scsi_Host or already have a reference when calling this.
|
|
*/
|
|
*/
|
|
@@ -849,8 +856,8 @@ EXPORT_SYMBOL(scsi_device_get);
|
|
* scsi_device_put - release a reference to a scsi_device
|
|
* scsi_device_put - release a reference to a scsi_device
|
|
* @sdev: device to release a reference on.
|
|
* @sdev: device to release a reference on.
|
|
*
|
|
*
|
|
- * Release a reference to the scsi_device and decrements the use count
|
|
|
|
- * of the underlying LLDD module. The device is freed once the last
|
|
|
|
|
|
+ * Description: Release a reference to the scsi_device and decrements the use
|
|
|
|
+ * count of the underlying LLDD module. The device is freed once the last
|
|
* user vanishes.
|
|
* user vanishes.
|
|
*/
|
|
*/
|
|
void scsi_device_put(struct scsi_device *sdev)
|
|
void scsi_device_put(struct scsi_device *sdev)
|
|
@@ -867,7 +874,7 @@ void scsi_device_put(struct scsi_device *sdev)
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(scsi_device_put);
|
|
EXPORT_SYMBOL(scsi_device_put);
|
|
|
|
|
|
-/* helper for shost_for_each_device, thus not documented */
|
|
|
|
|
|
+/* helper for shost_for_each_device, see that for documentation */
|
|
struct scsi_device *__scsi_iterate_devices(struct Scsi_Host *shost,
|
|
struct scsi_device *__scsi_iterate_devices(struct Scsi_Host *shost,
|
|
struct scsi_device *prev)
|
|
struct scsi_device *prev)
|
|
{
|
|
{
|
|
@@ -895,6 +902,8 @@ EXPORT_SYMBOL(__scsi_iterate_devices);
|
|
/**
|
|
/**
|
|
* starget_for_each_device - helper to walk all devices of a target
|
|
* starget_for_each_device - helper to walk all devices of a target
|
|
* @starget: target whose devices we want to iterate over.
|
|
* @starget: target whose devices we want to iterate over.
|
|
|
|
+ * @data: Opaque passed to each function call.
|
|
|
|
+ * @fn: Function to call on each device
|
|
*
|
|
*
|
|
* This traverses over each device of @starget. The devices have
|
|
* This traverses over each device of @starget. The devices have
|
|
* a reference that must be released by scsi_host_put when breaking
|
|
* a reference that must be released by scsi_host_put when breaking
|
|
@@ -946,13 +955,13 @@ EXPORT_SYMBOL(__starget_for_each_device);
|
|
* @starget: SCSI target pointer
|
|
* @starget: SCSI target pointer
|
|
* @lun: SCSI Logical Unit Number
|
|
* @lun: SCSI Logical Unit Number
|
|
*
|
|
*
|
|
- * Looks up the scsi_device with the specified @lun for a give
|
|
|
|
- * @starget. The returned scsi_device does not have an additional
|
|
|
|
|
|
+ * Description: Looks up the scsi_device with the specified @lun for a given
|
|
|
|
+ * @starget. The returned scsi_device does not have an additional
|
|
* reference. You must hold the host's host_lock over this call and
|
|
* reference. You must hold the host's host_lock over this call and
|
|
* any access to the returned scsi_device.
|
|
* any access to the returned scsi_device.
|
|
*
|
|
*
|
|
* Note: The only reason why drivers would want to use this is because
|
|
* Note: The only reason why drivers would want to use this is because
|
|
- * they're need to access the device list in irq context. Otherwise you
|
|
|
|
|
|
+ * they need to access the device list in irq context. Otherwise you
|
|
* really want to use scsi_device_lookup_by_target instead.
|
|
* really want to use scsi_device_lookup_by_target instead.
|
|
**/
|
|
**/
|
|
struct scsi_device *__scsi_device_lookup_by_target(struct scsi_target *starget,
|
|
struct scsi_device *__scsi_device_lookup_by_target(struct scsi_target *starget,
|
|
@@ -974,9 +983,9 @@ EXPORT_SYMBOL(__scsi_device_lookup_by_target);
|
|
* @starget: SCSI target pointer
|
|
* @starget: SCSI target pointer
|
|
* @lun: SCSI Logical Unit Number
|
|
* @lun: SCSI Logical Unit Number
|
|
*
|
|
*
|
|
- * Looks up the scsi_device with the specified @channel, @id, @lun for a
|
|
|
|
- * give host. The returned scsi_device has an additional reference that
|
|
|
|
- * needs to be release with scsi_host_put once you're done with it.
|
|
|
|
|
|
+ * Description: Looks up the scsi_device with the specified @channel, @id, @lun
|
|
|
|
+ * for a given host. The returned scsi_device has an additional reference that
|
|
|
|
+ * needs to be released with scsi_device_put once you're done with it.
|
|
**/
|
|
**/
|
|
struct scsi_device *scsi_device_lookup_by_target(struct scsi_target *starget,
|
|
struct scsi_device *scsi_device_lookup_by_target(struct scsi_target *starget,
|
|
uint lun)
|
|
uint lun)
|
|
@@ -996,19 +1005,19 @@ struct scsi_device *scsi_device_lookup_by_target(struct scsi_target *starget,
|
|
EXPORT_SYMBOL(scsi_device_lookup_by_target);
|
|
EXPORT_SYMBOL(scsi_device_lookup_by_target);
|
|
|
|
|
|
/**
|
|
/**
|
|
- * scsi_device_lookup - find a device given the host (UNLOCKED)
|
|
|
|
|
|
+ * __scsi_device_lookup - find a device given the host (UNLOCKED)
|
|
* @shost: SCSI host pointer
|
|
* @shost: SCSI host pointer
|
|
* @channel: SCSI channel (zero if only one channel)
|
|
* @channel: SCSI channel (zero if only one channel)
|
|
- * @pun: SCSI target number (physical unit number)
|
|
|
|
|
|
+ * @id: SCSI target number (physical unit number)
|
|
* @lun: SCSI Logical Unit Number
|
|
* @lun: SCSI Logical Unit Number
|
|
*
|
|
*
|
|
- * Looks up the scsi_device with the specified @channel, @id, @lun for a
|
|
|
|
- * give host. The returned scsi_device does not have an additional reference.
|
|
|
|
- * You must hold the host's host_lock over this call and any access to the
|
|
|
|
- * returned scsi_device.
|
|
|
|
|
|
+ * Description: Looks up the scsi_device with the specified @channel, @id, @lun
|
|
|
|
+ * for a given host. The returned scsi_device does not have an additional
|
|
|
|
+ * reference. You must hold the host's host_lock over this call and any access
|
|
|
|
+ * to the returned scsi_device.
|
|
*
|
|
*
|
|
* Note: The only reason why drivers would want to use this is because
|
|
* Note: The only reason why drivers would want to use this is because
|
|
- * they're need to access the device list in irq context. Otherwise you
|
|
|
|
|
|
+ * they need to access the device list in irq context. Otherwise you
|
|
* really want to use scsi_device_lookup instead.
|
|
* really want to use scsi_device_lookup instead.
|
|
**/
|
|
**/
|
|
struct scsi_device *__scsi_device_lookup(struct Scsi_Host *shost,
|
|
struct scsi_device *__scsi_device_lookup(struct Scsi_Host *shost,
|
|
@@ -1033,9 +1042,9 @@ EXPORT_SYMBOL(__scsi_device_lookup);
|
|
* @id: SCSI target number (physical unit number)
|
|
* @id: SCSI target number (physical unit number)
|
|
* @lun: SCSI Logical Unit Number
|
|
* @lun: SCSI Logical Unit Number
|
|
*
|
|
*
|
|
- * Looks up the scsi_device with the specified @channel, @id, @lun for a
|
|
|
|
- * give host. The returned scsi_device has an additional reference that
|
|
|
|
- * needs to be release with scsi_host_put once you're done with it.
|
|
|
|
|
|
+ * Description: Looks up the scsi_device with the specified @channel, @id, @lun
|
|
|
|
+ * for a given host. The returned scsi_device has an additional reference that
|
|
|
|
+ * needs to be released with scsi_device_put once you're done with it.
|
|
**/
|
|
**/
|
|
struct scsi_device *scsi_device_lookup(struct Scsi_Host *shost,
|
|
struct scsi_device *scsi_device_lookup(struct Scsi_Host *shost,
|
|
uint channel, uint id, uint lun)
|
|
uint channel, uint id, uint lun)
|