Commit efc2da92 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi

Pull SCSI fixes from James Bottomley:
 "Seven fixes, all in drivers.

  The hpsa three are the most extensive and the most problematic: it's a
  packed structure misalignment that oopses on ia64 but looks like it
  would also oops on quite a few non-x86 architectures.

  The pm80xx is a regression and the rest are bug fixes for patches in
  the misc tree"

* tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi:
  scsi: scsi_transport_srp: Don't block target in SRP_PORT_LOST state
  scsi: target: iscsi: Fix zero tag inside a trace event
  scsi: pm80xx: Fix chip initialization failure
  scsi: ufs: core: Fix wrong Task Tag used in task management request UPIUs
  scsi: ufs: core: Fix task management request completion timeout
  scsi: hpsa: Add an assert to prevent __packed reintroduction
  scsi: hpsa: Fix boot on ia64 (atomic_t alignment)
  scsi: hpsa: Use __packed on individual structs, not header-wide
parents 95c7b075 5cd0f6f5
...@@ -20,6 +20,11 @@ ...@@ -20,6 +20,11 @@
#ifndef HPSA_CMD_H #ifndef HPSA_CMD_H
#define HPSA_CMD_H #define HPSA_CMD_H
#include <linux/compiler.h>
#include <linux/build_bug.h> /* static_assert */
#include <linux/stddef.h> /* offsetof */
/* general boundary defintions */ /* general boundary defintions */
#define SENSEINFOBYTES 32 /* may vary between hbas */ #define SENSEINFOBYTES 32 /* may vary between hbas */
#define SG_ENTRIES_IN_CMD 32 /* Max SG entries excluding chain blocks */ #define SG_ENTRIES_IN_CMD 32 /* Max SG entries excluding chain blocks */
...@@ -200,12 +205,10 @@ union u64bit { ...@@ -200,12 +205,10 @@ union u64bit {
MAX_EXT_TARGETS + 1) /* + 1 is for the controller itself */ MAX_EXT_TARGETS + 1) /* + 1 is for the controller itself */
/* SCSI-3 Commands */ /* SCSI-3 Commands */
#pragma pack(1)
#define HPSA_INQUIRY 0x12 #define HPSA_INQUIRY 0x12
struct InquiryData { struct InquiryData {
u8 data_byte[36]; u8 data_byte[36];
}; } __packed;
#define HPSA_REPORT_LOG 0xc2 /* Report Logical LUNs */ #define HPSA_REPORT_LOG 0xc2 /* Report Logical LUNs */
#define HPSA_REPORT_PHYS 0xc3 /* Report Physical LUNs */ #define HPSA_REPORT_PHYS 0xc3 /* Report Physical LUNs */
...@@ -221,7 +224,7 @@ struct raid_map_disk_data { ...@@ -221,7 +224,7 @@ struct raid_map_disk_data {
u8 xor_mult[2]; /**< XOR multipliers for this position, u8 xor_mult[2]; /**< XOR multipliers for this position,
* valid for data disks only */ * valid for data disks only */
u8 reserved[2]; u8 reserved[2];
}; } __packed;
struct raid_map_data { struct raid_map_data {
__le32 structure_size; /* Size of entire structure in bytes */ __le32 structure_size; /* Size of entire structure in bytes */
...@@ -247,14 +250,14 @@ struct raid_map_data { ...@@ -247,14 +250,14 @@ struct raid_map_data {
__le16 dekindex; /* Data encryption key index. */ __le16 dekindex; /* Data encryption key index. */
u8 reserved[16]; u8 reserved[16];
struct raid_map_disk_data data[RAID_MAP_MAX_ENTRIES]; struct raid_map_disk_data data[RAID_MAP_MAX_ENTRIES];
}; } __packed;
struct ReportLUNdata { struct ReportLUNdata {
u8 LUNListLength[4]; u8 LUNListLength[4];
u8 extended_response_flag; u8 extended_response_flag;
u8 reserved[3]; u8 reserved[3];
u8 LUN[HPSA_MAX_LUN][8]; u8 LUN[HPSA_MAX_LUN][8];
}; } __packed;
struct ext_report_lun_entry { struct ext_report_lun_entry {
u8 lunid[8]; u8 lunid[8];
...@@ -269,20 +272,20 @@ struct ext_report_lun_entry { ...@@ -269,20 +272,20 @@ struct ext_report_lun_entry {
u8 lun_count; /* multi-lun device, how many luns */ u8 lun_count; /* multi-lun device, how many luns */
u8 redundant_paths; u8 redundant_paths;
u32 ioaccel_handle; /* ioaccel1 only uses lower 16 bits */ u32 ioaccel_handle; /* ioaccel1 only uses lower 16 bits */
}; } __packed;
struct ReportExtendedLUNdata { struct ReportExtendedLUNdata {
u8 LUNListLength[4]; u8 LUNListLength[4];
u8 extended_response_flag; u8 extended_response_flag;
u8 reserved[3]; u8 reserved[3];
struct ext_report_lun_entry LUN[HPSA_MAX_PHYS_LUN]; struct ext_report_lun_entry LUN[HPSA_MAX_PHYS_LUN];
}; } __packed;
struct SenseSubsystem_info { struct SenseSubsystem_info {
u8 reserved[36]; u8 reserved[36];
u8 portname[8]; u8 portname[8];
u8 reserved1[1108]; u8 reserved1[1108];
}; } __packed;
/* BMIC commands */ /* BMIC commands */
#define BMIC_READ 0x26 #define BMIC_READ 0x26
...@@ -317,7 +320,7 @@ union SCSI3Addr { ...@@ -317,7 +320,7 @@ union SCSI3Addr {
u8 Targ:6; u8 Targ:6;
u8 Mode:2; /* b10 */ u8 Mode:2; /* b10 */
} LogUnit; } LogUnit;
}; } __packed;
struct PhysDevAddr { struct PhysDevAddr {
u32 TargetId:24; u32 TargetId:24;
...@@ -325,20 +328,20 @@ struct PhysDevAddr { ...@@ -325,20 +328,20 @@ struct PhysDevAddr {
u32 Mode:2; u32 Mode:2;
/* 2 level target device addr */ /* 2 level target device addr */
union SCSI3Addr Target[2]; union SCSI3Addr Target[2];
}; } __packed;
struct LogDevAddr { struct LogDevAddr {
u32 VolId:30; u32 VolId:30;
u32 Mode:2; u32 Mode:2;
u8 reserved[4]; u8 reserved[4];
}; } __packed;
union LUNAddr { union LUNAddr {
u8 LunAddrBytes[8]; u8 LunAddrBytes[8];
union SCSI3Addr SCSI3Lun[4]; union SCSI3Addr SCSI3Lun[4];
struct PhysDevAddr PhysDev; struct PhysDevAddr PhysDev;
struct LogDevAddr LogDev; struct LogDevAddr LogDev;
}; } __packed;
struct CommandListHeader { struct CommandListHeader {
u8 ReplyQueue; u8 ReplyQueue;
...@@ -346,7 +349,7 @@ struct CommandListHeader { ...@@ -346,7 +349,7 @@ struct CommandListHeader {
__le16 SGTotal; __le16 SGTotal;
__le64 tag; __le64 tag;
union LUNAddr LUN; union LUNAddr LUN;
}; } __packed;
struct RequestBlock { struct RequestBlock {
u8 CDBLen; u8 CDBLen;
...@@ -365,18 +368,18 @@ struct RequestBlock { ...@@ -365,18 +368,18 @@ struct RequestBlock {
#define GET_DIR(tad) (((tad) >> 6) & 0x03) #define GET_DIR(tad) (((tad) >> 6) & 0x03)
u16 Timeout; u16 Timeout;
u8 CDB[16]; u8 CDB[16];
}; } __packed;
struct ErrDescriptor { struct ErrDescriptor {
__le64 Addr; __le64 Addr;
__le32 Len; __le32 Len;
}; } __packed;
struct SGDescriptor { struct SGDescriptor {
__le64 Addr; __le64 Addr;
__le32 Len; __le32 Len;
__le32 Ext; __le32 Ext;
}; } __packed;
union MoreErrInfo { union MoreErrInfo {
struct { struct {
...@@ -390,7 +393,8 @@ union MoreErrInfo { ...@@ -390,7 +393,8 @@ union MoreErrInfo {
u8 offense_num; /* byte # of offense 0-base */ u8 offense_num; /* byte # of offense 0-base */
u32 offense_value; u32 offense_value;
} Invalid_Cmd; } Invalid_Cmd;
}; } __packed;
struct ErrorInfo { struct ErrorInfo {
u8 ScsiStatus; u8 ScsiStatus;
u8 SenseLen; u8 SenseLen;
...@@ -398,7 +402,7 @@ struct ErrorInfo { ...@@ -398,7 +402,7 @@ struct ErrorInfo {
u32 ResidualCnt; u32 ResidualCnt;
union MoreErrInfo MoreErrInfo; union MoreErrInfo MoreErrInfo;
u8 SenseInfo[SENSEINFOBYTES]; u8 SenseInfo[SENSEINFOBYTES];
}; } __packed;
/* Command types */ /* Command types */
#define CMD_IOCTL_PEND 0x01 #define CMD_IOCTL_PEND 0x01
#define CMD_SCSI 0x03 #define CMD_SCSI 0x03
...@@ -453,6 +457,15 @@ struct CommandList { ...@@ -453,6 +457,15 @@ struct CommandList {
atomic_t refcount; /* Must be last to avoid memset in hpsa_cmd_init() */ atomic_t refcount; /* Must be last to avoid memset in hpsa_cmd_init() */
} __aligned(COMMANDLIST_ALIGNMENT); } __aligned(COMMANDLIST_ALIGNMENT);
/*
* Make sure our embedded atomic variable is aligned. Otherwise we break atomic
* operations on architectures that don't support unaligned atomics like IA64.
*
* The assert guards against reintroductin against unwanted __packed to
* the struct CommandList.
*/
static_assert(offsetof(struct CommandList, refcount) % __alignof__(atomic_t) == 0);
/* Max S/G elements in I/O accelerator command */ /* Max S/G elements in I/O accelerator command */
#define IOACCEL1_MAXSGENTRIES 24 #define IOACCEL1_MAXSGENTRIES 24
#define IOACCEL2_MAXSGENTRIES 28 #define IOACCEL2_MAXSGENTRIES 28
...@@ -489,7 +502,7 @@ struct io_accel1_cmd { ...@@ -489,7 +502,7 @@ struct io_accel1_cmd {
__le64 host_addr; /* 0x70 - 0x77 */ __le64 host_addr; /* 0x70 - 0x77 */
u8 CISS_LUN[8]; /* 0x78 - 0x7F */ u8 CISS_LUN[8]; /* 0x78 - 0x7F */
struct SGDescriptor SG[IOACCEL1_MAXSGENTRIES]; struct SGDescriptor SG[IOACCEL1_MAXSGENTRIES];
} __aligned(IOACCEL1_COMMANDLIST_ALIGNMENT); } __packed __aligned(IOACCEL1_COMMANDLIST_ALIGNMENT);
#define IOACCEL1_FUNCTION_SCSIIO 0x00 #define IOACCEL1_FUNCTION_SCSIIO 0x00
#define IOACCEL1_SGLOFFSET 32 #define IOACCEL1_SGLOFFSET 32
...@@ -519,7 +532,7 @@ struct ioaccel2_sg_element { ...@@ -519,7 +532,7 @@ struct ioaccel2_sg_element {
u8 chain_indicator; u8 chain_indicator;
#define IOACCEL2_CHAIN 0x80 #define IOACCEL2_CHAIN 0x80
#define IOACCEL2_LAST_SG 0x40 #define IOACCEL2_LAST_SG 0x40
}; } __packed;
/* /*
* SCSI Response Format structure for IO Accelerator Mode 2 * SCSI Response Format structure for IO Accelerator Mode 2
...@@ -559,7 +572,7 @@ struct io_accel2_scsi_response { ...@@ -559,7 +572,7 @@ struct io_accel2_scsi_response {
u8 sense_data_len; /* sense/response data length */ u8 sense_data_len; /* sense/response data length */
u8 resid_cnt[4]; /* residual count */ u8 resid_cnt[4]; /* residual count */
u8 sense_data_buff[32]; /* sense/response data buffer */ u8 sense_data_buff[32]; /* sense/response data buffer */
}; } __packed;
/* /*
* Structure for I/O accelerator (mode 2 or m2) commands. * Structure for I/O accelerator (mode 2 or m2) commands.
...@@ -592,7 +605,7 @@ struct io_accel2_cmd { ...@@ -592,7 +605,7 @@ struct io_accel2_cmd {
__le32 tweak_upper; /* Encryption tweak, upper 4 bytes */ __le32 tweak_upper; /* Encryption tweak, upper 4 bytes */
struct ioaccel2_sg_element sg[IOACCEL2_MAXSGENTRIES]; struct ioaccel2_sg_element sg[IOACCEL2_MAXSGENTRIES];
struct io_accel2_scsi_response error_data; struct io_accel2_scsi_response error_data;
} __aligned(IOACCEL2_COMMANDLIST_ALIGNMENT); } __packed __aligned(IOACCEL2_COMMANDLIST_ALIGNMENT);
/* /*
* defines for Mode 2 command struct * defines for Mode 2 command struct
...@@ -618,7 +631,7 @@ struct hpsa_tmf_struct { ...@@ -618,7 +631,7 @@ struct hpsa_tmf_struct {
__le64 abort_tag; /* cciss tag of SCSI cmd or TMF to abort */ __le64 abort_tag; /* cciss tag of SCSI cmd or TMF to abort */
__le64 error_ptr; /* Error Pointer */ __le64 error_ptr; /* Error Pointer */
__le32 error_len; /* Error Length */ __le32 error_len; /* Error Length */
} __aligned(IOACCEL2_COMMANDLIST_ALIGNMENT); } __packed __aligned(IOACCEL2_COMMANDLIST_ALIGNMENT);
/* Configuration Table Structure */ /* Configuration Table Structure */
struct HostWrite { struct HostWrite {
...@@ -626,7 +639,7 @@ struct HostWrite { ...@@ -626,7 +639,7 @@ struct HostWrite {
__le32 command_pool_addr_hi; __le32 command_pool_addr_hi;
__le32 CoalIntDelay; __le32 CoalIntDelay;
__le32 CoalIntCount; __le32 CoalIntCount;
}; } __packed;
#define SIMPLE_MODE 0x02 #define SIMPLE_MODE 0x02
#define PERFORMANT_MODE 0x04 #define PERFORMANT_MODE 0x04
...@@ -675,7 +688,7 @@ struct CfgTable { ...@@ -675,7 +688,7 @@ struct CfgTable {
#define HPSA_EVENT_NOTIFY_ACCEL_IO_PATH_STATE_CHANGE (1 << 30) #define HPSA_EVENT_NOTIFY_ACCEL_IO_PATH_STATE_CHANGE (1 << 30)
#define HPSA_EVENT_NOTIFY_ACCEL_IO_PATH_CONFIG_CHANGE (1 << 31) #define HPSA_EVENT_NOTIFY_ACCEL_IO_PATH_CONFIG_CHANGE (1 << 31)
__le32 clear_event_notify; __le32 clear_event_notify;
}; } __packed;
#define NUM_BLOCKFETCH_ENTRIES 8 #define NUM_BLOCKFETCH_ENTRIES 8
struct TransTable_struct { struct TransTable_struct {
...@@ -686,14 +699,14 @@ struct TransTable_struct { ...@@ -686,14 +699,14 @@ struct TransTable_struct {
__le32 RepQCtrAddrHigh32; __le32 RepQCtrAddrHigh32;
#define MAX_REPLY_QUEUES 64 #define MAX_REPLY_QUEUES 64
struct vals32 RepQAddr[MAX_REPLY_QUEUES]; struct vals32 RepQAddr[MAX_REPLY_QUEUES];
}; } __packed;
struct hpsa_pci_info { struct hpsa_pci_info {
unsigned char bus; unsigned char bus;
unsigned char dev_fn; unsigned char dev_fn;
unsigned short domain; unsigned short domain;
u32 board_id; u32 board_id;
}; } __packed;
struct bmic_identify_controller { struct bmic_identify_controller {
u8 configured_logical_drive_count; /* offset 0 */ u8 configured_logical_drive_count; /* offset 0 */
...@@ -702,7 +715,7 @@ struct bmic_identify_controller { ...@@ -702,7 +715,7 @@ struct bmic_identify_controller {
u8 pad2[136]; u8 pad2[136];
u8 controller_mode; /* offset 292 */ u8 controller_mode; /* offset 292 */
u8 pad3[32]; u8 pad3[32];
}; } __packed;
struct bmic_identify_physical_device { struct bmic_identify_physical_device {
...@@ -845,7 +858,7 @@ struct bmic_identify_physical_device { ...@@ -845,7 +858,7 @@ struct bmic_identify_physical_device {
u8 max_link_rate[256]; u8 max_link_rate[256];
u8 neg_phys_link_rate[256]; u8 neg_phys_link_rate[256];
u8 box_conn_name[8]; u8 box_conn_name[8];
} __attribute((aligned(512))); } __packed __attribute((aligned(512)));
struct bmic_sense_subsystem_info { struct bmic_sense_subsystem_info {
u8 primary_slot_number; u8 primary_slot_number;
...@@ -858,7 +871,7 @@ struct bmic_sense_subsystem_info { ...@@ -858,7 +871,7 @@ struct bmic_sense_subsystem_info {
u8 secondary_array_serial_number[32]; u8 secondary_array_serial_number[32];
u8 secondary_cache_serial_number[32]; u8 secondary_cache_serial_number[32];
u8 pad[332]; u8 pad[332];
}; } __packed;
struct bmic_sense_storage_box_params { struct bmic_sense_storage_box_params {
u8 reserved[36]; u8 reserved[36];
...@@ -870,7 +883,6 @@ struct bmic_sense_storage_box_params { ...@@ -870,7 +883,6 @@ struct bmic_sense_storage_box_params {
u8 reserver_3[84]; u8 reserver_3[84];
u8 phys_connector[2]; u8 phys_connector[2];
u8 reserved_4[296]; u8 reserved_4[296];
}; } __packed;
#pragma pack()
#endif /* HPSA_CMD_H */ #endif /* HPSA_CMD_H */
...@@ -223,7 +223,7 @@ static void init_default_table_values(struct pm8001_hba_info *pm8001_ha) ...@@ -223,7 +223,7 @@ static void init_default_table_values(struct pm8001_hba_info *pm8001_ha)
PM8001_EVENT_LOG_SIZE; PM8001_EVENT_LOG_SIZE;
pm8001_ha->main_cfg_tbl.pm8001_tbl.iop_event_log_option = 0x01; pm8001_ha->main_cfg_tbl.pm8001_tbl.iop_event_log_option = 0x01;
pm8001_ha->main_cfg_tbl.pm8001_tbl.fatal_err_interrupt = 0x01; pm8001_ha->main_cfg_tbl.pm8001_tbl.fatal_err_interrupt = 0x01;
for (i = 0; i < PM8001_MAX_INB_NUM; i++) { for (i = 0; i < pm8001_ha->max_q_num; i++) {
pm8001_ha->inbnd_q_tbl[i].element_pri_size_cnt = pm8001_ha->inbnd_q_tbl[i].element_pri_size_cnt =
PM8001_MPI_QUEUE | (pm8001_ha->iomb_size << 16) | (0x00<<30); PM8001_MPI_QUEUE | (pm8001_ha->iomb_size << 16) | (0x00<<30);
pm8001_ha->inbnd_q_tbl[i].upper_base_addr = pm8001_ha->inbnd_q_tbl[i].upper_base_addr =
...@@ -249,7 +249,7 @@ static void init_default_table_values(struct pm8001_hba_info *pm8001_ha) ...@@ -249,7 +249,7 @@ static void init_default_table_values(struct pm8001_hba_info *pm8001_ha)
pm8001_ha->inbnd_q_tbl[i].producer_idx = 0; pm8001_ha->inbnd_q_tbl[i].producer_idx = 0;
pm8001_ha->inbnd_q_tbl[i].consumer_index = 0; pm8001_ha->inbnd_q_tbl[i].consumer_index = 0;
} }
for (i = 0; i < PM8001_MAX_OUTB_NUM; i++) { for (i = 0; i < pm8001_ha->max_q_num; i++) {
pm8001_ha->outbnd_q_tbl[i].element_size_cnt = pm8001_ha->outbnd_q_tbl[i].element_size_cnt =
PM8001_MPI_QUEUE | (pm8001_ha->iomb_size << 16) | (0x01<<30); PM8001_MPI_QUEUE | (pm8001_ha->iomb_size << 16) | (0x01<<30);
pm8001_ha->outbnd_q_tbl[i].upper_base_addr = pm8001_ha->outbnd_q_tbl[i].upper_base_addr =
...@@ -671,9 +671,9 @@ static int pm8001_chip_init(struct pm8001_hba_info *pm8001_ha) ...@@ -671,9 +671,9 @@ static int pm8001_chip_init(struct pm8001_hba_info *pm8001_ha)
read_outbnd_queue_table(pm8001_ha); read_outbnd_queue_table(pm8001_ha);
/* update main config table ,inbound table and outbound table */ /* update main config table ,inbound table and outbound table */
update_main_config_table(pm8001_ha); update_main_config_table(pm8001_ha);
for (i = 0; i < PM8001_MAX_INB_NUM; i++) for (i = 0; i < pm8001_ha->max_q_num; i++)
update_inbnd_queue_table(pm8001_ha, i); update_inbnd_queue_table(pm8001_ha, i);
for (i = 0; i < PM8001_MAX_OUTB_NUM; i++) for (i = 0; i < pm8001_ha->max_q_num; i++)
update_outbnd_queue_table(pm8001_ha, i); update_outbnd_queue_table(pm8001_ha, i);
/* 8081 controller donot require these operations */ /* 8081 controller donot require these operations */
if (deviceid != 0x8081 && deviceid != 0x0042) { if (deviceid != 0x8081 && deviceid != 0x0042) {
......
...@@ -541,7 +541,7 @@ int srp_reconnect_rport(struct srp_rport *rport) ...@@ -541,7 +541,7 @@ int srp_reconnect_rport(struct srp_rport *rport)
res = mutex_lock_interruptible(&rport->mutex); res = mutex_lock_interruptible(&rport->mutex);
if (res) if (res)
goto out; goto out;
if (rport->state != SRP_RPORT_FAIL_FAST) if (rport->state != SRP_RPORT_FAIL_FAST && rport->state != SRP_RPORT_LOST)
/* /*
* sdev state must be SDEV_TRANSPORT_OFFLINE, transition * sdev state must be SDEV_TRANSPORT_OFFLINE, transition
* to SDEV_BLOCK is illegal. Calling scsi_target_unblock() * to SDEV_BLOCK is illegal. Calling scsi_target_unblock()
......
...@@ -6386,37 +6386,34 @@ static int __ufshcd_issue_tm_cmd(struct ufs_hba *hba, ...@@ -6386,37 +6386,34 @@ static int __ufshcd_issue_tm_cmd(struct ufs_hba *hba,
DECLARE_COMPLETION_ONSTACK(wait); DECLARE_COMPLETION_ONSTACK(wait);
struct request *req; struct request *req;
unsigned long flags; unsigned long flags;
int free_slot, task_tag, err; int task_tag, err;
/* /*
* Get free slot, sleep if slots are unavailable. * blk_get_request() is used here only to get a free tag.
* Even though we use wait_event() which sleeps indefinitely,
* the maximum wait time is bounded by %TM_CMD_TIMEOUT.
*/ */
req = blk_get_request(q, REQ_OP_DRV_OUT, 0); req = blk_get_request(q, REQ_OP_DRV_OUT, 0);
if (IS_ERR(req)) if (IS_ERR(req))
return PTR_ERR(req); return PTR_ERR(req);
req->end_io_data = &wait; req->end_io_data = &wait;
free_slot = req->tag;
WARN_ON_ONCE(free_slot < 0 || free_slot >= hba->nutmrs);
ufshcd_hold(hba, false); ufshcd_hold(hba, false);
spin_lock_irqsave(host->host_lock, flags); spin_lock_irqsave(host->host_lock, flags);
task_tag = hba->nutrs + free_slot; blk_mq_start_request(req);
task_tag = req->tag;
treq->req_header.dword_0 |= cpu_to_be32(task_tag); treq->req_header.dword_0 |= cpu_to_be32(task_tag);
memcpy(hba->utmrdl_base_addr + free_slot, treq, sizeof(*treq)); memcpy(hba->utmrdl_base_addr + task_tag, treq, sizeof(*treq));
ufshcd_vops_setup_task_mgmt(hba, free_slot, tm_function); ufshcd_vops_setup_task_mgmt(hba, task_tag, tm_function);
/* send command to the controller */ /* send command to the controller */
__set_bit(free_slot, &hba->outstanding_tasks); __set_bit(task_tag, &hba->outstanding_tasks);
/* Make sure descriptors are ready before ringing the task doorbell */ /* Make sure descriptors are ready before ringing the task doorbell */
wmb(); wmb();
ufshcd_writel(hba, 1 << free_slot, REG_UTP_TASK_REQ_DOOR_BELL); ufshcd_writel(hba, 1 << task_tag, REG_UTP_TASK_REQ_DOOR_BELL);
/* Make sure that doorbell is committed immediately */ /* Make sure that doorbell is committed immediately */
wmb(); wmb();
...@@ -6436,24 +6433,24 @@ static int __ufshcd_issue_tm_cmd(struct ufs_hba *hba, ...@@ -6436,24 +6433,24 @@ static int __ufshcd_issue_tm_cmd(struct ufs_hba *hba,
ufshcd_add_tm_upiu_trace(hba, task_tag, UFS_TM_ERR); ufshcd_add_tm_upiu_trace(hba, task_tag, UFS_TM_ERR);
dev_err(hba->dev, "%s: task management cmd 0x%.2x timed-out\n", dev_err(hba->dev, "%s: task management cmd 0x%.2x timed-out\n",
__func__, tm_function); __func__, tm_function);
if (ufshcd_clear_tm_cmd(hba, free_slot)) if (ufshcd_clear_tm_cmd(hba, task_tag))
dev_WARN(hba->dev, "%s: unable clear tm cmd (slot %d) after timeout\n", dev_WARN(hba->dev, "%s: unable to clear tm cmd (slot %d) after timeout\n",
__func__, free_slot); __func__, task_tag);
err = -ETIMEDOUT; err = -ETIMEDOUT;
} else { } else {
err = 0; err = 0;
memcpy(treq, hba->utmrdl_base_addr + free_slot, sizeof(*treq)); memcpy(treq, hba->utmrdl_base_addr + task_tag, sizeof(*treq));
ufshcd_add_tm_upiu_trace(hba, task_tag, UFS_TM_COMP); ufshcd_add_tm_upiu_trace(hba, task_tag, UFS_TM_COMP);
} }
spin_lock_irqsave(hba->host->host_lock, flags); spin_lock_irqsave(hba->host->host_lock, flags);
__clear_bit(free_slot, &hba->outstanding_tasks); __clear_bit(task_tag, &hba->outstanding_tasks);
spin_unlock_irqrestore(hba->host->host_lock, flags); spin_unlock_irqrestore(hba->host->host_lock, flags);
ufshcd_release(hba);
blk_put_request(req); blk_put_request(req);
ufshcd_release(hba);
return err; return err;
} }
......
...@@ -1166,6 +1166,7 @@ int iscsit_setup_scsi_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, ...@@ -1166,6 +1166,7 @@ int iscsit_setup_scsi_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd,
target_get_sess_cmd(&cmd->se_cmd, true); target_get_sess_cmd(&cmd->se_cmd, true);
cmd->se_cmd.tag = (__force u32)cmd->init_task_tag;
cmd->sense_reason = target_cmd_init_cdb(&cmd->se_cmd, hdr->cdb); cmd->sense_reason = target_cmd_init_cdb(&cmd->se_cmd, hdr->cdb);
if (cmd->sense_reason) { if (cmd->sense_reason) {
if (cmd->sense_reason == TCM_OUT_OF_RESOURCES) { if (cmd->sense_reason == TCM_OUT_OF_RESOURCES) {
...@@ -1180,8 +1181,6 @@ int iscsit_setup_scsi_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, ...@@ -1180,8 +1181,6 @@ int iscsit_setup_scsi_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd,
if (cmd->sense_reason) if (cmd->sense_reason)
goto attach_cmd; goto attach_cmd;
/* only used for printks or comparing with ->ref_task_tag */
cmd->se_cmd.tag = (__force u32)cmd->init_task_tag;
cmd->sense_reason = target_cmd_parse_cdb(&cmd->se_cmd); cmd->sense_reason = target_cmd_parse_cdb(&cmd->se_cmd);
if (cmd->sense_reason) if (cmd->sense_reason)
goto attach_cmd; goto attach_cmd;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment