aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2012-03-22 15:55:29 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2012-03-22 15:55:29 -0400
commit424a6f6ef990b7e9f56f6627bfc6c46b493faeb4 (patch)
tree0028356ed8003495fbbe1f716f359e3c8ebc35b6 /drivers/scsi
parent1ab142d499294b844ecc81e8004db4ce029b0b61 (diff)
parentcd8df932d894f3128c884e3ae1b2b484540513db (diff)
Merge tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6
SCSI updates from James Bottomley: "The update includes the usual assortment of driver updates (lpfc, qla2xxx, qla4xxx, bfa, bnx2fc, bnx2i, isci, fcoe, hpsa) plus a huge amount of infrastructure work in the SAS library and transport class as well as an iSCSI update. There's also a new SCSI based virtio driver." * tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6: (177 commits) [SCSI] qla4xxx: Update driver version to 5.02.00-k15 [SCSI] qla4xxx: trivial cleanup [SCSI] qla4xxx: Fix sparse warning [SCSI] qla4xxx: Add support for multiple session per host. [SCSI] qla4xxx: Export CHAP index as sysfs attribute [SCSI] scsi_transport: Export CHAP index as sysfs attribute [SCSI] qla4xxx: Add support to display CHAP list and delete CHAP entry [SCSI] iscsi_transport: Add support to display CHAP list and delete CHAP entry [SCSI] pm8001: fix endian issue with code optimization. [SCSI] pm8001: Fix possible racing condition. [SCSI] pm8001: Fix bogus interrupt state flag issue. [SCSI] ipr: update PCI ID definitions for new adapters [SCSI] qla2xxx: handle default case in qla2x00_request_firmware() [SCSI] isci: improvements in driver unloading routine [SCSI] isci: improve phy event warnings [SCSI] isci: debug, provide state-enum-to-string conversions [SCSI] scsi_transport_sas: 'enable' phys on reset [SCSI] libsas: don't recover end devices attached to disabled phys [SCSI] libsas: fixup target_port_protocols for expanders that don't report sata [SCSI] libsas: set attached device type and target protocols for local phys ...
Diffstat (limited to 'drivers/scsi')
-rw-r--r--drivers/scsi/Kconfig8
-rw-r--r--drivers/scsi/Makefile1
-rw-r--r--drivers/scsi/aacraid/aachba.c4
-rw-r--r--drivers/scsi/aacraid/aacraid.h27
-rw-r--r--drivers/scsi/aacraid/comminit.c21
-rw-r--r--drivers/scsi/aacraid/commsup.c26
-rw-r--r--drivers/scsi/aacraid/linit.c28
-rw-r--r--drivers/scsi/aacraid/rx.c1
-rw-r--r--drivers/scsi/aacraid/sa.c1
-rw-r--r--drivers/scsi/aacraid/src.c293
-rw-r--r--drivers/scsi/aic94xx/aic94xx.h2
-rw-r--r--drivers/scsi/aic94xx/aic94xx_dev.c38
-rw-r--r--drivers/scsi/aic94xx/aic94xx_init.c6
-rw-r--r--drivers/scsi/aic94xx/aic94xx_tmf.c11
-rw-r--r--drivers/scsi/bfa/bfad_bsg.c4
-rw-r--r--drivers/scsi/bnx2fc/bnx2fc.h8
-rw-r--r--drivers/scsi/bnx2fc/bnx2fc_fcoe.c20
-rw-r--r--drivers/scsi/bnx2i/bnx2i_hwi.c12
-rw-r--r--drivers/scsi/bnx2i/bnx2i_init.c9
-rw-r--r--drivers/scsi/cxgbi/libcxgbi.c13
-rw-r--r--drivers/scsi/fcoe/fcoe.c167
-rw-r--r--drivers/scsi/fcoe/fcoe.h3
-rw-r--r--drivers/scsi/fcoe/fcoe_transport.c4
-rw-r--r--drivers/scsi/hpsa.c344
-rw-r--r--drivers/scsi/hpsa.h3
-rw-r--r--drivers/scsi/hpsa_cmd.h9
-rw-r--r--drivers/scsi/ipr.c14
-rw-r--r--drivers/scsi/ipr.h4
-rw-r--r--drivers/scsi/isci/host.c17
-rw-r--r--drivers/scsi/isci/host.h19
-rw-r--r--drivers/scsi/isci/init.c24
-rw-r--r--drivers/scsi/isci/phy.c171
-rw-r--r--drivers/scsi/isci/phy.h155
-rw-r--r--drivers/scsi/isci/port.c263
-rw-r--r--drivers/scsi/isci/port.h114
-rw-r--r--drivers/scsi/isci/registers.h27
-rw-r--r--drivers/scsi/isci/remote_device.c82
-rw-r--r--drivers/scsi/isci/remote_device.h212
-rw-r--r--drivers/scsi/isci/remote_node_context.c19
-rw-r--r--drivers/scsi/isci/remote_node_context.h97
-rw-r--r--drivers/scsi/isci/request.c370
-rw-r--r--drivers/scsi/isci/request.h228
-rw-r--r--drivers/scsi/isci/scu_task_context.h55
-rw-r--r--drivers/scsi/isci/task.c158
-rw-r--r--drivers/scsi/isci/task.h40
-rw-r--r--drivers/scsi/iscsi_tcp.c13
-rw-r--r--drivers/scsi/libfc/fc_disc.c7
-rw-r--r--drivers/scsi/libfc/fc_elsct.c3
-rw-r--r--drivers/scsi/libfc/fc_exch.c7
-rw-r--r--drivers/scsi/libfc/fc_lport.c227
-rw-r--r--drivers/scsi/libiscsi.c28
-rw-r--r--drivers/scsi/libiscsi_tcp.c18
-rw-r--r--drivers/scsi/libsas/sas_ata.c828
-rw-r--r--drivers/scsi/libsas/sas_discover.c246
-rw-r--r--drivers/scsi/libsas/sas_event.c96
-rw-r--r--drivers/scsi/libsas/sas_expander.c342
-rw-r--r--drivers/scsi/libsas/sas_host_smp.c11
-rw-r--r--drivers/scsi/libsas/sas_init.c214
-rw-r--r--drivers/scsi/libsas/sas_internal.h97
-rw-r--r--drivers/scsi/libsas/sas_phy.c12
-rw-r--r--drivers/scsi/libsas/sas_port.c32
-rw-r--r--drivers/scsi/libsas/sas_scsi_host.c364
-rw-r--r--drivers/scsi/lpfc/lpfc.h13
-rw-r--r--drivers/scsi/lpfc/lpfc_attr.c12
-rw-r--r--drivers/scsi/lpfc/lpfc_bsg.c18
-rw-r--r--drivers/scsi/lpfc/lpfc_crtn.h1
-rw-r--r--drivers/scsi/lpfc/lpfc_ct.c4
-rw-r--r--drivers/scsi/lpfc/lpfc_debugfs.c19
-rw-r--r--drivers/scsi/lpfc/lpfc_els.c5
-rw-r--r--drivers/scsi/lpfc/lpfc_hbadisc.c12
-rw-r--r--drivers/scsi/lpfc/lpfc_hw.h5
-rw-r--r--drivers/scsi/lpfc/lpfc_hw4.h49
-rw-r--r--drivers/scsi/lpfc/lpfc_init.c137
-rw-r--r--drivers/scsi/lpfc/lpfc_nportdisc.c77
-rw-r--r--drivers/scsi/lpfc/lpfc_scsi.c1054
-rw-r--r--drivers/scsi/lpfc/lpfc_sli.c240
-rw-r--r--drivers/scsi/lpfc/lpfc_sli.h1
-rw-r--r--drivers/scsi/lpfc/lpfc_sli4.h3
-rw-r--r--drivers/scsi/lpfc/lpfc_version.h2
-rw-r--r--drivers/scsi/mpt2sas/mpt2sas_base.c5
-rw-r--r--drivers/scsi/mpt2sas/mpt2sas_scsih.c6
-rw-r--r--drivers/scsi/mvsas/mv_init.c2
-rw-r--r--drivers/scsi/mvsas/mv_sas.c11
-rw-r--r--drivers/scsi/pm8001/pm8001_chips.h4
-rw-r--r--drivers/scsi/pm8001/pm8001_hwi.c434
-rw-r--r--drivers/scsi/pm8001/pm8001_hwi.h2
-rw-r--r--drivers/scsi/pm8001/pm8001_init.c2
-rw-r--r--drivers/scsi/pm8001/pm8001_sas.c127
-rw-r--r--drivers/scsi/pm8001/pm8001_sas.h6
-rw-r--r--drivers/scsi/qla2xxx/qla_attr.c177
-rw-r--r--drivers/scsi/qla2xxx/qla_bsg.c120
-rw-r--r--drivers/scsi/qla2xxx/qla_dbg.c630
-rw-r--r--drivers/scsi/qla2xxx/qla_dbg.h63
-rw-r--r--drivers/scsi/qla2xxx/qla_def.h117
-rw-r--r--drivers/scsi/qla2xxx/qla_dfs.c2
-rw-r--r--drivers/scsi/qla2xxx/qla_fw.h13
-rw-r--r--drivers/scsi/qla2xxx/qla_gbl.h22
-rw-r--r--drivers/scsi/qla2xxx/qla_gs.c86
-rw-r--r--drivers/scsi/qla2xxx/qla_init.c540
-rw-r--r--drivers/scsi/qla2xxx/qla_inline.h51
-rw-r--r--drivers/scsi/qla2xxx/qla_iocb.c167
-rw-r--r--drivers/scsi/qla2xxx/qla_isr.c445
-rw-r--r--drivers/scsi/qla2xxx/qla_mbx.c410
-rw-r--r--drivers/scsi/qla2xxx/qla_mid.c2
-rw-r--r--drivers/scsi/qla2xxx/qla_nx.c90
-rw-r--r--drivers/scsi/qla2xxx/qla_nx.h3
-rw-r--r--drivers/scsi/qla2xxx/qla_os.c435
-rw-r--r--drivers/scsi/qla2xxx/qla_sup.c148
-rw-r--r--drivers/scsi/qla4xxx/ql4_def.h45
-rw-r--r--drivers/scsi/qla4xxx/ql4_fw.h24
-rw-r--r--drivers/scsi/qla4xxx/ql4_glbl.h9
-rw-r--r--drivers/scsi/qla4xxx/ql4_init.c5
-rw-r--r--drivers/scsi/qla4xxx/ql4_iocb.c92
-rw-r--r--drivers/scsi/qla4xxx/ql4_isr.c78
-rw-r--r--drivers/scsi/qla4xxx/ql4_mbx.c23
-rw-r--r--drivers/scsi/qla4xxx/ql4_nx.c17
-rw-r--r--drivers/scsi/qla4xxx/ql4_nx.h1
-rw-r--r--drivers/scsi/qla4xxx/ql4_os.c563
-rw-r--r--drivers/scsi/qla4xxx/ql4_version.h2
-rw-r--r--drivers/scsi/scsi.c6
-rw-r--r--drivers/scsi/scsi_debug.c6
-rw-r--r--drivers/scsi/scsi_error.c24
-rw-r--r--drivers/scsi/scsi_lib.c5
-rw-r--r--drivers/scsi/scsi_transport_fc.c30
-rw-r--r--drivers/scsi/scsi_transport_iscsi.c268
-rw-r--r--drivers/scsi/scsi_transport_sas.c60
-rw-r--r--drivers/scsi/sd.c86
-rw-r--r--drivers/scsi/sd.h35
-rw-r--r--drivers/scsi/st.c11
-rw-r--r--drivers/scsi/virtio_scsi.c594
130 files changed, 9218 insertions, 4215 deletions
diff --git a/drivers/scsi/Kconfig b/drivers/scsi/Kconfig
index 4e89103204dc..a06e608789e3 100644
--- a/drivers/scsi/Kconfig
+++ b/drivers/scsi/Kconfig
@@ -1903,6 +1903,14 @@ config SCSI_BFA_FC
1903 To compile this driver as a module, choose M here. The module will 1903 To compile this driver as a module, choose M here. The module will
1904 be called bfa. 1904 be called bfa.
1905 1905
1906config SCSI_VIRTIO
1907 tristate "virtio-scsi support (EXPERIMENTAL)"
1908 depends on EXPERIMENTAL && VIRTIO
1909 help
1910 This is the virtual HBA driver for virtio. If the kernel will
1911 be used in a virtual machine, say Y or M.
1912
1913
1906endif # SCSI_LOWLEVEL 1914endif # SCSI_LOWLEVEL
1907 1915
1908source "drivers/scsi/pcmcia/Kconfig" 1916source "drivers/scsi/pcmcia/Kconfig"
diff --git a/drivers/scsi/Makefile b/drivers/scsi/Makefile
index e4c1a69f8fab..ad24e065b1e5 100644
--- a/drivers/scsi/Makefile
+++ b/drivers/scsi/Makefile
@@ -141,6 +141,7 @@ obj-$(CONFIG_SCSI_CXGB4_ISCSI) += libiscsi.o libiscsi_tcp.o cxgbi/
141obj-$(CONFIG_SCSI_BNX2_ISCSI) += libiscsi.o bnx2i/ 141obj-$(CONFIG_SCSI_BNX2_ISCSI) += libiscsi.o bnx2i/
142obj-$(CONFIG_BE2ISCSI) += libiscsi.o be2iscsi/ 142obj-$(CONFIG_BE2ISCSI) += libiscsi.o be2iscsi/
143obj-$(CONFIG_SCSI_PMCRAID) += pmcraid.o 143obj-$(CONFIG_SCSI_PMCRAID) += pmcraid.o
144obj-$(CONFIG_SCSI_VIRTIO) += virtio_scsi.o
144obj-$(CONFIG_VMWARE_PVSCSI) += vmw_pvscsi.o 145obj-$(CONFIG_VMWARE_PVSCSI) += vmw_pvscsi.o
145obj-$(CONFIG_HYPERV_STORAGE) += hv_storvsc.o 146obj-$(CONFIG_HYPERV_STORAGE) += hv_storvsc.o
146 147
diff --git a/drivers/scsi/aacraid/aachba.c b/drivers/scsi/aacraid/aachba.c
index 409f5805bdd6..52551662d107 100644
--- a/drivers/scsi/aacraid/aachba.c
+++ b/drivers/scsi/aacraid/aachba.c
@@ -151,7 +151,11 @@ int aac_msi;
151int aac_commit = -1; 151int aac_commit = -1;
152int startup_timeout = 180; 152int startup_timeout = 180;
153int aif_timeout = 120; 153int aif_timeout = 120;
154int aac_sync_mode; /* Only Sync. transfer - disabled */
154 155
156module_param(aac_sync_mode, int, S_IRUGO|S_IWUSR);
157MODULE_PARM_DESC(aac_sync_mode, "Force sync. transfer mode"
158 " 0=off, 1=on");
155module_param(nondasd, int, S_IRUGO|S_IWUSR); 159module_param(nondasd, int, S_IRUGO|S_IWUSR);
156MODULE_PARM_DESC(nondasd, "Control scanning of hba for nondasd devices." 160MODULE_PARM_DESC(nondasd, "Control scanning of hba for nondasd devices."
157 " 0=off, 1=on"); 161 " 0=off, 1=on");
diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h
index ffb587817efc..3fcf62724fad 100644
--- a/drivers/scsi/aacraid/aacraid.h
+++ b/drivers/scsi/aacraid/aacraid.h
@@ -12,7 +12,7 @@
12 *----------------------------------------------------------------------------*/ 12 *----------------------------------------------------------------------------*/
13 13
14#ifndef AAC_DRIVER_BUILD 14#ifndef AAC_DRIVER_BUILD
15# define AAC_DRIVER_BUILD 28000 15# define AAC_DRIVER_BUILD 28900
16# define AAC_DRIVER_BRANCH "-ms" 16# define AAC_DRIVER_BRANCH "-ms"
17#endif 17#endif
18#define MAXIMUM_NUM_CONTAINERS 32 18#define MAXIMUM_NUM_CONTAINERS 32
@@ -756,8 +756,16 @@ struct src_mu_registers {
756 756
757struct src_registers { 757struct src_registers {
758 struct src_mu_registers MUnit; /* 00h - c7h */ 758 struct src_mu_registers MUnit; /* 00h - c7h */
759 __le32 reserved1[130790]; /* c8h - 7fc5fh */ 759 union {
760 struct src_inbound IndexRegs; /* 7fc60h */ 760 struct {
761 __le32 reserved1[130790]; /* c8h - 7fc5fh */
762 struct src_inbound IndexRegs; /* 7fc60h */
763 } tupelo;
764 struct {
765 __le32 reserved1[974]; /* c8h - fffh */
766 struct src_inbound IndexRegs; /* 1000h */
767 } denali;
768 } u;
761}; 769};
762 770
763#define src_readb(AEP, CSR) readb(&((AEP)->regs.src.bar0->CSR)) 771#define src_readb(AEP, CSR) readb(&((AEP)->regs.src.bar0->CSR))
@@ -999,6 +1007,10 @@ struct aac_bus_info_response {
999#define AAC_OPT_NEW_COMM cpu_to_le32(1<<17) 1007#define AAC_OPT_NEW_COMM cpu_to_le32(1<<17)
1000#define AAC_OPT_NEW_COMM_64 cpu_to_le32(1<<18) 1008#define AAC_OPT_NEW_COMM_64 cpu_to_le32(1<<18)
1001#define AAC_OPT_NEW_COMM_TYPE1 cpu_to_le32(1<<28) 1009#define AAC_OPT_NEW_COMM_TYPE1 cpu_to_le32(1<<28)
1010#define AAC_OPT_NEW_COMM_TYPE2 cpu_to_le32(1<<29)
1011#define AAC_OPT_NEW_COMM_TYPE3 cpu_to_le32(1<<30)
1012#define AAC_OPT_NEW_COMM_TYPE4 cpu_to_le32(1<<31)
1013
1002 1014
1003struct aac_dev 1015struct aac_dev
1004{ 1016{
@@ -1076,6 +1088,8 @@ struct aac_dev
1076# define AAC_MIN_FOOTPRINT_SIZE 8192 1088# define AAC_MIN_FOOTPRINT_SIZE 8192
1077# define AAC_MIN_SRC_BAR0_SIZE 0x400000 1089# define AAC_MIN_SRC_BAR0_SIZE 0x400000
1078# define AAC_MIN_SRC_BAR1_SIZE 0x800 1090# define AAC_MIN_SRC_BAR1_SIZE 0x800
1091# define AAC_MIN_SRCV_BAR0_SIZE 0x100000
1092# define AAC_MIN_SRCV_BAR1_SIZE 0x400
1079#endif 1093#endif
1080 union 1094 union
1081 { 1095 {
@@ -1116,7 +1130,10 @@ struct aac_dev
1116 u8 msi; 1130 u8 msi;
1117 int management_fib_count; 1131 int management_fib_count;
1118 spinlock_t manage_lock; 1132 spinlock_t manage_lock;
1119 1133 spinlock_t sync_lock;
1134 int sync_mode;
1135 struct fib *sync_fib;
1136 struct list_head sync_fib_list;
1120}; 1137};
1121 1138
1122#define aac_adapter_interrupt(dev) \ 1139#define aac_adapter_interrupt(dev) \
@@ -1163,6 +1180,7 @@ struct aac_dev
1163 1180
1164#define FIB_CONTEXT_FLAG_TIMED_OUT (0x00000001) 1181#define FIB_CONTEXT_FLAG_TIMED_OUT (0x00000001)
1165#define FIB_CONTEXT_FLAG (0x00000002) 1182#define FIB_CONTEXT_FLAG (0x00000002)
1183#define FIB_CONTEXT_FLAG_WAIT (0x00000004)
1166 1184
1167/* 1185/*
1168 * Define the command values 1186 * Define the command values
@@ -1970,6 +1988,7 @@ int aac_rkt_init(struct aac_dev *dev);
1970int aac_nark_init(struct aac_dev *dev); 1988int aac_nark_init(struct aac_dev *dev);
1971int aac_sa_init(struct aac_dev *dev); 1989int aac_sa_init(struct aac_dev *dev);
1972int aac_src_init(struct aac_dev *dev); 1990int aac_src_init(struct aac_dev *dev);
1991int aac_srcv_init(struct aac_dev *dev);
1973int aac_queue_get(struct aac_dev * dev, u32 * index, u32 qid, struct hw_fib * hw_fib, int wait, struct fib * fibptr, unsigned long *nonotify); 1992int aac_queue_get(struct aac_dev * dev, u32 * index, u32 qid, struct hw_fib * hw_fib, int wait, struct fib * fibptr, unsigned long *nonotify);
1974unsigned int aac_response_normal(struct aac_queue * q); 1993unsigned int aac_response_normal(struct aac_queue * q);
1975unsigned int aac_command_normal(struct aac_queue * q); 1994unsigned int aac_command_normal(struct aac_queue * q);
diff --git a/drivers/scsi/aacraid/comminit.c b/drivers/scsi/aacraid/comminit.c
index 7ac8fdb5577b..a35f54ebdce0 100644
--- a/drivers/scsi/aacraid/comminit.c
+++ b/drivers/scsi/aacraid/comminit.c
@@ -325,12 +325,14 @@ struct aac_dev *aac_init_adapter(struct aac_dev *dev)
325{ 325{
326 u32 status[5]; 326 u32 status[5];
327 struct Scsi_Host * host = dev->scsi_host_ptr; 327 struct Scsi_Host * host = dev->scsi_host_ptr;
328 extern int aac_sync_mode;
328 329
329 /* 330 /*
330 * Check the preferred comm settings, defaults from template. 331 * Check the preferred comm settings, defaults from template.
331 */ 332 */
332 dev->management_fib_count = 0; 333 dev->management_fib_count = 0;
333 spin_lock_init(&dev->manage_lock); 334 spin_lock_init(&dev->manage_lock);
335 spin_lock_init(&dev->sync_lock);
334 dev->max_fib_size = sizeof(struct hw_fib); 336 dev->max_fib_size = sizeof(struct hw_fib);
335 dev->sg_tablesize = host->sg_tablesize = (dev->max_fib_size 337 dev->sg_tablesize = host->sg_tablesize = (dev->max_fib_size
336 - sizeof(struct aac_fibhdr) 338 - sizeof(struct aac_fibhdr)
@@ -344,13 +346,21 @@ struct aac_dev *aac_init_adapter(struct aac_dev *dev)
344 (status[0] == 0x00000001)) { 346 (status[0] == 0x00000001)) {
345 if (status[1] & le32_to_cpu(AAC_OPT_NEW_COMM_64)) 347 if (status[1] & le32_to_cpu(AAC_OPT_NEW_COMM_64))
346 dev->raw_io_64 = 1; 348 dev->raw_io_64 = 1;
347 if (dev->a_ops.adapter_comm) { 349 dev->sync_mode = aac_sync_mode;
348 if (status[1] & le32_to_cpu(AAC_OPT_NEW_COMM_TYPE1)) { 350 if (dev->a_ops.adapter_comm &&
349 dev->comm_interface = AAC_COMM_MESSAGE_TYPE1; 351 (status[1] & le32_to_cpu(AAC_OPT_NEW_COMM))) {
350 dev->raw_io_interface = 1;
351 } else if (status[1] & le32_to_cpu(AAC_OPT_NEW_COMM)) {
352 dev->comm_interface = AAC_COMM_MESSAGE; 352 dev->comm_interface = AAC_COMM_MESSAGE;
353 dev->raw_io_interface = 1; 353 dev->raw_io_interface = 1;
354 if ((status[1] & le32_to_cpu(AAC_OPT_NEW_COMM_TYPE1))) {
355 /* driver supports TYPE1 (Tupelo) */
356 dev->comm_interface = AAC_COMM_MESSAGE_TYPE1;
357 } else if ((status[1] & le32_to_cpu(AAC_OPT_NEW_COMM_TYPE4)) ||
358 (status[1] & le32_to_cpu(AAC_OPT_NEW_COMM_TYPE3)) ||
359 (status[1] & le32_to_cpu(AAC_OPT_NEW_COMM_TYPE2))) {
360 /* driver doesn't support TYPE2 (Series7), TYPE3 and TYPE4 */
361 /* switch to sync. mode */
362 dev->comm_interface = AAC_COMM_MESSAGE_TYPE1;
363 dev->sync_mode = 1;
354 } 364 }
355 } 365 }
356 if ((dev->comm_interface == AAC_COMM_MESSAGE) && 366 if ((dev->comm_interface == AAC_COMM_MESSAGE) &&
@@ -455,6 +465,7 @@ struct aac_dev *aac_init_adapter(struct aac_dev *dev)
455 } 465 }
456 466
457 INIT_LIST_HEAD(&dev->fib_list); 467 INIT_LIST_HEAD(&dev->fib_list);
468 INIT_LIST_HEAD(&dev->sync_fib_list);
458 469
459 return dev; 470 return dev;
460} 471}
diff --git a/drivers/scsi/aacraid/commsup.c b/drivers/scsi/aacraid/commsup.c
index e5f2d7d9002e..4b32ca442433 100644
--- a/drivers/scsi/aacraid/commsup.c
+++ b/drivers/scsi/aacraid/commsup.c
@@ -416,6 +416,7 @@ int aac_fib_send(u16 command, struct fib *fibptr, unsigned long size,
416 unsigned long flags = 0; 416 unsigned long flags = 0;
417 unsigned long qflags; 417 unsigned long qflags;
418 unsigned long mflags = 0; 418 unsigned long mflags = 0;
419 unsigned long sflags = 0;
419 420
420 421
421 if (!(hw_fib->header.XferState & cpu_to_le32(HostOwned))) 422 if (!(hw_fib->header.XferState & cpu_to_le32(HostOwned)))
@@ -512,6 +513,31 @@ int aac_fib_send(u16 command, struct fib *fibptr, unsigned long size,
512 spin_lock_irqsave(&fibptr->event_lock, flags); 513 spin_lock_irqsave(&fibptr->event_lock, flags);
513 } 514 }
514 515
516 if (dev->sync_mode) {
517 if (wait)
518 spin_unlock_irqrestore(&fibptr->event_lock, flags);
519 spin_lock_irqsave(&dev->sync_lock, sflags);
520 if (dev->sync_fib) {
521 list_add_tail(&fibptr->fiblink, &dev->sync_fib_list);
522 spin_unlock_irqrestore(&dev->sync_lock, sflags);
523 } else {
524 dev->sync_fib = fibptr;
525 spin_unlock_irqrestore(&dev->sync_lock, sflags);
526 aac_adapter_sync_cmd(dev, SEND_SYNCHRONOUS_FIB,
527 (u32)fibptr->hw_fib_pa, 0, 0, 0, 0, 0,
528 NULL, NULL, NULL, NULL, NULL);
529 }
530 if (wait) {
531 fibptr->flags |= FIB_CONTEXT_FLAG_WAIT;
532 if (down_interruptible(&fibptr->event_wait)) {
533 fibptr->flags &= ~FIB_CONTEXT_FLAG_WAIT;
534 return -EFAULT;
535 }
536 return 0;
537 }
538 return -EINPROGRESS;
539 }
540
515 if (aac_adapter_deliver(fibptr) != 0) { 541 if (aac_adapter_deliver(fibptr) != 0) {
516 printk(KERN_ERR "aac_fib_send: returned -EBUSY\n"); 542 printk(KERN_ERR "aac_fib_send: returned -EBUSY\n");
517 if (wait) { 543 if (wait) {
diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c
index 705e13e470af..0d279c445a30 100644
--- a/drivers/scsi/aacraid/linit.c
+++ b/drivers/scsi/aacraid/linit.c
@@ -56,7 +56,7 @@
56 56
57#include "aacraid.h" 57#include "aacraid.h"
58 58
59#define AAC_DRIVER_VERSION "1.1-7" 59#define AAC_DRIVER_VERSION "1.2-0"
60#ifndef AAC_DRIVER_BRANCH 60#ifndef AAC_DRIVER_BRANCH
61#define AAC_DRIVER_BRANCH "" 61#define AAC_DRIVER_BRANCH ""
62#endif 62#endif
@@ -162,7 +162,10 @@ static const struct pci_device_id aac_pci_tbl[] __devinitdata = {
162 { 0x9005, 0x0285, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 59 }, /* Adaptec Catch All */ 162 { 0x9005, 0x0285, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 59 }, /* Adaptec Catch All */
163 { 0x9005, 0x0286, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 60 }, /* Adaptec Rocket Catch All */ 163 { 0x9005, 0x0286, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 60 }, /* Adaptec Rocket Catch All */
164 { 0x9005, 0x0288, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 61 }, /* Adaptec NEMER/ARK Catch All */ 164 { 0x9005, 0x0288, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 61 }, /* Adaptec NEMER/ARK Catch All */
165 { 0x9005, 0x028b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 62 }, /* Adaptec PMC Catch All */ 165 { 0x9005, 0x028b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 62 }, /* Adaptec PMC Series 6 (Tupelo) */
166 { 0x9005, 0x028c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 63 }, /* Adaptec PMC Series 7 (Denali) */
167 { 0x9005, 0x028d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 64 }, /* Adaptec PMC Series 8 */
168 { 0x9005, 0x028f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 65 }, /* Adaptec PMC Series 9 */
166 { 0,} 169 { 0,}
167}; 170};
168MODULE_DEVICE_TABLE(pci, aac_pci_tbl); 171MODULE_DEVICE_TABLE(pci, aac_pci_tbl);
@@ -238,7 +241,10 @@ static struct aac_driver_ident aac_drivers[] = {
238 { aac_rx_init, "aacraid", "ADAPTEC ", "RAID ", 2 }, /* Adaptec Catch All */ 241 { aac_rx_init, "aacraid", "ADAPTEC ", "RAID ", 2 }, /* Adaptec Catch All */
239 { aac_rkt_init, "aacraid", "ADAPTEC ", "RAID ", 2 }, /* Adaptec Rocket Catch All */ 242 { aac_rkt_init, "aacraid", "ADAPTEC ", "RAID ", 2 }, /* Adaptec Rocket Catch All */
240 { aac_nark_init, "aacraid", "ADAPTEC ", "RAID ", 2 }, /* Adaptec NEMER/ARK Catch All */ 243 { aac_nark_init, "aacraid", "ADAPTEC ", "RAID ", 2 }, /* Adaptec NEMER/ARK Catch All */
241 { aac_src_init, "aacraid", "ADAPTEC ", "RAID ", 2 } /* Adaptec PMC Catch All */ 244 { aac_src_init, "aacraid", "ADAPTEC ", "RAID ", 2 }, /* Adaptec PMC Series 6 (Tupelo) */
245 { aac_srcv_init, "aacraid", "ADAPTEC ", "RAID ", 2 }, /* Adaptec PMC Series 7 (Denali) */
246 { aac_srcv_init, "aacraid", "ADAPTEC ", "RAID ", 2 }, /* Adaptec PMC Series 8 */
247 { aac_srcv_init, "aacraid", "ADAPTEC ", "RAID ", 2 } /* Adaptec PMC Series 9 */
242}; 248};
243 249
244/** 250/**
@@ -1102,6 +1108,7 @@ static int __devinit aac_probe_one(struct pci_dev *pdev,
1102 int error = -ENODEV; 1108 int error = -ENODEV;
1103 int unique_id = 0; 1109 int unique_id = 0;
1104 u64 dmamask; 1110 u64 dmamask;
1111 extern int aac_sync_mode;
1105 1112
1106 list_for_each_entry(aac, &aac_devices, entry) { 1113 list_for_each_entry(aac, &aac_devices, entry) {
1107 if (aac->id > unique_id) 1114 if (aac->id > unique_id)
@@ -1162,6 +1169,21 @@ static int __devinit aac_probe_one(struct pci_dev *pdev,
1162 if ((*aac_drivers[index].init)(aac)) 1169 if ((*aac_drivers[index].init)(aac))
1163 goto out_unmap; 1170 goto out_unmap;
1164 1171
1172 if (aac->sync_mode) {
1173 if (aac_sync_mode)
1174 printk(KERN_INFO "%s%d: Sync. mode enforced "
1175 "by driver parameter. This will cause "
1176 "a significant performance decrease!\n",
1177 aac->name,
1178 aac->id);
1179 else
1180 printk(KERN_INFO "%s%d: Async. mode not supported "
1181 "by current driver, sync. mode enforced."
1182 "\nPlease update driver to get full performance.\n",
1183 aac->name,
1184 aac->id);
1185 }
1186
1165 /* 1187 /*
1166 * Start any kernel threads needed 1188 * Start any kernel threads needed
1167 */ 1189 */
diff --git a/drivers/scsi/aacraid/rx.c b/drivers/scsi/aacraid/rx.c
index ce530f113fdb..b029c7cc785b 100644
--- a/drivers/scsi/aacraid/rx.c
+++ b/drivers/scsi/aacraid/rx.c
@@ -643,6 +643,7 @@ int _aac_rx_init(struct aac_dev *dev)
643 if (aac_init_adapter(dev) == NULL) 643 if (aac_init_adapter(dev) == NULL)
644 goto error_iounmap; 644 goto error_iounmap;
645 aac_adapter_comm(dev, dev->comm_interface); 645 aac_adapter_comm(dev, dev->comm_interface);
646 dev->sync_mode = 0; /* sync. mode not supported */
646 dev->msi = aac_msi && !pci_enable_msi(dev->pdev); 647 dev->msi = aac_msi && !pci_enable_msi(dev->pdev);
647 if (request_irq(dev->pdev->irq, dev->a_ops.adapter_intr, 648 if (request_irq(dev->pdev->irq, dev->a_ops.adapter_intr,
648 IRQF_SHARED|IRQF_DISABLED, "aacraid", dev) < 0) { 649 IRQF_SHARED|IRQF_DISABLED, "aacraid", dev) < 0) {
diff --git a/drivers/scsi/aacraid/sa.c b/drivers/scsi/aacraid/sa.c
index e5d4457121ea..beb533630d4b 100644
--- a/drivers/scsi/aacraid/sa.c
+++ b/drivers/scsi/aacraid/sa.c
@@ -385,6 +385,7 @@ int aac_sa_init(struct aac_dev *dev)
385 385
386 if(aac_init_adapter(dev) == NULL) 386 if(aac_init_adapter(dev) == NULL)
387 goto error_irq; 387 goto error_irq;
388 dev->sync_mode = 0; /* sync. mode not supported */
388 if (request_irq(dev->pdev->irq, dev->a_ops.adapter_intr, 389 if (request_irq(dev->pdev->irq, dev->a_ops.adapter_intr,
389 IRQF_SHARED|IRQF_DISABLED, 390 IRQF_SHARED|IRQF_DISABLED,
390 "aacraid", (void *)dev ) < 0) { 391 "aacraid", (void *)dev ) < 0) {
diff --git a/drivers/scsi/aacraid/src.c b/drivers/scsi/aacraid/src.c
index 957595a7a45c..2bee51506a91 100644
--- a/drivers/scsi/aacraid/src.c
+++ b/drivers/scsi/aacraid/src.c
@@ -96,6 +96,38 @@ static irqreturn_t aac_src_intr_message(int irq, void *dev_id)
96 our_interrupt = 1; 96 our_interrupt = 1;
97 /* handle AIF */ 97 /* handle AIF */
98 aac_intr_normal(dev, 0, 2, 0, NULL); 98 aac_intr_normal(dev, 0, 2, 0, NULL);
99 } else if (bellbits_shifted & OUTBOUNDDOORBELL_0) {
100 unsigned long sflags;
101 struct list_head *entry;
102 int send_it = 0;
103
104 if (dev->sync_fib) {
105 our_interrupt = 1;
106 if (dev->sync_fib->callback)
107 dev->sync_fib->callback(dev->sync_fib->callback_data,
108 dev->sync_fib);
109 spin_lock_irqsave(&dev->sync_fib->event_lock, sflags);
110 if (dev->sync_fib->flags & FIB_CONTEXT_FLAG_WAIT) {
111 dev->management_fib_count--;
112 up(&dev->sync_fib->event_wait);
113 }
114 spin_unlock_irqrestore(&dev->sync_fib->event_lock, sflags);
115 spin_lock_irqsave(&dev->sync_lock, sflags);
116 if (!list_empty(&dev->sync_fib_list)) {
117 entry = dev->sync_fib_list.next;
118 dev->sync_fib = list_entry(entry, struct fib, fiblink);
119 list_del(entry);
120 send_it = 1;
121 } else {
122 dev->sync_fib = NULL;
123 }
124 spin_unlock_irqrestore(&dev->sync_lock, sflags);
125 if (send_it) {
126 aac_adapter_sync_cmd(dev, SEND_SYNCHRONOUS_FIB,
127 (u32)dev->sync_fib->hw_fib_pa, 0, 0, 0, 0, 0,
128 NULL, NULL, NULL, NULL, NULL);
129 }
130 }
99 } 131 }
100 } 132 }
101 133
@@ -177,56 +209,63 @@ static int src_sync_cmd(struct aac_dev *dev, u32 command,
177 */ 209 */
178 src_writel(dev, MUnit.IDR, INBOUNDDOORBELL_0 << SRC_IDR_SHIFT); 210 src_writel(dev, MUnit.IDR, INBOUNDDOORBELL_0 << SRC_IDR_SHIFT);
179 211
180 ok = 0; 212 if (!dev->sync_mode || command != SEND_SYNCHRONOUS_FIB) {
181 start = jiffies; 213 ok = 0;
214 start = jiffies;
182 215
183 /* 216 /*
184 * Wait up to 30 seconds 217 * Wait up to 5 minutes
185 */
186 while (time_before(jiffies, start+30*HZ)) {
187 /* Delay 5 microseconds to let Mon960 get info. */
188 udelay(5);
189
190 /* Mon960 will set doorbell0 bit
191 * when it has completed the command
192 */ 218 */
193 if ((src_readl(dev, MUnit.ODR_R) >> SRC_ODR_SHIFT) & OUTBOUNDDOORBELL_0) { 219 while (time_before(jiffies, start+300*HZ)) {
194 /* Clear the doorbell */ 220 udelay(5); /* Delay 5 microseconds to let Mon960 get info. */
195 src_writel(dev, 221 /*
196 MUnit.ODR_C, 222 * Mon960 will set doorbell0 bit when it has completed the command.
197 OUTBOUNDDOORBELL_0 << SRC_ODR_SHIFT); 223 */
198 ok = 1; 224 if ((src_readl(dev, MUnit.ODR_R) >> SRC_ODR_SHIFT) & OUTBOUNDDOORBELL_0) {
199 break; 225 /*
226 * Clear the doorbell.
227 */
228 src_writel(dev, MUnit.ODR_C, OUTBOUNDDOORBELL_0 << SRC_ODR_SHIFT);
229 ok = 1;
230 break;
231 }
232 /*
233 * Yield the processor in case we are slow
234 */
235 msleep(1);
200 } 236 }
201 237 if (unlikely(ok != 1)) {
202 /* Yield the processor in case we are slow */ 238 /*
203 msleep(1); 239 * Restore interrupt mask even though we timed out
204 } 240 */
205 if (unlikely(ok != 1)) { 241 aac_adapter_enable_int(dev);
206 /* Restore interrupt mask even though we timed out */ 242 return -ETIMEDOUT;
207 aac_adapter_enable_int(dev); 243 }
208 return -ETIMEDOUT; 244 /*
245 * Pull the synch status from Mailbox 0.
246 */
247 if (status)
248 *status = readl(&dev->IndexRegs->Mailbox[0]);
249 if (r1)
250 *r1 = readl(&dev->IndexRegs->Mailbox[1]);
251 if (r2)
252 *r2 = readl(&dev->IndexRegs->Mailbox[2]);
253 if (r3)
254 *r3 = readl(&dev->IndexRegs->Mailbox[3]);
255 if (r4)
256 *r4 = readl(&dev->IndexRegs->Mailbox[4]);
257
258 /*
259 * Clear the synch command doorbell.
260 */
261 src_writel(dev, MUnit.ODR_C, OUTBOUNDDOORBELL_0 << SRC_ODR_SHIFT);
209 } 262 }
210 263
211 /* Pull the synch status from Mailbox 0 */ 264 /*
212 if (status) 265 * Restore interrupt mask
213 *status = readl(&dev->IndexRegs->Mailbox[0]); 266 */
214 if (r1)
215 *r1 = readl(&dev->IndexRegs->Mailbox[1]);
216 if (r2)
217 *r2 = readl(&dev->IndexRegs->Mailbox[2]);
218 if (r3)
219 *r3 = readl(&dev->IndexRegs->Mailbox[3]);
220 if (r4)
221 *r4 = readl(&dev->IndexRegs->Mailbox[4]);
222
223 /* Clear the synch command doorbell */
224 src_writel(dev, MUnit.ODR_C, OUTBOUNDDOORBELL_0 << SRC_ODR_SHIFT);
225
226 /* Restore interrupt mask */
227 aac_adapter_enable_int(dev); 267 aac_adapter_enable_int(dev);
228 return 0; 268 return 0;
229
230} 269}
231 270
232/** 271/**
@@ -386,9 +425,7 @@ static int aac_src_ioremap(struct aac_dev *dev, u32 size)
386{ 425{
387 if (!size) { 426 if (!size) {
388 iounmap(dev->regs.src.bar0); 427 iounmap(dev->regs.src.bar0);
389 dev->regs.src.bar0 = NULL; 428 dev->base = dev->regs.src.bar0 = NULL;
390 iounmap(dev->base);
391 dev->base = NULL;
392 return 0; 429 return 0;
393 } 430 }
394 dev->regs.src.bar1 = ioremap(pci_resource_start(dev->pdev, 2), 431 dev->regs.src.bar1 = ioremap(pci_resource_start(dev->pdev, 2),
@@ -404,7 +441,27 @@ static int aac_src_ioremap(struct aac_dev *dev, u32 size)
404 return -1; 441 return -1;
405 } 442 }
406 dev->IndexRegs = &((struct src_registers __iomem *) 443 dev->IndexRegs = &((struct src_registers __iomem *)
407 dev->base)->IndexRegs; 444 dev->base)->u.tupelo.IndexRegs;
445 return 0;
446}
447
448/**
449 * aac_srcv_ioremap
450 * @size: mapping resize request
451 *
452 */
453static int aac_srcv_ioremap(struct aac_dev *dev, u32 size)
454{
455 if (!size) {
456 iounmap(dev->regs.src.bar0);
457 dev->base = dev->regs.src.bar0 = NULL;
458 return 0;
459 }
460 dev->base = dev->regs.src.bar0 = ioremap(dev->scsi_host_ptr->base, size);
461 if (dev->base == NULL)
462 return -1;
463 dev->IndexRegs = &((struct src_registers __iomem *)
464 dev->base)->u.denali.IndexRegs;
408 return 0; 465 return 0;
409} 466}
410 467
@@ -419,7 +476,7 @@ static int aac_src_restart_adapter(struct aac_dev *dev, int bled)
419 bled = aac_adapter_sync_cmd(dev, IOP_RESET_ALWAYS, 476 bled = aac_adapter_sync_cmd(dev, IOP_RESET_ALWAYS,
420 0, 0, 0, 0, 0, 0, &var, &reset_mask, NULL, NULL, NULL); 477 0, 0, 0, 0, 0, 0, &var, &reset_mask, NULL, NULL, NULL);
421 if (bled || (var != 0x00000001)) 478 if (bled || (var != 0x00000001))
422 bled = -EINVAL; 479 return -EINVAL;
423 if (dev->supplement_adapter_info.SupportedOptions2 & 480 if (dev->supplement_adapter_info.SupportedOptions2 &
424 AAC_OPTION_DOORBELL_RESET) { 481 AAC_OPTION_DOORBELL_RESET) {
425 src_writel(dev, MUnit.IDR, reset_mask); 482 src_writel(dev, MUnit.IDR, reset_mask);
@@ -579,15 +636,149 @@ int aac_src_init(struct aac_dev *dev)
579 dev->dbg_size = AAC_MIN_SRC_BAR1_SIZE; 636 dev->dbg_size = AAC_MIN_SRC_BAR1_SIZE;
580 637
581 aac_adapter_enable_int(dev); 638 aac_adapter_enable_int(dev);
639
640 if (!dev->sync_mode) {
641 /*
642 * Tell the adapter that all is configured, and it can
643 * start accepting requests
644 */
645 aac_src_start_adapter(dev);
646 }
647 return 0;
648
649error_iounmap:
650
651 return -1;
652}
653
654/**
655 * aac_srcv_init - initialize an SRCv card
656 * @dev: device to configure
657 *
658 */
659
660int aac_srcv_init(struct aac_dev *dev)
661{
662 unsigned long start;
663 unsigned long status;
664 int restart = 0;
665 int instance = dev->id;
666 const char *name = dev->name;
667
668 dev->a_ops.adapter_ioremap = aac_srcv_ioremap;
669 dev->a_ops.adapter_comm = aac_src_select_comm;
670
671 dev->base_size = AAC_MIN_SRCV_BAR0_SIZE;
672 if (aac_adapter_ioremap(dev, dev->base_size)) {
673 printk(KERN_WARNING "%s: unable to map adapter.\n", name);
674 goto error_iounmap;
675 }
676
677 /* Failure to reset here is an option ... */
678 dev->a_ops.adapter_sync_cmd = src_sync_cmd;
679 dev->a_ops.adapter_enable_int = aac_src_disable_interrupt;
680 if ((aac_reset_devices || reset_devices) &&
681 !aac_src_restart_adapter(dev, 0))
682 ++restart;
582 /* 683 /*
583 * Tell the adapter that all is configured, and it can 684 * Check to see if the board panic'd while booting.
584 * start accepting requests
585 */ 685 */
586 aac_src_start_adapter(dev); 686 status = src_readl(dev, MUnit.OMR);
687 if (status & KERNEL_PANIC) {
688 if (aac_src_restart_adapter(dev, aac_src_check_health(dev)))
689 goto error_iounmap;
690 ++restart;
691 }
692 /*
693 * Check to see if the board failed any self tests.
694 */
695 status = src_readl(dev, MUnit.OMR);
696 if (status & SELF_TEST_FAILED) {
697 printk(KERN_ERR "%s%d: adapter self-test failed.\n", dev->name, instance);
698 goto error_iounmap;
699 }
700 /*
701 * Check to see if the monitor panic'd while booting.
702 */
703 if (status & MONITOR_PANIC) {
704 printk(KERN_ERR "%s%d: adapter monitor panic.\n", dev->name, instance);
705 goto error_iounmap;
706 }
707 start = jiffies;
708 /*
709 * Wait for the adapter to be up and running. Wait up to 3 minutes
710 */
711 while (!((status = src_readl(dev, MUnit.OMR)) & KERNEL_UP_AND_RUNNING)) {
712 if ((restart &&
713 (status & (KERNEL_PANIC|SELF_TEST_FAILED|MONITOR_PANIC))) ||
714 time_after(jiffies, start+HZ*startup_timeout)) {
715 printk(KERN_ERR "%s%d: adapter kernel failed to start, init status = %lx.\n",
716 dev->name, instance, status);
717 goto error_iounmap;
718 }
719 if (!restart &&
720 ((status & (KERNEL_PANIC|SELF_TEST_FAILED|MONITOR_PANIC)) ||
721 time_after(jiffies, start + HZ *
722 ((startup_timeout > 60)
723 ? (startup_timeout - 60)
724 : (startup_timeout / 2))))) {
725 if (likely(!aac_src_restart_adapter(dev, aac_src_check_health(dev))))
726 start = jiffies;
727 ++restart;
728 }
729 msleep(1);
730 }
731 if (restart && aac_commit)
732 aac_commit = 1;
733 /*
734 * Fill in the common function dispatch table.
735 */
736 dev->a_ops.adapter_interrupt = aac_src_interrupt_adapter;
737 dev->a_ops.adapter_disable_int = aac_src_disable_interrupt;
738 dev->a_ops.adapter_notify = aac_src_notify_adapter;
739 dev->a_ops.adapter_sync_cmd = src_sync_cmd;
740 dev->a_ops.adapter_check_health = aac_src_check_health;
741 dev->a_ops.adapter_restart = aac_src_restart_adapter;
742
743 /*
744 * First clear out all interrupts. Then enable the one's that we
745 * can handle.
746 */
747 aac_adapter_comm(dev, AAC_COMM_MESSAGE);
748 aac_adapter_disable_int(dev);
749 src_writel(dev, MUnit.ODR_C, 0xffffffff);
750 aac_adapter_enable_int(dev);
587 751
752 if (aac_init_adapter(dev) == NULL)
753 goto error_iounmap;
754 if (dev->comm_interface != AAC_COMM_MESSAGE_TYPE1)
755 goto error_iounmap;
756 dev->msi = aac_msi && !pci_enable_msi(dev->pdev);
757 if (request_irq(dev->pdev->irq, dev->a_ops.adapter_intr,
758 IRQF_SHARED|IRQF_DISABLED, "aacraid", dev) < 0) {
759 if (dev->msi)
760 pci_disable_msi(dev->pdev);
761 printk(KERN_ERR "%s%d: Interrupt unavailable.\n",
762 name, instance);
763 goto error_iounmap;
764 }
765 dev->dbg_base = dev->scsi_host_ptr->base;
766 dev->dbg_base_mapped = dev->base;
767 dev->dbg_size = dev->base_size;
768
769 aac_adapter_enable_int(dev);
770
771 if (!dev->sync_mode) {
772 /*
773 * Tell the adapter that all is configured, and it can
774 * start accepting requests
775 */
776 aac_src_start_adapter(dev);
777 }
588 return 0; 778 return 0;
589 779
590error_iounmap: 780error_iounmap:
591 781
592 return -1; 782 return -1;
593} 783}
784
diff --git a/drivers/scsi/aic94xx/aic94xx.h b/drivers/scsi/aic94xx/aic94xx.h
index 2863a9d22851..66cda669b417 100644
--- a/drivers/scsi/aic94xx/aic94xx.h
+++ b/drivers/scsi/aic94xx/aic94xx.h
@@ -80,6 +80,8 @@ void asd_invalidate_edb(struct asd_ascb *ascb, int edb_id);
80 80
81int asd_execute_task(struct sas_task *, int num, gfp_t gfp_flags); 81int asd_execute_task(struct sas_task *, int num, gfp_t gfp_flags);
82 82
83void asd_set_dmamode(struct domain_device *dev);
84
83/* ---------- TMFs ---------- */ 85/* ---------- TMFs ---------- */
84int asd_abort_task(struct sas_task *); 86int asd_abort_task(struct sas_task *);
85int asd_abort_task_set(struct domain_device *, u8 *lun); 87int asd_abort_task_set(struct domain_device *, u8 *lun);
diff --git a/drivers/scsi/aic94xx/aic94xx_dev.c b/drivers/scsi/aic94xx/aic94xx_dev.c
index 2e2ddec9c0b6..64136c56e706 100644
--- a/drivers/scsi/aic94xx/aic94xx_dev.c
+++ b/drivers/scsi/aic94xx/aic94xx_dev.c
@@ -109,26 +109,37 @@ static int asd_init_sata_tag_ddb(struct domain_device *dev)
109 return 0; 109 return 0;
110} 110}
111 111
112static int asd_init_sata(struct domain_device *dev) 112void asd_set_dmamode(struct domain_device *dev)
113{ 113{
114 struct asd_ha_struct *asd_ha = dev->port->ha->lldd_ha; 114 struct asd_ha_struct *asd_ha = dev->port->ha->lldd_ha;
115 struct ata_device *ata_dev = sas_to_ata_dev(dev);
115 int ddb = (int) (unsigned long) dev->lldd_dev; 116 int ddb = (int) (unsigned long) dev->lldd_dev;
116 u32 qdepth = 0; 117 u32 qdepth = 0;
117 int res = 0;
118 118
119 asd_ddbsite_write_word(asd_ha, ddb, ATA_CMD_SCBPTR, 0xFFFF); 119 if (dev->dev_type == SATA_DEV || dev->dev_type == SATA_PM_PORT) {
120 if ((dev->dev_type == SATA_DEV || dev->dev_type == SATA_PM_PORT) && 120 if (ata_id_has_ncq(ata_dev->id))
121 dev->sata_dev.identify_device && 121 qdepth = ata_id_queue_depth(ata_dev->id);
122 dev->sata_dev.identify_device[10] != 0) {
123 u16 w75 = le16_to_cpu(dev->sata_dev.identify_device[75]);
124 u16 w76 = le16_to_cpu(dev->sata_dev.identify_device[76]);
125
126 if (w76 & 0x100) /* NCQ? */
127 qdepth = (w75 & 0x1F) + 1;
128 asd_ddbsite_write_dword(asd_ha, ddb, SATA_TAG_ALLOC_MASK, 122 asd_ddbsite_write_dword(asd_ha, ddb, SATA_TAG_ALLOC_MASK,
129 (1ULL<<qdepth)-1); 123 (1ULL<<qdepth)-1);
130 asd_ddbsite_write_byte(asd_ha, ddb, NUM_SATA_TAGS, qdepth); 124 asd_ddbsite_write_byte(asd_ha, ddb, NUM_SATA_TAGS, qdepth);
131 } 125 }
126
127 if (qdepth > 0)
128 if (asd_init_sata_tag_ddb(dev) != 0) {
129 unsigned long flags;
130
131 spin_lock_irqsave(dev->sata_dev.ap->lock, flags);
132 ata_dev->flags |= ATA_DFLAG_NCQ_OFF;
133 spin_unlock_irqrestore(dev->sata_dev.ap->lock, flags);
134 }
135}
136
137static int asd_init_sata(struct domain_device *dev)
138{
139 struct asd_ha_struct *asd_ha = dev->port->ha->lldd_ha;
140 int ddb = (int) (unsigned long) dev->lldd_dev;
141
142 asd_ddbsite_write_word(asd_ha, ddb, ATA_CMD_SCBPTR, 0xFFFF);
132 if (dev->dev_type == SATA_DEV || dev->dev_type == SATA_PM || 143 if (dev->dev_type == SATA_DEV || dev->dev_type == SATA_PM ||
133 dev->dev_type == SATA_PM_PORT) { 144 dev->dev_type == SATA_PM_PORT) {
134 struct dev_to_host_fis *fis = (struct dev_to_host_fis *) 145 struct dev_to_host_fis *fis = (struct dev_to_host_fis *)
@@ -136,9 +147,8 @@ static int asd_init_sata(struct domain_device *dev)
136 asd_ddbsite_write_byte(asd_ha, ddb, SATA_STATUS, fis->status); 147 asd_ddbsite_write_byte(asd_ha, ddb, SATA_STATUS, fis->status);
137 } 148 }
138 asd_ddbsite_write_word(asd_ha, ddb, NCQ_DATA_SCB_PTR, 0xFFFF); 149 asd_ddbsite_write_word(asd_ha, ddb, NCQ_DATA_SCB_PTR, 0xFFFF);
139 if (qdepth > 0) 150
140 res = asd_init_sata_tag_ddb(dev); 151 return 0;
141 return res;
142} 152}
143 153
144static int asd_init_target_ddb(struct domain_device *dev) 154static int asd_init_target_ddb(struct domain_device *dev)
diff --git a/drivers/scsi/aic94xx/aic94xx_init.c b/drivers/scsi/aic94xx/aic94xx_init.c
index d5ff142c93a2..ff80552ead84 100644
--- a/drivers/scsi/aic94xx/aic94xx_init.c
+++ b/drivers/scsi/aic94xx/aic94xx_init.c
@@ -68,7 +68,6 @@ static struct scsi_host_template aic94xx_sht = {
68 .queuecommand = sas_queuecommand, 68 .queuecommand = sas_queuecommand,
69 .target_alloc = sas_target_alloc, 69 .target_alloc = sas_target_alloc,
70 .slave_configure = sas_slave_configure, 70 .slave_configure = sas_slave_configure,
71 .slave_destroy = sas_slave_destroy,
72 .scan_finished = asd_scan_finished, 71 .scan_finished = asd_scan_finished,
73 .scan_start = asd_scan_start, 72 .scan_start = asd_scan_start,
74 .change_queue_depth = sas_change_queue_depth, 73 .change_queue_depth = sas_change_queue_depth,
@@ -82,7 +81,6 @@ static struct scsi_host_template aic94xx_sht = {
82 .use_clustering = ENABLE_CLUSTERING, 81 .use_clustering = ENABLE_CLUSTERING,
83 .eh_device_reset_handler = sas_eh_device_reset_handler, 82 .eh_device_reset_handler = sas_eh_device_reset_handler,
84 .eh_bus_reset_handler = sas_eh_bus_reset_handler, 83 .eh_bus_reset_handler = sas_eh_bus_reset_handler,
85 .slave_alloc = sas_slave_alloc,
86 .target_destroy = sas_target_destroy, 84 .target_destroy = sas_target_destroy,
87 .ioctl = sas_ioctl, 85 .ioctl = sas_ioctl,
88}; 86};
@@ -972,7 +970,7 @@ static int asd_scan_finished(struct Scsi_Host *shost, unsigned long time)
972 if (time < HZ) 970 if (time < HZ)
973 return 0; 971 return 0;
974 /* Wait for discovery to finish */ 972 /* Wait for discovery to finish */
975 scsi_flush_work(shost); 973 sas_drain_work(SHOST_TO_SAS_HA(shost));
976 return 1; 974 return 1;
977} 975}
978 976
@@ -1010,6 +1008,8 @@ static struct sas_domain_function_template aic94xx_transport_functions = {
1010 .lldd_clear_nexus_ha = asd_clear_nexus_ha, 1008 .lldd_clear_nexus_ha = asd_clear_nexus_ha,
1011 1009
1012 .lldd_control_phy = asd_control_phy, 1010 .lldd_control_phy = asd_control_phy,
1011
1012 .lldd_ata_set_dmamode = asd_set_dmamode,
1013}; 1013};
1014 1014
1015static const struct pci_device_id aic94xx_pci_table[] __devinitdata = { 1015static const struct pci_device_id aic94xx_pci_table[] __devinitdata = {
diff --git a/drivers/scsi/aic94xx/aic94xx_tmf.c b/drivers/scsi/aic94xx/aic94xx_tmf.c
index 0add73bdf2a4..cf9040933da6 100644
--- a/drivers/scsi/aic94xx/aic94xx_tmf.c
+++ b/drivers/scsi/aic94xx/aic94xx_tmf.c
@@ -181,7 +181,7 @@ static int asd_clear_nexus_I_T(struct domain_device *dev,
181int asd_I_T_nexus_reset(struct domain_device *dev) 181int asd_I_T_nexus_reset(struct domain_device *dev)
182{ 182{
183 int res, tmp_res, i; 183 int res, tmp_res, i;
184 struct sas_phy *phy = sas_find_local_phy(dev); 184 struct sas_phy *phy = sas_get_local_phy(dev);
185 /* Standard mandates link reset for ATA (type 0) and 185 /* Standard mandates link reset for ATA (type 0) and
186 * hard reset for SSP (type 1) */ 186 * hard reset for SSP (type 1) */
187 int reset_type = (dev->dev_type == SATA_DEV || 187 int reset_type = (dev->dev_type == SATA_DEV ||
@@ -192,7 +192,7 @@ int asd_I_T_nexus_reset(struct domain_device *dev)
192 ASD_DPRINTK("sending %s reset to %s\n", 192 ASD_DPRINTK("sending %s reset to %s\n",
193 reset_type ? "hard" : "soft", dev_name(&phy->dev)); 193 reset_type ? "hard" : "soft", dev_name(&phy->dev));
194 res = sas_phy_reset(phy, reset_type); 194 res = sas_phy_reset(phy, reset_type);
195 if (res == TMF_RESP_FUNC_COMPLETE) { 195 if (res == TMF_RESP_FUNC_COMPLETE || res == -ENODEV) {
196 /* wait for the maximum settle time */ 196 /* wait for the maximum settle time */
197 msleep(500); 197 msleep(500);
198 /* clear all outstanding commands (keep nexus suspended) */ 198 /* clear all outstanding commands (keep nexus suspended) */
@@ -201,7 +201,7 @@ int asd_I_T_nexus_reset(struct domain_device *dev)
201 for (i = 0 ; i < 3; i++) { 201 for (i = 0 ; i < 3; i++) {
202 tmp_res = asd_clear_nexus_I_T(dev, NEXUS_PHASE_RESUME); 202 tmp_res = asd_clear_nexus_I_T(dev, NEXUS_PHASE_RESUME);
203 if (tmp_res == TC_RESUME) 203 if (tmp_res == TC_RESUME)
204 return res; 204 goto out;
205 msleep(500); 205 msleep(500);
206 } 206 }
207 207
@@ -211,7 +211,10 @@ int asd_I_T_nexus_reset(struct domain_device *dev)
211 dev_printk(KERN_ERR, &phy->dev, 211 dev_printk(KERN_ERR, &phy->dev,
212 "Failed to resume nexus after reset 0x%x\n", tmp_res); 212 "Failed to resume nexus after reset 0x%x\n", tmp_res);
213 213
214 return TMF_RESP_FUNC_FAILED; 214 res = TMF_RESP_FUNC_FAILED;
215 out:
216 sas_put_local_phy(phy);
217 return res;
215} 218}
216 219
217static int asd_clear_nexus_I_T_L(struct domain_device *dev, u8 *lun) 220static int asd_clear_nexus_I_T_L(struct domain_device *dev, u8 *lun)
diff --git a/drivers/scsi/bfa/bfad_bsg.c b/drivers/scsi/bfa/bfad_bsg.c
index 530de2b1200a..8005c6c5a080 100644
--- a/drivers/scsi/bfa/bfad_bsg.c
+++ b/drivers/scsi/bfa/bfad_bsg.c
@@ -3047,8 +3047,7 @@ bfad_im_bsg_els_ct_request(struct fc_bsg_job *job)
3047 * Allocate buffer for bsg_fcpt and do a copy_from_user op for payload 3047 * Allocate buffer for bsg_fcpt and do a copy_from_user op for payload
3048 * buffer of size bsg_data->payload_len 3048 * buffer of size bsg_data->payload_len
3049 */ 3049 */
3050 bsg_fcpt = (struct bfa_bsg_fcpt_s *) 3050 bsg_fcpt = kzalloc(bsg_data->payload_len, GFP_KERNEL);
3051 kzalloc(bsg_data->payload_len, GFP_KERNEL);
3052 if (!bsg_fcpt) 3051 if (!bsg_fcpt)
3053 goto out; 3052 goto out;
3054 3053
@@ -3060,6 +3059,7 @@ bfad_im_bsg_els_ct_request(struct fc_bsg_job *job)
3060 3059
3061 drv_fcxp = kzalloc(sizeof(struct bfad_fcxp), GFP_KERNEL); 3060 drv_fcxp = kzalloc(sizeof(struct bfad_fcxp), GFP_KERNEL);
3062 if (drv_fcxp == NULL) { 3061 if (drv_fcxp == NULL) {
3062 kfree(bsg_fcpt);
3063 rc = -ENOMEM; 3063 rc = -ENOMEM;
3064 goto out; 3064 goto out;
3065 } 3065 }
diff --git a/drivers/scsi/bnx2fc/bnx2fc.h b/drivers/scsi/bnx2fc/bnx2fc.h
index 049ea907e04a..a4953ef9e53a 100644
--- a/drivers/scsi/bnx2fc/bnx2fc.h
+++ b/drivers/scsi/bnx2fc/bnx2fc.h
@@ -62,7 +62,7 @@
62#include "bnx2fc_constants.h" 62#include "bnx2fc_constants.h"
63 63
64#define BNX2FC_NAME "bnx2fc" 64#define BNX2FC_NAME "bnx2fc"
65#define BNX2FC_VERSION "1.0.9" 65#define BNX2FC_VERSION "1.0.10"
66 66
67#define PFX "bnx2fc: " 67#define PFX "bnx2fc: "
68 68
@@ -114,6 +114,8 @@
114#define BNX2FC_HASH_TBL_CHUNK_SIZE (16 * 1024) 114#define BNX2FC_HASH_TBL_CHUNK_SIZE (16 * 1024)
115 115
116#define BNX2FC_MAX_SEQS 255 116#define BNX2FC_MAX_SEQS 255
117#define BNX2FC_MAX_RETRY_CNT 3
118#define BNX2FC_MAX_RPORT_RETRY_CNT 255
117 119
118#define BNX2FC_READ (1 << 1) 120#define BNX2FC_READ (1 << 1)
119#define BNX2FC_WRITE (1 << 0) 121#define BNX2FC_WRITE (1 << 0)
@@ -121,8 +123,10 @@
121#define BNX2FC_MIN_XID 0 123#define BNX2FC_MIN_XID 0
122#define BNX2FC_MAX_XID \ 124#define BNX2FC_MAX_XID \
123 (BNX2FC_MAX_OUTSTANDING_CMNDS + BNX2FC_ELSTM_XIDS - 1) 125 (BNX2FC_MAX_OUTSTANDING_CMNDS + BNX2FC_ELSTM_XIDS - 1)
126#define FCOE_MAX_NUM_XIDS 0x2000
124#define FCOE_MIN_XID (BNX2FC_MAX_XID + 1) 127#define FCOE_MIN_XID (BNX2FC_MAX_XID + 1)
125#define FCOE_MAX_XID (FCOE_MIN_XID + 4095) 128#define FCOE_MAX_XID (FCOE_MIN_XID + FCOE_MAX_NUM_XIDS - 1)
129#define FCOE_XIDS_PER_CPU (FCOE_MIN_XID + (512 * nr_cpu_ids) - 1)
126#define BNX2FC_MAX_LUN 0xFFFF 130#define BNX2FC_MAX_LUN 0xFFFF
127#define BNX2FC_MAX_FCP_TGT 256 131#define BNX2FC_MAX_FCP_TGT 256
128#define BNX2FC_MAX_CMD_LEN 16 132#define BNX2FC_MAX_CMD_LEN 16
diff --git a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
index a9af42e83632..abd72a01856d 100644
--- a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
+++ b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
@@ -22,7 +22,7 @@ DEFINE_PER_CPU(struct bnx2fc_percpu_s, bnx2fc_percpu);
22 22
23#define DRV_MODULE_NAME "bnx2fc" 23#define DRV_MODULE_NAME "bnx2fc"
24#define DRV_MODULE_VERSION BNX2FC_VERSION 24#define DRV_MODULE_VERSION BNX2FC_VERSION
25#define DRV_MODULE_RELDATE "Oct 21, 2011" 25#define DRV_MODULE_RELDATE "Jan 22, 2011"
26 26
27 27
28static char version[] __devinitdata = 28static char version[] __devinitdata =
@@ -939,8 +939,14 @@ static int bnx2fc_libfc_config(struct fc_lport *lport)
939 939
940static int bnx2fc_em_config(struct fc_lport *lport) 940static int bnx2fc_em_config(struct fc_lport *lport)
941{ 941{
942 int max_xid;
943
944 if (nr_cpu_ids <= 2)
945 max_xid = FCOE_XIDS_PER_CPU;
946 else
947 max_xid = FCOE_MAX_XID;
942 if (!fc_exch_mgr_alloc(lport, FC_CLASS_3, FCOE_MIN_XID, 948 if (!fc_exch_mgr_alloc(lport, FC_CLASS_3, FCOE_MIN_XID,
943 FCOE_MAX_XID, NULL)) { 949 max_xid, NULL)) {
944 printk(KERN_ERR PFX "em_config:fc_exch_mgr_alloc failed\n"); 950 printk(KERN_ERR PFX "em_config:fc_exch_mgr_alloc failed\n");
945 return -ENOMEM; 951 return -ENOMEM;
946 } 952 }
@@ -952,8 +958,8 @@ static int bnx2fc_lport_config(struct fc_lport *lport)
952{ 958{
953 lport->link_up = 0; 959 lport->link_up = 0;
954 lport->qfull = 0; 960 lport->qfull = 0;
955 lport->max_retry_count = 3; 961 lport->max_retry_count = BNX2FC_MAX_RETRY_CNT;
956 lport->max_rport_retry_count = 3; 962 lport->max_rport_retry_count = BNX2FC_MAX_RPORT_RETRY_CNT;
957 lport->e_d_tov = 2 * 1000; 963 lport->e_d_tov = 2 * 1000;
958 lport->r_a_tov = 10 * 1000; 964 lport->r_a_tov = 10 * 1000;
959 965
@@ -1536,6 +1542,7 @@ static void __bnx2fc_destroy(struct bnx2fc_interface *interface)
1536static int bnx2fc_destroy(struct net_device *netdev) 1542static int bnx2fc_destroy(struct net_device *netdev)
1537{ 1543{
1538 struct bnx2fc_interface *interface = NULL; 1544 struct bnx2fc_interface *interface = NULL;
1545 struct workqueue_struct *timer_work_queue;
1539 int rc = 0; 1546 int rc = 0;
1540 1547
1541 rtnl_lock(); 1548 rtnl_lock();
@@ -1548,9 +1555,9 @@ static int bnx2fc_destroy(struct net_device *netdev)
1548 goto netdev_err; 1555 goto netdev_err;
1549 } 1556 }
1550 1557
1551 1558 timer_work_queue = interface->timer_work_queue;
1552 destroy_workqueue(interface->timer_work_queue);
1553 __bnx2fc_destroy(interface); 1559 __bnx2fc_destroy(interface);
1560 destroy_workqueue(timer_work_queue);
1554 1561
1555netdev_err: 1562netdev_err:
1556 mutex_unlock(&bnx2fc_dev_lock); 1563 mutex_unlock(&bnx2fc_dev_lock);
@@ -2054,6 +2061,7 @@ if_create_err:
2054ifput_err: 2061ifput_err:
2055 bnx2fc_net_cleanup(interface); 2062 bnx2fc_net_cleanup(interface);
2056 bnx2fc_interface_put(interface); 2063 bnx2fc_interface_put(interface);
2064 goto mod_err;
2057netdev_err: 2065netdev_err:
2058 module_put(THIS_MODULE); 2066 module_put(THIS_MODULE);
2059mod_err: 2067mod_err:
diff --git a/drivers/scsi/bnx2i/bnx2i_hwi.c b/drivers/scsi/bnx2i/bnx2i_hwi.c
index 1ad0b8225560..f9d6f4129093 100644
--- a/drivers/scsi/bnx2i/bnx2i_hwi.c
+++ b/drivers/scsi/bnx2i/bnx2i_hwi.c
@@ -1312,14 +1312,18 @@ int bnx2i_send_fw_iscsi_init_msg(struct bnx2i_hba *hba)
1312 ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_EXP_DATASN) | 1312 ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_EXP_DATASN) |
1313 /* EMC */ 1313 /* EMC */
1314 (1ULL << ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_LUN)); 1314 (1ULL << ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_LUN));
1315 if (error_mask1) 1315 if (error_mask1) {
1316 iscsi_init2.error_bit_map[0] = error_mask1; 1316 iscsi_init2.error_bit_map[0] = error_mask1;
1317 else 1317 mask64 &= (u32)(~mask64);
1318 mask64 |= error_mask1;
1319 } else
1318 iscsi_init2.error_bit_map[0] = (u32) mask64; 1320 iscsi_init2.error_bit_map[0] = (u32) mask64;
1319 1321
1320 if (error_mask2) 1322 if (error_mask2) {
1321 iscsi_init2.error_bit_map[1] = error_mask2; 1323 iscsi_init2.error_bit_map[1] = error_mask2;
1322 else 1324 mask64 &= 0xffffffff;
1325 mask64 |= ((u64)error_mask2 << 32);
1326 } else
1323 iscsi_init2.error_bit_map[1] = (u32) (mask64 >> 32); 1327 iscsi_init2.error_bit_map[1] = (u32) (mask64 >> 32);
1324 1328
1325 iscsi_error_mask = mask64; 1329 iscsi_error_mask = mask64;
diff --git a/drivers/scsi/bnx2i/bnx2i_init.c b/drivers/scsi/bnx2i/bnx2i_init.c
index 1a947f1b9729..4927cca733d3 100644
--- a/drivers/scsi/bnx2i/bnx2i_init.c
+++ b/drivers/scsi/bnx2i/bnx2i_init.c
@@ -49,11 +49,11 @@ module_param(en_tcp_dack, int, 0664);
49MODULE_PARM_DESC(en_tcp_dack, "Enable TCP Delayed ACK"); 49MODULE_PARM_DESC(en_tcp_dack, "Enable TCP Delayed ACK");
50 50
51unsigned int error_mask1 = 0x00; 51unsigned int error_mask1 = 0x00;
52module_param(error_mask1, int, 0664); 52module_param(error_mask1, uint, 0664);
53MODULE_PARM_DESC(error_mask1, "Config FW iSCSI Error Mask #1"); 53MODULE_PARM_DESC(error_mask1, "Config FW iSCSI Error Mask #1");
54 54
55unsigned int error_mask2 = 0x00; 55unsigned int error_mask2 = 0x00;
56module_param(error_mask2, int, 0664); 56module_param(error_mask2, uint, 0664);
57MODULE_PARM_DESC(error_mask2, "Config FW iSCSI Error Mask #2"); 57MODULE_PARM_DESC(error_mask2, "Config FW iSCSI Error Mask #2");
58 58
59unsigned int sq_size; 59unsigned int sq_size;
@@ -393,8 +393,9 @@ static void bnx2i_percpu_thread_create(unsigned int cpu)
393 393
394 p = &per_cpu(bnx2i_percpu, cpu); 394 p = &per_cpu(bnx2i_percpu, cpu);
395 395
396 thread = kthread_create(bnx2i_percpu_io_thread, (void *)p, 396 thread = kthread_create_on_node(bnx2i_percpu_io_thread, (void *)p,
397 "bnx2i_thread/%d", cpu); 397 cpu_to_node(cpu),
398 "bnx2i_thread/%d", cpu);
398 /* bind thread to the cpu */ 399 /* bind thread to the cpu */
399 if (likely(!IS_ERR(thread))) { 400 if (likely(!IS_ERR(thread))) {
400 kthread_bind(thread, cpu); 401 kthread_bind(thread, cpu);
diff --git a/drivers/scsi/cxgbi/libcxgbi.c b/drivers/scsi/cxgbi/libcxgbi.c
index 89afd6d21d89..d9253db1d0e2 100644
--- a/drivers/scsi/cxgbi/libcxgbi.c
+++ b/drivers/scsi/cxgbi/libcxgbi.c
@@ -2147,11 +2147,10 @@ int cxgbi_set_conn_param(struct iscsi_cls_conn *cls_conn,
2147 enum iscsi_param param, char *buf, int buflen) 2147 enum iscsi_param param, char *buf, int buflen)
2148{ 2148{
2149 struct iscsi_conn *conn = cls_conn->dd_data; 2149 struct iscsi_conn *conn = cls_conn->dd_data;
2150 struct iscsi_session *session = conn->session;
2151 struct iscsi_tcp_conn *tcp_conn = conn->dd_data; 2150 struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
2152 struct cxgbi_conn *cconn = tcp_conn->dd_data; 2151 struct cxgbi_conn *cconn = tcp_conn->dd_data;
2153 struct cxgbi_sock *csk = cconn->cep->csk; 2152 struct cxgbi_sock *csk = cconn->cep->csk;
2154 int value, err = 0; 2153 int err;
2155 2154
2156 log_debug(1 << CXGBI_DBG_ISCSI, 2155 log_debug(1 << CXGBI_DBG_ISCSI,
2157 "cls_conn 0x%p, param %d, buf(%d) %s.\n", 2156 "cls_conn 0x%p, param %d, buf(%d) %s.\n",
@@ -2173,15 +2172,7 @@ int cxgbi_set_conn_param(struct iscsi_cls_conn *cls_conn,
2173 conn->datadgst_en, 0); 2172 conn->datadgst_en, 0);
2174 break; 2173 break;
2175 case ISCSI_PARAM_MAX_R2T: 2174 case ISCSI_PARAM_MAX_R2T:
2176 sscanf(buf, "%d", &value); 2175 return iscsi_tcp_set_max_r2t(conn, buf);
2177 if (value <= 0 || !is_power_of_2(value))
2178 return -EINVAL;
2179 if (session->max_r2t == value)
2180 break;
2181 iscsi_tcp_r2tpool_free(session);
2182 err = iscsi_set_param(cls_conn, param, buf, buflen);
2183 if (!err && iscsi_tcp_r2tpool_alloc(session))
2184 return -ENOMEM;
2185 case ISCSI_PARAM_MAX_RECV_DLENGTH: 2176 case ISCSI_PARAM_MAX_RECV_DLENGTH:
2186 err = iscsi_set_param(cls_conn, param, buf, buflen); 2177 err = iscsi_set_param(cls_conn, param, buf, buflen);
2187 if (!err) 2178 if (!err)
diff --git a/drivers/scsi/fcoe/fcoe.c b/drivers/scsi/fcoe/fcoe.c
index cc75cbea936b..ae7d15c44e2a 100644
--- a/drivers/scsi/fcoe/fcoe.c
+++ b/drivers/scsi/fcoe/fcoe.c
@@ -168,6 +168,14 @@ static struct fc_function_template fcoe_nport_fc_functions = {
168 .show_host_supported_fc4s = 1, 168 .show_host_supported_fc4s = 1,
169 .show_host_active_fc4s = 1, 169 .show_host_active_fc4s = 1,
170 .show_host_maxframe_size = 1, 170 .show_host_maxframe_size = 1,
171 .show_host_serial_number = 1,
172 .show_host_manufacturer = 1,
173 .show_host_model = 1,
174 .show_host_model_description = 1,
175 .show_host_hardware_version = 1,
176 .show_host_driver_version = 1,
177 .show_host_firmware_version = 1,
178 .show_host_optionrom_version = 1,
171 179
172 .show_host_port_id = 1, 180 .show_host_port_id = 1,
173 .show_host_supported_speeds = 1, 181 .show_host_supported_speeds = 1,
@@ -208,6 +216,14 @@ static struct fc_function_template fcoe_vport_fc_functions = {
208 .show_host_supported_fc4s = 1, 216 .show_host_supported_fc4s = 1,
209 .show_host_active_fc4s = 1, 217 .show_host_active_fc4s = 1,
210 .show_host_maxframe_size = 1, 218 .show_host_maxframe_size = 1,
219 .show_host_serial_number = 1,
220 .show_host_manufacturer = 1,
221 .show_host_model = 1,
222 .show_host_model_description = 1,
223 .show_host_hardware_version = 1,
224 .show_host_driver_version = 1,
225 .show_host_firmware_version = 1,
226 .show_host_optionrom_version = 1,
211 227
212 .show_host_port_id = 1, 228 .show_host_port_id = 1,
213 .show_host_supported_speeds = 1, 229 .show_host_supported_speeds = 1,
@@ -364,11 +380,10 @@ static struct fcoe_interface *fcoe_interface_create(struct net_device *netdev,
364 if (!fcoe) { 380 if (!fcoe) {
365 FCOE_NETDEV_DBG(netdev, "Could not allocate fcoe structure\n"); 381 FCOE_NETDEV_DBG(netdev, "Could not allocate fcoe structure\n");
366 fcoe = ERR_PTR(-ENOMEM); 382 fcoe = ERR_PTR(-ENOMEM);
367 goto out_nomod; 383 goto out_putmod;
368 } 384 }
369 385
370 dev_hold(netdev); 386 dev_hold(netdev);
371 kref_init(&fcoe->kref);
372 387
373 /* 388 /*
374 * Initialize FIP. 389 * Initialize FIP.
@@ -384,54 +399,18 @@ static struct fcoe_interface *fcoe_interface_create(struct net_device *netdev,
384 kfree(fcoe); 399 kfree(fcoe);
385 dev_put(netdev); 400 dev_put(netdev);
386 fcoe = ERR_PTR(err); 401 fcoe = ERR_PTR(err);
387 goto out_nomod; 402 goto out_putmod;
388 } 403 }
389 404
390 goto out; 405 goto out;
391 406
392out_nomod: 407out_putmod:
393 module_put(THIS_MODULE); 408 module_put(THIS_MODULE);
394out: 409out:
395 return fcoe; 410 return fcoe;
396} 411}
397 412
398/** 413/**
399 * fcoe_interface_release() - fcoe_port kref release function
400 * @kref: Embedded reference count in an fcoe_interface struct
401 */
402static void fcoe_interface_release(struct kref *kref)
403{
404 struct fcoe_interface *fcoe;
405 struct net_device *netdev;
406
407 fcoe = container_of(kref, struct fcoe_interface, kref);
408 netdev = fcoe->netdev;
409 /* tear-down the FCoE controller */
410 fcoe_ctlr_destroy(&fcoe->ctlr);
411 kfree(fcoe);
412 dev_put(netdev);
413 module_put(THIS_MODULE);
414}
415
416/**
417 * fcoe_interface_get() - Get a reference to a FCoE interface
418 * @fcoe: The FCoE interface to be held
419 */
420static inline void fcoe_interface_get(struct fcoe_interface *fcoe)
421{
422 kref_get(&fcoe->kref);
423}
424
425/**
426 * fcoe_interface_put() - Put a reference to a FCoE interface
427 * @fcoe: The FCoE interface to be released
428 */
429static inline void fcoe_interface_put(struct fcoe_interface *fcoe)
430{
431 kref_put(&fcoe->kref, fcoe_interface_release);
432}
433
434/**
435 * fcoe_interface_cleanup() - Clean up a FCoE interface 414 * fcoe_interface_cleanup() - Clean up a FCoE interface
436 * @fcoe: The FCoE interface to be cleaned up 415 * @fcoe: The FCoE interface to be cleaned up
437 * 416 *
@@ -478,7 +457,11 @@ static void fcoe_interface_cleanup(struct fcoe_interface *fcoe)
478 rtnl_unlock(); 457 rtnl_unlock();
479 458
480 /* Release the self-reference taken during fcoe_interface_create() */ 459 /* Release the self-reference taken during fcoe_interface_create() */
481 fcoe_interface_put(fcoe); 460 /* tear-down the FCoE controller */
461 fcoe_ctlr_destroy(fip);
462 kfree(fcoe);
463 dev_put(netdev);
464 module_put(THIS_MODULE);
482} 465}
483 466
484/** 467/**
@@ -734,6 +717,85 @@ static int fcoe_shost_config(struct fc_lport *lport, struct device *dev)
734 return 0; 717 return 0;
735} 718}
736 719
720
721/**
722 * fcoe_fdmi_info() - Get FDMI related info from net devive for SW FCoE
723 * @lport: The local port that is associated with the net device
724 * @netdev: The associated net device
725 *
726 * Must be called after fcoe_shost_config() as it will use local port mutex
727 *
728 */
729static void fcoe_fdmi_info(struct fc_lport *lport, struct net_device *netdev)
730{
731 struct fcoe_interface *fcoe;
732 struct fcoe_port *port;
733 struct net_device *realdev;
734 int rc;
735 struct netdev_fcoe_hbainfo fdmi;
736
737 port = lport_priv(lport);
738 fcoe = port->priv;
739 realdev = fcoe->realdev;
740
741 if (!realdev)
742 return;
743
744 /* No FDMI state m/c for NPIV ports */
745 if (lport->vport)
746 return;
747
748 if (realdev->netdev_ops->ndo_fcoe_get_hbainfo) {
749 memset(&fdmi, 0, sizeof(fdmi));
750 rc = realdev->netdev_ops->ndo_fcoe_get_hbainfo(realdev,
751 &fdmi);
752 if (rc) {
753 printk(KERN_INFO "fcoe: Failed to retrieve FDMI "
754 "information from netdev.\n");
755 return;
756 }
757
758 snprintf(fc_host_serial_number(lport->host),
759 FC_SERIAL_NUMBER_SIZE,
760 "%s",
761 fdmi.serial_number);
762 snprintf(fc_host_manufacturer(lport->host),
763 FC_SERIAL_NUMBER_SIZE,
764 "%s",
765 fdmi.manufacturer);
766 snprintf(fc_host_model(lport->host),
767 FC_SYMBOLIC_NAME_SIZE,
768 "%s",
769 fdmi.model);
770 snprintf(fc_host_model_description(lport->host),
771 FC_SYMBOLIC_NAME_SIZE,
772 "%s",
773 fdmi.model_description);
774 snprintf(fc_host_hardware_version(lport->host),
775 FC_VERSION_STRING_SIZE,
776 "%s",
777 fdmi.hardware_version);
778 snprintf(fc_host_driver_version(lport->host),
779 FC_VERSION_STRING_SIZE,
780 "%s",
781 fdmi.driver_version);
782 snprintf(fc_host_optionrom_version(lport->host),
783 FC_VERSION_STRING_SIZE,
784 "%s",
785 fdmi.optionrom_version);
786 snprintf(fc_host_firmware_version(lport->host),
787 FC_VERSION_STRING_SIZE,
788 "%s",
789 fdmi.firmware_version);
790
791 /* Enable FDMI lport states */
792 lport->fdmi_enabled = 1;
793 } else {
794 lport->fdmi_enabled = 0;
795 printk(KERN_INFO "fcoe: No FDMI support.\n");
796 }
797}
798
737/** 799/**
738 * fcoe_oem_match() - The match routine for the offloaded exchange manager 800 * fcoe_oem_match() - The match routine for the offloaded exchange manager
739 * @fp: The I/O frame 801 * @fp: The I/O frame
@@ -881,9 +943,6 @@ static void fcoe_if_destroy(struct fc_lport *lport)
881 dev_uc_del(netdev, port->data_src_addr); 943 dev_uc_del(netdev, port->data_src_addr);
882 rtnl_unlock(); 944 rtnl_unlock();
883 945
884 /* Release reference held in fcoe_if_create() */
885 fcoe_interface_put(fcoe);
886
887 /* Free queued packets for the per-CPU receive threads */ 946 /* Free queued packets for the per-CPU receive threads */
888 fcoe_percpu_clean(lport); 947 fcoe_percpu_clean(lport);
889 948
@@ -1047,6 +1106,9 @@ static struct fc_lport *fcoe_if_create(struct fcoe_interface *fcoe,
1047 goto out_lp_destroy; 1106 goto out_lp_destroy;
1048 } 1107 }
1049 1108
1109 /* Initialized FDMI information */
1110 fcoe_fdmi_info(lport, netdev);
1111
1050 /* 1112 /*
1051 * fcoe_em_alloc() and fcoe_hostlist_add() both 1113 * fcoe_em_alloc() and fcoe_hostlist_add() both
1052 * need to be atomic with respect to other changes to the 1114 * need to be atomic with respect to other changes to the
@@ -1070,7 +1132,6 @@ static struct fc_lport *fcoe_if_create(struct fcoe_interface *fcoe,
1070 goto out_lp_destroy; 1132 goto out_lp_destroy;
1071 } 1133 }
1072 1134
1073 fcoe_interface_get(fcoe);
1074 return lport; 1135 return lport;
1075 1136
1076out_lp_destroy: 1137out_lp_destroy:
@@ -2009,20 +2070,13 @@ static void fcoe_destroy_work(struct work_struct *work)
2009{ 2070{
2010 struct fcoe_port *port; 2071 struct fcoe_port *port;
2011 struct fcoe_interface *fcoe; 2072 struct fcoe_interface *fcoe;
2012 int npiv = 0;
2013 2073
2014 port = container_of(work, struct fcoe_port, destroy_work); 2074 port = container_of(work, struct fcoe_port, destroy_work);
2015 mutex_lock(&fcoe_config_mutex); 2075 mutex_lock(&fcoe_config_mutex);
2016 2076
2017 /* set if this is an NPIV port */
2018 npiv = port->lport->vport ? 1 : 0;
2019
2020 fcoe = port->priv; 2077 fcoe = port->priv;
2021 fcoe_if_destroy(port->lport); 2078 fcoe_if_destroy(port->lport);
2022 2079 fcoe_interface_cleanup(fcoe);
2023 /* Do not tear down the fcoe interface for NPIV port */
2024 if (!npiv)
2025 fcoe_interface_cleanup(fcoe);
2026 2080
2027 mutex_unlock(&fcoe_config_mutex); 2081 mutex_unlock(&fcoe_config_mutex);
2028} 2082}
@@ -2593,12 +2647,15 @@ static int fcoe_vport_destroy(struct fc_vport *vport)
2593 struct Scsi_Host *shost = vport_to_shost(vport); 2647 struct Scsi_Host *shost = vport_to_shost(vport);
2594 struct fc_lport *n_port = shost_priv(shost); 2648 struct fc_lport *n_port = shost_priv(shost);
2595 struct fc_lport *vn_port = vport->dd_data; 2649 struct fc_lport *vn_port = vport->dd_data;
2596 struct fcoe_port *port = lport_priv(vn_port);
2597 2650
2598 mutex_lock(&n_port->lp_mutex); 2651 mutex_lock(&n_port->lp_mutex);
2599 list_del(&vn_port->list); 2652 list_del(&vn_port->list);
2600 mutex_unlock(&n_port->lp_mutex); 2653 mutex_unlock(&n_port->lp_mutex);
2601 queue_work(fcoe_wq, &port->destroy_work); 2654
2655 mutex_lock(&fcoe_config_mutex);
2656 fcoe_if_destroy(vn_port);
2657 mutex_unlock(&fcoe_config_mutex);
2658
2602 return 0; 2659 return 0;
2603} 2660}
2604 2661
diff --git a/drivers/scsi/fcoe/fcoe.h b/drivers/scsi/fcoe/fcoe.h
index bcc89e639495..3c2733a12aa1 100644
--- a/drivers/scsi/fcoe/fcoe.h
+++ b/drivers/scsi/fcoe/fcoe.h
@@ -71,8 +71,6 @@ do { \
71 * @ctlr: The FCoE controller (for FIP) 71 * @ctlr: The FCoE controller (for FIP)
72 * @oem: The offload exchange manager for all local port 72 * @oem: The offload exchange manager for all local port
73 * instances associated with this port 73 * instances associated with this port
74 * @kref: The kernel reference
75 *
76 * This structure is 1:1 with a net devive. 74 * This structure is 1:1 with a net devive.
77 */ 75 */
78struct fcoe_interface { 76struct fcoe_interface {
@@ -83,7 +81,6 @@ struct fcoe_interface {
83 struct packet_type fip_packet_type; 81 struct packet_type fip_packet_type;
84 struct fcoe_ctlr ctlr; 82 struct fcoe_ctlr ctlr;
85 struct fc_exch_mgr *oem; 83 struct fc_exch_mgr *oem;
86 struct kref kref;
87}; 84};
88 85
89#define fcoe_from_ctlr(fip) container_of(fip, struct fcoe_interface, ctlr) 86#define fcoe_from_ctlr(fip) container_of(fip, struct fcoe_interface, ctlr)
diff --git a/drivers/scsi/fcoe/fcoe_transport.c b/drivers/scsi/fcoe/fcoe_transport.c
index 4d119a326d3b..710e149d41b6 100644
--- a/drivers/scsi/fcoe/fcoe_transport.c
+++ b/drivers/scsi/fcoe/fcoe_transport.c
@@ -619,8 +619,8 @@ static int libfcoe_device_notification(struct notifier_block *notifier,
619 619
620 switch (event) { 620 switch (event) {
621 case NETDEV_UNREGISTER: 621 case NETDEV_UNREGISTER:
622 printk(KERN_ERR "libfcoe_device_notification: NETDEV_UNREGISTER %s\n", 622 LIBFCOE_TRANSPORT_DBG("NETDEV_UNREGISTER %s\n",
623 netdev->name); 623 netdev->name);
624 fcoe_del_netdev_mapping(netdev); 624 fcoe_del_netdev_mapping(netdev);
625 break; 625 break;
626 } 626 }
diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c
index b96962c39449..500e20dd56ec 100644
--- a/drivers/scsi/hpsa.c
+++ b/drivers/scsi/hpsa.c
@@ -56,6 +56,7 @@
56/* HPSA_DRIVER_VERSION must be 3 byte values (0-255) separated by '.' */ 56/* HPSA_DRIVER_VERSION must be 3 byte values (0-255) separated by '.' */
57#define HPSA_DRIVER_VERSION "2.0.2-1" 57#define HPSA_DRIVER_VERSION "2.0.2-1"
58#define DRIVER_NAME "HP HPSA Driver (v " HPSA_DRIVER_VERSION ")" 58#define DRIVER_NAME "HP HPSA Driver (v " HPSA_DRIVER_VERSION ")"
59#define HPSA "hpsa"
59 60
60/* How long to wait (in milliseconds) for board to go into simple mode */ 61/* How long to wait (in milliseconds) for board to go into simple mode */
61#define MAX_CONFIG_WAIT 30000 62#define MAX_CONFIG_WAIT 30000
@@ -202,30 +203,31 @@ static int check_for_unit_attention(struct ctlr_info *h,
202 203
203 switch (c->err_info->SenseInfo[12]) { 204 switch (c->err_info->SenseInfo[12]) {
204 case STATE_CHANGED: 205 case STATE_CHANGED:
205 dev_warn(&h->pdev->dev, "hpsa%d: a state change " 206 dev_warn(&h->pdev->dev, HPSA "%d: a state change "
206 "detected, command retried\n", h->ctlr); 207 "detected, command retried\n", h->ctlr);
207 break; 208 break;
208 case LUN_FAILED: 209 case LUN_FAILED:
209 dev_warn(&h->pdev->dev, "hpsa%d: LUN failure " 210 dev_warn(&h->pdev->dev, HPSA "%d: LUN failure "
210 "detected, action required\n", h->ctlr); 211 "detected, action required\n", h->ctlr);
211 break; 212 break;
212 case REPORT_LUNS_CHANGED: 213 case REPORT_LUNS_CHANGED:
213 dev_warn(&h->pdev->dev, "hpsa%d: report LUN data " 214 dev_warn(&h->pdev->dev, HPSA "%d: report LUN data "
214 "changed, action required\n", h->ctlr); 215 "changed, action required\n", h->ctlr);
215 /* 216 /*
216 * Note: this REPORT_LUNS_CHANGED condition only occurs on the MSA2012. 217 * Note: this REPORT_LUNS_CHANGED condition only occurs on the external
218 * target (array) devices.
217 */ 219 */
218 break; 220 break;
219 case POWER_OR_RESET: 221 case POWER_OR_RESET:
220 dev_warn(&h->pdev->dev, "hpsa%d: a power on " 222 dev_warn(&h->pdev->dev, HPSA "%d: a power on "
221 "or device reset detected\n", h->ctlr); 223 "or device reset detected\n", h->ctlr);
222 break; 224 break;
223 case UNIT_ATTENTION_CLEARED: 225 case UNIT_ATTENTION_CLEARED:
224 dev_warn(&h->pdev->dev, "hpsa%d: unit attention " 226 dev_warn(&h->pdev->dev, HPSA "%d: unit attention "
225 "cleared by another initiator\n", h->ctlr); 227 "cleared by another initiator\n", h->ctlr);
226 break; 228 break;
227 default: 229 default:
228 dev_warn(&h->pdev->dev, "hpsa%d: unknown " 230 dev_warn(&h->pdev->dev, HPSA "%d: unknown "
229 "unit attention detected\n", h->ctlr); 231 "unit attention detected\n", h->ctlr);
230 break; 232 break;
231 } 233 }
@@ -296,11 +298,23 @@ static u32 unresettable_controller[] = {
296 0x40800E11, /* Smart Array 5i */ 298 0x40800E11, /* Smart Array 5i */
297 0x409C0E11, /* Smart Array 6400 */ 299 0x409C0E11, /* Smart Array 6400 */
298 0x409D0E11, /* Smart Array 6400 EM */ 300 0x409D0E11, /* Smart Array 6400 EM */
301 0x40700E11, /* Smart Array 5300 */
302 0x40820E11, /* Smart Array 532 */
303 0x40830E11, /* Smart Array 5312 */
304 0x409A0E11, /* Smart Array 641 */
305 0x409B0E11, /* Smart Array 642 */
306 0x40910E11, /* Smart Array 6i */
299}; 307};
300 308
301/* List of controllers which cannot even be soft reset */ 309/* List of controllers which cannot even be soft reset */
302static u32 soft_unresettable_controller[] = { 310static u32 soft_unresettable_controller[] = {
303 0x40800E11, /* Smart Array 5i */ 311 0x40800E11, /* Smart Array 5i */
312 0x40700E11, /* Smart Array 5300 */
313 0x40820E11, /* Smart Array 532 */
314 0x40830E11, /* Smart Array 5312 */
315 0x409A0E11, /* Smart Array 641 */
316 0x409B0E11, /* Smart Array 642 */
317 0x40910E11, /* Smart Array 6i */
304 /* Exclude 640x boards. These are two pci devices in one slot 318 /* Exclude 640x boards. These are two pci devices in one slot
305 * which share a battery backed cache module. One controls the 319 * which share a battery backed cache module. One controls the
306 * cache, the other accesses the cache through the one that controls 320 * cache, the other accesses the cache through the one that controls
@@ -475,8 +489,8 @@ static struct device_attribute *hpsa_shost_attrs[] = {
475 489
476static struct scsi_host_template hpsa_driver_template = { 490static struct scsi_host_template hpsa_driver_template = {
477 .module = THIS_MODULE, 491 .module = THIS_MODULE,
478 .name = "hpsa", 492 .name = HPSA,
479 .proc_name = "hpsa", 493 .proc_name = HPSA,
480 .queuecommand = hpsa_scsi_queue_command, 494 .queuecommand = hpsa_scsi_queue_command,
481 .scan_start = hpsa_scan_start, 495 .scan_start = hpsa_scan_start,
482 .scan_finished = hpsa_scan_finished, 496 .scan_finished = hpsa_scan_finished,
@@ -577,21 +591,19 @@ static int hpsa_find_target_lun(struct ctlr_info *h,
577 int i, found = 0; 591 int i, found = 0;
578 DECLARE_BITMAP(lun_taken, HPSA_MAX_DEVICES); 592 DECLARE_BITMAP(lun_taken, HPSA_MAX_DEVICES);
579 593
580 memset(&lun_taken[0], 0, HPSA_MAX_DEVICES >> 3); 594 bitmap_zero(lun_taken, HPSA_MAX_DEVICES);
581 595
582 for (i = 0; i < h->ndevices; i++) { 596 for (i = 0; i < h->ndevices; i++) {
583 if (h->dev[i]->bus == bus && h->dev[i]->target != -1) 597 if (h->dev[i]->bus == bus && h->dev[i]->target != -1)
584 set_bit(h->dev[i]->target, lun_taken); 598 __set_bit(h->dev[i]->target, lun_taken);
585 } 599 }
586 600
587 for (i = 0; i < HPSA_MAX_DEVICES; i++) { 601 i = find_first_zero_bit(lun_taken, HPSA_MAX_DEVICES);
588 if (!test_bit(i, lun_taken)) { 602 if (i < HPSA_MAX_DEVICES) {
589 /* *bus = 1; */ 603 /* *bus = 1; */
590 *target = i; 604 *target = i;
591 *lun = 0; 605 *lun = 0;
592 found = 1; 606 found = 1;
593 break;
594 }
595 } 607 }
596 return !found; 608 return !found;
597} 609}
@@ -675,6 +687,20 @@ lun_assigned:
675 return 0; 687 return 0;
676} 688}
677 689
690/* Update an entry in h->dev[] array. */
691static void hpsa_scsi_update_entry(struct ctlr_info *h, int hostno,
692 int entry, struct hpsa_scsi_dev_t *new_entry)
693{
694 /* assumes h->devlock is held */
695 BUG_ON(entry < 0 || entry >= HPSA_MAX_DEVICES);
696
697 /* Raid level changed. */
698 h->dev[entry]->raid_level = new_entry->raid_level;
699 dev_info(&h->pdev->dev, "%s device c%db%dt%dl%d updated.\n",
700 scsi_device_type(new_entry->devtype), hostno, new_entry->bus,
701 new_entry->target, new_entry->lun);
702}
703
678/* Replace an entry from h->dev[] array. */ 704/* Replace an entry from h->dev[] array. */
679static void hpsa_scsi_replace_entry(struct ctlr_info *h, int hostno, 705static void hpsa_scsi_replace_entry(struct ctlr_info *h, int hostno,
680 int entry, struct hpsa_scsi_dev_t *new_entry, 706 int entry, struct hpsa_scsi_dev_t *new_entry,
@@ -781,10 +807,25 @@ static inline int device_is_the_same(struct hpsa_scsi_dev_t *dev1,
781 return 1; 807 return 1;
782} 808}
783 809
810static inline int device_updated(struct hpsa_scsi_dev_t *dev1,
811 struct hpsa_scsi_dev_t *dev2)
812{
813 /* Device attributes that can change, but don't mean
814 * that the device is a different device, nor that the OS
815 * needs to be told anything about the change.
816 */
817 if (dev1->raid_level != dev2->raid_level)
818 return 1;
819 return 0;
820}
821
784/* Find needle in haystack. If exact match found, return DEVICE_SAME, 822/* Find needle in haystack. If exact match found, return DEVICE_SAME,
785 * and return needle location in *index. If scsi3addr matches, but not 823 * and return needle location in *index. If scsi3addr matches, but not
786 * vendor, model, serial num, etc. return DEVICE_CHANGED, and return needle 824 * vendor, model, serial num, etc. return DEVICE_CHANGED, and return needle
787 * location in *index. If needle not found, return DEVICE_NOT_FOUND. 825 * location in *index.
826 * In the case of a minor device attribute change, such as RAID level, just
827 * return DEVICE_UPDATED, along with the updated device's location in index.
828 * If needle not found, return DEVICE_NOT_FOUND.
788 */ 829 */
789static int hpsa_scsi_find_entry(struct hpsa_scsi_dev_t *needle, 830static int hpsa_scsi_find_entry(struct hpsa_scsi_dev_t *needle,
790 struct hpsa_scsi_dev_t *haystack[], int haystack_size, 831 struct hpsa_scsi_dev_t *haystack[], int haystack_size,
@@ -794,15 +835,19 @@ static int hpsa_scsi_find_entry(struct hpsa_scsi_dev_t *needle,
794#define DEVICE_NOT_FOUND 0 835#define DEVICE_NOT_FOUND 0
795#define DEVICE_CHANGED 1 836#define DEVICE_CHANGED 1
796#define DEVICE_SAME 2 837#define DEVICE_SAME 2
838#define DEVICE_UPDATED 3
797 for (i = 0; i < haystack_size; i++) { 839 for (i = 0; i < haystack_size; i++) {
798 if (haystack[i] == NULL) /* previously removed. */ 840 if (haystack[i] == NULL) /* previously removed. */
799 continue; 841 continue;
800 if (SCSI3ADDR_EQ(needle->scsi3addr, haystack[i]->scsi3addr)) { 842 if (SCSI3ADDR_EQ(needle->scsi3addr, haystack[i]->scsi3addr)) {
801 *index = i; 843 *index = i;
802 if (device_is_the_same(needle, haystack[i])) 844 if (device_is_the_same(needle, haystack[i])) {
845 if (device_updated(needle, haystack[i]))
846 return DEVICE_UPDATED;
803 return DEVICE_SAME; 847 return DEVICE_SAME;
804 else 848 } else {
805 return DEVICE_CHANGED; 849 return DEVICE_CHANGED;
850 }
806 } 851 }
807 } 852 }
808 *index = -1; 853 *index = -1;
@@ -838,6 +883,8 @@ static void adjust_hpsa_scsi_table(struct ctlr_info *h, int hostno,
838 * sd[] and remove them from h->dev[], and for any 883 * sd[] and remove them from h->dev[], and for any
839 * devices which have changed, remove the old device 884 * devices which have changed, remove the old device
840 * info and add the new device info. 885 * info and add the new device info.
886 * If minor device attributes change, just update
887 * the existing device structure.
841 */ 888 */
842 i = 0; 889 i = 0;
843 nremoved = 0; 890 nremoved = 0;
@@ -858,6 +905,8 @@ static void adjust_hpsa_scsi_table(struct ctlr_info *h, int hostno,
858 * at the bottom of hpsa_update_scsi_devices() 905 * at the bottom of hpsa_update_scsi_devices()
859 */ 906 */
860 sd[entry] = NULL; 907 sd[entry] = NULL;
908 } else if (device_change == DEVICE_UPDATED) {
909 hpsa_scsi_update_entry(h, hostno, i, sd[entry]);
861 } 910 }
862 i++; 911 i++;
863 } 912 }
@@ -1257,46 +1306,6 @@ static void complete_scsi_command(struct CommandList *cp)
1257 cmd_free(h, cp); 1306 cmd_free(h, cp);
1258} 1307}
1259 1308
1260static int hpsa_scsi_detect(struct ctlr_info *h)
1261{
1262 struct Scsi_Host *sh;
1263 int error;
1264
1265 sh = scsi_host_alloc(&hpsa_driver_template, sizeof(h));
1266 if (sh == NULL)
1267 goto fail;
1268
1269 sh->io_port = 0;
1270 sh->n_io_port = 0;
1271 sh->this_id = -1;
1272 sh->max_channel = 3;
1273 sh->max_cmd_len = MAX_COMMAND_SIZE;
1274 sh->max_lun = HPSA_MAX_LUN;
1275 sh->max_id = HPSA_MAX_LUN;
1276 sh->can_queue = h->nr_cmds;
1277 sh->cmd_per_lun = h->nr_cmds;
1278 sh->sg_tablesize = h->maxsgentries;
1279 h->scsi_host = sh;
1280 sh->hostdata[0] = (unsigned long) h;
1281 sh->irq = h->intr[h->intr_mode];
1282 sh->unique_id = sh->irq;
1283 error = scsi_add_host(sh, &h->pdev->dev);
1284 if (error)
1285 goto fail_host_put;
1286 scsi_scan_host(sh);
1287 return 0;
1288
1289 fail_host_put:
1290 dev_err(&h->pdev->dev, "hpsa_scsi_detect: scsi_add_host"
1291 " failed for controller %d\n", h->ctlr);
1292 scsi_host_put(sh);
1293 return error;
1294 fail:
1295 dev_err(&h->pdev->dev, "hpsa_scsi_detect: scsi_host_alloc"
1296 " failed for controller %d\n", h->ctlr);
1297 return -ENOMEM;
1298}
1299
1300static void hpsa_pci_unmap(struct pci_dev *pdev, 1309static void hpsa_pci_unmap(struct pci_dev *pdev,
1301 struct CommandList *c, int sg_used, int data_direction) 1310 struct CommandList *c, int sg_used, int data_direction)
1302{ 1311{
@@ -1641,7 +1650,7 @@ bail_out:
1641 return 1; 1650 return 1;
1642} 1651}
1643 1652
1644static unsigned char *msa2xxx_model[] = { 1653static unsigned char *ext_target_model[] = {
1645 "MSA2012", 1654 "MSA2012",
1646 "MSA2024", 1655 "MSA2024",
1647 "MSA2312", 1656 "MSA2312",
@@ -1650,78 +1659,54 @@ static unsigned char *msa2xxx_model[] = {
1650 NULL, 1659 NULL,
1651}; 1660};
1652 1661
1653static int is_msa2xxx(struct ctlr_info *h, struct hpsa_scsi_dev_t *device) 1662static int is_ext_target(struct ctlr_info *h, struct hpsa_scsi_dev_t *device)
1654{ 1663{
1655 int i; 1664 int i;
1656 1665
1657 for (i = 0; msa2xxx_model[i]; i++) 1666 for (i = 0; ext_target_model[i]; i++)
1658 if (strncmp(device->model, msa2xxx_model[i], 1667 if (strncmp(device->model, ext_target_model[i],
1659 strlen(msa2xxx_model[i])) == 0) 1668 strlen(ext_target_model[i])) == 0)
1660 return 1; 1669 return 1;
1661 return 0; 1670 return 0;
1662} 1671}
1663 1672
1664/* Helper function to assign bus, target, lun mapping of devices. 1673/* Helper function to assign bus, target, lun mapping of devices.
1665 * Puts non-msa2xxx logical volumes on bus 0, msa2xxx logical 1674 * Puts non-external target logical volumes on bus 0, external target logical
1666 * volumes on bus 1, physical devices on bus 2. and the hba on bus 3. 1675 * volumes on bus 1, physical devices on bus 2. and the hba on bus 3.
1667 * Logical drive target and lun are assigned at this time, but 1676 * Logical drive target and lun are assigned at this time, but
1668 * physical device lun and target assignment are deferred (assigned 1677 * physical device lun and target assignment are deferred (assigned
1669 * in hpsa_find_target_lun, called by hpsa_scsi_add_entry.) 1678 * in hpsa_find_target_lun, called by hpsa_scsi_add_entry.)
1670 */ 1679 */
1671static void figure_bus_target_lun(struct ctlr_info *h, 1680static void figure_bus_target_lun(struct ctlr_info *h,
1672 u8 *lunaddrbytes, int *bus, int *target, int *lun, 1681 u8 *lunaddrbytes, struct hpsa_scsi_dev_t *device)
1673 struct hpsa_scsi_dev_t *device)
1674{ 1682{
1675 u32 lunid; 1683 u32 lunid = le32_to_cpu(*((__le32 *) lunaddrbytes));
1676 1684
1677 if (is_logical_dev_addr_mode(lunaddrbytes)) { 1685 if (!is_logical_dev_addr_mode(lunaddrbytes)) {
1678 /* logical device */ 1686 /* physical device, target and lun filled in later */
1679 if (unlikely(is_scsi_rev_5(h))) {
1680 /* p1210m, logical drives lun assignments
1681 * match SCSI REPORT LUNS data.
1682 */
1683 lunid = le32_to_cpu(*((__le32 *) lunaddrbytes));
1684 *bus = 0;
1685 *target = 0;
1686 *lun = (lunid & 0x3fff) + 1;
1687 } else {
1688 /* not p1210m... */
1689 lunid = le32_to_cpu(*((__le32 *) lunaddrbytes));
1690 if (is_msa2xxx(h, device)) {
1691 /* msa2xxx way, put logicals on bus 1
1692 * and match target/lun numbers box
1693 * reports.
1694 */
1695 *bus = 1;
1696 *target = (lunid >> 16) & 0x3fff;
1697 *lun = lunid & 0x00ff;
1698 } else {
1699 /* Traditional smart array way. */
1700 *bus = 0;
1701 *lun = 0;
1702 *target = lunid & 0x3fff;
1703 }
1704 }
1705 } else {
1706 /* physical device */
1707 if (is_hba_lunid(lunaddrbytes)) 1687 if (is_hba_lunid(lunaddrbytes))
1708 if (unlikely(is_scsi_rev_5(h))) { 1688 hpsa_set_bus_target_lun(device, 3, 0, lunid & 0x3fff);
1709 *bus = 0; /* put p1210m ctlr at 0,0,0 */
1710 *target = 0;
1711 *lun = 0;
1712 return;
1713 } else
1714 *bus = 3; /* traditional smartarray */
1715 else 1689 else
1716 *bus = 2; /* physical disk */ 1690 /* defer target, lun assignment for physical devices */
1717 *target = -1; 1691 hpsa_set_bus_target_lun(device, 2, -1, -1);
1718 *lun = -1; /* we will fill these in later. */ 1692 return;
1693 }
1694 /* It's a logical device */
1695 if (is_ext_target(h, device)) {
1696 /* external target way, put logicals on bus 1
1697 * and match target/lun numbers box
1698 * reports, other smart array, bus 0, target 0, match lunid
1699 */
1700 hpsa_set_bus_target_lun(device,
1701 1, (lunid >> 16) & 0x3fff, lunid & 0x00ff);
1702 return;
1719 } 1703 }
1704 hpsa_set_bus_target_lun(device, 0, 0, lunid & 0x3fff);
1720} 1705}
1721 1706
1722/* 1707/*
1723 * If there is no lun 0 on a target, linux won't find any devices. 1708 * If there is no lun 0 on a target, linux won't find any devices.
1724 * For the MSA2xxx boxes, we have to manually detect the enclosure 1709 * For the external targets (arrays), we have to manually detect the enclosure
1725 * which is at lun zero, as CCISS_REPORT_PHYSICAL_LUNS doesn't report 1710 * which is at lun zero, as CCISS_REPORT_PHYSICAL_LUNS doesn't report
1726 * it for some reason. *tmpdevice is the target we're adding, 1711 * it for some reason. *tmpdevice is the target we're adding,
1727 * this_device is a pointer into the current element of currentsd[] 1712 * this_device is a pointer into the current element of currentsd[]
@@ -1730,46 +1715,46 @@ static void figure_bus_target_lun(struct ctlr_info *h,
1730 * lun 0 assigned. 1715 * lun 0 assigned.
1731 * Returns 1 if an enclosure was added, 0 if not. 1716 * Returns 1 if an enclosure was added, 0 if not.
1732 */ 1717 */
1733static int add_msa2xxx_enclosure_device(struct ctlr_info *h, 1718static int add_ext_target_dev(struct ctlr_info *h,
1734 struct hpsa_scsi_dev_t *tmpdevice, 1719 struct hpsa_scsi_dev_t *tmpdevice,
1735 struct hpsa_scsi_dev_t *this_device, u8 *lunaddrbytes, 1720 struct hpsa_scsi_dev_t *this_device, u8 *lunaddrbytes,
1736 int bus, int target, int lun, unsigned long lunzerobits[], 1721 unsigned long lunzerobits[], int *n_ext_target_devs)
1737 int *nmsa2xxx_enclosures)
1738{ 1722{
1739 unsigned char scsi3addr[8]; 1723 unsigned char scsi3addr[8];
1740 1724
1741 if (test_bit(target, lunzerobits)) 1725 if (test_bit(tmpdevice->target, lunzerobits))
1742 return 0; /* There is already a lun 0 on this target. */ 1726 return 0; /* There is already a lun 0 on this target. */
1743 1727
1744 if (!is_logical_dev_addr_mode(lunaddrbytes)) 1728 if (!is_logical_dev_addr_mode(lunaddrbytes))
1745 return 0; /* It's the logical targets that may lack lun 0. */ 1729 return 0; /* It's the logical targets that may lack lun 0. */
1746 1730
1747 if (!is_msa2xxx(h, tmpdevice)) 1731 if (!is_ext_target(h, tmpdevice))
1748 return 0; /* It's only the MSA2xxx that have this problem. */ 1732 return 0; /* Only external target devices have this problem. */
1749 1733
1750 if (lun == 0) /* if lun is 0, then obviously we have a lun 0. */ 1734 if (tmpdevice->lun == 0) /* if lun is 0, then we have a lun 0. */
1751 return 0; 1735 return 0;
1752 1736
1753 memset(scsi3addr, 0, 8); 1737 memset(scsi3addr, 0, 8);
1754 scsi3addr[3] = target; 1738 scsi3addr[3] = tmpdevice->target;
1755 if (is_hba_lunid(scsi3addr)) 1739 if (is_hba_lunid(scsi3addr))
1756 return 0; /* Don't add the RAID controller here. */ 1740 return 0; /* Don't add the RAID controller here. */
1757 1741
1758 if (is_scsi_rev_5(h)) 1742 if (is_scsi_rev_5(h))
1759 return 0; /* p1210m doesn't need to do this. */ 1743 return 0; /* p1210m doesn't need to do this. */
1760 1744
1761 if (*nmsa2xxx_enclosures >= MAX_MSA2XXX_ENCLOSURES) { 1745 if (*n_ext_target_devs >= MAX_EXT_TARGETS) {
1762 dev_warn(&h->pdev->dev, "Maximum number of MSA2XXX " 1746 dev_warn(&h->pdev->dev, "Maximum number of external "
1763 "enclosures exceeded. Check your hardware " 1747 "target devices exceeded. Check your hardware "
1764 "configuration."); 1748 "configuration.");
1765 return 0; 1749 return 0;
1766 } 1750 }
1767 1751
1768 if (hpsa_update_device_info(h, scsi3addr, this_device, NULL)) 1752 if (hpsa_update_device_info(h, scsi3addr, this_device, NULL))
1769 return 0; 1753 return 0;
1770 (*nmsa2xxx_enclosures)++; 1754 (*n_ext_target_devs)++;
1771 hpsa_set_bus_target_lun(this_device, bus, target, 0); 1755 hpsa_set_bus_target_lun(this_device,
1772 set_bit(target, lunzerobits); 1756 tmpdevice->bus, tmpdevice->target, 0);
1757 set_bit(tmpdevice->target, lunzerobits);
1773 return 1; 1758 return 1;
1774} 1759}
1775 1760
@@ -1863,10 +1848,9 @@ static void hpsa_update_scsi_devices(struct ctlr_info *h, int hostno)
1863 struct hpsa_scsi_dev_t **currentsd, *this_device, *tmpdevice; 1848 struct hpsa_scsi_dev_t **currentsd, *this_device, *tmpdevice;
1864 int ncurrent = 0; 1849 int ncurrent = 0;
1865 int reportlunsize = sizeof(*physdev_list) + HPSA_MAX_PHYS_LUN * 8; 1850 int reportlunsize = sizeof(*physdev_list) + HPSA_MAX_PHYS_LUN * 8;
1866 int i, nmsa2xxx_enclosures, ndevs_to_allocate; 1851 int i, n_ext_target_devs, ndevs_to_allocate;
1867 int bus, target, lun;
1868 int raid_ctlr_position; 1852 int raid_ctlr_position;
1869 DECLARE_BITMAP(lunzerobits, HPSA_MAX_TARGETS_PER_CTLR); 1853 DECLARE_BITMAP(lunzerobits, MAX_EXT_TARGETS);
1870 1854
1871 currentsd = kzalloc(sizeof(*currentsd) * HPSA_MAX_DEVICES, GFP_KERNEL); 1855 currentsd = kzalloc(sizeof(*currentsd) * HPSA_MAX_DEVICES, GFP_KERNEL);
1872 physdev_list = kzalloc(reportlunsize, GFP_KERNEL); 1856 physdev_list = kzalloc(reportlunsize, GFP_KERNEL);
@@ -1883,11 +1867,11 @@ static void hpsa_update_scsi_devices(struct ctlr_info *h, int hostno)
1883 logdev_list, &nlogicals)) 1867 logdev_list, &nlogicals))
1884 goto out; 1868 goto out;
1885 1869
1886 /* We might see up to 32 MSA2xxx enclosures, actually 8 of them 1870 /* We might see up to the maximum number of logical and physical disks
1887 * but each of them 4 times through different paths. The plus 1 1871 * plus external target devices, and a device for the local RAID
1888 * is for the RAID controller. 1872 * controller.
1889 */ 1873 */
1890 ndevs_to_allocate = nphysicals + nlogicals + MAX_MSA2XXX_ENCLOSURES + 1; 1874 ndevs_to_allocate = nphysicals + nlogicals + MAX_EXT_TARGETS + 1;
1891 1875
1892 /* Allocate the per device structures */ 1876 /* Allocate the per device structures */
1893 for (i = 0; i < ndevs_to_allocate; i++) { 1877 for (i = 0; i < ndevs_to_allocate; i++) {
@@ -1913,7 +1897,7 @@ static void hpsa_update_scsi_devices(struct ctlr_info *h, int hostno)
1913 raid_ctlr_position = nphysicals + nlogicals; 1897 raid_ctlr_position = nphysicals + nlogicals;
1914 1898
1915 /* adjust our table of devices */ 1899 /* adjust our table of devices */
1916 nmsa2xxx_enclosures = 0; 1900 n_ext_target_devs = 0;
1917 for (i = 0; i < nphysicals + nlogicals + 1; i++) { 1901 for (i = 0; i < nphysicals + nlogicals + 1; i++) {
1918 u8 *lunaddrbytes, is_OBDR = 0; 1902 u8 *lunaddrbytes, is_OBDR = 0;
1919 1903
@@ -1929,26 +1913,24 @@ static void hpsa_update_scsi_devices(struct ctlr_info *h, int hostno)
1929 if (hpsa_update_device_info(h, lunaddrbytes, tmpdevice, 1913 if (hpsa_update_device_info(h, lunaddrbytes, tmpdevice,
1930 &is_OBDR)) 1914 &is_OBDR))
1931 continue; /* skip it if we can't talk to it. */ 1915 continue; /* skip it if we can't talk to it. */
1932 figure_bus_target_lun(h, lunaddrbytes, &bus, &target, &lun, 1916 figure_bus_target_lun(h, lunaddrbytes, tmpdevice);
1933 tmpdevice);
1934 this_device = currentsd[ncurrent]; 1917 this_device = currentsd[ncurrent];
1935 1918
1936 /* 1919 /*
1937 * For the msa2xxx boxes, we have to insert a LUN 0 which 1920 * For external target devices, we have to insert a LUN 0 which
1938 * doesn't show up in CCISS_REPORT_PHYSICAL data, but there 1921 * doesn't show up in CCISS_REPORT_PHYSICAL data, but there
1939 * is nonetheless an enclosure device there. We have to 1922 * is nonetheless an enclosure device there. We have to
1940 * present that otherwise linux won't find anything if 1923 * present that otherwise linux won't find anything if
1941 * there is no lun 0. 1924 * there is no lun 0.
1942 */ 1925 */
1943 if (add_msa2xxx_enclosure_device(h, tmpdevice, this_device, 1926 if (add_ext_target_dev(h, tmpdevice, this_device,
1944 lunaddrbytes, bus, target, lun, lunzerobits, 1927 lunaddrbytes, lunzerobits,
1945 &nmsa2xxx_enclosures)) { 1928 &n_ext_target_devs)) {
1946 ncurrent++; 1929 ncurrent++;
1947 this_device = currentsd[ncurrent]; 1930 this_device = currentsd[ncurrent];
1948 } 1931 }
1949 1932
1950 *this_device = *tmpdevice; 1933 *this_device = *tmpdevice;
1951 hpsa_set_bus_target_lun(this_device, bus, target, lun);
1952 1934
1953 switch (this_device->devtype) { 1935 switch (this_device->devtype) {
1954 case TYPE_ROM: 1936 case TYPE_ROM:
@@ -2228,13 +2210,42 @@ static void hpsa_unregister_scsi(struct ctlr_info *h)
2228 2210
2229static int hpsa_register_scsi(struct ctlr_info *h) 2211static int hpsa_register_scsi(struct ctlr_info *h)
2230{ 2212{
2231 int rc; 2213 struct Scsi_Host *sh;
2214 int error;
2232 2215
2233 rc = hpsa_scsi_detect(h); 2216 sh = scsi_host_alloc(&hpsa_driver_template, sizeof(h));
2234 if (rc != 0) 2217 if (sh == NULL)
2235 dev_err(&h->pdev->dev, "hpsa_register_scsi: failed" 2218 goto fail;
2236 " hpsa_scsi_detect(), rc is %d\n", rc); 2219
2237 return rc; 2220 sh->io_port = 0;
2221 sh->n_io_port = 0;
2222 sh->this_id = -1;
2223 sh->max_channel = 3;
2224 sh->max_cmd_len = MAX_COMMAND_SIZE;
2225 sh->max_lun = HPSA_MAX_LUN;
2226 sh->max_id = HPSA_MAX_LUN;
2227 sh->can_queue = h->nr_cmds;
2228 sh->cmd_per_lun = h->nr_cmds;
2229 sh->sg_tablesize = h->maxsgentries;
2230 h->scsi_host = sh;
2231 sh->hostdata[0] = (unsigned long) h;
2232 sh->irq = h->intr[h->intr_mode];
2233 sh->unique_id = sh->irq;
2234 error = scsi_add_host(sh, &h->pdev->dev);
2235 if (error)
2236 goto fail_host_put;
2237 scsi_scan_host(sh);
2238 return 0;
2239
2240 fail_host_put:
2241 dev_err(&h->pdev->dev, "%s: scsi_add_host"
2242 " failed for controller %d\n", __func__, h->ctlr);
2243 scsi_host_put(sh);
2244 return error;
2245 fail:
2246 dev_err(&h->pdev->dev, "%s: scsi_host_alloc"
2247 " failed for controller %d\n", __func__, h->ctlr);
2248 return -ENOMEM;
2238} 2249}
2239 2250
2240static int wait_for_device_to_become_ready(struct ctlr_info *h, 2251static int wait_for_device_to_become_ready(struct ctlr_info *h,
@@ -2700,16 +2711,16 @@ static int hpsa_big_passthru_ioctl(struct ctlr_info *h, void __user *argp)
2700 status = -EINVAL; 2711 status = -EINVAL;
2701 goto cleanup1; 2712 goto cleanup1;
2702 } 2713 }
2703 if (ioc->buf_size > ioc->malloc_size * MAXSGENTRIES) { 2714 if (ioc->buf_size > ioc->malloc_size * SG_ENTRIES_IN_CMD) {
2704 status = -EINVAL; 2715 status = -EINVAL;
2705 goto cleanup1; 2716 goto cleanup1;
2706 } 2717 }
2707 buff = kzalloc(MAXSGENTRIES * sizeof(char *), GFP_KERNEL); 2718 buff = kzalloc(SG_ENTRIES_IN_CMD * sizeof(char *), GFP_KERNEL);
2708 if (!buff) { 2719 if (!buff) {
2709 status = -ENOMEM; 2720 status = -ENOMEM;
2710 goto cleanup1; 2721 goto cleanup1;
2711 } 2722 }
2712 buff_size = kmalloc(MAXSGENTRIES * sizeof(int), GFP_KERNEL); 2723 buff_size = kmalloc(SG_ENTRIES_IN_CMD * sizeof(int), GFP_KERNEL);
2713 if (!buff_size) { 2724 if (!buff_size) {
2714 status = -ENOMEM; 2725 status = -ENOMEM;
2715 goto cleanup1; 2726 goto cleanup1;
@@ -3354,7 +3365,7 @@ static int hpsa_controller_hard_reset(struct pci_dev *pdev,
3354static __devinit void init_driver_version(char *driver_version, int len) 3365static __devinit void init_driver_version(char *driver_version, int len)
3355{ 3366{
3356 memset(driver_version, 0, len); 3367 memset(driver_version, 0, len);
3357 strncpy(driver_version, "hpsa " HPSA_DRIVER_VERSION, len - 1); 3368 strncpy(driver_version, HPSA " " HPSA_DRIVER_VERSION, len - 1);
3358} 3369}
3359 3370
3360static __devinit int write_driver_ver_to_cfgtable( 3371static __devinit int write_driver_ver_to_cfgtable(
@@ -3935,7 +3946,7 @@ static int __devinit hpsa_pci_init(struct ctlr_info *h)
3935 return err; 3946 return err;
3936 } 3947 }
3937 3948
3938 err = pci_request_regions(h->pdev, "hpsa"); 3949 err = pci_request_regions(h->pdev, HPSA);
3939 if (err) { 3950 if (err) {
3940 dev_err(&h->pdev->dev, 3951 dev_err(&h->pdev->dev,
3941 "cannot obtain PCI resources, aborting\n"); 3952 "cannot obtain PCI resources, aborting\n");
@@ -4253,7 +4264,7 @@ static void start_controller_lockup_detector(struct ctlr_info *h)
4253 spin_lock_init(&lockup_detector_lock); 4264 spin_lock_init(&lockup_detector_lock);
4254 hpsa_lockup_detector = 4265 hpsa_lockup_detector =
4255 kthread_run(detect_controller_lockup_thread, 4266 kthread_run(detect_controller_lockup_thread,
4256 NULL, "hpsa"); 4267 NULL, HPSA);
4257 } 4268 }
4258 if (!hpsa_lockup_detector) { 4269 if (!hpsa_lockup_detector) {
4259 dev_warn(&h->pdev->dev, 4270 dev_warn(&h->pdev->dev,
@@ -4325,7 +4336,7 @@ reinit_after_soft_reset:
4325 if (rc != 0) 4336 if (rc != 0)
4326 goto clean1; 4337 goto clean1;
4327 4338
4328 sprintf(h->devname, "hpsa%d", number_of_controllers); 4339 sprintf(h->devname, HPSA "%d", number_of_controllers);
4329 h->ctlr = number_of_controllers; 4340 h->ctlr = number_of_controllers;
4330 number_of_controllers++; 4341 number_of_controllers++;
4331 4342
@@ -4482,6 +4493,14 @@ static void hpsa_shutdown(struct pci_dev *pdev)
4482#endif /* CONFIG_PCI_MSI */ 4493#endif /* CONFIG_PCI_MSI */
4483} 4494}
4484 4495
4496static void __devexit hpsa_free_device_info(struct ctlr_info *h)
4497{
4498 int i;
4499
4500 for (i = 0; i < h->ndevices; i++)
4501 kfree(h->dev[i]);
4502}
4503
4485static void __devexit hpsa_remove_one(struct pci_dev *pdev) 4504static void __devexit hpsa_remove_one(struct pci_dev *pdev)
4486{ 4505{
4487 struct ctlr_info *h; 4506 struct ctlr_info *h;
@@ -4497,6 +4516,7 @@ static void __devexit hpsa_remove_one(struct pci_dev *pdev)
4497 iounmap(h->vaddr); 4516 iounmap(h->vaddr);
4498 iounmap(h->transtable); 4517 iounmap(h->transtable);
4499 iounmap(h->cfgtable); 4518 iounmap(h->cfgtable);
4519 hpsa_free_device_info(h);
4500 hpsa_free_sg_chain_blocks(h); 4520 hpsa_free_sg_chain_blocks(h);
4501 pci_free_consistent(h->pdev, 4521 pci_free_consistent(h->pdev,
4502 h->nr_cmds * sizeof(struct CommandList), 4522 h->nr_cmds * sizeof(struct CommandList),
@@ -4530,7 +4550,7 @@ static int hpsa_resume(__attribute__((unused)) struct pci_dev *pdev)
4530} 4550}
4531 4551
4532static struct pci_driver hpsa_pci_driver = { 4552static struct pci_driver hpsa_pci_driver = {
4533 .name = "hpsa", 4553 .name = HPSA,
4534 .probe = hpsa_init_one, 4554 .probe = hpsa_init_one,
4535 .remove = __devexit_p(hpsa_remove_one), 4555 .remove = __devexit_p(hpsa_remove_one),
4536 .id_table = hpsa_pci_device_id, /* id_table */ 4556 .id_table = hpsa_pci_device_id, /* id_table */
@@ -4592,15 +4612,15 @@ static __devinit void hpsa_enter_performant_mode(struct ctlr_info *h,
4592 * Each SG entry requires 16 bytes. The eight registers are programmed 4612 * Each SG entry requires 16 bytes. The eight registers are programmed
4593 * with the number of 16-byte blocks a command of that size requires. 4613 * with the number of 16-byte blocks a command of that size requires.
4594 * The smallest command possible requires 5 such 16 byte blocks. 4614 * The smallest command possible requires 5 such 16 byte blocks.
4595 * the largest command possible requires MAXSGENTRIES + 4 16-byte 4615 * the largest command possible requires SG_ENTRIES_IN_CMD + 4 16-byte
4596 * blocks. Note, this only extends to the SG entries contained 4616 * blocks. Note, this only extends to the SG entries contained
4597 * within the command block, and does not extend to chained blocks 4617 * within the command block, and does not extend to chained blocks
4598 * of SG elements. bft[] contains the eight values we write to 4618 * of SG elements. bft[] contains the eight values we write to
4599 * the registers. They are not evenly distributed, but have more 4619 * the registers. They are not evenly distributed, but have more
4600 * sizes for small commands, and fewer sizes for larger commands. 4620 * sizes for small commands, and fewer sizes for larger commands.
4601 */ 4621 */
4602 int bft[8] = {5, 6, 8, 10, 12, 20, 28, MAXSGENTRIES + 4}; 4622 int bft[8] = {5, 6, 8, 10, 12, 20, 28, SG_ENTRIES_IN_CMD + 4};
4603 BUILD_BUG_ON(28 > MAXSGENTRIES + 4); 4623 BUILD_BUG_ON(28 > SG_ENTRIES_IN_CMD + 4);
4604 /* 5 = 1 s/g entry or 4k 4624 /* 5 = 1 s/g entry or 4k
4605 * 6 = 2 s/g entry or 8k 4625 * 6 = 2 s/g entry or 8k
4606 * 8 = 4 s/g entry or 16k 4626 * 8 = 4 s/g entry or 16k
@@ -4613,8 +4633,9 @@ static __devinit void hpsa_enter_performant_mode(struct ctlr_info *h,
4613 memset(h->reply_pool, 0, h->reply_pool_size); 4633 memset(h->reply_pool, 0, h->reply_pool_size);
4614 h->reply_pool_head = h->reply_pool; 4634 h->reply_pool_head = h->reply_pool;
4615 4635
4616 bft[7] = h->max_sg_entries + 4; 4636 bft[7] = SG_ENTRIES_IN_CMD + 4;
4617 calc_bucket_map(bft, ARRAY_SIZE(bft), 32, h->blockFetchTable); 4637 calc_bucket_map(bft, ARRAY_SIZE(bft),
4638 SG_ENTRIES_IN_CMD, h->blockFetchTable);
4618 for (i = 0; i < 8; i++) 4639 for (i = 0; i < 8; i++)
4619 writel(bft[i], &h->transtable->BlockFetch[i]); 4640 writel(bft[i], &h->transtable->BlockFetch[i]);
4620 4641
@@ -4652,14 +4673,13 @@ static __devinit void hpsa_put_ctlr_into_performant_mode(struct ctlr_info *h)
4652 return; 4673 return;
4653 4674
4654 hpsa_get_max_perf_mode_cmds(h); 4675 hpsa_get_max_perf_mode_cmds(h);
4655 h->max_sg_entries = 32;
4656 /* Performant mode ring buffer and supporting data structures */ 4676 /* Performant mode ring buffer and supporting data structures */
4657 h->reply_pool_size = h->max_commands * sizeof(u64); 4677 h->reply_pool_size = h->max_commands * sizeof(u64);
4658 h->reply_pool = pci_alloc_consistent(h->pdev, h->reply_pool_size, 4678 h->reply_pool = pci_alloc_consistent(h->pdev, h->reply_pool_size,
4659 &(h->reply_pool_dhandle)); 4679 &(h->reply_pool_dhandle));
4660 4680
4661 /* Need a block fetch table for performant mode */ 4681 /* Need a block fetch table for performant mode */
4662 h->blockFetchTable = kmalloc(((h->max_sg_entries+1) * 4682 h->blockFetchTable = kmalloc(((SG_ENTRIES_IN_CMD + 1) *
4663 sizeof(u32)), GFP_KERNEL); 4683 sizeof(u32)), GFP_KERNEL);
4664 4684
4665 if ((h->reply_pool == NULL) 4685 if ((h->reply_pool == NULL)
diff --git a/drivers/scsi/hpsa.h b/drivers/scsi/hpsa.h
index 91edafb8c7e6..7b28d54fa878 100644
--- a/drivers/scsi/hpsa.h
+++ b/drivers/scsi/hpsa.h
@@ -58,7 +58,6 @@ struct ctlr_info {
58 unsigned long paddr; 58 unsigned long paddr;
59 int nr_cmds; /* Number of commands allowed on this controller */ 59 int nr_cmds; /* Number of commands allowed on this controller */
60 struct CfgTable __iomem *cfgtable; 60 struct CfgTable __iomem *cfgtable;
61 int max_sg_entries;
62 int interrupts_enabled; 61 int interrupts_enabled;
63 int major; 62 int major;
64 int max_commands; 63 int max_commands;
@@ -317,7 +316,7 @@ static unsigned long SA5_completed(struct ctlr_info *h)
317 dev_dbg(&h->pdev->dev, "Read %lx back from board\n", 316 dev_dbg(&h->pdev->dev, "Read %lx back from board\n",
318 register_value); 317 register_value);
319 else 318 else
320 dev_dbg(&h->pdev->dev, "hpsa: FIFO Empty read\n"); 319 dev_dbg(&h->pdev->dev, "FIFO Empty read\n");
321#endif 320#endif
322 321
323 return register_value; 322 return register_value;
diff --git a/drivers/scsi/hpsa_cmd.h b/drivers/scsi/hpsa_cmd.h
index 3fd4715935c2..8049815d8c1e 100644
--- a/drivers/scsi/hpsa_cmd.h
+++ b/drivers/scsi/hpsa_cmd.h
@@ -23,7 +23,7 @@
23 23
24/* general boundary defintions */ 24/* general boundary defintions */
25#define SENSEINFOBYTES 32 /* may vary between hbas */ 25#define SENSEINFOBYTES 32 /* may vary between hbas */
26#define MAXSGENTRIES 32 26#define SG_ENTRIES_IN_CMD 32 /* Max SG entries excluding chain blocks */
27#define HPSA_SG_CHAIN 0x80000000 27#define HPSA_SG_CHAIN 0x80000000
28#define MAXREPLYQS 256 28#define MAXREPLYQS 256
29 29
@@ -122,12 +122,11 @@ union u64bit {
122}; 122};
123 123
124/* FIXME this is a per controller value (barf!) */ 124/* FIXME this is a per controller value (barf!) */
125#define HPSA_MAX_TARGETS_PER_CTLR 16
126#define HPSA_MAX_LUN 1024 125#define HPSA_MAX_LUN 1024
127#define HPSA_MAX_PHYS_LUN 1024 126#define HPSA_MAX_PHYS_LUN 1024
128#define MAX_MSA2XXX_ENCLOSURES 32 127#define MAX_EXT_TARGETS 32
129#define HPSA_MAX_DEVICES (HPSA_MAX_PHYS_LUN + HPSA_MAX_LUN + \ 128#define HPSA_MAX_DEVICES (HPSA_MAX_PHYS_LUN + HPSA_MAX_LUN + \
130 MAX_MSA2XXX_ENCLOSURES + 1) /* + 1 is for the controller itself */ 129 MAX_EXT_TARGETS + 1) /* + 1 is for the controller itself */
131 130
132/* SCSI-3 Commands */ 131/* SCSI-3 Commands */
133#pragma pack(1) 132#pragma pack(1)
@@ -282,7 +281,7 @@ struct CommandList {
282 struct CommandListHeader Header; 281 struct CommandListHeader Header;
283 struct RequestBlock Request; 282 struct RequestBlock Request;
284 struct ErrDescriptor ErrDesc; 283 struct ErrDescriptor ErrDesc;
285 struct SGDescriptor SG[MAXSGENTRIES]; 284 struct SGDescriptor SG[SG_ENTRIES_IN_CMD];
286 /* information associated with the command */ 285 /* information associated with the command */
287 u32 busaddr; /* physical addr of this record */ 286 u32 busaddr; /* physical addr of this record */
288 struct ErrorInfo *err_info; /* pointer to the allocated mem */ 287 struct ErrorInfo *err_info; /* pointer to the allocated mem */
diff --git a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c
index b538f0883fd2..cdfe5a16de2a 100644
--- a/drivers/scsi/ipr.c
+++ b/drivers/scsi/ipr.c
@@ -183,7 +183,7 @@ static const struct ipr_chip_t ipr_chip[] = {
183 { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_SNIPE, IPR_USE_LSI, IPR_SIS32, IPR_PCI_CFG, &ipr_chip_cfg[1] }, 183 { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_SNIPE, IPR_USE_LSI, IPR_SIS32, IPR_PCI_CFG, &ipr_chip_cfg[1] },
184 { PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_SCAMP, IPR_USE_LSI, IPR_SIS32, IPR_PCI_CFG, &ipr_chip_cfg[1] }, 184 { PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_SCAMP, IPR_USE_LSI, IPR_SIS32, IPR_PCI_CFG, &ipr_chip_cfg[1] },
185 { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CROC_FPGA_E2, IPR_USE_MSI, IPR_SIS64, IPR_MMIO, &ipr_chip_cfg[2] }, 185 { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CROC_FPGA_E2, IPR_USE_MSI, IPR_SIS64, IPR_MMIO, &ipr_chip_cfg[2] },
186 { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CROC_ASIC_E2, IPR_USE_MSI, IPR_SIS64, IPR_MMIO, &ipr_chip_cfg[2] } 186 { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CROCODILE, IPR_USE_MSI, IPR_SIS64, IPR_MMIO, &ipr_chip_cfg[2] }
187}; 187};
188 188
189static int ipr_max_bus_speeds [] = { 189static int ipr_max_bus_speeds [] = {
@@ -9191,15 +9191,15 @@ static struct pci_device_id ipr_pci_table[] __devinitdata = {
9191 PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_57C3, 0, 0, 0 }, 9191 PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_57C3, 0, 0, 0 },
9192 { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CROC_FPGA_E2, 9192 { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CROC_FPGA_E2,
9193 PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_57C4, 0, 0, 0 }, 9193 PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_57C4, 0, 0, 0 },
9194 { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CROC_ASIC_E2, 9194 { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CROCODILE,
9195 PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_57B4, 0, 0, 0 }, 9195 PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_57B4, 0, 0, 0 },
9196 { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CROC_ASIC_E2, 9196 { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CROCODILE,
9197 PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_57B1, 0, 0, 0 }, 9197 PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_57B1, 0, 0, 0 },
9198 { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CROC_ASIC_E2, 9198 { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CROCODILE,
9199 PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_57C6, 0, 0, 0 }, 9199 PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_57C6, 0, 0, 0 },
9200 { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CROC_ASIC_E2, 9200 { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CROCODILE,
9201 PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_575D, 0, 0, 0 }, 9201 PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_57C8, 0, 0, 0 },
9202 { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CROC_ASIC_E2, 9202 { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CROCODILE,
9203 PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_57CE, 0, 0, 0 }, 9203 PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_57CE, 0, 0, 0 },
9204 { } 9204 { }
9205}; 9205};
diff --git a/drivers/scsi/ipr.h b/drivers/scsi/ipr.h
index b13f9cc12279..f94eaee2ff16 100644
--- a/drivers/scsi/ipr.h
+++ b/drivers/scsi/ipr.h
@@ -58,7 +58,7 @@
58#define PCI_DEVICE_ID_IBM_OBSIDIAN_E 0x0339 58#define PCI_DEVICE_ID_IBM_OBSIDIAN_E 0x0339
59 59
60#define PCI_DEVICE_ID_IBM_CROC_FPGA_E2 0x033D 60#define PCI_DEVICE_ID_IBM_CROC_FPGA_E2 0x033D
61#define PCI_DEVICE_ID_IBM_CROC_ASIC_E2 0x034A 61#define PCI_DEVICE_ID_IBM_CROCODILE 0x034A
62 62
63#define IPR_SUBS_DEV_ID_2780 0x0264 63#define IPR_SUBS_DEV_ID_2780 0x0264
64#define IPR_SUBS_DEV_ID_5702 0x0266 64#define IPR_SUBS_DEV_ID_5702 0x0266
@@ -92,7 +92,7 @@
92#define IPR_SUBS_DEV_ID_57B1 0x0355 92#define IPR_SUBS_DEV_ID_57B1 0x0355
93 93
94#define IPR_SUBS_DEV_ID_574D 0x0356 94#define IPR_SUBS_DEV_ID_574D 0x0356
95#define IPR_SUBS_DEV_ID_575D 0x035D 95#define IPR_SUBS_DEV_ID_57C8 0x035D
96 96
97#define IPR_NAME "ipr" 97#define IPR_NAME "ipr"
98 98
diff --git a/drivers/scsi/isci/host.c b/drivers/scsi/isci/host.c
index 6ca9b26bb2fb..d4bf9c12ecd4 100644
--- a/drivers/scsi/isci/host.c
+++ b/drivers/scsi/isci/host.c
@@ -649,15 +649,13 @@ static void isci_host_start_complete(struct isci_host *ihost, enum sci_status co
649 649
650int isci_host_scan_finished(struct Scsi_Host *shost, unsigned long time) 650int isci_host_scan_finished(struct Scsi_Host *shost, unsigned long time)
651{ 651{
652 struct isci_host *ihost = SHOST_TO_SAS_HA(shost)->lldd_ha; 652 struct sas_ha_struct *ha = SHOST_TO_SAS_HA(shost);
653 struct isci_host *ihost = ha->lldd_ha;
653 654
654 if (test_bit(IHOST_START_PENDING, &ihost->flags)) 655 if (test_bit(IHOST_START_PENDING, &ihost->flags))
655 return 0; 656 return 0;
656 657
657 /* todo: use sas_flush_discovery once it is upstream */ 658 sas_drain_work(ha);
658 scsi_flush_work(shost);
659
660 scsi_flush_work(shost);
661 659
662 dev_dbg(&ihost->pdev->dev, 660 dev_dbg(&ihost->pdev->dev,
663 "%s: ihost->status = %d, time = %ld\n", 661 "%s: ihost->status = %d, time = %ld\n",
@@ -1490,6 +1488,15 @@ sci_controller_set_interrupt_coalescence(struct isci_host *ihost,
1490static void sci_controller_ready_state_enter(struct sci_base_state_machine *sm) 1488static void sci_controller_ready_state_enter(struct sci_base_state_machine *sm)
1491{ 1489{
1492 struct isci_host *ihost = container_of(sm, typeof(*ihost), sm); 1490 struct isci_host *ihost = container_of(sm, typeof(*ihost), sm);
1491 u32 val;
1492
1493 /* enable clock gating for power control of the scu unit */
1494 val = readl(&ihost->smu_registers->clock_gating_control);
1495 val &= ~(SMU_CGUCR_GEN_BIT(REGCLK_ENABLE) |
1496 SMU_CGUCR_GEN_BIT(TXCLK_ENABLE) |
1497 SMU_CGUCR_GEN_BIT(XCLK_ENABLE));
1498 val |= SMU_CGUCR_GEN_BIT(IDLE_ENABLE);
1499 writel(val, &ihost->smu_registers->clock_gating_control);
1493 1500
1494 /* set the default interrupt coalescence number and timeout value. */ 1501 /* set the default interrupt coalescence number and timeout value. */
1495 sci_controller_set_interrupt_coalescence(ihost, 0, 0); 1502 sci_controller_set_interrupt_coalescence(ihost, 0, 0);
diff --git a/drivers/scsi/isci/host.h b/drivers/scsi/isci/host.h
index 5477f0fa8233..adbad69d1069 100644
--- a/drivers/scsi/isci/host.h
+++ b/drivers/scsi/isci/host.h
@@ -187,6 +187,7 @@ struct isci_host {
187 int id; /* unique within a given pci device */ 187 int id; /* unique within a given pci device */
188 struct isci_phy phys[SCI_MAX_PHYS]; 188 struct isci_phy phys[SCI_MAX_PHYS];
189 struct isci_port ports[SCI_MAX_PORTS + 1]; /* includes dummy port */ 189 struct isci_port ports[SCI_MAX_PORTS + 1]; /* includes dummy port */
190 struct asd_sas_port sas_ports[SCI_MAX_PORTS];
190 struct sas_ha_struct sas_ha; 191 struct sas_ha_struct sas_ha;
191 192
192 spinlock_t state_lock; 193 spinlock_t state_lock;
@@ -393,24 +394,6 @@ static inline int sci_remote_device_node_count(struct isci_remote_device *idev)
393#define sci_controller_clear_invalid_phy(controller, phy) \ 394#define sci_controller_clear_invalid_phy(controller, phy) \
394 ((controller)->invalid_phy_mask &= ~(1 << (phy)->phy_index)) 395 ((controller)->invalid_phy_mask &= ~(1 << (phy)->phy_index))
395 396
396static inline struct device *sciphy_to_dev(struct isci_phy *iphy)
397{
398
399 if (!iphy || !iphy->isci_port || !iphy->isci_port->isci_host)
400 return NULL;
401
402 return &iphy->isci_port->isci_host->pdev->dev;
403}
404
405static inline struct device *sciport_to_dev(struct isci_port *iport)
406{
407
408 if (!iport || !iport->isci_host)
409 return NULL;
410
411 return &iport->isci_host->pdev->dev;
412}
413
414static inline struct device *scirdev_to_dev(struct isci_remote_device *idev) 397static inline struct device *scirdev_to_dev(struct isci_remote_device *idev)
415{ 398{
416 if (!idev || !idev->isci_port || !idev->isci_port->isci_host) 399 if (!idev || !idev->isci_port || !idev->isci_port->isci_host)
diff --git a/drivers/scsi/isci/init.c b/drivers/scsi/isci/init.c
index 17c4c2c89c2e..5137db5a5d85 100644
--- a/drivers/scsi/isci/init.c
+++ b/drivers/scsi/isci/init.c
@@ -60,6 +60,7 @@
60#include <linux/efi.h> 60#include <linux/efi.h>
61#include <asm/string.h> 61#include <asm/string.h>
62#include <scsi/scsi_host.h> 62#include <scsi/scsi_host.h>
63#include "host.h"
63#include "isci.h" 64#include "isci.h"
64#include "task.h" 65#include "task.h"
65#include "probe_roms.h" 66#include "probe_roms.h"
@@ -154,7 +155,6 @@ static struct scsi_host_template isci_sht = {
154 .queuecommand = sas_queuecommand, 155 .queuecommand = sas_queuecommand,
155 .target_alloc = sas_target_alloc, 156 .target_alloc = sas_target_alloc,
156 .slave_configure = sas_slave_configure, 157 .slave_configure = sas_slave_configure,
157 .slave_destroy = sas_slave_destroy,
158 .scan_finished = isci_host_scan_finished, 158 .scan_finished = isci_host_scan_finished,
159 .scan_start = isci_host_scan_start, 159 .scan_start = isci_host_scan_start,
160 .change_queue_depth = sas_change_queue_depth, 160 .change_queue_depth = sas_change_queue_depth,
@@ -166,9 +166,6 @@ static struct scsi_host_template isci_sht = {
166 .sg_tablesize = SG_ALL, 166 .sg_tablesize = SG_ALL,
167 .max_sectors = SCSI_DEFAULT_MAX_SECTORS, 167 .max_sectors = SCSI_DEFAULT_MAX_SECTORS,
168 .use_clustering = ENABLE_CLUSTERING, 168 .use_clustering = ENABLE_CLUSTERING,
169 .eh_device_reset_handler = sas_eh_device_reset_handler,
170 .eh_bus_reset_handler = isci_bus_reset_handler,
171 .slave_alloc = sas_slave_alloc,
172 .target_destroy = sas_target_destroy, 169 .target_destroy = sas_target_destroy,
173 .ioctl = sas_ioctl, 170 .ioctl = sas_ioctl,
174 .shost_attrs = isci_host_attrs, 171 .shost_attrs = isci_host_attrs,
@@ -194,6 +191,9 @@ static struct sas_domain_function_template isci_transport_ops = {
194 .lldd_lu_reset = isci_task_lu_reset, 191 .lldd_lu_reset = isci_task_lu_reset,
195 .lldd_query_task = isci_task_query_task, 192 .lldd_query_task = isci_task_query_task,
196 193
194 /* ata recovery called from ata-eh */
195 .lldd_ata_check_ready = isci_ata_check_ready,
196
197 /* Port and Adapter management */ 197 /* Port and Adapter management */
198 .lldd_clear_nexus_port = isci_task_clear_nexus_port, 198 .lldd_clear_nexus_port = isci_task_clear_nexus_port,
199 .lldd_clear_nexus_ha = isci_task_clear_nexus_ha, 199 .lldd_clear_nexus_ha = isci_task_clear_nexus_ha,
@@ -242,18 +242,13 @@ static int isci_register_sas_ha(struct isci_host *isci_host)
242 if (!sas_ports) 242 if (!sas_ports)
243 return -ENOMEM; 243 return -ENOMEM;
244 244
245 /*----------------- Libsas Initialization Stuff----------------------
246 * Set various fields in the sas_ha struct:
247 */
248
249 sas_ha->sas_ha_name = DRV_NAME; 245 sas_ha->sas_ha_name = DRV_NAME;
250 sas_ha->lldd_module = THIS_MODULE; 246 sas_ha->lldd_module = THIS_MODULE;
251 sas_ha->sas_addr = &isci_host->phys[0].sas_addr[0]; 247 sas_ha->sas_addr = &isci_host->phys[0].sas_addr[0];
252 248
253 /* set the array of phy and port structs. */
254 for (i = 0; i < SCI_MAX_PHYS; i++) { 249 for (i = 0; i < SCI_MAX_PHYS; i++) {
255 sas_phys[i] = &isci_host->phys[i].sas_phy; 250 sas_phys[i] = &isci_host->phys[i].sas_phy;
256 sas_ports[i] = &isci_host->ports[i].sas_port; 251 sas_ports[i] = &isci_host->sas_ports[i];
257 } 252 }
258 253
259 sas_ha->sas_phy = sas_phys; 254 sas_ha->sas_phy = sas_phys;
@@ -528,6 +523,13 @@ static int __devinit isci_pci_probe(struct pci_dev *pdev, const struct pci_devic
528 goto err_host_alloc; 523 goto err_host_alloc;
529 } 524 }
530 pci_info->hosts[i] = h; 525 pci_info->hosts[i] = h;
526
527 /* turn on DIF support */
528 scsi_host_set_prot(h->shost,
529 SHOST_DIF_TYPE1_PROTECTION |
530 SHOST_DIF_TYPE2_PROTECTION |
531 SHOST_DIF_TYPE3_PROTECTION);
532 scsi_host_set_guard(h->shost, SHOST_DIX_GUARD_CRC);
531 } 533 }
532 534
533 err = isci_setup_interrupts(pdev); 535 err = isci_setup_interrupts(pdev);
@@ -551,9 +553,9 @@ static void __devexit isci_pci_remove(struct pci_dev *pdev)
551 int i; 553 int i;
552 554
553 for_each_isci_host(i, ihost, pdev) { 555 for_each_isci_host(i, ihost, pdev) {
556 wait_for_start(ihost);
554 isci_unregister(ihost); 557 isci_unregister(ihost);
555 isci_host_deinit(ihost); 558 isci_host_deinit(ihost);
556 sci_controller_disable_interrupts(ihost);
557 } 559 }
558} 560}
559 561
diff --git a/drivers/scsi/isci/phy.c b/drivers/scsi/isci/phy.c
index fe18acfd6eb3..fab3586840b5 100644
--- a/drivers/scsi/isci/phy.c
+++ b/drivers/scsi/isci/phy.c
@@ -59,6 +59,16 @@
59#include "scu_event_codes.h" 59#include "scu_event_codes.h"
60#include "probe_roms.h" 60#include "probe_roms.h"
61 61
62#undef C
63#define C(a) (#a)
64static const char *phy_state_name(enum sci_phy_states state)
65{
66 static const char * const strings[] = PHY_STATES;
67
68 return strings[state];
69}
70#undef C
71
62/* Maximum arbitration wait time in micro-seconds */ 72/* Maximum arbitration wait time in micro-seconds */
63#define SCIC_SDS_PHY_MAX_ARBITRATION_WAIT_TIME (700) 73#define SCIC_SDS_PHY_MAX_ARBITRATION_WAIT_TIME (700)
64 74
@@ -67,6 +77,19 @@ enum sas_linkrate sci_phy_linkrate(struct isci_phy *iphy)
67 return iphy->max_negotiated_speed; 77 return iphy->max_negotiated_speed;
68} 78}
69 79
80static struct isci_host *phy_to_host(struct isci_phy *iphy)
81{
82 struct isci_phy *table = iphy - iphy->phy_index;
83 struct isci_host *ihost = container_of(table, typeof(*ihost), phys[0]);
84
85 return ihost;
86}
87
88static struct device *sciphy_to_dev(struct isci_phy *iphy)
89{
90 return &phy_to_host(iphy)->pdev->dev;
91}
92
70static enum sci_status 93static enum sci_status
71sci_phy_transport_layer_initialization(struct isci_phy *iphy, 94sci_phy_transport_layer_initialization(struct isci_phy *iphy,
72 struct scu_transport_layer_registers __iomem *reg) 95 struct scu_transport_layer_registers __iomem *reg)
@@ -446,8 +469,8 @@ enum sci_status sci_phy_start(struct isci_phy *iphy)
446 enum sci_phy_states state = iphy->sm.current_state_id; 469 enum sci_phy_states state = iphy->sm.current_state_id;
447 470
448 if (state != SCI_PHY_STOPPED) { 471 if (state != SCI_PHY_STOPPED) {
449 dev_dbg(sciphy_to_dev(iphy), 472 dev_dbg(sciphy_to_dev(iphy), "%s: in wrong state: %s\n",
450 "%s: in wrong state: %d\n", __func__, state); 473 __func__, phy_state_name(state));
451 return SCI_FAILURE_INVALID_STATE; 474 return SCI_FAILURE_INVALID_STATE;
452 } 475 }
453 476
@@ -472,8 +495,8 @@ enum sci_status sci_phy_stop(struct isci_phy *iphy)
472 case SCI_PHY_READY: 495 case SCI_PHY_READY:
473 break; 496 break;
474 default: 497 default:
475 dev_dbg(sciphy_to_dev(iphy), 498 dev_dbg(sciphy_to_dev(iphy), "%s: in wrong state: %s\n",
476 "%s: in wrong state: %d\n", __func__, state); 499 __func__, phy_state_name(state));
477 return SCI_FAILURE_INVALID_STATE; 500 return SCI_FAILURE_INVALID_STATE;
478 } 501 }
479 502
@@ -486,8 +509,8 @@ enum sci_status sci_phy_reset(struct isci_phy *iphy)
486 enum sci_phy_states state = iphy->sm.current_state_id; 509 enum sci_phy_states state = iphy->sm.current_state_id;
487 510
488 if (state != SCI_PHY_READY) { 511 if (state != SCI_PHY_READY) {
489 dev_dbg(sciphy_to_dev(iphy), 512 dev_dbg(sciphy_to_dev(iphy), "%s: in wrong state: %s\n",
490 "%s: in wrong state: %d\n", __func__, state); 513 __func__, phy_state_name(state));
491 return SCI_FAILURE_INVALID_STATE; 514 return SCI_FAILURE_INVALID_STATE;
492 } 515 }
493 516
@@ -536,8 +559,8 @@ enum sci_status sci_phy_consume_power_handler(struct isci_phy *iphy)
536 return SCI_SUCCESS; 559 return SCI_SUCCESS;
537 } 560 }
538 default: 561 default:
539 dev_dbg(sciphy_to_dev(iphy), 562 dev_dbg(sciphy_to_dev(iphy), "%s: in wrong state: %s\n",
540 "%s: in wrong state: %d\n", __func__, state); 563 __func__, phy_state_name(state));
541 return SCI_FAILURE_INVALID_STATE; 564 return SCI_FAILURE_INVALID_STATE;
542 } 565 }
543} 566}
@@ -591,6 +614,60 @@ static void sci_phy_complete_link_training(struct isci_phy *iphy,
591 sci_change_state(&iphy->sm, next_state); 614 sci_change_state(&iphy->sm, next_state);
592} 615}
593 616
617static const char *phy_event_name(u32 event_code)
618{
619 switch (scu_get_event_code(event_code)) {
620 case SCU_EVENT_PORT_SELECTOR_DETECTED:
621 return "port selector";
622 case SCU_EVENT_SENT_PORT_SELECTION:
623 return "port selection";
624 case SCU_EVENT_HARD_RESET_TRANSMITTED:
625 return "tx hard reset";
626 case SCU_EVENT_HARD_RESET_RECEIVED:
627 return "rx hard reset";
628 case SCU_EVENT_RECEIVED_IDENTIFY_TIMEOUT:
629 return "identify timeout";
630 case SCU_EVENT_LINK_FAILURE:
631 return "link fail";
632 case SCU_EVENT_SATA_SPINUP_HOLD:
633 return "sata spinup hold";
634 case SCU_EVENT_SAS_15_SSC:
635 case SCU_EVENT_SAS_15:
636 return "sas 1.5";
637 case SCU_EVENT_SAS_30_SSC:
638 case SCU_EVENT_SAS_30:
639 return "sas 3.0";
640 case SCU_EVENT_SAS_60_SSC:
641 case SCU_EVENT_SAS_60:
642 return "sas 6.0";
643 case SCU_EVENT_SATA_15_SSC:
644 case SCU_EVENT_SATA_15:
645 return "sata 1.5";
646 case SCU_EVENT_SATA_30_SSC:
647 case SCU_EVENT_SATA_30:
648 return "sata 3.0";
649 case SCU_EVENT_SATA_60_SSC:
650 case SCU_EVENT_SATA_60:
651 return "sata 6.0";
652 case SCU_EVENT_SAS_PHY_DETECTED:
653 return "sas detect";
654 case SCU_EVENT_SATA_PHY_DETECTED:
655 return "sata detect";
656 default:
657 return "unknown";
658 }
659}
660
661#define phy_event_dbg(iphy, state, code) \
662 dev_dbg(sciphy_to_dev(iphy), "phy-%d:%d: %s event: %s (%x)\n", \
663 phy_to_host(iphy)->id, iphy->phy_index, \
664 phy_state_name(state), phy_event_name(code), code)
665
666#define phy_event_warn(iphy, state, code) \
667 dev_warn(sciphy_to_dev(iphy), "phy-%d:%d: %s event: %s (%x)\n", \
668 phy_to_host(iphy)->id, iphy->phy_index, \
669 phy_state_name(state), phy_event_name(code), code)
670
594enum sci_status sci_phy_event_handler(struct isci_phy *iphy, u32 event_code) 671enum sci_status sci_phy_event_handler(struct isci_phy *iphy, u32 event_code)
595{ 672{
596 enum sci_phy_states state = iphy->sm.current_state_id; 673 enum sci_phy_states state = iphy->sm.current_state_id;
@@ -607,11 +684,7 @@ enum sci_status sci_phy_event_handler(struct isci_phy *iphy, u32 event_code)
607 iphy->is_in_link_training = true; 684 iphy->is_in_link_training = true;
608 break; 685 break;
609 default: 686 default:
610 dev_dbg(sciphy_to_dev(iphy), 687 phy_event_dbg(iphy, state, event_code);
611 "%s: PHY starting substate machine received "
612 "unexpected event_code %x\n",
613 __func__,
614 event_code);
615 return SCI_FAILURE; 688 return SCI_FAILURE;
616 } 689 }
617 return SCI_SUCCESS; 690 return SCI_SUCCESS;
@@ -648,11 +721,7 @@ enum sci_status sci_phy_event_handler(struct isci_phy *iphy, u32 event_code)
648 sci_change_state(&iphy->sm, SCI_PHY_STARTING); 721 sci_change_state(&iphy->sm, SCI_PHY_STARTING);
649 break; 722 break;
650 default: 723 default:
651 dev_warn(sciphy_to_dev(iphy), 724 phy_event_warn(iphy, state, event_code);
652 "%s: PHY starting substate machine received "
653 "unexpected event_code %x\n",
654 __func__, event_code);
655
656 return SCI_FAILURE; 725 return SCI_FAILURE;
657 break; 726 break;
658 } 727 }
@@ -677,10 +746,7 @@ enum sci_status sci_phy_event_handler(struct isci_phy *iphy, u32 event_code)
677 sci_change_state(&iphy->sm, SCI_PHY_STARTING); 746 sci_change_state(&iphy->sm, SCI_PHY_STARTING);
678 break; 747 break;
679 default: 748 default:
680 dev_warn(sciphy_to_dev(iphy), 749 phy_event_warn(iphy, state, event_code);
681 "%s: PHY starting substate machine received "
682 "unexpected event_code %x\n",
683 __func__, event_code);
684 return SCI_FAILURE; 750 return SCI_FAILURE;
685 } 751 }
686 return SCI_SUCCESS; 752 return SCI_SUCCESS;
@@ -691,11 +757,7 @@ enum sci_status sci_phy_event_handler(struct isci_phy *iphy, u32 event_code)
691 sci_change_state(&iphy->sm, SCI_PHY_STARTING); 757 sci_change_state(&iphy->sm, SCI_PHY_STARTING);
692 break; 758 break;
693 default: 759 default:
694 dev_warn(sciphy_to_dev(iphy), 760 phy_event_warn(iphy, state, event_code);
695 "%s: PHY starting substate machine received unexpected "
696 "event_code %x\n",
697 __func__,
698 event_code);
699 return SCI_FAILURE; 761 return SCI_FAILURE;
700 } 762 }
701 return SCI_SUCCESS; 763 return SCI_SUCCESS;
@@ -719,11 +781,7 @@ enum sci_status sci_phy_event_handler(struct isci_phy *iphy, u32 event_code)
719 break; 781 break;
720 782
721 default: 783 default:
722 dev_warn(sciphy_to_dev(iphy), 784 phy_event_warn(iphy, state, event_code);
723 "%s: PHY starting substate machine received "
724 "unexpected event_code %x\n",
725 __func__, event_code);
726
727 return SCI_FAILURE; 785 return SCI_FAILURE;
728 } 786 }
729 return SCI_SUCCESS; 787 return SCI_SUCCESS;
@@ -751,12 +809,7 @@ enum sci_status sci_phy_event_handler(struct isci_phy *iphy, u32 event_code)
751 sci_phy_start_sas_link_training(iphy); 809 sci_phy_start_sas_link_training(iphy);
752 break; 810 break;
753 default: 811 default:
754 dev_warn(sciphy_to_dev(iphy), 812 phy_event_warn(iphy, state, event_code);
755 "%s: PHY starting substate machine received "
756 "unexpected event_code %x\n",
757 __func__,
758 event_code);
759
760 return SCI_FAILURE; 813 return SCI_FAILURE;
761 } 814 }
762 return SCI_SUCCESS; 815 return SCI_SUCCESS;
@@ -793,11 +846,7 @@ enum sci_status sci_phy_event_handler(struct isci_phy *iphy, u32 event_code)
793 sci_phy_start_sas_link_training(iphy); 846 sci_phy_start_sas_link_training(iphy);
794 break; 847 break;
795 default: 848 default:
796 dev_warn(sciphy_to_dev(iphy), 849 phy_event_warn(iphy, state, event_code);
797 "%s: PHY starting substate machine received "
798 "unexpected event_code %x\n",
799 __func__, event_code);
800
801 return SCI_FAILURE; 850 return SCI_FAILURE;
802 } 851 }
803 852
@@ -815,12 +864,7 @@ enum sci_status sci_phy_event_handler(struct isci_phy *iphy, u32 event_code)
815 break; 864 break;
816 865
817 default: 866 default:
818 dev_warn(sciphy_to_dev(iphy), 867 phy_event_warn(iphy, state, event_code);
819 "%s: PHY starting substate machine received "
820 "unexpected event_code %x\n",
821 __func__,
822 event_code);
823
824 return SCI_FAILURE; 868 return SCI_FAILURE;
825 } 869 }
826 return SCI_SUCCESS; 870 return SCI_SUCCESS;
@@ -838,10 +882,7 @@ enum sci_status sci_phy_event_handler(struct isci_phy *iphy, u32 event_code)
838 iphy->bcn_received_while_port_unassigned = true; 882 iphy->bcn_received_while_port_unassigned = true;
839 break; 883 break;
840 default: 884 default:
841 dev_warn(sciphy_to_dev(iphy), 885 phy_event_warn(iphy, state, event_code);
842 "%sP SCIC PHY 0x%p ready state machine received "
843 "unexpected event_code %x\n",
844 __func__, iphy, event_code);
845 return SCI_FAILURE_INVALID_STATE; 886 return SCI_FAILURE_INVALID_STATE;
846 } 887 }
847 return SCI_SUCCESS; 888 return SCI_SUCCESS;
@@ -852,18 +893,14 @@ enum sci_status sci_phy_event_handler(struct isci_phy *iphy, u32 event_code)
852 sci_change_state(&iphy->sm, SCI_PHY_STARTING); 893 sci_change_state(&iphy->sm, SCI_PHY_STARTING);
853 break; 894 break;
854 default: 895 default:
855 dev_warn(sciphy_to_dev(iphy), 896 phy_event_warn(iphy, state, event_code);
856 "%s: SCIC PHY 0x%p resetting state machine received "
857 "unexpected event_code %x\n",
858 __func__, iphy, event_code);
859
860 return SCI_FAILURE_INVALID_STATE; 897 return SCI_FAILURE_INVALID_STATE;
861 break; 898 break;
862 } 899 }
863 return SCI_SUCCESS; 900 return SCI_SUCCESS;
864 default: 901 default:
865 dev_dbg(sciphy_to_dev(iphy), 902 dev_dbg(sciphy_to_dev(iphy), "%s: in wrong state: %s\n",
866 "%s: in wrong state: %d\n", __func__, state); 903 __func__, phy_state_name(state));
867 return SCI_FAILURE_INVALID_STATE; 904 return SCI_FAILURE_INVALID_STATE;
868 } 905 }
869} 906}
@@ -956,8 +993,8 @@ enum sci_status sci_phy_frame_handler(struct isci_phy *iphy, u32 frame_index)
956 return result; 993 return result;
957 } 994 }
958 default: 995 default:
959 dev_dbg(sciphy_to_dev(iphy), 996 dev_dbg(sciphy_to_dev(iphy), "%s: in wrong state: %s\n",
960 "%s: in wrong state: %d\n", __func__, state); 997 __func__, phy_state_name(state));
961 return SCI_FAILURE_INVALID_STATE; 998 return SCI_FAILURE_INVALID_STATE;
962 } 999 }
963 1000
@@ -1299,7 +1336,6 @@ void isci_phy_init(struct isci_phy *iphy, struct isci_host *ihost, int index)
1299 sas_addr = cpu_to_be64(sci_sas_addr); 1336 sas_addr = cpu_to_be64(sci_sas_addr);
1300 memcpy(iphy->sas_addr, &sas_addr, sizeof(sas_addr)); 1337 memcpy(iphy->sas_addr, &sas_addr, sizeof(sas_addr));
1301 1338
1302 iphy->isci_port = NULL;
1303 iphy->sas_phy.enabled = 0; 1339 iphy->sas_phy.enabled = 0;
1304 iphy->sas_phy.id = index; 1340 iphy->sas_phy.id = index;
1305 iphy->sas_phy.sas_addr = &iphy->sas_addr[0]; 1341 iphy->sas_phy.sas_addr = &iphy->sas_addr[0];
@@ -1333,13 +1369,13 @@ int isci_phy_control(struct asd_sas_phy *sas_phy,
1333{ 1369{
1334 int ret = 0; 1370 int ret = 0;
1335 struct isci_phy *iphy = sas_phy->lldd_phy; 1371 struct isci_phy *iphy = sas_phy->lldd_phy;
1336 struct isci_port *iport = iphy->isci_port; 1372 struct asd_sas_port *port = sas_phy->port;
1337 struct isci_host *ihost = sas_phy->ha->lldd_ha; 1373 struct isci_host *ihost = sas_phy->ha->lldd_ha;
1338 unsigned long flags; 1374 unsigned long flags;
1339 1375
1340 dev_dbg(&ihost->pdev->dev, 1376 dev_dbg(&ihost->pdev->dev,
1341 "%s: phy %p; func %d; buf %p; isci phy %p, port %p\n", 1377 "%s: phy %p; func %d; buf %p; isci phy %p, port %p\n",
1342 __func__, sas_phy, func, buf, iphy, iport); 1378 __func__, sas_phy, func, buf, iphy, port);
1343 1379
1344 switch (func) { 1380 switch (func) {
1345 case PHY_FUNC_DISABLE: 1381 case PHY_FUNC_DISABLE:
@@ -1356,11 +1392,10 @@ int isci_phy_control(struct asd_sas_phy *sas_phy,
1356 break; 1392 break;
1357 1393
1358 case PHY_FUNC_HARD_RESET: 1394 case PHY_FUNC_HARD_RESET:
1359 if (!iport) 1395 if (!port)
1360 return -ENODEV; 1396 return -ENODEV;
1361 1397
1362 /* Perform the port reset. */ 1398 ret = isci_port_perform_hard_reset(ihost, port->lldd_port, iphy);
1363 ret = isci_port_perform_hard_reset(ihost, iport, iphy);
1364 1399
1365 break; 1400 break;
1366 case PHY_FUNC_GET_EVENTS: { 1401 case PHY_FUNC_GET_EVENTS: {
diff --git a/drivers/scsi/isci/phy.h b/drivers/scsi/isci/phy.h
index 67699c8e321c..0e45833ba06d 100644
--- a/drivers/scsi/isci/phy.h
+++ b/drivers/scsi/isci/phy.h
@@ -103,7 +103,6 @@ struct isci_phy {
103 struct scu_transport_layer_registers __iomem *transport_layer_registers; 103 struct scu_transport_layer_registers __iomem *transport_layer_registers;
104 struct scu_link_layer_registers __iomem *link_layer_registers; 104 struct scu_link_layer_registers __iomem *link_layer_registers;
105 struct asd_sas_phy sas_phy; 105 struct asd_sas_phy sas_phy;
106 struct isci_port *isci_port;
107 u8 sas_addr[SAS_ADDR_SIZE]; 106 u8 sas_addr[SAS_ADDR_SIZE];
108 union { 107 union {
109 struct sas_identify_frame iaf; 108 struct sas_identify_frame iaf;
@@ -344,101 +343,65 @@ enum sci_phy_counter_id {
344 SCIC_PHY_COUNTER_SN_DWORD_SYNC_ERROR 343 SCIC_PHY_COUNTER_SN_DWORD_SYNC_ERROR
345}; 344};
346 345
347enum sci_phy_states { 346/**
348 /** 347 * enum sci_phy_states - phy state machine states
349 * Simply the initial state for the base domain state machine. 348 * @SCI_PHY_INITIAL: Simply the initial state for the base domain state
350 */ 349 * machine.
351 SCI_PHY_INITIAL, 350 * @SCI_PHY_STOPPED: phy has successfully been stopped. In this state
352 351 * no new IO operations are permitted on this phy.
353 /** 352 * @SCI_PHY_STARTING: the phy is in the process of becomming ready. In
354 * This state indicates that the phy has successfully been stopped. 353 * this state no new IO operations are permitted on
355 * In this state no new IO operations are permitted on this phy. 354 * this phy.
356 * This state is entered from the INITIAL state. 355 * @SCI_PHY_SUB_INITIAL: Initial state
357 * This state is entered from the STARTING state. 356 * @SCI_PHY_SUB_AWAIT_OSSP_EN: Wait state for the hardware OSSP event
358 * This state is entered from the READY state. 357 * type notification
359 * This state is entered from the RESETTING state. 358 * @SCI_PHY_SUB_AWAIT_SAS_SPEED_EN: Wait state for the PHY speed
360 */ 359 * notification
361 SCI_PHY_STOPPED, 360 * @SCI_PHY_SUB_AWAIT_IAF_UF: Wait state for the IAF Unsolicited frame
362 361 * notification
363 /** 362 * @SCI_PHY_SUB_AWAIT_SAS_POWER: Wait state for the request to consume
364 * This state indicates that the phy is in the process of becomming 363 * power
365 * ready. In this state no new IO operations are permitted on this phy. 364 * @SCI_PHY_SUB_AWAIT_SATA_POWER: Wait state for request to consume
366 * This state is entered from the STOPPED state. 365 * power
367 * This state is entered from the READY state. 366 * @SCI_PHY_SUB_AWAIT_SATA_PHY_EN: Wait state for the SATA PHY
368 * This state is entered from the RESETTING state. 367 * notification
369 */ 368 * @SCI_PHY_SUB_AWAIT_SATA_SPEED_EN: Wait for the SATA PHY speed
370 SCI_PHY_STARTING, 369 * notification
371 370 * @SCI_PHY_SUB_AWAIT_SIG_FIS_UF: Wait state for the SIGNATURE FIS
372 /** 371 * unsolicited frame notification
373 * Initial state 372 * @SCI_PHY_SUB_FINAL: Exit state for this state machine
374 */ 373 * @SCI_PHY_READY: phy is now ready. Thus, the user is able to perform
375 SCI_PHY_SUB_INITIAL, 374 * IO operations utilizing this phy as long as it is
376 375 * currently part of a valid port. This state is
377 /** 376 * entered from the STARTING state.
378 * Wait state for the hardware OSSP event type notification 377 * @SCI_PHY_RESETTING: phy is in the process of being reset. In this
379 */ 378 * state no new IO operations are permitted on this
380 SCI_PHY_SUB_AWAIT_OSSP_EN, 379 * phy. This state is entered from the READY state.
381 380 * @SCI_PHY_FINAL: Simply the final state for the base phy state
382 /** 381 * machine.
383 * Wait state for the PHY speed notification 382 */
384 */ 383#define PHY_STATES {\
385 SCI_PHY_SUB_AWAIT_SAS_SPEED_EN, 384 C(PHY_INITIAL),\
386 385 C(PHY_STOPPED),\
387 /** 386 C(PHY_STARTING),\
388 * Wait state for the IAF Unsolicited frame notification 387 C(PHY_SUB_INITIAL),\
389 */ 388 C(PHY_SUB_AWAIT_OSSP_EN),\
390 SCI_PHY_SUB_AWAIT_IAF_UF, 389 C(PHY_SUB_AWAIT_SAS_SPEED_EN),\
391 390 C(PHY_SUB_AWAIT_IAF_UF),\
392 /** 391 C(PHY_SUB_AWAIT_SAS_POWER),\
393 * Wait state for the request to consume power 392 C(PHY_SUB_AWAIT_SATA_POWER),\
394 */ 393 C(PHY_SUB_AWAIT_SATA_PHY_EN),\
395 SCI_PHY_SUB_AWAIT_SAS_POWER, 394 C(PHY_SUB_AWAIT_SATA_SPEED_EN),\
396 395 C(PHY_SUB_AWAIT_SIG_FIS_UF),\
397 /** 396 C(PHY_SUB_FINAL),\
398 * Wait state for request to consume power 397 C(PHY_READY),\
399 */ 398 C(PHY_RESETTING),\
400 SCI_PHY_SUB_AWAIT_SATA_POWER, 399 C(PHY_FINAL),\
401 400 }
402 /** 401#undef C
403 * Wait state for the SATA PHY notification 402#define C(a) SCI_##a
404 */ 403enum sci_phy_states PHY_STATES;
405 SCI_PHY_SUB_AWAIT_SATA_PHY_EN, 404#undef C
406
407 /**
408 * Wait for the SATA PHY speed notification
409 */
410 SCI_PHY_SUB_AWAIT_SATA_SPEED_EN,
411
412 /**
413 * Wait state for the SIGNATURE FIS unsolicited frame notification
414 */
415 SCI_PHY_SUB_AWAIT_SIG_FIS_UF,
416
417 /**
418 * Exit state for this state machine
419 */
420 SCI_PHY_SUB_FINAL,
421
422 /**
423 * This state indicates the the phy is now ready. Thus, the user
424 * is able to perform IO operations utilizing this phy as long as it
425 * is currently part of a valid port.
426 * This state is entered from the STARTING state.
427 */
428 SCI_PHY_READY,
429
430 /**
431 * This state indicates that the phy is in the process of being reset.
432 * In this state no new IO operations are permitted on this phy.
433 * This state is entered from the READY state.
434 */
435 SCI_PHY_RESETTING,
436
437 /**
438 * Simply the final state for the base phy state machine.
439 */
440 SCI_PHY_FINAL,
441};
442 405
443void sci_phy_construct( 406void sci_phy_construct(
444 struct isci_phy *iphy, 407 struct isci_phy *iphy,
diff --git a/drivers/scsi/isci/port.c b/drivers/scsi/isci/port.c
index 7c6ac58a5c4c..5fada73b71ff 100644
--- a/drivers/scsi/isci/port.c
+++ b/drivers/scsi/isci/port.c
@@ -60,18 +60,29 @@
60#define SCIC_SDS_PORT_HARD_RESET_TIMEOUT (1000) 60#define SCIC_SDS_PORT_HARD_RESET_TIMEOUT (1000)
61#define SCU_DUMMY_INDEX (0xFFFF) 61#define SCU_DUMMY_INDEX (0xFFFF)
62 62
63static void isci_port_change_state(struct isci_port *iport, enum isci_status status) 63#undef C
64#define C(a) (#a)
65const char *port_state_name(enum sci_port_states state)
64{ 66{
65 unsigned long flags; 67 static const char * const strings[] = PORT_STATES;
68
69 return strings[state];
70}
71#undef C
72
73static struct device *sciport_to_dev(struct isci_port *iport)
74{
75 int i = iport->physical_port_index;
76 struct isci_port *table;
77 struct isci_host *ihost;
78
79 if (i == SCIC_SDS_DUMMY_PORT)
80 i = SCI_MAX_PORTS+1;
66 81
67 dev_dbg(&iport->isci_host->pdev->dev, 82 table = iport - i;
68 "%s: iport = %p, state = 0x%x\n", 83 ihost = container_of(table, typeof(*ihost), ports[0]);
69 __func__, iport, status);
70 84
71 /* XXX pointless lock */ 85 return &ihost->pdev->dev;
72 spin_lock_irqsave(&iport->state_lock, flags);
73 iport->status = status;
74 spin_unlock_irqrestore(&iport->state_lock, flags);
75} 86}
76 87
77static void sci_port_get_protocols(struct isci_port *iport, struct sci_phy_proto *proto) 88static void sci_port_get_protocols(struct isci_port *iport, struct sci_phy_proto *proto)
@@ -165,18 +176,12 @@ static void isci_port_link_up(struct isci_host *isci_host,
165 struct sci_port_properties properties; 176 struct sci_port_properties properties;
166 unsigned long success = true; 177 unsigned long success = true;
167 178
168 BUG_ON(iphy->isci_port != NULL);
169
170 iphy->isci_port = iport;
171
172 dev_dbg(&isci_host->pdev->dev, 179 dev_dbg(&isci_host->pdev->dev,
173 "%s: isci_port = %p\n", 180 "%s: isci_port = %p\n",
174 __func__, iport); 181 __func__, iport);
175 182
176 spin_lock_irqsave(&iphy->sas_phy.frame_rcvd_lock, flags); 183 spin_lock_irqsave(&iphy->sas_phy.frame_rcvd_lock, flags);
177 184
178 isci_port_change_state(iphy->isci_port, isci_starting);
179
180 sci_port_get_properties(iport, &properties); 185 sci_port_get_properties(iport, &properties);
181 186
182 if (iphy->protocol == SCIC_SDS_PHY_PROTOCOL_SATA) { 187 if (iphy->protocol == SCIC_SDS_PHY_PROTOCOL_SATA) {
@@ -258,7 +263,6 @@ static void isci_port_link_down(struct isci_host *isci_host,
258 __func__, isci_device); 263 __func__, isci_device);
259 set_bit(IDEV_GONE, &isci_device->flags); 264 set_bit(IDEV_GONE, &isci_device->flags);
260 } 265 }
261 isci_port_change_state(isci_port, isci_stopping);
262 } 266 }
263 } 267 }
264 268
@@ -269,52 +273,10 @@ static void isci_port_link_down(struct isci_host *isci_host,
269 isci_host->sas_ha.notify_phy_event(&isci_phy->sas_phy, 273 isci_host->sas_ha.notify_phy_event(&isci_phy->sas_phy,
270 PHYE_LOSS_OF_SIGNAL); 274 PHYE_LOSS_OF_SIGNAL);
271 275
272 isci_phy->isci_port = NULL;
273
274 dev_dbg(&isci_host->pdev->dev, 276 dev_dbg(&isci_host->pdev->dev,
275 "%s: isci_port = %p - Done\n", __func__, isci_port); 277 "%s: isci_port = %p - Done\n", __func__, isci_port);
276} 278}
277 279
278
279/**
280 * isci_port_ready() - This function is called by the sci core when a link
281 * becomes ready.
282 * @isci_host: This parameter specifies the isci host object.
283 * @port: This parameter specifies the sci port with the active link.
284 *
285 */
286static void isci_port_ready(struct isci_host *isci_host, struct isci_port *isci_port)
287{
288 dev_dbg(&isci_host->pdev->dev,
289 "%s: isci_port = %p\n", __func__, isci_port);
290
291 complete_all(&isci_port->start_complete);
292 isci_port_change_state(isci_port, isci_ready);
293 return;
294}
295
296/**
297 * isci_port_not_ready() - This function is called by the sci core when a link
298 * is not ready. All remote devices on this link will be removed if they are
299 * in the stopping state.
300 * @isci_host: This parameter specifies the isci host object.
301 * @port: This parameter specifies the sci port with the active link.
302 *
303 */
304static void isci_port_not_ready(struct isci_host *isci_host, struct isci_port *isci_port)
305{
306 dev_dbg(&isci_host->pdev->dev,
307 "%s: isci_port = %p\n", __func__, isci_port);
308}
309
310static void isci_port_stop_complete(struct isci_host *ihost,
311 struct isci_port *iport,
312 enum sci_status completion_status)
313{
314 dev_dbg(&ihost->pdev->dev, "Port stop complete\n");
315}
316
317
318static bool is_port_ready_state(enum sci_port_states state) 280static bool is_port_ready_state(enum sci_port_states state)
319{ 281{
320 switch (state) { 282 switch (state) {
@@ -353,7 +315,9 @@ static void port_state_machine_change(struct isci_port *iport,
353static void isci_port_hard_reset_complete(struct isci_port *isci_port, 315static void isci_port_hard_reset_complete(struct isci_port *isci_port,
354 enum sci_status completion_status) 316 enum sci_status completion_status)
355{ 317{
356 dev_dbg(&isci_port->isci_host->pdev->dev, 318 struct isci_host *ihost = isci_port->owning_controller;
319
320 dev_dbg(&ihost->pdev->dev,
357 "%s: isci_port = %p, completion_status=%x\n", 321 "%s: isci_port = %p, completion_status=%x\n",
358 __func__, isci_port, completion_status); 322 __func__, isci_port, completion_status);
359 323
@@ -364,23 +328,24 @@ static void isci_port_hard_reset_complete(struct isci_port *isci_port,
364 328
365 /* The reset failed. The port state is now SCI_PORT_FAILED. */ 329 /* The reset failed. The port state is now SCI_PORT_FAILED. */
366 if (isci_port->active_phy_mask == 0) { 330 if (isci_port->active_phy_mask == 0) {
331 int phy_idx = isci_port->last_active_phy;
332 struct isci_phy *iphy = &ihost->phys[phy_idx];
367 333
368 /* Generate the link down now to the host, since it 334 /* Generate the link down now to the host, since it
369 * was intercepted by the hard reset state machine when 335 * was intercepted by the hard reset state machine when
370 * it really happened. 336 * it really happened.
371 */ 337 */
372 isci_port_link_down(isci_port->isci_host, 338 isci_port_link_down(ihost, iphy, isci_port);
373 &isci_port->isci_host->phys[
374 isci_port->last_active_phy],
375 isci_port);
376 } 339 }
377 /* Advance the port state so that link state changes will be 340 /* Advance the port state so that link state changes will be
378 * noticed. 341 * noticed.
379 */ 342 */
380 port_state_machine_change(isci_port, SCI_PORT_SUB_WAITING); 343 port_state_machine_change(isci_port, SCI_PORT_SUB_WAITING);
381 344
382 } 345 }
383 complete_all(&isci_port->hard_reset_complete); 346 clear_bit(IPORT_RESET_PENDING, &isci_port->state);
347 wake_up(&ihost->eventq);
348
384} 349}
385 350
386/* This method will return a true value if the specified phy can be assigned to 351/* This method will return a true value if the specified phy can be assigned to
@@ -835,10 +800,9 @@ static void port_timeout(unsigned long data)
835 __func__, 800 __func__,
836 iport); 801 iport);
837 } else if (current_state == SCI_PORT_STOPPING) { 802 } else if (current_state == SCI_PORT_STOPPING) {
838 /* if the port is still stopping then the stop has not completed */ 803 dev_dbg(sciport_to_dev(iport),
839 isci_port_stop_complete(iport->owning_controller, 804 "%s: port%d: stop complete timeout\n",
840 iport, 805 __func__, iport->physical_port_index);
841 SCI_FAILURE_TIMEOUT);
842 } else { 806 } else {
843 /* The port is in the ready state and we have a timer 807 /* The port is in the ready state and we have a timer
844 * reporting a timeout this should not happen. 808 * reporting a timeout this should not happen.
@@ -1003,7 +967,8 @@ static void sci_port_ready_substate_operational_enter(struct sci_base_state_mach
1003 struct isci_port *iport = container_of(sm, typeof(*iport), sm); 967 struct isci_port *iport = container_of(sm, typeof(*iport), sm);
1004 struct isci_host *ihost = iport->owning_controller; 968 struct isci_host *ihost = iport->owning_controller;
1005 969
1006 isci_port_ready(ihost, iport); 970 dev_dbg(&ihost->pdev->dev, "%s: port%d ready\n",
971 __func__, iport->physical_port_index);
1007 972
1008 for (index = 0; index < SCI_MAX_PHYS; index++) { 973 for (index = 0; index < SCI_MAX_PHYS; index++) {
1009 if (iport->phy_table[index]) { 974 if (iport->phy_table[index]) {
@@ -1069,7 +1034,8 @@ static void sci_port_ready_substate_operational_exit(struct sci_base_state_machi
1069 */ 1034 */
1070 sci_port_abort_dummy_request(iport); 1035 sci_port_abort_dummy_request(iport);
1071 1036
1072 isci_port_not_ready(ihost, iport); 1037 dev_dbg(&ihost->pdev->dev, "%s: port%d !ready\n",
1038 __func__, iport->physical_port_index);
1073 1039
1074 if (iport->ready_exit) 1040 if (iport->ready_exit)
1075 sci_port_invalidate_dummy_remote_node(iport); 1041 sci_port_invalidate_dummy_remote_node(iport);
@@ -1081,7 +1047,8 @@ static void sci_port_ready_substate_configuring_enter(struct sci_base_state_mach
1081 struct isci_host *ihost = iport->owning_controller; 1047 struct isci_host *ihost = iport->owning_controller;
1082 1048
1083 if (iport->active_phy_mask == 0) { 1049 if (iport->active_phy_mask == 0) {
1084 isci_port_not_ready(ihost, iport); 1050 dev_dbg(&ihost->pdev->dev, "%s: port%d !ready\n",
1051 __func__, iport->physical_port_index);
1085 1052
1086 port_state_machine_change(iport, SCI_PORT_SUB_WAITING); 1053 port_state_machine_change(iport, SCI_PORT_SUB_WAITING);
1087 } else 1054 } else
@@ -1097,8 +1064,8 @@ enum sci_status sci_port_start(struct isci_port *iport)
1097 1064
1098 state = iport->sm.current_state_id; 1065 state = iport->sm.current_state_id;
1099 if (state != SCI_PORT_STOPPED) { 1066 if (state != SCI_PORT_STOPPED) {
1100 dev_warn(sciport_to_dev(iport), 1067 dev_warn(sciport_to_dev(iport), "%s: in wrong state: %s\n",
1101 "%s: in wrong state: %d\n", __func__, state); 1068 __func__, port_state_name(state));
1102 return SCI_FAILURE_INVALID_STATE; 1069 return SCI_FAILURE_INVALID_STATE;
1103 } 1070 }
1104 1071
@@ -1172,8 +1139,8 @@ enum sci_status sci_port_stop(struct isci_port *iport)
1172 SCI_PORT_STOPPING); 1139 SCI_PORT_STOPPING);
1173 return SCI_SUCCESS; 1140 return SCI_SUCCESS;
1174 default: 1141 default:
1175 dev_warn(sciport_to_dev(iport), 1142 dev_warn(sciport_to_dev(iport), "%s: in wrong state: %s\n",
1176 "%s: in wrong state: %d\n", __func__, state); 1143 __func__, port_state_name(state));
1177 return SCI_FAILURE_INVALID_STATE; 1144 return SCI_FAILURE_INVALID_STATE;
1178 } 1145 }
1179} 1146}
@@ -1187,8 +1154,8 @@ static enum sci_status sci_port_hard_reset(struct isci_port *iport, u32 timeout)
1187 1154
1188 state = iport->sm.current_state_id; 1155 state = iport->sm.current_state_id;
1189 if (state != SCI_PORT_SUB_OPERATIONAL) { 1156 if (state != SCI_PORT_SUB_OPERATIONAL) {
1190 dev_warn(sciport_to_dev(iport), 1157 dev_warn(sciport_to_dev(iport), "%s: in wrong state: %s\n",
1191 "%s: in wrong state: %d\n", __func__, state); 1158 __func__, port_state_name(state));
1192 return SCI_FAILURE_INVALID_STATE; 1159 return SCI_FAILURE_INVALID_STATE;
1193 } 1160 }
1194 1161
@@ -1282,8 +1249,8 @@ enum sci_status sci_port_add_phy(struct isci_port *iport,
1282 SCI_PORT_SUB_CONFIGURING); 1249 SCI_PORT_SUB_CONFIGURING);
1283 return SCI_SUCCESS; 1250 return SCI_SUCCESS;
1284 default: 1251 default:
1285 dev_warn(sciport_to_dev(iport), 1252 dev_warn(sciport_to_dev(iport), "%s: in wrong state: %s\n",
1286 "%s: in wrong state: %d\n", __func__, state); 1253 __func__, port_state_name(state));
1287 return SCI_FAILURE_INVALID_STATE; 1254 return SCI_FAILURE_INVALID_STATE;
1288 } 1255 }
1289} 1256}
@@ -1332,8 +1299,8 @@ enum sci_status sci_port_remove_phy(struct isci_port *iport,
1332 SCI_PORT_SUB_CONFIGURING); 1299 SCI_PORT_SUB_CONFIGURING);
1333 return SCI_SUCCESS; 1300 return SCI_SUCCESS;
1334 default: 1301 default:
1335 dev_warn(sciport_to_dev(iport), 1302 dev_warn(sciport_to_dev(iport), "%s: in wrong state: %s\n",
1336 "%s: in wrong state: %d\n", __func__, state); 1303 __func__, port_state_name(state));
1337 return SCI_FAILURE_INVALID_STATE; 1304 return SCI_FAILURE_INVALID_STATE;
1338 } 1305 }
1339} 1306}
@@ -1375,8 +1342,8 @@ enum sci_status sci_port_link_up(struct isci_port *iport,
1375 sci_port_general_link_up_handler(iport, iphy, PF_RESUME); 1342 sci_port_general_link_up_handler(iport, iphy, PF_RESUME);
1376 return SCI_SUCCESS; 1343 return SCI_SUCCESS;
1377 default: 1344 default:
1378 dev_warn(sciport_to_dev(iport), 1345 dev_warn(sciport_to_dev(iport), "%s: in wrong state: %s\n",
1379 "%s: in wrong state: %d\n", __func__, state); 1346 __func__, port_state_name(state));
1380 return SCI_FAILURE_INVALID_STATE; 1347 return SCI_FAILURE_INVALID_STATE;
1381 } 1348 }
1382} 1349}
@@ -1405,8 +1372,8 @@ enum sci_status sci_port_link_down(struct isci_port *iport,
1405 sci_port_deactivate_phy(iport, iphy, false); 1372 sci_port_deactivate_phy(iport, iphy, false);
1406 return SCI_SUCCESS; 1373 return SCI_SUCCESS;
1407 default: 1374 default:
1408 dev_warn(sciport_to_dev(iport), 1375 dev_warn(sciport_to_dev(iport), "%s: in wrong state: %s\n",
1409 "%s: in wrong state: %d\n", __func__, state); 1376 __func__, port_state_name(state));
1410 return SCI_FAILURE_INVALID_STATE; 1377 return SCI_FAILURE_INVALID_STATE;
1411 } 1378 }
1412} 1379}
@@ -1425,8 +1392,8 @@ enum sci_status sci_port_start_io(struct isci_port *iport,
1425 iport->started_request_count++; 1392 iport->started_request_count++;
1426 return SCI_SUCCESS; 1393 return SCI_SUCCESS;
1427 default: 1394 default:
1428 dev_warn(sciport_to_dev(iport), 1395 dev_warn(sciport_to_dev(iport), "%s: in wrong state: %s\n",
1429 "%s: in wrong state: %d\n", __func__, state); 1396 __func__, port_state_name(state));
1430 return SCI_FAILURE_INVALID_STATE; 1397 return SCI_FAILURE_INVALID_STATE;
1431 } 1398 }
1432} 1399}
@@ -1440,8 +1407,8 @@ enum sci_status sci_port_complete_io(struct isci_port *iport,
1440 state = iport->sm.current_state_id; 1407 state = iport->sm.current_state_id;
1441 switch (state) { 1408 switch (state) {
1442 case SCI_PORT_STOPPED: 1409 case SCI_PORT_STOPPED:
1443 dev_warn(sciport_to_dev(iport), 1410 dev_warn(sciport_to_dev(iport), "%s: in wrong state: %s\n",
1444 "%s: in wrong state: %d\n", __func__, state); 1411 __func__, port_state_name(state));
1445 return SCI_FAILURE_INVALID_STATE; 1412 return SCI_FAILURE_INVALID_STATE;
1446 case SCI_PORT_STOPPING: 1413 case SCI_PORT_STOPPING:
1447 sci_port_decrement_request_count(iport); 1414 sci_port_decrement_request_count(iport);
@@ -1547,7 +1514,8 @@ static void sci_port_ready_state_enter(struct sci_base_state_machine *sm)
1547 if (prev_state == SCI_PORT_RESETTING) 1514 if (prev_state == SCI_PORT_RESETTING)
1548 isci_port_hard_reset_complete(iport, SCI_SUCCESS); 1515 isci_port_hard_reset_complete(iport, SCI_SUCCESS);
1549 else 1516 else
1550 isci_port_not_ready(ihost, iport); 1517 dev_dbg(&ihost->pdev->dev, "%s: port%d !ready\n",
1518 __func__, iport->physical_port_index);
1551 1519
1552 /* Post and suspend the dummy remote node context for this port. */ 1520 /* Post and suspend the dummy remote node context for this port. */
1553 sci_port_post_dummy_remote_node(iport); 1521 sci_port_post_dummy_remote_node(iport);
@@ -1644,22 +1612,7 @@ void isci_port_init(struct isci_port *iport, struct isci_host *ihost, int index)
1644{ 1612{
1645 INIT_LIST_HEAD(&iport->remote_dev_list); 1613 INIT_LIST_HEAD(&iport->remote_dev_list);
1646 INIT_LIST_HEAD(&iport->domain_dev_list); 1614 INIT_LIST_HEAD(&iport->domain_dev_list);
1647 spin_lock_init(&iport->state_lock);
1648 init_completion(&iport->start_complete);
1649 iport->isci_host = ihost; 1615 iport->isci_host = ihost;
1650 isci_port_change_state(iport, isci_freed);
1651}
1652
1653/**
1654 * isci_port_get_state() - This function gets the status of the port object.
1655 * @isci_port: This parameter points to the isci_port object
1656 *
1657 * status of the object as a isci_status enum.
1658 */
1659enum isci_status isci_port_get_state(
1660 struct isci_port *isci_port)
1661{
1662 return isci_port->status;
1663} 1616}
1664 1617
1665void sci_port_broadcast_change_received(struct isci_port *iport, struct isci_phy *iphy) 1618void sci_port_broadcast_change_received(struct isci_port *iport, struct isci_phy *iphy)
@@ -1670,6 +1623,11 @@ void sci_port_broadcast_change_received(struct isci_port *iport, struct isci_phy
1670 isci_port_bc_change_received(ihost, iport, iphy); 1623 isci_port_bc_change_received(ihost, iport, iphy);
1671} 1624}
1672 1625
1626static void wait_port_reset(struct isci_host *ihost, struct isci_port *iport)
1627{
1628 wait_event(ihost->eventq, !test_bit(IPORT_RESET_PENDING, &iport->state));
1629}
1630
1673int isci_port_perform_hard_reset(struct isci_host *ihost, struct isci_port *iport, 1631int isci_port_perform_hard_reset(struct isci_host *ihost, struct isci_port *iport,
1674 struct isci_phy *iphy) 1632 struct isci_phy *iphy)
1675{ 1633{
@@ -1680,9 +1638,8 @@ int isci_port_perform_hard_reset(struct isci_host *ihost, struct isci_port *ipor
1680 dev_dbg(&ihost->pdev->dev, "%s: iport = %p\n", 1638 dev_dbg(&ihost->pdev->dev, "%s: iport = %p\n",
1681 __func__, iport); 1639 __func__, iport);
1682 1640
1683 init_completion(&iport->hard_reset_complete);
1684
1685 spin_lock_irqsave(&ihost->scic_lock, flags); 1641 spin_lock_irqsave(&ihost->scic_lock, flags);
1642 set_bit(IPORT_RESET_PENDING, &iport->state);
1686 1643
1687 #define ISCI_PORT_RESET_TIMEOUT SCIC_SDS_SIGNATURE_FIS_TIMEOUT 1644 #define ISCI_PORT_RESET_TIMEOUT SCIC_SDS_SIGNATURE_FIS_TIMEOUT
1688 status = sci_port_hard_reset(iport, ISCI_PORT_RESET_TIMEOUT); 1645 status = sci_port_hard_reset(iport, ISCI_PORT_RESET_TIMEOUT);
@@ -1690,7 +1647,7 @@ int isci_port_perform_hard_reset(struct isci_host *ihost, struct isci_port *ipor
1690 spin_unlock_irqrestore(&ihost->scic_lock, flags); 1647 spin_unlock_irqrestore(&ihost->scic_lock, flags);
1691 1648
1692 if (status == SCI_SUCCESS) { 1649 if (status == SCI_SUCCESS) {
1693 wait_for_completion(&iport->hard_reset_complete); 1650 wait_port_reset(ihost, iport);
1694 1651
1695 dev_dbg(&ihost->pdev->dev, 1652 dev_dbg(&ihost->pdev->dev,
1696 "%s: iport = %p; hard reset completion\n", 1653 "%s: iport = %p; hard reset completion\n",
@@ -1704,6 +1661,8 @@ int isci_port_perform_hard_reset(struct isci_host *ihost, struct isci_port *ipor
1704 __func__, iport, iport->hard_reset_status); 1661 __func__, iport, iport->hard_reset_status);
1705 } 1662 }
1706 } else { 1663 } else {
1664 clear_bit(IPORT_RESET_PENDING, &iport->state);
1665 wake_up(&ihost->eventq);
1707 ret = TMF_RESP_FUNC_FAILED; 1666 ret = TMF_RESP_FUNC_FAILED;
1708 1667
1709 dev_err(&ihost->pdev->dev, 1668 dev_err(&ihost->pdev->dev,
@@ -1726,24 +1685,80 @@ int isci_port_perform_hard_reset(struct isci_host *ihost, struct isci_port *ipor
1726 return ret; 1685 return ret;
1727} 1686}
1728 1687
1729/** 1688int isci_ata_check_ready(struct domain_device *dev)
1730 * isci_port_deformed() - This function is called by libsas when a port becomes 1689{
1731 * inactive. 1690 struct isci_port *iport = dev->port->lldd_port;
1732 * @phy: This parameter specifies the libsas phy with the inactive port. 1691 struct isci_host *ihost = dev_to_ihost(dev);
1733 * 1692 struct isci_remote_device *idev;
1734 */ 1693 unsigned long flags;
1694 int rc = 0;
1695
1696 spin_lock_irqsave(&ihost->scic_lock, flags);
1697 idev = isci_lookup_device(dev);
1698 spin_unlock_irqrestore(&ihost->scic_lock, flags);
1699
1700 if (!idev)
1701 goto out;
1702
1703 if (test_bit(IPORT_RESET_PENDING, &iport->state))
1704 goto out;
1705
1706 rc = !!iport->active_phy_mask;
1707 out:
1708 isci_put_device(idev);
1709
1710 return rc;
1711}
1712
1735void isci_port_deformed(struct asd_sas_phy *phy) 1713void isci_port_deformed(struct asd_sas_phy *phy)
1736{ 1714{
1737 pr_debug("%s: sas_phy = %p\n", __func__, phy); 1715 struct isci_host *ihost = phy->ha->lldd_ha;
1716 struct isci_port *iport = phy->port->lldd_port;
1717 unsigned long flags;
1718 int i;
1719
1720 /* we got a port notification on a port that was subsequently
1721 * torn down and libsas is just now catching up
1722 */
1723 if (!iport)
1724 return;
1725
1726 spin_lock_irqsave(&ihost->scic_lock, flags);
1727 for (i = 0; i < SCI_MAX_PHYS; i++) {
1728 if (iport->active_phy_mask & 1 << i)
1729 break;
1730 }
1731 spin_unlock_irqrestore(&ihost->scic_lock, flags);
1732
1733 if (i >= SCI_MAX_PHYS)
1734 dev_dbg(&ihost->pdev->dev, "%s: port: %ld\n",
1735 __func__, (long) (iport - &ihost->ports[0]));
1738} 1736}
1739 1737
1740/**
1741 * isci_port_formed() - This function is called by libsas when a port becomes
1742 * active.
1743 * @phy: This parameter specifies the libsas phy with the active port.
1744 *
1745 */
1746void isci_port_formed(struct asd_sas_phy *phy) 1738void isci_port_formed(struct asd_sas_phy *phy)
1747{ 1739{
1748 pr_debug("%s: sas_phy = %p, sas_port = %p\n", __func__, phy, phy->port); 1740 struct isci_host *ihost = phy->ha->lldd_ha;
1741 struct isci_phy *iphy = to_iphy(phy);
1742 struct asd_sas_port *port = phy->port;
1743 struct isci_port *iport;
1744 unsigned long flags;
1745 int i;
1746
1747 /* initial ports are formed as the driver is still initializing,
1748 * wait for that process to complete
1749 */
1750 wait_for_start(ihost);
1751
1752 spin_lock_irqsave(&ihost->scic_lock, flags);
1753 for (i = 0; i < SCI_MAX_PORTS; i++) {
1754 iport = &ihost->ports[i];
1755 if (iport->active_phy_mask & 1 << iphy->phy_index)
1756 break;
1757 }
1758 spin_unlock_irqrestore(&ihost->scic_lock, flags);
1759
1760 if (i >= SCI_MAX_PORTS)
1761 iport = NULL;
1762
1763 port->lldd_port = iport;
1749} 1764}
diff --git a/drivers/scsi/isci/port.h b/drivers/scsi/isci/port.h
index 08116090eb70..6b56240c2051 100644
--- a/drivers/scsi/isci/port.h
+++ b/drivers/scsi/isci/port.h
@@ -95,14 +95,11 @@ enum isci_status {
95 * @timer: timeout start/stop operations 95 * @timer: timeout start/stop operations
96 */ 96 */
97struct isci_port { 97struct isci_port {
98 enum isci_status status;
99 struct isci_host *isci_host; 98 struct isci_host *isci_host;
100 struct asd_sas_port sas_port;
101 struct list_head remote_dev_list; 99 struct list_head remote_dev_list;
102 spinlock_t state_lock;
103 struct list_head domain_dev_list; 100 struct list_head domain_dev_list;
104 struct completion start_complete; 101 #define IPORT_RESET_PENDING 0
105 struct completion hard_reset_complete; 102 unsigned long state;
106 enum sci_status hard_reset_status; 103 enum sci_status hard_reset_status;
107 struct sci_base_state_machine sm; 104 struct sci_base_state_machine sm;
108 bool ready_exit; 105 bool ready_exit;
@@ -147,70 +144,47 @@ struct sci_port_properties {
147}; 144};
148 145
149/** 146/**
150 * enum sci_port_states - This enumeration depicts all the states for the 147 * enum sci_port_states - port state machine states
151 * common port state machine. 148 * @SCI_PORT_STOPPED: port has successfully been stopped. In this state
152 * 149 * no new IO operations are permitted. This state is
153 * 150 * entered from the STOPPING state.
151 * @SCI_PORT_STOPPING: port is in the process of stopping. In this
152 * state no new IO operations are permitted, but
153 * existing IO operations are allowed to complete.
154 * This state is entered from the READY state.
155 * @SCI_PORT_READY: port is now ready. Thus, the user is able to
156 * perform IO operations on this port. This state is
157 * entered from the STARTING state.
158 * @SCI_PORT_SUB_WAITING: port is started and ready but has no active
159 * phys.
160 * @SCI_PORT_SUB_OPERATIONAL: port is started and ready and there is at
161 * least one phy operational.
162 * @SCI_PORT_SUB_CONFIGURING: port is started and there was an
163 * add/remove phy event. This state is only
164 * used in Automatic Port Configuration Mode
165 * (APC)
166 * @SCI_PORT_RESETTING: port is in the process of performing a hard
167 * reset. Thus, the user is unable to perform IO
168 * operations on this port. This state is entered
169 * from the READY state.
170 * @SCI_PORT_FAILED: port has failed a reset request. This state is
171 * entered when a port reset request times out. This
172 * state is entered from the RESETTING state.
154 */ 173 */
155enum sci_port_states { 174#define PORT_STATES {\
156 /** 175 C(PORT_STOPPED),\
157 * This state indicates that the port has successfully been stopped. 176 C(PORT_STOPPING),\
158 * In this state no new IO operations are permitted. 177 C(PORT_READY),\
159 * This state is entered from the STOPPING state. 178 C(PORT_SUB_WAITING),\
160 */ 179 C(PORT_SUB_OPERATIONAL),\
161 SCI_PORT_STOPPED, 180 C(PORT_SUB_CONFIGURING),\
162 181 C(PORT_RESETTING),\
163 /** 182 C(PORT_FAILED),\
164 * This state indicates that the port is in the process of stopping. 183 }
165 * In this state no new IO operations are permitted, but existing IO 184#undef C
166 * operations are allowed to complete. 185#define C(a) SCI_##a
167 * This state is entered from the READY state. 186enum sci_port_states PORT_STATES;
168 */ 187#undef C
169 SCI_PORT_STOPPING,
170
171 /**
172 * This state indicates the port is now ready. Thus, the user is
173 * able to perform IO operations on this port.
174 * This state is entered from the STARTING state.
175 */
176 SCI_PORT_READY,
177
178 /**
179 * The substate where the port is started and ready but has no
180 * active phys.
181 */
182 SCI_PORT_SUB_WAITING,
183
184 /**
185 * The substate where the port is started and ready and there is
186 * at least one phy operational.
187 */
188 SCI_PORT_SUB_OPERATIONAL,
189
190 /**
191 * The substate where the port is started and there was an
192 * add/remove phy event. This state is only used in Automatic
193 * Port Configuration Mode (APC)
194 */
195 SCI_PORT_SUB_CONFIGURING,
196
197 /**
198 * This state indicates the port is in the process of performing a hard
199 * reset. Thus, the user is unable to perform IO operations on this
200 * port.
201 * This state is entered from the READY state.
202 */
203 SCI_PORT_RESETTING,
204
205 /**
206 * This state indicates the port has failed a reset request. This state
207 * is entered when a port reset request times out.
208 * This state is entered from the RESETTING state.
209 */
210 SCI_PORT_FAILED,
211
212
213};
214 188
215static inline void sci_port_decrement_request_count(struct isci_port *iport) 189static inline void sci_port_decrement_request_count(struct isci_port *iport)
216{ 190{
@@ -296,9 +270,6 @@ void sci_port_get_attached_sas_address(
296 struct isci_port *iport, 270 struct isci_port *iport,
297 struct sci_sas_address *sas_address); 271 struct sci_sas_address *sas_address);
298 272
299enum isci_status isci_port_get_state(
300 struct isci_port *isci_port);
301
302void isci_port_formed(struct asd_sas_phy *); 273void isci_port_formed(struct asd_sas_phy *);
303void isci_port_deformed(struct asd_sas_phy *); 274void isci_port_deformed(struct asd_sas_phy *);
304 275
@@ -309,4 +280,5 @@ void isci_port_init(
309 280
310int isci_port_perform_hard_reset(struct isci_host *ihost, struct isci_port *iport, 281int isci_port_perform_hard_reset(struct isci_host *ihost, struct isci_port *iport,
311 struct isci_phy *iphy); 282 struct isci_phy *iphy);
283int isci_ata_check_ready(struct domain_device *dev);
312#endif /* !defined(_ISCI_PORT_H_) */ 284#endif /* !defined(_ISCI_PORT_H_) */
diff --git a/drivers/scsi/isci/registers.h b/drivers/scsi/isci/registers.h
index eaa541afc755..7eb0ccd45fe6 100644
--- a/drivers/scsi/isci/registers.h
+++ b/drivers/scsi/isci/registers.h
@@ -370,6 +370,27 @@ struct scu_iit_entry {
370 >> SMU_DEVICE_CONTEXT_CAPACITY_MAX_RNC_SHIFT \ 370 >> SMU_DEVICE_CONTEXT_CAPACITY_MAX_RNC_SHIFT \
371 ) 371 )
372 372
373/* ***************************************************************************** */
374#define SMU_CLOCK_GATING_CONTROL_IDLE_ENABLE_SHIFT (0)
375#define SMU_CLOCK_GATING_CONTROL_IDLE_ENABLE_MASK (0x00000001)
376#define SMU_CLOCK_GATING_CONTROL_XCLK_ENABLE_SHIFT (1)
377#define SMU_CLOCK_GATING_CONTROL_XCLK_ENABLE_MASK (0x00000002)
378#define SMU_CLOCK_GATING_CONTROL_TXCLK_ENABLE_SHIFT (2)
379#define SMU_CLOCK_GATING_CONTROL_TXCLK_ENABLE_MASK (0x00000004)
380#define SMU_CLOCK_GATING_CONTROL_REGCLK_ENABLE_SHIFT (3)
381#define SMU_CLOCK_GATING_CONTROL_REGCLK_ENABLE_MASK (0x00000008)
382#define SMU_CLOCK_GATING_CONTROL_IDLE_TIMEOUT_SHIFT (16)
383#define SMU_CLOCK_GATING_CONTROL_IDLE_TIMEOUT_MASK (0x000F0000)
384#define SMU_CLOCK_GATING_CONTROL_FORCE_IDLE_SHIFT (31)
385#define SMU_CLOCK_GATING_CONTROL_FORCE_IDLE_MASK (0x80000000)
386#define SMU_CLOCK_GATING_CONTROL_RESERVED_MASK (0x7FF0FFF0)
387
388#define SMU_CGUCR_GEN_VAL(name, value) \
389 SCU_GEN_VALUE(SMU_CLOCK_GATING_CONTROL_##name, value)
390
391#define SMU_CGUCR_GEN_BIT(name) \
392 SCU_GEN_BIT(SMU_CLOCK_GATING_CONTROL_##name)
393
373/* -------------------------------------------------------------------------- */ 394/* -------------------------------------------------------------------------- */
374 395
375#define SMU_CONTROL_STATUS_TASK_CONTEXT_RANGE_ENABLE_SHIFT (0) 396#define SMU_CONTROL_STATUS_TASK_CONTEXT_RANGE_ENABLE_SHIFT (0)
@@ -992,8 +1013,10 @@ struct smu_registers {
992 u32 mmr_address_window; 1013 u32 mmr_address_window;
993/* 0x00A4 SMDW */ 1014/* 0x00A4 SMDW */
994 u32 mmr_data_window; 1015 u32 mmr_data_window;
995 u32 reserved_A8; 1016/* 0x00A8 CGUCR */
996 u32 reserved_AC; 1017 u32 clock_gating_control;
1018/* 0x00AC CGUPC */
1019 u32 clock_gating_performance;
997/* A whole bunch of reserved space */ 1020/* A whole bunch of reserved space */
998 u32 reserved_Bx[4]; 1021 u32 reserved_Bx[4];
999 u32 reserved_Cx[4]; 1022 u32 reserved_Cx[4];
diff --git a/drivers/scsi/isci/remote_device.c b/drivers/scsi/isci/remote_device.c
index dd74b6ceeb82..8f501b0a81d6 100644
--- a/drivers/scsi/isci/remote_device.c
+++ b/drivers/scsi/isci/remote_device.c
@@ -62,6 +62,16 @@
62#include "scu_event_codes.h" 62#include "scu_event_codes.h"
63#include "task.h" 63#include "task.h"
64 64
65#undef C
66#define C(a) (#a)
67const char *dev_state_name(enum sci_remote_device_states state)
68{
69 static const char * const strings[] = REMOTE_DEV_STATES;
70
71 return strings[state];
72}
73#undef C
74
65/** 75/**
66 * isci_remote_device_not_ready() - This function is called by the ihost when 76 * isci_remote_device_not_ready() - This function is called by the ihost when
67 * the remote device is not ready. We mark the isci device as ready (not 77 * the remote device is not ready. We mark the isci device as ready (not
@@ -167,8 +177,8 @@ enum sci_status sci_remote_device_stop(struct isci_remote_device *idev,
167 case SCI_DEV_FAILED: 177 case SCI_DEV_FAILED:
168 case SCI_DEV_FINAL: 178 case SCI_DEV_FINAL:
169 default: 179 default:
170 dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %d\n", 180 dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %s\n",
171 __func__, state); 181 __func__, dev_state_name(state));
172 return SCI_FAILURE_INVALID_STATE; 182 return SCI_FAILURE_INVALID_STATE;
173 case SCI_DEV_STOPPED: 183 case SCI_DEV_STOPPED:
174 return SCI_SUCCESS; 184 return SCI_SUCCESS;
@@ -226,8 +236,8 @@ enum sci_status sci_remote_device_reset(struct isci_remote_device *idev)
226 case SCI_DEV_RESETTING: 236 case SCI_DEV_RESETTING:
227 case SCI_DEV_FINAL: 237 case SCI_DEV_FINAL:
228 default: 238 default:
229 dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %d\n", 239 dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %s\n",
230 __func__, state); 240 __func__, dev_state_name(state));
231 return SCI_FAILURE_INVALID_STATE; 241 return SCI_FAILURE_INVALID_STATE;
232 case SCI_DEV_READY: 242 case SCI_DEV_READY:
233 case SCI_STP_DEV_IDLE: 243 case SCI_STP_DEV_IDLE:
@@ -246,8 +256,8 @@ enum sci_status sci_remote_device_reset_complete(struct isci_remote_device *idev
246 enum sci_remote_device_states state = sm->current_state_id; 256 enum sci_remote_device_states state = sm->current_state_id;
247 257
248 if (state != SCI_DEV_RESETTING) { 258 if (state != SCI_DEV_RESETTING) {
249 dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %d\n", 259 dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %s\n",
250 __func__, state); 260 __func__, dev_state_name(state));
251 return SCI_FAILURE_INVALID_STATE; 261 return SCI_FAILURE_INVALID_STATE;
252 } 262 }
253 263
@@ -262,8 +272,8 @@ enum sci_status sci_remote_device_suspend(struct isci_remote_device *idev,
262 enum sci_remote_device_states state = sm->current_state_id; 272 enum sci_remote_device_states state = sm->current_state_id;
263 273
264 if (state != SCI_STP_DEV_CMD) { 274 if (state != SCI_STP_DEV_CMD) {
265 dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %d\n", 275 dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %s\n",
266 __func__, state); 276 __func__, dev_state_name(state));
267 return SCI_FAILURE_INVALID_STATE; 277 return SCI_FAILURE_INVALID_STATE;
268 } 278 }
269 279
@@ -287,8 +297,8 @@ enum sci_status sci_remote_device_frame_handler(struct isci_remote_device *idev,
287 case SCI_SMP_DEV_IDLE: 297 case SCI_SMP_DEV_IDLE:
288 case SCI_DEV_FINAL: 298 case SCI_DEV_FINAL:
289 default: 299 default:
290 dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %d\n", 300 dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %s\n",
291 __func__, state); 301 __func__, dev_state_name(state));
292 /* Return the frame back to the controller */ 302 /* Return the frame back to the controller */
293 sci_controller_release_frame(ihost, frame_index); 303 sci_controller_release_frame(ihost, frame_index);
294 return SCI_FAILURE_INVALID_STATE; 304 return SCI_FAILURE_INVALID_STATE;
@@ -502,8 +512,8 @@ enum sci_status sci_remote_device_start_io(struct isci_host *ihost,
502 case SCI_DEV_RESETTING: 512 case SCI_DEV_RESETTING:
503 case SCI_DEV_FINAL: 513 case SCI_DEV_FINAL:
504 default: 514 default:
505 dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %d\n", 515 dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %s\n",
506 __func__, state); 516 __func__, dev_state_name(state));
507 return SCI_FAILURE_INVALID_STATE; 517 return SCI_FAILURE_INVALID_STATE;
508 case SCI_DEV_READY: 518 case SCI_DEV_READY:
509 /* attempt to start an io request for this device object. The remote 519 /* attempt to start an io request for this device object. The remote
@@ -637,8 +647,8 @@ enum sci_status sci_remote_device_complete_io(struct isci_host *ihost,
637 case SCI_DEV_FAILED: 647 case SCI_DEV_FAILED:
638 case SCI_DEV_FINAL: 648 case SCI_DEV_FINAL:
639 default: 649 default:
640 dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %d\n", 650 dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %s\n",
641 __func__, state); 651 __func__, dev_state_name(state));
642 return SCI_FAILURE_INVALID_STATE; 652 return SCI_FAILURE_INVALID_STATE;
643 case SCI_DEV_READY: 653 case SCI_DEV_READY:
644 case SCI_STP_DEV_AWAIT_RESET: 654 case SCI_STP_DEV_AWAIT_RESET:
@@ -721,8 +731,8 @@ enum sci_status sci_remote_device_start_task(struct isci_host *ihost,
721 case SCI_DEV_RESETTING: 731 case SCI_DEV_RESETTING:
722 case SCI_DEV_FINAL: 732 case SCI_DEV_FINAL:
723 default: 733 default:
724 dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %d\n", 734 dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %s\n",
725 __func__, state); 735 __func__, dev_state_name(state));
726 return SCI_FAILURE_INVALID_STATE; 736 return SCI_FAILURE_INVALID_STATE;
727 case SCI_STP_DEV_IDLE: 737 case SCI_STP_DEV_IDLE:
728 case SCI_STP_DEV_CMD: 738 case SCI_STP_DEV_CMD:
@@ -853,8 +863,8 @@ static enum sci_status sci_remote_device_destruct(struct isci_remote_device *ide
853 struct isci_host *ihost; 863 struct isci_host *ihost;
854 864
855 if (state != SCI_DEV_STOPPED) { 865 if (state != SCI_DEV_STOPPED) {
856 dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %d\n", 866 dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %s\n",
857 __func__, state); 867 __func__, dev_state_name(state));
858 return SCI_FAILURE_INVALID_STATE; 868 return SCI_FAILURE_INVALID_STATE;
859 } 869 }
860 870
@@ -1204,8 +1214,8 @@ static enum sci_status sci_remote_device_start(struct isci_remote_device *idev,
1204 enum sci_status status; 1214 enum sci_status status;
1205 1215
1206 if (state != SCI_DEV_STOPPED) { 1216 if (state != SCI_DEV_STOPPED) {
1207 dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %d\n", 1217 dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %s\n",
1208 __func__, state); 1218 __func__, dev_state_name(state));
1209 return SCI_FAILURE_INVALID_STATE; 1219 return SCI_FAILURE_INVALID_STATE;
1210 } 1220 }
1211 1221
@@ -1308,7 +1318,6 @@ void isci_remote_device_release(struct kref *kref)
1308 clear_bit(IDEV_STOP_PENDING, &idev->flags); 1318 clear_bit(IDEV_STOP_PENDING, &idev->flags);
1309 clear_bit(IDEV_IO_READY, &idev->flags); 1319 clear_bit(IDEV_IO_READY, &idev->flags);
1310 clear_bit(IDEV_GONE, &idev->flags); 1320 clear_bit(IDEV_GONE, &idev->flags);
1311 clear_bit(IDEV_EH, &idev->flags);
1312 smp_mb__before_clear_bit(); 1321 smp_mb__before_clear_bit();
1313 clear_bit(IDEV_ALLOCATED, &idev->flags); 1322 clear_bit(IDEV_ALLOCATED, &idev->flags);
1314 wake_up(&ihost->eventq); 1323 wake_up(&ihost->eventq);
@@ -1381,34 +1390,17 @@ void isci_remote_device_gone(struct domain_device *dev)
1381 * 1390 *
1382 * status, zero indicates success. 1391 * status, zero indicates success.
1383 */ 1392 */
1384int isci_remote_device_found(struct domain_device *domain_dev) 1393int isci_remote_device_found(struct domain_device *dev)
1385{ 1394{
1386 struct isci_host *isci_host = dev_to_ihost(domain_dev); 1395 struct isci_host *isci_host = dev_to_ihost(dev);
1387 struct isci_port *isci_port; 1396 struct isci_port *isci_port = dev->port->lldd_port;
1388 struct isci_phy *isci_phy;
1389 struct asd_sas_port *sas_port;
1390 struct asd_sas_phy *sas_phy;
1391 struct isci_remote_device *isci_device; 1397 struct isci_remote_device *isci_device;
1392 enum sci_status status; 1398 enum sci_status status;
1393 1399
1394 dev_dbg(&isci_host->pdev->dev, 1400 dev_dbg(&isci_host->pdev->dev,
1395 "%s: domain_device = %p\n", __func__, domain_dev); 1401 "%s: domain_device = %p\n", __func__, dev);
1396
1397 wait_for_start(isci_host);
1398
1399 sas_port = domain_dev->port;
1400 sas_phy = list_first_entry(&sas_port->phy_list, struct asd_sas_phy,
1401 port_phy_el);
1402 isci_phy = to_iphy(sas_phy);
1403 isci_port = isci_phy->isci_port;
1404
1405 /* we are being called for a device on this port,
1406 * so it has to come up eventually
1407 */
1408 wait_for_completion(&isci_port->start_complete);
1409 1402
1410 if ((isci_stopping == isci_port_get_state(isci_port)) || 1403 if (!isci_port)
1411 (isci_stopped == isci_port_get_state(isci_port)))
1412 return -ENODEV; 1404 return -ENODEV;
1413 1405
1414 isci_device = isci_remote_device_alloc(isci_host, isci_port); 1406 isci_device = isci_remote_device_alloc(isci_host, isci_port);
@@ -1419,7 +1411,7 @@ int isci_remote_device_found(struct domain_device *domain_dev)
1419 INIT_LIST_HEAD(&isci_device->node); 1411 INIT_LIST_HEAD(&isci_device->node);
1420 1412
1421 spin_lock_irq(&isci_host->scic_lock); 1413 spin_lock_irq(&isci_host->scic_lock);
1422 isci_device->domain_dev = domain_dev; 1414 isci_device->domain_dev = dev;
1423 isci_device->isci_port = isci_port; 1415 isci_device->isci_port = isci_port;
1424 list_add_tail(&isci_device->node, &isci_port->remote_dev_list); 1416 list_add_tail(&isci_device->node, &isci_port->remote_dev_list);
1425 1417
@@ -1432,7 +1424,7 @@ int isci_remote_device_found(struct domain_device *domain_dev)
1432 1424
1433 if (status == SCI_SUCCESS) { 1425 if (status == SCI_SUCCESS) {
1434 /* device came up, advertise it to the world */ 1426 /* device came up, advertise it to the world */
1435 domain_dev->lldd_dev = isci_device; 1427 dev->lldd_dev = isci_device;
1436 } else 1428 } else
1437 isci_put_device(isci_device); 1429 isci_put_device(isci_device);
1438 spin_unlock_irq(&isci_host->scic_lock); 1430 spin_unlock_irq(&isci_host->scic_lock);
diff --git a/drivers/scsi/isci/remote_device.h b/drivers/scsi/isci/remote_device.h
index 483ee50152f3..58637ee08f55 100644
--- a/drivers/scsi/isci/remote_device.h
+++ b/drivers/scsi/isci/remote_device.h
@@ -82,10 +82,9 @@ struct isci_remote_device {
82 #define IDEV_START_PENDING 0 82 #define IDEV_START_PENDING 0
83 #define IDEV_STOP_PENDING 1 83 #define IDEV_STOP_PENDING 1
84 #define IDEV_ALLOCATED 2 84 #define IDEV_ALLOCATED 2
85 #define IDEV_EH 3 85 #define IDEV_GONE 3
86 #define IDEV_GONE 4 86 #define IDEV_IO_READY 4
87 #define IDEV_IO_READY 5 87 #define IDEV_IO_NCQERROR 5
88 #define IDEV_IO_NCQERROR 6
89 unsigned long flags; 88 unsigned long flags;
90 struct kref kref; 89 struct kref kref;
91 struct isci_port *isci_port; 90 struct isci_port *isci_port;
@@ -180,122 +179,101 @@ enum sci_status sci_remote_device_reset_complete(
180/** 179/**
181 * enum sci_remote_device_states - This enumeration depicts all the states 180 * enum sci_remote_device_states - This enumeration depicts all the states
182 * for the common remote device state machine. 181 * for the common remote device state machine.
182 * @SCI_DEV_INITIAL: Simply the initial state for the base remote device
183 * state machine.
183 * 184 *
185 * @SCI_DEV_STOPPED: This state indicates that the remote device has
186 * successfully been stopped. In this state no new IO operations are
187 * permitted. This state is entered from the INITIAL state. This state
188 * is entered from the STOPPING state.
184 * 189 *
190 * @SCI_DEV_STARTING: This state indicates the the remote device is in
191 * the process of becoming ready (i.e. starting). In this state no new
192 * IO operations are permitted. This state is entered from the STOPPED
193 * state.
194 *
195 * @SCI_DEV_READY: This state indicates the remote device is now ready.
196 * Thus, the user is able to perform IO operations on the remote device.
197 * This state is entered from the STARTING state.
198 *
199 * @SCI_STP_DEV_IDLE: This is the idle substate for the stp remote
200 * device. When there are no active IO for the device it is is in this
201 * state.
202 *
203 * @SCI_STP_DEV_CMD: This is the command state for for the STP remote
204 * device. This state is entered when the device is processing a
205 * non-NCQ command. The device object will fail any new start IO
206 * requests until this command is complete.
207 *
208 * @SCI_STP_DEV_NCQ: This is the NCQ state for the STP remote device.
209 * This state is entered when the device is processing an NCQ reuqest.
210 * It will remain in this state so long as there is one or more NCQ
211 * requests being processed.
212 *
213 * @SCI_STP_DEV_NCQ_ERROR: This is the NCQ error state for the STP
214 * remote device. This state is entered when an SDB error FIS is
215 * received by the device object while in the NCQ state. The device
216 * object will only accept a READ LOG command while in this state.
217 *
218 * @SCI_STP_DEV_ATAPI_ERROR: This is the ATAPI error state for the STP
219 * ATAPI remote device. This state is entered when ATAPI device sends
220 * error status FIS without data while the device object is in CMD
221 * state. A suspension event is expected in this state. The device
222 * object will resume right away.
223 *
224 * @SCI_STP_DEV_AWAIT_RESET: This is the READY substate indicates the
225 * device is waiting for the RESET task coming to be recovered from
226 * certain hardware specific error.
227 *
228 * @SCI_SMP_DEV_IDLE: This is the ready operational substate for the
229 * remote device. This is the normal operational state for a remote
230 * device.
231 *
232 * @SCI_SMP_DEV_CMD: This is the suspended state for the remote device.
233 * This is the state that the device is placed in when a RNC suspend is
234 * received by the SCU hardware.
235 *
236 * @SCI_DEV_STOPPING: This state indicates that the remote device is in
237 * the process of stopping. In this state no new IO operations are
238 * permitted, but existing IO operations are allowed to complete. This
239 * state is entered from the READY state. This state is entered from
240 * the FAILED state.
241 *
242 * @SCI_DEV_FAILED: This state indicates that the remote device has
243 * failed. In this state no new IO operations are permitted. This
244 * state is entered from the INITIALIZING state. This state is entered
245 * from the READY state.
246 *
247 * @SCI_DEV_RESETTING: This state indicates the device is being reset.
248 * In this state no new IO operations are permitted. This state is
249 * entered from the READY state.
250 *
251 * @SCI_DEV_FINAL: Simply the final state for the base remote device
252 * state machine.
185 */ 253 */
186enum sci_remote_device_states { 254#define REMOTE_DEV_STATES {\
187 /** 255 C(DEV_INITIAL),\
188 * Simply the initial state for the base remote device state machine. 256 C(DEV_STOPPED),\
189 */ 257 C(DEV_STARTING),\
190 SCI_DEV_INITIAL, 258 C(DEV_READY),\
191 259 C(STP_DEV_IDLE),\
192 /** 260 C(STP_DEV_CMD),\
193 * This state indicates that the remote device has successfully been 261 C(STP_DEV_NCQ),\
194 * stopped. In this state no new IO operations are permitted. 262 C(STP_DEV_NCQ_ERROR),\
195 * This state is entered from the INITIAL state. 263 C(STP_DEV_ATAPI_ERROR),\
196 * This state is entered from the STOPPING state. 264 C(STP_DEV_AWAIT_RESET),\
197 */ 265 C(SMP_DEV_IDLE),\
198 SCI_DEV_STOPPED, 266 C(SMP_DEV_CMD),\
199 267 C(DEV_STOPPING),\
200 /** 268 C(DEV_FAILED),\
201 * This state indicates the the remote device is in the process of 269 C(DEV_RESETTING),\
202 * becoming ready (i.e. starting). In this state no new IO operations 270 C(DEV_FINAL),\
203 * are permitted. 271 }
204 * This state is entered from the STOPPED state. 272#undef C
205 */ 273#define C(a) SCI_##a
206 SCI_DEV_STARTING, 274enum sci_remote_device_states REMOTE_DEV_STATES;
207 275#undef C
208 /** 276const char *dev_state_name(enum sci_remote_device_states state);
209 * This state indicates the remote device is now ready. Thus, the user
210 * is able to perform IO operations on the remote device.
211 * This state is entered from the STARTING state.
212 */
213 SCI_DEV_READY,
214
215 /**
216 * This is the idle substate for the stp remote device. When there are no
217 * active IO for the device it is is in this state.
218 */
219 SCI_STP_DEV_IDLE,
220
221 /**
222 * This is the command state for for the STP remote device. This state is
223 * entered when the device is processing a non-NCQ command. The device object
224 * will fail any new start IO requests until this command is complete.
225 */
226 SCI_STP_DEV_CMD,
227
228 /**
229 * This is the NCQ state for the STP remote device. This state is entered
230 * when the device is processing an NCQ reuqest. It will remain in this state
231 * so long as there is one or more NCQ requests being processed.
232 */
233 SCI_STP_DEV_NCQ,
234
235 /**
236 * This is the NCQ error state for the STP remote device. This state is
237 * entered when an SDB error FIS is received by the device object while in the
238 * NCQ state. The device object will only accept a READ LOG command while in
239 * this state.
240 */
241 SCI_STP_DEV_NCQ_ERROR,
242
243 /**
244 * This is the ATAPI error state for the STP ATAPI remote device.
245 * This state is entered when ATAPI device sends error status FIS
246 * without data while the device object is in CMD state.
247 * A suspension event is expected in this state.
248 * The device object will resume right away.
249 */
250 SCI_STP_DEV_ATAPI_ERROR,
251
252 /**
253 * This is the READY substate indicates the device is waiting for the RESET task
254 * coming to be recovered from certain hardware specific error.
255 */
256 SCI_STP_DEV_AWAIT_RESET,
257
258 /**
259 * This is the ready operational substate for the remote device. This is the
260 * normal operational state for a remote device.
261 */
262 SCI_SMP_DEV_IDLE,
263
264 /**
265 * This is the suspended state for the remote device. This is the state that
266 * the device is placed in when a RNC suspend is received by the SCU hardware.
267 */
268 SCI_SMP_DEV_CMD,
269
270 /**
271 * This state indicates that the remote device is in the process of
272 * stopping. In this state no new IO operations are permitted, but
273 * existing IO operations are allowed to complete.
274 * This state is entered from the READY state.
275 * This state is entered from the FAILED state.
276 */
277 SCI_DEV_STOPPING,
278
279 /**
280 * This state indicates that the remote device has failed.
281 * In this state no new IO operations are permitted.
282 * This state is entered from the INITIALIZING state.
283 * This state is entered from the READY state.
284 */
285 SCI_DEV_FAILED,
286
287 /**
288 * This state indicates the device is being reset.
289 * In this state no new IO operations are permitted.
290 * This state is entered from the READY state.
291 */
292 SCI_DEV_RESETTING,
293
294 /**
295 * Simply the final state for the base remote device state machine.
296 */
297 SCI_DEV_FINAL,
298};
299 277
300static inline struct isci_remote_device *rnc_to_dev(struct sci_remote_node_context *rnc) 278static inline struct isci_remote_device *rnc_to_dev(struct sci_remote_node_context *rnc)
301{ 279{
diff --git a/drivers/scsi/isci/remote_node_context.c b/drivers/scsi/isci/remote_node_context.c
index 748e8339d1ec..3a9463481f38 100644
--- a/drivers/scsi/isci/remote_node_context.c
+++ b/drivers/scsi/isci/remote_node_context.c
@@ -60,18 +60,15 @@
60#include "scu_event_codes.h" 60#include "scu_event_codes.h"
61#include "scu_task_context.h" 61#include "scu_task_context.h"
62 62
63#undef C
64#define C(a) (#a)
65const char *rnc_state_name(enum scis_sds_remote_node_context_states state)
66{
67 static const char * const strings[] = RNC_STATES;
63 68
64/** 69 return strings[state];
65 * 70}
66 * @sci_rnc: The RNC for which the is posted request is being made. 71#undef C
67 *
68 * This method will return true if the RNC is not in the initial state. In all
69 * other states the RNC is considered active and this will return true. The
70 * destroy request of the state machine drives the RNC back to the initial
71 * state. If the state machine changes then this routine will also have to be
72 * changed. bool true if the state machine is not in the initial state false if
73 * the state machine is in the initial state
74 */
75 72
76/** 73/**
77 * 74 *
diff --git a/drivers/scsi/isci/remote_node_context.h b/drivers/scsi/isci/remote_node_context.h
index 41580ad12520..a241e0f4c865 100644
--- a/drivers/scsi/isci/remote_node_context.h
+++ b/drivers/scsi/isci/remote_node_context.h
@@ -85,61 +85,50 @@ struct sci_remote_node_context;
85typedef void (*scics_sds_remote_node_context_callback)(void *); 85typedef void (*scics_sds_remote_node_context_callback)(void *);
86 86
87/** 87/**
88 * This is the enumeration of the remote node context states. 88 * enum sci_remote_node_context_states
89 * @SCI_RNC_INITIAL initial state for a remote node context. On a resume
90 * request the remote node context will transition to the posting state.
91 *
92 * @SCI_RNC_POSTING: transition state that posts the RNi to the hardware. Once
93 * the RNC is posted the remote node context will be made ready.
94 *
95 * @SCI_RNC_INVALIDATING: transition state that will post an RNC invalidate to
96 * the hardware. Once the invalidate is complete the remote node context will
97 * transition to the posting state.
98 *
99 * @SCI_RNC_RESUMING: transition state that will post an RNC resume to the
100 * hardare. Once the event notification of resume complete is received the
101 * remote node context will transition to the ready state.
102 *
103 * @SCI_RNC_READY: state that the remote node context must be in to accept io
104 * request operations.
105 *
106 * @SCI_RNC_TX_SUSPENDED: state that the remote node context transitions to when
107 * it gets a TX suspend notification from the hardware.
108 *
109 * @SCI_RNC_TX_RX_SUSPENDED: state that the remote node context transitions to
110 * when it gets a TX RX suspend notification from the hardware.
111 *
112 * @SCI_RNC_AWAIT_SUSPENSION: wait state for the remote node context that waits
113 * for a suspend notification from the hardware. This state is entered when
114 * either there is a request to supend the remote node context or when there is
115 * a TC completion where the remote node will be suspended by the hardware.
89 */ 116 */
90enum scis_sds_remote_node_context_states { 117#define RNC_STATES {\
91 /** 118 C(RNC_INITIAL),\
92 * This state is the initial state for a remote node context. On a resume 119 C(RNC_POSTING),\
93 * request the remote node context will transition to the posting state. 120 C(RNC_INVALIDATING),\
94 */ 121 C(RNC_RESUMING),\
95 SCI_RNC_INITIAL, 122 C(RNC_READY),\
96 123 C(RNC_TX_SUSPENDED),\
97 /** 124 C(RNC_TX_RX_SUSPENDED),\
98 * This is a transition state that posts the RNi to the hardware. Once the RNC 125 C(RNC_AWAIT_SUSPENSION),\
99 * is posted the remote node context will be made ready. 126 }
100 */ 127#undef C
101 SCI_RNC_POSTING, 128#define C(a) SCI_##a
102 129enum scis_sds_remote_node_context_states RNC_STATES;
103 /** 130#undef C
104 * This is a transition state that will post an RNC invalidate to the 131const char *rnc_state_name(enum scis_sds_remote_node_context_states state);
105 * hardware. Once the invalidate is complete the remote node context will
106 * transition to the posting state.
107 */
108 SCI_RNC_INVALIDATING,
109
110 /**
111 * This is a transition state that will post an RNC resume to the hardare.
112 * Once the event notification of resume complete is received the remote node
113 * context will transition to the ready state.
114 */
115 SCI_RNC_RESUMING,
116
117 /**
118 * This is the state that the remote node context must be in to accept io
119 * request operations.
120 */
121 SCI_RNC_READY,
122
123 /**
124 * This is the state that the remote node context transitions to when it gets
125 * a TX suspend notification from the hardware.
126 */
127 SCI_RNC_TX_SUSPENDED,
128
129 /**
130 * This is the state that the remote node context transitions to when it gets
131 * a TX RX suspend notification from the hardware.
132 */
133 SCI_RNC_TX_RX_SUSPENDED,
134
135 /**
136 * This state is a wait state for the remote node context that waits for a
137 * suspend notification from the hardware. This state is entered when either
138 * there is a request to supend the remote node context or when there is a TC
139 * completion where the remote node will be suspended by the hardware.
140 */
141 SCI_RNC_AWAIT_SUSPENSION
142};
143 132
144/** 133/**
145 * 134 *
diff --git a/drivers/scsi/isci/request.c b/drivers/scsi/isci/request.c
index ee0dc05c6269..2def1e3960f6 100644
--- a/drivers/scsi/isci/request.c
+++ b/drivers/scsi/isci/request.c
@@ -53,6 +53,7 @@
53 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 53 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
54 */ 54 */
55 55
56#include <scsi/scsi_cmnd.h>
56#include "isci.h" 57#include "isci.h"
57#include "task.h" 58#include "task.h"
58#include "request.h" 59#include "request.h"
@@ -60,6 +61,16 @@
60#include "scu_event_codes.h" 61#include "scu_event_codes.h"
61#include "sas.h" 62#include "sas.h"
62 63
64#undef C
65#define C(a) (#a)
66const char *req_state_name(enum sci_base_request_states state)
67{
68 static const char * const strings[] = REQUEST_STATES;
69
70 return strings[state];
71}
72#undef C
73
63static struct scu_sgl_element_pair *to_sgl_element_pair(struct isci_request *ireq, 74static struct scu_sgl_element_pair *to_sgl_element_pair(struct isci_request *ireq,
64 int idx) 75 int idx)
65{ 76{
@@ -264,6 +275,141 @@ static void scu_ssp_reqeust_construct_task_context(
264 task_context->response_iu_lower = lower_32_bits(dma_addr); 275 task_context->response_iu_lower = lower_32_bits(dma_addr);
265} 276}
266 277
278static u8 scu_bg_blk_size(struct scsi_device *sdp)
279{
280 switch (sdp->sector_size) {
281 case 512:
282 return 0;
283 case 1024:
284 return 1;
285 case 4096:
286 return 3;
287 default:
288 return 0xff;
289 }
290}
291
292static u32 scu_dif_bytes(u32 len, u32 sector_size)
293{
294 return (len >> ilog2(sector_size)) * 8;
295}
296
297static void scu_ssp_ireq_dif_insert(struct isci_request *ireq, u8 type, u8 op)
298{
299 struct scu_task_context *tc = ireq->tc;
300 struct scsi_cmnd *scmd = ireq->ttype_ptr.io_task_ptr->uldd_task;
301 u8 blk_sz = scu_bg_blk_size(scmd->device);
302
303 tc->block_guard_enable = 1;
304 tc->blk_prot_en = 1;
305 tc->blk_sz = blk_sz;
306 /* DIF write insert */
307 tc->blk_prot_func = 0x2;
308
309 tc->transfer_length_bytes += scu_dif_bytes(tc->transfer_length_bytes,
310 scmd->device->sector_size);
311
312 /* always init to 0, used by hw */
313 tc->interm_crc_val = 0;
314
315 tc->init_crc_seed = 0;
316 tc->app_tag_verify = 0;
317 tc->app_tag_gen = 0;
318 tc->ref_tag_seed_verify = 0;
319
320 /* always init to same as bg_blk_sz */
321 tc->UD_bytes_immed_val = scmd->device->sector_size;
322
323 tc->reserved_DC_0 = 0;
324
325 /* always init to 8 */
326 tc->DIF_bytes_immed_val = 8;
327
328 tc->reserved_DC_1 = 0;
329 tc->bgc_blk_sz = scmd->device->sector_size;
330 tc->reserved_E0_0 = 0;
331 tc->app_tag_gen_mask = 0;
332
333 /** setup block guard control **/
334 tc->bgctl = 0;
335
336 /* DIF write insert */
337 tc->bgctl_f.op = 0x2;
338
339 tc->app_tag_verify_mask = 0;
340
341 /* must init to 0 for hw */
342 tc->blk_guard_err = 0;
343
344 tc->reserved_E8_0 = 0;
345
346 if ((type & SCSI_PROT_DIF_TYPE1) || (type & SCSI_PROT_DIF_TYPE2))
347 tc->ref_tag_seed_gen = scsi_get_lba(scmd) & 0xffffffff;
348 else if (type & SCSI_PROT_DIF_TYPE3)
349 tc->ref_tag_seed_gen = 0;
350}
351
352static void scu_ssp_ireq_dif_strip(struct isci_request *ireq, u8 type, u8 op)
353{
354 struct scu_task_context *tc = ireq->tc;
355 struct scsi_cmnd *scmd = ireq->ttype_ptr.io_task_ptr->uldd_task;
356 u8 blk_sz = scu_bg_blk_size(scmd->device);
357
358 tc->block_guard_enable = 1;
359 tc->blk_prot_en = 1;
360 tc->blk_sz = blk_sz;
361 /* DIF read strip */
362 tc->blk_prot_func = 0x1;
363
364 tc->transfer_length_bytes += scu_dif_bytes(tc->transfer_length_bytes,
365 scmd->device->sector_size);
366
367 /* always init to 0, used by hw */
368 tc->interm_crc_val = 0;
369
370 tc->init_crc_seed = 0;
371 tc->app_tag_verify = 0;
372 tc->app_tag_gen = 0;
373
374 if ((type & SCSI_PROT_DIF_TYPE1) || (type & SCSI_PROT_DIF_TYPE2))
375 tc->ref_tag_seed_verify = scsi_get_lba(scmd) & 0xffffffff;
376 else if (type & SCSI_PROT_DIF_TYPE3)
377 tc->ref_tag_seed_verify = 0;
378
379 /* always init to same as bg_blk_sz */
380 tc->UD_bytes_immed_val = scmd->device->sector_size;
381
382 tc->reserved_DC_0 = 0;
383
384 /* always init to 8 */
385 tc->DIF_bytes_immed_val = 8;
386
387 tc->reserved_DC_1 = 0;
388 tc->bgc_blk_sz = scmd->device->sector_size;
389 tc->reserved_E0_0 = 0;
390 tc->app_tag_gen_mask = 0;
391
392 /** setup block guard control **/
393 tc->bgctl = 0;
394
395 /* DIF read strip */
396 tc->bgctl_f.crc_verify = 1;
397 tc->bgctl_f.op = 0x1;
398 if ((type & SCSI_PROT_DIF_TYPE1) || (type & SCSI_PROT_DIF_TYPE2)) {
399 tc->bgctl_f.ref_tag_chk = 1;
400 tc->bgctl_f.app_f_detect = 1;
401 } else if (type & SCSI_PROT_DIF_TYPE3)
402 tc->bgctl_f.app_ref_f_detect = 1;
403
404 tc->app_tag_verify_mask = 0;
405
406 /* must init to 0 for hw */
407 tc->blk_guard_err = 0;
408
409 tc->reserved_E8_0 = 0;
410 tc->ref_tag_seed_gen = 0;
411}
412
267/** 413/**
268 * This method is will fill in the SCU Task Context for a SSP IO request. 414 * This method is will fill in the SCU Task Context for a SSP IO request.
269 * @sci_req: 415 * @sci_req:
@@ -274,6 +420,10 @@ static void scu_ssp_io_request_construct_task_context(struct isci_request *ireq,
274 u32 len) 420 u32 len)
275{ 421{
276 struct scu_task_context *task_context = ireq->tc; 422 struct scu_task_context *task_context = ireq->tc;
423 struct sas_task *sas_task = ireq->ttype_ptr.io_task_ptr;
424 struct scsi_cmnd *scmd = sas_task->uldd_task;
425 u8 prot_type = scsi_get_prot_type(scmd);
426 u8 prot_op = scsi_get_prot_op(scmd);
277 427
278 scu_ssp_reqeust_construct_task_context(ireq, task_context); 428 scu_ssp_reqeust_construct_task_context(ireq, task_context);
279 429
@@ -296,6 +446,13 @@ static void scu_ssp_io_request_construct_task_context(struct isci_request *ireq,
296 446
297 if (task_context->transfer_length_bytes > 0) 447 if (task_context->transfer_length_bytes > 0)
298 sci_request_build_sgl(ireq); 448 sci_request_build_sgl(ireq);
449
450 if (prot_type != SCSI_PROT_DIF_TYPE0) {
451 if (prot_op == SCSI_PROT_READ_STRIP)
452 scu_ssp_ireq_dif_strip(ireq, prot_type, prot_op);
453 else if (prot_op == SCSI_PROT_WRITE_INSERT)
454 scu_ssp_ireq_dif_insert(ireq, prot_type, prot_op);
455 }
299} 456}
300 457
301/** 458/**
@@ -519,18 +676,12 @@ sci_io_request_construct_sata(struct isci_request *ireq,
519 if (test_bit(IREQ_TMF, &ireq->flags)) { 676 if (test_bit(IREQ_TMF, &ireq->flags)) {
520 struct isci_tmf *tmf = isci_request_access_tmf(ireq); 677 struct isci_tmf *tmf = isci_request_access_tmf(ireq);
521 678
522 if (tmf->tmf_code == isci_tmf_sata_srst_high || 679 dev_err(&ireq->owning_controller->pdev->dev,
523 tmf->tmf_code == isci_tmf_sata_srst_low) { 680 "%s: Request 0x%p received un-handled SAT "
524 scu_stp_raw_request_construct_task_context(ireq); 681 "management protocol 0x%x.\n",
525 return SCI_SUCCESS; 682 __func__, ireq, tmf->tmf_code);
526 } else {
527 dev_err(&ireq->owning_controller->pdev->dev,
528 "%s: Request 0x%p received un-handled SAT "
529 "management protocol 0x%x.\n",
530 __func__, ireq, tmf->tmf_code);
531 683
532 return SCI_FAILURE; 684 return SCI_FAILURE;
533 }
534 } 685 }
535 686
536 if (!sas_protocol_ata(task->task_proto)) { 687 if (!sas_protocol_ata(task->task_proto)) {
@@ -627,34 +778,6 @@ static enum sci_status sci_io_request_construct_basic_sata(struct isci_request *
627 return status; 778 return status;
628} 779}
629 780
630enum sci_status sci_task_request_construct_sata(struct isci_request *ireq)
631{
632 enum sci_status status = SCI_SUCCESS;
633
634 /* check for management protocols */
635 if (test_bit(IREQ_TMF, &ireq->flags)) {
636 struct isci_tmf *tmf = isci_request_access_tmf(ireq);
637
638 if (tmf->tmf_code == isci_tmf_sata_srst_high ||
639 tmf->tmf_code == isci_tmf_sata_srst_low) {
640 scu_stp_raw_request_construct_task_context(ireq);
641 } else {
642 dev_err(&ireq->owning_controller->pdev->dev,
643 "%s: Request 0x%p received un-handled SAT "
644 "Protocol 0x%x.\n",
645 __func__, ireq, tmf->tmf_code);
646
647 return SCI_FAILURE;
648 }
649 }
650
651 if (status != SCI_SUCCESS)
652 return status;
653 sci_change_state(&ireq->sm, SCI_REQ_CONSTRUCTED);
654
655 return status;
656}
657
658/** 781/**
659 * sci_req_tx_bytes - bytes transferred when reply underruns request 782 * sci_req_tx_bytes - bytes transferred when reply underruns request
660 * @ireq: request that was terminated early 783 * @ireq: request that was terminated early
@@ -756,9 +879,6 @@ sci_io_request_terminate(struct isci_request *ireq)
756 case SCI_REQ_STP_PIO_WAIT_FRAME: 879 case SCI_REQ_STP_PIO_WAIT_FRAME:
757 case SCI_REQ_STP_PIO_DATA_IN: 880 case SCI_REQ_STP_PIO_DATA_IN:
758 case SCI_REQ_STP_PIO_DATA_OUT: 881 case SCI_REQ_STP_PIO_DATA_OUT:
759 case SCI_REQ_STP_SOFT_RESET_WAIT_H2D_ASSERTED:
760 case SCI_REQ_STP_SOFT_RESET_WAIT_H2D_DIAG:
761 case SCI_REQ_STP_SOFT_RESET_WAIT_D2H:
762 case SCI_REQ_ATAPI_WAIT_H2D: 882 case SCI_REQ_ATAPI_WAIT_H2D:
763 case SCI_REQ_ATAPI_WAIT_PIO_SETUP: 883 case SCI_REQ_ATAPI_WAIT_PIO_SETUP:
764 case SCI_REQ_ATAPI_WAIT_D2H: 884 case SCI_REQ_ATAPI_WAIT_D2H:
@@ -800,7 +920,8 @@ enum sci_status sci_request_complete(struct isci_request *ireq)
800 920
801 state = ireq->sm.current_state_id; 921 state = ireq->sm.current_state_id;
802 if (WARN_ONCE(state != SCI_REQ_COMPLETED, 922 if (WARN_ONCE(state != SCI_REQ_COMPLETED,
803 "isci: request completion from wrong state (%d)\n", state)) 923 "isci: request completion from wrong state (%s)\n",
924 req_state_name(state)))
804 return SCI_FAILURE_INVALID_STATE; 925 return SCI_FAILURE_INVALID_STATE;
805 926
806 if (ireq->saved_rx_frame_index != SCU_INVALID_FRAME_INDEX) 927 if (ireq->saved_rx_frame_index != SCU_INVALID_FRAME_INDEX)
@@ -821,8 +942,8 @@ enum sci_status sci_io_request_event_handler(struct isci_request *ireq,
821 state = ireq->sm.current_state_id; 942 state = ireq->sm.current_state_id;
822 943
823 if (state != SCI_REQ_STP_PIO_DATA_IN) { 944 if (state != SCI_REQ_STP_PIO_DATA_IN) {
824 dev_warn(&ihost->pdev->dev, "%s: (%x) in wrong state %d\n", 945 dev_warn(&ihost->pdev->dev, "%s: (%x) in wrong state %s\n",
825 __func__, event_code, state); 946 __func__, event_code, req_state_name(state));
826 947
827 return SCI_FAILURE_INVALID_STATE; 948 return SCI_FAILURE_INVALID_STATE;
828 } 949 }
@@ -1938,59 +2059,6 @@ sci_io_request_frame_handler(struct isci_request *ireq,
1938 return status; 2059 return status;
1939 } 2060 }
1940 2061
1941 case SCI_REQ_STP_SOFT_RESET_WAIT_D2H: {
1942 struct dev_to_host_fis *frame_header;
1943 u32 *frame_buffer;
1944
1945 status = sci_unsolicited_frame_control_get_header(&ihost->uf_control,
1946 frame_index,
1947 (void **)&frame_header);
1948 if (status != SCI_SUCCESS) {
1949 dev_err(&ihost->pdev->dev,
1950 "%s: SCIC IO Request 0x%p could not get frame "
1951 "header for frame index %d, status %x\n",
1952 __func__,
1953 stp_req,
1954 frame_index,
1955 status);
1956 return status;
1957 }
1958
1959 switch (frame_header->fis_type) {
1960 case FIS_REGD2H:
1961 sci_unsolicited_frame_control_get_buffer(&ihost->uf_control,
1962 frame_index,
1963 (void **)&frame_buffer);
1964
1965 sci_controller_copy_sata_response(&ireq->stp.rsp,
1966 frame_header,
1967 frame_buffer);
1968
1969 /* The command has completed with error */
1970 ireq->scu_status = SCU_TASK_DONE_CHECK_RESPONSE;
1971 ireq->sci_status = SCI_FAILURE_IO_RESPONSE_VALID;
1972 break;
1973
1974 default:
1975 dev_warn(&ihost->pdev->dev,
1976 "%s: IO Request:0x%p Frame Id:%d protocol "
1977 "violation occurred\n",
1978 __func__,
1979 stp_req,
1980 frame_index);
1981
1982 ireq->scu_status = SCU_TASK_DONE_UNEXP_FIS;
1983 ireq->sci_status = SCI_FAILURE_PROTOCOL_VIOLATION;
1984 break;
1985 }
1986
1987 sci_change_state(&ireq->sm, SCI_REQ_COMPLETED);
1988
1989 /* Frame has been decoded return it to the controller */
1990 sci_controller_release_frame(ihost, frame_index);
1991
1992 return status;
1993 }
1994 case SCI_REQ_ATAPI_WAIT_PIO_SETUP: { 2062 case SCI_REQ_ATAPI_WAIT_PIO_SETUP: {
1995 struct sas_task *task = isci_request_access_task(ireq); 2063 struct sas_task *task = isci_request_access_task(ireq);
1996 2064
@@ -2088,57 +2156,6 @@ static enum sci_status stp_request_udma_await_tc_event(struct isci_request *ireq
2088 return status; 2156 return status;
2089} 2157}
2090 2158
2091static enum sci_status
2092stp_request_soft_reset_await_h2d_asserted_tc_event(struct isci_request *ireq,
2093 u32 completion_code)
2094{
2095 switch (SCU_GET_COMPLETION_TL_STATUS(completion_code)) {
2096 case SCU_MAKE_COMPLETION_STATUS(SCU_TASK_DONE_GOOD):
2097 ireq->scu_status = SCU_TASK_DONE_GOOD;
2098 ireq->sci_status = SCI_SUCCESS;
2099 sci_change_state(&ireq->sm, SCI_REQ_STP_SOFT_RESET_WAIT_H2D_DIAG);
2100 break;
2101
2102 default:
2103 /*
2104 * All other completion status cause the IO to be complete.
2105 * If a NAK was received, then it is up to the user to retry
2106 * the request.
2107 */
2108 ireq->scu_status = SCU_NORMALIZE_COMPLETION_STATUS(completion_code);
2109 ireq->sci_status = SCI_FAILURE_CONTROLLER_SPECIFIC_IO_ERR;
2110 sci_change_state(&ireq->sm, SCI_REQ_COMPLETED);
2111 break;
2112 }
2113
2114 return SCI_SUCCESS;
2115}
2116
2117static enum sci_status
2118stp_request_soft_reset_await_h2d_diagnostic_tc_event(struct isci_request *ireq,
2119 u32 completion_code)
2120{
2121 switch (SCU_GET_COMPLETION_TL_STATUS(completion_code)) {
2122 case SCU_MAKE_COMPLETION_STATUS(SCU_TASK_DONE_GOOD):
2123 ireq->scu_status = SCU_TASK_DONE_GOOD;
2124 ireq->sci_status = SCI_SUCCESS;
2125 sci_change_state(&ireq->sm, SCI_REQ_STP_SOFT_RESET_WAIT_D2H);
2126 break;
2127
2128 default:
2129 /* All other completion status cause the IO to be complete. If
2130 * a NAK was received, then it is up to the user to retry the
2131 * request.
2132 */
2133 ireq->scu_status = SCU_NORMALIZE_COMPLETION_STATUS(completion_code);
2134 ireq->sci_status = SCI_FAILURE_CONTROLLER_SPECIFIC_IO_ERR;
2135 sci_change_state(&ireq->sm, SCI_REQ_COMPLETED);
2136 break;
2137 }
2138
2139 return SCI_SUCCESS;
2140}
2141
2142static enum sci_status atapi_raw_completion(struct isci_request *ireq, u32 completion_code, 2159static enum sci_status atapi_raw_completion(struct isci_request *ireq, u32 completion_code,
2143 enum sci_base_request_states next) 2160 enum sci_base_request_states next)
2144{ 2161{
@@ -2284,14 +2301,6 @@ sci_io_request_tc_completion(struct isci_request *ireq,
2284 case SCI_REQ_STP_PIO_DATA_OUT: 2301 case SCI_REQ_STP_PIO_DATA_OUT:
2285 return pio_data_out_tx_done_tc_event(ireq, completion_code); 2302 return pio_data_out_tx_done_tc_event(ireq, completion_code);
2286 2303
2287 case SCI_REQ_STP_SOFT_RESET_WAIT_H2D_ASSERTED:
2288 return stp_request_soft_reset_await_h2d_asserted_tc_event(ireq,
2289 completion_code);
2290
2291 case SCI_REQ_STP_SOFT_RESET_WAIT_H2D_DIAG:
2292 return stp_request_soft_reset_await_h2d_diagnostic_tc_event(ireq,
2293 completion_code);
2294
2295 case SCI_REQ_ABORTING: 2304 case SCI_REQ_ABORTING:
2296 return request_aborting_state_tc_event(ireq, 2305 return request_aborting_state_tc_event(ireq,
2297 completion_code); 2306 completion_code);
@@ -2308,12 +2317,8 @@ sci_io_request_tc_completion(struct isci_request *ireq,
2308 return atapi_data_tc_completion_handler(ireq, completion_code); 2317 return atapi_data_tc_completion_handler(ireq, completion_code);
2309 2318
2310 default: 2319 default:
2311 dev_warn(&ihost->pdev->dev, 2320 dev_warn(&ihost->pdev->dev, "%s: %x in wrong state %s\n",
2312 "%s: SCIC IO Request given task completion " 2321 __func__, completion_code, req_state_name(state));
2313 "notification %x while in wrong state %d\n",
2314 __func__,
2315 completion_code,
2316 state);
2317 return SCI_FAILURE_INVALID_STATE; 2322 return SCI_FAILURE_INVALID_STATE;
2318 } 2323 }
2319} 2324}
@@ -3065,10 +3070,6 @@ static void sci_request_started_state_enter(struct sci_base_state_machine *sm)
3065 */ 3070 */
3066 if (!task && dev->dev_type == SAS_END_DEV) { 3071 if (!task && dev->dev_type == SAS_END_DEV) {
3067 state = SCI_REQ_TASK_WAIT_TC_COMP; 3072 state = SCI_REQ_TASK_WAIT_TC_COMP;
3068 } else if (!task &&
3069 (isci_request_access_tmf(ireq)->tmf_code == isci_tmf_sata_srst_high ||
3070 isci_request_access_tmf(ireq)->tmf_code == isci_tmf_sata_srst_low)) {
3071 state = SCI_REQ_STP_SOFT_RESET_WAIT_H2D_ASSERTED;
3072 } else if (task && task->task_proto == SAS_PROTOCOL_SMP) { 3073 } else if (task && task->task_proto == SAS_PROTOCOL_SMP) {
3073 state = SCI_REQ_SMP_WAIT_RESP; 3074 state = SCI_REQ_SMP_WAIT_RESP;
3074 } else if (task && sas_protocol_ata(task->task_proto) && 3075 } else if (task && sas_protocol_ata(task->task_proto) &&
@@ -3125,31 +3126,6 @@ static void sci_stp_request_started_pio_await_h2d_completion_enter(struct sci_ba
3125 ireq->target_device->working_request = ireq; 3126 ireq->target_device->working_request = ireq;
3126} 3127}
3127 3128
3128static void sci_stp_request_started_soft_reset_await_h2d_asserted_completion_enter(struct sci_base_state_machine *sm)
3129{
3130 struct isci_request *ireq = container_of(sm, typeof(*ireq), sm);
3131
3132 ireq->target_device->working_request = ireq;
3133}
3134
3135static void sci_stp_request_started_soft_reset_await_h2d_diagnostic_completion_enter(struct sci_base_state_machine *sm)
3136{
3137 struct isci_request *ireq = container_of(sm, typeof(*ireq), sm);
3138 struct scu_task_context *tc = ireq->tc;
3139 struct host_to_dev_fis *h2d_fis;
3140 enum sci_status status;
3141
3142 /* Clear the SRST bit */
3143 h2d_fis = &ireq->stp.cmd;
3144 h2d_fis->control = 0;
3145
3146 /* Clear the TC control bit */
3147 tc->control_frame = 0;
3148
3149 status = sci_controller_continue_io(ireq);
3150 WARN_ONCE(status != SCI_SUCCESS, "isci: continue io failure\n");
3151}
3152
3153static const struct sci_base_state sci_request_state_table[] = { 3129static const struct sci_base_state sci_request_state_table[] = {
3154 [SCI_REQ_INIT] = { }, 3130 [SCI_REQ_INIT] = { },
3155 [SCI_REQ_CONSTRUCTED] = { }, 3131 [SCI_REQ_CONSTRUCTED] = { },
@@ -3168,13 +3144,6 @@ static const struct sci_base_state sci_request_state_table[] = {
3168 [SCI_REQ_STP_PIO_DATA_OUT] = { }, 3144 [SCI_REQ_STP_PIO_DATA_OUT] = { },
3169 [SCI_REQ_STP_UDMA_WAIT_TC_COMP] = { }, 3145 [SCI_REQ_STP_UDMA_WAIT_TC_COMP] = { },
3170 [SCI_REQ_STP_UDMA_WAIT_D2H] = { }, 3146 [SCI_REQ_STP_UDMA_WAIT_D2H] = { },
3171 [SCI_REQ_STP_SOFT_RESET_WAIT_H2D_ASSERTED] = {
3172 .enter_state = sci_stp_request_started_soft_reset_await_h2d_asserted_completion_enter,
3173 },
3174 [SCI_REQ_STP_SOFT_RESET_WAIT_H2D_DIAG] = {
3175 .enter_state = sci_stp_request_started_soft_reset_await_h2d_diagnostic_completion_enter,
3176 },
3177 [SCI_REQ_STP_SOFT_RESET_WAIT_D2H] = { },
3178 [SCI_REQ_TASK_WAIT_TC_COMP] = { }, 3147 [SCI_REQ_TASK_WAIT_TC_COMP] = { },
3179 [SCI_REQ_TASK_WAIT_TC_RESP] = { }, 3148 [SCI_REQ_TASK_WAIT_TC_RESP] = { },
3180 [SCI_REQ_SMP_WAIT_RESP] = { }, 3149 [SCI_REQ_SMP_WAIT_RESP] = { },
@@ -3649,8 +3618,7 @@ int isci_request_execute(struct isci_host *ihost, struct isci_remote_device *ide
3649 /* Cause this task to be scheduled in the SCSI error 3618 /* Cause this task to be scheduled in the SCSI error
3650 * handler thread. 3619 * handler thread.
3651 */ 3620 */
3652 isci_execpath_callback(ihost, task, 3621 sas_task_abort(task);
3653 sas_task_abort);
3654 3622
3655 /* Change the status, since we are holding 3623 /* Change the status, since we are holding
3656 * the I/O until it is managed by the SCSI 3624 * the I/O until it is managed by the SCSI
diff --git a/drivers/scsi/isci/request.h b/drivers/scsi/isci/request.h
index be38933dd6df..057f2378452d 100644
--- a/drivers/scsi/isci/request.h
+++ b/drivers/scsi/isci/request.h
@@ -182,138 +182,103 @@ static inline struct isci_request *to_ireq(struct isci_stp_request *stp_req)
182} 182}
183 183
184/** 184/**
185 * enum sci_base_request_states - This enumeration depicts all the states for 185 * enum sci_base_request_states - request state machine states
186 * the common request state machine.
187 * 186 *
187 * @SCI_REQ_INIT: Simply the initial state for the base request state machine.
188 * 188 *
189 * @SCI_REQ_CONSTRUCTED: This state indicates that the request has been
190 * constructed. This state is entered from the INITIAL state.
191 *
192 * @SCI_REQ_STARTED: This state indicates that the request has been started.
193 * This state is entered from the CONSTRUCTED state.
194 *
195 * @SCI_REQ_STP_UDMA_WAIT_TC_COMP:
196 * @SCI_REQ_STP_UDMA_WAIT_D2H:
197 * @SCI_REQ_STP_NON_DATA_WAIT_H2D:
198 * @SCI_REQ_STP_NON_DATA_WAIT_D2H:
199 *
200 * @SCI_REQ_STP_PIO_WAIT_H2D: While in this state the IO request object is
201 * waiting for the TC completion notification for the H2D Register FIS
202 *
203 * @SCI_REQ_STP_PIO_WAIT_FRAME: While in this state the IO request object is
204 * waiting for either a PIO Setup FIS or a D2H register FIS. The type of frame
205 * received is based on the result of the prior frame and line conditions.
206 *
207 * @SCI_REQ_STP_PIO_DATA_IN: While in this state the IO request object is
208 * waiting for a DATA frame from the device.
209 *
210 * @SCI_REQ_STP_PIO_DATA_OUT: While in this state the IO request object is
211 * waiting to transmit the next data frame to the device.
212 *
213 * @SCI_REQ_ATAPI_WAIT_H2D: While in this state the IO request object is
214 * waiting for the TC completion notification for the H2D Register FIS
215 *
216 * @SCI_REQ_ATAPI_WAIT_PIO_SETUP: While in this state the IO request object is
217 * waiting for either a PIO Setup.
218 *
219 * @SCI_REQ_ATAPI_WAIT_D2H: The non-data IO transit to this state in this state
220 * after receiving TC completion. While in this state IO request object is
221 * waiting for D2H status frame as UF.
222 *
223 * @SCI_REQ_ATAPI_WAIT_TC_COMP: When transmitting raw frames hardware reports
224 * task context completion after every frame submission, so in the
225 * non-accelerated case we need to expect the completion for the "cdb" frame.
226 *
227 * @SCI_REQ_TASK_WAIT_TC_COMP: The AWAIT_TC_COMPLETION sub-state indicates that
228 * the started raw task management request is waiting for the transmission of
229 * the initial frame (i.e. command, task, etc.).
230 *
231 * @SCI_REQ_TASK_WAIT_TC_RESP: This sub-state indicates that the started task
232 * management request is waiting for the reception of an unsolicited frame
233 * (i.e. response IU).
234 *
235 * @SCI_REQ_SMP_WAIT_RESP: This sub-state indicates that the started task
236 * management request is waiting for the reception of an unsolicited frame
237 * (i.e. response IU).
238 *
239 * @SCI_REQ_SMP_WAIT_TC_COMP: The AWAIT_TC_COMPLETION sub-state indicates that
240 * the started SMP request is waiting for the transmission of the initial frame
241 * (i.e. command, task, etc.).
242 *
243 * @SCI_REQ_COMPLETED: This state indicates that the request has completed.
244 * This state is entered from the STARTED state. This state is entered from the
245 * ABORTING state.
246 *
247 * @SCI_REQ_ABORTING: This state indicates that the request is in the process
248 * of being terminated/aborted. This state is entered from the CONSTRUCTED
249 * state. This state is entered from the STARTED state.
250 *
251 * @SCI_REQ_FINAL: Simply the final state for the base request state machine.
189 */ 252 */
190enum sci_base_request_states { 253#define REQUEST_STATES {\
191 /* 254 C(REQ_INIT),\
192 * Simply the initial state for the base request state machine. 255 C(REQ_CONSTRUCTED),\
193 */ 256 C(REQ_STARTED),\
194 SCI_REQ_INIT, 257 C(REQ_STP_UDMA_WAIT_TC_COMP),\
195 258 C(REQ_STP_UDMA_WAIT_D2H),\
196 /* 259 C(REQ_STP_NON_DATA_WAIT_H2D),\
197 * This state indicates that the request has been constructed. 260 C(REQ_STP_NON_DATA_WAIT_D2H),\
198 * This state is entered from the INITIAL state. 261 C(REQ_STP_PIO_WAIT_H2D),\
199 */ 262 C(REQ_STP_PIO_WAIT_FRAME),\
200 SCI_REQ_CONSTRUCTED, 263 C(REQ_STP_PIO_DATA_IN),\
201 264 C(REQ_STP_PIO_DATA_OUT),\
202 /* 265 C(REQ_ATAPI_WAIT_H2D),\
203 * This state indicates that the request has been started. This state 266 C(REQ_ATAPI_WAIT_PIO_SETUP),\
204 * is entered from the CONSTRUCTED state. 267 C(REQ_ATAPI_WAIT_D2H),\
205 */ 268 C(REQ_ATAPI_WAIT_TC_COMP),\
206 SCI_REQ_STARTED, 269 C(REQ_TASK_WAIT_TC_COMP),\
207 270 C(REQ_TASK_WAIT_TC_RESP),\
208 SCI_REQ_STP_UDMA_WAIT_TC_COMP, 271 C(REQ_SMP_WAIT_RESP),\
209 SCI_REQ_STP_UDMA_WAIT_D2H, 272 C(REQ_SMP_WAIT_TC_COMP),\
210 273 C(REQ_COMPLETED),\
211 SCI_REQ_STP_NON_DATA_WAIT_H2D, 274 C(REQ_ABORTING),\
212 SCI_REQ_STP_NON_DATA_WAIT_D2H, 275 C(REQ_FINAL),\
213 276 }
214 SCI_REQ_STP_SOFT_RESET_WAIT_H2D_ASSERTED, 277#undef C
215 SCI_REQ_STP_SOFT_RESET_WAIT_H2D_DIAG, 278#define C(a) SCI_##a
216 SCI_REQ_STP_SOFT_RESET_WAIT_D2H, 279enum sci_base_request_states REQUEST_STATES;
217 280#undef C
218 /* 281const char *req_state_name(enum sci_base_request_states state);
219 * While in this state the IO request object is waiting for the TC
220 * completion notification for the H2D Register FIS
221 */
222 SCI_REQ_STP_PIO_WAIT_H2D,
223
224 /*
225 * While in this state the IO request object is waiting for either a
226 * PIO Setup FIS or a D2H register FIS. The type of frame received is
227 * based on the result of the prior frame and line conditions.
228 */
229 SCI_REQ_STP_PIO_WAIT_FRAME,
230
231 /*
232 * While in this state the IO request object is waiting for a DATA
233 * frame from the device.
234 */
235 SCI_REQ_STP_PIO_DATA_IN,
236
237 /*
238 * While in this state the IO request object is waiting to transmit
239 * the next data frame to the device.
240 */
241 SCI_REQ_STP_PIO_DATA_OUT,
242
243 /*
244 * While in this state the IO request object is waiting for the TC
245 * completion notification for the H2D Register FIS
246 */
247 SCI_REQ_ATAPI_WAIT_H2D,
248
249 /*
250 * While in this state the IO request object is waiting for either a
251 * PIO Setup.
252 */
253 SCI_REQ_ATAPI_WAIT_PIO_SETUP,
254
255 /*
256 * The non-data IO transit to this state in this state after receiving
257 * TC completion. While in this state IO request object is waiting for
258 * D2H status frame as UF.
259 */
260 SCI_REQ_ATAPI_WAIT_D2H,
261
262 /*
263 * When transmitting raw frames hardware reports task context completion
264 * after every frame submission, so in the non-accelerated case we need
265 * to expect the completion for the "cdb" frame.
266 */
267 SCI_REQ_ATAPI_WAIT_TC_COMP,
268
269 /*
270 * The AWAIT_TC_COMPLETION sub-state indicates that the started raw
271 * task management request is waiting for the transmission of the
272 * initial frame (i.e. command, task, etc.).
273 */
274 SCI_REQ_TASK_WAIT_TC_COMP,
275
276 /*
277 * This sub-state indicates that the started task management request
278 * is waiting for the reception of an unsolicited frame
279 * (i.e. response IU).
280 */
281 SCI_REQ_TASK_WAIT_TC_RESP,
282
283 /*
284 * This sub-state indicates that the started task management request
285 * is waiting for the reception of an unsolicited frame
286 * (i.e. response IU).
287 */
288 SCI_REQ_SMP_WAIT_RESP,
289
290 /*
291 * The AWAIT_TC_COMPLETION sub-state indicates that the started SMP
292 * request is waiting for the transmission of the initial frame
293 * (i.e. command, task, etc.).
294 */
295 SCI_REQ_SMP_WAIT_TC_COMP,
296
297 /*
298 * This state indicates that the request has completed.
299 * This state is entered from the STARTED state. This state is entered
300 * from the ABORTING state.
301 */
302 SCI_REQ_COMPLETED,
303
304 /*
305 * This state indicates that the request is in the process of being
306 * terminated/aborted.
307 * This state is entered from the CONSTRUCTED state.
308 * This state is entered from the STARTED state.
309 */
310 SCI_REQ_ABORTING,
311
312 /*
313 * Simply the final state for the base request state machine.
314 */
315 SCI_REQ_FINAL,
316};
317 282
318enum sci_status sci_request_start(struct isci_request *ireq); 283enum sci_status sci_request_start(struct isci_request *ireq);
319enum sci_status sci_io_request_terminate(struct isci_request *ireq); 284enum sci_status sci_io_request_terminate(struct isci_request *ireq);
@@ -446,10 +411,7 @@ sci_task_request_construct(struct isci_host *ihost,
446 struct isci_remote_device *idev, 411 struct isci_remote_device *idev,
447 u16 io_tag, 412 u16 io_tag,
448 struct isci_request *ireq); 413 struct isci_request *ireq);
449enum sci_status 414enum sci_status sci_task_request_construct_ssp(struct isci_request *ireq);
450sci_task_request_construct_ssp(struct isci_request *ireq);
451enum sci_status
452sci_task_request_construct_sata(struct isci_request *ireq);
453void sci_smp_request_copy_response(struct isci_request *ireq); 415void sci_smp_request_copy_response(struct isci_request *ireq);
454 416
455static inline int isci_task_is_ncq_recovery(struct sas_task *task) 417static inline int isci_task_is_ncq_recovery(struct sas_task *task)
diff --git a/drivers/scsi/isci/scu_task_context.h b/drivers/scsi/isci/scu_task_context.h
index 7df87d923285..869a979eb5b2 100644
--- a/drivers/scsi/isci/scu_task_context.h
+++ b/drivers/scsi/isci/scu_task_context.h
@@ -866,9 +866,9 @@ struct scu_task_context {
866 struct transport_snapshot snapshot; /* read only set to 0 */ 866 struct transport_snapshot snapshot; /* read only set to 0 */
867 867
868 /* OFFSET 0x5C */ 868 /* OFFSET 0x5C */
869 u32 block_protection_enable:1; 869 u32 blk_prot_en:1;
870 u32 block_size:2; 870 u32 blk_sz:2;
871 u32 block_protection_function:2; 871 u32 blk_prot_func:2;
872 u32 reserved_5C_0:9; 872 u32 reserved_5C_0:9;
873 u32 active_sgl_element:2; /* read only set to 0 */ 873 u32 active_sgl_element:2; /* read only set to 0 */
874 u32 sgl_exhausted:1; /* read only set to 0 */ 874 u32 sgl_exhausted:1; /* read only set to 0 */
@@ -896,33 +896,56 @@ struct scu_task_context {
896 u32 reserved_C4_CC[3]; 896 u32 reserved_C4_CC[3];
897 897
898 /* OFFSET 0xD0 */ 898 /* OFFSET 0xD0 */
899 u32 intermediate_crc_value:16; 899 u32 interm_crc_val:16;
900 u32 initial_crc_seed:16; 900 u32 init_crc_seed:16;
901 901
902 /* OFFSET 0xD4 */ 902 /* OFFSET 0xD4 */
903 u32 application_tag_for_verify:16; 903 u32 app_tag_verify:16;
904 u32 application_tag_for_generate:16; 904 u32 app_tag_gen:16;
905 905
906 /* OFFSET 0xD8 */ 906 /* OFFSET 0xD8 */
907 u32 reference_tag_seed_for_verify_function; 907 u32 ref_tag_seed_verify;
908 908
909 /* OFFSET 0xDC */ 909 /* OFFSET 0xDC */
910 u32 reserved_DC; 910 u32 UD_bytes_immed_val:13;
911 u32 reserved_DC_0:3;
912 u32 DIF_bytes_immed_val:4;
913 u32 reserved_DC_1:12;
911 914
912 /* OFFSET 0xE0 */ 915 /* OFFSET 0xE0 */
913 u32 reserved_E0_0:16; 916 u32 bgc_blk_sz:13;
914 u32 application_tag_mask_for_generate:16; 917 u32 reserved_E0_0:3;
918 u32 app_tag_gen_mask:16;
915 919
916 /* OFFSET 0xE4 */ 920 /* OFFSET 0xE4 */
917 u32 block_protection_control:16; 921 union {
918 u32 application_tag_mask_for_verify:16; 922 u16 bgctl;
923 struct {
924 u16 crc_verify:1;
925 u16 app_tag_chk:1;
926 u16 ref_tag_chk:1;
927 u16 op:2;
928 u16 legacy:1;
929 u16 invert_crc_seed:1;
930 u16 ref_tag_gen:1;
931 u16 fixed_ref_tag:1;
932 u16 invert_crc:1;
933 u16 app_ref_f_detect:1;
934 u16 uninit_dif_check_err:1;
935 u16 uninit_dif_bypass:1;
936 u16 app_f_detect:1;
937 u16 reserved_0:2;
938 } bgctl_f;
939 };
940
941 u16 app_tag_verify_mask;
919 942
920 /* OFFSET 0xE8 */ 943 /* OFFSET 0xE8 */
921 u32 block_protection_error:8; 944 u32 blk_guard_err:8;
922 u32 reserved_E8_0:24; 945 u32 reserved_E8_0:24;
923 946
924 /* OFFSET 0xEC */ 947 /* OFFSET 0xEC */
925 u32 reference_tag_seed_for_verify; 948 u32 ref_tag_seed_gen;
926 949
927 /* OFFSET 0xF0 */ 950 /* OFFSET 0xF0 */
928 u32 intermediate_crc_valid_snapshot:16; 951 u32 intermediate_crc_valid_snapshot:16;
@@ -937,6 +960,6 @@ struct scu_task_context {
937 /* OFFSET 0xFC */ 960 /* OFFSET 0xFC */
938 u32 reference_tag_seed_for_generate_function_snapshot; 961 u32 reference_tag_seed_for_generate_function_snapshot;
939 962
940}; 963} __packed;
941 964
942#endif /* _SCU_TASK_CONTEXT_H_ */ 965#endif /* _SCU_TASK_CONTEXT_H_ */
diff --git a/drivers/scsi/isci/task.c b/drivers/scsi/isci/task.c
index f5a3f7d2bdab..374254ede9d4 100644
--- a/drivers/scsi/isci/task.c
+++ b/drivers/scsi/isci/task.c
@@ -96,8 +96,7 @@ static void isci_task_refuse(struct isci_host *ihost, struct sas_task *task,
96 __func__, task, response, status); 96 __func__, task, response, status);
97 97
98 task->lldd_task = NULL; 98 task->lldd_task = NULL;
99 99 task->task_done(task);
100 isci_execpath_callback(ihost, task, task->task_done);
101 break; 100 break;
102 101
103 case isci_perform_aborted_io_completion: 102 case isci_perform_aborted_io_completion:
@@ -117,8 +116,7 @@ static void isci_task_refuse(struct isci_host *ihost, struct sas_task *task,
117 "%s: Error - task = %p, response=%d, " 116 "%s: Error - task = %p, response=%d, "
118 "status=%d\n", 117 "status=%d\n",
119 __func__, task, response, status); 118 __func__, task, response, status);
120 119 sas_task_abort(task);
121 isci_execpath_callback(ihost, task, sas_task_abort);
122 break; 120 break;
123 121
124 default: 122 default:
@@ -249,46 +247,6 @@ int isci_task_execute_task(struct sas_task *task, int num, gfp_t gfp_flags)
249 return 0; 247 return 0;
250} 248}
251 249
252static enum sci_status isci_sata_management_task_request_build(struct isci_request *ireq)
253{
254 struct isci_tmf *isci_tmf;
255 enum sci_status status;
256
257 if (!test_bit(IREQ_TMF, &ireq->flags))
258 return SCI_FAILURE;
259
260 isci_tmf = isci_request_access_tmf(ireq);
261
262 switch (isci_tmf->tmf_code) {
263
264 case isci_tmf_sata_srst_high:
265 case isci_tmf_sata_srst_low: {
266 struct host_to_dev_fis *fis = &ireq->stp.cmd;
267
268 memset(fis, 0, sizeof(*fis));
269
270 fis->fis_type = 0x27;
271 fis->flags &= ~0x80;
272 fis->flags &= 0xF0;
273 if (isci_tmf->tmf_code == isci_tmf_sata_srst_high)
274 fis->control |= ATA_SRST;
275 else
276 fis->control &= ~ATA_SRST;
277 break;
278 }
279 /* other management commnd go here... */
280 default:
281 return SCI_FAILURE;
282 }
283
284 /* core builds the protocol specific request
285 * based on the h2d fis.
286 */
287 status = sci_task_request_construct_sata(ireq);
288
289 return status;
290}
291
292static struct isci_request *isci_task_request_build(struct isci_host *ihost, 250static struct isci_request *isci_task_request_build(struct isci_host *ihost,
293 struct isci_remote_device *idev, 251 struct isci_remote_device *idev,
294 u16 tag, struct isci_tmf *isci_tmf) 252 u16 tag, struct isci_tmf *isci_tmf)
@@ -328,13 +286,6 @@ static struct isci_request *isci_task_request_build(struct isci_host *ihost,
328 return NULL; 286 return NULL;
329 } 287 }
330 288
331 if (dev->dev_type == SATA_DEV || (dev->tproto & SAS_PROTOCOL_STP)) {
332 isci_tmf->proto = SAS_PROTOCOL_SATA;
333 status = isci_sata_management_task_request_build(ireq);
334
335 if (status != SCI_SUCCESS)
336 return NULL;
337 }
338 return ireq; 289 return ireq;
339} 290}
340 291
@@ -873,53 +824,20 @@ static int isci_task_send_lu_reset_sas(
873 return ret; 824 return ret;
874} 825}
875 826
876static int isci_task_send_lu_reset_sata(struct isci_host *ihost, 827int isci_task_lu_reset(struct domain_device *dev, u8 *lun)
877 struct isci_remote_device *idev, u8 *lun)
878{
879 int ret = TMF_RESP_FUNC_FAILED;
880 struct isci_tmf tmf;
881
882 /* Send the soft reset to the target */
883 #define ISCI_SRST_TIMEOUT_MS 25000 /* 25 second timeout. */
884 isci_task_build_tmf(&tmf, isci_tmf_sata_srst_high, NULL, NULL);
885
886 ret = isci_task_execute_tmf(ihost, idev, &tmf, ISCI_SRST_TIMEOUT_MS);
887
888 if (ret != TMF_RESP_FUNC_COMPLETE) {
889 dev_dbg(&ihost->pdev->dev,
890 "%s: Assert SRST failed (%p) = %x",
891 __func__, idev, ret);
892
893 /* Return the failure so that the LUN reset is escalated
894 * to a target reset.
895 */
896 }
897 return ret;
898}
899
900/**
901 * isci_task_lu_reset() - This function is one of the SAS Domain Template
902 * functions. This is one of the Task Management functoins called by libsas,
903 * to reset the given lun. Note the assumption that while this call is
904 * executing, no I/O will be sent by the host to the device.
905 * @lun: This parameter specifies the lun to be reset.
906 *
907 * status, zero indicates success.
908 */
909int isci_task_lu_reset(struct domain_device *domain_device, u8 *lun)
910{ 828{
911 struct isci_host *isci_host = dev_to_ihost(domain_device); 829 struct isci_host *isci_host = dev_to_ihost(dev);
912 struct isci_remote_device *isci_device; 830 struct isci_remote_device *isci_device;
913 unsigned long flags; 831 unsigned long flags;
914 int ret; 832 int ret;
915 833
916 spin_lock_irqsave(&isci_host->scic_lock, flags); 834 spin_lock_irqsave(&isci_host->scic_lock, flags);
917 isci_device = isci_lookup_device(domain_device); 835 isci_device = isci_lookup_device(dev);
918 spin_unlock_irqrestore(&isci_host->scic_lock, flags); 836 spin_unlock_irqrestore(&isci_host->scic_lock, flags);
919 837
920 dev_dbg(&isci_host->pdev->dev, 838 dev_dbg(&isci_host->pdev->dev,
921 "%s: domain_device=%p, isci_host=%p; isci_device=%p\n", 839 "%s: domain_device=%p, isci_host=%p; isci_device=%p\n",
922 __func__, domain_device, isci_host, isci_device); 840 __func__, dev, isci_host, isci_device);
923 841
924 if (!isci_device) { 842 if (!isci_device) {
925 /* If the device is gone, stop the escalations. */ 843 /* If the device is gone, stop the escalations. */
@@ -928,11 +846,11 @@ int isci_task_lu_reset(struct domain_device *domain_device, u8 *lun)
928 ret = TMF_RESP_FUNC_COMPLETE; 846 ret = TMF_RESP_FUNC_COMPLETE;
929 goto out; 847 goto out;
930 } 848 }
931 set_bit(IDEV_EH, &isci_device->flags);
932 849
933 /* Send the task management part of the reset. */ 850 /* Send the task management part of the reset. */
934 if (sas_protocol_ata(domain_device->tproto)) { 851 if (dev_is_sata(dev)) {
935 ret = isci_task_send_lu_reset_sata(isci_host, isci_device, lun); 852 sas_ata_schedule_reset(dev);
853 ret = TMF_RESP_FUNC_COMPLETE;
936 } else 854 } else
937 ret = isci_task_send_lu_reset_sas(isci_host, isci_device, lun); 855 ret = isci_task_send_lu_reset_sas(isci_host, isci_device, lun);
938 856
@@ -1062,9 +980,6 @@ int isci_task_abort_task(struct sas_task *task)
1062 "%s: dev = %p, task = %p, old_request == %p\n", 980 "%s: dev = %p, task = %p, old_request == %p\n",
1063 __func__, isci_device, task, old_request); 981 __func__, isci_device, task, old_request);
1064 982
1065 if (isci_device)
1066 set_bit(IDEV_EH, &isci_device->flags);
1067
1068 /* Device reset conditions signalled in task_state_flags are the 983 /* Device reset conditions signalled in task_state_flags are the
1069 * responsbility of libsas to observe at the start of the error 984 * responsbility of libsas to observe at the start of the error
1070 * handler thread. 985 * handler thread.
@@ -1332,29 +1247,35 @@ isci_task_request_complete(struct isci_host *ihost,
1332} 1247}
1333 1248
1334static int isci_reset_device(struct isci_host *ihost, 1249static int isci_reset_device(struct isci_host *ihost,
1250 struct domain_device *dev,
1335 struct isci_remote_device *idev) 1251 struct isci_remote_device *idev)
1336{ 1252{
1337 struct sas_phy *phy = sas_find_local_phy(idev->domain_dev);
1338 enum sci_status status;
1339 unsigned long flags;
1340 int rc; 1253 int rc;
1254 unsigned long flags;
1255 enum sci_status status;
1256 struct sas_phy *phy = sas_get_local_phy(dev);
1257 struct isci_port *iport = dev->port->lldd_port;
1341 1258
1342 dev_dbg(&ihost->pdev->dev, "%s: idev %p\n", __func__, idev); 1259 dev_dbg(&ihost->pdev->dev, "%s: idev %p\n", __func__, idev);
1343 1260
1344 spin_lock_irqsave(&ihost->scic_lock, flags); 1261 spin_lock_irqsave(&ihost->scic_lock, flags);
1345 status = sci_remote_device_reset(idev); 1262 status = sci_remote_device_reset(idev);
1346 if (status != SCI_SUCCESS) { 1263 spin_unlock_irqrestore(&ihost->scic_lock, flags);
1347 spin_unlock_irqrestore(&ihost->scic_lock, flags);
1348 1264
1265 if (status != SCI_SUCCESS) {
1349 dev_dbg(&ihost->pdev->dev, 1266 dev_dbg(&ihost->pdev->dev,
1350 "%s: sci_remote_device_reset(%p) returned %d!\n", 1267 "%s: sci_remote_device_reset(%p) returned %d!\n",
1351 __func__, idev, status); 1268 __func__, idev, status);
1352 1269 rc = TMF_RESP_FUNC_FAILED;
1353 return TMF_RESP_FUNC_FAILED; 1270 goto out;
1354 } 1271 }
1355 spin_unlock_irqrestore(&ihost->scic_lock, flags);
1356 1272
1357 rc = sas_phy_reset(phy, true); 1273 if (scsi_is_sas_phy_local(phy)) {
1274 struct isci_phy *iphy = &ihost->phys[phy->number];
1275
1276 rc = isci_port_perform_hard_reset(ihost, iport, iphy);
1277 } else
1278 rc = sas_phy_reset(phy, !dev_is_sata(dev));
1358 1279
1359 /* Terminate in-progress I/O now. */ 1280 /* Terminate in-progress I/O now. */
1360 isci_remote_device_nuke_requests(ihost, idev); 1281 isci_remote_device_nuke_requests(ihost, idev);
@@ -1371,7 +1292,8 @@ static int isci_reset_device(struct isci_host *ihost,
1371 } 1292 }
1372 1293
1373 dev_dbg(&ihost->pdev->dev, "%s: idev %p complete.\n", __func__, idev); 1294 dev_dbg(&ihost->pdev->dev, "%s: idev %p complete.\n", __func__, idev);
1374 1295 out:
1296 sas_put_local_phy(phy);
1375 return rc; 1297 return rc;
1376} 1298}
1377 1299
@@ -1386,35 +1308,15 @@ int isci_task_I_T_nexus_reset(struct domain_device *dev)
1386 idev = isci_lookup_device(dev); 1308 idev = isci_lookup_device(dev);
1387 spin_unlock_irqrestore(&ihost->scic_lock, flags); 1309 spin_unlock_irqrestore(&ihost->scic_lock, flags);
1388 1310
1389 if (!idev || !test_bit(IDEV_EH, &idev->flags)) {
1390 ret = TMF_RESP_FUNC_COMPLETE;
1391 goto out;
1392 }
1393
1394 ret = isci_reset_device(ihost, idev);
1395 out:
1396 isci_put_device(idev);
1397 return ret;
1398}
1399
1400int isci_bus_reset_handler(struct scsi_cmnd *cmd)
1401{
1402 struct domain_device *dev = sdev_to_domain_dev(cmd->device);
1403 struct isci_host *ihost = dev_to_ihost(dev);
1404 struct isci_remote_device *idev;
1405 unsigned long flags;
1406 int ret;
1407
1408 spin_lock_irqsave(&ihost->scic_lock, flags);
1409 idev = isci_lookup_device(dev);
1410 spin_unlock_irqrestore(&ihost->scic_lock, flags);
1411
1412 if (!idev) { 1311 if (!idev) {
1312 /* XXX: need to cleanup any ireqs targeting this
1313 * domain_device
1314 */
1413 ret = TMF_RESP_FUNC_COMPLETE; 1315 ret = TMF_RESP_FUNC_COMPLETE;
1414 goto out; 1316 goto out;
1415 } 1317 }
1416 1318
1417 ret = isci_reset_device(ihost, idev); 1319 ret = isci_reset_device(ihost, dev, idev);
1418 out: 1320 out:
1419 isci_put_device(idev); 1321 isci_put_device(idev);
1420 return ret; 1322 return ret;
diff --git a/drivers/scsi/isci/task.h b/drivers/scsi/isci/task.h
index 1b27b3797c6c..7b6d0e32fd9b 100644
--- a/drivers/scsi/isci/task.h
+++ b/drivers/scsi/isci/task.h
@@ -86,8 +86,6 @@ enum isci_tmf_function_codes {
86 isci_tmf_func_none = 0, 86 isci_tmf_func_none = 0,
87 isci_tmf_ssp_task_abort = TMF_ABORT_TASK, 87 isci_tmf_ssp_task_abort = TMF_ABORT_TASK,
88 isci_tmf_ssp_lun_reset = TMF_LU_RESET, 88 isci_tmf_ssp_lun_reset = TMF_LU_RESET,
89 isci_tmf_sata_srst_high = TMF_LU_RESET + 0x100, /* Non SCSI */
90 isci_tmf_sata_srst_low = TMF_LU_RESET + 0x101 /* Non SCSI */
91}; 89};
92/** 90/**
93 * struct isci_tmf - This class represents the task management object which 91 * struct isci_tmf - This class represents the task management object which
@@ -210,8 +208,6 @@ int isci_queuecommand(
210 struct scsi_cmnd *scsi_cmd, 208 struct scsi_cmnd *scsi_cmd,
211 void (*donefunc)(struct scsi_cmnd *)); 209 void (*donefunc)(struct scsi_cmnd *));
212 210
213int isci_bus_reset_handler(struct scsi_cmnd *cmd);
214
215/** 211/**
216 * enum isci_completion_selection - This enum defines the possible actions to 212 * enum isci_completion_selection - This enum defines the possible actions to
217 * take with respect to a given request's notification back to libsas. 213 * take with respect to a given request's notification back to libsas.
@@ -321,40 +317,4 @@ isci_task_set_completion_status(
321 return task_notification_selection; 317 return task_notification_selection;
322 318
323} 319}
324/**
325* isci_execpath_callback() - This function is called from the task
326* execute path when the task needs to callback libsas about the submit-time
327* task failure. The callback occurs either through the task's done function
328* or through sas_task_abort. In the case of regular non-discovery SATA/STP I/O
329* requests, libsas takes the host lock before calling execute task. Therefore
330* in this situation the host lock must be managed before calling the func.
331*
332* @ihost: This parameter is the controller to which the I/O request was sent.
333* @task: This parameter is the I/O request.
334* @func: This parameter is the function to call in the correct context.
335* @status: This parameter is the status code for the completed task.
336*
337*/
338static inline void isci_execpath_callback(struct isci_host *ihost,
339 struct sas_task *task,
340 void (*func)(struct sas_task *))
341{
342 struct domain_device *dev = task->dev;
343
344 if (dev_is_sata(dev) && task->uldd_task) {
345 unsigned long flags;
346
347 /* Since we are still in the submit path, and since
348 * libsas takes the host lock on behalf of SATA
349 * devices before I/O starts (in the non-discovery case),
350 * we need to unlock before we can call the callback function.
351 */
352 raw_local_irq_save(flags);
353 spin_unlock(dev->sata_dev.ap->lock);
354 func(task);
355 spin_lock(dev->sata_dev.ap->lock);
356 raw_local_irq_restore(flags);
357 } else
358 func(task);
359}
360#endif /* !defined(_SCI_TASK_H_) */ 320#endif /* !defined(_SCI_TASK_H_) */
diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c
index db47158e0dde..453a740fa68e 100644
--- a/drivers/scsi/iscsi_tcp.c
+++ b/drivers/scsi/iscsi_tcp.c
@@ -684,10 +684,8 @@ static int iscsi_sw_tcp_conn_set_param(struct iscsi_cls_conn *cls_conn,
684 int buflen) 684 int buflen)
685{ 685{
686 struct iscsi_conn *conn = cls_conn->dd_data; 686 struct iscsi_conn *conn = cls_conn->dd_data;
687 struct iscsi_session *session = conn->session;
688 struct iscsi_tcp_conn *tcp_conn = conn->dd_data; 687 struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
689 struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data; 688 struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
690 int value;
691 689
692 switch(param) { 690 switch(param) {
693 case ISCSI_PARAM_HDRDGST_EN: 691 case ISCSI_PARAM_HDRDGST_EN:
@@ -699,16 +697,7 @@ static int iscsi_sw_tcp_conn_set_param(struct iscsi_cls_conn *cls_conn,
699 sock_no_sendpage : tcp_sw_conn->sock->ops->sendpage; 697 sock_no_sendpage : tcp_sw_conn->sock->ops->sendpage;
700 break; 698 break;
701 case ISCSI_PARAM_MAX_R2T: 699 case ISCSI_PARAM_MAX_R2T:
702 sscanf(buf, "%d", &value); 700 return iscsi_tcp_set_max_r2t(conn, buf);
703 if (value <= 0 || !is_power_of_2(value))
704 return -EINVAL;
705 if (session->max_r2t == value)
706 break;
707 iscsi_tcp_r2tpool_free(session);
708 iscsi_set_param(cls_conn, param, buf, buflen);
709 if (iscsi_tcp_r2tpool_alloc(session))
710 return -ENOMEM;
711 break;
712 default: 701 default:
713 return iscsi_set_param(cls_conn, param, buf, buflen); 702 return iscsi_set_param(cls_conn, param, buf, buflen);
714 } 703 }
diff --git a/drivers/scsi/libfc/fc_disc.c b/drivers/scsi/libfc/fc_disc.c
index 1d1b0c9da29b..8e561e6a557c 100644
--- a/drivers/scsi/libfc/fc_disc.c
+++ b/drivers/scsi/libfc/fc_disc.c
@@ -337,6 +337,13 @@ static void fc_disc_error(struct fc_disc *disc, struct fc_frame *fp)
337 schedule_delayed_work(&disc->disc_work, delay); 337 schedule_delayed_work(&disc->disc_work, delay);
338 } else 338 } else
339 fc_disc_done(disc, DISC_EV_FAILED); 339 fc_disc_done(disc, DISC_EV_FAILED);
340 } else if (PTR_ERR(fp) == -FC_EX_CLOSED) {
341 /*
342 * if discovery fails due to lport reset, clear
343 * pending flag so that subsequent discovery can
344 * continue
345 */
346 disc->pending = 0;
340 } 347 }
341} 348}
342 349
diff --git a/drivers/scsi/libfc/fc_elsct.c b/drivers/scsi/libfc/fc_elsct.c
index e17a28d324d0..c2384d501470 100644
--- a/drivers/scsi/libfc/fc_elsct.c
+++ b/drivers/scsi/libfc/fc_elsct.c
@@ -56,8 +56,7 @@ struct fc_seq *fc_elsct_send(struct fc_lport *lport, u32 did,
56 rc = fc_els_fill(lport, did, fp, op, &r_ctl, &fh_type); 56 rc = fc_els_fill(lport, did, fp, op, &r_ctl, &fh_type);
57 else { 57 else {
58 /* CT requests */ 58 /* CT requests */
59 rc = fc_ct_fill(lport, did, fp, op, &r_ctl, &fh_type); 59 rc = fc_ct_fill(lport, did, fp, op, &r_ctl, &fh_type, &did);
60 did = FC_FID_DIR_SERV;
61 } 60 }
62 61
63 if (rc) { 62 if (rc) {
diff --git a/drivers/scsi/libfc/fc_exch.c b/drivers/scsi/libfc/fc_exch.c
index 4d70d96fa5dc..630291f01826 100644
--- a/drivers/scsi/libfc/fc_exch.c
+++ b/drivers/scsi/libfc/fc_exch.c
@@ -1642,9 +1642,10 @@ static void fc_exch_recv_bls(struct fc_exch_mgr *mp, struct fc_frame *fp)
1642 case FC_RCTL_ACK_0: 1642 case FC_RCTL_ACK_0:
1643 break; 1643 break;
1644 default: 1644 default:
1645 FC_EXCH_DBG(ep, "BLS rctl %x - %s received", 1645 if (ep)
1646 fh->fh_r_ctl, 1646 FC_EXCH_DBG(ep, "BLS rctl %x - %s received",
1647 fc_exch_rctl_name(fh->fh_r_ctl)); 1647 fh->fh_r_ctl,
1648 fc_exch_rctl_name(fh->fh_r_ctl));
1648 break; 1649 break;
1649 } 1650 }
1650 fc_frame_free(fp); 1651 fc_frame_free(fp);
diff --git a/drivers/scsi/libfc/fc_lport.c b/drivers/scsi/libfc/fc_lport.c
index c1a808cc5920..bd5d31d022d9 100644
--- a/drivers/scsi/libfc/fc_lport.c
+++ b/drivers/scsi/libfc/fc_lport.c
@@ -116,6 +116,8 @@ static void fc_lport_enter_ns(struct fc_lport *, enum fc_lport_state);
116static void fc_lport_enter_scr(struct fc_lport *); 116static void fc_lport_enter_scr(struct fc_lport *);
117static void fc_lport_enter_ready(struct fc_lport *); 117static void fc_lport_enter_ready(struct fc_lport *);
118static void fc_lport_enter_logo(struct fc_lport *); 118static void fc_lport_enter_logo(struct fc_lport *);
119static void fc_lport_enter_fdmi(struct fc_lport *lport);
120static void fc_lport_enter_ms(struct fc_lport *, enum fc_lport_state);
119 121
120static const char *fc_lport_state_names[] = { 122static const char *fc_lport_state_names[] = {
121 [LPORT_ST_DISABLED] = "disabled", 123 [LPORT_ST_DISABLED] = "disabled",
@@ -126,6 +128,11 @@ static const char *fc_lport_state_names[] = {
126 [LPORT_ST_RSPN_ID] = "RSPN_ID", 128 [LPORT_ST_RSPN_ID] = "RSPN_ID",
127 [LPORT_ST_RFT_ID] = "RFT_ID", 129 [LPORT_ST_RFT_ID] = "RFT_ID",
128 [LPORT_ST_RFF_ID] = "RFF_ID", 130 [LPORT_ST_RFF_ID] = "RFF_ID",
131 [LPORT_ST_FDMI] = "FDMI",
132 [LPORT_ST_RHBA] = "RHBA",
133 [LPORT_ST_RPA] = "RPA",
134 [LPORT_ST_DHBA] = "DHBA",
135 [LPORT_ST_DPRT] = "DPRT",
129 [LPORT_ST_SCR] = "SCR", 136 [LPORT_ST_SCR] = "SCR",
130 [LPORT_ST_READY] = "Ready", 137 [LPORT_ST_READY] = "Ready",
131 [LPORT_ST_LOGO] = "LOGO", 138 [LPORT_ST_LOGO] = "LOGO",
@@ -183,11 +190,14 @@ static void fc_lport_rport_callback(struct fc_lport *lport,
183 if (lport->state == LPORT_ST_DNS) { 190 if (lport->state == LPORT_ST_DNS) {
184 lport->dns_rdata = rdata; 191 lport->dns_rdata = rdata;
185 fc_lport_enter_ns(lport, LPORT_ST_RNN_ID); 192 fc_lport_enter_ns(lport, LPORT_ST_RNN_ID);
193 } else if (lport->state == LPORT_ST_FDMI) {
194 lport->ms_rdata = rdata;
195 fc_lport_enter_ms(lport, LPORT_ST_DHBA);
186 } else { 196 } else {
187 FC_LPORT_DBG(lport, "Received an READY event " 197 FC_LPORT_DBG(lport, "Received an READY event "
188 "on port (%6.6x) for the directory " 198 "on port (%6.6x) for the directory "
189 "server, but the lport is not " 199 "server, but the lport is not "
190 "in the DNS state, it's in the " 200 "in the DNS or FDMI state, it's in the "
191 "%d state", rdata->ids.port_id, 201 "%d state", rdata->ids.port_id,
192 lport->state); 202 lport->state);
193 lport->tt.rport_logoff(rdata); 203 lport->tt.rport_logoff(rdata);
@@ -196,7 +206,10 @@ static void fc_lport_rport_callback(struct fc_lport *lport,
196 case RPORT_EV_LOGO: 206 case RPORT_EV_LOGO:
197 case RPORT_EV_FAILED: 207 case RPORT_EV_FAILED:
198 case RPORT_EV_STOP: 208 case RPORT_EV_STOP:
199 lport->dns_rdata = NULL; 209 if (rdata->ids.port_id == FC_FID_DIR_SERV)
210 lport->dns_rdata = NULL;
211 else if (rdata->ids.port_id == FC_FID_MGMT_SERV)
212 lport->ms_rdata = NULL;
200 break; 213 break;
201 case RPORT_EV_NONE: 214 case RPORT_EV_NONE:
202 break; 215 break;
@@ -1148,7 +1161,10 @@ static void fc_lport_ns_resp(struct fc_seq *sp, struct fc_frame *fp,
1148 fc_lport_enter_ns(lport, LPORT_ST_RFF_ID); 1161 fc_lport_enter_ns(lport, LPORT_ST_RFF_ID);
1149 break; 1162 break;
1150 case LPORT_ST_RFF_ID: 1163 case LPORT_ST_RFF_ID:
1151 fc_lport_enter_scr(lport); 1164 if (lport->fdmi_enabled)
1165 fc_lport_enter_fdmi(lport);
1166 else
1167 fc_lport_enter_scr(lport);
1152 break; 1168 break;
1153 default: 1169 default:
1154 /* should have already been caught by state checks */ 1170 /* should have already been caught by state checks */
@@ -1163,6 +1179,85 @@ err:
1163} 1179}
1164 1180
1165/** 1181/**
1182 * fc_lport_ms_resp() - Handle response to a management server
1183 * exchange
1184 * @sp: current sequence in exchange
1185 * @fp: response frame
1186 * @lp_arg: Fibre Channel host port instance
1187 *
1188 * Locking Note: This function will be called without the lport lock
1189 * held, but it will lock, call an _enter_* function or fc_lport_error()
1190 * and then unlock the lport.
1191 */
1192static void fc_lport_ms_resp(struct fc_seq *sp, struct fc_frame *fp,
1193 void *lp_arg)
1194{
1195 struct fc_lport *lport = lp_arg;
1196 struct fc_frame_header *fh;
1197 struct fc_ct_hdr *ct;
1198
1199 FC_LPORT_DBG(lport, "Received a ms %s\n", fc_els_resp_type(fp));
1200
1201 if (fp == ERR_PTR(-FC_EX_CLOSED))
1202 return;
1203
1204 mutex_lock(&lport->lp_mutex);
1205
1206 if (lport->state < LPORT_ST_RHBA || lport->state > LPORT_ST_DPRT) {
1207 FC_LPORT_DBG(lport, "Received a management server response, "
1208 "but in state %s\n", fc_lport_state(lport));
1209 if (IS_ERR(fp))
1210 goto err;
1211 goto out;
1212 }
1213
1214 if (IS_ERR(fp)) {
1215 fc_lport_error(lport, fp);
1216 goto err;
1217 }
1218
1219 fh = fc_frame_header_get(fp);
1220 ct = fc_frame_payload_get(fp, sizeof(*ct));
1221
1222 if (fh && ct && fh->fh_type == FC_TYPE_CT &&
1223 ct->ct_fs_type == FC_FST_MGMT &&
1224 ct->ct_fs_subtype == FC_FDMI_SUBTYPE) {
1225 FC_LPORT_DBG(lport, "Received a management server response, "
1226 "reason=%d explain=%d\n",
1227 ct->ct_reason,
1228 ct->ct_explan);
1229
1230 switch (lport->state) {
1231 case LPORT_ST_RHBA:
1232 if (ntohs(ct->ct_cmd) == FC_FS_ACC)
1233 fc_lport_enter_ms(lport, LPORT_ST_RPA);
1234 else /* Error Skip RPA */
1235 fc_lport_enter_scr(lport);
1236 break;
1237 case LPORT_ST_RPA:
1238 fc_lport_enter_scr(lport);
1239 break;
1240 case LPORT_ST_DPRT:
1241 fc_lport_enter_ms(lport, LPORT_ST_RHBA);
1242 break;
1243 case LPORT_ST_DHBA:
1244 fc_lport_enter_ms(lport, LPORT_ST_DPRT);
1245 break;
1246 default:
1247 /* should have already been caught by state checks */
1248 break;
1249 }
1250 } else {
1251 /* Invalid Frame? */
1252 fc_lport_error(lport, fp);
1253 }
1254out:
1255 fc_frame_free(fp);
1256err:
1257 mutex_unlock(&lport->lp_mutex);
1258}
1259
1260/**
1166 * fc_lport_scr_resp() - Handle response to State Change Register (SCR) request 1261 * fc_lport_scr_resp() - Handle response to State Change Register (SCR) request
1167 * @sp: current sequence in SCR exchange 1262 * @sp: current sequence in SCR exchange
1168 * @fp: response frame 1263 * @fp: response frame
@@ -1339,6 +1434,123 @@ err:
1339} 1434}
1340 1435
1341/** 1436/**
1437 * fc_lport_enter_ms() - management server commands
1438 * @lport: Fibre Channel local port to register
1439 *
1440 * Locking Note: The lport lock is expected to be held before calling
1441 * this routine.
1442 */
1443static void fc_lport_enter_ms(struct fc_lport *lport, enum fc_lport_state state)
1444{
1445 struct fc_frame *fp;
1446 enum fc_fdmi_req cmd;
1447 int size = sizeof(struct fc_ct_hdr);
1448 size_t len;
1449 int numattrs;
1450
1451 FC_LPORT_DBG(lport, "Entered %s state from %s state\n",
1452 fc_lport_state_names[state],
1453 fc_lport_state(lport));
1454
1455 fc_lport_state_enter(lport, state);
1456
1457 switch (state) {
1458 case LPORT_ST_RHBA:
1459 cmd = FC_FDMI_RHBA;
1460 /* Number of HBA Attributes */
1461 numattrs = 10;
1462 len = sizeof(struct fc_fdmi_rhba);
1463 len -= sizeof(struct fc_fdmi_attr_entry);
1464 len += (numattrs * FC_FDMI_ATTR_ENTRY_HEADER_LEN);
1465 len += FC_FDMI_HBA_ATTR_NODENAME_LEN;
1466 len += FC_FDMI_HBA_ATTR_MANUFACTURER_LEN;
1467 len += FC_FDMI_HBA_ATTR_SERIALNUMBER_LEN;
1468 len += FC_FDMI_HBA_ATTR_MODEL_LEN;
1469 len += FC_FDMI_HBA_ATTR_MODELDESCR_LEN;
1470 len += FC_FDMI_HBA_ATTR_HARDWAREVERSION_LEN;
1471 len += FC_FDMI_HBA_ATTR_DRIVERVERSION_LEN;
1472 len += FC_FDMI_HBA_ATTR_OPTIONROMVERSION_LEN;
1473 len += FC_FDMI_HBA_ATTR_FIRMWAREVERSION_LEN;
1474 len += FC_FDMI_HBA_ATTR_OSNAMEVERSION_LEN;
1475
1476 size += len;
1477 break;
1478 case LPORT_ST_RPA:
1479 cmd = FC_FDMI_RPA;
1480 /* Number of Port Attributes */
1481 numattrs = 6;
1482 len = sizeof(struct fc_fdmi_rpa);
1483 len -= sizeof(struct fc_fdmi_attr_entry);
1484 len += (numattrs * FC_FDMI_ATTR_ENTRY_HEADER_LEN);
1485 len += FC_FDMI_PORT_ATTR_FC4TYPES_LEN;
1486 len += FC_FDMI_PORT_ATTR_SUPPORTEDSPEED_LEN;
1487 len += FC_FDMI_PORT_ATTR_CURRENTPORTSPEED_LEN;
1488 len += FC_FDMI_PORT_ATTR_MAXFRAMESIZE_LEN;
1489 len += FC_FDMI_PORT_ATTR_OSDEVICENAME_LEN;
1490 len += FC_FDMI_PORT_ATTR_HOSTNAME_LEN;
1491
1492 size += len;
1493 break;
1494 case LPORT_ST_DPRT:
1495 cmd = FC_FDMI_DPRT;
1496 len = sizeof(struct fc_fdmi_dprt);
1497 size += len;
1498 break;
1499 case LPORT_ST_DHBA:
1500 cmd = FC_FDMI_DHBA;
1501 len = sizeof(struct fc_fdmi_dhba);
1502 size += len;
1503 break;
1504 default:
1505 fc_lport_error(lport, NULL);
1506 return;
1507 }
1508
1509 FC_LPORT_DBG(lport, "Cmd=0x%x Len %d size %d\n",
1510 cmd, (int)len, size);
1511 fp = fc_frame_alloc(lport, size);
1512 if (!fp) {
1513 fc_lport_error(lport, fp);
1514 return;
1515 }
1516
1517 if (!lport->tt.elsct_send(lport, FC_FID_MGMT_SERV, fp, cmd,
1518 fc_lport_ms_resp,
1519 lport, 3 * lport->r_a_tov))
1520 fc_lport_error(lport, fp);
1521}
1522
1523/**
1524 * fc_rport_enter_fdmi() - Create a fc_rport for the management server
1525 * @lport: The local port requesting a remote port for the management server
1526 *
1527 * Locking Note: The lport lock is expected to be held before calling
1528 * this routine.
1529 */
1530static void fc_lport_enter_fdmi(struct fc_lport *lport)
1531{
1532 struct fc_rport_priv *rdata;
1533
1534 FC_LPORT_DBG(lport, "Entered FDMI state from %s state\n",
1535 fc_lport_state(lport));
1536
1537 fc_lport_state_enter(lport, LPORT_ST_FDMI);
1538
1539 mutex_lock(&lport->disc.disc_mutex);
1540 rdata = lport->tt.rport_create(lport, FC_FID_MGMT_SERV);
1541 mutex_unlock(&lport->disc.disc_mutex);
1542 if (!rdata)
1543 goto err;
1544
1545 rdata->ops = &fc_lport_rport_ops;
1546 lport->tt.rport_login(rdata);
1547 return;
1548
1549err:
1550 fc_lport_error(lport, NULL);
1551}
1552
1553/**
1342 * fc_lport_timeout() - Handler for the retry_work timer 1554 * fc_lport_timeout() - Handler for the retry_work timer
1343 * @work: The work struct of the local port 1555 * @work: The work struct of the local port
1344 */ 1556 */
@@ -1371,6 +1583,15 @@ static void fc_lport_timeout(struct work_struct *work)
1371 case LPORT_ST_RFF_ID: 1583 case LPORT_ST_RFF_ID:
1372 fc_lport_enter_ns(lport, lport->state); 1584 fc_lport_enter_ns(lport, lport->state);
1373 break; 1585 break;
1586 case LPORT_ST_FDMI:
1587 fc_lport_enter_fdmi(lport);
1588 break;
1589 case LPORT_ST_RHBA:
1590 case LPORT_ST_RPA:
1591 case LPORT_ST_DHBA:
1592 case LPORT_ST_DPRT:
1593 fc_lport_enter_ms(lport, lport->state);
1594 break;
1374 case LPORT_ST_SCR: 1595 case LPORT_ST_SCR:
1375 fc_lport_enter_scr(lport); 1596 fc_lport_enter_scr(lport);
1376 break; 1597 break;
diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c
index 143bbe448bec..82c3fd4bc938 100644
--- a/drivers/scsi/libiscsi.c
+++ b/drivers/scsi/libiscsi.c
@@ -1909,6 +1909,16 @@ static enum blk_eh_timer_return iscsi_eh_cmd_timed_out(struct scsi_cmnd *sc)
1909 ISCSI_DBG_EH(session, "scsi cmd %p timedout\n", sc); 1909 ISCSI_DBG_EH(session, "scsi cmd %p timedout\n", sc);
1910 1910
1911 spin_lock(&session->lock); 1911 spin_lock(&session->lock);
1912 task = (struct iscsi_task *)sc->SCp.ptr;
1913 if (!task) {
1914 /*
1915 * Raced with completion. Blk layer has taken ownership
1916 * so let timeout code complete it now.
1917 */
1918 rc = BLK_EH_HANDLED;
1919 goto done;
1920 }
1921
1912 if (session->state != ISCSI_STATE_LOGGED_IN) { 1922 if (session->state != ISCSI_STATE_LOGGED_IN) {
1913 /* 1923 /*
1914 * We are probably in the middle of iscsi recovery so let 1924 * We are probably in the middle of iscsi recovery so let
@@ -1925,16 +1935,6 @@ static enum blk_eh_timer_return iscsi_eh_cmd_timed_out(struct scsi_cmnd *sc)
1925 goto done; 1935 goto done;
1926 } 1936 }
1927 1937
1928 task = (struct iscsi_task *)sc->SCp.ptr;
1929 if (!task) {
1930 /*
1931 * Raced with completion. Just reset timer, and let it
1932 * complete normally
1933 */
1934 rc = BLK_EH_RESET_TIMER;
1935 goto done;
1936 }
1937
1938 /* 1938 /*
1939 * If we have sent (at least queued to the network layer) a pdu or 1939 * If we have sent (at least queued to the network layer) a pdu or
1940 * recvd one for the task since the last timeout ask for 1940 * recvd one for the task since the last timeout ask for
@@ -2807,6 +2807,7 @@ void iscsi_session_teardown(struct iscsi_cls_session *cls_session)
2807 kfree(session->username); 2807 kfree(session->username);
2808 kfree(session->username_in); 2808 kfree(session->username_in);
2809 kfree(session->targetname); 2809 kfree(session->targetname);
2810 kfree(session->targetalias);
2810 kfree(session->initiatorname); 2811 kfree(session->initiatorname);
2811 kfree(session->ifacename); 2812 kfree(session->ifacename);
2812 2813
@@ -3200,7 +3201,7 @@ int iscsi_set_param(struct iscsi_cls_conn *cls_conn,
3200 sscanf(buf, "%d", &session->initial_r2t_en); 3201 sscanf(buf, "%d", &session->initial_r2t_en);
3201 break; 3202 break;
3202 case ISCSI_PARAM_MAX_R2T: 3203 case ISCSI_PARAM_MAX_R2T:
3203 sscanf(buf, "%d", &session->max_r2t); 3204 sscanf(buf, "%hu", &session->max_r2t);
3204 break; 3205 break;
3205 case ISCSI_PARAM_IMM_DATA_EN: 3206 case ISCSI_PARAM_IMM_DATA_EN:
3206 sscanf(buf, "%d", &session->imm_data_en); 3207 sscanf(buf, "%d", &session->imm_data_en);
@@ -3233,6 +3234,8 @@ int iscsi_set_param(struct iscsi_cls_conn *cls_conn,
3233 return iscsi_switch_str_param(&session->password_in, buf); 3234 return iscsi_switch_str_param(&session->password_in, buf);
3234 case ISCSI_PARAM_TARGET_NAME: 3235 case ISCSI_PARAM_TARGET_NAME:
3235 return iscsi_switch_str_param(&session->targetname, buf); 3236 return iscsi_switch_str_param(&session->targetname, buf);
3237 case ISCSI_PARAM_TARGET_ALIAS:
3238 return iscsi_switch_str_param(&session->targetalias, buf);
3236 case ISCSI_PARAM_TPGT: 3239 case ISCSI_PARAM_TPGT:
3237 sscanf(buf, "%d", &session->tpgt); 3240 sscanf(buf, "%d", &session->tpgt);
3238 break; 3241 break;
@@ -3299,6 +3302,9 @@ int iscsi_session_get_param(struct iscsi_cls_session *cls_session,
3299 case ISCSI_PARAM_TARGET_NAME: 3302 case ISCSI_PARAM_TARGET_NAME:
3300 len = sprintf(buf, "%s\n", session->targetname); 3303 len = sprintf(buf, "%s\n", session->targetname);
3301 break; 3304 break;
3305 case ISCSI_PARAM_TARGET_ALIAS:
3306 len = sprintf(buf, "%s\n", session->targetalias);
3307 break;
3302 case ISCSI_PARAM_TPGT: 3308 case ISCSI_PARAM_TPGT:
3303 len = sprintf(buf, "%d\n", session->tpgt); 3309 len = sprintf(buf, "%d\n", session->tpgt);
3304 break; 3310 break;
diff --git a/drivers/scsi/libiscsi_tcp.c b/drivers/scsi/libiscsi_tcp.c
index 7f0465b9623e..552e8a2b6f5f 100644
--- a/drivers/scsi/libiscsi_tcp.c
+++ b/drivers/scsi/libiscsi_tcp.c
@@ -1170,6 +1170,24 @@ void iscsi_tcp_r2tpool_free(struct iscsi_session *session)
1170} 1170}
1171EXPORT_SYMBOL_GPL(iscsi_tcp_r2tpool_free); 1171EXPORT_SYMBOL_GPL(iscsi_tcp_r2tpool_free);
1172 1172
1173int iscsi_tcp_set_max_r2t(struct iscsi_conn *conn, char *buf)
1174{
1175 struct iscsi_session *session = conn->session;
1176 unsigned short r2ts = 0;
1177
1178 sscanf(buf, "%hu", &r2ts);
1179 if (session->max_r2t == r2ts)
1180 return 0;
1181
1182 if (!r2ts || !is_power_of_2(r2ts))
1183 return -EINVAL;
1184
1185 session->max_r2t = r2ts;
1186 iscsi_tcp_r2tpool_free(session);
1187 return iscsi_tcp_r2tpool_alloc(session);
1188}
1189EXPORT_SYMBOL_GPL(iscsi_tcp_set_max_r2t);
1190
1173void iscsi_tcp_conn_get_stats(struct iscsi_cls_conn *cls_conn, 1191void iscsi_tcp_conn_get_stats(struct iscsi_cls_conn *cls_conn,
1174 struct iscsi_stats *stats) 1192 struct iscsi_stats *stats)
1175{ 1193{
diff --git a/drivers/scsi/libsas/sas_ata.c b/drivers/scsi/libsas/sas_ata.c
index db9238f2ecb8..bc0cecc6ad62 100644
--- a/drivers/scsi/libsas/sas_ata.c
+++ b/drivers/scsi/libsas/sas_ata.c
@@ -23,6 +23,8 @@
23 23
24#include <linux/scatterlist.h> 24#include <linux/scatterlist.h>
25#include <linux/slab.h> 25#include <linux/slab.h>
26#include <linux/async.h>
27#include <linux/export.h>
26 28
27#include <scsi/sas_ata.h> 29#include <scsi/sas_ata.h>
28#include "sas_internal.h" 30#include "sas_internal.h"
@@ -93,22 +95,47 @@ static enum ata_completion_errors sas_to_ata_err(struct task_status_struct *ts)
93static void sas_ata_task_done(struct sas_task *task) 95static void sas_ata_task_done(struct sas_task *task)
94{ 96{
95 struct ata_queued_cmd *qc = task->uldd_task; 97 struct ata_queued_cmd *qc = task->uldd_task;
96 struct domain_device *dev; 98 struct domain_device *dev = task->dev;
97 struct task_status_struct *stat = &task->task_status; 99 struct task_status_struct *stat = &task->task_status;
98 struct ata_task_resp *resp = (struct ata_task_resp *)stat->buf; 100 struct ata_task_resp *resp = (struct ata_task_resp *)stat->buf;
99 struct sas_ha_struct *sas_ha; 101 struct sas_ha_struct *sas_ha = dev->port->ha;
100 enum ata_completion_errors ac; 102 enum ata_completion_errors ac;
101 unsigned long flags; 103 unsigned long flags;
102 struct ata_link *link; 104 struct ata_link *link;
105 struct ata_port *ap;
106
107 spin_lock_irqsave(&dev->done_lock, flags);
108 if (test_bit(SAS_HA_FROZEN, &sas_ha->state))
109 task = NULL;
110 else if (qc && qc->scsicmd)
111 ASSIGN_SAS_TASK(qc->scsicmd, NULL);
112 spin_unlock_irqrestore(&dev->done_lock, flags);
113
114 /* check if libsas-eh got to the task before us */
115 if (unlikely(!task))
116 return;
103 117
104 if (!qc) 118 if (!qc)
105 goto qc_already_gone; 119 goto qc_already_gone;
106 120
107 dev = qc->ap->private_data; 121 ap = qc->ap;
108 sas_ha = dev->port->ha; 122 link = &ap->link;
109 link = &dev->sata_dev.ap->link; 123
124 spin_lock_irqsave(ap->lock, flags);
125 /* check if we lost the race with libata/sas_ata_post_internal() */
126 if (unlikely(ap->pflags & ATA_PFLAG_FROZEN)) {
127 spin_unlock_irqrestore(ap->lock, flags);
128 if (qc->scsicmd)
129 goto qc_already_gone;
130 else {
131 /* if eh is not involved and the port is frozen then the
132 * ata internal abort process has taken responsibility
133 * for this sas_task
134 */
135 return;
136 }
137 }
110 138
111 spin_lock_irqsave(dev->sata_dev.ap->lock, flags);
112 if (stat->stat == SAS_PROTO_RESPONSE || stat->stat == SAM_STAT_GOOD || 139 if (stat->stat == SAS_PROTO_RESPONSE || stat->stat == SAM_STAT_GOOD ||
113 ((stat->stat == SAM_STAT_CHECK_CONDITION && 140 ((stat->stat == SAM_STAT_CHECK_CONDITION &&
114 dev->sata_dev.command_set == ATAPI_COMMAND_SET))) { 141 dev->sata_dev.command_set == ATAPI_COMMAND_SET))) {
@@ -121,10 +148,6 @@ static void sas_ata_task_done(struct sas_task *task)
121 if (unlikely(link->eh_info.err_mask)) 148 if (unlikely(link->eh_info.err_mask))
122 qc->flags |= ATA_QCFLAG_FAILED; 149 qc->flags |= ATA_QCFLAG_FAILED;
123 } 150 }
124
125 dev->sata_dev.sstatus = resp->sstatus;
126 dev->sata_dev.serror = resp->serror;
127 dev->sata_dev.scontrol = resp->scontrol;
128 } else { 151 } else {
129 ac = sas_to_ata_err(stat); 152 ac = sas_to_ata_err(stat);
130 if (ac) { 153 if (ac) {
@@ -144,24 +167,8 @@ static void sas_ata_task_done(struct sas_task *task)
144 } 167 }
145 168
146 qc->lldd_task = NULL; 169 qc->lldd_task = NULL;
147 if (qc->scsicmd)
148 ASSIGN_SAS_TASK(qc->scsicmd, NULL);
149 ata_qc_complete(qc); 170 ata_qc_complete(qc);
150 spin_unlock_irqrestore(dev->sata_dev.ap->lock, flags); 171 spin_unlock_irqrestore(ap->lock, flags);
151
152 /*
153 * If the sas_task has an ata qc, a scsi_cmnd and the aborted
154 * flag is set, then we must have come in via the libsas EH
155 * functions. When we exit this function, we need to put the
156 * scsi_cmnd on the list of finished errors. The ata_qc_complete
157 * call cleans up the libata side of things but we're protected
158 * from the scsi_cmnd going away because the scsi_cmnd is owned
159 * by the EH, making libata's call to scsi_done a NOP.
160 */
161 spin_lock_irqsave(&task->task_state_lock, flags);
162 if (qc->scsicmd && task->task_state_flags & SAS_TASK_STATE_ABORTED)
163 scsi_eh_finish_cmd(qc->scsicmd, &sas_ha->eh_done_q);
164 spin_unlock_irqrestore(&task->task_state_lock, flags);
165 172
166qc_already_gone: 173qc_already_gone:
167 list_del_init(&task->list); 174 list_del_init(&task->list);
@@ -170,23 +177,30 @@ qc_already_gone:
170 177
171static unsigned int sas_ata_qc_issue(struct ata_queued_cmd *qc) 178static unsigned int sas_ata_qc_issue(struct ata_queued_cmd *qc)
172{ 179{
173 int res; 180 unsigned long flags;
174 struct sas_task *task; 181 struct sas_task *task;
175 struct domain_device *dev = qc->ap->private_data; 182 struct scatterlist *sg;
183 int ret = AC_ERR_SYSTEM;
184 unsigned int si, xfer = 0;
185 struct ata_port *ap = qc->ap;
186 struct domain_device *dev = ap->private_data;
176 struct sas_ha_struct *sas_ha = dev->port->ha; 187 struct sas_ha_struct *sas_ha = dev->port->ha;
177 struct Scsi_Host *host = sas_ha->core.shost; 188 struct Scsi_Host *host = sas_ha->core.shost;
178 struct sas_internal *i = to_sas_internal(host->transportt); 189 struct sas_internal *i = to_sas_internal(host->transportt);
179 struct scatterlist *sg; 190
180 unsigned int xfer = 0; 191 /* TODO: audit callers to ensure they are ready for qc_issue to
181 unsigned int si; 192 * unconditionally re-enable interrupts
193 */
194 local_irq_save(flags);
195 spin_unlock(ap->lock);
182 196
183 /* If the device fell off, no sense in issuing commands */ 197 /* If the device fell off, no sense in issuing commands */
184 if (dev->gone) 198 if (test_bit(SAS_DEV_GONE, &dev->state))
185 return AC_ERR_SYSTEM; 199 goto out;
186 200
187 task = sas_alloc_task(GFP_ATOMIC); 201 task = sas_alloc_task(GFP_ATOMIC);
188 if (!task) 202 if (!task)
189 return AC_ERR_SYSTEM; 203 goto out;
190 task->dev = dev; 204 task->dev = dev;
191 task->task_proto = SAS_PROTOCOL_STP; 205 task->task_proto = SAS_PROTOCOL_STP;
192 task->task_done = sas_ata_task_done; 206 task->task_done = sas_ata_task_done;
@@ -231,21 +245,24 @@ static unsigned int sas_ata_qc_issue(struct ata_queued_cmd *qc)
231 ASSIGN_SAS_TASK(qc->scsicmd, task); 245 ASSIGN_SAS_TASK(qc->scsicmd, task);
232 246
233 if (sas_ha->lldd_max_execute_num < 2) 247 if (sas_ha->lldd_max_execute_num < 2)
234 res = i->dft->lldd_execute_task(task, 1, GFP_ATOMIC); 248 ret = i->dft->lldd_execute_task(task, 1, GFP_ATOMIC);
235 else 249 else
236 res = sas_queue_up(task); 250 ret = sas_queue_up(task);
237 251
238 /* Examine */ 252 /* Examine */
239 if (res) { 253 if (ret) {
240 SAS_DPRINTK("lldd_execute_task returned: %d\n", res); 254 SAS_DPRINTK("lldd_execute_task returned: %d\n", ret);
241 255
242 if (qc->scsicmd) 256 if (qc->scsicmd)
243 ASSIGN_SAS_TASK(qc->scsicmd, NULL); 257 ASSIGN_SAS_TASK(qc->scsicmd, NULL);
244 sas_free_task(task); 258 sas_free_task(task);
245 return AC_ERR_SYSTEM; 259 ret = AC_ERR_SYSTEM;
246 } 260 }
247 261
248 return 0; 262 out:
263 spin_lock(ap->lock);
264 local_irq_restore(flags);
265 return ret;
249} 266}
250 267
251static bool sas_ata_qc_fill_rtf(struct ata_queued_cmd *qc) 268static bool sas_ata_qc_fill_rtf(struct ata_queued_cmd *qc)
@@ -256,83 +273,222 @@ static bool sas_ata_qc_fill_rtf(struct ata_queued_cmd *qc)
256 return true; 273 return true;
257} 274}
258 275
259static int sas_ata_hard_reset(struct ata_link *link, unsigned int *class, 276static struct sas_internal *dev_to_sas_internal(struct domain_device *dev)
260 unsigned long deadline) 277{
278 return to_sas_internal(dev->port->ha->core.shost->transportt);
279}
280
281static void sas_get_ata_command_set(struct domain_device *dev);
282
283int sas_get_ata_info(struct domain_device *dev, struct ex_phy *phy)
261{ 284{
285 if (phy->attached_tproto & SAS_PROTOCOL_STP)
286 dev->tproto = phy->attached_tproto;
287 if (phy->attached_sata_dev)
288 dev->tproto |= SATA_DEV;
289
290 if (phy->attached_dev_type == SATA_PENDING)
291 dev->dev_type = SATA_PENDING;
292 else {
293 int res;
294
295 dev->dev_type = SATA_DEV;
296 res = sas_get_report_phy_sata(dev->parent, phy->phy_id,
297 &dev->sata_dev.rps_resp);
298 if (res) {
299 SAS_DPRINTK("report phy sata to %016llx:0x%x returned "
300 "0x%x\n", SAS_ADDR(dev->parent->sas_addr),
301 phy->phy_id, res);
302 return res;
303 }
304 memcpy(dev->frame_rcvd, &dev->sata_dev.rps_resp.rps.fis,
305 sizeof(struct dev_to_host_fis));
306 /* TODO switch to ata_dev_classify() */
307 sas_get_ata_command_set(dev);
308 }
309 return 0;
310}
311
312static int sas_ata_clear_pending(struct domain_device *dev, struct ex_phy *phy)
313{
314 int res;
315
316 /* we weren't pending, so successfully end the reset sequence now */
317 if (dev->dev_type != SATA_PENDING)
318 return 1;
319
320 /* hmmm, if this succeeds do we need to repost the domain_device to the
321 * lldd so it can pick up new parameters?
322 */
323 res = sas_get_ata_info(dev, phy);
324 if (res)
325 return 0; /* retry */
326 else
327 return 1;
328}
329
330static int smp_ata_check_ready(struct ata_link *link)
331{
332 int res;
262 struct ata_port *ap = link->ap; 333 struct ata_port *ap = link->ap;
263 struct domain_device *dev = ap->private_data; 334 struct domain_device *dev = ap->private_data;
264 struct sas_internal *i = 335 struct domain_device *ex_dev = dev->parent;
265 to_sas_internal(dev->port->ha->core.shost->transportt); 336 struct sas_phy *phy = sas_get_local_phy(dev);
266 int res = TMF_RESP_FUNC_FAILED; 337 struct ex_phy *ex_phy = &ex_dev->ex_dev.ex_phy[phy->number];
267 int ret = 0;
268 338
269 if (i->dft->lldd_I_T_nexus_reset) 339 res = sas_ex_phy_discover(ex_dev, phy->number);
270 res = i->dft->lldd_I_T_nexus_reset(dev); 340 sas_put_local_phy(phy);
271 341
272 if (res != TMF_RESP_FUNC_COMPLETE) { 342 /* break the wait early if the expander is unreachable,
273 SAS_DPRINTK("%s: Unable to reset I T nexus?\n", __func__); 343 * otherwise keep polling
274 ret = -EAGAIN; 344 */
345 if (res == -ECOMM)
346 return res;
347 if (res != SMP_RESP_FUNC_ACC)
348 return 0;
349
350 switch (ex_phy->attached_dev_type) {
351 case SATA_PENDING:
352 return 0;
353 case SAS_END_DEV:
354 if (ex_phy->attached_sata_dev)
355 return sas_ata_clear_pending(dev, ex_phy);
356 default:
357 return -ENODEV;
275 } 358 }
359}
276 360
277 switch (dev->sata_dev.command_set) { 361static int local_ata_check_ready(struct ata_link *link)
278 case ATA_COMMAND_SET: 362{
279 SAS_DPRINTK("%s: Found ATA device.\n", __func__); 363 struct ata_port *ap = link->ap;
280 *class = ATA_DEV_ATA; 364 struct domain_device *dev = ap->private_data;
281 break; 365 struct sas_internal *i = dev_to_sas_internal(dev);
282 case ATAPI_COMMAND_SET: 366
283 SAS_DPRINTK("%s: Found ATAPI device.\n", __func__); 367 if (i->dft->lldd_ata_check_ready)
284 *class = ATA_DEV_ATAPI; 368 return i->dft->lldd_ata_check_ready(dev);
285 break; 369 else {
286 default: 370 /* lldd's that don't implement 'ready' checking get the
287 SAS_DPRINTK("%s: Unknown SATA command set: %d.\n", 371 * old default behavior of not coordinating reset
288 __func__, 372 * recovery with libata
289 dev->sata_dev.command_set); 373 */
290 *class = ATA_DEV_UNKNOWN; 374 return 1;
291 break;
292 } 375 }
376}
293 377
294 ap->cbl = ATA_CBL_SATA; 378static int sas_ata_printk(const char *level, const struct domain_device *ddev,
295 return ret; 379 const char *fmt, ...)
380{
381 struct ata_port *ap = ddev->sata_dev.ap;
382 struct device *dev = &ddev->rphy->dev;
383 struct va_format vaf;
384 va_list args;
385 int r;
386
387 va_start(args, fmt);
388
389 vaf.fmt = fmt;
390 vaf.va = &args;
391
392 r = printk("%ssas: ata%u: %s: %pV",
393 level, ap->print_id, dev_name(dev), &vaf);
394
395 va_end(args);
396
397 return r;
296} 398}
297 399
298static int sas_ata_soft_reset(struct ata_link *link, unsigned int *class, 400static int sas_ata_hard_reset(struct ata_link *link, unsigned int *class,
299 unsigned long deadline) 401 unsigned long deadline)
300{ 402{
403 int ret = 0, res;
404 struct sas_phy *phy;
301 struct ata_port *ap = link->ap; 405 struct ata_port *ap = link->ap;
406 int (*check_ready)(struct ata_link *link);
302 struct domain_device *dev = ap->private_data; 407 struct domain_device *dev = ap->private_data;
303 struct sas_internal *i = 408 struct sas_internal *i = dev_to_sas_internal(dev);
304 to_sas_internal(dev->port->ha->core.shost->transportt);
305 int res = TMF_RESP_FUNC_FAILED;
306 int ret = 0;
307 409
308 if (i->dft->lldd_ata_soft_reset) 410 res = i->dft->lldd_I_T_nexus_reset(dev);
309 res = i->dft->lldd_ata_soft_reset(dev); 411 if (res == -ENODEV)
412 return res;
310 413
311 if (res != TMF_RESP_FUNC_COMPLETE) { 414 if (res != TMF_RESP_FUNC_COMPLETE)
312 SAS_DPRINTK("%s: Unable to soft reset\n", __func__); 415 sas_ata_printk(KERN_DEBUG, dev, "Unable to reset ata device?\n");
313 ret = -EAGAIN; 416
314 } 417 phy = sas_get_local_phy(dev);
418 if (scsi_is_sas_phy_local(phy))
419 check_ready = local_ata_check_ready;
420 else
421 check_ready = smp_ata_check_ready;
422 sas_put_local_phy(phy);
423
424 ret = ata_wait_after_reset(link, deadline, check_ready);
425 if (ret && ret != -EAGAIN)
426 sas_ata_printk(KERN_ERR, dev, "reset failed (errno=%d)\n", ret);
315 427
428 /* XXX: if the class changes during the reset the upper layer
429 * should be informed, if the device has gone away we assume
430 * libsas will eventually delete it
431 */
316 switch (dev->sata_dev.command_set) { 432 switch (dev->sata_dev.command_set) {
317 case ATA_COMMAND_SET: 433 case ATA_COMMAND_SET:
318 SAS_DPRINTK("%s: Found ATA device.\n", __func__);
319 *class = ATA_DEV_ATA; 434 *class = ATA_DEV_ATA;
320 break; 435 break;
321 case ATAPI_COMMAND_SET: 436 case ATAPI_COMMAND_SET:
322 SAS_DPRINTK("%s: Found ATAPI device.\n", __func__);
323 *class = ATA_DEV_ATAPI; 437 *class = ATA_DEV_ATAPI;
324 break; 438 break;
325 default:
326 SAS_DPRINTK("%s: Unknown SATA command set: %d.\n",
327 __func__, dev->sata_dev.command_set);
328 *class = ATA_DEV_UNKNOWN;
329 break;
330 } 439 }
331 440
332 ap->cbl = ATA_CBL_SATA; 441 ap->cbl = ATA_CBL_SATA;
333 return ret; 442 return ret;
334} 443}
335 444
445/*
446 * notify the lldd to forget the sas_task for this internal ata command
447 * that bypasses scsi-eh
448 */
449static void sas_ata_internal_abort(struct sas_task *task)
450{
451 struct sas_internal *si = dev_to_sas_internal(task->dev);
452 unsigned long flags;
453 int res;
454
455 spin_lock_irqsave(&task->task_state_lock, flags);
456 if (task->task_state_flags & SAS_TASK_STATE_ABORTED ||
457 task->task_state_flags & SAS_TASK_STATE_DONE) {
458 spin_unlock_irqrestore(&task->task_state_lock, flags);
459 SAS_DPRINTK("%s: Task %p already finished.\n", __func__,
460 task);
461 goto out;
462 }
463 task->task_state_flags |= SAS_TASK_STATE_ABORTED;
464 spin_unlock_irqrestore(&task->task_state_lock, flags);
465
466 res = si->dft->lldd_abort_task(task);
467
468 spin_lock_irqsave(&task->task_state_lock, flags);
469 if (task->task_state_flags & SAS_TASK_STATE_DONE ||
470 res == TMF_RESP_FUNC_COMPLETE) {
471 spin_unlock_irqrestore(&task->task_state_lock, flags);
472 goto out;
473 }
474
475 /* XXX we are not prepared to deal with ->lldd_abort_task()
476 * failures. TODO: lldds need to unconditionally forget about
477 * aborted ata tasks, otherwise we (likely) leak the sas task
478 * here
479 */
480 SAS_DPRINTK("%s: Task %p leaked.\n", __func__, task);
481
482 if (!(task->task_state_flags & SAS_TASK_STATE_DONE))
483 task->task_state_flags &= ~SAS_TASK_STATE_ABORTED;
484 spin_unlock_irqrestore(&task->task_state_lock, flags);
485
486 return;
487 out:
488 list_del_init(&task->list);
489 sas_free_task(task);
490}
491
336static void sas_ata_post_internal(struct ata_queued_cmd *qc) 492static void sas_ata_post_internal(struct ata_queued_cmd *qc)
337{ 493{
338 if (qc->flags & ATA_QCFLAG_FAILED) 494 if (qc->flags & ATA_QCFLAG_FAILED)
@@ -340,30 +496,35 @@ static void sas_ata_post_internal(struct ata_queued_cmd *qc)
340 496
341 if (qc->err_mask) { 497 if (qc->err_mask) {
342 /* 498 /*
343 * Find the sas_task and kill it. By this point, 499 * Find the sas_task and kill it. By this point, libata
344 * libata has decided to kill the qc, so we needn't 500 * has decided to kill the qc and has frozen the port.
345 * bother with sas_ata_task_done. But we still 501 * In this state sas_ata_task_done() will no longer free
346 * ought to abort the task. 502 * the sas_task, so we need to notify the lldd (via
503 * ->lldd_abort_task) that the task is dead and free it
504 * ourselves.
347 */ 505 */
348 struct sas_task *task = qc->lldd_task; 506 struct sas_task *task = qc->lldd_task;
349 unsigned long flags;
350 507
351 qc->lldd_task = NULL; 508 qc->lldd_task = NULL;
352 if (task) { 509 if (!task)
353 /* Should this be a AT(API) device reset? */ 510 return;
354 spin_lock_irqsave(&task->task_state_lock, flags); 511 task->uldd_task = NULL;
355 task->task_state_flags |= SAS_TASK_NEED_DEV_RESET; 512 sas_ata_internal_abort(task);
356 spin_unlock_irqrestore(&task->task_state_lock, flags);
357
358 task->uldd_task = NULL;
359 __sas_task_abort(task);
360 }
361 } 513 }
362} 514}
363 515
516
517static void sas_ata_set_dmamode(struct ata_port *ap, struct ata_device *ata_dev)
518{
519 struct domain_device *dev = ap->private_data;
520 struct sas_internal *i = dev_to_sas_internal(dev);
521
522 if (i->dft->lldd_ata_set_dmamode)
523 i->dft->lldd_ata_set_dmamode(dev);
524}
525
364static struct ata_port_operations sas_sata_ops = { 526static struct ata_port_operations sas_sata_ops = {
365 .prereset = ata_std_prereset, 527 .prereset = ata_std_prereset,
366 .softreset = sas_ata_soft_reset,
367 .hardreset = sas_ata_hard_reset, 528 .hardreset = sas_ata_hard_reset,
368 .postreset = ata_std_postreset, 529 .postreset = ata_std_postreset,
369 .error_handler = ata_std_error_handler, 530 .error_handler = ata_std_error_handler,
@@ -374,6 +535,7 @@ static struct ata_port_operations sas_sata_ops = {
374 .qc_fill_rtf = sas_ata_qc_fill_rtf, 535 .qc_fill_rtf = sas_ata_qc_fill_rtf,
375 .port_start = ata_sas_port_start, 536 .port_start = ata_sas_port_start,
376 .port_stop = ata_sas_port_stop, 537 .port_stop = ata_sas_port_stop,
538 .set_dmamode = sas_ata_set_dmamode,
377}; 539};
378 540
379static struct ata_port_info sata_port_info = { 541static struct ata_port_info sata_port_info = {
@@ -384,11 +546,10 @@ static struct ata_port_info sata_port_info = {
384 .port_ops = &sas_sata_ops 546 .port_ops = &sas_sata_ops
385}; 547};
386 548
387int sas_ata_init_host_and_port(struct domain_device *found_dev, 549int sas_ata_init_host_and_port(struct domain_device *found_dev)
388 struct scsi_target *starget)
389{ 550{
390 struct Scsi_Host *shost = dev_to_shost(&starget->dev); 551 struct sas_ha_struct *ha = found_dev->port->ha;
391 struct sas_ha_struct *ha = SHOST_TO_SAS_HA(shost); 552 struct Scsi_Host *shost = ha->core.shost;
392 struct ata_port *ap; 553 struct ata_port *ap;
393 554
394 ata_host_init(&found_dev->sata_dev.ata_host, 555 ata_host_init(&found_dev->sata_dev.ata_host,
@@ -406,6 +567,8 @@ int sas_ata_init_host_and_port(struct domain_device *found_dev,
406 ap->private_data = found_dev; 567 ap->private_data = found_dev;
407 ap->cbl = ATA_CBL_SATA; 568 ap->cbl = ATA_CBL_SATA;
408 ap->scsi_host = shost; 569 ap->scsi_host = shost;
570 /* publish initialized ata port */
571 smp_wmb();
409 found_dev->sata_dev.ap = ap; 572 found_dev->sata_dev.ap = ap;
410 573
411 return 0; 574 return 0;
@@ -436,168 +599,14 @@ void sas_ata_task_abort(struct sas_task *task)
436 complete(waiting); 599 complete(waiting);
437} 600}
438 601
439static void sas_task_timedout(unsigned long _task)
440{
441 struct sas_task *task = (void *) _task;
442 unsigned long flags;
443
444 spin_lock_irqsave(&task->task_state_lock, flags);
445 if (!(task->task_state_flags & SAS_TASK_STATE_DONE))
446 task->task_state_flags |= SAS_TASK_STATE_ABORTED;
447 spin_unlock_irqrestore(&task->task_state_lock, flags);
448
449 complete(&task->completion);
450}
451
452static void sas_disc_task_done(struct sas_task *task)
453{
454 if (!del_timer(&task->timer))
455 return;
456 complete(&task->completion);
457}
458
459#define SAS_DEV_TIMEOUT 10
460
461/**
462 * sas_execute_task -- Basic task processing for discovery
463 * @task: the task to be executed
464 * @buffer: pointer to buffer to do I/O
465 * @size: size of @buffer
466 * @dma_dir: DMA direction. DMA_xxx
467 */
468static int sas_execute_task(struct sas_task *task, void *buffer, int size,
469 enum dma_data_direction dma_dir)
470{
471 int res = 0;
472 struct scatterlist *scatter = NULL;
473 struct task_status_struct *ts = &task->task_status;
474 int num_scatter = 0;
475 int retries = 0;
476 struct sas_internal *i =
477 to_sas_internal(task->dev->port->ha->core.shost->transportt);
478
479 if (dma_dir != DMA_NONE) {
480 scatter = kzalloc(sizeof(*scatter), GFP_KERNEL);
481 if (!scatter)
482 goto out;
483
484 sg_init_one(scatter, buffer, size);
485 num_scatter = 1;
486 }
487
488 task->task_proto = task->dev->tproto;
489 task->scatter = scatter;
490 task->num_scatter = num_scatter;
491 task->total_xfer_len = size;
492 task->data_dir = dma_dir;
493 task->task_done = sas_disc_task_done;
494 if (dma_dir != DMA_NONE &&
495 sas_protocol_ata(task->task_proto)) {
496 task->num_scatter = dma_map_sg(task->dev->port->ha->dev,
497 task->scatter,
498 task->num_scatter,
499 task->data_dir);
500 }
501
502 for (retries = 0; retries < 5; retries++) {
503 task->task_state_flags = SAS_TASK_STATE_PENDING;
504 init_completion(&task->completion);
505
506 task->timer.data = (unsigned long) task;
507 task->timer.function = sas_task_timedout;
508 task->timer.expires = jiffies + SAS_DEV_TIMEOUT*HZ;
509 add_timer(&task->timer);
510
511 res = i->dft->lldd_execute_task(task, 1, GFP_KERNEL);
512 if (res) {
513 del_timer(&task->timer);
514 SAS_DPRINTK("executing SAS discovery task failed:%d\n",
515 res);
516 goto ex_err;
517 }
518 wait_for_completion(&task->completion);
519 res = -ECOMM;
520 if (task->task_state_flags & SAS_TASK_STATE_ABORTED) {
521 int res2;
522 SAS_DPRINTK("task aborted, flags:0x%x\n",
523 task->task_state_flags);
524 res2 = i->dft->lldd_abort_task(task);
525 SAS_DPRINTK("came back from abort task\n");
526 if (!(task->task_state_flags & SAS_TASK_STATE_DONE)) {
527 if (res2 == TMF_RESP_FUNC_COMPLETE)
528 continue; /* Retry the task */
529 else
530 goto ex_err;
531 }
532 }
533 if (task->task_status.stat == SAM_STAT_BUSY ||
534 task->task_status.stat == SAM_STAT_TASK_SET_FULL ||
535 task->task_status.stat == SAS_QUEUE_FULL) {
536 SAS_DPRINTK("task: q busy, sleeping...\n");
537 schedule_timeout_interruptible(HZ);
538 } else if (task->task_status.stat == SAM_STAT_CHECK_CONDITION) {
539 struct scsi_sense_hdr shdr;
540
541 if (!scsi_normalize_sense(ts->buf, ts->buf_valid_size,
542 &shdr)) {
543 SAS_DPRINTK("couldn't normalize sense\n");
544 continue;
545 }
546 if ((shdr.sense_key == 6 && shdr.asc == 0x29) ||
547 (shdr.sense_key == 2 && shdr.asc == 4 &&
548 shdr.ascq == 1)) {
549 SAS_DPRINTK("device %016llx LUN: %016llx "
550 "powering up or not ready yet, "
551 "sleeping...\n",
552 SAS_ADDR(task->dev->sas_addr),
553 SAS_ADDR(task->ssp_task.LUN));
554
555 schedule_timeout_interruptible(5*HZ);
556 } else if (shdr.sense_key == 1) {
557 res = 0;
558 break;
559 } else if (shdr.sense_key == 5) {
560 break;
561 } else {
562 SAS_DPRINTK("dev %016llx LUN: %016llx "
563 "sense key:0x%x ASC:0x%x ASCQ:0x%x"
564 "\n",
565 SAS_ADDR(task->dev->sas_addr),
566 SAS_ADDR(task->ssp_task.LUN),
567 shdr.sense_key,
568 shdr.asc, shdr.ascq);
569 }
570 } else if (task->task_status.resp != SAS_TASK_COMPLETE ||
571 task->task_status.stat != SAM_STAT_GOOD) {
572 SAS_DPRINTK("task finished with resp:0x%x, "
573 "stat:0x%x\n",
574 task->task_status.resp,
575 task->task_status.stat);
576 goto ex_err;
577 } else {
578 res = 0;
579 break;
580 }
581 }
582ex_err:
583 if (dma_dir != DMA_NONE) {
584 if (sas_protocol_ata(task->task_proto))
585 dma_unmap_sg(task->dev->port->ha->dev,
586 task->scatter, task->num_scatter,
587 task->data_dir);
588 kfree(scatter);
589 }
590out:
591 return res;
592}
593
594/* ---------- SATA ---------- */
595
596static void sas_get_ata_command_set(struct domain_device *dev) 602static void sas_get_ata_command_set(struct domain_device *dev)
597{ 603{
598 struct dev_to_host_fis *fis = 604 struct dev_to_host_fis *fis =
599 (struct dev_to_host_fis *) dev->frame_rcvd; 605 (struct dev_to_host_fis *) dev->frame_rcvd;
600 606
607 if (dev->dev_type == SATA_PENDING)
608 return;
609
601 if ((fis->sector_count == 1 && /* ATA */ 610 if ((fis->sector_count == 1 && /* ATA */
602 fis->lbal == 1 && 611 fis->lbal == 1 &&
603 fis->lbam == 0 && 612 fis->lbam == 0 &&
@@ -636,224 +645,152 @@ static void sas_get_ata_command_set(struct domain_device *dev)
636 dev->sata_dev.command_set = ATAPI_COMMAND_SET; 645 dev->sata_dev.command_set = ATAPI_COMMAND_SET;
637} 646}
638 647
639/** 648void sas_probe_sata(struct asd_sas_port *port)
640 * sas_issue_ata_cmd -- Basic SATA command processing for discovery
641 * @dev: the device to send the command to
642 * @command: the command register
643 * @features: the features register
644 * @buffer: pointer to buffer to do I/O
645 * @size: size of @buffer
646 * @dma_dir: DMA direction. DMA_xxx
647 */
648static int sas_issue_ata_cmd(struct domain_device *dev, u8 command,
649 u8 features, void *buffer, int size,
650 enum dma_data_direction dma_dir)
651{
652 int res = 0;
653 struct sas_task *task;
654 struct dev_to_host_fis *d2h_fis = (struct dev_to_host_fis *)
655 &dev->frame_rcvd[0];
656
657 res = -ENOMEM;
658 task = sas_alloc_task(GFP_KERNEL);
659 if (!task)
660 goto out;
661
662 task->dev = dev;
663
664 task->ata_task.fis.fis_type = 0x27;
665 task->ata_task.fis.command = command;
666 task->ata_task.fis.features = features;
667 task->ata_task.fis.device = d2h_fis->device;
668 task->ata_task.retry_count = 1;
669
670 res = sas_execute_task(task, buffer, size, dma_dir);
671
672 sas_free_task(task);
673out:
674 return res;
675}
676
677#define ATA_IDENTIFY_DEV 0xEC
678#define ATA_IDENTIFY_PACKET_DEV 0xA1
679#define ATA_SET_FEATURES 0xEF
680#define ATA_FEATURE_PUP_STBY_SPIN_UP 0x07
681
682/**
683 * sas_discover_sata_dev -- discover a STP/SATA device (SATA_DEV)
684 * @dev: STP/SATA device of interest (ATA/ATAPI)
685 *
686 * The LLDD has already been notified of this device, so that we can
687 * send FISes to it. Here we try to get IDENTIFY DEVICE or IDENTIFY
688 * PACKET DEVICE, if ATAPI device, so that the LLDD can fine-tune its
689 * performance for this device.
690 */
691static int sas_discover_sata_dev(struct domain_device *dev)
692{ 649{
693 int res; 650 struct domain_device *dev, *n;
694 __le16 *identify_x; 651 int err;
695 u8 command;
696 652
697 identify_x = kzalloc(512, GFP_KERNEL); 653 mutex_lock(&port->ha->disco_mutex);
698 if (!identify_x) 654 list_for_each_entry_safe(dev, n, &port->disco_list, disco_list_node) {
699 return -ENOMEM; 655 if (!dev_is_sata(dev))
700 656 continue;
701 if (dev->sata_dev.command_set == ATA_COMMAND_SET) {
702 dev->sata_dev.identify_device = identify_x;
703 command = ATA_IDENTIFY_DEV;
704 } else {
705 dev->sata_dev.identify_packet_device = identify_x;
706 command = ATA_IDENTIFY_PACKET_DEV;
707 }
708 657
709 res = sas_issue_ata_cmd(dev, command, 0, identify_x, 512, 658 err = sas_ata_init_host_and_port(dev);
710 DMA_FROM_DEVICE); 659 if (err)
711 if (res) 660 sas_fail_probe(dev, __func__, err);
712 goto out_err; 661 else
713 662 ata_sas_async_port_init(dev->sata_dev.ap);
714 /* lives on the media? */
715 if (le16_to_cpu(identify_x[0]) & 4) {
716 /* incomplete response */
717 SAS_DPRINTK("sending SET FEATURE/PUP_STBY_SPIN_UP to "
718 "dev %llx\n", SAS_ADDR(dev->sas_addr));
719 if (!(identify_x[83] & cpu_to_le16(1<<6)))
720 goto cont1;
721 res = sas_issue_ata_cmd(dev, ATA_SET_FEATURES,
722 ATA_FEATURE_PUP_STBY_SPIN_UP,
723 NULL, 0, DMA_NONE);
724 if (res)
725 goto cont1;
726
727 schedule_timeout_interruptible(5*HZ); /* More time? */
728 res = sas_issue_ata_cmd(dev, command, 0, identify_x, 512,
729 DMA_FROM_DEVICE);
730 if (res)
731 goto out_err;
732 } 663 }
733cont1: 664 mutex_unlock(&port->ha->disco_mutex);
734 /* XXX Hint: register this SATA device with SATL.
735 When this returns, dev->sata_dev->lu is alive and
736 present.
737 sas_satl_register_dev(dev);
738 */
739 665
740 sas_fill_in_rphy(dev, dev->rphy); 666 list_for_each_entry_safe(dev, n, &port->disco_list, disco_list_node) {
667 if (!dev_is_sata(dev))
668 continue;
741 669
742 return 0; 670 sas_ata_wait_eh(dev);
743out_err:
744 dev->sata_dev.identify_packet_device = NULL;
745 dev->sata_dev.identify_device = NULL;
746 kfree(identify_x);
747 return res;
748}
749 671
750static int sas_discover_sata_pm(struct domain_device *dev) 672 /* if libata could not bring the link up, don't surface
751{ 673 * the device
752 return -ENODEV; 674 */
675 if (ata_dev_disabled(sas_to_ata_dev(dev)))
676 sas_fail_probe(dev, __func__, -ENODEV);
677 }
753} 678}
754 679
755/** 680/**
756 * sas_discover_sata -- discover an STP/SATA domain device 681 * sas_discover_sata -- discover an STP/SATA domain device
757 * @dev: pointer to struct domain_device of interest 682 * @dev: pointer to struct domain_device of interest
758 * 683 *
759 * First we notify the LLDD of this device, so we can send frames to 684 * Devices directly attached to a HA port, have no parents. All other
760 * it. Then depending on the type of device we call the appropriate 685 * devices do, and should have their "parent" pointer set appropriately
761 * discover functions. Once device discover is done, we notify the 686 * before calling this function.
762 * LLDD so that it can fine-tune its parameters for the device, by
763 * removing it and then adding it. That is, the second time around,
764 * the driver would have certain fields, that it is looking at, set.
765 * Finally we initialize the kobj so that the device can be added to
766 * the system at registration time. Devices directly attached to a HA
767 * port, have no parents. All other devices do, and should have their
768 * "parent" pointer set appropriately before calling this function.
769 */ 687 */
770int sas_discover_sata(struct domain_device *dev) 688int sas_discover_sata(struct domain_device *dev)
771{ 689{
772 int res; 690 int res;
773 691
692 if (dev->dev_type == SATA_PM)
693 return -ENODEV;
694
774 sas_get_ata_command_set(dev); 695 sas_get_ata_command_set(dev);
696 sas_fill_in_rphy(dev, dev->rphy);
775 697
776 res = sas_notify_lldd_dev_found(dev); 698 res = sas_notify_lldd_dev_found(dev);
777 if (res) 699 if (res)
778 return res; 700 return res;
779 701
780 switch (dev->dev_type) { 702 sas_discover_event(dev->port, DISCE_PROBE);
781 case SATA_DEV: 703 return 0;
782 res = sas_discover_sata_dev(dev);
783 break;
784 case SATA_PM:
785 res = sas_discover_sata_pm(dev);
786 break;
787 default:
788 break;
789 }
790 sas_notify_lldd_dev_gone(dev);
791 if (!res) {
792 sas_notify_lldd_dev_found(dev);
793 res = sas_rphy_add(dev->rphy);
794 }
795
796 return res;
797} 704}
798 705
799void sas_ata_strategy_handler(struct Scsi_Host *shost) 706static void async_sas_ata_eh(void *data, async_cookie_t cookie)
800{ 707{
801 struct scsi_device *sdev; 708 struct domain_device *dev = data;
709 struct ata_port *ap = dev->sata_dev.ap;
710 struct sas_ha_struct *ha = dev->port->ha;
802 711
803 shost_for_each_device(sdev, shost) { 712 /* hold a reference over eh since we may be racing with final
804 struct domain_device *ddev = sdev_to_domain_dev(sdev); 713 * remove once all commands are completed
805 struct ata_port *ap = ddev->sata_dev.ap; 714 */
715 kref_get(&dev->kref);
716 sas_ata_printk(KERN_DEBUG, dev, "dev error handler\n");
717 ata_scsi_port_error_handler(ha->core.shost, ap);
718 sas_put_device(dev);
719}
806 720
807 if (!dev_is_sata(ddev)) 721static bool sas_ata_dev_eh_valid(struct domain_device *dev)
808 continue; 722{
723 struct ata_port *ap;
809 724
810 ata_port_printk(ap, KERN_DEBUG, "sas eh calling libata port error handler"); 725 if (!dev_is_sata(dev))
811 ata_scsi_port_error_handler(shost, ap); 726 return false;
812 } 727 ap = dev->sata_dev.ap;
728 /* consume fully initialized ata ports */
729 smp_rmb();
730 return !!ap;
813} 731}
814 732
815int sas_ata_timed_out(struct scsi_cmnd *cmd, struct sas_task *task, 733void sas_ata_strategy_handler(struct Scsi_Host *shost)
816 enum blk_eh_timer_return *rtn)
817{ 734{
818 struct domain_device *ddev = cmd_to_domain_dev(cmd); 735 struct sas_ha_struct *sas_ha = SHOST_TO_SAS_HA(shost);
736 LIST_HEAD(async);
737 int i;
738
739 /* it's ok to defer revalidation events during ata eh, these
740 * disks are in one of three states:
741 * 1/ present for initial domain discovery, and these
742 * resets will cause bcn flutters
743 * 2/ hot removed, we'll discover that after eh fails
744 * 3/ hot added after initial discovery, lost the race, and need
745 * to catch the next train.
746 */
747 sas_disable_revalidation(sas_ha);
819 748
820 if (!dev_is_sata(ddev) || task) 749 spin_lock_irq(&sas_ha->phy_port_lock);
821 return 0; 750 for (i = 0; i < sas_ha->num_phys; i++) {
751 struct asd_sas_port *port = sas_ha->sas_port[i];
752 struct domain_device *dev;
822 753
823 /* we're a sata device with no task, so this must be a libata 754 spin_lock(&port->dev_list_lock);
824 * eh timeout. Ideally should hook into libata timeout 755 list_for_each_entry(dev, &port->dev_list, dev_list_node) {
825 * handling, but there's no point, it just wants to activate 756 if (!sas_ata_dev_eh_valid(dev))
826 * the eh thread */ 757 continue;
827 *rtn = BLK_EH_NOT_HANDLED; 758 async_schedule_domain(async_sas_ata_eh, dev, &async);
828 return 1; 759 }
760 spin_unlock(&port->dev_list_lock);
761 }
762 spin_unlock_irq(&sas_ha->phy_port_lock);
763
764 async_synchronize_full_domain(&async);
765
766 sas_enable_revalidation(sas_ha);
829} 767}
830 768
831int sas_ata_eh(struct Scsi_Host *shost, struct list_head *work_q, 769void sas_ata_eh(struct Scsi_Host *shost, struct list_head *work_q,
832 struct list_head *done_q) 770 struct list_head *done_q)
833{ 771{
834 int rtn = 0;
835 struct scsi_cmnd *cmd, *n; 772 struct scsi_cmnd *cmd, *n;
836 struct ata_port *ap; 773 struct domain_device *eh_dev;
837 774
838 do { 775 do {
839 LIST_HEAD(sata_q); 776 LIST_HEAD(sata_q);
840 777 eh_dev = NULL;
841 ap = NULL;
842 778
843 list_for_each_entry_safe(cmd, n, work_q, eh_entry) { 779 list_for_each_entry_safe(cmd, n, work_q, eh_entry) {
844 struct domain_device *ddev = cmd_to_domain_dev(cmd); 780 struct domain_device *ddev = cmd_to_domain_dev(cmd);
845 781
846 if (!dev_is_sata(ddev) || TO_SAS_TASK(cmd)) 782 if (!dev_is_sata(ddev) || TO_SAS_TASK(cmd))
847 continue; 783 continue;
848 if (ap && ap != ddev->sata_dev.ap) 784 if (eh_dev && eh_dev != ddev)
849 continue; 785 continue;
850 ap = ddev->sata_dev.ap; 786 eh_dev = ddev;
851 rtn = 1;
852 list_move(&cmd->eh_entry, &sata_q); 787 list_move(&cmd->eh_entry, &sata_q);
853 } 788 }
854 789
855 if (!list_empty(&sata_q)) { 790 if (!list_empty(&sata_q)) {
856 ata_port_printk(ap, KERN_DEBUG, "sas eh calling libata cmd error handler\n"); 791 struct ata_port *ap = eh_dev->sata_dev.ap;
792
793 sas_ata_printk(KERN_DEBUG, eh_dev, "cmd error handler\n");
857 ata_scsi_cmd_error_handler(shost, ap, &sata_q); 794 ata_scsi_cmd_error_handler(shost, ap, &sata_q);
858 /* 795 /*
859 * ata's error handler may leave the cmd on the list 796 * ata's error handler may leave the cmd on the list
@@ -869,7 +806,36 @@ int sas_ata_eh(struct Scsi_Host *shost, struct list_head *work_q,
869 while (!list_empty(&sata_q)) 806 while (!list_empty(&sata_q))
870 list_del_init(sata_q.next); 807 list_del_init(sata_q.next);
871 } 808 }
872 } while (ap); 809 } while (eh_dev);
810}
811
812void sas_ata_schedule_reset(struct domain_device *dev)
813{
814 struct ata_eh_info *ehi;
815 struct ata_port *ap;
816 unsigned long flags;
817
818 if (!dev_is_sata(dev))
819 return;
820
821 ap = dev->sata_dev.ap;
822 ehi = &ap->link.eh_info;
823
824 spin_lock_irqsave(ap->lock, flags);
825 ehi->err_mask |= AC_ERR_TIMEOUT;
826 ehi->action |= ATA_EH_RESET;
827 ata_port_schedule_eh(ap);
828 spin_unlock_irqrestore(ap->lock, flags);
829}
830EXPORT_SYMBOL_GPL(sas_ata_schedule_reset);
831
832void sas_ata_wait_eh(struct domain_device *dev)
833{
834 struct ata_port *ap;
835
836 if (!dev_is_sata(dev))
837 return;
873 838
874 return rtn; 839 ap = dev->sata_dev.ap;
840 ata_port_wait_eh(ap);
875} 841}
diff --git a/drivers/scsi/libsas/sas_discover.c b/drivers/scsi/libsas/sas_discover.c
index 54a5199ceb56..364679675602 100644
--- a/drivers/scsi/libsas/sas_discover.c
+++ b/drivers/scsi/libsas/sas_discover.c
@@ -30,29 +30,30 @@
30 30
31#include <scsi/scsi_transport.h> 31#include <scsi/scsi_transport.h>
32#include <scsi/scsi_transport_sas.h> 32#include <scsi/scsi_transport_sas.h>
33#include <scsi/sas_ata.h>
33#include "../scsi_sas_internal.h" 34#include "../scsi_sas_internal.h"
34 35
35/* ---------- Basic task processing for discovery purposes ---------- */ 36/* ---------- Basic task processing for discovery purposes ---------- */
36 37
37void sas_init_dev(struct domain_device *dev) 38void sas_init_dev(struct domain_device *dev)
38{ 39{
39 INIT_LIST_HEAD(&dev->siblings); 40 switch (dev->dev_type) {
40 INIT_LIST_HEAD(&dev->dev_list_node); 41 case SAS_END_DEV:
41 switch (dev->dev_type) { 42 break;
42 case SAS_END_DEV: 43 case EDGE_DEV:
43 break; 44 case FANOUT_DEV:
44 case EDGE_DEV: 45 INIT_LIST_HEAD(&dev->ex_dev.children);
45 case FANOUT_DEV: 46 mutex_init(&dev->ex_dev.cmd_mutex);
46 INIT_LIST_HEAD(&dev->ex_dev.children); 47 break;
47 break; 48 case SATA_DEV:
48 case SATA_DEV: 49 case SATA_PM:
49 case SATA_PM: 50 case SATA_PM_PORT:
50 case SATA_PM_PORT: 51 case SATA_PENDING:
51 INIT_LIST_HEAD(&dev->sata_dev.children); 52 INIT_LIST_HEAD(&dev->sata_dev.children);
52 break; 53 break;
53 default: 54 default:
54 break; 55 break;
55 } 56 }
56} 57}
57 58
58/* ---------- Domain device discovery ---------- */ 59/* ---------- Domain device discovery ---------- */
@@ -68,19 +69,18 @@ void sas_init_dev(struct domain_device *dev)
68 */ 69 */
69static int sas_get_port_device(struct asd_sas_port *port) 70static int sas_get_port_device(struct asd_sas_port *port)
70{ 71{
71 unsigned long flags;
72 struct asd_sas_phy *phy; 72 struct asd_sas_phy *phy;
73 struct sas_rphy *rphy; 73 struct sas_rphy *rphy;
74 struct domain_device *dev; 74 struct domain_device *dev;
75 75
76 dev = kzalloc(sizeof(*dev), GFP_KERNEL); 76 dev = sas_alloc_device();
77 if (!dev) 77 if (!dev)
78 return -ENOMEM; 78 return -ENOMEM;
79 79
80 spin_lock_irqsave(&port->phy_list_lock, flags); 80 spin_lock_irq(&port->phy_list_lock);
81 if (list_empty(&port->phy_list)) { 81 if (list_empty(&port->phy_list)) {
82 spin_unlock_irqrestore(&port->phy_list_lock, flags); 82 spin_unlock_irq(&port->phy_list_lock);
83 kfree(dev); 83 sas_put_device(dev);
84 return -ENODEV; 84 return -ENODEV;
85 } 85 }
86 phy = container_of(port->phy_list.next, struct asd_sas_phy, port_phy_el); 86 phy = container_of(port->phy_list.next, struct asd_sas_phy, port_phy_el);
@@ -88,7 +88,7 @@ static int sas_get_port_device(struct asd_sas_port *port)
88 memcpy(dev->frame_rcvd, phy->frame_rcvd, min(sizeof(dev->frame_rcvd), 88 memcpy(dev->frame_rcvd, phy->frame_rcvd, min(sizeof(dev->frame_rcvd),
89 (size_t)phy->frame_rcvd_size)); 89 (size_t)phy->frame_rcvd_size));
90 spin_unlock(&phy->frame_rcvd_lock); 90 spin_unlock(&phy->frame_rcvd_lock);
91 spin_unlock_irqrestore(&port->phy_list_lock, flags); 91 spin_unlock_irq(&port->phy_list_lock);
92 92
93 if (dev->frame_rcvd[0] == 0x34 && port->oob_mode == SATA_OOB_MODE) { 93 if (dev->frame_rcvd[0] == 0x34 && port->oob_mode == SATA_OOB_MODE) {
94 struct dev_to_host_fis *fis = 94 struct dev_to_host_fis *fis =
@@ -130,9 +130,14 @@ static int sas_get_port_device(struct asd_sas_port *port)
130 } 130 }
131 131
132 if (!rphy) { 132 if (!rphy) {
133 kfree(dev); 133 sas_put_device(dev);
134 return -ENODEV; 134 return -ENODEV;
135 } 135 }
136
137 spin_lock_irq(&port->phy_list_lock);
138 list_for_each_entry(phy, &port->phy_list, port_phy_el)
139 sas_phy_set_target(phy, dev);
140 spin_unlock_irq(&port->phy_list_lock);
136 rphy->identify.phy_identifier = phy->phy->identify.phy_identifier; 141 rphy->identify.phy_identifier = phy->phy->identify.phy_identifier;
137 memcpy(dev->sas_addr, port->attached_sas_addr, SAS_ADDR_SIZE); 142 memcpy(dev->sas_addr, port->attached_sas_addr, SAS_ADDR_SIZE);
138 sas_fill_in_rphy(dev, rphy); 143 sas_fill_in_rphy(dev, rphy);
@@ -147,11 +152,17 @@ static int sas_get_port_device(struct asd_sas_port *port)
147 memset(port->disc.eeds_a, 0, SAS_ADDR_SIZE); 152 memset(port->disc.eeds_a, 0, SAS_ADDR_SIZE);
148 memset(port->disc.eeds_b, 0, SAS_ADDR_SIZE); 153 memset(port->disc.eeds_b, 0, SAS_ADDR_SIZE);
149 port->disc.max_level = 0; 154 port->disc.max_level = 0;
155 sas_device_set_phy(dev, port->port);
150 156
151 dev->rphy = rphy; 157 dev->rphy = rphy;
152 spin_lock_irq(&port->dev_list_lock); 158
153 list_add_tail(&dev->dev_list_node, &port->dev_list); 159 if (dev_is_sata(dev) || dev->dev_type == SAS_END_DEV)
154 spin_unlock_irq(&port->dev_list_lock); 160 list_add_tail(&dev->disco_list_node, &port->disco_list);
161 else {
162 spin_lock_irq(&port->dev_list_lock);
163 list_add_tail(&dev->dev_list_node, &port->dev_list);
164 spin_unlock_irq(&port->dev_list_lock);
165 }
155 166
156 return 0; 167 return 0;
157} 168}
@@ -173,6 +184,7 @@ int sas_notify_lldd_dev_found(struct domain_device *dev)
173 dev_name(sas_ha->dev), 184 dev_name(sas_ha->dev),
174 SAS_ADDR(dev->sas_addr), res); 185 SAS_ADDR(dev->sas_addr), res);
175 } 186 }
187 kref_get(&dev->kref);
176 } 188 }
177 return res; 189 return res;
178} 190}
@@ -184,12 +196,40 @@ void sas_notify_lldd_dev_gone(struct domain_device *dev)
184 struct Scsi_Host *shost = sas_ha->core.shost; 196 struct Scsi_Host *shost = sas_ha->core.shost;
185 struct sas_internal *i = to_sas_internal(shost->transportt); 197 struct sas_internal *i = to_sas_internal(shost->transportt);
186 198
187 if (i->dft->lldd_dev_gone) 199 if (i->dft->lldd_dev_gone) {
188 i->dft->lldd_dev_gone(dev); 200 i->dft->lldd_dev_gone(dev);
201 sas_put_device(dev);
202 }
189} 203}
190 204
191/* ---------- Common/dispatchers ---------- */ 205static void sas_probe_devices(struct work_struct *work)
206{
207 struct domain_device *dev, *n;
208 struct sas_discovery_event *ev =
209 container_of(work, struct sas_discovery_event, work);
210 struct asd_sas_port *port = ev->port;
211
212 clear_bit(DISCE_PROBE, &port->disc.pending);
192 213
214 /* devices must be domain members before link recovery and probe */
215 list_for_each_entry(dev, &port->disco_list, disco_list_node) {
216 spin_lock_irq(&port->dev_list_lock);
217 list_add_tail(&dev->dev_list_node, &port->dev_list);
218 spin_unlock_irq(&port->dev_list_lock);
219 }
220
221 sas_probe_sata(port);
222
223 list_for_each_entry_safe(dev, n, &port->disco_list, disco_list_node) {
224 int err;
225
226 err = sas_rphy_add(dev->rphy);
227 if (err)
228 sas_fail_probe(dev, __func__, err);
229 else
230 list_del_init(&dev->disco_list_node);
231 }
232}
193 233
194/** 234/**
195 * sas_discover_end_dev -- discover an end device (SSP, etc) 235 * sas_discover_end_dev -- discover an end device (SSP, etc)
@@ -203,22 +243,36 @@ int sas_discover_end_dev(struct domain_device *dev)
203 243
204 res = sas_notify_lldd_dev_found(dev); 244 res = sas_notify_lldd_dev_found(dev);
205 if (res) 245 if (res)
206 goto out_err2; 246 return res;
207 247 sas_discover_event(dev->port, DISCE_PROBE);
208 res = sas_rphy_add(dev->rphy);
209 if (res)
210 goto out_err;
211 248
212 return 0; 249 return 0;
213
214out_err:
215 sas_notify_lldd_dev_gone(dev);
216out_err2:
217 return res;
218} 250}
219 251
220/* ---------- Device registration and unregistration ---------- */ 252/* ---------- Device registration and unregistration ---------- */
221 253
254void sas_free_device(struct kref *kref)
255{
256 struct domain_device *dev = container_of(kref, typeof(*dev), kref);
257
258 if (dev->parent)
259 sas_put_device(dev->parent);
260
261 sas_port_put_phy(dev->phy);
262 dev->phy = NULL;
263
264 /* remove the phys and ports, everything else should be gone */
265 if (dev->dev_type == EDGE_DEV || dev->dev_type == FANOUT_DEV)
266 kfree(dev->ex_dev.ex_phy);
267
268 if (dev_is_sata(dev) && dev->sata_dev.ap) {
269 ata_sas_port_destroy(dev->sata_dev.ap);
270 dev->sata_dev.ap = NULL;
271 }
272
273 kfree(dev);
274}
275
222static void sas_unregister_common_dev(struct asd_sas_port *port, struct domain_device *dev) 276static void sas_unregister_common_dev(struct asd_sas_port *port, struct domain_device *dev)
223{ 277{
224 sas_notify_lldd_dev_gone(dev); 278 sas_notify_lldd_dev_gone(dev);
@@ -230,34 +284,84 @@ static void sas_unregister_common_dev(struct asd_sas_port *port, struct domain_d
230 spin_lock_irq(&port->dev_list_lock); 284 spin_lock_irq(&port->dev_list_lock);
231 list_del_init(&dev->dev_list_node); 285 list_del_init(&dev->dev_list_node);
232 spin_unlock_irq(&port->dev_list_lock); 286 spin_unlock_irq(&port->dev_list_lock);
287
288 sas_put_device(dev);
233} 289}
234 290
235void sas_unregister_dev(struct asd_sas_port *port, struct domain_device *dev) 291static void sas_destruct_devices(struct work_struct *work)
236{ 292{
237 if (dev->rphy) { 293 struct domain_device *dev, *n;
294 struct sas_discovery_event *ev =
295 container_of(work, struct sas_discovery_event, work);
296 struct asd_sas_port *port = ev->port;
297
298 clear_bit(DISCE_DESTRUCT, &port->disc.pending);
299
300 list_for_each_entry_safe(dev, n, &port->destroy_list, disco_list_node) {
301 list_del_init(&dev->disco_list_node);
302
238 sas_remove_children(&dev->rphy->dev); 303 sas_remove_children(&dev->rphy->dev);
239 sas_rphy_delete(dev->rphy); 304 sas_rphy_delete(dev->rphy);
240 dev->rphy = NULL; 305 dev->rphy = NULL;
306 sas_unregister_common_dev(port, dev);
241 } 307 }
242 if (dev->dev_type == EDGE_DEV || dev->dev_type == FANOUT_DEV) { 308}
243 /* remove the phys and ports, everything else should be gone */ 309
244 kfree(dev->ex_dev.ex_phy); 310void sas_unregister_dev(struct asd_sas_port *port, struct domain_device *dev)
245 dev->ex_dev.ex_phy = NULL; 311{
312 if (!test_bit(SAS_DEV_DESTROY, &dev->state) &&
313 !list_empty(&dev->disco_list_node)) {
314 /* this rphy never saw sas_rphy_add */
315 list_del_init(&dev->disco_list_node);
316 sas_rphy_free(dev->rphy);
317 dev->rphy = NULL;
318 sas_unregister_common_dev(port, dev);
319 }
320
321 if (dev->rphy && !test_and_set_bit(SAS_DEV_DESTROY, &dev->state)) {
322 sas_rphy_unlink(dev->rphy);
323 list_move_tail(&dev->disco_list_node, &port->destroy_list);
324 sas_discover_event(dev->port, DISCE_DESTRUCT);
246 } 325 }
247 sas_unregister_common_dev(port, dev);
248} 326}
249 327
250void sas_unregister_domain_devices(struct asd_sas_port *port) 328void sas_unregister_domain_devices(struct asd_sas_port *port, int gone)
251{ 329{
252 struct domain_device *dev, *n; 330 struct domain_device *dev, *n;
253 331
254 list_for_each_entry_safe_reverse(dev, n, &port->dev_list, dev_list_node) 332 list_for_each_entry_safe_reverse(dev, n, &port->dev_list, dev_list_node) {
333 if (gone)
334 set_bit(SAS_DEV_GONE, &dev->state);
335 sas_unregister_dev(port, dev);
336 }
337
338 list_for_each_entry_safe(dev, n, &port->disco_list, disco_list_node)
255 sas_unregister_dev(port, dev); 339 sas_unregister_dev(port, dev);
256 340
257 port->port->rphy = NULL; 341 port->port->rphy = NULL;
258 342
259} 343}
260 344
345void sas_device_set_phy(struct domain_device *dev, struct sas_port *port)
346{
347 struct sas_ha_struct *ha;
348 struct sas_phy *new_phy;
349
350 if (!dev)
351 return;
352
353 ha = dev->port->ha;
354 new_phy = sas_port_get_phy(port);
355
356 /* pin and record last seen phy */
357 spin_lock_irq(&ha->phy_port_lock);
358 if (new_phy) {
359 sas_port_put_phy(dev->phy);
360 dev->phy = new_phy;
361 }
362 spin_unlock_irq(&ha->phy_port_lock);
363}
364
261/* ---------- Discovery and Revalidation ---------- */ 365/* ---------- Discovery and Revalidation ---------- */
262 366
263/** 367/**
@@ -277,8 +381,7 @@ static void sas_discover_domain(struct work_struct *work)
277 container_of(work, struct sas_discovery_event, work); 381 container_of(work, struct sas_discovery_event, work);
278 struct asd_sas_port *port = ev->port; 382 struct asd_sas_port *port = ev->port;
279 383
280 sas_begin_event(DISCE_DISCOVER_DOMAIN, &port->disc.disc_event_lock, 384 clear_bit(DISCE_DISCOVER_DOMAIN, &port->disc.pending);
281 &port->disc.pending);
282 385
283 if (port->port_dev) 386 if (port->port_dev)
284 return; 387 return;
@@ -318,11 +421,12 @@ static void sas_discover_domain(struct work_struct *work)
318 sas_rphy_free(dev->rphy); 421 sas_rphy_free(dev->rphy);
319 dev->rphy = NULL; 422 dev->rphy = NULL;
320 423
424 list_del_init(&dev->disco_list_node);
321 spin_lock_irq(&port->dev_list_lock); 425 spin_lock_irq(&port->dev_list_lock);
322 list_del_init(&dev->dev_list_node); 426 list_del_init(&dev->dev_list_node);
323 spin_unlock_irq(&port->dev_list_lock); 427 spin_unlock_irq(&port->dev_list_lock);
324 428
325 kfree(dev); /* not kobject_register-ed yet */ 429 sas_put_device(dev);
326 port->port_dev = NULL; 430 port->port_dev = NULL;
327 } 431 }
328 432
@@ -336,21 +440,51 @@ static void sas_revalidate_domain(struct work_struct *work)
336 struct sas_discovery_event *ev = 440 struct sas_discovery_event *ev =
337 container_of(work, struct sas_discovery_event, work); 441 container_of(work, struct sas_discovery_event, work);
338 struct asd_sas_port *port = ev->port; 442 struct asd_sas_port *port = ev->port;
443 struct sas_ha_struct *ha = port->ha;
444
445 /* prevent revalidation from finding sata links in recovery */
446 mutex_lock(&ha->disco_mutex);
447 if (test_bit(SAS_HA_ATA_EH_ACTIVE, &ha->state)) {
448 SAS_DPRINTK("REVALIDATION DEFERRED on port %d, pid:%d\n",
449 port->id, task_pid_nr(current));
450 goto out;
451 }
339 452
340 sas_begin_event(DISCE_REVALIDATE_DOMAIN, &port->disc.disc_event_lock, 453 clear_bit(DISCE_REVALIDATE_DOMAIN, &port->disc.pending);
341 &port->disc.pending);
342 454
343 SAS_DPRINTK("REVALIDATING DOMAIN on port %d, pid:%d\n", port->id, 455 SAS_DPRINTK("REVALIDATING DOMAIN on port %d, pid:%d\n", port->id,
344 task_pid_nr(current)); 456 task_pid_nr(current));
457
345 if (port->port_dev) 458 if (port->port_dev)
346 res = sas_ex_revalidate_domain(port->port_dev); 459 res = sas_ex_revalidate_domain(port->port_dev);
347 460
348 SAS_DPRINTK("done REVALIDATING DOMAIN on port %d, pid:%d, res 0x%x\n", 461 SAS_DPRINTK("done REVALIDATING DOMAIN on port %d, pid:%d, res 0x%x\n",
349 port->id, task_pid_nr(current), res); 462 port->id, task_pid_nr(current), res);
463 out:
464 mutex_unlock(&ha->disco_mutex);
350} 465}
351 466
352/* ---------- Events ---------- */ 467/* ---------- Events ---------- */
353 468
469static void sas_chain_work(struct sas_ha_struct *ha, struct work_struct *work)
470{
471 /* chained work is not subject to SA_HA_DRAINING or SAS_HA_REGISTERED */
472 scsi_queue_work(ha->core.shost, work);
473}
474
475static void sas_chain_event(int event, unsigned long *pending,
476 struct work_struct *work,
477 struct sas_ha_struct *ha)
478{
479 if (!test_and_set_bit(event, pending)) {
480 unsigned long flags;
481
482 spin_lock_irqsave(&ha->state_lock, flags);
483 sas_chain_work(ha, work);
484 spin_unlock_irqrestore(&ha->state_lock, flags);
485 }
486}
487
354int sas_discover_event(struct asd_sas_port *port, enum discover_event ev) 488int sas_discover_event(struct asd_sas_port *port, enum discover_event ev)
355{ 489{
356 struct sas_discovery *disc; 490 struct sas_discovery *disc;
@@ -361,8 +495,7 @@ int sas_discover_event(struct asd_sas_port *port, enum discover_event ev)
361 495
362 BUG_ON(ev >= DISC_NUM_EVENTS); 496 BUG_ON(ev >= DISC_NUM_EVENTS);
363 497
364 sas_queue_event(ev, &disc->disc_event_lock, &disc->pending, 498 sas_chain_event(ev, &disc->pending, &disc->disc_work[ev].work, port->ha);
365 &disc->disc_work[ev].work, port->ha);
366 499
367 return 0; 500 return 0;
368} 501}
@@ -380,9 +513,10 @@ void sas_init_disc(struct sas_discovery *disc, struct asd_sas_port *port)
380 static const work_func_t sas_event_fns[DISC_NUM_EVENTS] = { 513 static const work_func_t sas_event_fns[DISC_NUM_EVENTS] = {
381 [DISCE_DISCOVER_DOMAIN] = sas_discover_domain, 514 [DISCE_DISCOVER_DOMAIN] = sas_discover_domain,
382 [DISCE_REVALIDATE_DOMAIN] = sas_revalidate_domain, 515 [DISCE_REVALIDATE_DOMAIN] = sas_revalidate_domain,
516 [DISCE_PROBE] = sas_probe_devices,
517 [DISCE_DESTRUCT] = sas_destruct_devices,
383 }; 518 };
384 519
385 spin_lock_init(&disc->disc_event_lock);
386 disc->pending = 0; 520 disc->pending = 0;
387 for (i = 0; i < DISC_NUM_EVENTS; i++) { 521 for (i = 0; i < DISC_NUM_EVENTS; i++) {
388 INIT_WORK(&disc->disc_work[i].work, sas_event_fns[i]); 522 INIT_WORK(&disc->disc_work[i].work, sas_event_fns[i]);
diff --git a/drivers/scsi/libsas/sas_event.c b/drivers/scsi/libsas/sas_event.c
index 9db30fb5caf2..16639bbae629 100644
--- a/drivers/scsi/libsas/sas_event.c
+++ b/drivers/scsi/libsas/sas_event.c
@@ -22,15 +22,103 @@
22 * 22 *
23 */ 23 */
24 24
25#include <linux/export.h>
25#include <scsi/scsi_host.h> 26#include <scsi/scsi_host.h>
26#include "sas_internal.h" 27#include "sas_internal.h"
27#include "sas_dump.h" 28#include "sas_dump.h"
28 29
30void sas_queue_work(struct sas_ha_struct *ha, struct work_struct *work)
31{
32 if (!test_bit(SAS_HA_REGISTERED, &ha->state))
33 return;
34
35 if (test_bit(SAS_HA_DRAINING, &ha->state))
36 list_add(&work->entry, &ha->defer_q);
37 else
38 scsi_queue_work(ha->core.shost, work);
39}
40
41static void sas_queue_event(int event, unsigned long *pending,
42 struct work_struct *work,
43 struct sas_ha_struct *ha)
44{
45 if (!test_and_set_bit(event, pending)) {
46 unsigned long flags;
47
48 spin_lock_irqsave(&ha->state_lock, flags);
49 sas_queue_work(ha, work);
50 spin_unlock_irqrestore(&ha->state_lock, flags);
51 }
52}
53
54
55void __sas_drain_work(struct sas_ha_struct *ha)
56{
57 struct workqueue_struct *wq = ha->core.shost->work_q;
58 struct work_struct *w, *_w;
59
60 set_bit(SAS_HA_DRAINING, &ha->state);
61 /* flush submitters */
62 spin_lock_irq(&ha->state_lock);
63 spin_unlock_irq(&ha->state_lock);
64
65 drain_workqueue(wq);
66
67 spin_lock_irq(&ha->state_lock);
68 clear_bit(SAS_HA_DRAINING, &ha->state);
69 list_for_each_entry_safe(w, _w, &ha->defer_q, entry) {
70 list_del_init(&w->entry);
71 sas_queue_work(ha, w);
72 }
73 spin_unlock_irq(&ha->state_lock);
74}
75
76int sas_drain_work(struct sas_ha_struct *ha)
77{
78 int err;
79
80 err = mutex_lock_interruptible(&ha->drain_mutex);
81 if (err)
82 return err;
83 if (test_bit(SAS_HA_REGISTERED, &ha->state))
84 __sas_drain_work(ha);
85 mutex_unlock(&ha->drain_mutex);
86
87 return 0;
88}
89EXPORT_SYMBOL_GPL(sas_drain_work);
90
91void sas_disable_revalidation(struct sas_ha_struct *ha)
92{
93 mutex_lock(&ha->disco_mutex);
94 set_bit(SAS_HA_ATA_EH_ACTIVE, &ha->state);
95 mutex_unlock(&ha->disco_mutex);
96}
97
98void sas_enable_revalidation(struct sas_ha_struct *ha)
99{
100 int i;
101
102 mutex_lock(&ha->disco_mutex);
103 clear_bit(SAS_HA_ATA_EH_ACTIVE, &ha->state);
104 for (i = 0; i < ha->num_phys; i++) {
105 struct asd_sas_port *port = ha->sas_port[i];
106 const int ev = DISCE_REVALIDATE_DOMAIN;
107 struct sas_discovery *d = &port->disc;
108
109 if (!test_and_clear_bit(ev, &d->pending))
110 continue;
111
112 sas_queue_event(ev, &d->pending, &d->disc_work[ev].work, ha);
113 }
114 mutex_unlock(&ha->disco_mutex);
115}
116
29static void notify_ha_event(struct sas_ha_struct *sas_ha, enum ha_event event) 117static void notify_ha_event(struct sas_ha_struct *sas_ha, enum ha_event event)
30{ 118{
31 BUG_ON(event >= HA_NUM_EVENTS); 119 BUG_ON(event >= HA_NUM_EVENTS);
32 120
33 sas_queue_event(event, &sas_ha->event_lock, &sas_ha->pending, 121 sas_queue_event(event, &sas_ha->pending,
34 &sas_ha->ha_events[event].work, sas_ha); 122 &sas_ha->ha_events[event].work, sas_ha);
35} 123}
36 124
@@ -40,7 +128,7 @@ static void notify_port_event(struct asd_sas_phy *phy, enum port_event event)
40 128
41 BUG_ON(event >= PORT_NUM_EVENTS); 129 BUG_ON(event >= PORT_NUM_EVENTS);
42 130
43 sas_queue_event(event, &ha->event_lock, &phy->port_events_pending, 131 sas_queue_event(event, &phy->port_events_pending,
44 &phy->port_events[event].work, ha); 132 &phy->port_events[event].work, ha);
45} 133}
46 134
@@ -50,7 +138,7 @@ static void notify_phy_event(struct asd_sas_phy *phy, enum phy_event event)
50 138
51 BUG_ON(event >= PHY_NUM_EVENTS); 139 BUG_ON(event >= PHY_NUM_EVENTS);
52 140
53 sas_queue_event(event, &ha->event_lock, &phy->phy_events_pending, 141 sas_queue_event(event, &phy->phy_events_pending,
54 &phy->phy_events[event].work, ha); 142 &phy->phy_events[event].work, ha);
55} 143}
56 144
@@ -62,8 +150,6 @@ int sas_init_events(struct sas_ha_struct *sas_ha)
62 150
63 int i; 151 int i;
64 152
65 spin_lock_init(&sas_ha->event_lock);
66
67 for (i = 0; i < HA_NUM_EVENTS; i++) { 153 for (i = 0; i < HA_NUM_EVENTS; i++) {
68 INIT_WORK(&sas_ha->ha_events[i].work, sas_ha_event_fns[i]); 154 INIT_WORK(&sas_ha->ha_events[i].work, sas_ha_event_fns[i]);
69 sas_ha->ha_events[i].ha = sas_ha; 155 sas_ha->ha_events[i].ha = sas_ha;
diff --git a/drivers/scsi/libsas/sas_expander.c b/drivers/scsi/libsas/sas_expander.c
index 1b831c55ec6e..05acd9e35fc4 100644
--- a/drivers/scsi/libsas/sas_expander.c
+++ b/drivers/scsi/libsas/sas_expander.c
@@ -28,6 +28,7 @@
28 28
29#include "sas_internal.h" 29#include "sas_internal.h"
30 30
31#include <scsi/sas_ata.h>
31#include <scsi/scsi_transport.h> 32#include <scsi/scsi_transport.h>
32#include <scsi/scsi_transport_sas.h> 33#include <scsi/scsi_transport_sas.h>
33#include "../scsi_sas_internal.h" 34#include "../scsi_sas_internal.h"
@@ -71,11 +72,18 @@ static int smp_execute_task(struct domain_device *dev, void *req, int req_size,
71 struct sas_internal *i = 72 struct sas_internal *i =
72 to_sas_internal(dev->port->ha->core.shost->transportt); 73 to_sas_internal(dev->port->ha->core.shost->transportt);
73 74
75 mutex_lock(&dev->ex_dev.cmd_mutex);
74 for (retry = 0; retry < 3; retry++) { 76 for (retry = 0; retry < 3; retry++) {
75 task = sas_alloc_task(GFP_KERNEL); 77 if (test_bit(SAS_DEV_GONE, &dev->state)) {
76 if (!task) 78 res = -ECOMM;
77 return -ENOMEM; 79 break;
80 }
78 81
82 task = sas_alloc_task(GFP_KERNEL);
83 if (!task) {
84 res = -ENOMEM;
85 break;
86 }
79 task->dev = dev; 87 task->dev = dev;
80 task->task_proto = dev->tproto; 88 task->task_proto = dev->tproto;
81 sg_init_one(&task->smp_task.smp_req, req, req_size); 89 sg_init_one(&task->smp_task.smp_req, req, req_size);
@@ -93,7 +101,7 @@ static int smp_execute_task(struct domain_device *dev, void *req, int req_size,
93 if (res) { 101 if (res) {
94 del_timer(&task->timer); 102 del_timer(&task->timer);
95 SAS_DPRINTK("executing SMP task failed:%d\n", res); 103 SAS_DPRINTK("executing SMP task failed:%d\n", res);
96 goto ex_err; 104 break;
97 } 105 }
98 106
99 wait_for_completion(&task->completion); 107 wait_for_completion(&task->completion);
@@ -103,24 +111,30 @@ static int smp_execute_task(struct domain_device *dev, void *req, int req_size,
103 i->dft->lldd_abort_task(task); 111 i->dft->lldd_abort_task(task);
104 if (!(task->task_state_flags & SAS_TASK_STATE_DONE)) { 112 if (!(task->task_state_flags & SAS_TASK_STATE_DONE)) {
105 SAS_DPRINTK("SMP task aborted and not done\n"); 113 SAS_DPRINTK("SMP task aborted and not done\n");
106 goto ex_err; 114 break;
107 } 115 }
108 } 116 }
109 if (task->task_status.resp == SAS_TASK_COMPLETE && 117 if (task->task_status.resp == SAS_TASK_COMPLETE &&
110 task->task_status.stat == SAM_STAT_GOOD) { 118 task->task_status.stat == SAM_STAT_GOOD) {
111 res = 0; 119 res = 0;
112 break; 120 break;
113 } if (task->task_status.resp == SAS_TASK_COMPLETE && 121 }
114 task->task_status.stat == SAS_DATA_UNDERRUN) { 122 if (task->task_status.resp == SAS_TASK_COMPLETE &&
123 task->task_status.stat == SAS_DATA_UNDERRUN) {
115 /* no error, but return the number of bytes of 124 /* no error, but return the number of bytes of
116 * underrun */ 125 * underrun */
117 res = task->task_status.residual; 126 res = task->task_status.residual;
118 break; 127 break;
119 } if (task->task_status.resp == SAS_TASK_COMPLETE && 128 }
120 task->task_status.stat == SAS_DATA_OVERRUN) { 129 if (task->task_status.resp == SAS_TASK_COMPLETE &&
130 task->task_status.stat == SAS_DATA_OVERRUN) {
121 res = -EMSGSIZE; 131 res = -EMSGSIZE;
122 break; 132 break;
123 } else { 133 }
134 if (task->task_status.resp == SAS_TASK_UNDELIVERED &&
135 task->task_status.stat == SAS_DEVICE_UNKNOWN)
136 break;
137 else {
124 SAS_DPRINTK("%s: task to dev %016llx response: 0x%x " 138 SAS_DPRINTK("%s: task to dev %016llx response: 0x%x "
125 "status 0x%x\n", __func__, 139 "status 0x%x\n", __func__,
126 SAS_ADDR(dev->sas_addr), 140 SAS_ADDR(dev->sas_addr),
@@ -130,11 +144,10 @@ static int smp_execute_task(struct domain_device *dev, void *req, int req_size,
130 task = NULL; 144 task = NULL;
131 } 145 }
132 } 146 }
133ex_err: 147 mutex_unlock(&dev->ex_dev.cmd_mutex);
148
134 BUG_ON(retry == 3 && task != NULL); 149 BUG_ON(retry == 3 && task != NULL);
135 if (task != NULL) { 150 sas_free_task(task);
136 sas_free_task(task);
137 }
138 return res; 151 return res;
139} 152}
140 153
@@ -153,19 +166,49 @@ static inline void *alloc_smp_resp(int size)
153 return kzalloc(size, GFP_KERNEL); 166 return kzalloc(size, GFP_KERNEL);
154} 167}
155 168
156/* ---------- Expander configuration ---------- */ 169static char sas_route_char(struct domain_device *dev, struct ex_phy *phy)
170{
171 switch (phy->routing_attr) {
172 case TABLE_ROUTING:
173 if (dev->ex_dev.t2t_supp)
174 return 'U';
175 else
176 return 'T';
177 case DIRECT_ROUTING:
178 return 'D';
179 case SUBTRACTIVE_ROUTING:
180 return 'S';
181 default:
182 return '?';
183 }
184}
185
186static enum sas_dev_type to_dev_type(struct discover_resp *dr)
187{
188 /* This is detecting a failure to transmit initial dev to host
189 * FIS as described in section J.5 of sas-2 r16
190 */
191 if (dr->attached_dev_type == NO_DEVICE && dr->attached_sata_dev &&
192 dr->linkrate >= SAS_LINK_RATE_1_5_GBPS)
193 return SATA_PENDING;
194 else
195 return dr->attached_dev_type;
196}
157 197
158static void sas_set_ex_phy(struct domain_device *dev, int phy_id, 198static void sas_set_ex_phy(struct domain_device *dev, int phy_id, void *rsp)
159 void *disc_resp)
160{ 199{
200 enum sas_dev_type dev_type;
201 enum sas_linkrate linkrate;
202 u8 sas_addr[SAS_ADDR_SIZE];
203 struct smp_resp *resp = rsp;
204 struct discover_resp *dr = &resp->disc;
161 struct expander_device *ex = &dev->ex_dev; 205 struct expander_device *ex = &dev->ex_dev;
162 struct ex_phy *phy = &ex->ex_phy[phy_id]; 206 struct ex_phy *phy = &ex->ex_phy[phy_id];
163 struct smp_resp *resp = disc_resp;
164 struct discover_resp *dr = &resp->disc;
165 struct sas_rphy *rphy = dev->rphy; 207 struct sas_rphy *rphy = dev->rphy;
166 int rediscover = (phy->phy != NULL); 208 bool new_phy = !phy->phy;
209 char *type;
167 210
168 if (!rediscover) { 211 if (new_phy) {
169 phy->phy = sas_phy_alloc(&rphy->dev, phy_id); 212 phy->phy = sas_phy_alloc(&rphy->dev, phy_id);
170 213
171 /* FIXME: error_handling */ 214 /* FIXME: error_handling */
@@ -184,8 +227,13 @@ static void sas_set_ex_phy(struct domain_device *dev, int phy_id,
184 break; 227 break;
185 } 228 }
186 229
230 /* check if anything important changed to squelch debug */
231 dev_type = phy->attached_dev_type;
232 linkrate = phy->linkrate;
233 memcpy(sas_addr, phy->attached_sas_addr, SAS_ADDR_SIZE);
234
235 phy->attached_dev_type = to_dev_type(dr);
187 phy->phy_id = phy_id; 236 phy->phy_id = phy_id;
188 phy->attached_dev_type = dr->attached_dev_type;
189 phy->linkrate = dr->linkrate; 237 phy->linkrate = dr->linkrate;
190 phy->attached_sata_host = dr->attached_sata_host; 238 phy->attached_sata_host = dr->attached_sata_host;
191 phy->attached_sata_dev = dr->attached_sata_dev; 239 phy->attached_sata_dev = dr->attached_sata_dev;
@@ -200,9 +248,11 @@ static void sas_set_ex_phy(struct domain_device *dev, int phy_id,
200 phy->last_da_index = -1; 248 phy->last_da_index = -1;
201 249
202 phy->phy->identify.sas_address = SAS_ADDR(phy->attached_sas_addr); 250 phy->phy->identify.sas_address = SAS_ADDR(phy->attached_sas_addr);
203 phy->phy->identify.device_type = phy->attached_dev_type; 251 phy->phy->identify.device_type = dr->attached_dev_type;
204 phy->phy->identify.initiator_port_protocols = phy->attached_iproto; 252 phy->phy->identify.initiator_port_protocols = phy->attached_iproto;
205 phy->phy->identify.target_port_protocols = phy->attached_tproto; 253 phy->phy->identify.target_port_protocols = phy->attached_tproto;
254 if (!phy->attached_tproto && dr->attached_sata_dev)
255 phy->phy->identify.target_port_protocols = SAS_PROTOCOL_SATA;
206 phy->phy->identify.phy_identifier = phy_id; 256 phy->phy->identify.phy_identifier = phy_id;
207 phy->phy->minimum_linkrate_hw = dr->hmin_linkrate; 257 phy->phy->minimum_linkrate_hw = dr->hmin_linkrate;
208 phy->phy->maximum_linkrate_hw = dr->hmax_linkrate; 258 phy->phy->maximum_linkrate_hw = dr->hmax_linkrate;
@@ -210,20 +260,76 @@ static void sas_set_ex_phy(struct domain_device *dev, int phy_id,
210 phy->phy->maximum_linkrate = dr->pmax_linkrate; 260 phy->phy->maximum_linkrate = dr->pmax_linkrate;
211 phy->phy->negotiated_linkrate = phy->linkrate; 261 phy->phy->negotiated_linkrate = phy->linkrate;
212 262
213 if (!rediscover) 263 if (new_phy)
214 if (sas_phy_add(phy->phy)) { 264 if (sas_phy_add(phy->phy)) {
215 sas_phy_free(phy->phy); 265 sas_phy_free(phy->phy);
216 return; 266 return;
217 } 267 }
218 268
219 SAS_DPRINTK("ex %016llx phy%02d:%c attached: %016llx\n", 269 switch (phy->attached_dev_type) {
270 case SATA_PENDING:
271 type = "stp pending";
272 break;
273 case NO_DEVICE:
274 type = "no device";
275 break;
276 case SAS_END_DEV:
277 if (phy->attached_iproto) {
278 if (phy->attached_tproto)
279 type = "host+target";
280 else
281 type = "host";
282 } else {
283 if (dr->attached_sata_dev)
284 type = "stp";
285 else
286 type = "ssp";
287 }
288 break;
289 case EDGE_DEV:
290 case FANOUT_DEV:
291 type = "smp";
292 break;
293 default:
294 type = "unknown";
295 }
296
297 /* this routine is polled by libata error recovery so filter
298 * unimportant messages
299 */
300 if (new_phy || phy->attached_dev_type != dev_type ||
301 phy->linkrate != linkrate ||
302 SAS_ADDR(phy->attached_sas_addr) != SAS_ADDR(sas_addr))
303 /* pass */;
304 else
305 return;
306
307 SAS_DPRINTK("ex %016llx phy%02d:%c:%X attached: %016llx (%s)\n",
220 SAS_ADDR(dev->sas_addr), phy->phy_id, 308 SAS_ADDR(dev->sas_addr), phy->phy_id,
221 phy->routing_attr == TABLE_ROUTING ? 'T' : 309 sas_route_char(dev, phy), phy->linkrate,
222 phy->routing_attr == DIRECT_ROUTING ? 'D' : 310 SAS_ADDR(phy->attached_sas_addr), type);
223 phy->routing_attr == SUBTRACTIVE_ROUTING ? 'S' : '?', 311}
224 SAS_ADDR(phy->attached_sas_addr)); 312
313/* check if we have an existing attached ata device on this expander phy */
314struct domain_device *sas_ex_to_ata(struct domain_device *ex_dev, int phy_id)
315{
316 struct ex_phy *ex_phy = &ex_dev->ex_dev.ex_phy[phy_id];
317 struct domain_device *dev;
318 struct sas_rphy *rphy;
319
320 if (!ex_phy->port)
321 return NULL;
225 322
226 return; 323 rphy = ex_phy->port->rphy;
324 if (!rphy)
325 return NULL;
326
327 dev = sas_find_dev_by_rphy(rphy);
328
329 if (dev && dev_is_sata(dev))
330 return dev;
331
332 return NULL;
227} 333}
228 334
229#define DISCOVER_REQ_SIZE 16 335#define DISCOVER_REQ_SIZE 16
@@ -232,39 +338,25 @@ static void sas_set_ex_phy(struct domain_device *dev, int phy_id,
232static int sas_ex_phy_discover_helper(struct domain_device *dev, u8 *disc_req, 338static int sas_ex_phy_discover_helper(struct domain_device *dev, u8 *disc_req,
233 u8 *disc_resp, int single) 339 u8 *disc_resp, int single)
234{ 340{
235 int i, res; 341 struct discover_resp *dr;
342 int res;
236 343
237 disc_req[9] = single; 344 disc_req[9] = single;
238 for (i = 1 ; i < 3; i++) {
239 struct discover_resp *dr;
240 345
241 res = smp_execute_task(dev, disc_req, DISCOVER_REQ_SIZE, 346 res = smp_execute_task(dev, disc_req, DISCOVER_REQ_SIZE,
242 disc_resp, DISCOVER_RESP_SIZE); 347 disc_resp, DISCOVER_RESP_SIZE);
243 if (res) 348 if (res)
244 return res; 349 return res;
245 /* This is detecting a failure to transmit initial 350 dr = &((struct smp_resp *)disc_resp)->disc;
246 * dev to host FIS as described in section G.5 of 351 if (memcmp(dev->sas_addr, dr->attached_sas_addr, SAS_ADDR_SIZE) == 0) {
247 * sas-2 r 04b */ 352 sas_printk("Found loopback topology, just ignore it!\n");
248 dr = &((struct smp_resp *)disc_resp)->disc; 353 return 0;
249 if (memcmp(dev->sas_addr, dr->attached_sas_addr,
250 SAS_ADDR_SIZE) == 0) {
251 sas_printk("Found loopback topology, just ignore it!\n");
252 return 0;
253 }
254 if (!(dr->attached_dev_type == 0 &&
255 dr->attached_sata_dev))
256 break;
257 /* In order to generate the dev to host FIS, we
258 * send a link reset to the expander port */
259 sas_smp_phy_control(dev, single, PHY_FUNC_LINK_RESET, NULL);
260 /* Wait for the reset to trigger the negotiation */
261 msleep(500);
262 } 354 }
263 sas_set_ex_phy(dev, single, disc_resp); 355 sas_set_ex_phy(dev, single, disc_resp);
264 return 0; 356 return 0;
265} 357}
266 358
267static int sas_ex_phy_discover(struct domain_device *dev, int single) 359int sas_ex_phy_discover(struct domain_device *dev, int single)
268{ 360{
269 struct expander_device *ex = &dev->ex_dev; 361 struct expander_device *ex = &dev->ex_dev;
270 int res = 0; 362 int res = 0;
@@ -569,9 +661,8 @@ int sas_smp_get_phy_events(struct sas_phy *phy)
569#define RPS_REQ_SIZE 16 661#define RPS_REQ_SIZE 16
570#define RPS_RESP_SIZE 60 662#define RPS_RESP_SIZE 60
571 663
572static int sas_get_report_phy_sata(struct domain_device *dev, 664int sas_get_report_phy_sata(struct domain_device *dev, int phy_id,
573 int phy_id, 665 struct smp_resp *rps_resp)
574 struct smp_resp *rps_resp)
575{ 666{
576 int res; 667 int res;
577 u8 *rps_req = alloc_smp_req(RPS_REQ_SIZE); 668 u8 *rps_req = alloc_smp_req(RPS_REQ_SIZE);
@@ -657,10 +748,11 @@ static struct domain_device *sas_ex_discover_end_dev(
657 if (phy->attached_sata_host || phy->attached_sata_ps) 748 if (phy->attached_sata_host || phy->attached_sata_ps)
658 return NULL; 749 return NULL;
659 750
660 child = kzalloc(sizeof(*child), GFP_KERNEL); 751 child = sas_alloc_device();
661 if (!child) 752 if (!child)
662 return NULL; 753 return NULL;
663 754
755 kref_get(&parent->kref);
664 child->parent = parent; 756 child->parent = parent;
665 child->port = parent->port; 757 child->port = parent->port;
666 child->iproto = phy->attached_iproto; 758 child->iproto = phy->attached_iproto;
@@ -676,24 +768,13 @@ static struct domain_device *sas_ex_discover_end_dev(
676 } 768 }
677 } 769 }
678 sas_ex_get_linkrate(parent, child, phy); 770 sas_ex_get_linkrate(parent, child, phy);
771 sas_device_set_phy(child, phy->port);
679 772
680#ifdef CONFIG_SCSI_SAS_ATA 773#ifdef CONFIG_SCSI_SAS_ATA
681 if ((phy->attached_tproto & SAS_PROTOCOL_STP) || phy->attached_sata_dev) { 774 if ((phy->attached_tproto & SAS_PROTOCOL_STP) || phy->attached_sata_dev) {
682 child->dev_type = SATA_DEV; 775 res = sas_get_ata_info(child, phy);
683 if (phy->attached_tproto & SAS_PROTOCOL_STP) 776 if (res)
684 child->tproto = phy->attached_tproto;
685 if (phy->attached_sata_dev)
686 child->tproto |= SATA_DEV;
687 res = sas_get_report_phy_sata(parent, phy_id,
688 &child->sata_dev.rps_resp);
689 if (res) {
690 SAS_DPRINTK("report phy sata to %016llx:0x%x returned "
691 "0x%x\n", SAS_ADDR(parent->sas_addr),
692 phy_id, res);
693 goto out_free; 777 goto out_free;
694 }
695 memcpy(child->frame_rcvd, &child->sata_dev.rps_resp.rps.fis,
696 sizeof(struct dev_to_host_fis));
697 778
698 rphy = sas_end_device_alloc(phy->port); 779 rphy = sas_end_device_alloc(phy->port);
699 if (unlikely(!rphy)) 780 if (unlikely(!rphy))
@@ -703,9 +784,7 @@ static struct domain_device *sas_ex_discover_end_dev(
703 784
704 child->rphy = rphy; 785 child->rphy = rphy;
705 786
706 spin_lock_irq(&parent->port->dev_list_lock); 787 list_add_tail(&child->disco_list_node, &parent->port->disco_list);
707 list_add_tail(&child->dev_list_node, &parent->port->dev_list);
708 spin_unlock_irq(&parent->port->dev_list_lock);
709 788
710 res = sas_discover_sata(child); 789 res = sas_discover_sata(child);
711 if (res) { 790 if (res) {
@@ -729,9 +808,7 @@ static struct domain_device *sas_ex_discover_end_dev(
729 child->rphy = rphy; 808 child->rphy = rphy;
730 sas_fill_in_rphy(child, rphy); 809 sas_fill_in_rphy(child, rphy);
731 810
732 spin_lock_irq(&parent->port->dev_list_lock); 811 list_add_tail(&child->disco_list_node, &parent->port->disco_list);
733 list_add_tail(&child->dev_list_node, &parent->port->dev_list);
734 spin_unlock_irq(&parent->port->dev_list_lock);
735 812
736 res = sas_discover_end_dev(child); 813 res = sas_discover_end_dev(child);
737 if (res) { 814 if (res) {
@@ -755,6 +832,7 @@ static struct domain_device *sas_ex_discover_end_dev(
755 sas_rphy_free(child->rphy); 832 sas_rphy_free(child->rphy);
756 child->rphy = NULL; 833 child->rphy = NULL;
757 834
835 list_del(&child->disco_list_node);
758 spin_lock_irq(&parent->port->dev_list_lock); 836 spin_lock_irq(&parent->port->dev_list_lock);
759 list_del(&child->dev_list_node); 837 list_del(&child->dev_list_node);
760 spin_unlock_irq(&parent->port->dev_list_lock); 838 spin_unlock_irq(&parent->port->dev_list_lock);
@@ -762,7 +840,7 @@ static struct domain_device *sas_ex_discover_end_dev(
762 sas_port_delete(phy->port); 840 sas_port_delete(phy->port);
763 out_err: 841 out_err:
764 phy->port = NULL; 842 phy->port = NULL;
765 kfree(child); 843 sas_put_device(child);
766 return NULL; 844 return NULL;
767} 845}
768 846
@@ -809,7 +887,7 @@ static struct domain_device *sas_ex_discover_expander(
809 phy->attached_phy_id); 887 phy->attached_phy_id);
810 return NULL; 888 return NULL;
811 } 889 }
812 child = kzalloc(sizeof(*child), GFP_KERNEL); 890 child = sas_alloc_device();
813 if (!child) 891 if (!child)
814 return NULL; 892 return NULL;
815 893
@@ -835,6 +913,7 @@ static struct domain_device *sas_ex_discover_expander(
835 child->rphy = rphy; 913 child->rphy = rphy;
836 edev = rphy_to_expander_device(rphy); 914 edev = rphy_to_expander_device(rphy);
837 child->dev_type = phy->attached_dev_type; 915 child->dev_type = phy->attached_dev_type;
916 kref_get(&parent->kref);
838 child->parent = parent; 917 child->parent = parent;
839 child->port = port; 918 child->port = port;
840 child->iproto = phy->attached_iproto; 919 child->iproto = phy->attached_iproto;
@@ -858,7 +937,7 @@ static struct domain_device *sas_ex_discover_expander(
858 spin_lock_irq(&parent->port->dev_list_lock); 937 spin_lock_irq(&parent->port->dev_list_lock);
859 list_del(&child->dev_list_node); 938 list_del(&child->dev_list_node);
860 spin_unlock_irq(&parent->port->dev_list_lock); 939 spin_unlock_irq(&parent->port->dev_list_lock);
861 kfree(child); 940 sas_put_device(child);
862 return NULL; 941 return NULL;
863 } 942 }
864 list_add_tail(&child->siblings, &parent->ex_dev.children); 943 list_add_tail(&child->siblings, &parent->ex_dev.children);
@@ -908,7 +987,8 @@ static int sas_ex_discover_dev(struct domain_device *dev, int phy_id)
908 987
909 if (ex_phy->attached_dev_type != SAS_END_DEV && 988 if (ex_phy->attached_dev_type != SAS_END_DEV &&
910 ex_phy->attached_dev_type != FANOUT_DEV && 989 ex_phy->attached_dev_type != FANOUT_DEV &&
911 ex_phy->attached_dev_type != EDGE_DEV) { 990 ex_phy->attached_dev_type != EDGE_DEV &&
991 ex_phy->attached_dev_type != SATA_PENDING) {
912 SAS_DPRINTK("unknown device type(0x%x) attached to ex %016llx " 992 SAS_DPRINTK("unknown device type(0x%x) attached to ex %016llx "
913 "phy 0x%x\n", ex_phy->attached_dev_type, 993 "phy 0x%x\n", ex_phy->attached_dev_type,
914 SAS_ADDR(dev->sas_addr), 994 SAS_ADDR(dev->sas_addr),
@@ -934,6 +1014,7 @@ static int sas_ex_discover_dev(struct domain_device *dev, int phy_id)
934 1014
935 switch (ex_phy->attached_dev_type) { 1015 switch (ex_phy->attached_dev_type) {
936 case SAS_END_DEV: 1016 case SAS_END_DEV:
1017 case SATA_PENDING:
937 child = sas_ex_discover_end_dev(dev, phy_id); 1018 child = sas_ex_discover_end_dev(dev, phy_id);
938 break; 1019 break;
939 case FANOUT_DEV: 1020 case FANOUT_DEV:
@@ -1128,32 +1209,25 @@ static void sas_print_parent_topology_bug(struct domain_device *child,
1128 struct ex_phy *parent_phy, 1209 struct ex_phy *parent_phy,
1129 struct ex_phy *child_phy) 1210 struct ex_phy *child_phy)
1130{ 1211{
1131 static const char ra_char[] = {
1132 [DIRECT_ROUTING] = 'D',
1133 [SUBTRACTIVE_ROUTING] = 'S',
1134 [TABLE_ROUTING] = 'T',
1135 };
1136 static const char *ex_type[] = { 1212 static const char *ex_type[] = {
1137 [EDGE_DEV] = "edge", 1213 [EDGE_DEV] = "edge",
1138 [FANOUT_DEV] = "fanout", 1214 [FANOUT_DEV] = "fanout",
1139 }; 1215 };
1140 struct domain_device *parent = child->parent; 1216 struct domain_device *parent = child->parent;
1141 1217
1142 sas_printk("%s ex %016llx (T2T supp:%d) phy 0x%x <--> %s ex %016llx " 1218 sas_printk("%s ex %016llx phy 0x%x <--> %s ex %016llx "
1143 "(T2T supp:%d) phy 0x%x has %c:%c routing link!\n", 1219 "phy 0x%x has %c:%c routing link!\n",
1144 1220
1145 ex_type[parent->dev_type], 1221 ex_type[parent->dev_type],
1146 SAS_ADDR(parent->sas_addr), 1222 SAS_ADDR(parent->sas_addr),
1147 parent->ex_dev.t2t_supp,
1148 parent_phy->phy_id, 1223 parent_phy->phy_id,
1149 1224
1150 ex_type[child->dev_type], 1225 ex_type[child->dev_type],
1151 SAS_ADDR(child->sas_addr), 1226 SAS_ADDR(child->sas_addr),
1152 child->ex_dev.t2t_supp,
1153 child_phy->phy_id, 1227 child_phy->phy_id,
1154 1228
1155 ra_char[parent_phy->routing_attr], 1229 sas_route_char(parent, parent_phy),
1156 ra_char[child_phy->routing_attr]); 1230 sas_route_char(child, child_phy));
1157} 1231}
1158 1232
1159static int sas_check_eeds(struct domain_device *child, 1233static int sas_check_eeds(struct domain_device *child,
@@ -1610,8 +1684,8 @@ static int sas_get_phy_change_count(struct domain_device *dev,
1610 return res; 1684 return res;
1611} 1685}
1612 1686
1613static int sas_get_phy_attached_sas_addr(struct domain_device *dev, 1687static int sas_get_phy_attached_dev(struct domain_device *dev, int phy_id,
1614 int phy_id, u8 *attached_sas_addr) 1688 u8 *sas_addr, enum sas_dev_type *type)
1615{ 1689{
1616 int res; 1690 int res;
1617 struct smp_resp *disc_resp; 1691 struct smp_resp *disc_resp;
@@ -1623,10 +1697,11 @@ static int sas_get_phy_attached_sas_addr(struct domain_device *dev,
1623 dr = &disc_resp->disc; 1697 dr = &disc_resp->disc;
1624 1698
1625 res = sas_get_phy_discover(dev, phy_id, disc_resp); 1699 res = sas_get_phy_discover(dev, phy_id, disc_resp);
1626 if (!res) { 1700 if (res == 0) {
1627 memcpy(attached_sas_addr,disc_resp->disc.attached_sas_addr,8); 1701 memcpy(sas_addr, disc_resp->disc.attached_sas_addr, 8);
1628 if (dr->attached_dev_type == 0) 1702 *type = to_dev_type(dr);
1629 memset(attached_sas_addr, 0, 8); 1703 if (*type == 0)
1704 memset(sas_addr, 0, 8);
1630 } 1705 }
1631 kfree(disc_resp); 1706 kfree(disc_resp);
1632 return res; 1707 return res;
@@ -1748,7 +1823,7 @@ static void sas_unregister_ex_tree(struct asd_sas_port *port, struct domain_devi
1748 struct domain_device *child, *n; 1823 struct domain_device *child, *n;
1749 1824
1750 list_for_each_entry_safe(child, n, &ex->children, siblings) { 1825 list_for_each_entry_safe(child, n, &ex->children, siblings) {
1751 child->gone = 1; 1826 set_bit(SAS_DEV_GONE, &child->state);
1752 if (child->dev_type == EDGE_DEV || 1827 if (child->dev_type == EDGE_DEV ||
1753 child->dev_type == FANOUT_DEV) 1828 child->dev_type == FANOUT_DEV)
1754 sas_unregister_ex_tree(port, child); 1829 sas_unregister_ex_tree(port, child);
@@ -1763,27 +1838,28 @@ static void sas_unregister_devs_sas_addr(struct domain_device *parent,
1763{ 1838{
1764 struct expander_device *ex_dev = &parent->ex_dev; 1839 struct expander_device *ex_dev = &parent->ex_dev;
1765 struct ex_phy *phy = &ex_dev->ex_phy[phy_id]; 1840 struct ex_phy *phy = &ex_dev->ex_phy[phy_id];
1766 struct domain_device *child, *n; 1841 struct domain_device *child, *n, *found = NULL;
1767 if (last) { 1842 if (last) {
1768 list_for_each_entry_safe(child, n, 1843 list_for_each_entry_safe(child, n,
1769 &ex_dev->children, siblings) { 1844 &ex_dev->children, siblings) {
1770 if (SAS_ADDR(child->sas_addr) == 1845 if (SAS_ADDR(child->sas_addr) ==
1771 SAS_ADDR(phy->attached_sas_addr)) { 1846 SAS_ADDR(phy->attached_sas_addr)) {
1772 child->gone = 1; 1847 set_bit(SAS_DEV_GONE, &child->state);
1773 if (child->dev_type == EDGE_DEV || 1848 if (child->dev_type == EDGE_DEV ||
1774 child->dev_type == FANOUT_DEV) 1849 child->dev_type == FANOUT_DEV)
1775 sas_unregister_ex_tree(parent->port, child); 1850 sas_unregister_ex_tree(parent->port, child);
1776 else 1851 else
1777 sas_unregister_dev(parent->port, child); 1852 sas_unregister_dev(parent->port, child);
1853 found = child;
1778 break; 1854 break;
1779 } 1855 }
1780 } 1856 }
1781 parent->gone = 1;
1782 sas_disable_routing(parent, phy->attached_sas_addr); 1857 sas_disable_routing(parent, phy->attached_sas_addr);
1783 } 1858 }
1784 memset(phy->attached_sas_addr, 0, SAS_ADDR_SIZE); 1859 memset(phy->attached_sas_addr, 0, SAS_ADDR_SIZE);
1785 if (phy->port) { 1860 if (phy->port) {
1786 sas_port_delete_phy(phy->port, phy->phy); 1861 sas_port_delete_phy(phy->port, phy->phy);
1862 sas_device_set_phy(found, phy->port);
1787 if (phy->port->num_phys == 0) 1863 if (phy->port->num_phys == 0)
1788 sas_port_delete(phy->port); 1864 sas_port_delete(phy->port);
1789 phy->port = NULL; 1865 phy->port = NULL;
@@ -1874,39 +1950,71 @@ out:
1874 return res; 1950 return res;
1875} 1951}
1876 1952
1953static bool dev_type_flutter(enum sas_dev_type new, enum sas_dev_type old)
1954{
1955 if (old == new)
1956 return true;
1957
1958 /* treat device directed resets as flutter, if we went
1959 * SAS_END_DEV to SATA_PENDING the link needs recovery
1960 */
1961 if ((old == SATA_PENDING && new == SAS_END_DEV) ||
1962 (old == SAS_END_DEV && new == SATA_PENDING))
1963 return true;
1964
1965 return false;
1966}
1967
1877static int sas_rediscover_dev(struct domain_device *dev, int phy_id, bool last) 1968static int sas_rediscover_dev(struct domain_device *dev, int phy_id, bool last)
1878{ 1969{
1879 struct expander_device *ex = &dev->ex_dev; 1970 struct expander_device *ex = &dev->ex_dev;
1880 struct ex_phy *phy = &ex->ex_phy[phy_id]; 1971 struct ex_phy *phy = &ex->ex_phy[phy_id];
1881 u8 attached_sas_addr[8]; 1972 enum sas_dev_type type = NO_DEVICE;
1973 u8 sas_addr[8];
1882 int res; 1974 int res;
1883 1975
1884 res = sas_get_phy_attached_sas_addr(dev, phy_id, attached_sas_addr); 1976 res = sas_get_phy_attached_dev(dev, phy_id, sas_addr, &type);
1885 switch (res) { 1977 switch (res) {
1886 case SMP_RESP_NO_PHY: 1978 case SMP_RESP_NO_PHY:
1887 phy->phy_state = PHY_NOT_PRESENT; 1979 phy->phy_state = PHY_NOT_PRESENT;
1888 sas_unregister_devs_sas_addr(dev, phy_id, last); 1980 sas_unregister_devs_sas_addr(dev, phy_id, last);
1889 goto out; break; 1981 return res;
1890 case SMP_RESP_PHY_VACANT: 1982 case SMP_RESP_PHY_VACANT:
1891 phy->phy_state = PHY_VACANT; 1983 phy->phy_state = PHY_VACANT;
1892 sas_unregister_devs_sas_addr(dev, phy_id, last); 1984 sas_unregister_devs_sas_addr(dev, phy_id, last);
1893 goto out; break; 1985 return res;
1894 case SMP_RESP_FUNC_ACC: 1986 case SMP_RESP_FUNC_ACC:
1895 break; 1987 break;
1896 } 1988 }
1897 1989
1898 if (SAS_ADDR(attached_sas_addr) == 0) { 1990 if (SAS_ADDR(sas_addr) == 0) {
1899 phy->phy_state = PHY_EMPTY; 1991 phy->phy_state = PHY_EMPTY;
1900 sas_unregister_devs_sas_addr(dev, phy_id, last); 1992 sas_unregister_devs_sas_addr(dev, phy_id, last);
1901 } else if (SAS_ADDR(attached_sas_addr) == 1993 return res;
1902 SAS_ADDR(phy->attached_sas_addr)) { 1994 } else if (SAS_ADDR(sas_addr) == SAS_ADDR(phy->attached_sas_addr) &&
1903 SAS_DPRINTK("ex %016llx phy 0x%x broadcast flutter\n", 1995 dev_type_flutter(type, phy->attached_dev_type)) {
1904 SAS_ADDR(dev->sas_addr), phy_id); 1996 struct domain_device *ata_dev = sas_ex_to_ata(dev, phy_id);
1997 char *action = "";
1998
1905 sas_ex_phy_discover(dev, phy_id); 1999 sas_ex_phy_discover(dev, phy_id);
1906 } else 2000
1907 res = sas_discover_new(dev, phy_id); 2001 if (ata_dev && phy->attached_dev_type == SATA_PENDING)
1908out: 2002 action = ", needs recovery";
1909 return res; 2003 SAS_DPRINTK("ex %016llx phy 0x%x broadcast flutter%s\n",
2004 SAS_ADDR(dev->sas_addr), phy_id, action);
2005 return res;
2006 }
2007
2008 /* delete the old link */
2009 if (SAS_ADDR(phy->attached_sas_addr) &&
2010 SAS_ADDR(sas_addr) != SAS_ADDR(phy->attached_sas_addr)) {
2011 SAS_DPRINTK("ex %016llx phy 0x%x replace %016llx\n",
2012 SAS_ADDR(dev->sas_addr), phy_id,
2013 SAS_ADDR(phy->attached_sas_addr));
2014 sas_unregister_devs_sas_addr(dev, phy_id, last);
2015 }
2016
2017 return sas_discover_new(dev, phy_id);
1910} 2018}
1911 2019
1912/** 2020/**
diff --git a/drivers/scsi/libsas/sas_host_smp.c b/drivers/scsi/libsas/sas_host_smp.c
index 3814d3eed401..d24792575169 100644
--- a/drivers/scsi/libsas/sas_host_smp.c
+++ b/drivers/scsi/libsas/sas_host_smp.c
@@ -187,11 +187,14 @@ static void sas_phy_control(struct sas_ha_struct *sas_ha, u8 phy_id,
187 struct sas_internal *i = 187 struct sas_internal *i =
188 to_sas_internal(sas_ha->core.shost->transportt); 188 to_sas_internal(sas_ha->core.shost->transportt);
189 struct sas_phy_linkrates rates; 189 struct sas_phy_linkrates rates;
190 struct asd_sas_phy *asd_phy;
190 191
191 if (phy_id >= sas_ha->num_phys) { 192 if (phy_id >= sas_ha->num_phys) {
192 resp_data[2] = SMP_RESP_NO_PHY; 193 resp_data[2] = SMP_RESP_NO_PHY;
193 return; 194 return;
194 } 195 }
196
197 asd_phy = sas_ha->sas_phy[phy_id];
195 switch (phy_op) { 198 switch (phy_op) {
196 case PHY_FUNC_NOP: 199 case PHY_FUNC_NOP:
197 case PHY_FUNC_LINK_RESET: 200 case PHY_FUNC_LINK_RESET:
@@ -210,7 +213,13 @@ static void sas_phy_control(struct sas_ha_struct *sas_ha, u8 phy_id,
210 rates.minimum_linkrate = min; 213 rates.minimum_linkrate = min;
211 rates.maximum_linkrate = max; 214 rates.maximum_linkrate = max;
212 215
213 if (i->dft->lldd_control_phy(sas_ha->sas_phy[phy_id], phy_op, &rates)) 216 /* filter reset requests through libata eh */
217 if (phy_op == PHY_FUNC_LINK_RESET && sas_try_ata_reset(asd_phy) == 0) {
218 resp_data[2] = SMP_RESP_FUNC_ACC;
219 return;
220 }
221
222 if (i->dft->lldd_control_phy(asd_phy, phy_op, &rates))
214 resp_data[2] = SMP_RESP_FUNC_FAILED; 223 resp_data[2] = SMP_RESP_FUNC_FAILED;
215 else 224 else
216 resp_data[2] = SMP_RESP_FUNC_ACC; 225 resp_data[2] = SMP_RESP_FUNC_ACC;
diff --git a/drivers/scsi/libsas/sas_init.c b/drivers/scsi/libsas/sas_init.c
index d81c3b1989f7..120bff64be30 100644
--- a/drivers/scsi/libsas/sas_init.c
+++ b/drivers/scsi/libsas/sas_init.c
@@ -28,6 +28,7 @@
28#include <linux/init.h> 28#include <linux/init.h>
29#include <linux/device.h> 29#include <linux/device.h>
30#include <linux/spinlock.h> 30#include <linux/spinlock.h>
31#include <scsi/sas_ata.h>
31#include <scsi/scsi_host.h> 32#include <scsi/scsi_host.h>
32#include <scsi/scsi_device.h> 33#include <scsi/scsi_device.h>
33#include <scsi/scsi_transport.h> 34#include <scsi/scsi_transport.h>
@@ -97,14 +98,14 @@ void sas_hae_reset(struct work_struct *work)
97 container_of(work, struct sas_ha_event, work); 98 container_of(work, struct sas_ha_event, work);
98 struct sas_ha_struct *ha = ev->ha; 99 struct sas_ha_struct *ha = ev->ha;
99 100
100 sas_begin_event(HAE_RESET, &ha->event_lock, 101 clear_bit(HAE_RESET, &ha->pending);
101 &ha->pending);
102} 102}
103 103
104int sas_register_ha(struct sas_ha_struct *sas_ha) 104int sas_register_ha(struct sas_ha_struct *sas_ha)
105{ 105{
106 int error = 0; 106 int error = 0;
107 107
108 mutex_init(&sas_ha->disco_mutex);
108 spin_lock_init(&sas_ha->phy_port_lock); 109 spin_lock_init(&sas_ha->phy_port_lock);
109 sas_hash_addr(sas_ha->hashed_sas_addr, sas_ha->sas_addr); 110 sas_hash_addr(sas_ha->hashed_sas_addr, sas_ha->sas_addr);
110 111
@@ -113,8 +114,10 @@ int sas_register_ha(struct sas_ha_struct *sas_ha)
113 else if (sas_ha->lldd_queue_size == -1) 114 else if (sas_ha->lldd_queue_size == -1)
114 sas_ha->lldd_queue_size = 128; /* Sanity */ 115 sas_ha->lldd_queue_size = 128; /* Sanity */
115 116
116 sas_ha->state = SAS_HA_REGISTERED; 117 set_bit(SAS_HA_REGISTERED, &sas_ha->state);
117 spin_lock_init(&sas_ha->state_lock); 118 spin_lock_init(&sas_ha->state_lock);
119 mutex_init(&sas_ha->drain_mutex);
120 INIT_LIST_HEAD(&sas_ha->defer_q);
118 121
119 error = sas_register_phys(sas_ha); 122 error = sas_register_phys(sas_ha);
120 if (error) { 123 if (error) {
@@ -144,6 +147,7 @@ int sas_register_ha(struct sas_ha_struct *sas_ha)
144 } 147 }
145 148
146 INIT_LIST_HEAD(&sas_ha->eh_done_q); 149 INIT_LIST_HEAD(&sas_ha->eh_done_q);
150 INIT_LIST_HEAD(&sas_ha->eh_ata_q);
147 151
148 return 0; 152 return 0;
149 153
@@ -156,17 +160,23 @@ Undo_phys:
156 160
157int sas_unregister_ha(struct sas_ha_struct *sas_ha) 161int sas_unregister_ha(struct sas_ha_struct *sas_ha)
158{ 162{
159 unsigned long flags; 163 /* Set the state to unregistered to avoid further unchained
160 164 * events to be queued, and flush any in-progress drainers
161 /* Set the state to unregistered to avoid further 165 */
162 * events to be queued */ 166 mutex_lock(&sas_ha->drain_mutex);
163 spin_lock_irqsave(&sas_ha->state_lock, flags); 167 spin_lock_irq(&sas_ha->state_lock);
164 sas_ha->state = SAS_HA_UNREGISTERED; 168 clear_bit(SAS_HA_REGISTERED, &sas_ha->state);
165 spin_unlock_irqrestore(&sas_ha->state_lock, flags); 169 spin_unlock_irq(&sas_ha->state_lock);
166 scsi_flush_work(sas_ha->core.shost); 170 __sas_drain_work(sas_ha);
171 mutex_unlock(&sas_ha->drain_mutex);
167 172
168 sas_unregister_ports(sas_ha); 173 sas_unregister_ports(sas_ha);
169 174
175 /* flush unregistration work */
176 mutex_lock(&sas_ha->drain_mutex);
177 __sas_drain_work(sas_ha);
178 mutex_unlock(&sas_ha->drain_mutex);
179
170 if (sas_ha->lldd_max_execute_num > 1) { 180 if (sas_ha->lldd_max_execute_num > 1) {
171 sas_shutdown_queue(sas_ha); 181 sas_shutdown_queue(sas_ha);
172 sas_ha->lldd_max_execute_num = 1; 182 sas_ha->lldd_max_execute_num = 1;
@@ -190,15 +200,75 @@ static int sas_get_linkerrors(struct sas_phy *phy)
190 return sas_smp_get_phy_events(phy); 200 return sas_smp_get_phy_events(phy);
191} 201}
192 202
193int sas_phy_enable(struct sas_phy *phy, int enable) 203int sas_try_ata_reset(struct asd_sas_phy *asd_phy)
204{
205 struct domain_device *dev = NULL;
206
207 /* try to route user requested link resets through libata */
208 if (asd_phy->port)
209 dev = asd_phy->port->port_dev;
210
211 /* validate that dev has been probed */
212 if (dev)
213 dev = sas_find_dev_by_rphy(dev->rphy);
214
215 if (dev && dev_is_sata(dev)) {
216 sas_ata_schedule_reset(dev);
217 sas_ata_wait_eh(dev);
218 return 0;
219 }
220
221 return -ENODEV;
222}
223
224/**
225 * transport_sas_phy_reset - reset a phy and permit libata to manage the link
226 *
227 * phy reset request via sysfs in host workqueue context so we know we
228 * can block on eh and safely traverse the domain_device topology
229 */
230static int transport_sas_phy_reset(struct sas_phy *phy, int hard_reset)
231{
232 enum phy_func reset_type;
233
234 if (hard_reset)
235 reset_type = PHY_FUNC_HARD_RESET;
236 else
237 reset_type = PHY_FUNC_LINK_RESET;
238
239 if (scsi_is_sas_phy_local(phy)) {
240 struct Scsi_Host *shost = dev_to_shost(phy->dev.parent);
241 struct sas_ha_struct *sas_ha = SHOST_TO_SAS_HA(shost);
242 struct asd_sas_phy *asd_phy = sas_ha->sas_phy[phy->number];
243 struct sas_internal *i =
244 to_sas_internal(sas_ha->core.shost->transportt);
245
246 if (!hard_reset && sas_try_ata_reset(asd_phy) == 0)
247 return 0;
248 return i->dft->lldd_control_phy(asd_phy, reset_type, NULL);
249 } else {
250 struct sas_rphy *rphy = dev_to_rphy(phy->dev.parent);
251 struct domain_device *ddev = sas_find_dev_by_rphy(rphy);
252 struct domain_device *ata_dev = sas_ex_to_ata(ddev, phy->number);
253
254 if (ata_dev && !hard_reset) {
255 sas_ata_schedule_reset(ata_dev);
256 sas_ata_wait_eh(ata_dev);
257 return 0;
258 } else
259 return sas_smp_phy_control(ddev, phy->number, reset_type, NULL);
260 }
261}
262
263static int sas_phy_enable(struct sas_phy *phy, int enable)
194{ 264{
195 int ret; 265 int ret;
196 enum phy_func command; 266 enum phy_func cmd;
197 267
198 if (enable) 268 if (enable)
199 command = PHY_FUNC_LINK_RESET; 269 cmd = PHY_FUNC_LINK_RESET;
200 else 270 else
201 command = PHY_FUNC_DISABLE; 271 cmd = PHY_FUNC_DISABLE;
202 272
203 if (scsi_is_sas_phy_local(phy)) { 273 if (scsi_is_sas_phy_local(phy)) {
204 struct Scsi_Host *shost = dev_to_shost(phy->dev.parent); 274 struct Scsi_Host *shost = dev_to_shost(phy->dev.parent);
@@ -207,15 +277,18 @@ int sas_phy_enable(struct sas_phy *phy, int enable)
207 struct sas_internal *i = 277 struct sas_internal *i =
208 to_sas_internal(sas_ha->core.shost->transportt); 278 to_sas_internal(sas_ha->core.shost->transportt);
209 279
210 if (!enable) { 280 if (enable)
211 sas_phy_disconnected(asd_phy); 281 ret = transport_sas_phy_reset(phy, 0);
212 sas_ha->notify_phy_event(asd_phy, PHYE_LOSS_OF_SIGNAL); 282 else
213 } 283 ret = i->dft->lldd_control_phy(asd_phy, cmd, NULL);
214 ret = i->dft->lldd_control_phy(asd_phy, command, NULL);
215 } else { 284 } else {
216 struct sas_rphy *rphy = dev_to_rphy(phy->dev.parent); 285 struct sas_rphy *rphy = dev_to_rphy(phy->dev.parent);
217 struct domain_device *ddev = sas_find_dev_by_rphy(rphy); 286 struct domain_device *ddev = sas_find_dev_by_rphy(rphy);
218 ret = sas_smp_phy_control(ddev, phy->number, command, NULL); 287
288 if (enable)
289 ret = transport_sas_phy_reset(phy, 0);
290 else
291 ret = sas_smp_phy_control(ddev, phy->number, cmd, NULL);
219 } 292 }
220 return ret; 293 return ret;
221} 294}
@@ -225,6 +298,9 @@ int sas_phy_reset(struct sas_phy *phy, int hard_reset)
225 int ret; 298 int ret;
226 enum phy_func reset_type; 299 enum phy_func reset_type;
227 300
301 if (!phy->enabled)
302 return -ENODEV;
303
228 if (hard_reset) 304 if (hard_reset)
229 reset_type = PHY_FUNC_HARD_RESET; 305 reset_type = PHY_FUNC_HARD_RESET;
230 else 306 else
@@ -285,9 +361,101 @@ int sas_set_phy_speed(struct sas_phy *phy,
285 return ret; 361 return ret;
286} 362}
287 363
364static void sas_phy_release(struct sas_phy *phy)
365{
366 kfree(phy->hostdata);
367 phy->hostdata = NULL;
368}
369
370static void phy_reset_work(struct work_struct *work)
371{
372 struct sas_phy_data *d = container_of(work, typeof(*d), reset_work);
373
374 d->reset_result = transport_sas_phy_reset(d->phy, d->hard_reset);
375}
376
377static void phy_enable_work(struct work_struct *work)
378{
379 struct sas_phy_data *d = container_of(work, typeof(*d), enable_work);
380
381 d->enable_result = sas_phy_enable(d->phy, d->enable);
382}
383
384static int sas_phy_setup(struct sas_phy *phy)
385{
386 struct sas_phy_data *d = kzalloc(sizeof(*d), GFP_KERNEL);
387
388 if (!d)
389 return -ENOMEM;
390
391 mutex_init(&d->event_lock);
392 INIT_WORK(&d->reset_work, phy_reset_work);
393 INIT_WORK(&d->enable_work, phy_enable_work);
394 d->phy = phy;
395 phy->hostdata = d;
396
397 return 0;
398}
399
400static int queue_phy_reset(struct sas_phy *phy, int hard_reset)
401{
402 struct Scsi_Host *shost = dev_to_shost(phy->dev.parent);
403 struct sas_ha_struct *ha = SHOST_TO_SAS_HA(shost);
404 struct sas_phy_data *d = phy->hostdata;
405 int rc;
406
407 if (!d)
408 return -ENOMEM;
409
410 /* libsas workqueue coordinates ata-eh reset with discovery */
411 mutex_lock(&d->event_lock);
412 d->reset_result = 0;
413 d->hard_reset = hard_reset;
414
415 spin_lock_irq(&ha->state_lock);
416 sas_queue_work(ha, &d->reset_work);
417 spin_unlock_irq(&ha->state_lock);
418
419 rc = sas_drain_work(ha);
420 if (rc == 0)
421 rc = d->reset_result;
422 mutex_unlock(&d->event_lock);
423
424 return rc;
425}
426
427static int queue_phy_enable(struct sas_phy *phy, int enable)
428{
429 struct Scsi_Host *shost = dev_to_shost(phy->dev.parent);
430 struct sas_ha_struct *ha = SHOST_TO_SAS_HA(shost);
431 struct sas_phy_data *d = phy->hostdata;
432 int rc;
433
434 if (!d)
435 return -ENOMEM;
436
437 /* libsas workqueue coordinates ata-eh reset with discovery */
438 mutex_lock(&d->event_lock);
439 d->enable_result = 0;
440 d->enable = enable;
441
442 spin_lock_irq(&ha->state_lock);
443 sas_queue_work(ha, &d->enable_work);
444 spin_unlock_irq(&ha->state_lock);
445
446 rc = sas_drain_work(ha);
447 if (rc == 0)
448 rc = d->enable_result;
449 mutex_unlock(&d->event_lock);
450
451 return rc;
452}
453
288static struct sas_function_template sft = { 454static struct sas_function_template sft = {
289 .phy_enable = sas_phy_enable, 455 .phy_enable = queue_phy_enable,
290 .phy_reset = sas_phy_reset, 456 .phy_reset = queue_phy_reset,
457 .phy_setup = sas_phy_setup,
458 .phy_release = sas_phy_release,
291 .set_phy_speed = sas_set_phy_speed, 459 .set_phy_speed = sas_set_phy_speed,
292 .get_linkerrors = sas_get_linkerrors, 460 .get_linkerrors = sas_get_linkerrors,
293 .smp_handler = sas_smp_handler, 461 .smp_handler = sas_smp_handler,
diff --git a/drivers/scsi/libsas/sas_internal.h b/drivers/scsi/libsas/sas_internal.h
index 14e21b5fb8ba..f05c63879949 100644
--- a/drivers/scsi/libsas/sas_internal.h
+++ b/drivers/scsi/libsas/sas_internal.h
@@ -30,6 +30,7 @@
30#include <scsi/scsi_host.h> 30#include <scsi/scsi_host.h>
31#include <scsi/scsi_transport_sas.h> 31#include <scsi/scsi_transport_sas.h>
32#include <scsi/libsas.h> 32#include <scsi/libsas.h>
33#include <scsi/sas_ata.h>
33 34
34#define sas_printk(fmt, ...) printk(KERN_NOTICE "sas: " fmt, ## __VA_ARGS__) 35#define sas_printk(fmt, ...) printk(KERN_NOTICE "sas: " fmt, ## __VA_ARGS__)
35 36
@@ -38,6 +39,18 @@
38#define TO_SAS_TASK(_scsi_cmd) ((void *)(_scsi_cmd)->host_scribble) 39#define TO_SAS_TASK(_scsi_cmd) ((void *)(_scsi_cmd)->host_scribble)
39#define ASSIGN_SAS_TASK(_sc, _t) do { (_sc)->host_scribble = (void *) _t; } while (0) 40#define ASSIGN_SAS_TASK(_sc, _t) do { (_sc)->host_scribble = (void *) _t; } while (0)
40 41
42struct sas_phy_data {
43 /* let reset be performed in sas_queue_work() context */
44 struct sas_phy *phy;
45 struct mutex event_lock;
46 int hard_reset;
47 int reset_result;
48 struct work_struct reset_work;
49 int enable;
50 int enable_result;
51 struct work_struct enable_work;
52};
53
41void sas_scsi_recover_host(struct Scsi_Host *shost); 54void sas_scsi_recover_host(struct Scsi_Host *shost);
42 55
43int sas_show_class(enum sas_class class, char *buf); 56int sas_show_class(enum sas_class class, char *buf);
@@ -56,6 +69,9 @@ enum blk_eh_timer_return sas_scsi_timed_out(struct scsi_cmnd *);
56int sas_init_queue(struct sas_ha_struct *sas_ha); 69int sas_init_queue(struct sas_ha_struct *sas_ha);
57int sas_init_events(struct sas_ha_struct *sas_ha); 70int sas_init_events(struct sas_ha_struct *sas_ha);
58void sas_shutdown_queue(struct sas_ha_struct *sas_ha); 71void sas_shutdown_queue(struct sas_ha_struct *sas_ha);
72void sas_disable_revalidation(struct sas_ha_struct *ha);
73void sas_enable_revalidation(struct sas_ha_struct *ha);
74void __sas_drain_work(struct sas_ha_struct *ha);
59 75
60void sas_deform_port(struct asd_sas_phy *phy, int gone); 76void sas_deform_port(struct asd_sas_phy *phy, int gone);
61 77
@@ -64,6 +80,7 @@ void sas_porte_broadcast_rcvd(struct work_struct *work);
64void sas_porte_link_reset_err(struct work_struct *work); 80void sas_porte_link_reset_err(struct work_struct *work);
65void sas_porte_timer_event(struct work_struct *work); 81void sas_porte_timer_event(struct work_struct *work);
66void sas_porte_hard_reset(struct work_struct *work); 82void sas_porte_hard_reset(struct work_struct *work);
83void sas_queue_work(struct sas_ha_struct *ha, struct work_struct *work);
67 84
68int sas_notify_lldd_dev_found(struct domain_device *); 85int sas_notify_lldd_dev_found(struct domain_device *);
69void sas_notify_lldd_dev_gone(struct domain_device *); 86void sas_notify_lldd_dev_gone(struct domain_device *);
@@ -72,10 +89,17 @@ int sas_smp_phy_control(struct domain_device *dev, int phy_id,
72 enum phy_func phy_func, struct sas_phy_linkrates *); 89 enum phy_func phy_func, struct sas_phy_linkrates *);
73int sas_smp_get_phy_events(struct sas_phy *phy); 90int sas_smp_get_phy_events(struct sas_phy *phy);
74 91
92void sas_device_set_phy(struct domain_device *dev, struct sas_port *port);
75struct domain_device *sas_find_dev_by_rphy(struct sas_rphy *rphy); 93struct domain_device *sas_find_dev_by_rphy(struct sas_rphy *rphy);
76 94struct domain_device *sas_ex_to_ata(struct domain_device *ex_dev, int phy_id);
95int sas_ex_phy_discover(struct domain_device *dev, int single);
96int sas_get_report_phy_sata(struct domain_device *dev, int phy_id,
97 struct smp_resp *rps_resp);
98int sas_try_ata_reset(struct asd_sas_phy *phy);
77void sas_hae_reset(struct work_struct *work); 99void sas_hae_reset(struct work_struct *work);
78 100
101void sas_free_device(struct kref *kref);
102
79#ifdef CONFIG_SCSI_SAS_HOST_SMP 103#ifdef CONFIG_SCSI_SAS_HOST_SMP
80extern int sas_smp_host_handler(struct Scsi_Host *shost, struct request *req, 104extern int sas_smp_host_handler(struct Scsi_Host *shost, struct request *req,
81 struct request *rsp); 105 struct request *rsp);
@@ -90,36 +114,13 @@ static inline int sas_smp_host_handler(struct Scsi_Host *shost,
90} 114}
91#endif 115#endif
92 116
93static inline void sas_queue_event(int event, spinlock_t *lock, 117static inline void sas_fail_probe(struct domain_device *dev, const char *func, int err)
94 unsigned long *pending,
95 struct work_struct *work,
96 struct sas_ha_struct *sas_ha)
97{ 118{
98 unsigned long flags; 119 SAS_DPRINTK("%s: for %s device %16llx returned %d\n",
99 120 func, dev->parent ? "exp-attached" :
100 spin_lock_irqsave(lock, flags); 121 "direct-attached",
101 if (test_bit(event, pending)) { 122 SAS_ADDR(dev->sas_addr), err);
102 spin_unlock_irqrestore(lock, flags); 123 sas_unregister_dev(dev->port, dev);
103 return;
104 }
105 __set_bit(event, pending);
106 spin_unlock_irqrestore(lock, flags);
107
108 spin_lock_irqsave(&sas_ha->state_lock, flags);
109 if (sas_ha->state != SAS_HA_UNREGISTERED) {
110 scsi_queue_work(sas_ha->core.shost, work);
111 }
112 spin_unlock_irqrestore(&sas_ha->state_lock, flags);
113}
114
115static inline void sas_begin_event(int event, spinlock_t *lock,
116 unsigned long *pending)
117{
118 unsigned long flags;
119
120 spin_lock_irqsave(lock, flags);
121 __clear_bit(event, pending);
122 spin_unlock_irqrestore(lock, flags);
123} 124}
124 125
125static inline void sas_fill_in_rphy(struct domain_device *dev, 126static inline void sas_fill_in_rphy(struct domain_device *dev,
@@ -132,6 +133,7 @@ static inline void sas_fill_in_rphy(struct domain_device *dev,
132 case SATA_DEV: 133 case SATA_DEV:
133 /* FIXME: need sata device type */ 134 /* FIXME: need sata device type */
134 case SAS_END_DEV: 135 case SAS_END_DEV:
136 case SATA_PENDING:
135 rphy->identify.device_type = SAS_END_DEVICE; 137 rphy->identify.device_type = SAS_END_DEVICE;
136 break; 138 break;
137 case EDGE_DEV: 139 case EDGE_DEV:
@@ -146,6 +148,22 @@ static inline void sas_fill_in_rphy(struct domain_device *dev,
146 } 148 }
147} 149}
148 150
151static inline void sas_phy_set_target(struct asd_sas_phy *p, struct domain_device *dev)
152{
153 struct sas_phy *phy = p->phy;
154
155 if (dev) {
156 if (dev_is_sata(dev))
157 phy->identify.device_type = SAS_END_DEVICE;
158 else
159 phy->identify.device_type = dev->dev_type;
160 phy->identify.target_port_protocols = dev->tproto;
161 } else {
162 phy->identify.device_type = SAS_PHY_UNUSED;
163 phy->identify.target_port_protocols = 0;
164 }
165}
166
149static inline void sas_add_parent_port(struct domain_device *dev, int phy_id) 167static inline void sas_add_parent_port(struct domain_device *dev, int phy_id)
150{ 168{
151 struct expander_device *ex = &dev->ex_dev; 169 struct expander_device *ex = &dev->ex_dev;
@@ -161,4 +179,23 @@ static inline void sas_add_parent_port(struct domain_device *dev, int phy_id)
161 sas_port_add_phy(ex->parent_port, ex_phy->phy); 179 sas_port_add_phy(ex->parent_port, ex_phy->phy);
162} 180}
163 181
182static inline struct domain_device *sas_alloc_device(void)
183{
184 struct domain_device *dev = kzalloc(sizeof(*dev), GFP_KERNEL);
185
186 if (dev) {
187 INIT_LIST_HEAD(&dev->siblings);
188 INIT_LIST_HEAD(&dev->dev_list_node);
189 INIT_LIST_HEAD(&dev->disco_list_node);
190 kref_init(&dev->kref);
191 spin_lock_init(&dev->done_lock);
192 }
193 return dev;
194}
195
196static inline void sas_put_device(struct domain_device *dev)
197{
198 kref_put(&dev->kref, sas_free_device);
199}
200
164#endif /* _SAS_INTERNAL_H_ */ 201#endif /* _SAS_INTERNAL_H_ */
diff --git a/drivers/scsi/libsas/sas_phy.c b/drivers/scsi/libsas/sas_phy.c
index e0f5018e9071..dcfd4a9105c5 100644
--- a/drivers/scsi/libsas/sas_phy.c
+++ b/drivers/scsi/libsas/sas_phy.c
@@ -36,8 +36,7 @@ static void sas_phye_loss_of_signal(struct work_struct *work)
36 container_of(work, struct asd_sas_event, work); 36 container_of(work, struct asd_sas_event, work);
37 struct asd_sas_phy *phy = ev->phy; 37 struct asd_sas_phy *phy = ev->phy;
38 38
39 sas_begin_event(PHYE_LOSS_OF_SIGNAL, &phy->ha->event_lock, 39 clear_bit(PHYE_LOSS_OF_SIGNAL, &phy->phy_events_pending);
40 &phy->phy_events_pending);
41 phy->error = 0; 40 phy->error = 0;
42 sas_deform_port(phy, 1); 41 sas_deform_port(phy, 1);
43} 42}
@@ -48,8 +47,7 @@ static void sas_phye_oob_done(struct work_struct *work)
48 container_of(work, struct asd_sas_event, work); 47 container_of(work, struct asd_sas_event, work);
49 struct asd_sas_phy *phy = ev->phy; 48 struct asd_sas_phy *phy = ev->phy;
50 49
51 sas_begin_event(PHYE_OOB_DONE, &phy->ha->event_lock, 50 clear_bit(PHYE_OOB_DONE, &phy->phy_events_pending);
52 &phy->phy_events_pending);
53 phy->error = 0; 51 phy->error = 0;
54} 52}
55 53
@@ -63,8 +61,7 @@ static void sas_phye_oob_error(struct work_struct *work)
63 struct sas_internal *i = 61 struct sas_internal *i =
64 to_sas_internal(sas_ha->core.shost->transportt); 62 to_sas_internal(sas_ha->core.shost->transportt);
65 63
66 sas_begin_event(PHYE_OOB_ERROR, &phy->ha->event_lock, 64 clear_bit(PHYE_OOB_ERROR, &phy->phy_events_pending);
67 &phy->phy_events_pending);
68 65
69 sas_deform_port(phy, 1); 66 sas_deform_port(phy, 1);
70 67
@@ -95,8 +92,7 @@ static void sas_phye_spinup_hold(struct work_struct *work)
95 struct sas_internal *i = 92 struct sas_internal *i =
96 to_sas_internal(sas_ha->core.shost->transportt); 93 to_sas_internal(sas_ha->core.shost->transportt);
97 94
98 sas_begin_event(PHYE_SPINUP_HOLD, &phy->ha->event_lock, 95 clear_bit(PHYE_SPINUP_HOLD, &phy->phy_events_pending);
99 &phy->phy_events_pending);
100 96
101 phy->error = 0; 97 phy->error = 0;
102 i->dft->lldd_control_phy(phy, PHY_FUNC_RELEASE_SPINUP_HOLD, NULL); 98 i->dft->lldd_control_phy(phy, PHY_FUNC_RELEASE_SPINUP_HOLD, NULL);
diff --git a/drivers/scsi/libsas/sas_port.c b/drivers/scsi/libsas/sas_port.c
index 42fd1f25b664..eb19c016d500 100644
--- a/drivers/scsi/libsas/sas_port.c
+++ b/drivers/scsi/libsas/sas_port.c
@@ -104,13 +104,11 @@ static void sas_form_port(struct asd_sas_phy *phy)
104 104
105 /* add the phy to the port */ 105 /* add the phy to the port */
106 list_add_tail(&phy->port_phy_el, &port->phy_list); 106 list_add_tail(&phy->port_phy_el, &port->phy_list);
107 sas_phy_set_target(phy, port->port_dev);
107 phy->port = port; 108 phy->port = port;
108 port->num_phys++; 109 port->num_phys++;
109 port->phy_mask |= (1U << phy->id); 110 port->phy_mask |= (1U << phy->id);
110 111
111 if (!port->phy)
112 port->phy = phy->phy;
113
114 if (*(u64 *)port->attached_sas_addr == 0) { 112 if (*(u64 *)port->attached_sas_addr == 0) {
115 port->class = phy->class; 113 port->class = phy->class;
116 memcpy(port->attached_sas_addr, phy->attached_sas_addr, 114 memcpy(port->attached_sas_addr, phy->attached_sas_addr,
@@ -125,7 +123,7 @@ static void sas_form_port(struct asd_sas_phy *phy)
125 spin_unlock_irqrestore(&sas_ha->phy_port_lock, flags); 123 spin_unlock_irqrestore(&sas_ha->phy_port_lock, flags);
126 124
127 if (!port->port) { 125 if (!port->port) {
128 port->port = sas_port_alloc(phy->phy->dev.parent, port->id); 126 port->port = sas_port_alloc(phy->phy->dev.parent, phy->id);
129 BUG_ON(!port->port); 127 BUG_ON(!port->port);
130 sas_port_add(port->port); 128 sas_port_add(port->port);
131 } 129 }
@@ -170,13 +168,13 @@ void sas_deform_port(struct asd_sas_phy *phy, int gone)
170 dev->pathways--; 168 dev->pathways--;
171 169
172 if (port->num_phys == 1) { 170 if (port->num_phys == 1) {
173 if (dev && gone) 171 sas_unregister_domain_devices(port, gone);
174 dev->gone = 1;
175 sas_unregister_domain_devices(port);
176 sas_port_delete(port->port); 172 sas_port_delete(port->port);
177 port->port = NULL; 173 port->port = NULL;
178 } else 174 } else {
179 sas_port_delete_phy(port->port, phy->phy); 175 sas_port_delete_phy(port->port, phy->phy);
176 sas_device_set_phy(dev, port->port);
177 }
180 178
181 if (si->dft->lldd_port_deformed) 179 if (si->dft->lldd_port_deformed)
182 si->dft->lldd_port_deformed(phy); 180 si->dft->lldd_port_deformed(phy);
@@ -185,6 +183,7 @@ void sas_deform_port(struct asd_sas_phy *phy, int gone)
185 spin_lock(&port->phy_list_lock); 183 spin_lock(&port->phy_list_lock);
186 184
187 list_del_init(&phy->port_phy_el); 185 list_del_init(&phy->port_phy_el);
186 sas_phy_set_target(phy, NULL);
188 phy->port = NULL; 187 phy->port = NULL;
189 port->num_phys--; 188 port->num_phys--;
190 port->phy_mask &= ~(1U << phy->id); 189 port->phy_mask &= ~(1U << phy->id);
@@ -213,8 +212,7 @@ void sas_porte_bytes_dmaed(struct work_struct *work)
213 container_of(work, struct asd_sas_event, work); 212 container_of(work, struct asd_sas_event, work);
214 struct asd_sas_phy *phy = ev->phy; 213 struct asd_sas_phy *phy = ev->phy;
215 214
216 sas_begin_event(PORTE_BYTES_DMAED, &phy->ha->event_lock, 215 clear_bit(PORTE_BYTES_DMAED, &phy->port_events_pending);
217 &phy->port_events_pending);
218 216
219 sas_form_port(phy); 217 sas_form_port(phy);
220} 218}
@@ -227,8 +225,7 @@ void sas_porte_broadcast_rcvd(struct work_struct *work)
227 unsigned long flags; 225 unsigned long flags;
228 u32 prim; 226 u32 prim;
229 227
230 sas_begin_event(PORTE_BROADCAST_RCVD, &phy->ha->event_lock, 228 clear_bit(PORTE_BROADCAST_RCVD, &phy->port_events_pending);
231 &phy->port_events_pending);
232 229
233 spin_lock_irqsave(&phy->sas_prim_lock, flags); 230 spin_lock_irqsave(&phy->sas_prim_lock, flags);
234 prim = phy->sas_prim; 231 prim = phy->sas_prim;
@@ -244,8 +241,7 @@ void sas_porte_link_reset_err(struct work_struct *work)
244 container_of(work, struct asd_sas_event, work); 241 container_of(work, struct asd_sas_event, work);
245 struct asd_sas_phy *phy = ev->phy; 242 struct asd_sas_phy *phy = ev->phy;
246 243
247 sas_begin_event(PORTE_LINK_RESET_ERR, &phy->ha->event_lock, 244 clear_bit(PORTE_LINK_RESET_ERR, &phy->port_events_pending);
248 &phy->port_events_pending);
249 245
250 sas_deform_port(phy, 1); 246 sas_deform_port(phy, 1);
251} 247}
@@ -256,8 +252,7 @@ void sas_porte_timer_event(struct work_struct *work)
256 container_of(work, struct asd_sas_event, work); 252 container_of(work, struct asd_sas_event, work);
257 struct asd_sas_phy *phy = ev->phy; 253 struct asd_sas_phy *phy = ev->phy;
258 254
259 sas_begin_event(PORTE_TIMER_EVENT, &phy->ha->event_lock, 255 clear_bit(PORTE_TIMER_EVENT, &phy->port_events_pending);
260 &phy->port_events_pending);
261 256
262 sas_deform_port(phy, 1); 257 sas_deform_port(phy, 1);
263} 258}
@@ -268,8 +263,7 @@ void sas_porte_hard_reset(struct work_struct *work)
268 container_of(work, struct asd_sas_event, work); 263 container_of(work, struct asd_sas_event, work);
269 struct asd_sas_phy *phy = ev->phy; 264 struct asd_sas_phy *phy = ev->phy;
270 265
271 sas_begin_event(PORTE_HARD_RESET, &phy->ha->event_lock, 266 clear_bit(PORTE_HARD_RESET, &phy->port_events_pending);
272 &phy->port_events_pending);
273 267
274 sas_deform_port(phy, 1); 268 sas_deform_port(phy, 1);
275} 269}
@@ -282,6 +276,8 @@ static void sas_init_port(struct asd_sas_port *port,
282 memset(port, 0, sizeof(*port)); 276 memset(port, 0, sizeof(*port));
283 port->id = i; 277 port->id = i;
284 INIT_LIST_HEAD(&port->dev_list); 278 INIT_LIST_HEAD(&port->dev_list);
279 INIT_LIST_HEAD(&port->disco_list);
280 INIT_LIST_HEAD(&port->destroy_list);
285 spin_lock_init(&port->phy_list_lock); 281 spin_lock_init(&port->phy_list_lock);
286 INIT_LIST_HEAD(&port->phy_list); 282 INIT_LIST_HEAD(&port->phy_list);
287 port->ha = sas_ha; 283 port->ha = sas_ha;
diff --git a/drivers/scsi/libsas/sas_scsi_host.c b/drivers/scsi/libsas/sas_scsi_host.c
index b6e233d9a0a1..f0b9b7bf1882 100644
--- a/drivers/scsi/libsas/sas_scsi_host.c
+++ b/drivers/scsi/libsas/sas_scsi_host.c
@@ -49,27 +49,12 @@
49#include <linux/scatterlist.h> 49#include <linux/scatterlist.h>
50#include <linux/libata.h> 50#include <linux/libata.h>
51 51
52/* ---------- SCSI Host glue ---------- */ 52/* record final status and free the task */
53 53static void sas_end_task(struct scsi_cmnd *sc, struct sas_task *task)
54static void sas_scsi_task_done(struct sas_task *task)
55{ 54{
56 struct task_status_struct *ts = &task->task_status; 55 struct task_status_struct *ts = &task->task_status;
57 struct scsi_cmnd *sc = task->uldd_task;
58 int hs = 0, stat = 0; 56 int hs = 0, stat = 0;
59 57
60 if (unlikely(task->task_state_flags & SAS_TASK_STATE_ABORTED)) {
61 /* Aborted tasks will be completed by the error handler */
62 SAS_DPRINTK("task done but aborted\n");
63 return;
64 }
65
66 if (unlikely(!sc)) {
67 SAS_DPRINTK("task_done called with non existing SCSI cmnd!\n");
68 list_del_init(&task->list);
69 sas_free_task(task);
70 return;
71 }
72
73 if (ts->resp == SAS_TASK_UNDELIVERED) { 58 if (ts->resp == SAS_TASK_UNDELIVERED) {
74 /* transport error */ 59 /* transport error */
75 hs = DID_NO_CONNECT; 60 hs = DID_NO_CONNECT;
@@ -124,10 +109,41 @@ static void sas_scsi_task_done(struct sas_task *task)
124 break; 109 break;
125 } 110 }
126 } 111 }
127 ASSIGN_SAS_TASK(sc, NULL); 112
128 sc->result = (hs << 16) | stat; 113 sc->result = (hs << 16) | stat;
114 ASSIGN_SAS_TASK(sc, NULL);
129 list_del_init(&task->list); 115 list_del_init(&task->list);
130 sas_free_task(task); 116 sas_free_task(task);
117}
118
119static void sas_scsi_task_done(struct sas_task *task)
120{
121 struct scsi_cmnd *sc = task->uldd_task;
122 struct domain_device *dev = task->dev;
123 struct sas_ha_struct *ha = dev->port->ha;
124 unsigned long flags;
125
126 spin_lock_irqsave(&dev->done_lock, flags);
127 if (test_bit(SAS_HA_FROZEN, &ha->state))
128 task = NULL;
129 else
130 ASSIGN_SAS_TASK(sc, NULL);
131 spin_unlock_irqrestore(&dev->done_lock, flags);
132
133 if (unlikely(!task)) {
134 /* task will be completed by the error handler */
135 SAS_DPRINTK("task done but aborted\n");
136 return;
137 }
138
139 if (unlikely(!sc)) {
140 SAS_DPRINTK("task_done called with non existing SCSI cmnd!\n");
141 list_del_init(&task->list);
142 sas_free_task(task);
143 return;
144 }
145
146 sas_end_task(sc, task);
131 sc->scsi_done(sc); 147 sc->scsi_done(sc);
132} 148}
133 149
@@ -192,17 +208,15 @@ int sas_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd)
192 int res = 0; 208 int res = 0;
193 209
194 /* If the device fell off, no sense in issuing commands */ 210 /* If the device fell off, no sense in issuing commands */
195 if (dev->gone) { 211 if (test_bit(SAS_DEV_GONE, &dev->state)) {
196 cmd->result = DID_BAD_TARGET << 16; 212 cmd->result = DID_BAD_TARGET << 16;
197 goto out_done; 213 goto out_done;
198 } 214 }
199 215
200 if (dev_is_sata(dev)) { 216 if (dev_is_sata(dev)) {
201 unsigned long flags; 217 spin_lock_irq(dev->sata_dev.ap->lock);
202
203 spin_lock_irqsave(dev->sata_dev.ap->lock, flags);
204 res = ata_sas_queuecmd(cmd, dev->sata_dev.ap); 218 res = ata_sas_queuecmd(cmd, dev->sata_dev.ap);
205 spin_unlock_irqrestore(dev->sata_dev.ap->lock, flags); 219 spin_unlock_irq(dev->sata_dev.ap->lock);
206 return res; 220 return res;
207 } 221 }
208 222
@@ -235,24 +249,38 @@ out_done:
235 249
236static void sas_eh_finish_cmd(struct scsi_cmnd *cmd) 250static void sas_eh_finish_cmd(struct scsi_cmnd *cmd)
237{ 251{
238 struct sas_task *task = TO_SAS_TASK(cmd);
239 struct sas_ha_struct *sas_ha = SHOST_TO_SAS_HA(cmd->device->host); 252 struct sas_ha_struct *sas_ha = SHOST_TO_SAS_HA(cmd->device->host);
253 struct sas_task *task = TO_SAS_TASK(cmd);
254
255 /* At this point, we only get called following an actual abort
256 * of the task, so we should be guaranteed not to be racing with
257 * any completions from the LLD. Task is freed after this.
258 */
259 sas_end_task(cmd, task);
240 260
241 /* remove the aborted task flag to allow the task to be
242 * completed now. At this point, we only get called following
243 * an actual abort of the task, so we should be guaranteed not
244 * to be racing with any completions from the LLD (hence we
245 * don't need the task state lock to clear the flag) */
246 task->task_state_flags &= ~SAS_TASK_STATE_ABORTED;
247 /* Now call task_done. However, task will be free'd after
248 * this */
249 task->task_done(task);
250 /* now finish the command and move it on to the error 261 /* now finish the command and move it on to the error
251 * handler done list, this also takes it off the 262 * handler done list, this also takes it off the
252 * error handler pending list */ 263 * error handler pending list.
264 */
253 scsi_eh_finish_cmd(cmd, &sas_ha->eh_done_q); 265 scsi_eh_finish_cmd(cmd, &sas_ha->eh_done_q);
254} 266}
255 267
268static void sas_eh_defer_cmd(struct scsi_cmnd *cmd)
269{
270 struct domain_device *dev = cmd_to_domain_dev(cmd);
271 struct sas_ha_struct *ha = dev->port->ha;
272 struct sas_task *task = TO_SAS_TASK(cmd);
273
274 if (!dev_is_sata(dev)) {
275 sas_eh_finish_cmd(cmd);
276 return;
277 }
278
279 /* report the timeout to libata */
280 sas_end_task(cmd, task);
281 list_move_tail(&cmd->eh_entry, &ha->eh_ata_q);
282}
283
256static void sas_scsi_clear_queue_lu(struct list_head *error_q, struct scsi_cmnd *my_cmd) 284static void sas_scsi_clear_queue_lu(struct list_head *error_q, struct scsi_cmnd *my_cmd)
257{ 285{
258 struct scsi_cmnd *cmd, *n; 286 struct scsi_cmnd *cmd, *n;
@@ -260,7 +288,7 @@ static void sas_scsi_clear_queue_lu(struct list_head *error_q, struct scsi_cmnd
260 list_for_each_entry_safe(cmd, n, error_q, eh_entry) { 288 list_for_each_entry_safe(cmd, n, error_q, eh_entry) {
261 if (cmd->device->sdev_target == my_cmd->device->sdev_target && 289 if (cmd->device->sdev_target == my_cmd->device->sdev_target &&
262 cmd->device->lun == my_cmd->device->lun) 290 cmd->device->lun == my_cmd->device->lun)
263 sas_eh_finish_cmd(cmd); 291 sas_eh_defer_cmd(cmd);
264 } 292 }
265} 293}
266 294
@@ -295,6 +323,7 @@ enum task_disposition {
295 TASK_IS_DONE, 323 TASK_IS_DONE,
296 TASK_IS_ABORTED, 324 TASK_IS_ABORTED,
297 TASK_IS_AT_LU, 325 TASK_IS_AT_LU,
326 TASK_IS_NOT_AT_HA,
298 TASK_IS_NOT_AT_LU, 327 TASK_IS_NOT_AT_LU,
299 TASK_ABORT_FAILED, 328 TASK_ABORT_FAILED,
300}; 329};
@@ -311,19 +340,18 @@ static enum task_disposition sas_scsi_find_task(struct sas_task *task)
311 struct scsi_core *core = &ha->core; 340 struct scsi_core *core = &ha->core;
312 struct sas_task *t, *n; 341 struct sas_task *t, *n;
313 342
343 mutex_lock(&core->task_queue_flush);
314 spin_lock_irqsave(&core->task_queue_lock, flags); 344 spin_lock_irqsave(&core->task_queue_lock, flags);
315 list_for_each_entry_safe(t, n, &core->task_queue, list) { 345 list_for_each_entry_safe(t, n, &core->task_queue, list)
316 if (task == t) { 346 if (task == t) {
317 list_del_init(&t->list); 347 list_del_init(&t->list);
318 spin_unlock_irqrestore(&core->task_queue_lock, 348 break;
319 flags);
320 SAS_DPRINTK("%s: task 0x%p aborted from "
321 "task_queue\n",
322 __func__, task);
323 return TASK_IS_ABORTED;
324 } 349 }
325 }
326 spin_unlock_irqrestore(&core->task_queue_lock, flags); 350 spin_unlock_irqrestore(&core->task_queue_lock, flags);
351 mutex_unlock(&core->task_queue_flush);
352
353 if (task == t)
354 return TASK_IS_NOT_AT_HA;
327 } 355 }
328 356
329 for (i = 0; i < 5; i++) { 357 for (i = 0; i < 5; i++) {
@@ -411,30 +439,26 @@ static int sas_recover_I_T(struct domain_device *dev)
411 return res; 439 return res;
412} 440}
413 441
414/* Find the sas_phy that's attached to this device */ 442/* take a reference on the last known good phy for this device */
415struct sas_phy *sas_find_local_phy(struct domain_device *dev) 443struct sas_phy *sas_get_local_phy(struct domain_device *dev)
416{ 444{
417 struct domain_device *pdev = dev->parent; 445 struct sas_ha_struct *ha = dev->port->ha;
418 struct ex_phy *exphy = NULL; 446 struct sas_phy *phy;
419 int i; 447 unsigned long flags;
420 448
421 /* Directly attached device */ 449 /* a published domain device always has a valid phy, it may be
422 if (!pdev) 450 * stale, but it is never NULL
423 return dev->port->phy; 451 */
452 BUG_ON(!dev->phy);
424 453
425 /* Otherwise look in the expander */ 454 spin_lock_irqsave(&ha->phy_port_lock, flags);
426 for (i = 0; i < pdev->ex_dev.num_phys; i++) 455 phy = dev->phy;
427 if (!memcmp(dev->sas_addr, 456 get_device(&phy->dev);
428 pdev->ex_dev.ex_phy[i].attached_sas_addr, 457 spin_unlock_irqrestore(&ha->phy_port_lock, flags);
429 SAS_ADDR_SIZE)) {
430 exphy = &pdev->ex_dev.ex_phy[i];
431 break;
432 }
433 458
434 BUG_ON(!exphy); 459 return phy;
435 return exphy->phy;
436} 460}
437EXPORT_SYMBOL_GPL(sas_find_local_phy); 461EXPORT_SYMBOL_GPL(sas_get_local_phy);
438 462
439/* Attempt to send a LUN reset message to a device */ 463/* Attempt to send a LUN reset message to a device */
440int sas_eh_device_reset_handler(struct scsi_cmnd *cmd) 464int sas_eh_device_reset_handler(struct scsi_cmnd *cmd)
@@ -461,7 +485,7 @@ int sas_eh_device_reset_handler(struct scsi_cmnd *cmd)
461int sas_eh_bus_reset_handler(struct scsi_cmnd *cmd) 485int sas_eh_bus_reset_handler(struct scsi_cmnd *cmd)
462{ 486{
463 struct domain_device *dev = cmd_to_domain_dev(cmd); 487 struct domain_device *dev = cmd_to_domain_dev(cmd);
464 struct sas_phy *phy = sas_find_local_phy(dev); 488 struct sas_phy *phy = sas_get_local_phy(dev);
465 int res; 489 int res;
466 490
467 res = sas_phy_reset(phy, 1); 491 res = sas_phy_reset(phy, 1);
@@ -469,6 +493,8 @@ int sas_eh_bus_reset_handler(struct scsi_cmnd *cmd)
469 SAS_DPRINTK("Bus reset of %s failed 0x%x\n", 493 SAS_DPRINTK("Bus reset of %s failed 0x%x\n",
470 kobject_name(&phy->dev.kobj), 494 kobject_name(&phy->dev.kobj),
471 res); 495 res);
496 sas_put_local_phy(phy);
497
472 if (res == TMF_RESP_FUNC_SUCC || res == TMF_RESP_FUNC_COMPLETE) 498 if (res == TMF_RESP_FUNC_SUCC || res == TMF_RESP_FUNC_COMPLETE)
473 return SUCCESS; 499 return SUCCESS;
474 500
@@ -495,9 +521,7 @@ try_bus_reset:
495 return FAILED; 521 return FAILED;
496} 522}
497 523
498static int sas_eh_handle_sas_errors(struct Scsi_Host *shost, 524static void sas_eh_handle_sas_errors(struct Scsi_Host *shost, struct list_head *work_q)
499 struct list_head *work_q,
500 struct list_head *done_q)
501{ 525{
502 struct scsi_cmnd *cmd, *n; 526 struct scsi_cmnd *cmd, *n;
503 enum task_disposition res = TASK_IS_DONE; 527 enum task_disposition res = TASK_IS_DONE;
@@ -505,13 +529,28 @@ static int sas_eh_handle_sas_errors(struct Scsi_Host *shost,
505 struct sas_internal *i = to_sas_internal(shost->transportt); 529 struct sas_internal *i = to_sas_internal(shost->transportt);
506 unsigned long flags; 530 unsigned long flags;
507 struct sas_ha_struct *ha = SHOST_TO_SAS_HA(shost); 531 struct sas_ha_struct *ha = SHOST_TO_SAS_HA(shost);
532 LIST_HEAD(done);
508 533
509Again: 534 /* clean out any commands that won the completion vs eh race */
510 list_for_each_entry_safe(cmd, n, work_q, eh_entry) { 535 list_for_each_entry_safe(cmd, n, work_q, eh_entry) {
511 struct sas_task *task = TO_SAS_TASK(cmd); 536 struct domain_device *dev = cmd_to_domain_dev(cmd);
537 struct sas_task *task;
538
539 spin_lock_irqsave(&dev->done_lock, flags);
540 /* by this point the lldd has either observed
541 * SAS_HA_FROZEN and is leaving the task alone, or has
542 * won the race with eh and decided to complete it
543 */
544 task = TO_SAS_TASK(cmd);
545 spin_unlock_irqrestore(&dev->done_lock, flags);
512 546
513 if (!task) 547 if (!task)
514 continue; 548 list_move_tail(&cmd->eh_entry, &done);
549 }
550
551 Again:
552 list_for_each_entry_safe(cmd, n, work_q, eh_entry) {
553 struct sas_task *task = TO_SAS_TASK(cmd);
515 554
516 list_del_init(&cmd->eh_entry); 555 list_del_init(&cmd->eh_entry);
517 556
@@ -531,15 +570,23 @@ Again:
531 cmd->eh_eflags = 0; 570 cmd->eh_eflags = 0;
532 571
533 switch (res) { 572 switch (res) {
573 case TASK_IS_NOT_AT_HA:
574 SAS_DPRINTK("%s: task 0x%p is not at ha: %s\n",
575 __func__, task,
576 cmd->retries ? "retry" : "aborted");
577 if (cmd->retries)
578 cmd->retries--;
579 sas_eh_finish_cmd(cmd);
580 continue;
534 case TASK_IS_DONE: 581 case TASK_IS_DONE:
535 SAS_DPRINTK("%s: task 0x%p is done\n", __func__, 582 SAS_DPRINTK("%s: task 0x%p is done\n", __func__,
536 task); 583 task);
537 sas_eh_finish_cmd(cmd); 584 sas_eh_defer_cmd(cmd);
538 continue; 585 continue;
539 case TASK_IS_ABORTED: 586 case TASK_IS_ABORTED:
540 SAS_DPRINTK("%s: task 0x%p is aborted\n", 587 SAS_DPRINTK("%s: task 0x%p is aborted\n",
541 __func__, task); 588 __func__, task);
542 sas_eh_finish_cmd(cmd); 589 sas_eh_defer_cmd(cmd);
543 continue; 590 continue;
544 case TASK_IS_AT_LU: 591 case TASK_IS_AT_LU:
545 SAS_DPRINTK("task 0x%p is at LU: lu recover\n", task); 592 SAS_DPRINTK("task 0x%p is at LU: lu recover\n", task);
@@ -550,7 +597,7 @@ Again:
550 "recovered\n", 597 "recovered\n",
551 SAS_ADDR(task->dev), 598 SAS_ADDR(task->dev),
552 cmd->device->lun); 599 cmd->device->lun);
553 sas_eh_finish_cmd(cmd); 600 sas_eh_defer_cmd(cmd);
554 sas_scsi_clear_queue_lu(work_q, cmd); 601 sas_scsi_clear_queue_lu(work_q, cmd);
555 goto Again; 602 goto Again;
556 } 603 }
@@ -560,7 +607,8 @@ Again:
560 SAS_DPRINTK("task 0x%p is not at LU: I_T recover\n", 607 SAS_DPRINTK("task 0x%p is not at LU: I_T recover\n",
561 task); 608 task);
562 tmf_resp = sas_recover_I_T(task->dev); 609 tmf_resp = sas_recover_I_T(task->dev);
563 if (tmf_resp == TMF_RESP_FUNC_COMPLETE) { 610 if (tmf_resp == TMF_RESP_FUNC_COMPLETE ||
611 tmf_resp == -ENODEV) {
564 struct domain_device *dev = task->dev; 612 struct domain_device *dev = task->dev;
565 SAS_DPRINTK("I_T %016llx recovered\n", 613 SAS_DPRINTK("I_T %016llx recovered\n",
566 SAS_ADDR(task->dev->sas_addr)); 614 SAS_ADDR(task->dev->sas_addr));
@@ -607,13 +655,16 @@ Again:
607 goto clear_q; 655 goto clear_q;
608 } 656 }
609 } 657 }
610 return list_empty(work_q); 658 out:
611clear_q: 659 list_splice_tail(&done, work_q);
660 list_splice_tail_init(&ha->eh_ata_q, work_q);
661 return;
662
663 clear_q:
612 SAS_DPRINTK("--- Exit %s -- clear_q\n", __func__); 664 SAS_DPRINTK("--- Exit %s -- clear_q\n", __func__);
613 list_for_each_entry_safe(cmd, n, work_q, eh_entry) 665 list_for_each_entry_safe(cmd, n, work_q, eh_entry)
614 sas_eh_finish_cmd(cmd); 666 sas_eh_finish_cmd(cmd);
615 667 goto out;
616 return list_empty(work_q);
617} 668}
618 669
619void sas_scsi_recover_host(struct Scsi_Host *shost) 670void sas_scsi_recover_host(struct Scsi_Host *shost)
@@ -627,12 +678,17 @@ void sas_scsi_recover_host(struct Scsi_Host *shost)
627 shost->host_eh_scheduled = 0; 678 shost->host_eh_scheduled = 0;
628 spin_unlock_irqrestore(shost->host_lock, flags); 679 spin_unlock_irqrestore(shost->host_lock, flags);
629 680
630 SAS_DPRINTK("Enter %s\n", __func__); 681 SAS_DPRINTK("Enter %s busy: %d failed: %d\n",
682 __func__, shost->host_busy, shost->host_failed);
631 /* 683 /*
632 * Deal with commands that still have SAS tasks (i.e. they didn't 684 * Deal with commands that still have SAS tasks (i.e. they didn't
633 * complete via the normal sas_task completion mechanism) 685 * complete via the normal sas_task completion mechanism),
686 * SAS_HA_FROZEN gives eh dominion over all sas_task completion.
634 */ 687 */
635 if (sas_eh_handle_sas_errors(shost, &eh_work_q, &ha->eh_done_q)) 688 set_bit(SAS_HA_FROZEN, &ha->state);
689 sas_eh_handle_sas_errors(shost, &eh_work_q);
690 clear_bit(SAS_HA_FROZEN, &ha->state);
691 if (list_empty(&eh_work_q))
636 goto out; 692 goto out;
637 693
638 /* 694 /*
@@ -641,59 +697,26 @@ void sas_scsi_recover_host(struct Scsi_Host *shost)
641 * scsi_unjam_host does, but we skip scsi_eh_abort_cmds because any 697 * scsi_unjam_host does, but we skip scsi_eh_abort_cmds because any
642 * command we see here has no sas_task and is thus unknown to the HA. 698 * command we see here has no sas_task and is thus unknown to the HA.
643 */ 699 */
644 if (!sas_ata_eh(shost, &eh_work_q, &ha->eh_done_q)) 700 sas_ata_eh(shost, &eh_work_q, &ha->eh_done_q);
645 if (!scsi_eh_get_sense(&eh_work_q, &ha->eh_done_q)) 701 if (!scsi_eh_get_sense(&eh_work_q, &ha->eh_done_q))
646 scsi_eh_ready_devs(shost, &eh_work_q, &ha->eh_done_q); 702 scsi_eh_ready_devs(shost, &eh_work_q, &ha->eh_done_q);
647 703
648out: 704out:
705 if (ha->lldd_max_execute_num > 1)
706 wake_up_process(ha->core.queue_thread);
707
649 /* now link into libata eh --- if we have any ata devices */ 708 /* now link into libata eh --- if we have any ata devices */
650 sas_ata_strategy_handler(shost); 709 sas_ata_strategy_handler(shost);
651 710
652 scsi_eh_flush_done_q(&ha->eh_done_q); 711 scsi_eh_flush_done_q(&ha->eh_done_q);
653 712
654 SAS_DPRINTK("--- Exit %s\n", __func__); 713 SAS_DPRINTK("--- Exit %s: busy: %d failed: %d\n",
655 return; 714 __func__, shost->host_busy, shost->host_failed);
656} 715}
657 716
658enum blk_eh_timer_return sas_scsi_timed_out(struct scsi_cmnd *cmd) 717enum blk_eh_timer_return sas_scsi_timed_out(struct scsi_cmnd *cmd)
659{ 718{
660 struct sas_task *task = TO_SAS_TASK(cmd); 719 scmd_printk(KERN_DEBUG, cmd, "command %p timed out\n", cmd);
661 unsigned long flags;
662 enum blk_eh_timer_return rtn;
663
664 if (sas_ata_timed_out(cmd, task, &rtn))
665 return rtn;
666
667 if (!task) {
668 cmd->request->timeout /= 2;
669 SAS_DPRINTK("command 0x%p, task 0x%p, gone: %s\n",
670 cmd, task, (cmd->request->timeout ?
671 "BLK_EH_RESET_TIMER" : "BLK_EH_NOT_HANDLED"));
672 if (!cmd->request->timeout)
673 return BLK_EH_NOT_HANDLED;
674 return BLK_EH_RESET_TIMER;
675 }
676
677 spin_lock_irqsave(&task->task_state_lock, flags);
678 BUG_ON(task->task_state_flags & SAS_TASK_STATE_ABORTED);
679 if (task->task_state_flags & SAS_TASK_STATE_DONE) {
680 spin_unlock_irqrestore(&task->task_state_lock, flags);
681 SAS_DPRINTK("command 0x%p, task 0x%p, timed out: "
682 "BLK_EH_HANDLED\n", cmd, task);
683 return BLK_EH_HANDLED;
684 }
685 if (!(task->task_state_flags & SAS_TASK_AT_INITIATOR)) {
686 spin_unlock_irqrestore(&task->task_state_lock, flags);
687 SAS_DPRINTK("command 0x%p, task 0x%p, not at initiator: "
688 "BLK_EH_RESET_TIMER\n",
689 cmd, task);
690 return BLK_EH_RESET_TIMER;
691 }
692 task->task_state_flags |= SAS_TASK_STATE_ABORTED;
693 spin_unlock_irqrestore(&task->task_state_lock, flags);
694
695 SAS_DPRINTK("command 0x%p, task 0x%p, timed out: BLK_EH_NOT_HANDLED\n",
696 cmd, task);
697 720
698 return BLK_EH_NOT_HANDLED; 721 return BLK_EH_NOT_HANDLED;
699} 722}
@@ -737,27 +760,15 @@ struct domain_device *sas_find_dev_by_rphy(struct sas_rphy *rphy)
737 return found_dev; 760 return found_dev;
738} 761}
739 762
740static inline struct domain_device *sas_find_target(struct scsi_target *starget)
741{
742 struct sas_rphy *rphy = dev_to_rphy(starget->dev.parent);
743
744 return sas_find_dev_by_rphy(rphy);
745}
746
747int sas_target_alloc(struct scsi_target *starget) 763int sas_target_alloc(struct scsi_target *starget)
748{ 764{
749 struct domain_device *found_dev = sas_find_target(starget); 765 struct sas_rphy *rphy = dev_to_rphy(starget->dev.parent);
750 int res; 766 struct domain_device *found_dev = sas_find_dev_by_rphy(rphy);
751 767
752 if (!found_dev) 768 if (!found_dev)
753 return -ENODEV; 769 return -ENODEV;
754 770
755 if (dev_is_sata(found_dev)) { 771 kref_get(&found_dev->kref);
756 res = sas_ata_init_host_and_port(found_dev, starget);
757 if (res)
758 return res;
759 }
760
761 starget->hostdata = found_dev; 772 starget->hostdata = found_dev;
762 return 0; 773 return 0;
763} 774}
@@ -797,14 +808,6 @@ int sas_slave_configure(struct scsi_device *scsi_dev)
797 return 0; 808 return 0;
798} 809}
799 810
800void sas_slave_destroy(struct scsi_device *scsi_dev)
801{
802 struct domain_device *dev = sdev_to_domain_dev(scsi_dev);
803
804 if (dev_is_sata(dev))
805 sas_to_ata_dev(dev)->class = ATA_DEV_NONE;
806}
807
808int sas_change_queue_depth(struct scsi_device *sdev, int depth, int reason) 811int sas_change_queue_depth(struct scsi_device *sdev, int depth, int reason)
809{ 812{
810 struct domain_device *dev = sdev_to_domain_dev(sdev); 813 struct domain_device *dev = sdev_to_domain_dev(sdev);
@@ -871,9 +874,11 @@ static void sas_queue(struct sas_ha_struct *sas_ha)
871 int res; 874 int res;
872 struct sas_internal *i = to_sas_internal(core->shost->transportt); 875 struct sas_internal *i = to_sas_internal(core->shost->transportt);
873 876
877 mutex_lock(&core->task_queue_flush);
874 spin_lock_irqsave(&core->task_queue_lock, flags); 878 spin_lock_irqsave(&core->task_queue_lock, flags);
875 while (!kthread_should_stop() && 879 while (!kthread_should_stop() &&
876 !list_empty(&core->task_queue)) { 880 !list_empty(&core->task_queue) &&
881 !test_bit(SAS_HA_FROZEN, &sas_ha->state)) {
877 882
878 can_queue = sas_ha->lldd_queue_size - core->task_queue_size; 883 can_queue = sas_ha->lldd_queue_size - core->task_queue_size;
879 if (can_queue >= 0) { 884 if (can_queue >= 0) {
@@ -909,6 +914,7 @@ static void sas_queue(struct sas_ha_struct *sas_ha)
909 } 914 }
910 } 915 }
911 spin_unlock_irqrestore(&core->task_queue_lock, flags); 916 spin_unlock_irqrestore(&core->task_queue_lock, flags);
917 mutex_unlock(&core->task_queue_flush);
912} 918}
913 919
914/** 920/**
@@ -935,6 +941,7 @@ int sas_init_queue(struct sas_ha_struct *sas_ha)
935 struct scsi_core *core = &sas_ha->core; 941 struct scsi_core *core = &sas_ha->core;
936 942
937 spin_lock_init(&core->task_queue_lock); 943 spin_lock_init(&core->task_queue_lock);
944 mutex_init(&core->task_queue_flush);
938 core->task_queue_size = 0; 945 core->task_queue_size = 0;
939 INIT_LIST_HEAD(&core->task_queue); 946 INIT_LIST_HEAD(&core->task_queue);
940 947
@@ -972,49 +979,6 @@ void sas_shutdown_queue(struct sas_ha_struct *sas_ha)
972} 979}
973 980
974/* 981/*
975 * Call the LLDD task abort routine directly. This function is intended for
976 * use by upper layers that need to tell the LLDD to abort a task.
977 */
978int __sas_task_abort(struct sas_task *task)
979{
980 struct sas_internal *si =
981 to_sas_internal(task->dev->port->ha->core.shost->transportt);
982 unsigned long flags;
983 int res;
984
985 spin_lock_irqsave(&task->task_state_lock, flags);
986 if (task->task_state_flags & SAS_TASK_STATE_ABORTED ||
987 task->task_state_flags & SAS_TASK_STATE_DONE) {
988 spin_unlock_irqrestore(&task->task_state_lock, flags);
989 SAS_DPRINTK("%s: Task %p already finished.\n", __func__,
990 task);
991 return 0;
992 }
993 task->task_state_flags |= SAS_TASK_STATE_ABORTED;
994 spin_unlock_irqrestore(&task->task_state_lock, flags);
995
996 if (!si->dft->lldd_abort_task)
997 return -ENODEV;
998
999 res = si->dft->lldd_abort_task(task);
1000
1001 spin_lock_irqsave(&task->task_state_lock, flags);
1002 if ((task->task_state_flags & SAS_TASK_STATE_DONE) ||
1003 (res == TMF_RESP_FUNC_COMPLETE))
1004 {
1005 spin_unlock_irqrestore(&task->task_state_lock, flags);
1006 task->task_done(task);
1007 return 0;
1008 }
1009
1010 if (!(task->task_state_flags & SAS_TASK_STATE_DONE))
1011 task->task_state_flags &= ~SAS_TASK_STATE_ABORTED;
1012 spin_unlock_irqrestore(&task->task_state_lock, flags);
1013
1014 return -EAGAIN;
1015}
1016
1017/*
1018 * Tell an upper layer that it needs to initiate an abort for a given task. 982 * Tell an upper layer that it needs to initiate an abort for a given task.
1019 * This should only ever be called by an LLDD. 983 * This should only ever be called by an LLDD.
1020 */ 984 */
@@ -1043,27 +1007,15 @@ void sas_task_abort(struct sas_task *task)
1043 } 1007 }
1044} 1008}
1045 1009
1046int sas_slave_alloc(struct scsi_device *scsi_dev)
1047{
1048 struct domain_device *dev = sdev_to_domain_dev(scsi_dev);
1049
1050 if (dev_is_sata(dev))
1051 return ata_sas_port_init(dev->sata_dev.ap);
1052
1053 return 0;
1054}
1055
1056void sas_target_destroy(struct scsi_target *starget) 1010void sas_target_destroy(struct scsi_target *starget)
1057{ 1011{
1058 struct domain_device *found_dev = sas_find_target(starget); 1012 struct domain_device *found_dev = starget->hostdata;
1059 1013
1060 if (!found_dev) 1014 if (!found_dev)
1061 return; 1015 return;
1062 1016
1063 if (dev_is_sata(found_dev)) 1017 starget->hostdata = NULL;
1064 ata_sas_port_destroy(found_dev->sata_dev.ap); 1018 sas_put_device(found_dev);
1065
1066 return;
1067} 1019}
1068 1020
1069static void sas_parse_addr(u8 *sas_addr, const char *p) 1021static void sas_parse_addr(u8 *sas_addr, const char *p)
@@ -1108,16 +1060,12 @@ EXPORT_SYMBOL_GPL(sas_request_addr);
1108EXPORT_SYMBOL_GPL(sas_queuecommand); 1060EXPORT_SYMBOL_GPL(sas_queuecommand);
1109EXPORT_SYMBOL_GPL(sas_target_alloc); 1061EXPORT_SYMBOL_GPL(sas_target_alloc);
1110EXPORT_SYMBOL_GPL(sas_slave_configure); 1062EXPORT_SYMBOL_GPL(sas_slave_configure);
1111EXPORT_SYMBOL_GPL(sas_slave_destroy);
1112EXPORT_SYMBOL_GPL(sas_change_queue_depth); 1063EXPORT_SYMBOL_GPL(sas_change_queue_depth);
1113EXPORT_SYMBOL_GPL(sas_change_queue_type); 1064EXPORT_SYMBOL_GPL(sas_change_queue_type);
1114EXPORT_SYMBOL_GPL(sas_bios_param); 1065EXPORT_SYMBOL_GPL(sas_bios_param);
1115EXPORT_SYMBOL_GPL(__sas_task_abort);
1116EXPORT_SYMBOL_GPL(sas_task_abort); 1066EXPORT_SYMBOL_GPL(sas_task_abort);
1117EXPORT_SYMBOL_GPL(sas_phy_reset); 1067EXPORT_SYMBOL_GPL(sas_phy_reset);
1118EXPORT_SYMBOL_GPL(sas_phy_enable);
1119EXPORT_SYMBOL_GPL(sas_eh_device_reset_handler); 1068EXPORT_SYMBOL_GPL(sas_eh_device_reset_handler);
1120EXPORT_SYMBOL_GPL(sas_eh_bus_reset_handler); 1069EXPORT_SYMBOL_GPL(sas_eh_bus_reset_handler);
1121EXPORT_SYMBOL_GPL(sas_slave_alloc);
1122EXPORT_SYMBOL_GPL(sas_target_destroy); 1070EXPORT_SYMBOL_GPL(sas_target_destroy);
1123EXPORT_SYMBOL_GPL(sas_ioctl); 1071EXPORT_SYMBOL_GPL(sas_ioctl);
diff --git a/drivers/scsi/lpfc/lpfc.h b/drivers/scsi/lpfc/lpfc.h
index 825f9307417a..5fc044ff656e 100644
--- a/drivers/scsi/lpfc/lpfc.h
+++ b/drivers/scsi/lpfc/lpfc.h
@@ -534,6 +534,7 @@ struct lpfc_hba {
534 void (*lpfc_scsi_prep_cmnd) 534 void (*lpfc_scsi_prep_cmnd)
535 (struct lpfc_vport *, struct lpfc_scsi_buf *, 535 (struct lpfc_vport *, struct lpfc_scsi_buf *,
536 struct lpfc_nodelist *); 536 struct lpfc_nodelist *);
537
537 /* IOCB interface function jump table entries */ 538 /* IOCB interface function jump table entries */
538 int (*__lpfc_sli_issue_iocb) 539 int (*__lpfc_sli_issue_iocb)
539 (struct lpfc_hba *, uint32_t, 540 (struct lpfc_hba *, uint32_t,
@@ -541,8 +542,6 @@ struct lpfc_hba {
541 void (*__lpfc_sli_release_iocbq)(struct lpfc_hba *, 542 void (*__lpfc_sli_release_iocbq)(struct lpfc_hba *,
542 struct lpfc_iocbq *); 543 struct lpfc_iocbq *);
543 int (*lpfc_hba_down_post)(struct lpfc_hba *phba); 544 int (*lpfc_hba_down_post)(struct lpfc_hba *phba);
544
545
546 IOCB_t * (*lpfc_get_iocb_from_iocbq) 545 IOCB_t * (*lpfc_get_iocb_from_iocbq)
547 (struct lpfc_iocbq *); 546 (struct lpfc_iocbq *);
548 void (*lpfc_scsi_cmd_iocb_cmpl) 547 void (*lpfc_scsi_cmd_iocb_cmpl)
@@ -551,10 +550,12 @@ struct lpfc_hba {
551 /* MBOX interface function jump table entries */ 550 /* MBOX interface function jump table entries */
552 int (*lpfc_sli_issue_mbox) 551 int (*lpfc_sli_issue_mbox)
553 (struct lpfc_hba *, LPFC_MBOXQ_t *, uint32_t); 552 (struct lpfc_hba *, LPFC_MBOXQ_t *, uint32_t);
553
554 /* Slow-path IOCB process function jump table entries */ 554 /* Slow-path IOCB process function jump table entries */
555 void (*lpfc_sli_handle_slow_ring_event) 555 void (*lpfc_sli_handle_slow_ring_event)
556 (struct lpfc_hba *phba, struct lpfc_sli_ring *pring, 556 (struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
557 uint32_t mask); 557 uint32_t mask);
558
558 /* INIT device interface function jump table entries */ 559 /* INIT device interface function jump table entries */
559 int (*lpfc_sli_hbq_to_firmware) 560 int (*lpfc_sli_hbq_to_firmware)
560 (struct lpfc_hba *, uint32_t, struct hbq_dmabuf *); 561 (struct lpfc_hba *, uint32_t, struct hbq_dmabuf *);
@@ -573,6 +574,10 @@ struct lpfc_hba {
573 int (*lpfc_selective_reset) 574 int (*lpfc_selective_reset)
574 (struct lpfc_hba *); 575 (struct lpfc_hba *);
575 576
577 int (*lpfc_bg_scsi_prep_dma_buf)
578 (struct lpfc_hba *, struct lpfc_scsi_buf *);
579 /* Add new entries here */
580
576 /* SLI4 specific HBA data structure */ 581 /* SLI4 specific HBA data structure */
577 struct lpfc_sli4_hba sli4_hba; 582 struct lpfc_sli4_hba sli4_hba;
578 583
@@ -838,6 +843,7 @@ struct lpfc_hba {
838 struct dentry *debug_writeGuard; /* inject write guard_tag errors */ 843 struct dentry *debug_writeGuard; /* inject write guard_tag errors */
839 struct dentry *debug_writeApp; /* inject write app_tag errors */ 844 struct dentry *debug_writeApp; /* inject write app_tag errors */
840 struct dentry *debug_writeRef; /* inject write ref_tag errors */ 845 struct dentry *debug_writeRef; /* inject write ref_tag errors */
846 struct dentry *debug_readGuard; /* inject read guard_tag errors */
841 struct dentry *debug_readApp; /* inject read app_tag errors */ 847 struct dentry *debug_readApp; /* inject read app_tag errors */
842 struct dentry *debug_readRef; /* inject read ref_tag errors */ 848 struct dentry *debug_readRef; /* inject read ref_tag errors */
843 849
@@ -845,10 +851,11 @@ struct lpfc_hba {
845 uint32_t lpfc_injerr_wgrd_cnt; 851 uint32_t lpfc_injerr_wgrd_cnt;
846 uint32_t lpfc_injerr_wapp_cnt; 852 uint32_t lpfc_injerr_wapp_cnt;
847 uint32_t lpfc_injerr_wref_cnt; 853 uint32_t lpfc_injerr_wref_cnt;
854 uint32_t lpfc_injerr_rgrd_cnt;
848 uint32_t lpfc_injerr_rapp_cnt; 855 uint32_t lpfc_injerr_rapp_cnt;
849 uint32_t lpfc_injerr_rref_cnt; 856 uint32_t lpfc_injerr_rref_cnt;
850 sector_t lpfc_injerr_lba; 857 sector_t lpfc_injerr_lba;
851#define LPFC_INJERR_LBA_OFF (sector_t)0xffffffffffffffff 858#define LPFC_INJERR_LBA_OFF (sector_t)(-1)
852 859
853 struct dentry *debug_slow_ring_trc; 860 struct dentry *debug_slow_ring_trc;
854 struct lpfc_debugfs_trc *slow_ring_trc; 861 struct lpfc_debugfs_trc *slow_ring_trc;
diff --git a/drivers/scsi/lpfc/lpfc_attr.c b/drivers/scsi/lpfc/lpfc_attr.c
index f6697cb0e216..296ad5bc4240 100644
--- a/drivers/scsi/lpfc/lpfc_attr.c
+++ b/drivers/scsi/lpfc/lpfc_attr.c
@@ -353,7 +353,7 @@ lpfc_fwrev_show(struct device *dev, struct device_attribute *attr,
353 struct lpfc_hba *phba = vport->phba; 353 struct lpfc_hba *phba = vport->phba;
354 uint32_t if_type; 354 uint32_t if_type;
355 uint8_t sli_family; 355 uint8_t sli_family;
356 char fwrev[32]; 356 char fwrev[FW_REV_STR_SIZE];
357 int len; 357 int len;
358 358
359 lpfc_decode_firmware_rev(phba, fwrev, 1); 359 lpfc_decode_firmware_rev(phba, fwrev, 1);
@@ -922,11 +922,15 @@ lpfc_sli4_pdev_reg_request(struct lpfc_hba *phba, uint32_t opcode)
922 rc = lpfc_sli4_pdev_status_reg_wait(phba); 922 rc = lpfc_sli4_pdev_status_reg_wait(phba);
923 923
924 if (rc == -EPERM) { 924 if (rc == -EPERM) {
925 /* no privilage for reset, restore if needed */ 925 /* no privilage for reset */
926 if (before_fc_flag & FC_OFFLINE_MODE) 926 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
927 goto out; 927 "3150 No privilage to perform the requested "
928 "access: x%x\n", reg_val);
928 } else if (rc == -EIO) { 929 } else if (rc == -EIO) {
929 /* reset failed, there is nothing more we can do */ 930 /* reset failed, there is nothing more we can do */
931 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
932 "3153 Fail to perform the requested "
933 "access: x%x\n", reg_val);
930 return rc; 934 return rc;
931 } 935 }
932 936
diff --git a/drivers/scsi/lpfc/lpfc_bsg.c b/drivers/scsi/lpfc/lpfc_bsg.c
index 56a86baece5b..141e4b40bb55 100644
--- a/drivers/scsi/lpfc/lpfc_bsg.c
+++ b/drivers/scsi/lpfc/lpfc_bsg.c
@@ -589,7 +589,10 @@ lpfc_bsg_rport_els(struct fc_bsg_job *job)
589 } 589 }
590 cmdiocbq->iocb.un.elsreq64.bdl.bdeSize = 590 cmdiocbq->iocb.un.elsreq64.bdl.bdeSize =
591 (request_nseg + reply_nseg) * sizeof(struct ulp_bde64); 591 (request_nseg + reply_nseg) * sizeof(struct ulp_bde64);
592 cmdiocbq->iocb.ulpContext = rpi; 592 if (phba->sli_rev == LPFC_SLI_REV4)
593 cmdiocbq->iocb.ulpContext = phba->sli4_hba.rpi_ids[rpi];
594 else
595 cmdiocbq->iocb.ulpContext = rpi;
593 cmdiocbq->iocb_flag |= LPFC_IO_LIBDFC; 596 cmdiocbq->iocb_flag |= LPFC_IO_LIBDFC;
594 cmdiocbq->context1 = NULL; 597 cmdiocbq->context1 = NULL;
595 cmdiocbq->context2 = NULL; 598 cmdiocbq->context2 = NULL;
@@ -1768,7 +1771,7 @@ lpfc_sli4_bsg_set_internal_loopback(struct lpfc_hba *phba)
1768 bf_set(lpfc_mbx_set_diag_state_link_type, 1771 bf_set(lpfc_mbx_set_diag_state_link_type,
1769 &link_diag_loopback->u.req, phba->sli4_hba.lnk_info.lnk_tp); 1772 &link_diag_loopback->u.req, phba->sli4_hba.lnk_info.lnk_tp);
1770 bf_set(lpfc_mbx_set_diag_lpbk_type, &link_diag_loopback->u.req, 1773 bf_set(lpfc_mbx_set_diag_lpbk_type, &link_diag_loopback->u.req,
1771 LPFC_DIAG_LOOPBACK_TYPE_SERDES); 1774 LPFC_DIAG_LOOPBACK_TYPE_INTERNAL);
1772 1775
1773 mbxstatus = lpfc_sli_issue_mbox_wait(phba, pmboxq, LPFC_MBOX_TMO); 1776 mbxstatus = lpfc_sli_issue_mbox_wait(phba, pmboxq, LPFC_MBOX_TMO);
1774 if ((mbxstatus != MBX_SUCCESS) || (pmboxq->u.mb.mbxStatus)) { 1777 if ((mbxstatus != MBX_SUCCESS) || (pmboxq->u.mb.mbxStatus)) {
@@ -3977,7 +3980,7 @@ lpfc_bsg_handle_sli_cfg_mbox(struct lpfc_hba *phba, struct fc_bsg_job *job,
3977 case COMN_OPCODE_GET_CNTL_ADDL_ATTRIBUTES: 3980 case COMN_OPCODE_GET_CNTL_ADDL_ATTRIBUTES:
3978 lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC, 3981 lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
3979 "3106 Handled SLI_CONFIG " 3982 "3106 Handled SLI_CONFIG "
3980 "subsys_fcoe, opcode:x%x\n", 3983 "subsys_comn, opcode:x%x\n",
3981 opcode); 3984 opcode);
3982 rc = lpfc_bsg_sli_cfg_read_cmd_ext(phba, job, 3985 rc = lpfc_bsg_sli_cfg_read_cmd_ext(phba, job,
3983 nemb_mse, dmabuf); 3986 nemb_mse, dmabuf);
@@ -3985,7 +3988,7 @@ lpfc_bsg_handle_sli_cfg_mbox(struct lpfc_hba *phba, struct fc_bsg_job *job,
3985 default: 3988 default:
3986 lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC, 3989 lpfc_printf_log(phba, KERN_INFO, LOG_LIBDFC,
3987 "3107 Reject SLI_CONFIG " 3990 "3107 Reject SLI_CONFIG "
3988 "subsys_fcoe, opcode:x%x\n", 3991 "subsys_comn, opcode:x%x\n",
3989 opcode); 3992 opcode);
3990 rc = -EPERM; 3993 rc = -EPERM;
3991 break; 3994 break;
@@ -4556,7 +4559,12 @@ lpfc_bsg_issue_mbox(struct lpfc_hba *phba, struct fc_bsg_job *job,
4556 + sizeof(MAILBOX_t)); 4559 + sizeof(MAILBOX_t));
4557 } 4560 }
4558 } else if (phba->sli_rev == LPFC_SLI_REV4) { 4561 } else if (phba->sli_rev == LPFC_SLI_REV4) {
4559 if (pmb->mbxCommand == MBX_DUMP_MEMORY) { 4562 /* Let type 4 (well known data) through because the data is
4563 * returned in varwords[4-8]
4564 * otherwise check the recieve length and fetch the buffer addr
4565 */
4566 if ((pmb->mbxCommand == MBX_DUMP_MEMORY) &&
4567 (pmb->un.varDmp.type != DMP_WELL_KNOWN)) {
4560 /* rebuild the command for sli4 using our own buffers 4568 /* rebuild the command for sli4 using our own buffers
4561 * like we do for biu diags 4569 * like we do for biu diags
4562 */ 4570 */
diff --git a/drivers/scsi/lpfc/lpfc_crtn.h b/drivers/scsi/lpfc/lpfc_crtn.h
index 26924b7a6cde..330dd7192a7f 100644
--- a/drivers/scsi/lpfc/lpfc_crtn.h
+++ b/drivers/scsi/lpfc/lpfc_crtn.h
@@ -462,3 +462,4 @@ int lpfc_issue_unreg_vfi(struct lpfc_vport *);
462int lpfc_selective_reset(struct lpfc_hba *); 462int lpfc_selective_reset(struct lpfc_hba *);
463int lpfc_sli4_read_config(struct lpfc_hba *phba); 463int lpfc_sli4_read_config(struct lpfc_hba *phba);
464int lpfc_scsi_buf_update(struct lpfc_hba *phba); 464int lpfc_scsi_buf_update(struct lpfc_hba *phba);
465void lpfc_sli4_node_prep(struct lpfc_hba *phba);
diff --git a/drivers/scsi/lpfc/lpfc_ct.c b/drivers/scsi/lpfc/lpfc_ct.c
index 707081d0a226..93e96b3c9097 100644
--- a/drivers/scsi/lpfc/lpfc_ct.c
+++ b/drivers/scsi/lpfc/lpfc_ct.c
@@ -1076,7 +1076,7 @@ int
1076lpfc_vport_symbolic_node_name(struct lpfc_vport *vport, char *symbol, 1076lpfc_vport_symbolic_node_name(struct lpfc_vport *vport, char *symbol,
1077 size_t size) 1077 size_t size)
1078{ 1078{
1079 char fwrev[16]; 1079 char fwrev[FW_REV_STR_SIZE];
1080 int n; 1080 int n;
1081 1081
1082 lpfc_decode_firmware_rev(vport->phba, fwrev, 0); 1082 lpfc_decode_firmware_rev(vport->phba, fwrev, 0);
@@ -1834,7 +1834,7 @@ lpfc_decode_firmware_rev(struct lpfc_hba *phba, char *fwrevision, int flag)
1834 uint8_t *fwname; 1834 uint8_t *fwname;
1835 1835
1836 if (phba->sli_rev == LPFC_SLI_REV4) 1836 if (phba->sli_rev == LPFC_SLI_REV4)
1837 sprintf(fwrevision, "%s", vp->rev.opFwName); 1837 snprintf(fwrevision, FW_REV_STR_SIZE, "%s", vp->rev.opFwName);
1838 else if (vp->rev.rBit) { 1838 else if (vp->rev.rBit) {
1839 if (psli->sli_flag & LPFC_SLI_ACTIVE) 1839 if (psli->sli_flag & LPFC_SLI_ACTIVE)
1840 rev = vp->rev.sli2FwRev; 1840 rev = vp->rev.sli2FwRev;
diff --git a/drivers/scsi/lpfc/lpfc_debugfs.c b/drivers/scsi/lpfc/lpfc_debugfs.c
index 3587a3fe8fcb..22e17be04d8a 100644
--- a/drivers/scsi/lpfc/lpfc_debugfs.c
+++ b/drivers/scsi/lpfc/lpfc_debugfs.c
@@ -1019,6 +1019,8 @@ lpfc_debugfs_dif_err_read(struct file *file, char __user *buf,
1019 cnt = snprintf(cbuf, 16, "%u\n", phba->lpfc_injerr_wapp_cnt); 1019 cnt = snprintf(cbuf, 16, "%u\n", phba->lpfc_injerr_wapp_cnt);
1020 else if (dent == phba->debug_writeRef) 1020 else if (dent == phba->debug_writeRef)
1021 cnt = snprintf(cbuf, 16, "%u\n", phba->lpfc_injerr_wref_cnt); 1021 cnt = snprintf(cbuf, 16, "%u\n", phba->lpfc_injerr_wref_cnt);
1022 else if (dent == phba->debug_readGuard)
1023 cnt = snprintf(cbuf, 16, "%u\n", phba->lpfc_injerr_rgrd_cnt);
1022 else if (dent == phba->debug_readApp) 1024 else if (dent == phba->debug_readApp)
1023 cnt = snprintf(cbuf, 16, "%u\n", phba->lpfc_injerr_rapp_cnt); 1025 cnt = snprintf(cbuf, 16, "%u\n", phba->lpfc_injerr_rapp_cnt);
1024 else if (dent == phba->debug_readRef) 1026 else if (dent == phba->debug_readRef)
@@ -1057,6 +1059,8 @@ lpfc_debugfs_dif_err_write(struct file *file, const char __user *buf,
1057 phba->lpfc_injerr_wapp_cnt = (uint32_t)tmp; 1059 phba->lpfc_injerr_wapp_cnt = (uint32_t)tmp;
1058 else if (dent == phba->debug_writeRef) 1060 else if (dent == phba->debug_writeRef)
1059 phba->lpfc_injerr_wref_cnt = (uint32_t)tmp; 1061 phba->lpfc_injerr_wref_cnt = (uint32_t)tmp;
1062 else if (dent == phba->debug_readGuard)
1063 phba->lpfc_injerr_rgrd_cnt = (uint32_t)tmp;
1060 else if (dent == phba->debug_readApp) 1064 else if (dent == phba->debug_readApp)
1061 phba->lpfc_injerr_rapp_cnt = (uint32_t)tmp; 1065 phba->lpfc_injerr_rapp_cnt = (uint32_t)tmp;
1062 else if (dent == phba->debug_readRef) 1066 else if (dent == phba->debug_readRef)
@@ -3978,6 +3982,17 @@ lpfc_debugfs_initialize(struct lpfc_vport *vport)
3978 goto debug_failed; 3982 goto debug_failed;
3979 } 3983 }
3980 3984
3985 snprintf(name, sizeof(name), "readGuardInjErr");
3986 phba->debug_readGuard =
3987 debugfs_create_file(name, S_IFREG|S_IRUGO|S_IWUSR,
3988 phba->hba_debugfs_root,
3989 phba, &lpfc_debugfs_op_dif_err);
3990 if (!phba->debug_readGuard) {
3991 lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
3992 "0808 Cannot create debugfs readGuard\n");
3993 goto debug_failed;
3994 }
3995
3981 snprintf(name, sizeof(name), "readAppInjErr"); 3996 snprintf(name, sizeof(name), "readAppInjErr");
3982 phba->debug_readApp = 3997 phba->debug_readApp =
3983 debugfs_create_file(name, S_IFREG|S_IRUGO|S_IWUSR, 3998 debugfs_create_file(name, S_IFREG|S_IRUGO|S_IWUSR,
@@ -4318,6 +4333,10 @@ lpfc_debugfs_terminate(struct lpfc_vport *vport)
4318 debugfs_remove(phba->debug_writeRef); /* writeRef */ 4333 debugfs_remove(phba->debug_writeRef); /* writeRef */
4319 phba->debug_writeRef = NULL; 4334 phba->debug_writeRef = NULL;
4320 } 4335 }
4336 if (phba->debug_readGuard) {
4337 debugfs_remove(phba->debug_readGuard); /* readGuard */
4338 phba->debug_readGuard = NULL;
4339 }
4321 if (phba->debug_readApp) { 4340 if (phba->debug_readApp) {
4322 debugfs_remove(phba->debug_readApp); /* readApp */ 4341 debugfs_remove(phba->debug_readApp); /* readApp */
4323 phba->debug_readApp = NULL; 4342 phba->debug_readApp = NULL;
diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c
index 7afc757338de..8db2fb3b45ec 100644
--- a/drivers/scsi/lpfc/lpfc_els.c
+++ b/drivers/scsi/lpfc/lpfc_els.c
@@ -1526,7 +1526,6 @@ lpfc_plogi_confirm_nport(struct lpfc_hba *phba, uint32_t *prsp,
1526 memcpy(&ndlp->active_rrqs.xri_bitmap, 1526 memcpy(&ndlp->active_rrqs.xri_bitmap,
1527 &rrq.xri_bitmap, 1527 &rrq.xri_bitmap,
1528 sizeof(ndlp->active_rrqs.xri_bitmap)); 1528 sizeof(ndlp->active_rrqs.xri_bitmap));
1529 lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
1530 /* Since we are swapping the ndlp passed in with the new one 1529 /* Since we are swapping the ndlp passed in with the new one
1531 * and the did has already been swapped, copy over the 1530 * and the did has already been swapped, copy over the
1532 * state and names. 1531 * state and names.
@@ -1536,6 +1535,7 @@ lpfc_plogi_confirm_nport(struct lpfc_hba *phba, uint32_t *prsp,
1536 memcpy(&new_ndlp->nlp_nodename, &ndlp->nlp_nodename, 1535 memcpy(&new_ndlp->nlp_nodename, &ndlp->nlp_nodename,
1537 sizeof(struct lpfc_name)); 1536 sizeof(struct lpfc_name));
1538 new_ndlp->nlp_state = ndlp->nlp_state; 1537 new_ndlp->nlp_state = ndlp->nlp_state;
1538 lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
1539 /* Fix up the rport accordingly */ 1539 /* Fix up the rport accordingly */
1540 rport = ndlp->rport; 1540 rport = ndlp->rport;
1541 if (rport) { 1541 if (rport) {
@@ -7172,7 +7172,7 @@ lpfc_cmpl_els_fdisc(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
7172 goto out; 7172 goto out;
7173 /* FDISC failed */ 7173 /* FDISC failed */
7174 lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS, 7174 lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
7175 "0126 FDISC failed. (%d/%d)\n", 7175 "0126 FDISC failed. (x%x/x%x)\n",
7176 irsp->ulpStatus, irsp->un.ulpWord[4]); 7176 irsp->ulpStatus, irsp->un.ulpWord[4]);
7177 goto fdisc_failed; 7177 goto fdisc_failed;
7178 } 7178 }
@@ -7283,6 +7283,7 @@ lpfc_issue_els_fdisc(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
7283 int rc; 7283 int rc;
7284 7284
7285 vport->port_state = LPFC_FDISC; 7285 vport->port_state = LPFC_FDISC;
7286 vport->fc_myDID = 0;
7286 cmdsize = (sizeof(uint32_t) + sizeof(struct serv_parm)); 7287 cmdsize = (sizeof(uint32_t) + sizeof(struct serv_parm));
7287 elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp, did, 7288 elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp, did,
7288 ELS_CMD_FDISC); 7289 ELS_CMD_FDISC);
diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c
index 678a4b11059c..343d87ba4df8 100644
--- a/drivers/scsi/lpfc/lpfc_hbadisc.c
+++ b/drivers/scsi/lpfc/lpfc_hbadisc.c
@@ -2977,9 +2977,9 @@ lpfc_mbx_process_link_up(struct lpfc_hba *phba, struct lpfc_mbx_read_top *la)
2977 "topology\n"); 2977 "topology\n");
2978 /* Get Loop Map information */ 2978 /* Get Loop Map information */
2979 if (bf_get(lpfc_mbx_read_top_il, la)) { 2979 if (bf_get(lpfc_mbx_read_top_il, la)) {
2980 spin_lock_irq(shost->host_lock); 2980 spin_lock(shost->host_lock);
2981 vport->fc_flag |= FC_LBIT; 2981 vport->fc_flag |= FC_LBIT;
2982 spin_unlock_irq(shost->host_lock); 2982 spin_unlock(shost->host_lock);
2983 } 2983 }
2984 2984
2985 vport->fc_myDID = bf_get(lpfc_mbx_read_top_alpa_granted, la); 2985 vport->fc_myDID = bf_get(lpfc_mbx_read_top_alpa_granted, la);
@@ -3029,9 +3029,9 @@ lpfc_mbx_process_link_up(struct lpfc_hba *phba, struct lpfc_mbx_read_top *la)
3029 phba->sli3_options |= LPFC_SLI3_NPIV_ENABLED; 3029 phba->sli3_options |= LPFC_SLI3_NPIV_ENABLED;
3030 } 3030 }
3031 vport->fc_myDID = phba->fc_pref_DID; 3031 vport->fc_myDID = phba->fc_pref_DID;
3032 spin_lock_irq(shost->host_lock); 3032 spin_lock(shost->host_lock);
3033 vport->fc_flag |= FC_LBIT; 3033 vport->fc_flag |= FC_LBIT;
3034 spin_unlock_irq(shost->host_lock); 3034 spin_unlock(shost->host_lock);
3035 } 3035 }
3036 spin_unlock_irq(&phba->hbalock); 3036 spin_unlock_irq(&phba->hbalock);
3037 3037
@@ -5332,6 +5332,10 @@ lpfc_filter_by_rpi(struct lpfc_nodelist *ndlp, void *param)
5332{ 5332{
5333 uint16_t *rpi = param; 5333 uint16_t *rpi = param;
5334 5334
5335 /* check for active node */
5336 if (!NLP_CHK_NODE_ACT(ndlp))
5337 return 0;
5338
5335 return ndlp->nlp_rpi == *rpi; 5339 return ndlp->nlp_rpi == *rpi;
5336} 5340}
5337 5341
diff --git a/drivers/scsi/lpfc/lpfc_hw.h b/drivers/scsi/lpfc/lpfc_hw.h
index 7245bead3755..5f280b5ae3db 100644
--- a/drivers/scsi/lpfc/lpfc_hw.h
+++ b/drivers/scsi/lpfc/lpfc_hw.h
@@ -1,7 +1,7 @@
1/******************************************************************* 1/*******************************************************************
2 * This file is part of the Emulex Linux Device Driver for * 2 * This file is part of the Emulex Linux Device Driver for *
3 * Fibre Channel Host Bus Adapters. * 3 * Fibre Channel Host Bus Adapters. *
4 * Copyright (C) 2004-2010 Emulex. All rights reserved. * 4 * Copyright (C) 2004-2011 Emulex. All rights reserved. *
5 * EMULEX and SLI are trademarks of Emulex. * 5 * EMULEX and SLI are trademarks of Emulex. *
6 * www.emulex.com * 6 * www.emulex.com *
7 * * 7 * *
@@ -70,6 +70,7 @@
70/* vendor ID used in SCSI netlink calls */ 70/* vendor ID used in SCSI netlink calls */
71#define LPFC_NL_VENDOR_ID (SCSI_NL_VID_TYPE_PCI | PCI_VENDOR_ID_EMULEX) 71#define LPFC_NL_VENDOR_ID (SCSI_NL_VID_TYPE_PCI | PCI_VENDOR_ID_EMULEX)
72 72
73#define FW_REV_STR_SIZE 32
73/* Common Transport structures and definitions */ 74/* Common Transport structures and definitions */
74 75
75union CtRevisionId { 76union CtRevisionId {
@@ -2567,6 +2568,8 @@ typedef struct {
2567 2568
2568#define DMP_MEM_REG 0x1 2569#define DMP_MEM_REG 0x1
2569#define DMP_NV_PARAMS 0x2 2570#define DMP_NV_PARAMS 0x2
2571#define DMP_LMSD 0x3 /* Link Module Serial Data */
2572#define DMP_WELL_KNOWN 0x4
2570 2573
2571#define DMP_REGION_VPD 0xe 2574#define DMP_REGION_VPD 0xe
2572#define DMP_VPD_SIZE 0x400 /* maximum amount of VPD */ 2575#define DMP_VPD_SIZE 0x400 /* maximum amount of VPD */
diff --git a/drivers/scsi/lpfc/lpfc_hw4.h b/drivers/scsi/lpfc/lpfc_hw4.h
index e5bfa7f334e3..9e2b9b227e1a 100644
--- a/drivers/scsi/lpfc/lpfc_hw4.h
+++ b/drivers/scsi/lpfc/lpfc_hw4.h
@@ -321,6 +321,10 @@ struct lpfc_cqe {
321#define CQE_STATUS_CMD_REJECT 0xb 321#define CQE_STATUS_CMD_REJECT 0xb
322#define CQE_STATUS_FCP_TGT_LENCHECK 0xc 322#define CQE_STATUS_FCP_TGT_LENCHECK 0xc
323#define CQE_STATUS_NEED_BUFF_ENTRY 0xf 323#define CQE_STATUS_NEED_BUFF_ENTRY 0xf
324#define CQE_STATUS_DI_ERROR 0x16
325
326/* Used when mapping CQE status to IOCB */
327#define LPFC_IOCB_STATUS_MASK 0xf
324 328
325/* Status returned by hardware (valid only if status = CQE_STATUS_SUCCESS). */ 329/* Status returned by hardware (valid only if status = CQE_STATUS_SUCCESS). */
326#define CQE_HW_STATUS_NO_ERR 0x0 330#define CQE_HW_STATUS_NO_ERR 0x0
@@ -348,6 +352,21 @@ struct lpfc_wcqe_complete {
348#define lpfc_wcqe_c_hw_status_WORD word0 352#define lpfc_wcqe_c_hw_status_WORD word0
349 uint32_t total_data_placed; 353 uint32_t total_data_placed;
350 uint32_t parameter; 354 uint32_t parameter;
355#define lpfc_wcqe_c_bg_edir_SHIFT 5
356#define lpfc_wcqe_c_bg_edir_MASK 0x00000001
357#define lpfc_wcqe_c_bg_edir_WORD parameter
358#define lpfc_wcqe_c_bg_tdpv_SHIFT 3
359#define lpfc_wcqe_c_bg_tdpv_MASK 0x00000001
360#define lpfc_wcqe_c_bg_tdpv_WORD parameter
361#define lpfc_wcqe_c_bg_re_SHIFT 2
362#define lpfc_wcqe_c_bg_re_MASK 0x00000001
363#define lpfc_wcqe_c_bg_re_WORD parameter
364#define lpfc_wcqe_c_bg_ae_SHIFT 1
365#define lpfc_wcqe_c_bg_ae_MASK 0x00000001
366#define lpfc_wcqe_c_bg_ae_WORD parameter
367#define lpfc_wcqe_c_bg_ge_SHIFT 0
368#define lpfc_wcqe_c_bg_ge_MASK 0x00000001
369#define lpfc_wcqe_c_bg_ge_WORD parameter
351 uint32_t word3; 370 uint32_t word3;
352#define lpfc_wcqe_c_valid_SHIFT lpfc_cqe_valid_SHIFT 371#define lpfc_wcqe_c_valid_SHIFT lpfc_cqe_valid_SHIFT
353#define lpfc_wcqe_c_valid_MASK lpfc_cqe_valid_MASK 372#define lpfc_wcqe_c_valid_MASK lpfc_cqe_valid_MASK
@@ -359,8 +378,8 @@ struct lpfc_wcqe_complete {
359#define lpfc_wcqe_c_pv_MASK 0x00000001 378#define lpfc_wcqe_c_pv_MASK 0x00000001
360#define lpfc_wcqe_c_pv_WORD word3 379#define lpfc_wcqe_c_pv_WORD word3
361#define lpfc_wcqe_c_priority_SHIFT 24 380#define lpfc_wcqe_c_priority_SHIFT 24
362#define lpfc_wcqe_c_priority_MASK 0x00000007 381#define lpfc_wcqe_c_priority_MASK 0x00000007
363#define lpfc_wcqe_c_priority_WORD word3 382#define lpfc_wcqe_c_priority_WORD word3
364#define lpfc_wcqe_c_code_SHIFT lpfc_cqe_code_SHIFT 383#define lpfc_wcqe_c_code_SHIFT lpfc_cqe_code_SHIFT
365#define lpfc_wcqe_c_code_MASK lpfc_cqe_code_MASK 384#define lpfc_wcqe_c_code_MASK lpfc_cqe_code_MASK
366#define lpfc_wcqe_c_code_WORD lpfc_cqe_code_WORD 385#define lpfc_wcqe_c_code_WORD lpfc_cqe_code_WORD
@@ -715,12 +734,20 @@ struct lpfc_register {
715#define lpfc_eqcq_doorbell_eqci_SHIFT 9 734#define lpfc_eqcq_doorbell_eqci_SHIFT 9
716#define lpfc_eqcq_doorbell_eqci_MASK 0x0001 735#define lpfc_eqcq_doorbell_eqci_MASK 0x0001
717#define lpfc_eqcq_doorbell_eqci_WORD word0 736#define lpfc_eqcq_doorbell_eqci_WORD word0
718#define lpfc_eqcq_doorbell_cqid_SHIFT 0 737#define lpfc_eqcq_doorbell_cqid_lo_SHIFT 0
719#define lpfc_eqcq_doorbell_cqid_MASK 0x03FF 738#define lpfc_eqcq_doorbell_cqid_lo_MASK 0x03FF
720#define lpfc_eqcq_doorbell_cqid_WORD word0 739#define lpfc_eqcq_doorbell_cqid_lo_WORD word0
721#define lpfc_eqcq_doorbell_eqid_SHIFT 0 740#define lpfc_eqcq_doorbell_cqid_hi_SHIFT 11
722#define lpfc_eqcq_doorbell_eqid_MASK 0x01FF 741#define lpfc_eqcq_doorbell_cqid_hi_MASK 0x001F
723#define lpfc_eqcq_doorbell_eqid_WORD word0 742#define lpfc_eqcq_doorbell_cqid_hi_WORD word0
743#define lpfc_eqcq_doorbell_eqid_lo_SHIFT 0
744#define lpfc_eqcq_doorbell_eqid_lo_MASK 0x01FF
745#define lpfc_eqcq_doorbell_eqid_lo_WORD word0
746#define lpfc_eqcq_doorbell_eqid_hi_SHIFT 11
747#define lpfc_eqcq_doorbell_eqid_hi_MASK 0x001F
748#define lpfc_eqcq_doorbell_eqid_hi_WORD word0
749#define LPFC_CQID_HI_FIELD_SHIFT 10
750#define LPFC_EQID_HI_FIELD_SHIFT 9
724 751
725#define LPFC_BMBX 0x0160 752#define LPFC_BMBX 0x0160
726#define lpfc_bmbx_addr_SHIFT 2 753#define lpfc_bmbx_addr_SHIFT 2
@@ -3313,7 +3340,11 @@ struct xmit_bls_rsp64_wqe {
3313 uint32_t rsrvd4; 3340 uint32_t rsrvd4;
3314 struct wqe_did wqe_dest; 3341 struct wqe_did wqe_dest;
3315 struct wqe_common wqe_com; /* words 6-11 */ 3342 struct wqe_common wqe_com; /* words 6-11 */
3316 uint32_t rsvd_12_15[4]; 3343 uint32_t word12;
3344#define xmit_bls_rsp64_temprpi_SHIFT 0
3345#define xmit_bls_rsp64_temprpi_MASK 0x0000ffff
3346#define xmit_bls_rsp64_temprpi_WORD word12
3347 uint32_t rsvd_13_15[3];
3317}; 3348};
3318 3349
3319struct wqe_rctl_dfctl { 3350struct wqe_rctl_dfctl {
diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c
index dfea2dada02c..b38f99f3be32 100644
--- a/drivers/scsi/lpfc/lpfc_init.c
+++ b/drivers/scsi/lpfc/lpfc_init.c
@@ -32,6 +32,7 @@
32#include <linux/aer.h> 32#include <linux/aer.h>
33#include <linux/slab.h> 33#include <linux/slab.h>
34#include <linux/firmware.h> 34#include <linux/firmware.h>
35#include <linux/miscdevice.h>
35 36
36#include <scsi/scsi.h> 37#include <scsi/scsi.h>
37#include <scsi/scsi_device.h> 38#include <scsi/scsi_device.h>
@@ -1474,8 +1475,12 @@ lpfc_handle_eratt_s4(struct lpfc_hba *phba)
1474 phba->sli4_hba.u.if_type2.STATUSregaddr, 1475 phba->sli4_hba.u.if_type2.STATUSregaddr,
1475 &portstat_reg.word0); 1476 &portstat_reg.word0);
1476 /* consider PCI bus read error as pci_channel_offline */ 1477 /* consider PCI bus read error as pci_channel_offline */
1477 if (pci_rd_rc1 == -EIO) 1478 if (pci_rd_rc1 == -EIO) {
1479 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
1480 "3151 PCI bus read access failure: x%x\n",
1481 readl(phba->sli4_hba.u.if_type2.STATUSregaddr));
1478 return; 1482 return;
1483 }
1479 reg_err1 = readl(phba->sli4_hba.u.if_type2.ERR1regaddr); 1484 reg_err1 = readl(phba->sli4_hba.u.if_type2.ERR1regaddr);
1480 reg_err2 = readl(phba->sli4_hba.u.if_type2.ERR2regaddr); 1485 reg_err2 = readl(phba->sli4_hba.u.if_type2.ERR2regaddr);
1481 if (bf_get(lpfc_sliport_status_oti, &portstat_reg)) { 1486 if (bf_get(lpfc_sliport_status_oti, &portstat_reg)) {
@@ -1525,6 +1530,9 @@ lpfc_handle_eratt_s4(struct lpfc_hba *phba)
1525 } 1530 }
1526 /* fall through for not able to recover */ 1531 /* fall through for not able to recover */
1527 } 1532 }
1533 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
1534 "3152 Unrecoverable error, bring the port "
1535 "offline\n");
1528 lpfc_sli4_offline_eratt(phba); 1536 lpfc_sli4_offline_eratt(phba);
1529 break; 1537 break;
1530 case LPFC_SLI_INTF_IF_TYPE_1: 1538 case LPFC_SLI_INTF_IF_TYPE_1:
@@ -2333,13 +2341,20 @@ lpfc_cleanup(struct lpfc_vport *vport)
2333 continue; 2341 continue;
2334 } 2342 }
2335 2343
2344 /* take care of nodes in unused state before the state
2345 * machine taking action.
2346 */
2347 if (ndlp->nlp_state == NLP_STE_UNUSED_NODE) {
2348 lpfc_nlp_put(ndlp);
2349 continue;
2350 }
2351
2336 if (ndlp->nlp_type & NLP_FABRIC) 2352 if (ndlp->nlp_type & NLP_FABRIC)
2337 lpfc_disc_state_machine(vport, ndlp, NULL, 2353 lpfc_disc_state_machine(vport, ndlp, NULL,
2338 NLP_EVT_DEVICE_RECOVERY); 2354 NLP_EVT_DEVICE_RECOVERY);
2339 2355
2340 lpfc_disc_state_machine(vport, ndlp, NULL, 2356 lpfc_disc_state_machine(vport, ndlp, NULL,
2341 NLP_EVT_DEVICE_RM); 2357 NLP_EVT_DEVICE_RM);
2342
2343 } 2358 }
2344 2359
2345 /* At this point, ALL ndlp's should be gone 2360 /* At this point, ALL ndlp's should be gone
@@ -2513,6 +2528,42 @@ lpfc_block_mgmt_io(struct lpfc_hba * phba)
2513} 2528}
2514 2529
2515/** 2530/**
2531 * lpfc_sli4_node_prep - Assign RPIs for active nodes.
2532 * @phba: pointer to lpfc hba data structure.
2533 *
2534 * Allocate RPIs for all active remote nodes. This is needed whenever
2535 * an SLI4 adapter is reset and the driver is not unloading. Its purpose
2536 * is to fixup the temporary rpi assignments.
2537 **/
2538void
2539lpfc_sli4_node_prep(struct lpfc_hba *phba)
2540{
2541 struct lpfc_nodelist *ndlp, *next_ndlp;
2542 struct lpfc_vport **vports;
2543 int i;
2544
2545 if (phba->sli_rev != LPFC_SLI_REV4)
2546 return;
2547
2548 vports = lpfc_create_vport_work_array(phba);
2549 if (vports != NULL) {
2550 for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) {
2551 if (vports[i]->load_flag & FC_UNLOADING)
2552 continue;
2553
2554 list_for_each_entry_safe(ndlp, next_ndlp,
2555 &vports[i]->fc_nodes,
2556 nlp_listp) {
2557 if (NLP_CHK_NODE_ACT(ndlp))
2558 ndlp->nlp_rpi =
2559 lpfc_sli4_alloc_rpi(phba);
2560 }
2561 }
2562 }
2563 lpfc_destroy_vport_work_array(phba, vports);
2564}
2565
2566/**
2516 * lpfc_online - Initialize and bring a HBA online 2567 * lpfc_online - Initialize and bring a HBA online
2517 * @phba: pointer to lpfc hba data structure. 2568 * @phba: pointer to lpfc hba data structure.
2518 * 2569 *
@@ -2653,6 +2704,15 @@ lpfc_offline_prep(struct lpfc_hba * phba)
2653 } 2704 }
2654 spin_lock_irq(shost->host_lock); 2705 spin_lock_irq(shost->host_lock);
2655 ndlp->nlp_flag &= ~NLP_NPR_ADISC; 2706 ndlp->nlp_flag &= ~NLP_NPR_ADISC;
2707
2708 /*
2709 * Whenever an SLI4 port goes offline, free the
2710 * RPI. A new RPI when the adapter port comes
2711 * back online.
2712 */
2713 if (phba->sli_rev == LPFC_SLI_REV4)
2714 lpfc_sli4_free_rpi(phba, ndlp->nlp_rpi);
2715
2656 spin_unlock_irq(shost->host_lock); 2716 spin_unlock_irq(shost->host_lock);
2657 lpfc_unreg_rpi(vports[i], ndlp); 2717 lpfc_unreg_rpi(vports[i], ndlp);
2658 } 2718 }
@@ -4327,6 +4387,7 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba)
4327 uint8_t pn_page[LPFC_MAX_SUPPORTED_PAGES] = {0}; 4387 uint8_t pn_page[LPFC_MAX_SUPPORTED_PAGES] = {0};
4328 struct lpfc_mqe *mqe; 4388 struct lpfc_mqe *mqe;
4329 int longs, sli_family; 4389 int longs, sli_family;
4390 int sges_per_segment;
4330 4391
4331 /* Before proceed, wait for POST done and device ready */ 4392 /* Before proceed, wait for POST done and device ready */
4332 rc = lpfc_sli4_post_status_check(phba); 4393 rc = lpfc_sli4_post_status_check(phba);
@@ -4390,6 +4451,11 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba)
4390 phba->fc_map[1] = LPFC_FCOE_FCF_MAP1; 4451 phba->fc_map[1] = LPFC_FCOE_FCF_MAP1;
4391 phba->fc_map[2] = LPFC_FCOE_FCF_MAP2; 4452 phba->fc_map[2] = LPFC_FCOE_FCF_MAP2;
4392 4453
4454 /* With BlockGuard we can have multiple SGEs per Data Segemnt */
4455 sges_per_segment = 1;
4456 if (phba->cfg_enable_bg)
4457 sges_per_segment = 2;
4458
4393 /* 4459 /*
4394 * Since the sg_tablesize is module parameter, the sg_dma_buf_size 4460 * Since the sg_tablesize is module parameter, the sg_dma_buf_size
4395 * used to create the sg_dma_buf_pool must be dynamically calculated. 4461 * used to create the sg_dma_buf_pool must be dynamically calculated.
@@ -4398,7 +4464,8 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba)
4398 * sgl sizes of must be a power of 2. 4464 * sgl sizes of must be a power of 2.
4399 */ 4465 */
4400 buf_size = (sizeof(struct fcp_cmnd) + sizeof(struct fcp_rsp) + 4466 buf_size = (sizeof(struct fcp_cmnd) + sizeof(struct fcp_rsp) +
4401 ((phba->cfg_sg_seg_cnt + 2) * sizeof(struct sli4_sge))); 4467 (((phba->cfg_sg_seg_cnt * sges_per_segment) + 2) *
4468 sizeof(struct sli4_sge)));
4402 4469
4403 sli_family = bf_get(lpfc_sli_intf_sli_family, &phba->sli4_hba.sli_intf); 4470 sli_family = bf_get(lpfc_sli_intf_sli_family, &phba->sli4_hba.sli_intf);
4404 max_buf_size = LPFC_SLI4_MAX_BUF_SIZE; 4471 max_buf_size = LPFC_SLI4_MAX_BUF_SIZE;
@@ -4415,6 +4482,7 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba)
4415 default: 4482 default:
4416 break; 4483 break;
4417 } 4484 }
4485
4418 for (dma_buf_size = LPFC_SLI4_MIN_BUF_SIZE; 4486 for (dma_buf_size = LPFC_SLI4_MIN_BUF_SIZE;
4419 dma_buf_size < max_buf_size && buf_size > dma_buf_size; 4487 dma_buf_size < max_buf_size && buf_size > dma_buf_size;
4420 dma_buf_size = dma_buf_size << 1) 4488 dma_buf_size = dma_buf_size << 1)
@@ -7223,19 +7291,17 @@ lpfc_pci_function_reset(struct lpfc_hba *phba)
7223 rc = -ENODEV; 7291 rc = -ENODEV;
7224 goto out; 7292 goto out;
7225 } 7293 }
7226 if (bf_get(lpfc_sliport_status_rdy, &reg_data)) 7294 if (bf_get(lpfc_sliport_status_rn, &reg_data))
7227 break;
7228 if (bf_get(lpfc_sliport_status_rn, &reg_data)) {
7229 reset_again++; 7295 reset_again++;
7296 if (bf_get(lpfc_sliport_status_rdy, &reg_data))
7230 break; 7297 break;
7231 }
7232 } 7298 }
7233 7299
7234 /* 7300 /*
7235 * If the port responds to the init request with 7301 * If the port responds to the init request with
7236 * reset needed, delay for a bit and restart the loop. 7302 * reset needed, delay for a bit and restart the loop.
7237 */ 7303 */
7238 if (reset_again) { 7304 if (reset_again && (rdy_chk < 1000)) {
7239 msleep(10); 7305 msleep(10);
7240 reset_again = 0; 7306 reset_again = 0;
7241 continue; 7307 continue;
@@ -8112,6 +8178,9 @@ lpfc_unset_hba(struct lpfc_hba *phba)
8112 vport->load_flag |= FC_UNLOADING; 8178 vport->load_flag |= FC_UNLOADING;
8113 spin_unlock_irq(shost->host_lock); 8179 spin_unlock_irq(shost->host_lock);
8114 8180
8181 kfree(phba->vpi_bmask);
8182 kfree(phba->vpi_ids);
8183
8115 lpfc_stop_hba_timers(phba); 8184 lpfc_stop_hba_timers(phba);
8116 8185
8117 phba->pport->work_port_events = 0; 8186 phba->pport->work_port_events = 0;
@@ -8644,6 +8713,9 @@ lpfc_pci_remove_one_s3(struct pci_dev *pdev)
8644 /* Final cleanup of txcmplq and reset the HBA */ 8713 /* Final cleanup of txcmplq and reset the HBA */
8645 lpfc_sli_brdrestart(phba); 8714 lpfc_sli_brdrestart(phba);
8646 8715
8716 kfree(phba->vpi_bmask);
8717 kfree(phba->vpi_ids);
8718
8647 lpfc_stop_hba_timers(phba); 8719 lpfc_stop_hba_timers(phba);
8648 spin_lock_irq(&phba->hbalock); 8720 spin_lock_irq(&phba->hbalock);
8649 list_del_init(&vport->listentry); 8721 list_del_init(&vport->listentry);
@@ -9058,7 +9130,7 @@ lpfc_sli4_get_els_iocb_cnt(struct lpfc_hba *phba)
9058int 9130int
9059lpfc_write_firmware(struct lpfc_hba *phba, const struct firmware *fw) 9131lpfc_write_firmware(struct lpfc_hba *phba, const struct firmware *fw)
9060{ 9132{
9061 char fwrev[32]; 9133 char fwrev[FW_REV_STR_SIZE];
9062 struct lpfc_grp_hdr *image = (struct lpfc_grp_hdr *)fw->data; 9134 struct lpfc_grp_hdr *image = (struct lpfc_grp_hdr *)fw->data;
9063 struct list_head dma_buffer_list; 9135 struct list_head dma_buffer_list;
9064 int i, rc = 0; 9136 int i, rc = 0;
@@ -10012,6 +10084,36 @@ lpfc_io_resume(struct pci_dev *pdev)
10012 return; 10084 return;
10013} 10085}
10014 10086
10087/**
10088 * lpfc_mgmt_open - method called when 'lpfcmgmt' is opened from userspace
10089 * @inode: pointer to the inode representing the lpfcmgmt device
10090 * @filep: pointer to the file representing the open lpfcmgmt device
10091 *
10092 * This routine puts a reference count on the lpfc module whenever the
10093 * character device is opened
10094 **/
10095static int
10096lpfc_mgmt_open(struct inode *inode, struct file *filep)
10097{
10098 try_module_get(THIS_MODULE);
10099 return 0;
10100}
10101
10102/**
10103 * lpfc_mgmt_release - method called when 'lpfcmgmt' is closed in userspace
10104 * @inode: pointer to the inode representing the lpfcmgmt device
10105 * @filep: pointer to the file representing the open lpfcmgmt device
10106 *
10107 * This routine removes a reference count from the lpfc module when the
10108 * character device is closed
10109 **/
10110static int
10111lpfc_mgmt_release(struct inode *inode, struct file *filep)
10112{
10113 module_put(THIS_MODULE);
10114 return 0;
10115}
10116
10015static struct pci_device_id lpfc_id_table[] = { 10117static struct pci_device_id lpfc_id_table[] = {
10016 {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_VIPER, 10118 {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_VIPER,
10017 PCI_ANY_ID, PCI_ANY_ID, }, 10119 PCI_ANY_ID, PCI_ANY_ID, },
@@ -10124,6 +10226,17 @@ static struct pci_driver lpfc_driver = {
10124 .err_handler = &lpfc_err_handler, 10226 .err_handler = &lpfc_err_handler,
10125}; 10227};
10126 10228
10229static const struct file_operations lpfc_mgmt_fop = {
10230 .open = lpfc_mgmt_open,
10231 .release = lpfc_mgmt_release,
10232};
10233
10234static struct miscdevice lpfc_mgmt_dev = {
10235 .minor = MISC_DYNAMIC_MINOR,
10236 .name = "lpfcmgmt",
10237 .fops = &lpfc_mgmt_fop,
10238};
10239
10127/** 10240/**
10128 * lpfc_init - lpfc module initialization routine 10241 * lpfc_init - lpfc module initialization routine
10129 * 10242 *
@@ -10144,6 +10257,11 @@ lpfc_init(void)
10144 printk(LPFC_MODULE_DESC "\n"); 10257 printk(LPFC_MODULE_DESC "\n");
10145 printk(LPFC_COPYRIGHT "\n"); 10258 printk(LPFC_COPYRIGHT "\n");
10146 10259
10260 error = misc_register(&lpfc_mgmt_dev);
10261 if (error)
10262 printk(KERN_ERR "Could not register lpfcmgmt device, "
10263 "misc_register returned with status %d", error);
10264
10147 if (lpfc_enable_npiv) { 10265 if (lpfc_enable_npiv) {
10148 lpfc_transport_functions.vport_create = lpfc_vport_create; 10266 lpfc_transport_functions.vport_create = lpfc_vport_create;
10149 lpfc_transport_functions.vport_delete = lpfc_vport_delete; 10267 lpfc_transport_functions.vport_delete = lpfc_vport_delete;
@@ -10180,6 +10298,7 @@ lpfc_init(void)
10180static void __exit 10298static void __exit
10181lpfc_exit(void) 10299lpfc_exit(void)
10182{ 10300{
10301 misc_deregister(&lpfc_mgmt_dev);
10183 pci_unregister_driver(&lpfc_driver); 10302 pci_unregister_driver(&lpfc_driver);
10184 fc_release_transport(lpfc_transport_template); 10303 fc_release_transport(lpfc_transport_template);
10185 if (lpfc_enable_npiv) 10304 if (lpfc_enable_npiv)
diff --git a/drivers/scsi/lpfc/lpfc_nportdisc.c b/drivers/scsi/lpfc/lpfc_nportdisc.c
index e8bb00559943..7b6b2aa5795a 100644
--- a/drivers/scsi/lpfc/lpfc_nportdisc.c
+++ b/drivers/scsi/lpfc/lpfc_nportdisc.c
@@ -48,6 +48,10 @@ static int
48lpfc_check_adisc(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, 48lpfc_check_adisc(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
49 struct lpfc_name *nn, struct lpfc_name *pn) 49 struct lpfc_name *nn, struct lpfc_name *pn)
50{ 50{
51 /* First, we MUST have a RPI registered */
52 if (!(ndlp->nlp_flag & NLP_RPI_REGISTERED))
53 return 0;
54
51 /* Compare the ADISC rsp WWNN / WWPN matches our internal node 55 /* Compare the ADISC rsp WWNN / WWPN matches our internal node
52 * table entry for that node. 56 * table entry for that node.
53 */ 57 */
@@ -385,6 +389,10 @@ lpfc_rcv_plogi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
385 if (!mbox) 389 if (!mbox)
386 goto out; 390 goto out;
387 391
392 /* Registering an existing RPI behaves differently for SLI3 vs SLI4 */
393 if (phba->sli_rev == LPFC_SLI_REV4)
394 lpfc_unreg_rpi(vport, ndlp);
395
388 rc = lpfc_reg_rpi(phba, vport->vpi, icmd->un.rcvels.remoteID, 396 rc = lpfc_reg_rpi(phba, vport->vpi, icmd->un.rcvels.remoteID,
389 (uint8_t *) sp, mbox, ndlp->nlp_rpi); 397 (uint8_t *) sp, mbox, ndlp->nlp_rpi);
390 if (rc) { 398 if (rc) {
@@ -445,11 +453,43 @@ out:
445 return 0; 453 return 0;
446} 454}
447 455
456/**
457 * lpfc_mbx_cmpl_resume_rpi - Resume RPI completion routine
458 * @phba: pointer to lpfc hba data structure.
459 * @mboxq: pointer to mailbox object
460 *
461 * This routine is invoked to issue a completion to a rcv'ed
462 * ADISC or PDISC after the paused RPI has been resumed.
463 **/
464static void
465lpfc_mbx_cmpl_resume_rpi(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
466{
467 struct lpfc_vport *vport;
468 struct lpfc_iocbq *elsiocb;
469 struct lpfc_nodelist *ndlp;
470 uint32_t cmd;
471
472 elsiocb = (struct lpfc_iocbq *)mboxq->context1;
473 ndlp = (struct lpfc_nodelist *) mboxq->context2;
474 vport = mboxq->vport;
475 cmd = elsiocb->drvrTimeout;
476
477 if (cmd == ELS_CMD_ADISC) {
478 lpfc_els_rsp_adisc_acc(vport, elsiocb, ndlp);
479 } else {
480 lpfc_els_rsp_acc(vport, ELS_CMD_PLOGI, elsiocb,
481 ndlp, NULL);
482 }
483 kfree(elsiocb);
484 mempool_free(mboxq, phba->mbox_mem_pool);
485}
486
448static int 487static int
449lpfc_rcv_padisc(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, 488lpfc_rcv_padisc(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
450 struct lpfc_iocbq *cmdiocb) 489 struct lpfc_iocbq *cmdiocb)
451{ 490{
452 struct Scsi_Host *shost = lpfc_shost_from_vport(vport); 491 struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
492 struct lpfc_iocbq *elsiocb;
453 struct lpfc_dmabuf *pcmd; 493 struct lpfc_dmabuf *pcmd;
454 struct serv_parm *sp; 494 struct serv_parm *sp;
455 struct lpfc_name *pnn, *ppn; 495 struct lpfc_name *pnn, *ppn;
@@ -475,12 +515,43 @@ lpfc_rcv_padisc(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
475 515
476 icmd = &cmdiocb->iocb; 516 icmd = &cmdiocb->iocb;
477 if (icmd->ulpStatus == 0 && lpfc_check_adisc(vport, ndlp, pnn, ppn)) { 517 if (icmd->ulpStatus == 0 && lpfc_check_adisc(vport, ndlp, pnn, ppn)) {
518
519 /*
520 * As soon as we send ACC, the remote NPort can
521 * start sending us data. Thus, for SLI4 we must
522 * resume the RPI before the ACC goes out.
523 */
524 if (vport->phba->sli_rev == LPFC_SLI_REV4) {
525 elsiocb = kmalloc(sizeof(struct lpfc_iocbq),
526 GFP_KERNEL);
527 if (elsiocb) {
528
529 /* Save info from cmd IOCB used in rsp */
530 memcpy((uint8_t *)elsiocb, (uint8_t *)cmdiocb,
531 sizeof(struct lpfc_iocbq));
532
533 /* Save the ELS cmd */
534 elsiocb->drvrTimeout = cmd;
535
536 lpfc_sli4_resume_rpi(ndlp,
537 lpfc_mbx_cmpl_resume_rpi, elsiocb);
538 goto out;
539 }
540 }
541
478 if (cmd == ELS_CMD_ADISC) { 542 if (cmd == ELS_CMD_ADISC) {
479 lpfc_els_rsp_adisc_acc(vport, cmdiocb, ndlp); 543 lpfc_els_rsp_adisc_acc(vport, cmdiocb, ndlp);
480 } else { 544 } else {
481 lpfc_els_rsp_acc(vport, ELS_CMD_PLOGI, cmdiocb, ndlp, 545 lpfc_els_rsp_acc(vport, ELS_CMD_PLOGI, cmdiocb,
482 NULL); 546 ndlp, NULL);
483 } 547 }
548out:
549 /* If we are authenticated, move to the proper state */
550 if (ndlp->nlp_type & NLP_FCP_TARGET)
551 lpfc_nlp_set_state(vport, ndlp, NLP_STE_MAPPED_NODE);
552 else
553 lpfc_nlp_set_state(vport, ndlp, NLP_STE_UNMAPPED_NODE);
554
484 return 1; 555 return 1;
485 } 556 }
486 /* Reject this request because invalid parameters */ 557 /* Reject this request because invalid parameters */
@@ -1229,7 +1300,7 @@ lpfc_cmpl_adisc_adisc_issue(struct lpfc_vport *vport,
1229 } 1300 }
1230 1301
1231 if (phba->sli_rev == LPFC_SLI_REV4) { 1302 if (phba->sli_rev == LPFC_SLI_REV4) {
1232 rc = lpfc_sli4_resume_rpi(ndlp); 1303 rc = lpfc_sli4_resume_rpi(ndlp, NULL, NULL);
1233 if (rc) { 1304 if (rc) {
1234 /* Stay in state and retry. */ 1305 /* Stay in state and retry. */
1235 ndlp->nlp_prev_state = NLP_STE_ADISC_ISSUE; 1306 ndlp->nlp_prev_state = NLP_STE_ADISC_ISSUE;
diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c
index c60f5d0b3869..efc055b6bac4 100644
--- a/drivers/scsi/lpfc/lpfc_scsi.c
+++ b/drivers/scsi/lpfc/lpfc_scsi.c
@@ -1,7 +1,7 @@
1/******************************************************************* 1/*******************************************************************
2 * This file is part of the Emulex Linux Device Driver for * 2 * This file is part of the Emulex Linux Device Driver for *
3 * Fibre Channel Host Bus Adapters. * 3 * Fibre Channel Host Bus Adapters. *
4 * Copyright (C) 2004-2011 Emulex. All rights reserved. * 4 * Copyright (C) 2004-2012 Emulex. All rights reserved. *
5 * EMULEX and SLI are trademarks of Emulex. * 5 * EMULEX and SLI are trademarks of Emulex. *
6 * www.emulex.com * 6 * www.emulex.com *
7 * Portions Copyright (C) 2004-2005 Christoph Hellwig * 7 * Portions Copyright (C) 2004-2005 Christoph Hellwig *
@@ -1280,31 +1280,45 @@ lpfc_cmd_blksize(struct scsi_cmnd *sc)
1280} 1280}
1281 1281
1282#ifdef CONFIG_SCSI_LPFC_DEBUG_FS 1282#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
1283/* 1283
1284 * Given a scsi cmnd, determine the BlockGuard tags to be used with it 1284#define BG_ERR_INIT 1
1285#define BG_ERR_TGT 2
1286#define BG_ERR_SWAP 3
1287#define BG_ERR_CHECK 4
1288
1289/**
1290 * lpfc_bg_err_inject - Determine if we should inject an error
1291 * @phba: The Hba for which this call is being executed.
1285 * @sc: The SCSI command to examine 1292 * @sc: The SCSI command to examine
1286 * @reftag: (out) BlockGuard reference tag for transmitted data 1293 * @reftag: (out) BlockGuard reference tag for transmitted data
1287 * @apptag: (out) BlockGuard application tag for transmitted data 1294 * @apptag: (out) BlockGuard application tag for transmitted data
1288 * @new_guard (in) Value to replace CRC with if needed 1295 * @new_guard (in) Value to replace CRC with if needed
1289 * 1296 *
1290 * Returns (1) if error injection was performed, (0) otherwise 1297 * Returns (1) if error injection is detected by Initiator
1291 */ 1298 * Returns (2) if error injection is detected by Target
1299 * Returns (3) if swapping CSUM->CRC is required for error injection
1300 * Returns (4) disabling Guard/Ref/App checking is required for error injection
1301 **/
1292static int 1302static int
1293lpfc_bg_err_inject(struct lpfc_hba *phba, struct scsi_cmnd *sc, 1303lpfc_bg_err_inject(struct lpfc_hba *phba, struct scsi_cmnd *sc,
1294 uint32_t *reftag, uint16_t *apptag, uint32_t new_guard) 1304 uint32_t *reftag, uint16_t *apptag, uint32_t new_guard)
1295{ 1305{
1296 struct scatterlist *sgpe; /* s/g prot entry */ 1306 struct scatterlist *sgpe; /* s/g prot entry */
1297 struct scatterlist *sgde; /* s/g data entry */ 1307 struct scatterlist *sgde; /* s/g data entry */
1298 struct scsi_dif_tuple *src; 1308 struct scsi_dif_tuple *src = NULL;
1299 uint32_t op = scsi_get_prot_op(sc); 1309 uint32_t op = scsi_get_prot_op(sc);
1300 uint32_t blksize; 1310 uint32_t blksize;
1301 uint32_t numblks; 1311 uint32_t numblks;
1302 sector_t lba; 1312 sector_t lba;
1303 int rc = 0; 1313 int rc = 0;
1314 int blockoff = 0;
1304 1315
1305 if (op == SCSI_PROT_NORMAL) 1316 if (op == SCSI_PROT_NORMAL)
1306 return 0; 1317 return 0;
1307 1318
1319 sgpe = scsi_prot_sglist(sc);
1320 sgde = scsi_sglist(sc);
1321
1308 lba = scsi_get_lba(sc); 1322 lba = scsi_get_lba(sc);
1309 if (phba->lpfc_injerr_lba != LPFC_INJERR_LBA_OFF) { 1323 if (phba->lpfc_injerr_lba != LPFC_INJERR_LBA_OFF) {
1310 blksize = lpfc_cmd_blksize(sc); 1324 blksize = lpfc_cmd_blksize(sc);
@@ -1314,142 +1328,296 @@ lpfc_bg_err_inject(struct lpfc_hba *phba, struct scsi_cmnd *sc,
1314 if ((phba->lpfc_injerr_lba < lba) || 1328 if ((phba->lpfc_injerr_lba < lba) ||
1315 (phba->lpfc_injerr_lba >= (lba + numblks))) 1329 (phba->lpfc_injerr_lba >= (lba + numblks)))
1316 return 0; 1330 return 0;
1331 if (sgpe) {
1332 blockoff = phba->lpfc_injerr_lba - lba;
1333 numblks = sg_dma_len(sgpe) /
1334 sizeof(struct scsi_dif_tuple);
1335 if (numblks < blockoff)
1336 blockoff = numblks;
1337 src = (struct scsi_dif_tuple *)sg_virt(sgpe);
1338 src += blockoff;
1339 }
1317 } 1340 }
1318 1341
1319 sgpe = scsi_prot_sglist(sc);
1320 sgde = scsi_sglist(sc);
1321
1322 /* Should we change the Reference Tag */ 1342 /* Should we change the Reference Tag */
1323 if (reftag) { 1343 if (reftag) {
1324 /* 1344 if (phba->lpfc_injerr_wref_cnt) {
1325 * If we are SCSI_PROT_WRITE_STRIP, the protection data is 1345 switch (op) {
1326 * being stripped from the wire, thus it doesn't matter. 1346 case SCSI_PROT_WRITE_PASS:
1327 */ 1347 if (blockoff && src) {
1328 if ((op == SCSI_PROT_WRITE_PASS) || 1348 /* Insert error in middle of the IO */
1329 (op == SCSI_PROT_WRITE_INSERT)) { 1349
1330 if (phba->lpfc_injerr_wref_cnt) { 1350 lpfc_printf_log(phba, KERN_ERR, LOG_BG,
1351 "9076 BLKGRD: Injecting reftag error: "
1352 "write lba x%lx + x%x oldrefTag x%x\n",
1353 (unsigned long)lba, blockoff,
1354 src->ref_tag);
1355
1356 /*
1357 * NOTE, this will change ref tag in
1358 * the memory location forever!
1359 */
1360 src->ref_tag = 0xDEADBEEF;
1361 phba->lpfc_injerr_wref_cnt--;
1362 phba->lpfc_injerr_lba =
1363 LPFC_INJERR_LBA_OFF;
1364 rc = BG_ERR_CHECK;
1365 break;
1366 }
1367 /* Drop thru */
1368 case SCSI_PROT_WRITE_STRIP:
1369 /*
1370 * For WRITE_STRIP and WRITE_PASS,
1371 * force the error on data
1372 * being copied from SLI-Host to SLI-Port.
1373 */
1374 *reftag = 0xDEADBEEF;
1375 phba->lpfc_injerr_wref_cnt--;
1376 phba->lpfc_injerr_lba = LPFC_INJERR_LBA_OFF;
1377 rc = BG_ERR_INIT;
1331 1378
1379 lpfc_printf_log(phba, KERN_ERR, LOG_BG,
1380 "9077 BLKGRD: Injecting reftag error: "
1381 "write lba x%lx\n", (unsigned long)lba);
1382 break;
1383 case SCSI_PROT_WRITE_INSERT:
1384 /*
1385 * For WRITE_INSERT, force the
1386 * error to be sent on the wire. It should be
1387 * detected by the Target.
1388 */
1332 /* DEADBEEF will be the reftag on the wire */ 1389 /* DEADBEEF will be the reftag on the wire */
1333 *reftag = 0xDEADBEEF; 1390 *reftag = 0xDEADBEEF;
1334 phba->lpfc_injerr_wref_cnt--; 1391 phba->lpfc_injerr_wref_cnt--;
1335 phba->lpfc_injerr_lba = LPFC_INJERR_LBA_OFF; 1392 phba->lpfc_injerr_lba = LPFC_INJERR_LBA_OFF;
1336 rc = 1; 1393 rc = BG_ERR_TGT;
1337 1394
1338 lpfc_printf_log(phba, KERN_ERR, LOG_BG, 1395 lpfc_printf_log(phba, KERN_ERR, LOG_BG,
1339 "9081 BLKGRD: Injecting reftag error: " 1396 "9078 BLKGRD: Injecting reftag error: "
1340 "write lba x%lx\n", (unsigned long)lba); 1397 "write lba x%lx\n", (unsigned long)lba);
1398 break;
1341 } 1399 }
1342 } else { 1400 }
1343 if (phba->lpfc_injerr_rref_cnt) { 1401 if (phba->lpfc_injerr_rref_cnt) {
1402 switch (op) {
1403 case SCSI_PROT_READ_INSERT:
1404 /*
1405 * For READ_INSERT, it doesn't make sense
1406 * to change the reftag.
1407 */
1408 break;
1409 case SCSI_PROT_READ_STRIP:
1410 case SCSI_PROT_READ_PASS:
1411 /*
1412 * For READ_STRIP and READ_PASS, force the
1413 * error on data being read off the wire. It
1414 * should force an IO error to the driver.
1415 */
1344 *reftag = 0xDEADBEEF; 1416 *reftag = 0xDEADBEEF;
1345 phba->lpfc_injerr_rref_cnt--; 1417 phba->lpfc_injerr_rref_cnt--;
1346 phba->lpfc_injerr_lba = LPFC_INJERR_LBA_OFF; 1418 phba->lpfc_injerr_lba = LPFC_INJERR_LBA_OFF;
1347 rc = 1; 1419 rc = BG_ERR_INIT;
1348 1420
1349 lpfc_printf_log(phba, KERN_ERR, LOG_BG, 1421 lpfc_printf_log(phba, KERN_ERR, LOG_BG,
1350 "9076 BLKGRD: Injecting reftag error: " 1422 "9079 BLKGRD: Injecting reftag error: "
1351 "read lba x%lx\n", (unsigned long)lba); 1423 "read lba x%lx\n", (unsigned long)lba);
1424 break;
1352 } 1425 }
1353 } 1426 }
1354 } 1427 }
1355 1428
1356 /* Should we change the Application Tag */ 1429 /* Should we change the Application Tag */
1357 if (apptag) { 1430 if (apptag) {
1358 /* 1431 if (phba->lpfc_injerr_wapp_cnt) {
1359 * If we are SCSI_PROT_WRITE_STRIP, the protection data is 1432 switch (op) {
1360 * being stripped from the wire, thus it doesn't matter. 1433 case SCSI_PROT_WRITE_PASS:
1361 */ 1434 if (blockoff && src) {
1362 if ((op == SCSI_PROT_WRITE_PASS) || 1435 /* Insert error in middle of the IO */
1363 (op == SCSI_PROT_WRITE_INSERT)) { 1436
1364 if (phba->lpfc_injerr_wapp_cnt) { 1437 lpfc_printf_log(phba, KERN_ERR, LOG_BG,
1438 "9080 BLKGRD: Injecting apptag error: "
1439 "write lba x%lx + x%x oldappTag x%x\n",
1440 (unsigned long)lba, blockoff,
1441 src->app_tag);
1365 1442
1443 /*
1444 * NOTE, this will change app tag in
1445 * the memory location forever!
1446 */
1447 src->app_tag = 0xDEAD;
1448 phba->lpfc_injerr_wapp_cnt--;
1449 phba->lpfc_injerr_lba =
1450 LPFC_INJERR_LBA_OFF;
1451 rc = BG_ERR_CHECK;
1452 break;
1453 }
1454 /* Drop thru */
1455 case SCSI_PROT_WRITE_STRIP:
1456 /*
1457 * For WRITE_STRIP and WRITE_PASS,
1458 * force the error on data
1459 * being copied from SLI-Host to SLI-Port.
1460 */
1461 *apptag = 0xDEAD;
1462 phba->lpfc_injerr_wapp_cnt--;
1463 phba->lpfc_injerr_lba = LPFC_INJERR_LBA_OFF;
1464 rc = BG_ERR_INIT;
1465
1466 lpfc_printf_log(phba, KERN_ERR, LOG_BG,
1467 "0812 BLKGRD: Injecting apptag error: "
1468 "write lba x%lx\n", (unsigned long)lba);
1469 break;
1470 case SCSI_PROT_WRITE_INSERT:
1471 /*
1472 * For WRITE_INSERT, force the
1473 * error to be sent on the wire. It should be
1474 * detected by the Target.
1475 */
1366 /* DEAD will be the apptag on the wire */ 1476 /* DEAD will be the apptag on the wire */
1367 *apptag = 0xDEAD; 1477 *apptag = 0xDEAD;
1368 phba->lpfc_injerr_wapp_cnt--; 1478 phba->lpfc_injerr_wapp_cnt--;
1369 phba->lpfc_injerr_lba = LPFC_INJERR_LBA_OFF; 1479 phba->lpfc_injerr_lba = LPFC_INJERR_LBA_OFF;
1370 rc = 1; 1480 rc = BG_ERR_TGT;
1371 1481
1372 lpfc_printf_log(phba, KERN_ERR, LOG_BG, 1482 lpfc_printf_log(phba, KERN_ERR, LOG_BG,
1373 "9077 BLKGRD: Injecting apptag error: " 1483 "0813 BLKGRD: Injecting apptag error: "
1374 "write lba x%lx\n", (unsigned long)lba); 1484 "write lba x%lx\n", (unsigned long)lba);
1485 break;
1375 } 1486 }
1376 } else { 1487 }
1377 if (phba->lpfc_injerr_rapp_cnt) { 1488 if (phba->lpfc_injerr_rapp_cnt) {
1489 switch (op) {
1490 case SCSI_PROT_READ_INSERT:
1491 /*
1492 * For READ_INSERT, it doesn't make sense
1493 * to change the apptag.
1494 */
1495 break;
1496 case SCSI_PROT_READ_STRIP:
1497 case SCSI_PROT_READ_PASS:
1498 /*
1499 * For READ_STRIP and READ_PASS, force the
1500 * error on data being read off the wire. It
1501 * should force an IO error to the driver.
1502 */
1378 *apptag = 0xDEAD; 1503 *apptag = 0xDEAD;
1379 phba->lpfc_injerr_rapp_cnt--; 1504 phba->lpfc_injerr_rapp_cnt--;
1380 phba->lpfc_injerr_lba = LPFC_INJERR_LBA_OFF; 1505 phba->lpfc_injerr_lba = LPFC_INJERR_LBA_OFF;
1381 rc = 1; 1506 rc = BG_ERR_INIT;
1382 1507
1383 lpfc_printf_log(phba, KERN_ERR, LOG_BG, 1508 lpfc_printf_log(phba, KERN_ERR, LOG_BG,
1384 "9078 BLKGRD: Injecting apptag error: " 1509 "0814 BLKGRD: Injecting apptag error: "
1385 "read lba x%lx\n", (unsigned long)lba); 1510 "read lba x%lx\n", (unsigned long)lba);
1511 break;
1386 } 1512 }
1387 } 1513 }
1388 } 1514 }
1389 1515
1516
1390 /* Should we change the Guard Tag */ 1517 /* Should we change the Guard Tag */
1518 if (new_guard) {
1519 if (phba->lpfc_injerr_wgrd_cnt) {
1520 switch (op) {
1521 case SCSI_PROT_WRITE_PASS:
1522 if (blockoff && src) {
1523 /* Insert error in middle of the IO */
1524
1525 lpfc_printf_log(phba, KERN_ERR, LOG_BG,
1526 "0815 BLKGRD: Injecting guard error: "
1527 "write lba x%lx + x%x oldgrdTag x%x\n",
1528 (unsigned long)lba, blockoff,
1529 src->guard_tag);
1391 1530
1392 /* 1531 /*
1393 * If we are SCSI_PROT_WRITE_INSERT, the protection data is 1532 * NOTE, this will change guard tag in
1394 * being on the wire is being fully generated on the HBA. 1533 * the memory location forever!
1395 * The host cannot change it or force an error. 1534 */
1396 */ 1535 src->guard_tag = 0xDEAD;
1397 if (((op == SCSI_PROT_WRITE_STRIP) || 1536 phba->lpfc_injerr_wgrd_cnt--;
1398 (op == SCSI_PROT_WRITE_PASS)) && 1537 phba->lpfc_injerr_lba =
1399 phba->lpfc_injerr_wgrd_cnt) { 1538 LPFC_INJERR_LBA_OFF;
1400 if (sgpe) { 1539 rc = BG_ERR_CHECK;
1401 src = (struct scsi_dif_tuple *)sg_virt(sgpe); 1540 break;
1402 /* 1541 }
1403 * Just inject an error in the first 1542 /* Drop thru */
1404 * prot block. 1543 case SCSI_PROT_WRITE_STRIP:
1405 */ 1544 /*
1406 lpfc_printf_log(phba, KERN_ERR, LOG_BG, 1545 * For WRITE_STRIP and WRITE_PASS,
1407 "9079 BLKGRD: Injecting guard error: " 1546 * force the error on data
1408 "write lba x%lx oldGuard x%x refTag x%x\n", 1547 * being copied from SLI-Host to SLI-Port.
1409 (unsigned long)lba, src->guard_tag, 1548 */
1410 src->ref_tag); 1549 phba->lpfc_injerr_wgrd_cnt--;
1550 phba->lpfc_injerr_lba = LPFC_INJERR_LBA_OFF;
1411 1551
1412 src->guard_tag = (uint16_t)new_guard; 1552 rc = BG_ERR_SWAP;
1413 phba->lpfc_injerr_wgrd_cnt--; 1553 /* Signals the caller to swap CRC->CSUM */
1414 phba->lpfc_injerr_lba = LPFC_INJERR_LBA_OFF;
1415 rc = 1;
1416 1554
1417 } else { 1555 lpfc_printf_log(phba, KERN_ERR, LOG_BG,
1418 blksize = lpfc_cmd_blksize(sc); 1556 "0816 BLKGRD: Injecting guard error: "
1419 /* 1557 "write lba x%lx\n", (unsigned long)lba);
1420 * Jump past the first data block 1558 break;
1421 * and inject an error in the 1559 case SCSI_PROT_WRITE_INSERT:
1422 * prot data. The prot data is already 1560 /*
1423 * embedded after the regular data. 1561 * For WRITE_INSERT, force the
1424 */ 1562 * error to be sent on the wire. It should be
1425 src = (struct scsi_dif_tuple *) 1563 * detected by the Target.
1426 (sg_virt(sgde) + blksize); 1564 */
1565 phba->lpfc_injerr_wgrd_cnt--;
1566 phba->lpfc_injerr_lba = LPFC_INJERR_LBA_OFF;
1427 1567
1428 lpfc_printf_log(phba, KERN_ERR, LOG_BG, 1568 rc = BG_ERR_SWAP;
1429 "9080 BLKGRD: Injecting guard error: " 1569 /* Signals the caller to swap CRC->CSUM */
1430 "write lba x%lx oldGuard x%x refTag x%x\n", 1570
1431 (unsigned long)lba, src->guard_tag, 1571 lpfc_printf_log(phba, KERN_ERR, LOG_BG,
1432 src->ref_tag); 1572 "0817 BLKGRD: Injecting guard error: "
1433 1573 "write lba x%lx\n", (unsigned long)lba);
1434 src->guard_tag = (uint16_t)new_guard; 1574 break;
1435 phba->lpfc_injerr_wgrd_cnt--; 1575 }
1436 phba->lpfc_injerr_lba = LPFC_INJERR_LBA_OFF; 1576 }
1437 rc = 1; 1577 if (phba->lpfc_injerr_rgrd_cnt) {
1578 switch (op) {
1579 case SCSI_PROT_READ_INSERT:
1580 /*
1581 * For READ_INSERT, it doesn't make sense
1582 * to change the guard tag.
1583 */
1584 break;
1585 case SCSI_PROT_READ_STRIP:
1586 case SCSI_PROT_READ_PASS:
1587 /*
1588 * For READ_STRIP and READ_PASS, force the
1589 * error on data being read off the wire. It
1590 * should force an IO error to the driver.
1591 */
1592 *apptag = 0xDEAD;
1593 phba->lpfc_injerr_rgrd_cnt--;
1594 phba->lpfc_injerr_lba = LPFC_INJERR_LBA_OFF;
1595
1596 rc = BG_ERR_SWAP;
1597 /* Signals the caller to swap CRC->CSUM */
1598
1599 lpfc_printf_log(phba, KERN_ERR, LOG_BG,
1600 "0818 BLKGRD: Injecting guard error: "
1601 "read lba x%lx\n", (unsigned long)lba);
1602 }
1438 } 1603 }
1439 } 1604 }
1605
1440 return rc; 1606 return rc;
1441} 1607}
1442#endif 1608#endif
1443 1609
1444/* 1610/**
1445 * Given a scsi cmnd, determine the BlockGuard opcodes to be used with it 1611 * lpfc_sc_to_bg_opcodes - Determine the BlockGuard opcodes to be used with
1612 * the specified SCSI command.
1613 * @phba: The Hba for which this call is being executed.
1446 * @sc: The SCSI command to examine 1614 * @sc: The SCSI command to examine
1447 * @txopt: (out) BlockGuard operation for transmitted data 1615 * @txopt: (out) BlockGuard operation for transmitted data
1448 * @rxopt: (out) BlockGuard operation for received data 1616 * @rxopt: (out) BlockGuard operation for received data
1449 * 1617 *
1450 * Returns: zero on success; non-zero if tx and/or rx op cannot be determined 1618 * Returns: zero on success; non-zero if tx and/or rx op cannot be determined
1451 * 1619 *
1452 */ 1620 **/
1453static int 1621static int
1454lpfc_sc_to_bg_opcodes(struct lpfc_hba *phba, struct scsi_cmnd *sc, 1622lpfc_sc_to_bg_opcodes(struct lpfc_hba *phba, struct scsi_cmnd *sc,
1455 uint8_t *txop, uint8_t *rxop) 1623 uint8_t *txop, uint8_t *rxop)
@@ -1519,8 +1687,88 @@ lpfc_sc_to_bg_opcodes(struct lpfc_hba *phba, struct scsi_cmnd *sc,
1519 return ret; 1687 return ret;
1520} 1688}
1521 1689
1522/* 1690#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
1523 * This function sets up buffer list for protection groups of 1691/**
1692 * lpfc_bg_err_opcodes - reDetermine the BlockGuard opcodes to be used with
1693 * the specified SCSI command in order to force a guard tag error.
1694 * @phba: The Hba for which this call is being executed.
1695 * @sc: The SCSI command to examine
1696 * @txopt: (out) BlockGuard operation for transmitted data
1697 * @rxopt: (out) BlockGuard operation for received data
1698 *
1699 * Returns: zero on success; non-zero if tx and/or rx op cannot be determined
1700 *
1701 **/
1702static int
1703lpfc_bg_err_opcodes(struct lpfc_hba *phba, struct scsi_cmnd *sc,
1704 uint8_t *txop, uint8_t *rxop)
1705{
1706 uint8_t guard_type = scsi_host_get_guard(sc->device->host);
1707 uint8_t ret = 0;
1708
1709 if (guard_type == SHOST_DIX_GUARD_IP) {
1710 switch (scsi_get_prot_op(sc)) {
1711 case SCSI_PROT_READ_INSERT:
1712 case SCSI_PROT_WRITE_STRIP:
1713 *txop = BG_OP_IN_CRC_OUT_NODIF;
1714 *rxop = BG_OP_IN_NODIF_OUT_CRC;
1715 break;
1716
1717 case SCSI_PROT_READ_STRIP:
1718 case SCSI_PROT_WRITE_INSERT:
1719 *txop = BG_OP_IN_NODIF_OUT_CSUM;
1720 *rxop = BG_OP_IN_CSUM_OUT_NODIF;
1721 break;
1722
1723 case SCSI_PROT_READ_PASS:
1724 case SCSI_PROT_WRITE_PASS:
1725 *txop = BG_OP_IN_CRC_OUT_CRC;
1726 *rxop = BG_OP_IN_CRC_OUT_CRC;
1727 break;
1728
1729 case SCSI_PROT_NORMAL:
1730 default:
1731 break;
1732
1733 }
1734 } else {
1735 switch (scsi_get_prot_op(sc)) {
1736 case SCSI_PROT_READ_STRIP:
1737 case SCSI_PROT_WRITE_INSERT:
1738 *txop = BG_OP_IN_NODIF_OUT_CSUM;
1739 *rxop = BG_OP_IN_CSUM_OUT_NODIF;
1740 break;
1741
1742 case SCSI_PROT_READ_PASS:
1743 case SCSI_PROT_WRITE_PASS:
1744 *txop = BG_OP_IN_CSUM_OUT_CRC;
1745 *rxop = BG_OP_IN_CRC_OUT_CSUM;
1746 break;
1747
1748 case SCSI_PROT_READ_INSERT:
1749 case SCSI_PROT_WRITE_STRIP:
1750 *txop = BG_OP_IN_CSUM_OUT_NODIF;
1751 *rxop = BG_OP_IN_NODIF_OUT_CSUM;
1752 break;
1753
1754 case SCSI_PROT_NORMAL:
1755 default:
1756 break;
1757 }
1758 }
1759
1760 return ret;
1761}
1762#endif
1763
1764/**
1765 * lpfc_bg_setup_bpl - Setup BlockGuard BPL with no protection data
1766 * @phba: The Hba for which this call is being executed.
1767 * @sc: pointer to scsi command we're working on
1768 * @bpl: pointer to buffer list for protection groups
1769 * @datacnt: number of segments of data that have been dma mapped
1770 *
1771 * This function sets up BPL buffer list for protection groups of
1524 * type LPFC_PG_TYPE_NO_DIF 1772 * type LPFC_PG_TYPE_NO_DIF
1525 * 1773 *
1526 * This is usually used when the HBA is instructed to generate 1774 * This is usually used when the HBA is instructed to generate
@@ -1539,12 +1787,11 @@ lpfc_sc_to_bg_opcodes(struct lpfc_hba *phba, struct scsi_cmnd *sc,
1539 * |more Data BDE's ... (opt)| 1787 * |more Data BDE's ... (opt)|
1540 * +-------------------------+ 1788 * +-------------------------+
1541 * 1789 *
1542 * @sc: pointer to scsi command we're working on
1543 * @bpl: pointer to buffer list for protection groups
1544 * @datacnt: number of segments of data that have been dma mapped
1545 * 1790 *
1546 * Note: Data s/g buffers have been dma mapped 1791 * Note: Data s/g buffers have been dma mapped
1547 */ 1792 *
1793 * Returns the number of BDEs added to the BPL.
1794 **/
1548static int 1795static int
1549lpfc_bg_setup_bpl(struct lpfc_hba *phba, struct scsi_cmnd *sc, 1796lpfc_bg_setup_bpl(struct lpfc_hba *phba, struct scsi_cmnd *sc,
1550 struct ulp_bde64 *bpl, int datasegcnt) 1797 struct ulp_bde64 *bpl, int datasegcnt)
@@ -1555,6 +1802,8 @@ lpfc_bg_setup_bpl(struct lpfc_hba *phba, struct scsi_cmnd *sc,
1555 dma_addr_t physaddr; 1802 dma_addr_t physaddr;
1556 int i = 0, num_bde = 0, status; 1803 int i = 0, num_bde = 0, status;
1557 int datadir = sc->sc_data_direction; 1804 int datadir = sc->sc_data_direction;
1805 uint32_t rc;
1806 uint32_t checking = 1;
1558 uint32_t reftag; 1807 uint32_t reftag;
1559 unsigned blksize; 1808 unsigned blksize;
1560 uint8_t txop, rxop; 1809 uint8_t txop, rxop;
@@ -1565,11 +1814,16 @@ lpfc_bg_setup_bpl(struct lpfc_hba *phba, struct scsi_cmnd *sc,
1565 1814
1566 /* extract some info from the scsi command for pde*/ 1815 /* extract some info from the scsi command for pde*/
1567 blksize = lpfc_cmd_blksize(sc); 1816 blksize = lpfc_cmd_blksize(sc);
1568 reftag = scsi_get_lba(sc) & 0xffffffff; 1817 reftag = (uint32_t)scsi_get_lba(sc); /* Truncate LBA */
1569 1818
1570#ifdef CONFIG_SCSI_LPFC_DEBUG_FS 1819#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
1571 /* reftag is the only error we can inject here */ 1820 rc = lpfc_bg_err_inject(phba, sc, &reftag, 0, 1);
1572 lpfc_bg_err_inject(phba, sc, &reftag, 0, 0); 1821 if (rc) {
1822 if (rc == BG_ERR_SWAP)
1823 lpfc_bg_err_opcodes(phba, sc, &txop, &rxop);
1824 if (rc == BG_ERR_CHECK)
1825 checking = 0;
1826 }
1573#endif 1827#endif
1574 1828
1575 /* setup PDE5 with what we have */ 1829 /* setup PDE5 with what we have */
@@ -1592,8 +1846,8 @@ lpfc_bg_setup_bpl(struct lpfc_hba *phba, struct scsi_cmnd *sc,
1592 bf_set(pde6_optx, pde6, txop); 1846 bf_set(pde6_optx, pde6, txop);
1593 bf_set(pde6_oprx, pde6, rxop); 1847 bf_set(pde6_oprx, pde6, rxop);
1594 if (datadir == DMA_FROM_DEVICE) { 1848 if (datadir == DMA_FROM_DEVICE) {
1595 bf_set(pde6_ce, pde6, 1); 1849 bf_set(pde6_ce, pde6, checking);
1596 bf_set(pde6_re, pde6, 1); 1850 bf_set(pde6_re, pde6, checking);
1597 } 1851 }
1598 bf_set(pde6_ai, pde6, 1); 1852 bf_set(pde6_ai, pde6, 1);
1599 bf_set(pde6_ae, pde6, 0); 1853 bf_set(pde6_ae, pde6, 0);
@@ -1627,9 +1881,16 @@ out:
1627 return num_bde; 1881 return num_bde;
1628} 1882}
1629 1883
1630/* 1884/**
1631 * This function sets up buffer list for protection groups of 1885 * lpfc_bg_setup_bpl_prot - Setup BlockGuard BPL with protection data
1632 * type LPFC_PG_TYPE_DIF_BUF 1886 * @phba: The Hba for which this call is being executed.
1887 * @sc: pointer to scsi command we're working on
1888 * @bpl: pointer to buffer list for protection groups
1889 * @datacnt: number of segments of data that have been dma mapped
1890 * @protcnt: number of segment of protection data that have been dma mapped
1891 *
1892 * This function sets up BPL buffer list for protection groups of
1893 * type LPFC_PG_TYPE_DIF
1633 * 1894 *
1634 * This is usually used when DIFs are in their own buffers, 1895 * This is usually used when DIFs are in their own buffers,
1635 * separate from the data. The HBA can then by instructed 1896 * separate from the data. The HBA can then by instructed
@@ -1654,14 +1915,11 @@ out:
1654 * | ... | 1915 * | ... |
1655 * +-------------------------+ 1916 * +-------------------------+
1656 * 1917 *
1657 * @sc: pointer to scsi command we're working on
1658 * @bpl: pointer to buffer list for protection groups
1659 * @datacnt: number of segments of data that have been dma mapped
1660 * @protcnt: number of segment of protection data that have been dma mapped
1661 *
1662 * Note: It is assumed that both data and protection s/g buffers have been 1918 * Note: It is assumed that both data and protection s/g buffers have been
1663 * mapped for DMA 1919 * mapped for DMA
1664 */ 1920 *
1921 * Returns the number of BDEs added to the BPL.
1922 **/
1665static int 1923static int
1666lpfc_bg_setup_bpl_prot(struct lpfc_hba *phba, struct scsi_cmnd *sc, 1924lpfc_bg_setup_bpl_prot(struct lpfc_hba *phba, struct scsi_cmnd *sc,
1667 struct ulp_bde64 *bpl, int datacnt, int protcnt) 1925 struct ulp_bde64 *bpl, int datacnt, int protcnt)
@@ -1681,6 +1939,8 @@ lpfc_bg_setup_bpl_prot(struct lpfc_hba *phba, struct scsi_cmnd *sc,
1681 int datadir = sc->sc_data_direction; 1939 int datadir = sc->sc_data_direction;
1682 unsigned char pgdone = 0, alldone = 0; 1940 unsigned char pgdone = 0, alldone = 0;
1683 unsigned blksize; 1941 unsigned blksize;
1942 uint32_t rc;
1943 uint32_t checking = 1;
1684 uint32_t reftag; 1944 uint32_t reftag;
1685 uint8_t txop, rxop; 1945 uint8_t txop, rxop;
1686 int num_bde = 0; 1946 int num_bde = 0;
@@ -1701,11 +1961,16 @@ lpfc_bg_setup_bpl_prot(struct lpfc_hba *phba, struct scsi_cmnd *sc,
1701 1961
1702 /* extract some info from the scsi command */ 1962 /* extract some info from the scsi command */
1703 blksize = lpfc_cmd_blksize(sc); 1963 blksize = lpfc_cmd_blksize(sc);
1704 reftag = scsi_get_lba(sc) & 0xffffffff; 1964 reftag = (uint32_t)scsi_get_lba(sc); /* Truncate LBA */
1705 1965
1706#ifdef CONFIG_SCSI_LPFC_DEBUG_FS 1966#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
1707 /* reftag / guard tag are the only errors we can inject here */ 1967 rc = lpfc_bg_err_inject(phba, sc, &reftag, 0, 1);
1708 lpfc_bg_err_inject(phba, sc, &reftag, 0, 0xDEAD); 1968 if (rc) {
1969 if (rc == BG_ERR_SWAP)
1970 lpfc_bg_err_opcodes(phba, sc, &txop, &rxop);
1971 if (rc == BG_ERR_CHECK)
1972 checking = 0;
1973 }
1709#endif 1974#endif
1710 1975
1711 split_offset = 0; 1976 split_offset = 0;
@@ -1729,8 +1994,8 @@ lpfc_bg_setup_bpl_prot(struct lpfc_hba *phba, struct scsi_cmnd *sc,
1729 bf_set(pde6_type, pde6, LPFC_PDE6_DESCRIPTOR); 1994 bf_set(pde6_type, pde6, LPFC_PDE6_DESCRIPTOR);
1730 bf_set(pde6_optx, pde6, txop); 1995 bf_set(pde6_optx, pde6, txop);
1731 bf_set(pde6_oprx, pde6, rxop); 1996 bf_set(pde6_oprx, pde6, rxop);
1732 bf_set(pde6_ce, pde6, 1); 1997 bf_set(pde6_ce, pde6, checking);
1733 bf_set(pde6_re, pde6, 1); 1998 bf_set(pde6_re, pde6, checking);
1734 bf_set(pde6_ai, pde6, 1); 1999 bf_set(pde6_ai, pde6, 1);
1735 bf_set(pde6_ae, pde6, 0); 2000 bf_set(pde6_ae, pde6, 0);
1736 bf_set(pde6_apptagval, pde6, 0); 2001 bf_set(pde6_apptagval, pde6, 0);
@@ -1852,13 +2117,358 @@ out:
1852 return num_bde; 2117 return num_bde;
1853} 2118}
1854 2119
1855/* 2120/**
2121 * lpfc_bg_setup_sgl - Setup BlockGuard SGL with no protection data
2122 * @phba: The Hba for which this call is being executed.
2123 * @sc: pointer to scsi command we're working on
2124 * @sgl: pointer to buffer list for protection groups
2125 * @datacnt: number of segments of data that have been dma mapped
2126 *
2127 * This function sets up SGL buffer list for protection groups of
2128 * type LPFC_PG_TYPE_NO_DIF
2129 *
2130 * This is usually used when the HBA is instructed to generate
2131 * DIFs and insert them into data stream (or strip DIF from
2132 * incoming data stream)
2133 *
2134 * The buffer list consists of just one protection group described
2135 * below:
2136 * +-------------------------+
2137 * start of prot group --> | DI_SEED |
2138 * +-------------------------+
2139 * | Data SGE |
2140 * +-------------------------+
2141 * |more Data SGE's ... (opt)|
2142 * +-------------------------+
2143 *
2144 *
2145 * Note: Data s/g buffers have been dma mapped
2146 *
2147 * Returns the number of SGEs added to the SGL.
2148 **/
2149static int
2150lpfc_bg_setup_sgl(struct lpfc_hba *phba, struct scsi_cmnd *sc,
2151 struct sli4_sge *sgl, int datasegcnt)
2152{
2153 struct scatterlist *sgde = NULL; /* s/g data entry */
2154 struct sli4_sge_diseed *diseed = NULL;
2155 dma_addr_t physaddr;
2156 int i = 0, num_sge = 0, status;
2157 int datadir = sc->sc_data_direction;
2158 uint32_t reftag;
2159 unsigned blksize;
2160 uint8_t txop, rxop;
2161 uint32_t rc;
2162 uint32_t checking = 1;
2163 uint32_t dma_len;
2164 uint32_t dma_offset = 0;
2165
2166 status = lpfc_sc_to_bg_opcodes(phba, sc, &txop, &rxop);
2167 if (status)
2168 goto out;
2169
2170 /* extract some info from the scsi command for pde*/
2171 blksize = lpfc_cmd_blksize(sc);
2172 reftag = (uint32_t)scsi_get_lba(sc); /* Truncate LBA */
2173
2174#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
2175 rc = lpfc_bg_err_inject(phba, sc, &reftag, 0, 1);
2176 if (rc) {
2177 if (rc == BG_ERR_SWAP)
2178 lpfc_bg_err_opcodes(phba, sc, &txop, &rxop);
2179 if (rc == BG_ERR_CHECK)
2180 checking = 0;
2181 }
2182#endif
2183
2184 /* setup DISEED with what we have */
2185 diseed = (struct sli4_sge_diseed *) sgl;
2186 memset(diseed, 0, sizeof(struct sli4_sge_diseed));
2187 bf_set(lpfc_sli4_sge_type, sgl, LPFC_SGE_TYPE_DISEED);
2188
2189 /* Endianness conversion if necessary */
2190 diseed->ref_tag = cpu_to_le32(reftag);
2191 diseed->ref_tag_tran = diseed->ref_tag;
2192
2193 /* setup DISEED with the rest of the info */
2194 bf_set(lpfc_sli4_sge_dif_optx, diseed, txop);
2195 bf_set(lpfc_sli4_sge_dif_oprx, diseed, rxop);
2196 if (datadir == DMA_FROM_DEVICE) {
2197 bf_set(lpfc_sli4_sge_dif_ce, diseed, checking);
2198 bf_set(lpfc_sli4_sge_dif_re, diseed, checking);
2199 }
2200 bf_set(lpfc_sli4_sge_dif_ai, diseed, 1);
2201 bf_set(lpfc_sli4_sge_dif_me, diseed, 0);
2202
2203 /* Endianness conversion if necessary for DISEED */
2204 diseed->word2 = cpu_to_le32(diseed->word2);
2205 diseed->word3 = cpu_to_le32(diseed->word3);
2206
2207 /* advance bpl and increment sge count */
2208 num_sge++;
2209 sgl++;
2210
2211 /* assumption: caller has already run dma_map_sg on command data */
2212 scsi_for_each_sg(sc, sgde, datasegcnt, i) {
2213 physaddr = sg_dma_address(sgde);
2214 dma_len = sg_dma_len(sgde);
2215 sgl->addr_lo = cpu_to_le32(putPaddrLow(physaddr));
2216 sgl->addr_hi = cpu_to_le32(putPaddrHigh(physaddr));
2217 if ((i + 1) == datasegcnt)
2218 bf_set(lpfc_sli4_sge_last, sgl, 1);
2219 else
2220 bf_set(lpfc_sli4_sge_last, sgl, 0);
2221 bf_set(lpfc_sli4_sge_offset, sgl, dma_offset);
2222 bf_set(lpfc_sli4_sge_type, sgl, LPFC_SGE_TYPE_DATA);
2223
2224 sgl->sge_len = cpu_to_le32(dma_len);
2225 dma_offset += dma_len;
2226
2227 sgl++;
2228 num_sge++;
2229 }
2230
2231out:
2232 return num_sge;
2233}
2234
2235/**
2236 * lpfc_bg_setup_sgl_prot - Setup BlockGuard SGL with protection data
2237 * @phba: The Hba for which this call is being executed.
2238 * @sc: pointer to scsi command we're working on
2239 * @sgl: pointer to buffer list for protection groups
2240 * @datacnt: number of segments of data that have been dma mapped
2241 * @protcnt: number of segment of protection data that have been dma mapped
2242 *
2243 * This function sets up SGL buffer list for protection groups of
2244 * type LPFC_PG_TYPE_DIF
2245 *
2246 * This is usually used when DIFs are in their own buffers,
2247 * separate from the data. The HBA can then by instructed
2248 * to place the DIFs in the outgoing stream. For read operations,
2249 * The HBA could extract the DIFs and place it in DIF buffers.
2250 *
2251 * The buffer list for this type consists of one or more of the
2252 * protection groups described below:
2253 * +-------------------------+
2254 * start of first prot group --> | DISEED |
2255 * +-------------------------+
2256 * | DIF (Prot SGE) |
2257 * +-------------------------+
2258 * | Data SGE |
2259 * +-------------------------+
2260 * |more Data SGE's ... (opt)|
2261 * +-------------------------+
2262 * start of new prot group --> | DISEED |
2263 * +-------------------------+
2264 * | ... |
2265 * +-------------------------+
2266 *
2267 * Note: It is assumed that both data and protection s/g buffers have been
2268 * mapped for DMA
2269 *
2270 * Returns the number of SGEs added to the SGL.
2271 **/
2272static int
2273lpfc_bg_setup_sgl_prot(struct lpfc_hba *phba, struct scsi_cmnd *sc,
2274 struct sli4_sge *sgl, int datacnt, int protcnt)
2275{
2276 struct scatterlist *sgde = NULL; /* s/g data entry */
2277 struct scatterlist *sgpe = NULL; /* s/g prot entry */
2278 struct sli4_sge_diseed *diseed = NULL;
2279 dma_addr_t dataphysaddr, protphysaddr;
2280 unsigned short curr_data = 0, curr_prot = 0;
2281 unsigned int split_offset;
2282 unsigned int protgroup_len, protgroup_offset = 0, protgroup_remainder;
2283 unsigned int protgrp_blks, protgrp_bytes;
2284 unsigned int remainder, subtotal;
2285 int status;
2286 unsigned char pgdone = 0, alldone = 0;
2287 unsigned blksize;
2288 uint32_t reftag;
2289 uint8_t txop, rxop;
2290 uint32_t dma_len;
2291 uint32_t rc;
2292 uint32_t checking = 1;
2293 uint32_t dma_offset = 0;
2294 int num_sge = 0;
2295
2296 sgpe = scsi_prot_sglist(sc);
2297 sgde = scsi_sglist(sc);
2298
2299 if (!sgpe || !sgde) {
2300 lpfc_printf_log(phba, KERN_ERR, LOG_FCP,
2301 "9082 Invalid s/g entry: data=0x%p prot=0x%p\n",
2302 sgpe, sgde);
2303 return 0;
2304 }
2305
2306 status = lpfc_sc_to_bg_opcodes(phba, sc, &txop, &rxop);
2307 if (status)
2308 goto out;
2309
2310 /* extract some info from the scsi command */
2311 blksize = lpfc_cmd_blksize(sc);
2312 reftag = (uint32_t)scsi_get_lba(sc); /* Truncate LBA */
2313
2314#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
2315 rc = lpfc_bg_err_inject(phba, sc, &reftag, 0, 1);
2316 if (rc) {
2317 if (rc == BG_ERR_SWAP)
2318 lpfc_bg_err_opcodes(phba, sc, &txop, &rxop);
2319 if (rc == BG_ERR_CHECK)
2320 checking = 0;
2321 }
2322#endif
2323
2324 split_offset = 0;
2325 do {
2326 /* setup DISEED with what we have */
2327 diseed = (struct sli4_sge_diseed *) sgl;
2328 memset(diseed, 0, sizeof(struct sli4_sge_diseed));
2329 bf_set(lpfc_sli4_sge_type, sgl, LPFC_SGE_TYPE_DISEED);
2330
2331 /* Endianness conversion if necessary */
2332 diseed->ref_tag = cpu_to_le32(reftag);
2333 diseed->ref_tag_tran = diseed->ref_tag;
2334
2335 /* setup DISEED with the rest of the info */
2336 bf_set(lpfc_sli4_sge_dif_optx, diseed, txop);
2337 bf_set(lpfc_sli4_sge_dif_oprx, diseed, rxop);
2338 bf_set(lpfc_sli4_sge_dif_ce, diseed, checking);
2339 bf_set(lpfc_sli4_sge_dif_re, diseed, checking);
2340 bf_set(lpfc_sli4_sge_dif_ai, diseed, 1);
2341 bf_set(lpfc_sli4_sge_dif_me, diseed, 0);
2342
2343 /* Endianness conversion if necessary for DISEED */
2344 diseed->word2 = cpu_to_le32(diseed->word2);
2345 diseed->word3 = cpu_to_le32(diseed->word3);
2346
2347 /* advance sgl and increment bde count */
2348 num_sge++;
2349 sgl++;
2350
2351 /* setup the first BDE that points to protection buffer */
2352 protphysaddr = sg_dma_address(sgpe) + protgroup_offset;
2353 protgroup_len = sg_dma_len(sgpe) - protgroup_offset;
2354
2355 /* must be integer multiple of the DIF block length */
2356 BUG_ON(protgroup_len % 8);
2357
2358 /* Now setup DIF SGE */
2359 sgl->word2 = 0;
2360 bf_set(lpfc_sli4_sge_type, sgl, LPFC_SGE_TYPE_DIF);
2361 sgl->addr_hi = le32_to_cpu(putPaddrHigh(protphysaddr));
2362 sgl->addr_lo = le32_to_cpu(putPaddrLow(protphysaddr));
2363 sgl->word2 = cpu_to_le32(sgl->word2);
2364
2365 protgrp_blks = protgroup_len / 8;
2366 protgrp_bytes = protgrp_blks * blksize;
2367
2368 /* check if DIF SGE is crossing the 4K boundary; if so split */
2369 if ((sgl->addr_lo & 0xfff) + protgroup_len > 0x1000) {
2370 protgroup_remainder = 0x1000 - (sgl->addr_lo & 0xfff);
2371 protgroup_offset += protgroup_remainder;
2372 protgrp_blks = protgroup_remainder / 8;
2373 protgrp_bytes = protgrp_blks * blksize;
2374 } else {
2375 protgroup_offset = 0;
2376 curr_prot++;
2377 }
2378
2379 num_sge++;
2380
2381 /* setup SGE's for data blocks associated with DIF data */
2382 pgdone = 0;
2383 subtotal = 0; /* total bytes processed for current prot grp */
2384 while (!pgdone) {
2385 if (!sgde) {
2386 lpfc_printf_log(phba, KERN_ERR, LOG_BG,
2387 "9086 BLKGRD:%s Invalid data segment\n",
2388 __func__);
2389 return 0;
2390 }
2391 sgl++;
2392 dataphysaddr = sg_dma_address(sgde) + split_offset;
2393
2394 remainder = sg_dma_len(sgde) - split_offset;
2395
2396 if ((subtotal + remainder) <= protgrp_bytes) {
2397 /* we can use this whole buffer */
2398 dma_len = remainder;
2399 split_offset = 0;
2400
2401 if ((subtotal + remainder) == protgrp_bytes)
2402 pgdone = 1;
2403 } else {
2404 /* must split this buffer with next prot grp */
2405 dma_len = protgrp_bytes - subtotal;
2406 split_offset += dma_len;
2407 }
2408
2409 subtotal += dma_len;
2410
2411 sgl->addr_lo = cpu_to_le32(putPaddrLow(dataphysaddr));
2412 sgl->addr_hi = cpu_to_le32(putPaddrHigh(dataphysaddr));
2413 bf_set(lpfc_sli4_sge_last, sgl, 0);
2414 bf_set(lpfc_sli4_sge_offset, sgl, dma_offset);
2415 bf_set(lpfc_sli4_sge_type, sgl, LPFC_SGE_TYPE_DATA);
2416
2417 sgl->sge_len = cpu_to_le32(dma_len);
2418 dma_offset += dma_len;
2419
2420 num_sge++;
2421 curr_data++;
2422
2423 if (split_offset)
2424 break;
2425
2426 /* Move to the next s/g segment if possible */
2427 sgde = sg_next(sgde);
2428 }
2429
2430 if (protgroup_offset) {
2431 /* update the reference tag */
2432 reftag += protgrp_blks;
2433 sgl++;
2434 continue;
2435 }
2436
2437 /* are we done ? */
2438 if (curr_prot == protcnt) {
2439 bf_set(lpfc_sli4_sge_last, sgl, 1);
2440 alldone = 1;
2441 } else if (curr_prot < protcnt) {
2442 /* advance to next prot buffer */
2443 sgpe = sg_next(sgpe);
2444 sgl++;
2445
2446 /* update the reference tag */
2447 reftag += protgrp_blks;
2448 } else {
2449 /* if we're here, we have a bug */
2450 lpfc_printf_log(phba, KERN_ERR, LOG_BG,
2451 "9085 BLKGRD: bug in %s\n", __func__);
2452 }
2453
2454 } while (!alldone);
2455
2456out:
2457
2458 return num_sge;
2459}
2460
2461/**
2462 * lpfc_prot_group_type - Get prtotection group type of SCSI command
2463 * @phba: The Hba for which this call is being executed.
2464 * @sc: pointer to scsi command we're working on
2465 *
1856 * Given a SCSI command that supports DIF, determine composition of protection 2466 * Given a SCSI command that supports DIF, determine composition of protection
1857 * groups involved in setting up buffer lists 2467 * groups involved in setting up buffer lists
1858 * 2468 *
1859 * Returns: 2469 * Returns: Protection group type (with or without DIF)
1860 * for DIF (for both read and write) 2470 *
1861 * */ 2471 **/
1862static int 2472static int
1863lpfc_prot_group_type(struct lpfc_hba *phba, struct scsi_cmnd *sc) 2473lpfc_prot_group_type(struct lpfc_hba *phba, struct scsi_cmnd *sc)
1864{ 2474{
@@ -1885,13 +2495,17 @@ lpfc_prot_group_type(struct lpfc_hba *phba, struct scsi_cmnd *sc)
1885 return ret; 2495 return ret;
1886} 2496}
1887 2497
1888/* 2498/**
2499 * lpfc_bg_scsi_prep_dma_buf_s3 - DMA mapping for scsi buffer to SLI3 IF spec
2500 * @phba: The Hba for which this call is being executed.
2501 * @lpfc_cmd: The scsi buffer which is going to be prep'ed.
2502 *
1889 * This is the protection/DIF aware version of 2503 * This is the protection/DIF aware version of
1890 * lpfc_scsi_prep_dma_buf(). It may be a good idea to combine the 2504 * lpfc_scsi_prep_dma_buf(). It may be a good idea to combine the
1891 * two functions eventually, but for now, it's here 2505 * two functions eventually, but for now, it's here
1892 */ 2506 **/
1893static int 2507static int
1894lpfc_bg_scsi_prep_dma_buf(struct lpfc_hba *phba, 2508lpfc_bg_scsi_prep_dma_buf_s3(struct lpfc_hba *phba,
1895 struct lpfc_scsi_buf *lpfc_cmd) 2509 struct lpfc_scsi_buf *lpfc_cmd)
1896{ 2510{
1897 struct scsi_cmnd *scsi_cmnd = lpfc_cmd->pCmd; 2511 struct scsi_cmnd *scsi_cmnd = lpfc_cmd->pCmd;
@@ -2147,7 +2761,21 @@ lpfc_parse_bg_err(struct lpfc_hba *phba, struct lpfc_scsi_buf *lpfc_cmd,
2147 cmd->sense_buffer[8] = 0; /* Information descriptor type */ 2761 cmd->sense_buffer[8] = 0; /* Information descriptor type */
2148 cmd->sense_buffer[9] = 0xa; /* Additional descriptor length */ 2762 cmd->sense_buffer[9] = 0xa; /* Additional descriptor length */
2149 cmd->sense_buffer[10] = 0x80; /* Validity bit */ 2763 cmd->sense_buffer[10] = 0x80; /* Validity bit */
2150 bghm /= cmd->device->sector_size; 2764
2765 /* bghm is a "on the wire" FC frame based count */
2766 switch (scsi_get_prot_op(cmd)) {
2767 case SCSI_PROT_READ_INSERT:
2768 case SCSI_PROT_WRITE_STRIP:
2769 bghm /= cmd->device->sector_size;
2770 break;
2771 case SCSI_PROT_READ_STRIP:
2772 case SCSI_PROT_WRITE_INSERT:
2773 case SCSI_PROT_READ_PASS:
2774 case SCSI_PROT_WRITE_PASS:
2775 bghm /= (cmd->device->sector_size +
2776 sizeof(struct scsi_dif_tuple));
2777 break;
2778 }
2151 2779
2152 failing_sector = scsi_get_lba(cmd); 2780 failing_sector = scsi_get_lba(cmd);
2153 failing_sector += bghm; 2781 failing_sector += bghm;
@@ -2292,6 +2920,180 @@ lpfc_scsi_prep_dma_buf_s4(struct lpfc_hba *phba, struct lpfc_scsi_buf *lpfc_cmd)
2292} 2920}
2293 2921
2294/** 2922/**
2923 * lpfc_bg_scsi_adjust_dl - Adjust SCSI data length for BlockGuard
2924 * @phba: The Hba for which this call is being executed.
2925 * @lpfc_cmd: The scsi buffer which is going to be adjusted.
2926 *
2927 * Adjust the data length to account for how much data
2928 * is actually on the wire.
2929 *
2930 * returns the adjusted data length
2931 **/
2932static int
2933lpfc_bg_scsi_adjust_dl(struct lpfc_hba *phba,
2934 struct lpfc_scsi_buf *lpfc_cmd)
2935{
2936 struct scsi_cmnd *sc = lpfc_cmd->pCmd;
2937 int diflen, fcpdl;
2938 unsigned blksize;
2939
2940 fcpdl = scsi_bufflen(sc);
2941
2942 /* Check if there is protection data on the wire */
2943 if (sc->sc_data_direction == DMA_FROM_DEVICE) {
2944 /* Read */
2945 if (scsi_get_prot_op(sc) == SCSI_PROT_READ_INSERT)
2946 return fcpdl;
2947
2948 } else {
2949 /* Write */
2950 if (scsi_get_prot_op(sc) == SCSI_PROT_WRITE_STRIP)
2951 return fcpdl;
2952 }
2953
2954 /* If protection data on the wire, adjust the count accordingly */
2955 blksize = lpfc_cmd_blksize(sc);
2956 diflen = (fcpdl / blksize) * 8;
2957 fcpdl += diflen;
2958 return fcpdl;
2959}
2960
2961/**
2962 * lpfc_bg_scsi_prep_dma_buf_s4 - DMA mapping for scsi buffer to SLI4 IF spec
2963 * @phba: The Hba for which this call is being executed.
2964 * @lpfc_cmd: The scsi buffer which is going to be mapped.
2965 *
2966 * This is the protection/DIF aware version of
2967 * lpfc_scsi_prep_dma_buf(). It may be a good idea to combine the
2968 * two functions eventually, but for now, it's here
2969 **/
2970static int
2971lpfc_bg_scsi_prep_dma_buf_s4(struct lpfc_hba *phba,
2972 struct lpfc_scsi_buf *lpfc_cmd)
2973{
2974 struct scsi_cmnd *scsi_cmnd = lpfc_cmd->pCmd;
2975 struct fcp_cmnd *fcp_cmnd = lpfc_cmd->fcp_cmnd;
2976 struct sli4_sge *sgl = (struct sli4_sge *)(lpfc_cmd->fcp_bpl);
2977 IOCB_t *iocb_cmd = &lpfc_cmd->cur_iocbq.iocb;
2978 uint32_t num_bde = 0;
2979 int datasegcnt, protsegcnt, datadir = scsi_cmnd->sc_data_direction;
2980 int prot_group_type = 0;
2981 int fcpdl;
2982
2983 /*
2984 * Start the lpfc command prep by bumping the sgl beyond fcp_cmnd
2985 * fcp_rsp regions to the first data bde entry
2986 */
2987 if (scsi_sg_count(scsi_cmnd)) {
2988 /*
2989 * The driver stores the segment count returned from pci_map_sg
2990 * because this a count of dma-mappings used to map the use_sg
2991 * pages. They are not guaranteed to be the same for those
2992 * architectures that implement an IOMMU.
2993 */
2994 datasegcnt = dma_map_sg(&phba->pcidev->dev,
2995 scsi_sglist(scsi_cmnd),
2996 scsi_sg_count(scsi_cmnd), datadir);
2997 if (unlikely(!datasegcnt))
2998 return 1;
2999
3000 sgl += 1;
3001 /* clear the last flag in the fcp_rsp map entry */
3002 sgl->word2 = le32_to_cpu(sgl->word2);
3003 bf_set(lpfc_sli4_sge_last, sgl, 0);
3004 sgl->word2 = cpu_to_le32(sgl->word2);
3005
3006 sgl += 1;
3007 lpfc_cmd->seg_cnt = datasegcnt;
3008 if (lpfc_cmd->seg_cnt > phba->cfg_sg_seg_cnt) {
3009 lpfc_printf_log(phba, KERN_ERR, LOG_BG,
3010 "9087 BLKGRD: %s: Too many sg segments"
3011 " from dma_map_sg. Config %d, seg_cnt"
3012 " %d\n",
3013 __func__, phba->cfg_sg_seg_cnt,
3014 lpfc_cmd->seg_cnt);
3015 scsi_dma_unmap(scsi_cmnd);
3016 return 1;
3017 }
3018
3019 prot_group_type = lpfc_prot_group_type(phba, scsi_cmnd);
3020
3021 switch (prot_group_type) {
3022 case LPFC_PG_TYPE_NO_DIF:
3023 num_bde = lpfc_bg_setup_sgl(phba, scsi_cmnd, sgl,
3024 datasegcnt);
3025 /* we should have 2 or more entries in buffer list */
3026 if (num_bde < 2)
3027 goto err;
3028 break;
3029 case LPFC_PG_TYPE_DIF_BUF:{
3030 /*
3031 * This type indicates that protection buffers are
3032 * passed to the driver, so that needs to be prepared
3033 * for DMA
3034 */
3035 protsegcnt = dma_map_sg(&phba->pcidev->dev,
3036 scsi_prot_sglist(scsi_cmnd),
3037 scsi_prot_sg_count(scsi_cmnd), datadir);
3038 if (unlikely(!protsegcnt)) {
3039 scsi_dma_unmap(scsi_cmnd);
3040 return 1;
3041 }
3042
3043 lpfc_cmd->prot_seg_cnt = protsegcnt;
3044 if (lpfc_cmd->prot_seg_cnt
3045 > phba->cfg_prot_sg_seg_cnt) {
3046 lpfc_printf_log(phba, KERN_ERR, LOG_BG,
3047 "9088 BLKGRD: %s: Too many prot sg "
3048 "segments from dma_map_sg. Config %d,"
3049 "prot_seg_cnt %d\n", __func__,
3050 phba->cfg_prot_sg_seg_cnt,
3051 lpfc_cmd->prot_seg_cnt);
3052 dma_unmap_sg(&phba->pcidev->dev,
3053 scsi_prot_sglist(scsi_cmnd),
3054 scsi_prot_sg_count(scsi_cmnd),
3055 datadir);
3056 scsi_dma_unmap(scsi_cmnd);
3057 return 1;
3058 }
3059
3060 num_bde = lpfc_bg_setup_sgl_prot(phba, scsi_cmnd, sgl,
3061 datasegcnt, protsegcnt);
3062 /* we should have 3 or more entries in buffer list */
3063 if (num_bde < 3)
3064 goto err;
3065 break;
3066 }
3067 case LPFC_PG_TYPE_INVALID:
3068 default:
3069 lpfc_printf_log(phba, KERN_ERR, LOG_FCP,
3070 "9083 Unexpected protection group %i\n",
3071 prot_group_type);
3072 return 1;
3073 }
3074 }
3075
3076 fcpdl = lpfc_bg_scsi_adjust_dl(phba, lpfc_cmd);
3077
3078 fcp_cmnd->fcpDl = be32_to_cpu(fcpdl);
3079
3080 /*
3081 * Due to difference in data length between DIF/non-DIF paths,
3082 * we need to set word 4 of IOCB here
3083 */
3084 iocb_cmd->un.fcpi.fcpi_parm = fcpdl;
3085 lpfc_cmd->cur_iocbq.iocb_flag |= LPFC_IO_DIF;
3086
3087 return 0;
3088err:
3089 lpfc_printf_log(phba, KERN_ERR, LOG_FCP,
3090 "9084 Could not setup all needed BDE's"
3091 "prot_group_type=%d, num_bde=%d\n",
3092 prot_group_type, num_bde);
3093 return 1;
3094}
3095
3096/**
2295 * lpfc_scsi_prep_dma_buf - Wrapper function for DMA mapping of scsi buffer 3097 * lpfc_scsi_prep_dma_buf - Wrapper function for DMA mapping of scsi buffer
2296 * @phba: The Hba for which this call is being executed. 3098 * @phba: The Hba for which this call is being executed.
2297 * @lpfc_cmd: The scsi buffer which is going to be mapped. 3099 * @lpfc_cmd: The scsi buffer which is going to be mapped.
@@ -2310,6 +3112,25 @@ lpfc_scsi_prep_dma_buf(struct lpfc_hba *phba, struct lpfc_scsi_buf *lpfc_cmd)
2310} 3112}
2311 3113
2312/** 3114/**
3115 * lpfc_bg_scsi_prep_dma_buf - Wrapper function for DMA mapping of scsi buffer
3116 * using BlockGuard.
3117 * @phba: The Hba for which this call is being executed.
3118 * @lpfc_cmd: The scsi buffer which is going to be mapped.
3119 *
3120 * This routine wraps the actual DMA mapping function pointer from the
3121 * lpfc_hba struct.
3122 *
3123 * Return codes:
3124 * 1 - Error
3125 * 0 - Success
3126 **/
3127static inline int
3128lpfc_bg_scsi_prep_dma_buf(struct lpfc_hba *phba, struct lpfc_scsi_buf *lpfc_cmd)
3129{
3130 return phba->lpfc_bg_scsi_prep_dma_buf(phba, lpfc_cmd);
3131}
3132
3133/**
2313 * lpfc_send_scsi_error_event - Posts an event when there is SCSI error 3134 * lpfc_send_scsi_error_event - Posts an event when there is SCSI error
2314 * @phba: Pointer to hba context object. 3135 * @phba: Pointer to hba context object.
2315 * @vport: Pointer to vport object. 3136 * @vport: Pointer to vport object.
@@ -3072,12 +3893,14 @@ lpfc_scsi_api_table_setup(struct lpfc_hba *phba, uint8_t dev_grp)
3072 case LPFC_PCI_DEV_LP: 3893 case LPFC_PCI_DEV_LP:
3073 phba->lpfc_new_scsi_buf = lpfc_new_scsi_buf_s3; 3894 phba->lpfc_new_scsi_buf = lpfc_new_scsi_buf_s3;
3074 phba->lpfc_scsi_prep_dma_buf = lpfc_scsi_prep_dma_buf_s3; 3895 phba->lpfc_scsi_prep_dma_buf = lpfc_scsi_prep_dma_buf_s3;
3896 phba->lpfc_bg_scsi_prep_dma_buf = lpfc_bg_scsi_prep_dma_buf_s3;
3075 phba->lpfc_release_scsi_buf = lpfc_release_scsi_buf_s3; 3897 phba->lpfc_release_scsi_buf = lpfc_release_scsi_buf_s3;
3076 phba->lpfc_get_scsi_buf = lpfc_get_scsi_buf_s3; 3898 phba->lpfc_get_scsi_buf = lpfc_get_scsi_buf_s3;
3077 break; 3899 break;
3078 case LPFC_PCI_DEV_OC: 3900 case LPFC_PCI_DEV_OC:
3079 phba->lpfc_new_scsi_buf = lpfc_new_scsi_buf_s4; 3901 phba->lpfc_new_scsi_buf = lpfc_new_scsi_buf_s4;
3080 phba->lpfc_scsi_prep_dma_buf = lpfc_scsi_prep_dma_buf_s4; 3902 phba->lpfc_scsi_prep_dma_buf = lpfc_scsi_prep_dma_buf_s4;
3903 phba->lpfc_bg_scsi_prep_dma_buf = lpfc_bg_scsi_prep_dma_buf_s4;
3081 phba->lpfc_release_scsi_buf = lpfc_release_scsi_buf_s4; 3904 phba->lpfc_release_scsi_buf = lpfc_release_scsi_buf_s4;
3082 phba->lpfc_get_scsi_buf = lpfc_get_scsi_buf_s4; 3905 phba->lpfc_get_scsi_buf = lpfc_get_scsi_buf_s4;
3083 break; 3906 break;
@@ -3250,8 +4073,7 @@ lpfc_queuecommand_lck(struct scsi_cmnd *cmnd, void (*done) (struct scsi_cmnd *))
3250 ndlp = rdata->pnode; 4073 ndlp = rdata->pnode;
3251 4074
3252 if ((scsi_get_prot_op(cmnd) != SCSI_PROT_NORMAL) && 4075 if ((scsi_get_prot_op(cmnd) != SCSI_PROT_NORMAL) &&
3253 (!(phba->sli3_options & LPFC_SLI3_BG_ENABLED) || 4076 (!(phba->sli3_options & LPFC_SLI3_BG_ENABLED))) {
3254 (phba->sli_rev == LPFC_SLI_REV4))) {
3255 4077
3256 lpfc_printf_log(phba, KERN_ERR, LOG_BG, 4078 lpfc_printf_log(phba, KERN_ERR, LOG_BG,
3257 "9058 BLKGRD: ERROR: rcvd protected cmd:%02x" 4079 "9058 BLKGRD: ERROR: rcvd protected cmd:%02x"
diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c
index 23a27592388c..e0e4d8d18244 100644
--- a/drivers/scsi/lpfc/lpfc_sli.c
+++ b/drivers/scsi/lpfc/lpfc_sli.c
@@ -293,7 +293,9 @@ lpfc_sli4_eq_release(struct lpfc_queue *q, bool arm)
293 } 293 }
294 bf_set(lpfc_eqcq_doorbell_num_released, &doorbell, released); 294 bf_set(lpfc_eqcq_doorbell_num_released, &doorbell, released);
295 bf_set(lpfc_eqcq_doorbell_qt, &doorbell, LPFC_QUEUE_TYPE_EVENT); 295 bf_set(lpfc_eqcq_doorbell_qt, &doorbell, LPFC_QUEUE_TYPE_EVENT);
296 bf_set(lpfc_eqcq_doorbell_eqid, &doorbell, q->queue_id); 296 bf_set(lpfc_eqcq_doorbell_eqid_hi, &doorbell,
297 (q->queue_id >> LPFC_EQID_HI_FIELD_SHIFT));
298 bf_set(lpfc_eqcq_doorbell_eqid_lo, &doorbell, q->queue_id);
297 writel(doorbell.word0, q->phba->sli4_hba.EQCQDBregaddr); 299 writel(doorbell.word0, q->phba->sli4_hba.EQCQDBregaddr);
298 /* PCI read to flush PCI pipeline on re-arming for INTx mode */ 300 /* PCI read to flush PCI pipeline on re-arming for INTx mode */
299 if ((q->phba->intr_type == INTx) && (arm == LPFC_QUEUE_REARM)) 301 if ((q->phba->intr_type == INTx) && (arm == LPFC_QUEUE_REARM))
@@ -372,7 +374,9 @@ lpfc_sli4_cq_release(struct lpfc_queue *q, bool arm)
372 bf_set(lpfc_eqcq_doorbell_arm, &doorbell, 1); 374 bf_set(lpfc_eqcq_doorbell_arm, &doorbell, 1);
373 bf_set(lpfc_eqcq_doorbell_num_released, &doorbell, released); 375 bf_set(lpfc_eqcq_doorbell_num_released, &doorbell, released);
374 bf_set(lpfc_eqcq_doorbell_qt, &doorbell, LPFC_QUEUE_TYPE_COMPLETION); 376 bf_set(lpfc_eqcq_doorbell_qt, &doorbell, LPFC_QUEUE_TYPE_COMPLETION);
375 bf_set(lpfc_eqcq_doorbell_cqid, &doorbell, q->queue_id); 377 bf_set(lpfc_eqcq_doorbell_cqid_hi, &doorbell,
378 (q->queue_id >> LPFC_CQID_HI_FIELD_SHIFT));
379 bf_set(lpfc_eqcq_doorbell_cqid_lo, &doorbell, q->queue_id);
376 writel(doorbell.word0, q->phba->sli4_hba.EQCQDBregaddr); 380 writel(doorbell.word0, q->phba->sli4_hba.EQCQDBregaddr);
377 return released; 381 return released;
378} 382}
@@ -554,81 +558,6 @@ __lpfc_get_active_sglq(struct lpfc_hba *phba, uint16_t xritag)
554} 558}
555 559
556/** 560/**
557 * __lpfc_set_rrq_active - set RRQ active bit in the ndlp's xri_bitmap.
558 * @phba: Pointer to HBA context object.
559 * @ndlp: nodelist pointer for this target.
560 * @xritag: xri used in this exchange.
561 * @rxid: Remote Exchange ID.
562 * @send_rrq: Flag used to determine if we should send rrq els cmd.
563 *
564 * This function is called with hbalock held.
565 * The active bit is set in the ndlp's active rrq xri_bitmap. Allocates an
566 * rrq struct and adds it to the active_rrq_list.
567 *
568 * returns 0 for rrq slot for this xri
569 * < 0 Were not able to get rrq mem or invalid parameter.
570 **/
571static int
572__lpfc_set_rrq_active(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp,
573 uint16_t xritag, uint16_t rxid, uint16_t send_rrq)
574{
575 struct lpfc_node_rrq *rrq;
576 int empty;
577 uint32_t did = 0;
578
579
580 if (!ndlp)
581 return -EINVAL;
582
583 if (!phba->cfg_enable_rrq)
584 return -EINVAL;
585
586 if (phba->pport->load_flag & FC_UNLOADING) {
587 phba->hba_flag &= ~HBA_RRQ_ACTIVE;
588 goto out;
589 }
590 did = ndlp->nlp_DID;
591
592 /*
593 * set the active bit even if there is no mem available.
594 */
595 if (NLP_CHK_FREE_REQ(ndlp))
596 goto out;
597
598 if (ndlp->vport && (ndlp->vport->load_flag & FC_UNLOADING))
599 goto out;
600
601 if (test_and_set_bit(xritag, ndlp->active_rrqs.xri_bitmap))
602 goto out;
603
604 rrq = mempool_alloc(phba->rrq_pool, GFP_KERNEL);
605 if (rrq) {
606 rrq->send_rrq = send_rrq;
607 rrq->xritag = xritag;
608 rrq->rrq_stop_time = jiffies + HZ * (phba->fc_ratov + 1);
609 rrq->ndlp = ndlp;
610 rrq->nlp_DID = ndlp->nlp_DID;
611 rrq->vport = ndlp->vport;
612 rrq->rxid = rxid;
613 empty = list_empty(&phba->active_rrq_list);
614 rrq->send_rrq = send_rrq;
615 list_add_tail(&rrq->list, &phba->active_rrq_list);
616 if (!(phba->hba_flag & HBA_RRQ_ACTIVE)) {
617 phba->hba_flag |= HBA_RRQ_ACTIVE;
618 if (empty)
619 lpfc_worker_wake_up(phba);
620 }
621 return 0;
622 }
623out:
624 lpfc_printf_log(phba, KERN_INFO, LOG_SLI,
625 "2921 Can't set rrq active xri:0x%x rxid:0x%x"
626 " DID:0x%x Send:%d\n",
627 xritag, rxid, did, send_rrq);
628 return -EINVAL;
629}
630
631/**
632 * lpfc_clr_rrq_active - Clears RRQ active bit in xri_bitmap. 561 * lpfc_clr_rrq_active - Clears RRQ active bit in xri_bitmap.
633 * @phba: Pointer to HBA context object. 562 * @phba: Pointer to HBA context object.
634 * @xritag: xri used in this exchange. 563 * @xritag: xri used in this exchange.
@@ -856,15 +785,68 @@ lpfc_test_rrq_active(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp,
856 **/ 785 **/
857int 786int
858lpfc_set_rrq_active(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp, 787lpfc_set_rrq_active(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp,
859 uint16_t xritag, uint16_t rxid, uint16_t send_rrq) 788 uint16_t xritag, uint16_t rxid, uint16_t send_rrq)
860{ 789{
861 int ret;
862 unsigned long iflags; 790 unsigned long iflags;
791 struct lpfc_node_rrq *rrq;
792 int empty;
793
794 if (!ndlp)
795 return -EINVAL;
796
797 if (!phba->cfg_enable_rrq)
798 return -EINVAL;
863 799
864 spin_lock_irqsave(&phba->hbalock, iflags); 800 spin_lock_irqsave(&phba->hbalock, iflags);
865 ret = __lpfc_set_rrq_active(phba, ndlp, xritag, rxid, send_rrq); 801 if (phba->pport->load_flag & FC_UNLOADING) {
802 phba->hba_flag &= ~HBA_RRQ_ACTIVE;
803 goto out;
804 }
805
806 /*
807 * set the active bit even if there is no mem available.
808 */
809 if (NLP_CHK_FREE_REQ(ndlp))
810 goto out;
811
812 if (ndlp->vport && (ndlp->vport->load_flag & FC_UNLOADING))
813 goto out;
814
815 if (test_and_set_bit(xritag, ndlp->active_rrqs.xri_bitmap))
816 goto out;
817
866 spin_unlock_irqrestore(&phba->hbalock, iflags); 818 spin_unlock_irqrestore(&phba->hbalock, iflags);
867 return ret; 819 rrq = mempool_alloc(phba->rrq_pool, GFP_KERNEL);
820 if (!rrq) {
821 lpfc_printf_log(phba, KERN_INFO, LOG_SLI,
822 "3155 Unable to allocate RRQ xri:0x%x rxid:0x%x"
823 " DID:0x%x Send:%d\n",
824 xritag, rxid, ndlp->nlp_DID, send_rrq);
825 return -EINVAL;
826 }
827 rrq->send_rrq = send_rrq;
828 rrq->xritag = xritag;
829 rrq->rrq_stop_time = jiffies + HZ * (phba->fc_ratov + 1);
830 rrq->ndlp = ndlp;
831 rrq->nlp_DID = ndlp->nlp_DID;
832 rrq->vport = ndlp->vport;
833 rrq->rxid = rxid;
834 rrq->send_rrq = send_rrq;
835 spin_lock_irqsave(&phba->hbalock, iflags);
836 empty = list_empty(&phba->active_rrq_list);
837 list_add_tail(&rrq->list, &phba->active_rrq_list);
838 phba->hba_flag |= HBA_RRQ_ACTIVE;
839 if (empty)
840 lpfc_worker_wake_up(phba);
841 spin_unlock_irqrestore(&phba->hbalock, iflags);
842 return 0;
843out:
844 spin_unlock_irqrestore(&phba->hbalock, iflags);
845 lpfc_printf_log(phba, KERN_INFO, LOG_SLI,
846 "2921 Can't set rrq active xri:0x%x rxid:0x%x"
847 " DID:0x%x Send:%d\n",
848 xritag, rxid, ndlp->nlp_DID, send_rrq);
849 return -EINVAL;
868} 850}
869 851
870/** 852/**
@@ -5596,6 +5578,8 @@ lpfc_sli4_alloc_resource_identifiers(struct lpfc_hba *phba)
5596 for (i = 0; i < count; i++) 5578 for (i = 0; i < count; i++)
5597 phba->sli4_hba.rpi_ids[i] = base + i; 5579 phba->sli4_hba.rpi_ids[i] = base + i;
5598 5580
5581 lpfc_sli4_node_prep(phba);
5582
5599 /* VPIs. */ 5583 /* VPIs. */
5600 count = phba->sli4_hba.max_cfg_param.max_vpi; 5584 count = phba->sli4_hba.max_cfg_param.max_vpi;
5601 base = phba->sli4_hba.max_cfg_param.vpi_base; 5585 base = phba->sli4_hba.max_cfg_param.vpi_base;
@@ -7555,6 +7539,8 @@ lpfc_sli4_bpl2sgl(struct lpfc_hba *phba, struct lpfc_iocbq *piocbq,
7555 7539
7556 sgl = (struct sli4_sge *)sglq->sgl; 7540 sgl = (struct sli4_sge *)sglq->sgl;
7557 icmd = &piocbq->iocb; 7541 icmd = &piocbq->iocb;
7542 if (icmd->ulpCommand == CMD_XMIT_BLS_RSP64_CX)
7543 return sglq->sli4_xritag;
7558 if (icmd->un.genreq64.bdl.bdeFlags == BUFF_TYPE_BLP_64) { 7544 if (icmd->un.genreq64.bdl.bdeFlags == BUFF_TYPE_BLP_64) {
7559 numBdes = icmd->un.genreq64.bdl.bdeSize / 7545 numBdes = icmd->un.genreq64.bdl.bdeSize /
7560 sizeof(struct ulp_bde64); 7546 sizeof(struct ulp_bde64);
@@ -7756,6 +7742,7 @@ lpfc_sli4_iocb2wqe(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq,
7756 if (if_type == LPFC_SLI_INTF_IF_TYPE_2) { 7742 if (if_type == LPFC_SLI_INTF_IF_TYPE_2) {
7757 if (pcmd && (*pcmd == ELS_CMD_FLOGI || 7743 if (pcmd && (*pcmd == ELS_CMD_FLOGI ||
7758 *pcmd == ELS_CMD_SCR || 7744 *pcmd == ELS_CMD_SCR ||
7745 *pcmd == ELS_CMD_FDISC ||
7759 *pcmd == ELS_CMD_PLOGI)) { 7746 *pcmd == ELS_CMD_PLOGI)) {
7760 bf_set(els_req64_sp, &wqe->els_req, 1); 7747 bf_set(els_req64_sp, &wqe->els_req, 1);
7761 bf_set(els_req64_sid, &wqe->els_req, 7748 bf_set(els_req64_sid, &wqe->els_req,
@@ -7763,7 +7750,7 @@ lpfc_sli4_iocb2wqe(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq,
7763 bf_set(wqe_ct, &wqe->els_req.wqe_com, 1); 7750 bf_set(wqe_ct, &wqe->els_req.wqe_com, 1);
7764 bf_set(wqe_ctxt_tag, &wqe->els_req.wqe_com, 7751 bf_set(wqe_ctxt_tag, &wqe->els_req.wqe_com,
7765 phba->vpi_ids[phba->pport->vpi]); 7752 phba->vpi_ids[phba->pport->vpi]);
7766 } else if (iocbq->context1) { 7753 } else if (pcmd && iocbq->context1) {
7767 bf_set(wqe_ct, &wqe->els_req.wqe_com, 0); 7754 bf_set(wqe_ct, &wqe->els_req.wqe_com, 0);
7768 bf_set(wqe_ctxt_tag, &wqe->els_req.wqe_com, 7755 bf_set(wqe_ctxt_tag, &wqe->els_req.wqe_com,
7769 phba->sli4_hba.rpi_ids[ndlp->nlp_rpi]); 7756 phba->sli4_hba.rpi_ids[ndlp->nlp_rpi]);
@@ -7830,12 +7817,16 @@ lpfc_sli4_iocb2wqe(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq,
7830 bf_set(wqe_lnk, &wqe->fcp_iwrite.wqe_com, iocbq->iocb.ulpXS); 7817 bf_set(wqe_lnk, &wqe->fcp_iwrite.wqe_com, iocbq->iocb.ulpXS);
7831 /* Always open the exchange */ 7818 /* Always open the exchange */
7832 bf_set(wqe_xc, &wqe->fcp_iwrite.wqe_com, 0); 7819 bf_set(wqe_xc, &wqe->fcp_iwrite.wqe_com, 0);
7833 bf_set(wqe_dbde, &wqe->fcp_iwrite.wqe_com, 1);
7834 bf_set(wqe_iod, &wqe->fcp_iwrite.wqe_com, LPFC_WQE_IOD_WRITE); 7820 bf_set(wqe_iod, &wqe->fcp_iwrite.wqe_com, LPFC_WQE_IOD_WRITE);
7835 bf_set(wqe_lenloc, &wqe->fcp_iwrite.wqe_com, 7821 bf_set(wqe_lenloc, &wqe->fcp_iwrite.wqe_com,
7836 LPFC_WQE_LENLOC_WORD4); 7822 LPFC_WQE_LENLOC_WORD4);
7837 bf_set(wqe_ebde_cnt, &wqe->fcp_iwrite.wqe_com, 0); 7823 bf_set(wqe_ebde_cnt, &wqe->fcp_iwrite.wqe_com, 0);
7838 bf_set(wqe_pu, &wqe->fcp_iwrite.wqe_com, iocbq->iocb.ulpPU); 7824 bf_set(wqe_pu, &wqe->fcp_iwrite.wqe_com, iocbq->iocb.ulpPU);
7825 if (iocbq->iocb_flag & LPFC_IO_DIF) {
7826 iocbq->iocb_flag &= ~LPFC_IO_DIF;
7827 bf_set(wqe_dif, &wqe->generic.wqe_com, 1);
7828 }
7829 bf_set(wqe_dbde, &wqe->fcp_iwrite.wqe_com, 1);
7839 break; 7830 break;
7840 case CMD_FCP_IREAD64_CR: 7831 case CMD_FCP_IREAD64_CR:
7841 /* word3 iocb=iotag wqe=payload_offset_len */ 7832 /* word3 iocb=iotag wqe=payload_offset_len */
@@ -7849,12 +7840,16 @@ lpfc_sli4_iocb2wqe(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq,
7849 bf_set(wqe_lnk, &wqe->fcp_iread.wqe_com, iocbq->iocb.ulpXS); 7840 bf_set(wqe_lnk, &wqe->fcp_iread.wqe_com, iocbq->iocb.ulpXS);
7850 /* Always open the exchange */ 7841 /* Always open the exchange */
7851 bf_set(wqe_xc, &wqe->fcp_iread.wqe_com, 0); 7842 bf_set(wqe_xc, &wqe->fcp_iread.wqe_com, 0);
7852 bf_set(wqe_dbde, &wqe->fcp_iread.wqe_com, 1);
7853 bf_set(wqe_iod, &wqe->fcp_iread.wqe_com, LPFC_WQE_IOD_READ); 7843 bf_set(wqe_iod, &wqe->fcp_iread.wqe_com, LPFC_WQE_IOD_READ);
7854 bf_set(wqe_lenloc, &wqe->fcp_iread.wqe_com, 7844 bf_set(wqe_lenloc, &wqe->fcp_iread.wqe_com,
7855 LPFC_WQE_LENLOC_WORD4); 7845 LPFC_WQE_LENLOC_WORD4);
7856 bf_set(wqe_ebde_cnt, &wqe->fcp_iread.wqe_com, 0); 7846 bf_set(wqe_ebde_cnt, &wqe->fcp_iread.wqe_com, 0);
7857 bf_set(wqe_pu, &wqe->fcp_iread.wqe_com, iocbq->iocb.ulpPU); 7847 bf_set(wqe_pu, &wqe->fcp_iread.wqe_com, iocbq->iocb.ulpPU);
7848 if (iocbq->iocb_flag & LPFC_IO_DIF) {
7849 iocbq->iocb_flag &= ~LPFC_IO_DIF;
7850 bf_set(wqe_dif, &wqe->generic.wqe_com, 1);
7851 }
7852 bf_set(wqe_dbde, &wqe->fcp_iread.wqe_com, 1);
7858 break; 7853 break;
7859 case CMD_FCP_ICMND64_CR: 7854 case CMD_FCP_ICMND64_CR:
7860 /* word3 iocb=IO_TAG wqe=reserved */ 7855 /* word3 iocb=IO_TAG wqe=reserved */
@@ -7982,6 +7977,7 @@ lpfc_sli4_iocb2wqe(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq,
7982 xritag = 0; 7977 xritag = 0;
7983 break; 7978 break;
7984 case CMD_XMIT_BLS_RSP64_CX: 7979 case CMD_XMIT_BLS_RSP64_CX:
7980 ndlp = (struct lpfc_nodelist *)iocbq->context1;
7985 /* As BLS ABTS RSP WQE is very different from other WQEs, 7981 /* As BLS ABTS RSP WQE is very different from other WQEs,
7986 * we re-construct this WQE here based on information in 7982 * we re-construct this WQE here based on information in
7987 * iocbq from scratch. 7983 * iocbq from scratch.
@@ -8008,8 +8004,15 @@ lpfc_sli4_iocb2wqe(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq,
8008 } 8004 }
8009 bf_set(xmit_bls_rsp64_seqcnthi, &wqe->xmit_bls_rsp, 0xffff); 8005 bf_set(xmit_bls_rsp64_seqcnthi, &wqe->xmit_bls_rsp, 0xffff);
8010 bf_set(wqe_xmit_bls_pt, &wqe->xmit_bls_rsp.wqe_dest, 0x1); 8006 bf_set(wqe_xmit_bls_pt, &wqe->xmit_bls_rsp.wqe_dest, 0x1);
8007
8008 /* Use CT=VPI */
8009 bf_set(wqe_els_did, &wqe->xmit_bls_rsp.wqe_dest,
8010 ndlp->nlp_DID);
8011 bf_set(xmit_bls_rsp64_temprpi, &wqe->xmit_bls_rsp,
8012 iocbq->iocb.ulpContext);
8013 bf_set(wqe_ct, &wqe->xmit_bls_rsp.wqe_com, 1);
8011 bf_set(wqe_ctxt_tag, &wqe->xmit_bls_rsp.wqe_com, 8014 bf_set(wqe_ctxt_tag, &wqe->xmit_bls_rsp.wqe_com,
8012 iocbq->iocb.ulpContext); 8015 phba->vpi_ids[phba->pport->vpi]);
8013 bf_set(wqe_qosd, &wqe->xmit_bls_rsp.wqe_com, 1); 8016 bf_set(wqe_qosd, &wqe->xmit_bls_rsp.wqe_com, 1);
8014 bf_set(wqe_lenloc, &wqe->xmit_bls_rsp.wqe_com, 8017 bf_set(wqe_lenloc, &wqe->xmit_bls_rsp.wqe_com,
8015 LPFC_WQE_LENLOC_NONE); 8018 LPFC_WQE_LENLOC_NONE);
@@ -8073,8 +8076,7 @@ __lpfc_sli_issue_iocb_s4(struct lpfc_hba *phba, uint32_t ring_number,
8073 8076
8074 if (piocb->sli4_xritag == NO_XRI) { 8077 if (piocb->sli4_xritag == NO_XRI) {
8075 if (piocb->iocb.ulpCommand == CMD_ABORT_XRI_CN || 8078 if (piocb->iocb.ulpCommand == CMD_ABORT_XRI_CN ||
8076 piocb->iocb.ulpCommand == CMD_CLOSE_XRI_CN || 8079 piocb->iocb.ulpCommand == CMD_CLOSE_XRI_CN)
8077 piocb->iocb.ulpCommand == CMD_XMIT_BLS_RSP64_CX)
8078 sglq = NULL; 8080 sglq = NULL;
8079 else { 8081 else {
8080 if (pring->txq_cnt) { 8082 if (pring->txq_cnt) {
@@ -8384,10 +8386,13 @@ lpfc_sli4_abts_err_handler(struct lpfc_hba *phba,
8384{ 8386{
8385 struct lpfc_vport *vport; 8387 struct lpfc_vport *vport;
8386 8388
8387 if (!ndlp || !NLP_CHK_NODE_ACT(ndlp)) 8389 if (!ndlp || !NLP_CHK_NODE_ACT(ndlp)) {
8388 lpfc_printf_log(phba, KERN_INFO, LOG_SLI, 8390 lpfc_printf_log(phba, KERN_INFO, LOG_SLI,
8389 "3115 Node Context not found, driver " 8391 "3115 Node Context not found, driver "
8390 "ignoring abts err event\n"); 8392 "ignoring abts err event\n");
8393 return;
8394 }
8395
8391 vport = ndlp->vport; 8396 vport = ndlp->vport;
8392 lpfc_printf_log(phba, KERN_WARNING, LOG_SLI, 8397 lpfc_printf_log(phba, KERN_WARNING, LOG_SLI,
8393 "3116 Port generated FCP XRI ABORT event on " 8398 "3116 Port generated FCP XRI ABORT event on "
@@ -10653,12 +10658,14 @@ lpfc_sli4_iocb_param_transfer(struct lpfc_hba *phba,
10653 struct lpfc_wcqe_complete *wcqe) 10658 struct lpfc_wcqe_complete *wcqe)
10654{ 10659{
10655 unsigned long iflags; 10660 unsigned long iflags;
10661 uint32_t status;
10656 size_t offset = offsetof(struct lpfc_iocbq, iocb); 10662 size_t offset = offsetof(struct lpfc_iocbq, iocb);
10657 10663
10658 memcpy((char *)pIocbIn + offset, (char *)pIocbOut + offset, 10664 memcpy((char *)pIocbIn + offset, (char *)pIocbOut + offset,
10659 sizeof(struct lpfc_iocbq) - offset); 10665 sizeof(struct lpfc_iocbq) - offset);
10660 /* Map WCQE parameters into irspiocb parameters */ 10666 /* Map WCQE parameters into irspiocb parameters */
10661 pIocbIn->iocb.ulpStatus = bf_get(lpfc_wcqe_c_status, wcqe); 10667 status = bf_get(lpfc_wcqe_c_status, wcqe);
10668 pIocbIn->iocb.ulpStatus = (status & LPFC_IOCB_STATUS_MASK);
10662 if (pIocbOut->iocb_flag & LPFC_IO_FCP) 10669 if (pIocbOut->iocb_flag & LPFC_IO_FCP)
10663 if (pIocbIn->iocb.ulpStatus == IOSTAT_FCP_RSP_ERROR) 10670 if (pIocbIn->iocb.ulpStatus == IOSTAT_FCP_RSP_ERROR)
10664 pIocbIn->iocb.un.fcpi.fcpi_parm = 10671 pIocbIn->iocb.un.fcpi.fcpi_parm =
@@ -10671,6 +10678,44 @@ lpfc_sli4_iocb_param_transfer(struct lpfc_hba *phba,
10671 pIocbIn->iocb.un.genreq64.bdl.bdeSize = wcqe->total_data_placed; 10678 pIocbIn->iocb.un.genreq64.bdl.bdeSize = wcqe->total_data_placed;
10672 } 10679 }
10673 10680
10681 /* Convert BG errors for completion status */
10682 if (status == CQE_STATUS_DI_ERROR) {
10683 pIocbIn->iocb.ulpStatus = IOSTAT_LOCAL_REJECT;
10684
10685 if (bf_get(lpfc_wcqe_c_bg_edir, wcqe))
10686 pIocbIn->iocb.un.ulpWord[4] = IOERR_RX_DMA_FAILED;
10687 else
10688 pIocbIn->iocb.un.ulpWord[4] = IOERR_TX_DMA_FAILED;
10689
10690 pIocbIn->iocb.unsli3.sli3_bg.bgstat = 0;
10691 if (bf_get(lpfc_wcqe_c_bg_ge, wcqe)) /* Guard Check failed */
10692 pIocbIn->iocb.unsli3.sli3_bg.bgstat |=
10693 BGS_GUARD_ERR_MASK;
10694 if (bf_get(lpfc_wcqe_c_bg_ae, wcqe)) /* App Tag Check failed */
10695 pIocbIn->iocb.unsli3.sli3_bg.bgstat |=
10696 BGS_APPTAG_ERR_MASK;
10697 if (bf_get(lpfc_wcqe_c_bg_re, wcqe)) /* Ref Tag Check failed */
10698 pIocbIn->iocb.unsli3.sli3_bg.bgstat |=
10699 BGS_REFTAG_ERR_MASK;
10700
10701 /* Check to see if there was any good data before the error */
10702 if (bf_get(lpfc_wcqe_c_bg_tdpv, wcqe)) {
10703 pIocbIn->iocb.unsli3.sli3_bg.bgstat |=
10704 BGS_HI_WATER_MARK_PRESENT_MASK;
10705 pIocbIn->iocb.unsli3.sli3_bg.bghm =
10706 wcqe->total_data_placed;
10707 }
10708
10709 /*
10710 * Set ALL the error bits to indicate we don't know what
10711 * type of error it is.
10712 */
10713 if (!pIocbIn->iocb.unsli3.sli3_bg.bgstat)
10714 pIocbIn->iocb.unsli3.sli3_bg.bgstat |=
10715 (BGS_REFTAG_ERR_MASK | BGS_APPTAG_ERR_MASK |
10716 BGS_GUARD_ERR_MASK);
10717 }
10718
10674 /* Pick up HBA exchange busy condition */ 10719 /* Pick up HBA exchange busy condition */
10675 if (bf_get(lpfc_wcqe_c_xb, wcqe)) { 10720 if (bf_get(lpfc_wcqe_c_xb, wcqe)) {
10676 spin_lock_irqsave(&phba->hbalock, iflags); 10721 spin_lock_irqsave(&phba->hbalock, iflags);
@@ -14042,6 +14087,13 @@ lpfc_sli4_seq_abort_rsp_cmpl(struct lpfc_hba *phba,
14042{ 14087{
14043 if (cmd_iocbq) 14088 if (cmd_iocbq)
14044 lpfc_sli_release_iocbq(phba, cmd_iocbq); 14089 lpfc_sli_release_iocbq(phba, cmd_iocbq);
14090
14091 /* Failure means BLS ABORT RSP did not get delivered to remote node*/
14092 if (rsp_iocbq && rsp_iocbq->iocb.ulpStatus)
14093 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
14094 "3154 BLS ABORT RSP failed, data: x%x/x%x\n",
14095 rsp_iocbq->iocb.ulpStatus,
14096 rsp_iocbq->iocb.un.ulpWord[4]);
14045} 14097}
14046 14098
14047/** 14099/**
@@ -14748,7 +14800,8 @@ lpfc_sli4_remove_rpis(struct lpfc_hba *phba)
14748 * provided rpi via a bitmask. 14800 * provided rpi via a bitmask.
14749 **/ 14801 **/
14750int 14802int
14751lpfc_sli4_resume_rpi(struct lpfc_nodelist *ndlp) 14803lpfc_sli4_resume_rpi(struct lpfc_nodelist *ndlp,
14804 void (*cmpl)(struct lpfc_hba *, LPFC_MBOXQ_t *), void *arg)
14752{ 14805{
14753 LPFC_MBOXQ_t *mboxq; 14806 LPFC_MBOXQ_t *mboxq;
14754 struct lpfc_hba *phba = ndlp->phba; 14807 struct lpfc_hba *phba = ndlp->phba;
@@ -14761,6 +14814,13 @@ lpfc_sli4_resume_rpi(struct lpfc_nodelist *ndlp)
14761 14814
14762 /* Post all rpi memory regions to the port. */ 14815 /* Post all rpi memory regions to the port. */
14763 lpfc_resume_rpi(mboxq, ndlp); 14816 lpfc_resume_rpi(mboxq, ndlp);
14817 if (cmpl) {
14818 mboxq->mbox_cmpl = cmpl;
14819 mboxq->context1 = arg;
14820 mboxq->context2 = ndlp;
14821 } else
14822 mboxq->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
14823 mboxq->vport = ndlp->vport;
14764 rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_NOWAIT); 14824 rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_NOWAIT);
14765 if (rc == MBX_NOT_FINISHED) { 14825 if (rc == MBX_NOT_FINISHED) {
14766 lpfc_printf_log(phba, KERN_ERR, LOG_SLI, 14826 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
diff --git a/drivers/scsi/lpfc/lpfc_sli.h b/drivers/scsi/lpfc/lpfc_sli.h
index 29c13b63e323..3290b8e7ab65 100644
--- a/drivers/scsi/lpfc/lpfc_sli.h
+++ b/drivers/scsi/lpfc/lpfc_sli.h
@@ -69,6 +69,7 @@ struct lpfc_iocbq {
69#define LPFC_USE_FCPWQIDX 0x80 /* Submit to specified FCPWQ index */ 69#define LPFC_USE_FCPWQIDX 0x80 /* Submit to specified FCPWQ index */
70#define DSS_SECURITY_OP 0x100 /* security IO */ 70#define DSS_SECURITY_OP 0x100 /* security IO */
71#define LPFC_IO_ON_Q 0x200 /* The IO is still on the TXCMPLQ */ 71#define LPFC_IO_ON_Q 0x200 /* The IO is still on the TXCMPLQ */
72#define LPFC_IO_DIF 0x400 /* T10 DIF IO */
72 73
73#define LPFC_FIP_ELS_ID_MASK 0xc000 /* ELS_ID range 0-3, non-shifted mask */ 74#define LPFC_FIP_ELS_ID_MASK 0xc000 /* ELS_ID range 0-3, non-shifted mask */
74#define LPFC_FIP_ELS_ID_SHIFT 14 75#define LPFC_FIP_ELS_ID_SHIFT 14
diff --git a/drivers/scsi/lpfc/lpfc_sli4.h b/drivers/scsi/lpfc/lpfc_sli4.h
index 3f266e2c54e0..c19d139618b7 100644
--- a/drivers/scsi/lpfc/lpfc_sli4.h
+++ b/drivers/scsi/lpfc/lpfc_sli4.h
@@ -633,7 +633,8 @@ void lpfc_sli4_free_rpi(struct lpfc_hba *, int);
633void lpfc_sli4_remove_rpis(struct lpfc_hba *); 633void lpfc_sli4_remove_rpis(struct lpfc_hba *);
634void lpfc_sli4_async_event_proc(struct lpfc_hba *); 634void lpfc_sli4_async_event_proc(struct lpfc_hba *);
635void lpfc_sli4_fcf_redisc_event_proc(struct lpfc_hba *); 635void lpfc_sli4_fcf_redisc_event_proc(struct lpfc_hba *);
636int lpfc_sli4_resume_rpi(struct lpfc_nodelist *); 636int lpfc_sli4_resume_rpi(struct lpfc_nodelist *,
637 void (*)(struct lpfc_hba *, LPFC_MBOXQ_t *), void *);
637void lpfc_sli4_fcp_xri_abort_event_proc(struct lpfc_hba *); 638void lpfc_sli4_fcp_xri_abort_event_proc(struct lpfc_hba *);
638void lpfc_sli4_els_xri_abort_event_proc(struct lpfc_hba *); 639void lpfc_sli4_els_xri_abort_event_proc(struct lpfc_hba *);
639void lpfc_sli4_fcp_xri_aborted(struct lpfc_hba *, 640void lpfc_sli4_fcp_xri_aborted(struct lpfc_hba *,
diff --git a/drivers/scsi/lpfc/lpfc_version.h b/drivers/scsi/lpfc/lpfc_version.h
index dd044d01a07f..f2a2602e5c35 100644
--- a/drivers/scsi/lpfc/lpfc_version.h
+++ b/drivers/scsi/lpfc/lpfc_version.h
@@ -18,7 +18,7 @@
18 * included with this package. * 18 * included with this package. *
19 *******************************************************************/ 19 *******************************************************************/
20 20
21#define LPFC_DRIVER_VERSION "8.3.28" 21#define LPFC_DRIVER_VERSION "8.3.29"
22#define LPFC_DRIVER_NAME "lpfc" 22#define LPFC_DRIVER_NAME "lpfc"
23#define LPFC_SP_DRIVER_HANDLER_NAME "lpfc:sp" 23#define LPFC_SP_DRIVER_HANDLER_NAME "lpfc:sp"
24#define LPFC_FP_DRIVER_HANDLER_NAME "lpfc:fp" 24#define LPFC_FP_DRIVER_HANDLER_NAME "lpfc:fp"
diff --git a/drivers/scsi/mpt2sas/mpt2sas_base.c b/drivers/scsi/mpt2sas/mpt2sas_base.c
index a78036f5e1a6..82fa6ce481f0 100644
--- a/drivers/scsi/mpt2sas/mpt2sas_base.c
+++ b/drivers/scsi/mpt2sas/mpt2sas_base.c
@@ -2575,6 +2575,11 @@ _base_allocate_memory_pools(struct MPT2SAS_ADAPTER *ioc, int sleep_flag)
2575 2575
2576 ioc->chain_lookup = (struct chain_tracker *)__get_free_pages( 2576 ioc->chain_lookup = (struct chain_tracker *)__get_free_pages(
2577 GFP_KERNEL, ioc->chain_pages); 2577 GFP_KERNEL, ioc->chain_pages);
2578 if (!ioc->chain_lookup) {
2579 printk(MPT2SAS_ERR_FMT "chain_lookup: get_free_pages failed, "
2580 "sz(%d)\n", ioc->name, (int)sz);
2581 goto out;
2582 }
2578 ioc->chain_dma_pool = pci_pool_create("chain pool", ioc->pdev, 2583 ioc->chain_dma_pool = pci_pool_create("chain pool", ioc->pdev,
2579 ioc->request_sz, 16, 0); 2584 ioc->request_sz, 16, 0);
2580 if (!ioc->chain_dma_pool) { 2585 if (!ioc->chain_dma_pool) {
diff --git a/drivers/scsi/mpt2sas/mpt2sas_scsih.c b/drivers/scsi/mpt2sas/mpt2sas_scsih.c
index 193e33e28e49..d953a57e779d 100644
--- a/drivers/scsi/mpt2sas/mpt2sas_scsih.c
+++ b/drivers/scsi/mpt2sas/mpt2sas_scsih.c
@@ -5744,7 +5744,7 @@ _scsih_sas_enclosure_dev_status_change_event(struct MPT2SAS_ADAPTER *ioc,
5744} 5744}
5745 5745
5746/** 5746/**
5747 * _scsih_sas_broadcast_primative_event - handle broadcast events 5747 * _scsih_sas_broadcast_primitive_event - handle broadcast events
5748 * @ioc: per adapter object 5748 * @ioc: per adapter object
5749 * @fw_event: The fw_event_work object 5749 * @fw_event: The fw_event_work object
5750 * Context: user. 5750 * Context: user.
@@ -5752,7 +5752,7 @@ _scsih_sas_enclosure_dev_status_change_event(struct MPT2SAS_ADAPTER *ioc,
5752 * Return nothing. 5752 * Return nothing.
5753 */ 5753 */
5754static void 5754static void
5755_scsih_sas_broadcast_primative_event(struct MPT2SAS_ADAPTER *ioc, 5755_scsih_sas_broadcast_primitive_event(struct MPT2SAS_ADAPTER *ioc,
5756 struct fw_event_work *fw_event) 5756 struct fw_event_work *fw_event)
5757{ 5757{
5758 struct scsi_cmnd *scmd; 5758 struct scsi_cmnd *scmd;
@@ -7263,7 +7263,7 @@ _firmware_event_work(struct work_struct *work)
7263 fw_event); 7263 fw_event);
7264 break; 7264 break;
7265 case MPI2_EVENT_SAS_BROADCAST_PRIMITIVE: 7265 case MPI2_EVENT_SAS_BROADCAST_PRIMITIVE:
7266 _scsih_sas_broadcast_primative_event(ioc, 7266 _scsih_sas_broadcast_primitive_event(ioc,
7267 fw_event); 7267 fw_event);
7268 break; 7268 break;
7269 case MPI2_EVENT_SAS_ENCL_DEVICE_STATUS_CHANGE: 7269 case MPI2_EVENT_SAS_ENCL_DEVICE_STATUS_CHANGE:
diff --git a/drivers/scsi/mvsas/mv_init.c b/drivers/scsi/mvsas/mv_init.c
index 6f589195746c..cc59dff3810b 100644
--- a/drivers/scsi/mvsas/mv_init.c
+++ b/drivers/scsi/mvsas/mv_init.c
@@ -60,7 +60,6 @@ static struct scsi_host_template mvs_sht = {
60 .queuecommand = sas_queuecommand, 60 .queuecommand = sas_queuecommand,
61 .target_alloc = sas_target_alloc, 61 .target_alloc = sas_target_alloc,
62 .slave_configure = sas_slave_configure, 62 .slave_configure = sas_slave_configure,
63 .slave_destroy = sas_slave_destroy,
64 .scan_finished = mvs_scan_finished, 63 .scan_finished = mvs_scan_finished,
65 .scan_start = mvs_scan_start, 64 .scan_start = mvs_scan_start,
66 .change_queue_depth = sas_change_queue_depth, 65 .change_queue_depth = sas_change_queue_depth,
@@ -74,7 +73,6 @@ static struct scsi_host_template mvs_sht = {
74 .use_clustering = ENABLE_CLUSTERING, 73 .use_clustering = ENABLE_CLUSTERING,
75 .eh_device_reset_handler = sas_eh_device_reset_handler, 74 .eh_device_reset_handler = sas_eh_device_reset_handler,
76 .eh_bus_reset_handler = sas_eh_bus_reset_handler, 75 .eh_bus_reset_handler = sas_eh_bus_reset_handler,
77 .slave_alloc = sas_slave_alloc,
78 .target_destroy = sas_target_destroy, 76 .target_destroy = sas_target_destroy,
79 .ioctl = sas_ioctl, 77 .ioctl = sas_ioctl,
80 .shost_attrs = mvst_host_attrs, 78 .shost_attrs = mvst_host_attrs,
diff --git a/drivers/scsi/mvsas/mv_sas.c b/drivers/scsi/mvsas/mv_sas.c
index 01ab9c4d3464..fd3b2839843b 100644
--- a/drivers/scsi/mvsas/mv_sas.c
+++ b/drivers/scsi/mvsas/mv_sas.c
@@ -308,7 +308,7 @@ int mvs_scan_finished(struct Scsi_Host *shost, unsigned long time)
308 if (mvs_prv->scan_finished == 0) 308 if (mvs_prv->scan_finished == 0)
309 return 0; 309 return 0;
310 310
311 scsi_flush_work(shost); 311 sas_drain_work(sha);
312 return 1; 312 return 1;
313} 313}
314 314
@@ -893,9 +893,6 @@ static int mvs_task_exec(struct sas_task *task, const int num, gfp_t gfp_flags,
893 893
894 mvi = ((struct mvs_device *)task->dev->lldd_dev)->mvi_info; 894 mvi = ((struct mvs_device *)task->dev->lldd_dev)->mvi_info;
895 895
896 if ((dev->dev_type == SATA_DEV) && (dev->sata_dev.ap != NULL))
897 spin_unlock_irq(dev->sata_dev.ap->lock);
898
899 spin_lock_irqsave(&mvi->lock, flags); 896 spin_lock_irqsave(&mvi->lock, flags);
900 rc = mvs_task_prep(task, mvi, is_tmf, tmf, &pass); 897 rc = mvs_task_prep(task, mvi, is_tmf, tmf, &pass);
901 if (rc) 898 if (rc)
@@ -906,9 +903,6 @@ static int mvs_task_exec(struct sas_task *task, const int num, gfp_t gfp_flags,
906 (MVS_CHIP_SLOT_SZ - 1)); 903 (MVS_CHIP_SLOT_SZ - 1));
907 spin_unlock_irqrestore(&mvi->lock, flags); 904 spin_unlock_irqrestore(&mvi->lock, flags);
908 905
909 if ((dev->dev_type == SATA_DEV) && (dev->sata_dev.ap != NULL))
910 spin_lock_irq(dev->sata_dev.ap->lock);
911
912 return rc; 906 return rc;
913} 907}
914 908
@@ -1480,10 +1474,11 @@ static int mvs_debug_issue_ssp_tmf(struct domain_device *dev,
1480static int mvs_debug_I_T_nexus_reset(struct domain_device *dev) 1474static int mvs_debug_I_T_nexus_reset(struct domain_device *dev)
1481{ 1475{
1482 int rc; 1476 int rc;
1483 struct sas_phy *phy = sas_find_local_phy(dev); 1477 struct sas_phy *phy = sas_get_local_phy(dev);
1484 int reset_type = (dev->dev_type == SATA_DEV || 1478 int reset_type = (dev->dev_type == SATA_DEV ||
1485 (dev->tproto & SAS_PROTOCOL_STP)) ? 0 : 1; 1479 (dev->tproto & SAS_PROTOCOL_STP)) ? 0 : 1;
1486 rc = sas_phy_reset(phy, reset_type); 1480 rc = sas_phy_reset(phy, reset_type);
1481 sas_put_local_phy(phy);
1487 msleep(2000); 1482 msleep(2000);
1488 return rc; 1483 return rc;
1489} 1484}
diff --git a/drivers/scsi/pm8001/pm8001_chips.h b/drivers/scsi/pm8001/pm8001_chips.h
index 4efa4d0950e5..9241c7826034 100644
--- a/drivers/scsi/pm8001/pm8001_chips.h
+++ b/drivers/scsi/pm8001/pm8001_chips.h
@@ -46,9 +46,9 @@ static inline u32 pm8001_read_32(void *virt_addr)
46 return *((u32 *)virt_addr); 46 return *((u32 *)virt_addr);
47} 47}
48 48
49static inline void pm8001_write_32(void *addr, u32 offset, u32 val) 49static inline void pm8001_write_32(void *addr, u32 offset, __le32 val)
50{ 50{
51 *((u32 *)(addr + offset)) = val; 51 *((__le32 *)(addr + offset)) = val;
52} 52}
53 53
54static inline u32 pm8001_cr32(struct pm8001_hba_info *pm8001_ha, u32 bar, 54static inline u32 pm8001_cr32(struct pm8001_hba_info *pm8001_ha, u32 bar,
diff --git a/drivers/scsi/pm8001/pm8001_hwi.c b/drivers/scsi/pm8001/pm8001_hwi.c
index e12c4f632a63..3619f6eeeeda 100644
--- a/drivers/scsi/pm8001/pm8001_hwi.c
+++ b/drivers/scsi/pm8001/pm8001_hwi.c
@@ -338,26 +338,25 @@ update_outbnd_queue_table(struct pm8001_hba_info *pm8001_ha, int number)
338} 338}
339 339
340/** 340/**
341 * bar4_shift - function is called to shift BAR base address 341 * pm8001_bar4_shift - function is called to shift BAR base address
342 * @pm8001_ha : our hba card information 342 * @pm8001_ha : our hba card infomation
343 * @shiftValue : shifting value in memory bar. 343 * @shiftValue : shifting value in memory bar.
344 */ 344 */
345static int bar4_shift(struct pm8001_hba_info *pm8001_ha, u32 shiftValue) 345int pm8001_bar4_shift(struct pm8001_hba_info *pm8001_ha, u32 shiftValue)
346{ 346{
347 u32 regVal; 347 u32 regVal;
348 u32 max_wait_count; 348 unsigned long start;
349 349
350 /* program the inbound AXI translation Lower Address */ 350 /* program the inbound AXI translation Lower Address */
351 pm8001_cw32(pm8001_ha, 1, SPC_IBW_AXI_TRANSLATION_LOW, shiftValue); 351 pm8001_cw32(pm8001_ha, 1, SPC_IBW_AXI_TRANSLATION_LOW, shiftValue);
352 352
353 /* confirm the setting is written */ 353 /* confirm the setting is written */
354 max_wait_count = 1 * 1000 * 1000; /* 1 sec */ 354 start = jiffies + HZ; /* 1 sec */
355 do { 355 do {
356 udelay(1);
357 regVal = pm8001_cr32(pm8001_ha, 1, SPC_IBW_AXI_TRANSLATION_LOW); 356 regVal = pm8001_cr32(pm8001_ha, 1, SPC_IBW_AXI_TRANSLATION_LOW);
358 } while ((regVal != shiftValue) && (--max_wait_count)); 357 } while ((regVal != shiftValue) && time_before(jiffies, start));
359 358
360 if (!max_wait_count) { 359 if (regVal != shiftValue) {
361 PM8001_INIT_DBG(pm8001_ha, 360 PM8001_INIT_DBG(pm8001_ha,
362 pm8001_printk("TIMEOUT:SPC_IBW_AXI_TRANSLATION_LOW" 361 pm8001_printk("TIMEOUT:SPC_IBW_AXI_TRANSLATION_LOW"
363 " = 0x%x\n", regVal)); 362 " = 0x%x\n", regVal));
@@ -375,6 +374,7 @@ static void __devinit
375mpi_set_phys_g3_with_ssc(struct pm8001_hba_info *pm8001_ha, u32 SSCbit) 374mpi_set_phys_g3_with_ssc(struct pm8001_hba_info *pm8001_ha, u32 SSCbit)
376{ 375{
377 u32 value, offset, i; 376 u32 value, offset, i;
377 unsigned long flags;
378 378
379#define SAS2_SETTINGS_LOCAL_PHY_0_3_SHIFT_ADDR 0x00030000 379#define SAS2_SETTINGS_LOCAL_PHY_0_3_SHIFT_ADDR 0x00030000
380#define SAS2_SETTINGS_LOCAL_PHY_4_7_SHIFT_ADDR 0x00040000 380#define SAS2_SETTINGS_LOCAL_PHY_4_7_SHIFT_ADDR 0x00040000
@@ -388,16 +388,23 @@ mpi_set_phys_g3_with_ssc(struct pm8001_hba_info *pm8001_ha, u32 SSCbit)
388 * Using shifted destination address 0x3_0000:0x1074 + 0x4000*N (N=0:3) 388 * Using shifted destination address 0x3_0000:0x1074 + 0x4000*N (N=0:3)
389 * Using shifted destination address 0x4_0000:0x1074 + 0x4000*(N-4) (N=4:7) 389 * Using shifted destination address 0x4_0000:0x1074 + 0x4000*(N-4) (N=4:7)
390 */ 390 */
391 if (-1 == bar4_shift(pm8001_ha, SAS2_SETTINGS_LOCAL_PHY_0_3_SHIFT_ADDR)) 391 spin_lock_irqsave(&pm8001_ha->lock, flags);
392 if (-1 == pm8001_bar4_shift(pm8001_ha,
393 SAS2_SETTINGS_LOCAL_PHY_0_3_SHIFT_ADDR)) {
394 spin_unlock_irqrestore(&pm8001_ha->lock, flags);
392 return; 395 return;
396 }
393 397
394 for (i = 0; i < 4; i++) { 398 for (i = 0; i < 4; i++) {
395 offset = SAS2_SETTINGS_LOCAL_PHY_0_3_OFFSET + 0x4000 * i; 399 offset = SAS2_SETTINGS_LOCAL_PHY_0_3_OFFSET + 0x4000 * i;
396 pm8001_cw32(pm8001_ha, 2, offset, 0x80001501); 400 pm8001_cw32(pm8001_ha, 2, offset, 0x80001501);
397 } 401 }
398 /* shift membase 3 for SAS2_SETTINGS_LOCAL_PHY 4 - 7 */ 402 /* shift membase 3 for SAS2_SETTINGS_LOCAL_PHY 4 - 7 */
399 if (-1 == bar4_shift(pm8001_ha, SAS2_SETTINGS_LOCAL_PHY_4_7_SHIFT_ADDR)) 403 if (-1 == pm8001_bar4_shift(pm8001_ha,
404 SAS2_SETTINGS_LOCAL_PHY_4_7_SHIFT_ADDR)) {
405 spin_unlock_irqrestore(&pm8001_ha->lock, flags);
400 return; 406 return;
407 }
401 for (i = 4; i < 8; i++) { 408 for (i = 4; i < 8; i++) {
402 offset = SAS2_SETTINGS_LOCAL_PHY_4_7_OFFSET + 0x4000 * (i-4); 409 offset = SAS2_SETTINGS_LOCAL_PHY_4_7_OFFSET + 0x4000 * (i-4);
403 pm8001_cw32(pm8001_ha, 2, offset, 0x80001501); 410 pm8001_cw32(pm8001_ha, 2, offset, 0x80001501);
@@ -421,7 +428,8 @@ mpi_set_phys_g3_with_ssc(struct pm8001_hba_info *pm8001_ha, u32 SSCbit)
421 pm8001_cw32(pm8001_ha, 2, 0xd8, 0x8000C016); 428 pm8001_cw32(pm8001_ha, 2, 0xd8, 0x8000C016);
422 429
423 /*set the shifted destination address to 0x0 to avoid error operation */ 430 /*set the shifted destination address to 0x0 to avoid error operation */
424 bar4_shift(pm8001_ha, 0x0); 431 pm8001_bar4_shift(pm8001_ha, 0x0);
432 spin_unlock_irqrestore(&pm8001_ha->lock, flags);
425 return; 433 return;
426} 434}
427 435
@@ -437,6 +445,7 @@ mpi_set_open_retry_interval_reg(struct pm8001_hba_info *pm8001_ha,
437 u32 offset; 445 u32 offset;
438 u32 value; 446 u32 value;
439 u32 i; 447 u32 i;
448 unsigned long flags;
440 449
441#define OPEN_RETRY_INTERVAL_PHY_0_3_SHIFT_ADDR 0x00030000 450#define OPEN_RETRY_INTERVAL_PHY_0_3_SHIFT_ADDR 0x00030000
442#define OPEN_RETRY_INTERVAL_PHY_4_7_SHIFT_ADDR 0x00040000 451#define OPEN_RETRY_INTERVAL_PHY_4_7_SHIFT_ADDR 0x00040000
@@ -445,24 +454,30 @@ mpi_set_open_retry_interval_reg(struct pm8001_hba_info *pm8001_ha,
445#define OPEN_RETRY_INTERVAL_REG_MASK 0x0000FFFF 454#define OPEN_RETRY_INTERVAL_REG_MASK 0x0000FFFF
446 455
447 value = interval & OPEN_RETRY_INTERVAL_REG_MASK; 456 value = interval & OPEN_RETRY_INTERVAL_REG_MASK;
457 spin_lock_irqsave(&pm8001_ha->lock, flags);
448 /* shift bar and set the OPEN_REJECT(RETRY) interval time of PHY 0 -3.*/ 458 /* shift bar and set the OPEN_REJECT(RETRY) interval time of PHY 0 -3.*/
449 if (-1 == bar4_shift(pm8001_ha, 459 if (-1 == pm8001_bar4_shift(pm8001_ha,
450 OPEN_RETRY_INTERVAL_PHY_0_3_SHIFT_ADDR)) 460 OPEN_RETRY_INTERVAL_PHY_0_3_SHIFT_ADDR)) {
461 spin_unlock_irqrestore(&pm8001_ha->lock, flags);
451 return; 462 return;
463 }
452 for (i = 0; i < 4; i++) { 464 for (i = 0; i < 4; i++) {
453 offset = OPEN_RETRY_INTERVAL_PHY_0_3_OFFSET + 0x4000 * i; 465 offset = OPEN_RETRY_INTERVAL_PHY_0_3_OFFSET + 0x4000 * i;
454 pm8001_cw32(pm8001_ha, 2, offset, value); 466 pm8001_cw32(pm8001_ha, 2, offset, value);
455 } 467 }
456 468
457 if (-1 == bar4_shift(pm8001_ha, 469 if (-1 == pm8001_bar4_shift(pm8001_ha,
458 OPEN_RETRY_INTERVAL_PHY_4_7_SHIFT_ADDR)) 470 OPEN_RETRY_INTERVAL_PHY_4_7_SHIFT_ADDR)) {
471 spin_unlock_irqrestore(&pm8001_ha->lock, flags);
459 return; 472 return;
473 }
460 for (i = 4; i < 8; i++) { 474 for (i = 4; i < 8; i++) {
461 offset = OPEN_RETRY_INTERVAL_PHY_4_7_OFFSET + 0x4000 * (i-4); 475 offset = OPEN_RETRY_INTERVAL_PHY_4_7_OFFSET + 0x4000 * (i-4);
462 pm8001_cw32(pm8001_ha, 2, offset, value); 476 pm8001_cw32(pm8001_ha, 2, offset, value);
463 } 477 }
464 /*set the shifted destination address to 0x0 to avoid error operation */ 478 /*set the shifted destination address to 0x0 to avoid error operation */
465 bar4_shift(pm8001_ha, 0x0); 479 pm8001_bar4_shift(pm8001_ha, 0x0);
480 spin_unlock_irqrestore(&pm8001_ha->lock, flags);
466 return; 481 return;
467} 482}
468 483
@@ -607,7 +622,8 @@ static int __devinit pm8001_chip_init(struct pm8001_hba_info *pm8001_ha)
607 update_inbnd_queue_table(pm8001_ha, 0); 622 update_inbnd_queue_table(pm8001_ha, 0);
608 update_outbnd_queue_table(pm8001_ha, 0); 623 update_outbnd_queue_table(pm8001_ha, 0);
609 mpi_set_phys_g3_with_ssc(pm8001_ha, 0); 624 mpi_set_phys_g3_with_ssc(pm8001_ha, 0);
610 mpi_set_open_retry_interval_reg(pm8001_ha, 7); 625 /* 7->130ms, 34->500ms, 119->1.5s */
626 mpi_set_open_retry_interval_reg(pm8001_ha, 119);
611 /* notify firmware update finished and check initialization status */ 627 /* notify firmware update finished and check initialization status */
612 if (0 == mpi_init_check(pm8001_ha)) { 628 if (0 == mpi_init_check(pm8001_ha)) {
613 PM8001_INIT_DBG(pm8001_ha, 629 PM8001_INIT_DBG(pm8001_ha,
@@ -688,8 +704,11 @@ static u32 soft_reset_ready_check(struct pm8001_hba_info *pm8001_ha)
688 PM8001_INIT_DBG(pm8001_ha, 704 PM8001_INIT_DBG(pm8001_ha,
689 pm8001_printk("Firmware is ready for reset .\n")); 705 pm8001_printk("Firmware is ready for reset .\n"));
690 } else { 706 } else {
691 /* Trigger NMI twice via RB6 */ 707 unsigned long flags;
692 if (-1 == bar4_shift(pm8001_ha, RB6_ACCESS_REG)) { 708 /* Trigger NMI twice via RB6 */
709 spin_lock_irqsave(&pm8001_ha->lock, flags);
710 if (-1 == pm8001_bar4_shift(pm8001_ha, RB6_ACCESS_REG)) {
711 spin_unlock_irqrestore(&pm8001_ha->lock, flags);
693 PM8001_FAIL_DBG(pm8001_ha, 712 PM8001_FAIL_DBG(pm8001_ha,
694 pm8001_printk("Shift Bar4 to 0x%x failed\n", 713 pm8001_printk("Shift Bar4 to 0x%x failed\n",
695 RB6_ACCESS_REG)); 714 RB6_ACCESS_REG));
@@ -715,8 +734,10 @@ static u32 soft_reset_ready_check(struct pm8001_hba_info *pm8001_ha)
715 PM8001_FAIL_DBG(pm8001_ha, 734 PM8001_FAIL_DBG(pm8001_ha,
716 pm8001_printk("SCRATCH_PAD3 value = 0x%x\n", 735 pm8001_printk("SCRATCH_PAD3 value = 0x%x\n",
717 pm8001_cr32(pm8001_ha, 0, MSGU_SCRATCH_PAD_3))); 736 pm8001_cr32(pm8001_ha, 0, MSGU_SCRATCH_PAD_3)));
737 spin_unlock_irqrestore(&pm8001_ha->lock, flags);
718 return -1; 738 return -1;
719 } 739 }
740 spin_unlock_irqrestore(&pm8001_ha->lock, flags);
720 } 741 }
721 return 0; 742 return 0;
722} 743}
@@ -733,6 +754,7 @@ pm8001_chip_soft_rst(struct pm8001_hba_info *pm8001_ha, u32 signature)
733 u32 regVal, toggleVal; 754 u32 regVal, toggleVal;
734 u32 max_wait_count; 755 u32 max_wait_count;
735 u32 regVal1, regVal2, regVal3; 756 u32 regVal1, regVal2, regVal3;
757 unsigned long flags;
736 758
737 /* step1: Check FW is ready for soft reset */ 759 /* step1: Check FW is ready for soft reset */
738 if (soft_reset_ready_check(pm8001_ha) != 0) { 760 if (soft_reset_ready_check(pm8001_ha) != 0) {
@@ -743,7 +765,9 @@ pm8001_chip_soft_rst(struct pm8001_hba_info *pm8001_ha, u32 signature)
743 /* step 2: clear NMI status register on AAP1 and IOP, write the same 765 /* step 2: clear NMI status register on AAP1 and IOP, write the same
744 value to clear */ 766 value to clear */
745 /* map 0x60000 to BAR4(0x20), BAR2(win) */ 767 /* map 0x60000 to BAR4(0x20), BAR2(win) */
746 if (-1 == bar4_shift(pm8001_ha, MBIC_AAP1_ADDR_BASE)) { 768 spin_lock_irqsave(&pm8001_ha->lock, flags);
769 if (-1 == pm8001_bar4_shift(pm8001_ha, MBIC_AAP1_ADDR_BASE)) {
770 spin_unlock_irqrestore(&pm8001_ha->lock, flags);
747 PM8001_FAIL_DBG(pm8001_ha, 771 PM8001_FAIL_DBG(pm8001_ha,
748 pm8001_printk("Shift Bar4 to 0x%x failed\n", 772 pm8001_printk("Shift Bar4 to 0x%x failed\n",
749 MBIC_AAP1_ADDR_BASE)); 773 MBIC_AAP1_ADDR_BASE));
@@ -754,7 +778,8 @@ pm8001_chip_soft_rst(struct pm8001_hba_info *pm8001_ha, u32 signature)
754 pm8001_printk("MBIC - NMI Enable VPE0 (IOP)= 0x%x\n", regVal)); 778 pm8001_printk("MBIC - NMI Enable VPE0 (IOP)= 0x%x\n", regVal));
755 pm8001_cw32(pm8001_ha, 2, MBIC_NMI_ENABLE_VPE0_IOP, 0x0); 779 pm8001_cw32(pm8001_ha, 2, MBIC_NMI_ENABLE_VPE0_IOP, 0x0);
756 /* map 0x70000 to BAR4(0x20), BAR2(win) */ 780 /* map 0x70000 to BAR4(0x20), BAR2(win) */
757 if (-1 == bar4_shift(pm8001_ha, MBIC_IOP_ADDR_BASE)) { 781 if (-1 == pm8001_bar4_shift(pm8001_ha, MBIC_IOP_ADDR_BASE)) {
782 spin_unlock_irqrestore(&pm8001_ha->lock, flags);
758 PM8001_FAIL_DBG(pm8001_ha, 783 PM8001_FAIL_DBG(pm8001_ha,
759 pm8001_printk("Shift Bar4 to 0x%x failed\n", 784 pm8001_printk("Shift Bar4 to 0x%x failed\n",
760 MBIC_IOP_ADDR_BASE)); 785 MBIC_IOP_ADDR_BASE));
@@ -796,7 +821,8 @@ pm8001_chip_soft_rst(struct pm8001_hba_info *pm8001_ha, u32 signature)
796 821
797 /* read required registers for confirmming */ 822 /* read required registers for confirmming */
798 /* map 0x0700000 to BAR4(0x20), BAR2(win) */ 823 /* map 0x0700000 to BAR4(0x20), BAR2(win) */
799 if (-1 == bar4_shift(pm8001_ha, GSM_ADDR_BASE)) { 824 if (-1 == pm8001_bar4_shift(pm8001_ha, GSM_ADDR_BASE)) {
825 spin_unlock_irqrestore(&pm8001_ha->lock, flags);
800 PM8001_FAIL_DBG(pm8001_ha, 826 PM8001_FAIL_DBG(pm8001_ha,
801 pm8001_printk("Shift Bar4 to 0x%x failed\n", 827 pm8001_printk("Shift Bar4 to 0x%x failed\n",
802 GSM_ADDR_BASE)); 828 GSM_ADDR_BASE));
@@ -862,7 +888,8 @@ pm8001_chip_soft_rst(struct pm8001_hba_info *pm8001_ha, u32 signature)
862 /* step 5: delay 10 usec */ 888 /* step 5: delay 10 usec */
863 udelay(10); 889 udelay(10);
864 /* step 5-b: set GPIO-0 output control to tristate anyway */ 890 /* step 5-b: set GPIO-0 output control to tristate anyway */
865 if (-1 == bar4_shift(pm8001_ha, GPIO_ADDR_BASE)) { 891 if (-1 == pm8001_bar4_shift(pm8001_ha, GPIO_ADDR_BASE)) {
892 spin_unlock_irqrestore(&pm8001_ha->lock, flags);
866 PM8001_INIT_DBG(pm8001_ha, 893 PM8001_INIT_DBG(pm8001_ha,
867 pm8001_printk("Shift Bar4 to 0x%x failed\n", 894 pm8001_printk("Shift Bar4 to 0x%x failed\n",
868 GPIO_ADDR_BASE)); 895 GPIO_ADDR_BASE));
@@ -878,7 +905,8 @@ pm8001_chip_soft_rst(struct pm8001_hba_info *pm8001_ha, u32 signature)
878 905
879 /* Step 6: Reset the IOP and AAP1 */ 906 /* Step 6: Reset the IOP and AAP1 */
880 /* map 0x00000 to BAR4(0x20), BAR2(win) */ 907 /* map 0x00000 to BAR4(0x20), BAR2(win) */
881 if (-1 == bar4_shift(pm8001_ha, SPC_TOP_LEVEL_ADDR_BASE)) { 908 if (-1 == pm8001_bar4_shift(pm8001_ha, SPC_TOP_LEVEL_ADDR_BASE)) {
909 spin_unlock_irqrestore(&pm8001_ha->lock, flags);
882 PM8001_FAIL_DBG(pm8001_ha, 910 PM8001_FAIL_DBG(pm8001_ha,
883 pm8001_printk("SPC Shift Bar4 to 0x%x failed\n", 911 pm8001_printk("SPC Shift Bar4 to 0x%x failed\n",
884 SPC_TOP_LEVEL_ADDR_BASE)); 912 SPC_TOP_LEVEL_ADDR_BASE));
@@ -915,7 +943,8 @@ pm8001_chip_soft_rst(struct pm8001_hba_info *pm8001_ha, u32 signature)
915 943
916 /* step 11: reads and sets the GSM Configuration and Reset Register */ 944 /* step 11: reads and sets the GSM Configuration and Reset Register */
917 /* map 0x0700000 to BAR4(0x20), BAR2(win) */ 945 /* map 0x0700000 to BAR4(0x20), BAR2(win) */
918 if (-1 == bar4_shift(pm8001_ha, GSM_ADDR_BASE)) { 946 if (-1 == pm8001_bar4_shift(pm8001_ha, GSM_ADDR_BASE)) {
947 spin_unlock_irqrestore(&pm8001_ha->lock, flags);
919 PM8001_FAIL_DBG(pm8001_ha, 948 PM8001_FAIL_DBG(pm8001_ha,
920 pm8001_printk("SPC Shift Bar4 to 0x%x failed\n", 949 pm8001_printk("SPC Shift Bar4 to 0x%x failed\n",
921 GSM_ADDR_BASE)); 950 GSM_ADDR_BASE));
@@ -968,7 +997,8 @@ pm8001_chip_soft_rst(struct pm8001_hba_info *pm8001_ha, u32 signature)
968 997
969 /* step 13: bring the IOP and AAP1 out of reset */ 998 /* step 13: bring the IOP and AAP1 out of reset */
970 /* map 0x00000 to BAR4(0x20), BAR2(win) */ 999 /* map 0x00000 to BAR4(0x20), BAR2(win) */
971 if (-1 == bar4_shift(pm8001_ha, SPC_TOP_LEVEL_ADDR_BASE)) { 1000 if (-1 == pm8001_bar4_shift(pm8001_ha, SPC_TOP_LEVEL_ADDR_BASE)) {
1001 spin_unlock_irqrestore(&pm8001_ha->lock, flags);
972 PM8001_FAIL_DBG(pm8001_ha, 1002 PM8001_FAIL_DBG(pm8001_ha,
973 pm8001_printk("Shift Bar4 to 0x%x failed\n", 1003 pm8001_printk("Shift Bar4 to 0x%x failed\n",
974 SPC_TOP_LEVEL_ADDR_BASE)); 1004 SPC_TOP_LEVEL_ADDR_BASE));
@@ -1010,6 +1040,7 @@ pm8001_chip_soft_rst(struct pm8001_hba_info *pm8001_ha, u32 signature)
1010 pm8001_printk("SCRATCH_PAD3 value = 0x%x\n", 1040 pm8001_printk("SCRATCH_PAD3 value = 0x%x\n",
1011 pm8001_cr32(pm8001_ha, 0, 1041 pm8001_cr32(pm8001_ha, 0,
1012 MSGU_SCRATCH_PAD_3))); 1042 MSGU_SCRATCH_PAD_3)));
1043 spin_unlock_irqrestore(&pm8001_ha->lock, flags);
1013 return -1; 1044 return -1;
1014 } 1045 }
1015 1046
@@ -1039,9 +1070,12 @@ pm8001_chip_soft_rst(struct pm8001_hba_info *pm8001_ha, u32 signature)
1039 pm8001_printk("SCRATCH_PAD3 value = 0x%x\n", 1070 pm8001_printk("SCRATCH_PAD3 value = 0x%x\n",
1040 pm8001_cr32(pm8001_ha, 0, 1071 pm8001_cr32(pm8001_ha, 0,
1041 MSGU_SCRATCH_PAD_3))); 1072 MSGU_SCRATCH_PAD_3)));
1073 spin_unlock_irqrestore(&pm8001_ha->lock, flags);
1042 return -1; 1074 return -1;
1043 } 1075 }
1044 } 1076 }
1077 pm8001_bar4_shift(pm8001_ha, 0);
1078 spin_unlock_irqrestore(&pm8001_ha->lock, flags);
1045 1079
1046 PM8001_INIT_DBG(pm8001_ha, 1080 PM8001_INIT_DBG(pm8001_ha,
1047 pm8001_printk("SPC soft reset Complete\n")); 1081 pm8001_printk("SPC soft reset Complete\n"));
@@ -1157,8 +1191,8 @@ pm8001_chip_msix_interrupt_disable(struct pm8001_hba_info *pm8001_ha,
1157 msi_index = int_vec_idx * MSIX_TABLE_ELEMENT_SIZE; 1191 msi_index = int_vec_idx * MSIX_TABLE_ELEMENT_SIZE;
1158 msi_index += MSIX_TABLE_BASE; 1192 msi_index += MSIX_TABLE_BASE;
1159 pm8001_cw32(pm8001_ha, 0, msi_index, MSIX_INTERRUPT_DISABLE); 1193 pm8001_cw32(pm8001_ha, 0, msi_index, MSIX_INTERRUPT_DISABLE);
1160
1161} 1194}
1195
1162/** 1196/**
1163 * pm8001_chip_interrupt_enable - enable PM8001 chip interrupt 1197 * pm8001_chip_interrupt_enable - enable PM8001 chip interrupt
1164 * @pm8001_ha: our hba card information 1198 * @pm8001_ha: our hba card information
@@ -1212,7 +1246,7 @@ static int mpi_msg_free_get(struct inbound_queue_table *circularQ,
1212 consumer_index = pm8001_read_32(circularQ->ci_virt); 1246 consumer_index = pm8001_read_32(circularQ->ci_virt);
1213 circularQ->consumer_index = cpu_to_le32(consumer_index); 1247 circularQ->consumer_index = cpu_to_le32(consumer_index);
1214 if (((circularQ->producer_idx + bcCount) % 256) == 1248 if (((circularQ->producer_idx + bcCount) % 256) ==
1215 circularQ->consumer_index) { 1249 le32_to_cpu(circularQ->consumer_index)) {
1216 *messagePtr = NULL; 1250 *messagePtr = NULL;
1217 return -1; 1251 return -1;
1218 } 1252 }
@@ -1321,7 +1355,8 @@ static u32 mpi_msg_consume(struct pm8001_hba_info *pm8001_ha,
1321 u32 header_tmp; 1355 u32 header_tmp;
1322 do { 1356 do {
1323 /* If there are not-yet-delivered messages ... */ 1357 /* If there are not-yet-delivered messages ... */
1324 if (circularQ->producer_index != circularQ->consumer_idx) { 1358 if (le32_to_cpu(circularQ->producer_index)
1359 != circularQ->consumer_idx) {
1325 /*Get the pointer to the circular queue buffer element*/ 1360 /*Get the pointer to the circular queue buffer element*/
1326 msgHeader = (struct mpi_msg_hdr *) 1361 msgHeader = (struct mpi_msg_hdr *)
1327 (circularQ->base_virt + 1362 (circularQ->base_virt +
@@ -1329,14 +1364,14 @@ static u32 mpi_msg_consume(struct pm8001_hba_info *pm8001_ha,
1329 /* read header */ 1364 /* read header */
1330 header_tmp = pm8001_read_32(msgHeader); 1365 header_tmp = pm8001_read_32(msgHeader);
1331 msgHeader_tmp = cpu_to_le32(header_tmp); 1366 msgHeader_tmp = cpu_to_le32(header_tmp);
1332 if (0 != (msgHeader_tmp & 0x80000000)) { 1367 if (0 != (le32_to_cpu(msgHeader_tmp) & 0x80000000)) {
1333 if (OPC_OUB_SKIP_ENTRY != 1368 if (OPC_OUB_SKIP_ENTRY !=
1334 (msgHeader_tmp & 0xfff)) { 1369 (le32_to_cpu(msgHeader_tmp) & 0xfff)) {
1335 *messagePtr1 = 1370 *messagePtr1 =
1336 ((u8 *)msgHeader) + 1371 ((u8 *)msgHeader) +
1337 sizeof(struct mpi_msg_hdr); 1372 sizeof(struct mpi_msg_hdr);
1338 *pBC = (u8)((msgHeader_tmp >> 24) & 1373 *pBC = (u8)((le32_to_cpu(msgHeader_tmp)
1339 0x1f); 1374 >> 24) & 0x1f);
1340 PM8001_IO_DBG(pm8001_ha, 1375 PM8001_IO_DBG(pm8001_ha,
1341 pm8001_printk(": CI=%d PI=%d " 1376 pm8001_printk(": CI=%d PI=%d "
1342 "msgHeader=%x\n", 1377 "msgHeader=%x\n",
@@ -1347,8 +1382,8 @@ static u32 mpi_msg_consume(struct pm8001_hba_info *pm8001_ha,
1347 } else { 1382 } else {
1348 circularQ->consumer_idx = 1383 circularQ->consumer_idx =
1349 (circularQ->consumer_idx + 1384 (circularQ->consumer_idx +
1350 ((msgHeader_tmp >> 24) & 0x1f)) 1385 ((le32_to_cpu(msgHeader_tmp)
1351 % 256; 1386 >> 24) & 0x1f)) % 256;
1352 msgHeader_tmp = 0; 1387 msgHeader_tmp = 0;
1353 pm8001_write_32(msgHeader, 0, 0); 1388 pm8001_write_32(msgHeader, 0, 0);
1354 /* update the CI of outbound queue */ 1389 /* update the CI of outbound queue */
@@ -1360,7 +1395,8 @@ static u32 mpi_msg_consume(struct pm8001_hba_info *pm8001_ha,
1360 } else { 1395 } else {
1361 circularQ->consumer_idx = 1396 circularQ->consumer_idx =
1362 (circularQ->consumer_idx + 1397 (circularQ->consumer_idx +
1363 ((msgHeader_tmp >> 24) & 0x1f)) % 256; 1398 ((le32_to_cpu(msgHeader_tmp) >> 24) &
1399 0x1f)) % 256;
1364 msgHeader_tmp = 0; 1400 msgHeader_tmp = 0;
1365 pm8001_write_32(msgHeader, 0, 0); 1401 pm8001_write_32(msgHeader, 0, 0);
1366 /* update the CI of outbound queue */ 1402 /* update the CI of outbound queue */
@@ -1376,7 +1412,8 @@ static u32 mpi_msg_consume(struct pm8001_hba_info *pm8001_ha,
1376 producer_index = pm8001_read_32(pi_virt); 1412 producer_index = pm8001_read_32(pi_virt);
1377 circularQ->producer_index = cpu_to_le32(producer_index); 1413 circularQ->producer_index = cpu_to_le32(producer_index);
1378 } 1414 }
1379 } while (circularQ->producer_index != circularQ->consumer_idx); 1415 } while (le32_to_cpu(circularQ->producer_index) !=
1416 circularQ->consumer_idx);
1380 /* while we don't have any more not-yet-delivered message */ 1417 /* while we don't have any more not-yet-delivered message */
1381 /* report empty */ 1418 /* report empty */
1382 return MPI_IO_STATUS_BUSY; 1419 return MPI_IO_STATUS_BUSY;
@@ -1388,24 +1425,191 @@ static void pm8001_work_fn(struct work_struct *work)
1388 struct pm8001_device *pm8001_dev; 1425 struct pm8001_device *pm8001_dev;
1389 struct domain_device *dev; 1426 struct domain_device *dev;
1390 1427
1428 /*
1429 * So far, all users of this stash an associated structure here.
1430 * If we get here, and this pointer is null, then the action
1431 * was cancelled. This nullification happens when the device
1432 * goes away.
1433 */
1434 pm8001_dev = pw->data; /* Most stash device structure */
1435 if ((pm8001_dev == NULL)
1436 || ((pw->handler != IO_XFER_ERROR_BREAK)
1437 && (pm8001_dev->dev_type == NO_DEVICE))) {
1438 kfree(pw);
1439 return;
1440 }
1441
1391 switch (pw->handler) { 1442 switch (pw->handler) {
1443 case IO_XFER_ERROR_BREAK:
1444 { /* This one stashes the sas_task instead */
1445 struct sas_task *t = (struct sas_task *)pm8001_dev;
1446 u32 tag;
1447 struct pm8001_ccb_info *ccb;
1448 struct pm8001_hba_info *pm8001_ha = pw->pm8001_ha;
1449 unsigned long flags, flags1;
1450 struct task_status_struct *ts;
1451 int i;
1452
1453 if (pm8001_query_task(t) == TMF_RESP_FUNC_SUCC)
1454 break; /* Task still on lu */
1455 spin_lock_irqsave(&pm8001_ha->lock, flags);
1456
1457 spin_lock_irqsave(&t->task_state_lock, flags1);
1458 if (unlikely((t->task_state_flags & SAS_TASK_STATE_DONE))) {
1459 spin_unlock_irqrestore(&t->task_state_lock, flags1);
1460 spin_unlock_irqrestore(&pm8001_ha->lock, flags);
1461 break; /* Task got completed by another */
1462 }
1463 spin_unlock_irqrestore(&t->task_state_lock, flags1);
1464
1465 /* Search for a possible ccb that matches the task */
1466 for (i = 0; ccb = NULL, i < PM8001_MAX_CCB; i++) {
1467 ccb = &pm8001_ha->ccb_info[i];
1468 tag = ccb->ccb_tag;
1469 if ((tag != 0xFFFFFFFF) && (ccb->task == t))
1470 break;
1471 }
1472 if (!ccb) {
1473 spin_unlock_irqrestore(&pm8001_ha->lock, flags);
1474 break; /* Task got freed by another */
1475 }
1476 ts = &t->task_status;
1477 ts->resp = SAS_TASK_COMPLETE;
1478 /* Force the midlayer to retry */
1479 ts->stat = SAS_QUEUE_FULL;
1480 pm8001_dev = ccb->device;
1481 if (pm8001_dev)
1482 pm8001_dev->running_req--;
1483 spin_lock_irqsave(&t->task_state_lock, flags1);
1484 t->task_state_flags &= ~SAS_TASK_STATE_PENDING;
1485 t->task_state_flags &= ~SAS_TASK_AT_INITIATOR;
1486 t->task_state_flags |= SAS_TASK_STATE_DONE;
1487 if (unlikely((t->task_state_flags & SAS_TASK_STATE_ABORTED))) {
1488 spin_unlock_irqrestore(&t->task_state_lock, flags1);
1489 PM8001_FAIL_DBG(pm8001_ha, pm8001_printk("task 0x%p"
1490 " done with event 0x%x resp 0x%x stat 0x%x but"
1491 " aborted by upper layer!\n",
1492 t, pw->handler, ts->resp, ts->stat));
1493 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag);
1494 spin_unlock_irqrestore(&pm8001_ha->lock, flags);
1495 } else {
1496 spin_unlock_irqrestore(&t->task_state_lock, flags1);
1497 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag);
1498 mb();/* in order to force CPU ordering */
1499 spin_unlock_irqrestore(&pm8001_ha->lock, flags);
1500 t->task_done(t);
1501 }
1502 } break;
1503 case IO_XFER_OPEN_RETRY_TIMEOUT:
1504 { /* This one stashes the sas_task instead */
1505 struct sas_task *t = (struct sas_task *)pm8001_dev;
1506 u32 tag;
1507 struct pm8001_ccb_info *ccb;
1508 struct pm8001_hba_info *pm8001_ha = pw->pm8001_ha;
1509 unsigned long flags, flags1;
1510 int i, ret = 0;
1511
1512 PM8001_IO_DBG(pm8001_ha,
1513 pm8001_printk("IO_XFER_OPEN_RETRY_TIMEOUT\n"));
1514
1515 ret = pm8001_query_task(t);
1516
1517 PM8001_IO_DBG(pm8001_ha,
1518 switch (ret) {
1519 case TMF_RESP_FUNC_SUCC:
1520 pm8001_printk("...Task on lu\n");
1521 break;
1522
1523 case TMF_RESP_FUNC_COMPLETE:
1524 pm8001_printk("...Task NOT on lu\n");
1525 break;
1526
1527 default:
1528 pm8001_printk("...query task failed!!!\n");
1529 break;
1530 });
1531
1532 spin_lock_irqsave(&pm8001_ha->lock, flags);
1533
1534 spin_lock_irqsave(&t->task_state_lock, flags1);
1535
1536 if (unlikely((t->task_state_flags & SAS_TASK_STATE_DONE))) {
1537 spin_unlock_irqrestore(&t->task_state_lock, flags1);
1538 spin_unlock_irqrestore(&pm8001_ha->lock, flags);
1539 if (ret == TMF_RESP_FUNC_SUCC) /* task on lu */
1540 (void)pm8001_abort_task(t);
1541 break; /* Task got completed by another */
1542 }
1543
1544 spin_unlock_irqrestore(&t->task_state_lock, flags1);
1545
1546 /* Search for a possible ccb that matches the task */
1547 for (i = 0; ccb = NULL, i < PM8001_MAX_CCB; i++) {
1548 ccb = &pm8001_ha->ccb_info[i];
1549 tag = ccb->ccb_tag;
1550 if ((tag != 0xFFFFFFFF) && (ccb->task == t))
1551 break;
1552 }
1553 if (!ccb) {
1554 spin_unlock_irqrestore(&pm8001_ha->lock, flags);
1555 if (ret == TMF_RESP_FUNC_SUCC) /* task on lu */
1556 (void)pm8001_abort_task(t);
1557 break; /* Task got freed by another */
1558 }
1559
1560 pm8001_dev = ccb->device;
1561 dev = pm8001_dev->sas_device;
1562
1563 switch (ret) {
1564 case TMF_RESP_FUNC_SUCC: /* task on lu */
1565 ccb->open_retry = 1; /* Snub completion */
1566 spin_unlock_irqrestore(&pm8001_ha->lock, flags);
1567 ret = pm8001_abort_task(t);
1568 ccb->open_retry = 0;
1569 switch (ret) {
1570 case TMF_RESP_FUNC_SUCC:
1571 case TMF_RESP_FUNC_COMPLETE:
1572 break;
1573 default: /* device misbehavior */
1574 ret = TMF_RESP_FUNC_FAILED;
1575 PM8001_IO_DBG(pm8001_ha,
1576 pm8001_printk("...Reset phy\n"));
1577 pm8001_I_T_nexus_reset(dev);
1578 break;
1579 }
1580 break;
1581
1582 case TMF_RESP_FUNC_COMPLETE: /* task not on lu */
1583 spin_unlock_irqrestore(&pm8001_ha->lock, flags);
1584 /* Do we need to abort the task locally? */
1585 break;
1586
1587 default: /* device misbehavior */
1588 spin_unlock_irqrestore(&pm8001_ha->lock, flags);
1589 ret = TMF_RESP_FUNC_FAILED;
1590 PM8001_IO_DBG(pm8001_ha,
1591 pm8001_printk("...Reset phy\n"));
1592 pm8001_I_T_nexus_reset(dev);
1593 }
1594
1595 if (ret == TMF_RESP_FUNC_FAILED)
1596 t = NULL;
1597 pm8001_open_reject_retry(pm8001_ha, t, pm8001_dev);
1598 PM8001_IO_DBG(pm8001_ha, pm8001_printk("...Complete\n"));
1599 } break;
1392 case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS: 1600 case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS:
1393 pm8001_dev = pw->data;
1394 dev = pm8001_dev->sas_device; 1601 dev = pm8001_dev->sas_device;
1395 pm8001_I_T_nexus_reset(dev); 1602 pm8001_I_T_nexus_reset(dev);
1396 break; 1603 break;
1397 case IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY: 1604 case IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY:
1398 pm8001_dev = pw->data;
1399 dev = pm8001_dev->sas_device; 1605 dev = pm8001_dev->sas_device;
1400 pm8001_I_T_nexus_reset(dev); 1606 pm8001_I_T_nexus_reset(dev);
1401 break; 1607 break;
1402 case IO_DS_IN_ERROR: 1608 case IO_DS_IN_ERROR:
1403 pm8001_dev = pw->data;
1404 dev = pm8001_dev->sas_device; 1609 dev = pm8001_dev->sas_device;
1405 pm8001_I_T_nexus_reset(dev); 1610 pm8001_I_T_nexus_reset(dev);
1406 break; 1611 break;
1407 case IO_DS_NON_OPERATIONAL: 1612 case IO_DS_NON_OPERATIONAL:
1408 pm8001_dev = pw->data;
1409 dev = pm8001_dev->sas_device; 1613 dev = pm8001_dev->sas_device;
1410 pm8001_I_T_nexus_reset(dev); 1614 pm8001_I_T_nexus_reset(dev);
1411 break; 1615 break;
@@ -1460,6 +1664,11 @@ mpi_ssp_completion(struct pm8001_hba_info *pm8001_ha , void *piomb)
1460 status = le32_to_cpu(psspPayload->status); 1664 status = le32_to_cpu(psspPayload->status);
1461 tag = le32_to_cpu(psspPayload->tag); 1665 tag = le32_to_cpu(psspPayload->tag);
1462 ccb = &pm8001_ha->ccb_info[tag]; 1666 ccb = &pm8001_ha->ccb_info[tag];
1667 if ((status == IO_ABORTED) && ccb->open_retry) {
1668 /* Being completed by another */
1669 ccb->open_retry = 0;
1670 return;
1671 }
1463 pm8001_dev = ccb->device; 1672 pm8001_dev = ccb->device;
1464 param = le32_to_cpu(psspPayload->param); 1673 param = le32_to_cpu(psspPayload->param);
1465 1674
@@ -1515,6 +1724,8 @@ mpi_ssp_completion(struct pm8001_hba_info *pm8001_ha , void *piomb)
1515 pm8001_printk("IO_XFER_ERROR_BREAK\n")); 1724 pm8001_printk("IO_XFER_ERROR_BREAK\n"));
1516 ts->resp = SAS_TASK_COMPLETE; 1725 ts->resp = SAS_TASK_COMPLETE;
1517 ts->stat = SAS_OPEN_REJECT; 1726 ts->stat = SAS_OPEN_REJECT;
1727 /* Force the midlayer to retry */
1728 ts->open_rej_reason = SAS_OREJ_RSVD_RETRY;
1518 break; 1729 break;
1519 case IO_XFER_ERROR_PHY_NOT_READY: 1730 case IO_XFER_ERROR_PHY_NOT_READY:
1520 PM8001_IO_DBG(pm8001_ha, 1731 PM8001_IO_DBG(pm8001_ha,
@@ -1719,9 +1930,8 @@ static void mpi_ssp_event(struct pm8001_hba_info *pm8001_ha , void *piomb)
1719 case IO_XFER_ERROR_BREAK: 1930 case IO_XFER_ERROR_BREAK:
1720 PM8001_IO_DBG(pm8001_ha, 1931 PM8001_IO_DBG(pm8001_ha,
1721 pm8001_printk("IO_XFER_ERROR_BREAK\n")); 1932 pm8001_printk("IO_XFER_ERROR_BREAK\n"));
1722 ts->resp = SAS_TASK_COMPLETE; 1933 pm8001_handle_event(pm8001_ha, t, IO_XFER_ERROR_BREAK);
1723 ts->stat = SAS_INTERRUPTED; 1934 return;
1724 break;
1725 case IO_XFER_ERROR_PHY_NOT_READY: 1935 case IO_XFER_ERROR_PHY_NOT_READY:
1726 PM8001_IO_DBG(pm8001_ha, 1936 PM8001_IO_DBG(pm8001_ha,
1727 pm8001_printk("IO_XFER_ERROR_PHY_NOT_READY\n")); 1937 pm8001_printk("IO_XFER_ERROR_PHY_NOT_READY\n"));
@@ -1800,10 +2010,8 @@ static void mpi_ssp_event(struct pm8001_hba_info *pm8001_ha , void *piomb)
1800 case IO_XFER_OPEN_RETRY_TIMEOUT: 2010 case IO_XFER_OPEN_RETRY_TIMEOUT:
1801 PM8001_IO_DBG(pm8001_ha, 2011 PM8001_IO_DBG(pm8001_ha,
1802 pm8001_printk("IO_XFER_OPEN_RETRY_TIMEOUT\n")); 2012 pm8001_printk("IO_XFER_OPEN_RETRY_TIMEOUT\n"));
1803 ts->resp = SAS_TASK_COMPLETE; 2013 pm8001_handle_event(pm8001_ha, t, IO_XFER_OPEN_RETRY_TIMEOUT);
1804 ts->stat = SAS_OPEN_REJECT; 2014 return;
1805 ts->open_rej_reason = SAS_OREJ_RSVD_RETRY;
1806 break;
1807 case IO_XFER_ERROR_UNEXPECTED_PHASE: 2015 case IO_XFER_ERROR_UNEXPECTED_PHASE:
1808 PM8001_IO_DBG(pm8001_ha, 2016 PM8001_IO_DBG(pm8001_ha,
1809 pm8001_printk("IO_XFER_ERROR_UNEXPECTED_PHASE\n")); 2017 pm8001_printk("IO_XFER_ERROR_UNEXPECTED_PHASE\n"));
@@ -1877,7 +2085,6 @@ mpi_sata_completion(struct pm8001_hba_info *pm8001_ha, void *piomb)
1877{ 2085{
1878 struct sas_task *t; 2086 struct sas_task *t;
1879 struct pm8001_ccb_info *ccb; 2087 struct pm8001_ccb_info *ccb;
1880 unsigned long flags = 0;
1881 u32 param; 2088 u32 param;
1882 u32 status; 2089 u32 status;
1883 u32 tag; 2090 u32 tag;
@@ -2016,9 +2223,9 @@ mpi_sata_completion(struct pm8001_hba_info *pm8001_ha, void *piomb)
2016 ts->stat = SAS_QUEUE_FULL; 2223 ts->stat = SAS_QUEUE_FULL;
2017 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); 2224 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag);
2018 mb();/*in order to force CPU ordering*/ 2225 mb();/*in order to force CPU ordering*/
2019 spin_unlock_irqrestore(&pm8001_ha->lock, flags); 2226 spin_unlock_irq(&pm8001_ha->lock);
2020 t->task_done(t); 2227 t->task_done(t);
2021 spin_lock_irqsave(&pm8001_ha->lock, flags); 2228 spin_lock_irq(&pm8001_ha->lock);
2022 return; 2229 return;
2023 } 2230 }
2024 break; 2231 break;
@@ -2036,9 +2243,9 @@ mpi_sata_completion(struct pm8001_hba_info *pm8001_ha, void *piomb)
2036 ts->stat = SAS_QUEUE_FULL; 2243 ts->stat = SAS_QUEUE_FULL;
2037 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); 2244 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag);
2038 mb();/*ditto*/ 2245 mb();/*ditto*/
2039 spin_unlock_irqrestore(&pm8001_ha->lock, flags); 2246 spin_unlock_irq(&pm8001_ha->lock);
2040 t->task_done(t); 2247 t->task_done(t);
2041 spin_lock_irqsave(&pm8001_ha->lock, flags); 2248 spin_lock_irq(&pm8001_ha->lock);
2042 return; 2249 return;
2043 } 2250 }
2044 break; 2251 break;
@@ -2064,9 +2271,9 @@ mpi_sata_completion(struct pm8001_hba_info *pm8001_ha, void *piomb)
2064 ts->stat = SAS_QUEUE_FULL; 2271 ts->stat = SAS_QUEUE_FULL;
2065 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); 2272 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag);
2066 mb();/* ditto*/ 2273 mb();/* ditto*/
2067 spin_unlock_irqrestore(&pm8001_ha->lock, flags); 2274 spin_unlock_irq(&pm8001_ha->lock);
2068 t->task_done(t); 2275 t->task_done(t);
2069 spin_lock_irqsave(&pm8001_ha->lock, flags); 2276 spin_lock_irq(&pm8001_ha->lock);
2070 return; 2277 return;
2071 } 2278 }
2072 break; 2279 break;
@@ -2131,9 +2338,9 @@ mpi_sata_completion(struct pm8001_hba_info *pm8001_ha, void *piomb)
2131 ts->stat = SAS_QUEUE_FULL; 2338 ts->stat = SAS_QUEUE_FULL;
2132 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); 2339 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag);
2133 mb();/*ditto*/ 2340 mb();/*ditto*/
2134 spin_unlock_irqrestore(&pm8001_ha->lock, flags); 2341 spin_unlock_irq(&pm8001_ha->lock);
2135 t->task_done(t); 2342 t->task_done(t);
2136 spin_lock_irqsave(&pm8001_ha->lock, flags); 2343 spin_lock_irq(&pm8001_ha->lock);
2137 return; 2344 return;
2138 } 2345 }
2139 break; 2346 break;
@@ -2155,9 +2362,9 @@ mpi_sata_completion(struct pm8001_hba_info *pm8001_ha, void *piomb)
2155 ts->stat = SAS_QUEUE_FULL; 2362 ts->stat = SAS_QUEUE_FULL;
2156 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); 2363 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag);
2157 mb();/*ditto*/ 2364 mb();/*ditto*/
2158 spin_unlock_irqrestore(&pm8001_ha->lock, flags); 2365 spin_unlock_irq(&pm8001_ha->lock);
2159 t->task_done(t); 2366 t->task_done(t);
2160 spin_lock_irqsave(&pm8001_ha->lock, flags); 2367 spin_lock_irq(&pm8001_ha->lock);
2161 return; 2368 return;
2162 } 2369 }
2163 break; 2370 break;
@@ -2175,31 +2382,31 @@ mpi_sata_completion(struct pm8001_hba_info *pm8001_ha, void *piomb)
2175 ts->stat = SAS_DEV_NO_RESPONSE; 2382 ts->stat = SAS_DEV_NO_RESPONSE;
2176 break; 2383 break;
2177 } 2384 }
2178 spin_lock_irqsave(&t->task_state_lock, flags); 2385 spin_lock_irq(&t->task_state_lock);
2179 t->task_state_flags &= ~SAS_TASK_STATE_PENDING; 2386 t->task_state_flags &= ~SAS_TASK_STATE_PENDING;
2180 t->task_state_flags &= ~SAS_TASK_AT_INITIATOR; 2387 t->task_state_flags &= ~SAS_TASK_AT_INITIATOR;
2181 t->task_state_flags |= SAS_TASK_STATE_DONE; 2388 t->task_state_flags |= SAS_TASK_STATE_DONE;
2182 if (unlikely((t->task_state_flags & SAS_TASK_STATE_ABORTED))) { 2389 if (unlikely((t->task_state_flags & SAS_TASK_STATE_ABORTED))) {
2183 spin_unlock_irqrestore(&t->task_state_lock, flags); 2390 spin_unlock_irq(&t->task_state_lock);
2184 PM8001_FAIL_DBG(pm8001_ha, 2391 PM8001_FAIL_DBG(pm8001_ha,
2185 pm8001_printk("task 0x%p done with io_status 0x%x" 2392 pm8001_printk("task 0x%p done with io_status 0x%x"
2186 " resp 0x%x stat 0x%x but aborted by upper layer!\n", 2393 " resp 0x%x stat 0x%x but aborted by upper layer!\n",
2187 t, status, ts->resp, ts->stat)); 2394 t, status, ts->resp, ts->stat));
2188 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); 2395 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag);
2189 } else if (t->uldd_task) { 2396 } else if (t->uldd_task) {
2190 spin_unlock_irqrestore(&t->task_state_lock, flags); 2397 spin_unlock_irq(&t->task_state_lock);
2191 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); 2398 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag);
2192 mb();/* ditto */ 2399 mb();/* ditto */
2193 spin_unlock_irqrestore(&pm8001_ha->lock, flags); 2400 spin_unlock_irq(&pm8001_ha->lock);
2194 t->task_done(t); 2401 t->task_done(t);
2195 spin_lock_irqsave(&pm8001_ha->lock, flags); 2402 spin_lock_irq(&pm8001_ha->lock);
2196 } else if (!t->uldd_task) { 2403 } else if (!t->uldd_task) {
2197 spin_unlock_irqrestore(&t->task_state_lock, flags); 2404 spin_unlock_irq(&t->task_state_lock);
2198 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); 2405 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag);
2199 mb();/*ditto*/ 2406 mb();/*ditto*/
2200 spin_unlock_irqrestore(&pm8001_ha->lock, flags); 2407 spin_unlock_irq(&pm8001_ha->lock);
2201 t->task_done(t); 2408 t->task_done(t);
2202 spin_lock_irqsave(&pm8001_ha->lock, flags); 2409 spin_lock_irq(&pm8001_ha->lock);
2203 } 2410 }
2204} 2411}
2205 2412
@@ -2207,7 +2414,6 @@ mpi_sata_completion(struct pm8001_hba_info *pm8001_ha, void *piomb)
2207static void mpi_sata_event(struct pm8001_hba_info *pm8001_ha , void *piomb) 2414static void mpi_sata_event(struct pm8001_hba_info *pm8001_ha , void *piomb)
2208{ 2415{
2209 struct sas_task *t; 2416 struct sas_task *t;
2210 unsigned long flags = 0;
2211 struct task_status_struct *ts; 2417 struct task_status_struct *ts;
2212 struct pm8001_ccb_info *ccb; 2418 struct pm8001_ccb_info *ccb;
2213 struct pm8001_device *pm8001_dev; 2419 struct pm8001_device *pm8001_dev;
@@ -2287,9 +2493,9 @@ static void mpi_sata_event(struct pm8001_hba_info *pm8001_ha , void *piomb)
2287 ts->stat = SAS_QUEUE_FULL; 2493 ts->stat = SAS_QUEUE_FULL;
2288 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); 2494 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag);
2289 mb();/*ditto*/ 2495 mb();/*ditto*/
2290 spin_unlock_irqrestore(&pm8001_ha->lock, flags); 2496 spin_unlock_irq(&pm8001_ha->lock);
2291 t->task_done(t); 2497 t->task_done(t);
2292 spin_lock_irqsave(&pm8001_ha->lock, flags); 2498 spin_lock_irq(&pm8001_ha->lock);
2293 return; 2499 return;
2294 } 2500 }
2295 break; 2501 break;
@@ -2387,31 +2593,31 @@ static void mpi_sata_event(struct pm8001_hba_info *pm8001_ha , void *piomb)
2387 ts->stat = SAS_OPEN_TO; 2593 ts->stat = SAS_OPEN_TO;
2388 break; 2594 break;
2389 } 2595 }
2390 spin_lock_irqsave(&t->task_state_lock, flags); 2596 spin_lock_irq(&t->task_state_lock);
2391 t->task_state_flags &= ~SAS_TASK_STATE_PENDING; 2597 t->task_state_flags &= ~SAS_TASK_STATE_PENDING;
2392 t->task_state_flags &= ~SAS_TASK_AT_INITIATOR; 2598 t->task_state_flags &= ~SAS_TASK_AT_INITIATOR;
2393 t->task_state_flags |= SAS_TASK_STATE_DONE; 2599 t->task_state_flags |= SAS_TASK_STATE_DONE;
2394 if (unlikely((t->task_state_flags & SAS_TASK_STATE_ABORTED))) { 2600 if (unlikely((t->task_state_flags & SAS_TASK_STATE_ABORTED))) {
2395 spin_unlock_irqrestore(&t->task_state_lock, flags); 2601 spin_unlock_irq(&t->task_state_lock);
2396 PM8001_FAIL_DBG(pm8001_ha, 2602 PM8001_FAIL_DBG(pm8001_ha,
2397 pm8001_printk("task 0x%p done with io_status 0x%x" 2603 pm8001_printk("task 0x%p done with io_status 0x%x"
2398 " resp 0x%x stat 0x%x but aborted by upper layer!\n", 2604 " resp 0x%x stat 0x%x but aborted by upper layer!\n",
2399 t, event, ts->resp, ts->stat)); 2605 t, event, ts->resp, ts->stat));
2400 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); 2606 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag);
2401 } else if (t->uldd_task) { 2607 } else if (t->uldd_task) {
2402 spin_unlock_irqrestore(&t->task_state_lock, flags); 2608 spin_unlock_irq(&t->task_state_lock);
2403 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); 2609 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag);
2404 mb();/* ditto */ 2610 mb();/* ditto */
2405 spin_unlock_irqrestore(&pm8001_ha->lock, flags); 2611 spin_unlock_irq(&pm8001_ha->lock);
2406 t->task_done(t); 2612 t->task_done(t);
2407 spin_lock_irqsave(&pm8001_ha->lock, flags); 2613 spin_lock_irq(&pm8001_ha->lock);
2408 } else if (!t->uldd_task) { 2614 } else if (!t->uldd_task) {
2409 spin_unlock_irqrestore(&t->task_state_lock, flags); 2615 spin_unlock_irq(&t->task_state_lock);
2410 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); 2616 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag);
2411 mb();/*ditto*/ 2617 mb();/*ditto*/
2412 spin_unlock_irqrestore(&pm8001_ha->lock, flags); 2618 spin_unlock_irq(&pm8001_ha->lock);
2413 t->task_done(t); 2619 t->task_done(t);
2414 spin_lock_irqsave(&pm8001_ha->lock, flags); 2620 spin_lock_irq(&pm8001_ha->lock);
2415 } 2621 }
2416} 2622}
2417 2623
@@ -2857,7 +3063,7 @@ static void pm8001_hw_event_ack_req(struct pm8001_hba_info *pm8001_ha,
2857 3063
2858 memset((u8 *)&payload, 0, sizeof(payload)); 3064 memset((u8 *)&payload, 0, sizeof(payload));
2859 circularQ = &pm8001_ha->inbnd_q_tbl[Qnum]; 3065 circularQ = &pm8001_ha->inbnd_q_tbl[Qnum];
2860 payload.tag = 1; 3066 payload.tag = cpu_to_le32(1);
2861 payload.sea_phyid_portid = cpu_to_le32(((SEA & 0xFFFF) << 8) | 3067 payload.sea_phyid_portid = cpu_to_le32(((SEA & 0xFFFF) << 8) |
2862 ((phyId & 0x0F) << 4) | (port_id & 0x0F)); 3068 ((phyId & 0x0F) << 4) | (port_id & 0x0F));
2863 payload.param0 = cpu_to_le32(param0); 3069 payload.param0 = cpu_to_le32(param0);
@@ -2929,9 +3135,9 @@ hw_event_sas_phy_up(struct pm8001_hba_info *pm8001_ha, void *piomb)
2929 phy->phy_type |= PORT_TYPE_SAS; 3135 phy->phy_type |= PORT_TYPE_SAS;
2930 phy->identify.device_type = deviceType; 3136 phy->identify.device_type = deviceType;
2931 phy->phy_attached = 1; 3137 phy->phy_attached = 1;
2932 if (phy->identify.device_type == SAS_END_DEV) 3138 if (phy->identify.device_type == SAS_END_DEVICE)
2933 phy->identify.target_port_protocols = SAS_PROTOCOL_SSP; 3139 phy->identify.target_port_protocols = SAS_PROTOCOL_SSP;
2934 else if (phy->identify.device_type != NO_DEVICE) 3140 else if (phy->identify.device_type != SAS_PHY_UNUSED)
2935 phy->identify.target_port_protocols = SAS_PROTOCOL_SMP; 3141 phy->identify.target_port_protocols = SAS_PROTOCOL_SMP;
2936 phy->sas_phy.oob_mode = SAS_OOB_MODE; 3142 phy->sas_phy.oob_mode = SAS_OOB_MODE;
2937 sas_ha->notify_phy_event(&phy->sas_phy, PHYE_OOB_DONE); 3143 sas_ha->notify_phy_event(&phy->sas_phy, PHYE_OOB_DONE);
@@ -3075,7 +3281,7 @@ static int mpi_reg_resp(struct pm8001_hba_info *pm8001_ha, void *piomb)
3075 (struct dev_reg_resp *)(piomb + 4); 3281 (struct dev_reg_resp *)(piomb + 4);
3076 3282
3077 htag = le32_to_cpu(registerRespPayload->tag); 3283 htag = le32_to_cpu(registerRespPayload->tag);
3078 ccb = &pm8001_ha->ccb_info[registerRespPayload->tag]; 3284 ccb = &pm8001_ha->ccb_info[htag];
3079 pm8001_dev = ccb->device; 3285 pm8001_dev = ccb->device;
3080 status = le32_to_cpu(registerRespPayload->status); 3286 status = le32_to_cpu(registerRespPayload->status);
3081 device_id = le32_to_cpu(registerRespPayload->device_id); 3287 device_id = le32_to_cpu(registerRespPayload->device_id);
@@ -3149,7 +3355,7 @@ mpi_fw_flash_update_resp(struct pm8001_hba_info *pm8001_ha, void *piomb)
3149 struct fw_control_ex fw_control_context; 3355 struct fw_control_ex fw_control_context;
3150 struct fw_flash_Update_resp *ppayload = 3356 struct fw_flash_Update_resp *ppayload =
3151 (struct fw_flash_Update_resp *)(piomb + 4); 3357 (struct fw_flash_Update_resp *)(piomb + 4);
3152 u32 tag = le32_to_cpu(ppayload->tag); 3358 u32 tag = ppayload->tag;
3153 struct pm8001_ccb_info *ccb = &pm8001_ha->ccb_info[tag]; 3359 struct pm8001_ccb_info *ccb = &pm8001_ha->ccb_info[tag];
3154 status = le32_to_cpu(ppayload->status); 3360 status = le32_to_cpu(ppayload->status);
3155 memcpy(&fw_control_context, 3361 memcpy(&fw_control_context,
@@ -3238,13 +3444,12 @@ mpi_task_abort_resp(struct pm8001_hba_info *pm8001_ha, void *piomb)
3238 3444
3239 struct task_abort_resp *pPayload = 3445 struct task_abort_resp *pPayload =
3240 (struct task_abort_resp *)(piomb + 4); 3446 (struct task_abort_resp *)(piomb + 4);
3241 ccb = &pm8001_ha->ccb_info[pPayload->tag];
3242 t = ccb->task;
3243
3244 3447
3245 status = le32_to_cpu(pPayload->status); 3448 status = le32_to_cpu(pPayload->status);
3246 tag = le32_to_cpu(pPayload->tag); 3449 tag = le32_to_cpu(pPayload->tag);
3247 scp = le32_to_cpu(pPayload->scp); 3450 scp = le32_to_cpu(pPayload->scp);
3451 ccb = &pm8001_ha->ccb_info[tag];
3452 t = ccb->task;
3248 PM8001_IO_DBG(pm8001_ha, 3453 PM8001_IO_DBG(pm8001_ha,
3249 pm8001_printk(" status = 0x%x\n", status)); 3454 pm8001_printk(" status = 0x%x\n", status));
3250 if (t == NULL) 3455 if (t == NULL)
@@ -3270,7 +3475,7 @@ mpi_task_abort_resp(struct pm8001_hba_info *pm8001_ha, void *piomb)
3270 t->task_state_flags &= ~SAS_TASK_AT_INITIATOR; 3475 t->task_state_flags &= ~SAS_TASK_AT_INITIATOR;
3271 t->task_state_flags |= SAS_TASK_STATE_DONE; 3476 t->task_state_flags |= SAS_TASK_STATE_DONE;
3272 spin_unlock_irqrestore(&t->task_state_lock, flags); 3477 spin_unlock_irqrestore(&t->task_state_lock, flags);
3273 pm8001_ccb_task_free(pm8001_ha, t, ccb, pPayload->tag); 3478 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag);
3274 mb(); 3479 mb();
3275 t->task_done(t); 3480 t->task_done(t);
3276 return 0; 3481 return 0;
@@ -3497,7 +3702,7 @@ static int mpi_hw_event(struct pm8001_hba_info *pm8001_ha, void* piomb)
3497static void process_one_iomb(struct pm8001_hba_info *pm8001_ha, void *piomb) 3702static void process_one_iomb(struct pm8001_hba_info *pm8001_ha, void *piomb)
3498{ 3703{
3499 u32 pHeader = (u32)*(u32 *)piomb; 3704 u32 pHeader = (u32)*(u32 *)piomb;
3500 u8 opc = (u8)((le32_to_cpu(pHeader)) & 0xFFF); 3705 u8 opc = (u8)(pHeader & 0xFFF);
3501 3706
3502 PM8001_MSG_DBG(pm8001_ha, pm8001_printk("process_one_iomb:")); 3707 PM8001_MSG_DBG(pm8001_ha, pm8001_printk("process_one_iomb:"));
3503 3708
@@ -3664,9 +3869,11 @@ static int process_oq(struct pm8001_hba_info *pm8001_ha)
3664{ 3869{
3665 struct outbound_queue_table *circularQ; 3870 struct outbound_queue_table *circularQ;
3666 void *pMsg1 = NULL; 3871 void *pMsg1 = NULL;
3667 u8 bc = 0; 3872 u8 uninitialized_var(bc);
3668 u32 ret = MPI_IO_STATUS_FAIL; 3873 u32 ret = MPI_IO_STATUS_FAIL;
3874 unsigned long flags;
3669 3875
3876 spin_lock_irqsave(&pm8001_ha->lock, flags);
3670 circularQ = &pm8001_ha->outbnd_q_tbl[0]; 3877 circularQ = &pm8001_ha->outbnd_q_tbl[0];
3671 do { 3878 do {
3672 ret = mpi_msg_consume(pm8001_ha, circularQ, &pMsg1, &bc); 3879 ret = mpi_msg_consume(pm8001_ha, circularQ, &pMsg1, &bc);
@@ -3677,16 +3884,16 @@ static int process_oq(struct pm8001_hba_info *pm8001_ha)
3677 mpi_msg_free_set(pm8001_ha, pMsg1, circularQ, bc); 3884 mpi_msg_free_set(pm8001_ha, pMsg1, circularQ, bc);
3678 } 3885 }
3679 if (MPI_IO_STATUS_BUSY == ret) { 3886 if (MPI_IO_STATUS_BUSY == ret) {
3680 u32 producer_idx;
3681 /* Update the producer index from SPC */ 3887 /* Update the producer index from SPC */
3682 producer_idx = pm8001_read_32(circularQ->pi_virt); 3888 circularQ->producer_index =
3683 circularQ->producer_index = cpu_to_le32(producer_idx); 3889 cpu_to_le32(pm8001_read_32(circularQ->pi_virt));
3684 if (circularQ->producer_index == 3890 if (le32_to_cpu(circularQ->producer_index) ==
3685 circularQ->consumer_idx) 3891 circularQ->consumer_idx)
3686 /* OQ is empty */ 3892 /* OQ is empty */
3687 break; 3893 break;
3688 } 3894 }
3689 } while (1); 3895 } while (1);
3896 spin_unlock_irqrestore(&pm8001_ha->lock, flags);
3690 return ret; 3897 return ret;
3691} 3898}
3692 3899
@@ -3712,9 +3919,9 @@ pm8001_chip_make_sg(struct scatterlist *scatter, int nr, void *prd)
3712 } 3919 }
3713} 3920}
3714 3921
3715static void build_smp_cmd(u32 deviceID, u32 hTag, struct smp_req *psmp_cmd) 3922static void build_smp_cmd(u32 deviceID, __le32 hTag, struct smp_req *psmp_cmd)
3716{ 3923{
3717 psmp_cmd->tag = cpu_to_le32(hTag); 3924 psmp_cmd->tag = hTag;
3718 psmp_cmd->device_id = cpu_to_le32(deviceID); 3925 psmp_cmd->device_id = cpu_to_le32(deviceID);
3719 psmp_cmd->len_ip_ir = cpu_to_le32(1|(1 << 1)); 3926 psmp_cmd->len_ip_ir = cpu_to_le32(1|(1 << 1));
3720} 3927}
@@ -3798,7 +4005,7 @@ static int pm8001_chip_ssp_io_req(struct pm8001_hba_info *pm8001_ha,
3798 struct ssp_ini_io_start_req ssp_cmd; 4005 struct ssp_ini_io_start_req ssp_cmd;
3799 u32 tag = ccb->ccb_tag; 4006 u32 tag = ccb->ccb_tag;
3800 int ret; 4007 int ret;
3801 __le64 phys_addr; 4008 u64 phys_addr;
3802 struct inbound_queue_table *circularQ; 4009 struct inbound_queue_table *circularQ;
3803 u32 opc = OPC_INB_SSPINIIOSTART; 4010 u32 opc = OPC_INB_SSPINIIOSTART;
3804 memset(&ssp_cmd, 0, sizeof(ssp_cmd)); 4011 memset(&ssp_cmd, 0, sizeof(ssp_cmd));
@@ -3819,15 +4026,15 @@ static int pm8001_chip_ssp_io_req(struct pm8001_hba_info *pm8001_ha,
3819 /* fill in PRD (scatter/gather) table, if any */ 4026 /* fill in PRD (scatter/gather) table, if any */
3820 if (task->num_scatter > 1) { 4027 if (task->num_scatter > 1) {
3821 pm8001_chip_make_sg(task->scatter, ccb->n_elem, ccb->buf_prd); 4028 pm8001_chip_make_sg(task->scatter, ccb->n_elem, ccb->buf_prd);
3822 phys_addr = cpu_to_le64(ccb->ccb_dma_handle + 4029 phys_addr = ccb->ccb_dma_handle +
3823 offsetof(struct pm8001_ccb_info, buf_prd[0])); 4030 offsetof(struct pm8001_ccb_info, buf_prd[0]);
3824 ssp_cmd.addr_low = lower_32_bits(phys_addr); 4031 ssp_cmd.addr_low = cpu_to_le32(lower_32_bits(phys_addr));
3825 ssp_cmd.addr_high = upper_32_bits(phys_addr); 4032 ssp_cmd.addr_high = cpu_to_le32(upper_32_bits(phys_addr));
3826 ssp_cmd.esgl = cpu_to_le32(1<<31); 4033 ssp_cmd.esgl = cpu_to_le32(1<<31);
3827 } else if (task->num_scatter == 1) { 4034 } else if (task->num_scatter == 1) {
3828 __le64 dma_addr = cpu_to_le64(sg_dma_address(task->scatter)); 4035 u64 dma_addr = sg_dma_address(task->scatter);
3829 ssp_cmd.addr_low = lower_32_bits(dma_addr); 4036 ssp_cmd.addr_low = cpu_to_le32(lower_32_bits(dma_addr));
3830 ssp_cmd.addr_high = upper_32_bits(dma_addr); 4037 ssp_cmd.addr_high = cpu_to_le32(upper_32_bits(dma_addr));
3831 ssp_cmd.len = cpu_to_le32(task->total_xfer_len); 4038 ssp_cmd.len = cpu_to_le32(task->total_xfer_len);
3832 ssp_cmd.esgl = 0; 4039 ssp_cmd.esgl = 0;
3833 } else if (task->num_scatter == 0) { 4040 } else if (task->num_scatter == 0) {
@@ -3850,7 +4057,7 @@ static int pm8001_chip_sata_req(struct pm8001_hba_info *pm8001_ha,
3850 int ret; 4057 int ret;
3851 struct sata_start_req sata_cmd; 4058 struct sata_start_req sata_cmd;
3852 u32 hdr_tag, ncg_tag = 0; 4059 u32 hdr_tag, ncg_tag = 0;
3853 __le64 phys_addr; 4060 u64 phys_addr;
3854 u32 ATAP = 0x0; 4061 u32 ATAP = 0x0;
3855 u32 dir; 4062 u32 dir;
3856 struct inbound_queue_table *circularQ; 4063 struct inbound_queue_table *circularQ;
@@ -3889,13 +4096,13 @@ static int pm8001_chip_sata_req(struct pm8001_hba_info *pm8001_ha,
3889 /* fill in PRD (scatter/gather) table, if any */ 4096 /* fill in PRD (scatter/gather) table, if any */
3890 if (task->num_scatter > 1) { 4097 if (task->num_scatter > 1) {
3891 pm8001_chip_make_sg(task->scatter, ccb->n_elem, ccb->buf_prd); 4098 pm8001_chip_make_sg(task->scatter, ccb->n_elem, ccb->buf_prd);
3892 phys_addr = cpu_to_le64(ccb->ccb_dma_handle + 4099 phys_addr = ccb->ccb_dma_handle +
3893 offsetof(struct pm8001_ccb_info, buf_prd[0])); 4100 offsetof(struct pm8001_ccb_info, buf_prd[0]);
3894 sata_cmd.addr_low = lower_32_bits(phys_addr); 4101 sata_cmd.addr_low = lower_32_bits(phys_addr);
3895 sata_cmd.addr_high = upper_32_bits(phys_addr); 4102 sata_cmd.addr_high = upper_32_bits(phys_addr);
3896 sata_cmd.esgl = cpu_to_le32(1 << 31); 4103 sata_cmd.esgl = cpu_to_le32(1 << 31);
3897 } else if (task->num_scatter == 1) { 4104 } else if (task->num_scatter == 1) {
3898 __le64 dma_addr = cpu_to_le64(sg_dma_address(task->scatter)); 4105 u64 dma_addr = sg_dma_address(task->scatter);
3899 sata_cmd.addr_low = lower_32_bits(dma_addr); 4106 sata_cmd.addr_low = lower_32_bits(dma_addr);
3900 sata_cmd.addr_high = upper_32_bits(dma_addr); 4107 sata_cmd.addr_high = upper_32_bits(dma_addr);
3901 sata_cmd.len = cpu_to_le32(task->total_xfer_len); 4108 sata_cmd.len = cpu_to_le32(task->total_xfer_len);
@@ -4039,7 +4246,7 @@ static int pm8001_chip_dereg_dev_req(struct pm8001_hba_info *pm8001_ha,
4039 4246
4040 circularQ = &pm8001_ha->inbnd_q_tbl[0]; 4247 circularQ = &pm8001_ha->inbnd_q_tbl[0];
4041 memset(&payload, 0, sizeof(payload)); 4248 memset(&payload, 0, sizeof(payload));
4042 payload.tag = 1; 4249 payload.tag = cpu_to_le32(1);
4043 payload.device_id = cpu_to_le32(device_id); 4250 payload.device_id = cpu_to_le32(device_id);
4044 PM8001_MSG_DBG(pm8001_ha, 4251 PM8001_MSG_DBG(pm8001_ha,
4045 pm8001_printk("unregister device device_id = %d\n", device_id)); 4252 pm8001_printk("unregister device device_id = %d\n", device_id));
@@ -4063,7 +4270,7 @@ static int pm8001_chip_phy_ctl_req(struct pm8001_hba_info *pm8001_ha,
4063 u32 opc = OPC_INB_LOCAL_PHY_CONTROL; 4270 u32 opc = OPC_INB_LOCAL_PHY_CONTROL;
4064 memset(&payload, 0, sizeof(payload)); 4271 memset(&payload, 0, sizeof(payload));
4065 circularQ = &pm8001_ha->inbnd_q_tbl[0]; 4272 circularQ = &pm8001_ha->inbnd_q_tbl[0];
4066 payload.tag = 1; 4273 payload.tag = cpu_to_le32(1);
4067 payload.phyop_phyid = 4274 payload.phyop_phyid =
4068 cpu_to_le32(((phy_op & 0xff) << 8) | (phyId & 0x0F)); 4275 cpu_to_le32(((phy_op & 0xff) << 8) | (phyId & 0x0F));
4069 ret = mpi_build_cmd(pm8001_ha, circularQ, opc, &payload); 4276 ret = mpi_build_cmd(pm8001_ha, circularQ, opc, &payload);
@@ -4092,12 +4299,9 @@ static u32 pm8001_chip_is_our_interupt(struct pm8001_hba_info *pm8001_ha)
4092static irqreturn_t 4299static irqreturn_t
4093pm8001_chip_isr(struct pm8001_hba_info *pm8001_ha) 4300pm8001_chip_isr(struct pm8001_hba_info *pm8001_ha)
4094{ 4301{
4095 unsigned long flags;
4096 spin_lock_irqsave(&pm8001_ha->lock, flags);
4097 pm8001_chip_interrupt_disable(pm8001_ha); 4302 pm8001_chip_interrupt_disable(pm8001_ha);
4098 process_oq(pm8001_ha); 4303 process_oq(pm8001_ha);
4099 pm8001_chip_interrupt_enable(pm8001_ha); 4304 pm8001_chip_interrupt_enable(pm8001_ha);
4100 spin_unlock_irqrestore(&pm8001_ha->lock, flags);
4101 return IRQ_HANDLED; 4305 return IRQ_HANDLED;
4102} 4306}
4103 4307
@@ -4360,8 +4564,10 @@ pm8001_chip_fw_flash_update_build(struct pm8001_hba_info *pm8001_ha,
4360 payload.cur_image_offset = cpu_to_le32(info->cur_image_offset); 4564 payload.cur_image_offset = cpu_to_le32(info->cur_image_offset);
4361 payload.total_image_len = cpu_to_le32(info->total_image_len); 4565 payload.total_image_len = cpu_to_le32(info->total_image_len);
4362 payload.len = info->sgl.im_len.len ; 4566 payload.len = info->sgl.im_len.len ;
4363 payload.sgl_addr_lo = lower_32_bits(info->sgl.addr); 4567 payload.sgl_addr_lo =
4364 payload.sgl_addr_hi = upper_32_bits(info->sgl.addr); 4568 cpu_to_le32(lower_32_bits(le64_to_cpu(info->sgl.addr)));
4569 payload.sgl_addr_hi =
4570 cpu_to_le32(upper_32_bits(le64_to_cpu(info->sgl.addr)));
4365 ret = mpi_build_cmd(pm8001_ha, circularQ, opc, &payload); 4571 ret = mpi_build_cmd(pm8001_ha, circularQ, opc, &payload);
4366 return ret; 4572 return ret;
4367} 4573}
diff --git a/drivers/scsi/pm8001/pm8001_hwi.h b/drivers/scsi/pm8001/pm8001_hwi.h
index 909132041c07..1a4611eb0321 100644
--- a/drivers/scsi/pm8001/pm8001_hwi.h
+++ b/drivers/scsi/pm8001/pm8001_hwi.h
@@ -625,7 +625,7 @@ struct set_nvm_data_req {
625 __le32 tag; 625 __le32 tag;
626 __le32 len_ir_vpdd; 626 __le32 len_ir_vpdd;
627 __le32 vpd_offset; 627 __le32 vpd_offset;
628 u32 reserved[8]; 628 __le32 reserved[8];
629 __le32 resp_addr_lo; 629 __le32 resp_addr_lo;
630 __le32 resp_addr_hi; 630 __le32 resp_addr_hi;
631 __le32 resp_len; 631 __le32 resp_len;
diff --git a/drivers/scsi/pm8001/pm8001_init.c b/drivers/scsi/pm8001/pm8001_init.c
index c21a2163f9f6..36efaa7c3a54 100644
--- a/drivers/scsi/pm8001/pm8001_init.c
+++ b/drivers/scsi/pm8001/pm8001_init.c
@@ -62,7 +62,6 @@ static struct scsi_host_template pm8001_sht = {
62 .queuecommand = sas_queuecommand, 62 .queuecommand = sas_queuecommand,
63 .target_alloc = sas_target_alloc, 63 .target_alloc = sas_target_alloc,
64 .slave_configure = sas_slave_configure, 64 .slave_configure = sas_slave_configure,
65 .slave_destroy = sas_slave_destroy,
66 .scan_finished = pm8001_scan_finished, 65 .scan_finished = pm8001_scan_finished,
67 .scan_start = pm8001_scan_start, 66 .scan_start = pm8001_scan_start,
68 .change_queue_depth = sas_change_queue_depth, 67 .change_queue_depth = sas_change_queue_depth,
@@ -76,7 +75,6 @@ static struct scsi_host_template pm8001_sht = {
76 .use_clustering = ENABLE_CLUSTERING, 75 .use_clustering = ENABLE_CLUSTERING,
77 .eh_device_reset_handler = sas_eh_device_reset_handler, 76 .eh_device_reset_handler = sas_eh_device_reset_handler,
78 .eh_bus_reset_handler = sas_eh_bus_reset_handler, 77 .eh_bus_reset_handler = sas_eh_bus_reset_handler,
79 .slave_alloc = sas_slave_alloc,
80 .target_destroy = sas_target_destroy, 78 .target_destroy = sas_target_destroy,
81 .ioctl = sas_ioctl, 79 .ioctl = sas_ioctl,
82 .shost_attrs = pm8001_host_attrs, 80 .shost_attrs = pm8001_host_attrs,
diff --git a/drivers/scsi/pm8001/pm8001_sas.c b/drivers/scsi/pm8001/pm8001_sas.c
index fb3dc9978861..3b11edd4a50c 100644
--- a/drivers/scsi/pm8001/pm8001_sas.c
+++ b/drivers/scsi/pm8001/pm8001_sas.c
@@ -166,6 +166,7 @@ int pm8001_phy_control(struct asd_sas_phy *sas_phy, enum phy_func func,
166 struct pm8001_hba_info *pm8001_ha = NULL; 166 struct pm8001_hba_info *pm8001_ha = NULL;
167 struct sas_phy_linkrates *rates; 167 struct sas_phy_linkrates *rates;
168 DECLARE_COMPLETION_ONSTACK(completion); 168 DECLARE_COMPLETION_ONSTACK(completion);
169 unsigned long flags;
169 pm8001_ha = sas_phy->ha->lldd_ha; 170 pm8001_ha = sas_phy->ha->lldd_ha;
170 pm8001_ha->phy[phy_id].enable_completion = &completion; 171 pm8001_ha->phy[phy_id].enable_completion = &completion;
171 switch (func) { 172 switch (func) {
@@ -209,8 +210,29 @@ int pm8001_phy_control(struct asd_sas_phy *sas_phy, enum phy_func func,
209 case PHY_FUNC_DISABLE: 210 case PHY_FUNC_DISABLE:
210 PM8001_CHIP_DISP->phy_stop_req(pm8001_ha, phy_id); 211 PM8001_CHIP_DISP->phy_stop_req(pm8001_ha, phy_id);
211 break; 212 break;
213 case PHY_FUNC_GET_EVENTS:
214 spin_lock_irqsave(&pm8001_ha->lock, flags);
215 if (-1 == pm8001_bar4_shift(pm8001_ha,
216 (phy_id < 4) ? 0x30000 : 0x40000)) {
217 spin_unlock_irqrestore(&pm8001_ha->lock, flags);
218 return -EINVAL;
219 }
220 {
221 struct sas_phy *phy = sas_phy->phy;
222 uint32_t *qp = (uint32_t *)(((char *)
223 pm8001_ha->io_mem[2].memvirtaddr)
224 + 0x1034 + (0x4000 * (phy_id & 3)));
225
226 phy->invalid_dword_count = qp[0];
227 phy->running_disparity_error_count = qp[1];
228 phy->loss_of_dword_sync_count = qp[3];
229 phy->phy_reset_problem_count = qp[4];
230 }
231 pm8001_bar4_shift(pm8001_ha, 0);
232 spin_unlock_irqrestore(&pm8001_ha->lock, flags);
233 return 0;
212 default: 234 default:
213 rc = -ENOSYS; 235 rc = -EOPNOTSUPP;
214 } 236 }
215 msleep(300); 237 msleep(300);
216 return rc; 238 return rc;
@@ -234,12 +256,14 @@ void pm8001_scan_start(struct Scsi_Host *shost)
234 256
235int pm8001_scan_finished(struct Scsi_Host *shost, unsigned long time) 257int pm8001_scan_finished(struct Scsi_Host *shost, unsigned long time)
236{ 258{
259 struct sas_ha_struct *ha = SHOST_TO_SAS_HA(shost);
260
237 /* give the phy enabling interrupt event time to come in (1s 261 /* give the phy enabling interrupt event time to come in (1s
238 * is empirically about all it takes) */ 262 * is empirically about all it takes) */
239 if (time < HZ) 263 if (time < HZ)
240 return 0; 264 return 0;
241 /* Wait for discovery to finish */ 265 /* Wait for discovery to finish */
242 scsi_flush_work(shost); 266 sas_drain_work(ha);
243 return 1; 267 return 1;
244} 268}
245 269
@@ -340,7 +364,7 @@ static int pm8001_task_exec(struct sas_task *task, const int num,
340 struct pm8001_ccb_info *ccb; 364 struct pm8001_ccb_info *ccb;
341 u32 tag = 0xdeadbeef, rc, n_elem = 0; 365 u32 tag = 0xdeadbeef, rc, n_elem = 0;
342 u32 n = num; 366 u32 n = num;
343 unsigned long flags = 0, flags_libsas = 0; 367 unsigned long flags = 0;
344 368
345 if (!dev->port) { 369 if (!dev->port) {
346 struct task_status_struct *tsm = &t->task_status; 370 struct task_status_struct *tsm = &t->task_status;
@@ -364,11 +388,7 @@ static int pm8001_task_exec(struct sas_task *task, const int num,
364 ts->stat = SAS_PHY_DOWN; 388 ts->stat = SAS_PHY_DOWN;
365 389
366 spin_unlock_irqrestore(&pm8001_ha->lock, flags); 390 spin_unlock_irqrestore(&pm8001_ha->lock, flags);
367 spin_unlock_irqrestore(dev->sata_dev.ap->lock,
368 flags_libsas);
369 t->task_done(t); 391 t->task_done(t);
370 spin_lock_irqsave(dev->sata_dev.ap->lock,
371 flags_libsas);
372 spin_lock_irqsave(&pm8001_ha->lock, flags); 392 spin_lock_irqsave(&pm8001_ha->lock, flags);
373 if (n > 1) 393 if (n > 1)
374 t = list_entry(t->list.next, 394 t = list_entry(t->list.next,
@@ -516,6 +536,7 @@ void pm8001_ccb_task_free(struct pm8001_hba_info *pm8001_ha,
516 task->lldd_task = NULL; 536 task->lldd_task = NULL;
517 ccb->task = NULL; 537 ccb->task = NULL;
518 ccb->ccb_tag = 0xFFFFFFFF; 538 ccb->ccb_tag = 0xFFFFFFFF;
539 ccb->open_retry = 0;
519 pm8001_ccb_free(pm8001_ha, ccb_idx); 540 pm8001_ccb_free(pm8001_ha, ccb_idx);
520} 541}
521 542
@@ -615,7 +636,7 @@ static int pm8001_dev_found_notify(struct domain_device *dev)
615 wait_for_completion(&completion); 636 wait_for_completion(&completion);
616 if (dev->dev_type == SAS_END_DEV) 637 if (dev->dev_type == SAS_END_DEV)
617 msleep(50); 638 msleep(50);
618 pm8001_ha->flags |= PM8001F_RUN_TIME ; 639 pm8001_ha->flags = PM8001F_RUN_TIME;
619 return 0; 640 return 0;
620found_out: 641found_out:
621 spin_unlock_irqrestore(&pm8001_ha->lock, flags); 642 spin_unlock_irqrestore(&pm8001_ha->lock, flags);
@@ -860,6 +881,77 @@ static int pm8001_issue_ssp_tmf(struct domain_device *dev,
860 tmf); 881 tmf);
861} 882}
862 883
884/* retry commands by ha, by task and/or by device */
885void pm8001_open_reject_retry(
886 struct pm8001_hba_info *pm8001_ha,
887 struct sas_task *task_to_close,
888 struct pm8001_device *device_to_close)
889{
890 int i;
891 unsigned long flags;
892
893 if (pm8001_ha == NULL)
894 return;
895
896 spin_lock_irqsave(&pm8001_ha->lock, flags);
897
898 for (i = 0; i < PM8001_MAX_CCB; i++) {
899 struct sas_task *task;
900 struct task_status_struct *ts;
901 struct pm8001_device *pm8001_dev;
902 unsigned long flags1;
903 u32 tag;
904 struct pm8001_ccb_info *ccb = &pm8001_ha->ccb_info[i];
905
906 pm8001_dev = ccb->device;
907 if (!pm8001_dev || (pm8001_dev->dev_type == NO_DEVICE))
908 continue;
909 if (!device_to_close) {
910 uintptr_t d = (uintptr_t)pm8001_dev
911 - (uintptr_t)&pm8001_ha->devices;
912 if (((d % sizeof(*pm8001_dev)) != 0)
913 || ((d / sizeof(*pm8001_dev)) >= PM8001_MAX_DEVICES))
914 continue;
915 } else if (pm8001_dev != device_to_close)
916 continue;
917 tag = ccb->ccb_tag;
918 if (!tag || (tag == 0xFFFFFFFF))
919 continue;
920 task = ccb->task;
921 if (!task || !task->task_done)
922 continue;
923 if (task_to_close && (task != task_to_close))
924 continue;
925 ts = &task->task_status;
926 ts->resp = SAS_TASK_COMPLETE;
927 /* Force the midlayer to retry */
928 ts->stat = SAS_OPEN_REJECT;
929 ts->open_rej_reason = SAS_OREJ_RSVD_RETRY;
930 if (pm8001_dev)
931 pm8001_dev->running_req--;
932 spin_lock_irqsave(&task->task_state_lock, flags1);
933 task->task_state_flags &= ~SAS_TASK_STATE_PENDING;
934 task->task_state_flags &= ~SAS_TASK_AT_INITIATOR;
935 task->task_state_flags |= SAS_TASK_STATE_DONE;
936 if (unlikely((task->task_state_flags
937 & SAS_TASK_STATE_ABORTED))) {
938 spin_unlock_irqrestore(&task->task_state_lock,
939 flags1);
940 pm8001_ccb_task_free(pm8001_ha, task, ccb, tag);
941 } else {
942 spin_unlock_irqrestore(&task->task_state_lock,
943 flags1);
944 pm8001_ccb_task_free(pm8001_ha, task, ccb, tag);
945 mb();/* in order to force CPU ordering */
946 spin_unlock_irqrestore(&pm8001_ha->lock, flags);
947 task->task_done(task);
948 spin_lock_irqsave(&pm8001_ha->lock, flags);
949 }
950 }
951
952 spin_unlock_irqrestore(&pm8001_ha->lock, flags);
953}
954
863/** 955/**
864 * Standard mandates link reset for ATA (type 0) and hard reset for 956 * Standard mandates link reset for ATA (type 0) and hard reset for
865 * SSP (type 1) , only for RECOVERY 957 * SSP (type 1) , only for RECOVERY
@@ -875,12 +967,14 @@ int pm8001_I_T_nexus_reset(struct domain_device *dev)
875 967
876 pm8001_dev = dev->lldd_dev; 968 pm8001_dev = dev->lldd_dev;
877 pm8001_ha = pm8001_find_ha_by_dev(dev); 969 pm8001_ha = pm8001_find_ha_by_dev(dev);
878 phy = sas_find_local_phy(dev); 970 phy = sas_get_local_phy(dev);
879 971
880 if (dev_is_sata(dev)) { 972 if (dev_is_sata(dev)) {
881 DECLARE_COMPLETION_ONSTACK(completion_setstate); 973 DECLARE_COMPLETION_ONSTACK(completion_setstate);
882 if (scsi_is_sas_phy_local(phy)) 974 if (scsi_is_sas_phy_local(phy)) {
883 return 0; 975 rc = 0;
976 goto out;
977 }
884 rc = sas_phy_reset(phy, 1); 978 rc = sas_phy_reset(phy, 1);
885 msleep(2000); 979 msleep(2000);
886 rc = pm8001_exec_internal_task_abort(pm8001_ha, pm8001_dev , 980 rc = pm8001_exec_internal_task_abort(pm8001_ha, pm8001_dev ,
@@ -889,12 +983,14 @@ int pm8001_I_T_nexus_reset(struct domain_device *dev)
889 rc = PM8001_CHIP_DISP->set_dev_state_req(pm8001_ha, 983 rc = PM8001_CHIP_DISP->set_dev_state_req(pm8001_ha,
890 pm8001_dev, 0x01); 984 pm8001_dev, 0x01);
891 wait_for_completion(&completion_setstate); 985 wait_for_completion(&completion_setstate);
892 } else{ 986 } else {
893 rc = sas_phy_reset(phy, 1); 987 rc = sas_phy_reset(phy, 1);
894 msleep(2000); 988 msleep(2000);
895 } 989 }
896 PM8001_EH_DBG(pm8001_ha, pm8001_printk(" for device[%x]:rc=%d\n", 990 PM8001_EH_DBG(pm8001_ha, pm8001_printk(" for device[%x]:rc=%d\n",
897 pm8001_dev->device_id, rc)); 991 pm8001_dev->device_id, rc));
992 out:
993 sas_put_local_phy(phy);
898 return rc; 994 return rc;
899} 995}
900 996
@@ -906,10 +1002,11 @@ int pm8001_lu_reset(struct domain_device *dev, u8 *lun)
906 struct pm8001_device *pm8001_dev = dev->lldd_dev; 1002 struct pm8001_device *pm8001_dev = dev->lldd_dev;
907 struct pm8001_hba_info *pm8001_ha = pm8001_find_ha_by_dev(dev); 1003 struct pm8001_hba_info *pm8001_ha = pm8001_find_ha_by_dev(dev);
908 if (dev_is_sata(dev)) { 1004 if (dev_is_sata(dev)) {
909 struct sas_phy *phy = sas_find_local_phy(dev); 1005 struct sas_phy *phy = sas_get_local_phy(dev);
910 rc = pm8001_exec_internal_task_abort(pm8001_ha, pm8001_dev , 1006 rc = pm8001_exec_internal_task_abort(pm8001_ha, pm8001_dev ,
911 dev, 1, 0); 1007 dev, 1, 0);
912 rc = sas_phy_reset(phy, 1); 1008 rc = sas_phy_reset(phy, 1);
1009 sas_put_local_phy(phy);
913 rc = PM8001_CHIP_DISP->set_dev_state_req(pm8001_ha, 1010 rc = PM8001_CHIP_DISP->set_dev_state_req(pm8001_ha,
914 pm8001_dev, 0x01); 1011 pm8001_dev, 0x01);
915 msleep(2000); 1012 msleep(2000);
diff --git a/drivers/scsi/pm8001/pm8001_sas.h b/drivers/scsi/pm8001/pm8001_sas.h
index 93959febe205..11008205aeb3 100644
--- a/drivers/scsi/pm8001/pm8001_sas.h
+++ b/drivers/scsi/pm8001/pm8001_sas.h
@@ -235,6 +235,7 @@ struct pm8001_ccb_info {
235 struct pm8001_device *device; 235 struct pm8001_device *device;
236 struct pm8001_prd buf_prd[PM8001_MAX_DMA_SG]; 236 struct pm8001_prd buf_prd[PM8001_MAX_DMA_SG];
237 struct fw_control_ex *fw_control_context; 237 struct fw_control_ex *fw_control_context;
238 u8 open_retry;
238}; 239};
239 240
240struct mpi_mem { 241struct mpi_mem {
@@ -484,10 +485,15 @@ void pm8001_dev_gone(struct domain_device *dev);
484int pm8001_lu_reset(struct domain_device *dev, u8 *lun); 485int pm8001_lu_reset(struct domain_device *dev, u8 *lun);
485int pm8001_I_T_nexus_reset(struct domain_device *dev); 486int pm8001_I_T_nexus_reset(struct domain_device *dev);
486int pm8001_query_task(struct sas_task *task); 487int pm8001_query_task(struct sas_task *task);
488void pm8001_open_reject_retry(
489 struct pm8001_hba_info *pm8001_ha,
490 struct sas_task *task_to_close,
491 struct pm8001_device *device_to_close);
487int pm8001_mem_alloc(struct pci_dev *pdev, void **virt_addr, 492int pm8001_mem_alloc(struct pci_dev *pdev, void **virt_addr,
488 dma_addr_t *pphys_addr, u32 *pphys_addr_hi, u32 *pphys_addr_lo, 493 dma_addr_t *pphys_addr, u32 *pphys_addr_hi, u32 *pphys_addr_lo,
489 u32 mem_size, u32 align); 494 u32 mem_size, u32 align);
490 495
496int pm8001_bar4_shift(struct pm8001_hba_info *pm8001_ha, u32 shiftValue);
491 497
492/* ctl shared API */ 498/* ctl shared API */
493extern struct device_attribute *pm8001_host_attrs[]; 499extern struct device_attribute *pm8001_host_attrs[];
diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c
index 9f41b3b4358f..5926f5a87ea8 100644
--- a/drivers/scsi/qla2xxx/qla_attr.c
+++ b/drivers/scsi/qla2xxx/qla_attr.c
@@ -356,7 +356,8 @@ qla2x00_sysfs_write_optrom_ctl(struct file *filp, struct kobject *kobj,
356 else if (start == (ha->flt_region_boot * 4) || 356 else if (start == (ha->flt_region_boot * 4) ||
357 start == (ha->flt_region_fw * 4)) 357 start == (ha->flt_region_fw * 4))
358 valid = 1; 358 valid = 1;
359 else if (IS_QLA25XX(ha) || IS_QLA8XXX_TYPE(ha)) 359 else if (IS_QLA24XX_TYPE(ha) || IS_QLA25XX(ha)
360 || IS_CNA_CAPABLE(ha) || IS_QLA2031(ha))
360 valid = 1; 361 valid = 1;
361 if (!valid) { 362 if (!valid) {
362 ql_log(ql_log_warn, vha, 0x7065, 363 ql_log(ql_log_warn, vha, 0x7065,
@@ -627,144 +628,6 @@ static struct bin_attribute sysfs_reset_attr = {
627}; 628};
628 629
629static ssize_t 630static ssize_t
630qla2x00_sysfs_write_edc(struct file *filp, struct kobject *kobj,
631 struct bin_attribute *bin_attr,
632 char *buf, loff_t off, size_t count)
633{
634 struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
635 struct device, kobj)));
636 struct qla_hw_data *ha = vha->hw;
637 uint16_t dev, adr, opt, len;
638 int rval;
639
640 ha->edc_data_len = 0;
641
642 if (!capable(CAP_SYS_ADMIN) || off != 0 || count < 8)
643 return -EINVAL;
644
645 if (!ha->edc_data) {
646 ha->edc_data = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL,
647 &ha->edc_data_dma);
648 if (!ha->edc_data) {
649 ql_log(ql_log_warn, vha, 0x7073,
650 "Unable to allocate memory for EDC write.\n");
651 return -ENOMEM;
652 }
653 }
654
655 dev = le16_to_cpup((void *)&buf[0]);
656 adr = le16_to_cpup((void *)&buf[2]);
657 opt = le16_to_cpup((void *)&buf[4]);
658 len = le16_to_cpup((void *)&buf[6]);
659
660 if (!(opt & BIT_0))
661 if (len == 0 || len > DMA_POOL_SIZE || len > count - 8)
662 return -EINVAL;
663
664 memcpy(ha->edc_data, &buf[8], len);
665
666 rval = qla2x00_write_sfp(vha, ha->edc_data_dma, ha->edc_data,
667 dev, adr, len, opt);
668 if (rval != QLA_SUCCESS) {
669 ql_log(ql_log_warn, vha, 0x7074,
670 "Unable to write EDC (%x) %02x:%04x:%02x:%02x:%02hhx\n",
671 rval, dev, adr, opt, len, buf[8]);
672 return -EIO;
673 }
674
675 return count;
676}
677
678static struct bin_attribute sysfs_edc_attr = {
679 .attr = {
680 .name = "edc",
681 .mode = S_IWUSR,
682 },
683 .size = 0,
684 .write = qla2x00_sysfs_write_edc,
685};
686
687static ssize_t
688qla2x00_sysfs_write_edc_status(struct file *filp, struct kobject *kobj,
689 struct bin_attribute *bin_attr,
690 char *buf, loff_t off, size_t count)
691{
692 struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
693 struct device, kobj)));
694 struct qla_hw_data *ha = vha->hw;
695 uint16_t dev, adr, opt, len;
696 int rval;
697
698 ha->edc_data_len = 0;
699
700 if (!capable(CAP_SYS_ADMIN) || off != 0 || count < 8)
701 return -EINVAL;
702
703 if (!ha->edc_data) {
704 ha->edc_data = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL,
705 &ha->edc_data_dma);
706 if (!ha->edc_data) {
707 ql_log(ql_log_warn, vha, 0x708c,
708 "Unable to allocate memory for EDC status.\n");
709 return -ENOMEM;
710 }
711 }
712
713 dev = le16_to_cpup((void *)&buf[0]);
714 adr = le16_to_cpup((void *)&buf[2]);
715 opt = le16_to_cpup((void *)&buf[4]);
716 len = le16_to_cpup((void *)&buf[6]);
717
718 if (!(opt & BIT_0))
719 if (len == 0 || len > DMA_POOL_SIZE)
720 return -EINVAL;
721
722 memset(ha->edc_data, 0, len);
723 rval = qla2x00_read_sfp(vha, ha->edc_data_dma, ha->edc_data,
724 dev, adr, len, opt);
725 if (rval != QLA_SUCCESS) {
726 ql_log(ql_log_info, vha, 0x7075,
727 "Unable to write EDC status (%x) %02x:%04x:%02x:%02x.\n",
728 rval, dev, adr, opt, len);
729 return -EIO;
730 }
731
732 ha->edc_data_len = len;
733
734 return count;
735}
736
737static ssize_t
738qla2x00_sysfs_read_edc_status(struct file *filp, struct kobject *kobj,
739 struct bin_attribute *bin_attr,
740 char *buf, loff_t off, size_t count)
741{
742 struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
743 struct device, kobj)));
744 struct qla_hw_data *ha = vha->hw;
745
746 if (!capable(CAP_SYS_ADMIN) || off != 0 || count == 0)
747 return 0;
748
749 if (!ha->edc_data || ha->edc_data_len == 0 || ha->edc_data_len > count)
750 return -EINVAL;
751
752 memcpy(buf, ha->edc_data, ha->edc_data_len);
753
754 return ha->edc_data_len;
755}
756
757static struct bin_attribute sysfs_edc_status_attr = {
758 .attr = {
759 .name = "edc_status",
760 .mode = S_IRUSR | S_IWUSR,
761 },
762 .size = 0,
763 .write = qla2x00_sysfs_write_edc_status,
764 .read = qla2x00_sysfs_read_edc_status,
765};
766
767static ssize_t
768qla2x00_sysfs_read_xgmac_stats(struct file *filp, struct kobject *kobj, 631qla2x00_sysfs_read_xgmac_stats(struct file *filp, struct kobject *kobj,
769 struct bin_attribute *bin_attr, 632 struct bin_attribute *bin_attr,
770 char *buf, loff_t off, size_t count) 633 char *buf, loff_t off, size_t count)
@@ -879,8 +742,6 @@ static struct sysfs_entry {
879 { "vpd", &sysfs_vpd_attr, 1 }, 742 { "vpd", &sysfs_vpd_attr, 1 },
880 { "sfp", &sysfs_sfp_attr, 1 }, 743 { "sfp", &sysfs_sfp_attr, 1 },
881 { "reset", &sysfs_reset_attr, }, 744 { "reset", &sysfs_reset_attr, },
882 { "edc", &sysfs_edc_attr, 2 },
883 { "edc_status", &sysfs_edc_status_attr, 2 },
884 { "xgmac_stats", &sysfs_xgmac_stats_attr, 3 }, 745 { "xgmac_stats", &sysfs_xgmac_stats_attr, 3 },
885 { "dcbx_tlv", &sysfs_dcbx_tlv_attr, 3 }, 746 { "dcbx_tlv", &sysfs_dcbx_tlv_attr, 3 },
886 { NULL }, 747 { NULL },
@@ -898,7 +759,7 @@ qla2x00_alloc_sysfs_attr(scsi_qla_host_t *vha)
898 continue; 759 continue;
899 if (iter->is4GBp_only == 2 && !IS_QLA25XX(vha->hw)) 760 if (iter->is4GBp_only == 2 && !IS_QLA25XX(vha->hw))
900 continue; 761 continue;
901 if (iter->is4GBp_only == 3 && !(IS_QLA8XXX_TYPE(vha->hw))) 762 if (iter->is4GBp_only == 3 && !(IS_CNA_CAPABLE(vha->hw)))
902 continue; 763 continue;
903 764
904 ret = sysfs_create_bin_file(&host->shost_gendev.kobj, 765 ret = sysfs_create_bin_file(&host->shost_gendev.kobj,
@@ -926,7 +787,7 @@ qla2x00_free_sysfs_attr(scsi_qla_host_t *vha)
926 continue; 787 continue;
927 if (iter->is4GBp_only == 2 && !IS_QLA25XX(ha)) 788 if (iter->is4GBp_only == 2 && !IS_QLA25XX(ha))
928 continue; 789 continue;
929 if (iter->is4GBp_only == 3 && !!(IS_QLA8XXX_TYPE(vha->hw))) 790 if (iter->is4GBp_only == 3 && !(IS_CNA_CAPABLE(vha->hw)))
930 continue; 791 continue;
931 792
932 sysfs_remove_bin_file(&host->shost_gendev.kobj, 793 sysfs_remove_bin_file(&host->shost_gendev.kobj,
@@ -1231,7 +1092,7 @@ qla2x00_optrom_gold_fw_version_show(struct device *dev,
1231 scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); 1092 scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1232 struct qla_hw_data *ha = vha->hw; 1093 struct qla_hw_data *ha = vha->hw;
1233 1094
1234 if (!IS_QLA81XX(ha)) 1095 if (!IS_QLA81XX(ha) && !IS_QLA83XX(ha))
1235 return snprintf(buf, PAGE_SIZE, "\n"); 1096 return snprintf(buf, PAGE_SIZE, "\n");
1236 1097
1237 return snprintf(buf, PAGE_SIZE, "%d.%02d.%02d (%d)\n", 1098 return snprintf(buf, PAGE_SIZE, "%d.%02d.%02d (%d)\n",
@@ -1278,7 +1139,7 @@ qla2x00_mpi_version_show(struct device *dev, struct device_attribute *attr,
1278 scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); 1139 scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1279 struct qla_hw_data *ha = vha->hw; 1140 struct qla_hw_data *ha = vha->hw;
1280 1141
1281 if (!IS_QLA81XX(ha)) 1142 if (!IS_QLA81XX(ha) && !IS_QLA8031(ha))
1282 return snprintf(buf, PAGE_SIZE, "\n"); 1143 return snprintf(buf, PAGE_SIZE, "\n");
1283 1144
1284 return snprintf(buf, PAGE_SIZE, "%d.%02d.%02d (%x)\n", 1145 return snprintf(buf, PAGE_SIZE, "%d.%02d.%02d (%x)\n",
@@ -1293,7 +1154,7 @@ qla2x00_phy_version_show(struct device *dev, struct device_attribute *attr,
1293 scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); 1154 scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1294 struct qla_hw_data *ha = vha->hw; 1155 struct qla_hw_data *ha = vha->hw;
1295 1156
1296 if (!IS_QLA81XX(ha)) 1157 if (!IS_QLA81XX(ha) && !IS_QLA83XX(ha))
1297 return snprintf(buf, PAGE_SIZE, "\n"); 1158 return snprintf(buf, PAGE_SIZE, "\n");
1298 1159
1299 return snprintf(buf, PAGE_SIZE, "%d.%02d.%02d\n", 1160 return snprintf(buf, PAGE_SIZE, "%d.%02d.%02d\n",
@@ -1316,7 +1177,7 @@ qla2x00_vlan_id_show(struct device *dev, struct device_attribute *attr,
1316{ 1177{
1317 scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); 1178 scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1318 1179
1319 if (!IS_QLA8XXX_TYPE(vha->hw)) 1180 if (!IS_CNA_CAPABLE(vha->hw))
1320 return snprintf(buf, PAGE_SIZE, "\n"); 1181 return snprintf(buf, PAGE_SIZE, "\n");
1321 1182
1322 return snprintf(buf, PAGE_SIZE, "%d\n", vha->fcoe_vlan_id); 1183 return snprintf(buf, PAGE_SIZE, "%d\n", vha->fcoe_vlan_id);
@@ -1328,7 +1189,7 @@ qla2x00_vn_port_mac_address_show(struct device *dev,
1328{ 1189{
1329 scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); 1190 scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1330 1191
1331 if (!IS_QLA8XXX_TYPE(vha->hw)) 1192 if (!IS_CNA_CAPABLE(vha->hw))
1332 return snprintf(buf, PAGE_SIZE, "\n"); 1193 return snprintf(buf, PAGE_SIZE, "\n");
1333 1194
1334 return snprintf(buf, PAGE_SIZE, "%02x:%02x:%02x:%02x:%02x:%02x\n", 1195 return snprintf(buf, PAGE_SIZE, "%02x:%02x:%02x:%02x:%02x:%02x\n",
@@ -1364,7 +1225,7 @@ qla2x00_thermal_temp_show(struct device *dev,
1364 else if (!vha->hw->flags.eeh_busy) 1225 else if (!vha->hw->flags.eeh_busy)
1365 rval = qla2x00_get_thermal_temp(vha, &temp, &frac); 1226 rval = qla2x00_get_thermal_temp(vha, &temp, &frac);
1366 if (rval != QLA_SUCCESS) 1227 if (rval != QLA_SUCCESS)
1367 temp = frac = 0; 1228 return snprintf(buf, PAGE_SIZE, "\n");
1368 1229
1369 return snprintf(buf, PAGE_SIZE, "%d.%02d\n", temp, frac); 1230 return snprintf(buf, PAGE_SIZE, "%d.%02d\n", temp, frac);
1370} 1231}
@@ -1493,6 +1354,9 @@ qla2x00_get_host_speed(struct Scsi_Host *shost)
1493 case PORT_SPEED_10GB: 1354 case PORT_SPEED_10GB:
1494 speed = FC_PORTSPEED_10GBIT; 1355 speed = FC_PORTSPEED_10GBIT;
1495 break; 1356 break;
1357 case PORT_SPEED_16GB:
1358 speed = FC_PORTSPEED_16GBIT;
1359 break;
1496 } 1360 }
1497 fc_host_speed(shost) = speed; 1361 fc_host_speed(shost) = speed;
1498} 1362}
@@ -1643,10 +1507,14 @@ qla2x00_terminate_rport_io(struct fc_rport *rport)
1643 * final cleanup of firmware resources (PCBs and XCBs). 1507 * final cleanup of firmware resources (PCBs and XCBs).
1644 */ 1508 */
1645 if (fcport->loop_id != FC_NO_LOOP_ID && 1509 if (fcport->loop_id != FC_NO_LOOP_ID &&
1646 !test_bit(UNLOADING, &fcport->vha->dpc_flags)) 1510 !test_bit(UNLOADING, &fcport->vha->dpc_flags)) {
1647 fcport->vha->hw->isp_ops->fabric_logout(fcport->vha, 1511 if (IS_FWI2_CAPABLE(fcport->vha->hw))
1648 fcport->loop_id, fcport->d_id.b.domain, 1512 fcport->vha->hw->isp_ops->fabric_logout(fcport->vha,
1649 fcport->d_id.b.area, fcport->d_id.b.al_pa); 1513 fcport->loop_id, fcport->d_id.b.domain,
1514 fcport->d_id.b.area, fcport->d_id.b.al_pa);
1515 else
1516 qla2x00_port_logout(fcport->vha, fcport);
1517 }
1650} 1518}
1651 1519
1652static int 1520static int
@@ -1889,6 +1757,7 @@ qla24xx_vport_create(struct fc_vport *fc_vport, bool disable)
1889 break; 1757 break;
1890 } 1758 }
1891 } 1759 }
1760
1892 if (qos) { 1761 if (qos) {
1893 ret = qla25xx_create_req_que(ha, options, vha->vp_idx, 0, 0, 1762 ret = qla25xx_create_req_que(ha, options, vha->vp_idx, 0, 0,
1894 qos); 1763 qos);
@@ -2086,7 +1955,7 @@ qla2x00_init_host_attr(scsi_qla_host_t *vha)
2086 fc_host_max_npiv_vports(vha->host) = ha->max_npiv_vports; 1955 fc_host_max_npiv_vports(vha->host) = ha->max_npiv_vports;
2087 fc_host_npiv_vports_inuse(vha->host) = ha->cur_vport_count; 1956 fc_host_npiv_vports_inuse(vha->host) = ha->cur_vport_count;
2088 1957
2089 if (IS_QLA8XXX_TYPE(ha)) 1958 if (IS_CNA_CAPABLE(ha))
2090 speed = FC_PORTSPEED_10GBIT; 1959 speed = FC_PORTSPEED_10GBIT;
2091 else if (IS_QLA25XX(ha)) 1960 else if (IS_QLA25XX(ha))
2092 speed = FC_PORTSPEED_8GBIT | FC_PORTSPEED_4GBIT | 1961 speed = FC_PORTSPEED_8GBIT | FC_PORTSPEED_4GBIT |
diff --git a/drivers/scsi/qla2xxx/qla_bsg.c b/drivers/scsi/qla2xxx/qla_bsg.c
index 2c4714279bcc..f74cc0602f3b 100644
--- a/drivers/scsi/qla2xxx/qla_bsg.c
+++ b/drivers/scsi/qla2xxx/qla_bsg.c
@@ -11,29 +11,36 @@
11#include <linux/delay.h> 11#include <linux/delay.h>
12 12
13/* BSG support for ELS/CT pass through */ 13/* BSG support for ELS/CT pass through */
14inline srb_t * 14void
15qla2x00_get_ctx_bsg_sp(scsi_qla_host_t *vha, fc_port_t *fcport, size_t size) 15qla2x00_bsg_job_done(void *data, void *ptr, int res)
16{ 16{
17 srb_t *sp; 17 srb_t *sp = (srb_t *)ptr;
18 struct scsi_qla_host *vha = (scsi_qla_host_t *)data;
19 struct fc_bsg_job *bsg_job = sp->u.bsg_job;
20
21 bsg_job->reply->result = res;
22 bsg_job->job_done(bsg_job);
23 sp->free(vha, sp);
24}
25
26void
27qla2x00_bsg_sp_free(void *data, void *ptr)
28{
29 srb_t *sp = (srb_t *)ptr;
30 struct scsi_qla_host *vha = (scsi_qla_host_t *)data;
31 struct fc_bsg_job *bsg_job = sp->u.bsg_job;
18 struct qla_hw_data *ha = vha->hw; 32 struct qla_hw_data *ha = vha->hw;
19 struct srb_ctx *ctx;
20 33
21 sp = mempool_alloc(ha->srb_mempool, GFP_KERNEL); 34 dma_unmap_sg(&ha->pdev->dev, bsg_job->request_payload.sg_list,
22 if (!sp) 35 bsg_job->request_payload.sg_cnt, DMA_TO_DEVICE);
23 goto done;
24 ctx = kzalloc(size, GFP_KERNEL);
25 if (!ctx) {
26 mempool_free(sp, ha->srb_mempool);
27 sp = NULL;
28 goto done;
29 }
30 36
31 memset(sp, 0, sizeof(*sp)); 37 dma_unmap_sg(&ha->pdev->dev, bsg_job->reply_payload.sg_list,
32 sp->fcport = fcport; 38 bsg_job->reply_payload.sg_cnt, DMA_FROM_DEVICE);
33 sp->ctx = ctx; 39
34 ctx->iocbs = 1; 40 if (sp->type == SRB_CT_CMD ||
35done: 41 sp->type == SRB_ELS_CMD_HST)
36 return sp; 42 kfree(sp->fcport);
43 mempool_free(sp, vha->hw->srb_mempool);
37} 44}
38 45
39int 46int
@@ -101,8 +108,6 @@ qla24xx_proc_fcp_prio_cfg_cmd(struct fc_bsg_job *bsg_job)
101 uint32_t len; 108 uint32_t len;
102 uint32_t oper; 109 uint32_t oper;
103 110
104 bsg_job->reply->reply_payload_rcv_len = 0;
105
106 if (!(IS_QLA24XX_TYPE(ha) || IS_QLA25XX(ha) || IS_QLA82XX(ha))) { 111 if (!(IS_QLA24XX_TYPE(ha) || IS_QLA25XX(ha) || IS_QLA82XX(ha))) {
107 ret = -EINVAL; 112 ret = -EINVAL;
108 goto exit_fcp_prio_cfg; 113 goto exit_fcp_prio_cfg;
@@ -217,6 +222,7 @@ exit_fcp_prio_cfg:
217 bsg_job->job_done(bsg_job); 222 bsg_job->job_done(bsg_job);
218 return ret; 223 return ret;
219} 224}
225
220static int 226static int
221qla2x00_process_els(struct fc_bsg_job *bsg_job) 227qla2x00_process_els(struct fc_bsg_job *bsg_job)
222{ 228{
@@ -230,7 +236,6 @@ qla2x00_process_els(struct fc_bsg_job *bsg_job)
230 int req_sg_cnt, rsp_sg_cnt; 236 int req_sg_cnt, rsp_sg_cnt;
231 int rval = (DRIVER_ERROR << 16); 237 int rval = (DRIVER_ERROR << 16);
232 uint16_t nextlid = 0; 238 uint16_t nextlid = 0;
233 struct srb_ctx *els;
234 239
235 if (bsg_job->request->msgcode == FC_BSG_RPT_ELS) { 240 if (bsg_job->request->msgcode == FC_BSG_RPT_ELS) {
236 rport = bsg_job->rport; 241 rport = bsg_job->rport;
@@ -337,20 +342,21 @@ qla2x00_process_els(struct fc_bsg_job *bsg_job)
337 } 342 }
338 343
339 /* Alloc SRB structure */ 344 /* Alloc SRB structure */
340 sp = qla2x00_get_ctx_bsg_sp(vha, fcport, sizeof(struct srb_ctx)); 345 sp = qla2x00_get_sp(vha, fcport, GFP_KERNEL);
341 if (!sp) { 346 if (!sp) {
342 rval = -ENOMEM; 347 rval = -ENOMEM;
343 goto done_unmap_sg; 348 goto done_unmap_sg;
344 } 349 }
345 350
346 els = sp->ctx; 351 sp->type =
347 els->type =
348 (bsg_job->request->msgcode == FC_BSG_RPT_ELS ? 352 (bsg_job->request->msgcode == FC_BSG_RPT_ELS ?
349 SRB_ELS_CMD_RPT : SRB_ELS_CMD_HST); 353 SRB_ELS_CMD_RPT : SRB_ELS_CMD_HST);
350 els->name = 354 sp->name =
351 (bsg_job->request->msgcode == FC_BSG_RPT_ELS ? 355 (bsg_job->request->msgcode == FC_BSG_RPT_ELS ?
352 "bsg_els_rpt" : "bsg_els_hst"); 356 "bsg_els_rpt" : "bsg_els_hst");
353 els->u.bsg_job = bsg_job; 357 sp->u.bsg_job = bsg_job;
358 sp->free = qla2x00_bsg_sp_free;
359 sp->done = qla2x00_bsg_job_done;
354 360
355 ql_dbg(ql_dbg_user, vha, 0x700a, 361 ql_dbg(ql_dbg_user, vha, 0x700a,
356 "bsg rqst type: %s els type: %x - loop-id=%x " 362 "bsg rqst type: %s els type: %x - loop-id=%x "
@@ -362,7 +368,6 @@ qla2x00_process_els(struct fc_bsg_job *bsg_job)
362 if (rval != QLA_SUCCESS) { 368 if (rval != QLA_SUCCESS) {
363 ql_log(ql_log_warn, vha, 0x700e, 369 ql_log(ql_log_warn, vha, 0x700e,
364 "qla2x00_start_sp failed = %d\n", rval); 370 "qla2x00_start_sp failed = %d\n", rval);
365 kfree(sp->ctx);
366 mempool_free(sp, ha->srb_mempool); 371 mempool_free(sp, ha->srb_mempool);
367 rval = -EIO; 372 rval = -EIO;
368 goto done_unmap_sg; 373 goto done_unmap_sg;
@@ -409,7 +414,6 @@ qla2x00_process_ct(struct fc_bsg_job *bsg_job)
409 uint16_t loop_id; 414 uint16_t loop_id;
410 struct fc_port *fcport; 415 struct fc_port *fcport;
411 char *type = "FC_BSG_HST_CT"; 416 char *type = "FC_BSG_HST_CT";
412 struct srb_ctx *ct;
413 417
414 req_sg_cnt = 418 req_sg_cnt =
415 dma_map_sg(&ha->pdev->dev, bsg_job->request_payload.sg_list, 419 dma_map_sg(&ha->pdev->dev, bsg_job->request_payload.sg_list,
@@ -486,19 +490,20 @@ qla2x00_process_ct(struct fc_bsg_job *bsg_job)
486 fcport->loop_id = loop_id; 490 fcport->loop_id = loop_id;
487 491
488 /* Alloc SRB structure */ 492 /* Alloc SRB structure */
489 sp = qla2x00_get_ctx_bsg_sp(vha, fcport, sizeof(struct srb_ctx)); 493 sp = qla2x00_get_sp(vha, fcport, GFP_KERNEL);
490 if (!sp) { 494 if (!sp) {
491 ql_log(ql_log_warn, vha, 0x7015, 495 ql_log(ql_log_warn, vha, 0x7015,
492 "qla2x00_get_ctx_bsg_sp failed.\n"); 496 "qla2x00_get_sp failed.\n");
493 rval = -ENOMEM; 497 rval = -ENOMEM;
494 goto done_free_fcport; 498 goto done_free_fcport;
495 } 499 }
496 500
497 ct = sp->ctx; 501 sp->type = SRB_CT_CMD;
498 ct->type = SRB_CT_CMD; 502 sp->name = "bsg_ct";
499 ct->name = "bsg_ct"; 503 sp->iocbs = qla24xx_calc_ct_iocbs(req_sg_cnt + rsp_sg_cnt);
500 ct->iocbs = qla24xx_calc_ct_iocbs(req_sg_cnt + rsp_sg_cnt); 504 sp->u.bsg_job = bsg_job;
501 ct->u.bsg_job = bsg_job; 505 sp->free = qla2x00_bsg_sp_free;
506 sp->done = qla2x00_bsg_job_done;
502 507
503 ql_dbg(ql_dbg_user, vha, 0x7016, 508 ql_dbg(ql_dbg_user, vha, 0x7016,
504 "bsg rqst type: %s else type: %x - " 509 "bsg rqst type: %s else type: %x - "
@@ -511,7 +516,6 @@ qla2x00_process_ct(struct fc_bsg_job *bsg_job)
511 if (rval != QLA_SUCCESS) { 516 if (rval != QLA_SUCCESS) {
512 ql_log(ql_log_warn, vha, 0x7017, 517 ql_log(ql_log_warn, vha, 0x7017,
513 "qla2x00_start_sp failed=%d.\n", rval); 518 "qla2x00_start_sp failed=%d.\n", rval);
514 kfree(sp->ctx);
515 mempool_free(sp, ha->srb_mempool); 519 mempool_free(sp, ha->srb_mempool);
516 rval = -EIO; 520 rval = -EIO;
517 goto done_free_fcport; 521 goto done_free_fcport;
@@ -540,7 +544,7 @@ qla81xx_set_internal_loopback(scsi_qla_host_t *vha, uint16_t *config,
540 int rval = 0; 544 int rval = 0;
541 struct qla_hw_data *ha = vha->hw; 545 struct qla_hw_data *ha = vha->hw;
542 546
543 if (!IS_QLA81XX(ha)) 547 if (!IS_QLA81XX(ha) && !IS_QLA83XX(ha))
544 goto done_set_internal; 548 goto done_set_internal;
545 549
546 new_config[0] = config[0] | (ENABLE_INTERNAL_LOOPBACK << 1); 550 new_config[0] = config[0] | (ENABLE_INTERNAL_LOOPBACK << 1);
@@ -582,7 +586,7 @@ qla81xx_reset_internal_loopback(scsi_qla_host_t *vha, uint16_t *config,
582 uint16_t new_config[4]; 586 uint16_t new_config[4];
583 struct qla_hw_data *ha = vha->hw; 587 struct qla_hw_data *ha = vha->hw;
584 588
585 if (!IS_QLA81XX(ha)) 589 if (!IS_QLA81XX(ha) && !IS_QLA83XX(ha))
586 goto done_reset_internal; 590 goto done_reset_internal;
587 591
588 memset(new_config, 0 , sizeof(new_config)); 592 memset(new_config, 0 , sizeof(new_config));
@@ -707,7 +711,7 @@ qla2x00_process_loopback(struct fc_bsg_job *bsg_job)
707 711
708 if ((ha->current_topology == ISP_CFG_F || 712 if ((ha->current_topology == ISP_CFG_F ||
709 (atomic_read(&vha->loop_state) == LOOP_DOWN) || 713 (atomic_read(&vha->loop_state) == LOOP_DOWN) ||
710 (IS_QLA81XX(ha) && 714 ((IS_QLA81XX(ha) || IS_QLA83XX(ha)) &&
711 le32_to_cpu(*(uint32_t *)req_data) == ELS_OPCODE_BYTE 715 le32_to_cpu(*(uint32_t *)req_data) == ELS_OPCODE_BYTE
712 && req_data_len == MAX_ELS_FRAME_PAYLOAD)) && 716 && req_data_len == MAX_ELS_FRAME_PAYLOAD)) &&
713 elreq.options == EXTERNAL_LOOPBACK) { 717 elreq.options == EXTERNAL_LOOPBACK) {
@@ -717,13 +721,12 @@ qla2x00_process_loopback(struct fc_bsg_job *bsg_job)
717 command_sent = INT_DEF_LB_ECHO_CMD; 721 command_sent = INT_DEF_LB_ECHO_CMD;
718 rval = qla2x00_echo_test(vha, &elreq, response); 722 rval = qla2x00_echo_test(vha, &elreq, response);
719 } else { 723 } else {
720 if (IS_QLA81XX(ha)) { 724 if (IS_QLA81XX(ha) || IS_QLA8031(ha)) {
721 memset(config, 0, sizeof(config)); 725 memset(config, 0, sizeof(config));
722 memset(new_config, 0, sizeof(new_config)); 726 memset(new_config, 0, sizeof(new_config));
723 if (qla81xx_get_port_config(vha, config)) { 727 if (qla81xx_get_port_config(vha, config)) {
724 ql_log(ql_log_warn, vha, 0x701f, 728 ql_log(ql_log_warn, vha, 0x701f,
725 "Get port config failed.\n"); 729 "Get port config failed.\n");
726 bsg_job->reply->reply_payload_rcv_len = 0;
727 bsg_job->reply->result = (DID_ERROR << 16); 730 bsg_job->reply->result = (DID_ERROR << 16);
728 rval = -EPERM; 731 rval = -EPERM;
729 goto done_free_dma_req; 732 goto done_free_dma_req;
@@ -737,8 +740,6 @@ qla2x00_process_loopback(struct fc_bsg_job *bsg_job)
737 new_config)) { 740 new_config)) {
738 ql_log(ql_log_warn, vha, 0x7024, 741 ql_log(ql_log_warn, vha, 0x7024,
739 "Internal loopback failed.\n"); 742 "Internal loopback failed.\n");
740 bsg_job->reply->reply_payload_rcv_len =
741 0;
742 bsg_job->reply->result = 743 bsg_job->reply->result =
743 (DID_ERROR << 16); 744 (DID_ERROR << 16);
744 rval = -EPERM; 745 rval = -EPERM;
@@ -750,8 +751,6 @@ qla2x00_process_loopback(struct fc_bsg_job *bsg_job)
750 */ 751 */
751 if (qla81xx_reset_internal_loopback(vha, 752 if (qla81xx_reset_internal_loopback(vha,
752 config, 1)) { 753 config, 1)) {
753 bsg_job->reply->reply_payload_rcv_len =
754 0;
755 bsg_job->reply->result = 754 bsg_job->reply->result =
756 (DID_ERROR << 16); 755 (DID_ERROR << 16);
757 rval = -EPERM; 756 rval = -EPERM;
@@ -788,7 +787,6 @@ qla2x00_process_loopback(struct fc_bsg_job *bsg_job)
788 "MPI reset failed.\n"); 787 "MPI reset failed.\n");
789 } 788 }
790 789
791 bsg_job->reply->reply_payload_rcv_len = 0;
792 bsg_job->reply->result = (DID_ERROR << 16); 790 bsg_job->reply->result = (DID_ERROR << 16);
793 rval = -EIO; 791 rval = -EIO;
794 goto done_free_dma_req; 792 goto done_free_dma_req;
@@ -813,7 +811,6 @@ qla2x00_process_loopback(struct fc_bsg_job *bsg_job)
813 fw_sts_ptr += sizeof(response); 811 fw_sts_ptr += sizeof(response);
814 *fw_sts_ptr = command_sent; 812 *fw_sts_ptr = command_sent;
815 rval = 0; 813 rval = 0;
816 bsg_job->reply->reply_payload_rcv_len = 0;
817 bsg_job->reply->result = (DID_ERROR << 16); 814 bsg_job->reply->result = (DID_ERROR << 16);
818 } else { 815 } else {
819 ql_dbg(ql_dbg_user, vha, 0x702d, 816 ql_dbg(ql_dbg_user, vha, 0x702d,
@@ -872,7 +869,7 @@ qla84xx_reset(struct fc_bsg_job *bsg_job)
872 if (rval) { 869 if (rval) {
873 ql_log(ql_log_warn, vha, 0x7030, 870 ql_log(ql_log_warn, vha, 0x7030,
874 "Vendor request 84xx reset failed.\n"); 871 "Vendor request 84xx reset failed.\n");
875 rval = bsg_job->reply->reply_payload_rcv_len = 0; 872 rval = 0;
876 bsg_job->reply->result = (DID_ERROR << 16); 873 bsg_job->reply->result = (DID_ERROR << 16);
877 874
878 } else { 875 } else {
@@ -971,9 +968,8 @@ qla84xx_updatefw(struct fc_bsg_job *bsg_job)
971 ql_log(ql_log_warn, vha, 0x7037, 968 ql_log(ql_log_warn, vha, 0x7037,
972 "Vendor request 84xx updatefw failed.\n"); 969 "Vendor request 84xx updatefw failed.\n");
973 970
974 rval = bsg_job->reply->reply_payload_rcv_len = 0; 971 rval = 0;
975 bsg_job->reply->result = (DID_ERROR << 16); 972 bsg_job->reply->result = (DID_ERROR << 16);
976
977 } else { 973 } else {
978 ql_dbg(ql_dbg_user, vha, 0x7038, 974 ql_dbg(ql_dbg_user, vha, 0x7038,
979 "Vendor request 84xx updatefw completed.\n"); 975 "Vendor request 84xx updatefw completed.\n");
@@ -1159,7 +1155,7 @@ qla84xx_mgmt_cmd(struct fc_bsg_job *bsg_job)
1159 ql_log(ql_log_warn, vha, 0x7043, 1155 ql_log(ql_log_warn, vha, 0x7043,
1160 "Vendor request 84xx mgmt failed.\n"); 1156 "Vendor request 84xx mgmt failed.\n");
1161 1157
1162 rval = bsg_job->reply->reply_payload_rcv_len = 0; 1158 rval = 0;
1163 bsg_job->reply->result = (DID_ERROR << 16); 1159 bsg_job->reply->result = (DID_ERROR << 16);
1164 1160
1165 } else { 1161 } else {
@@ -1210,8 +1206,6 @@ qla24xx_iidma(struct fc_bsg_job *bsg_job)
1210 uint16_t mb[MAILBOX_REGISTER_COUNT]; 1206 uint16_t mb[MAILBOX_REGISTER_COUNT];
1211 uint8_t *rsp_ptr = NULL; 1207 uint8_t *rsp_ptr = NULL;
1212 1208
1213 bsg_job->reply->reply_payload_rcv_len = 0;
1214
1215 if (!IS_IIDMA_CAPABLE(vha->hw)) { 1209 if (!IS_IIDMA_CAPABLE(vha->hw)) {
1216 ql_log(ql_log_info, vha, 0x7046, "iiDMA not supported.\n"); 1210 ql_log(ql_log_info, vha, 0x7046, "iiDMA not supported.\n");
1217 return -EINVAL; 1211 return -EINVAL;
@@ -1304,8 +1298,6 @@ qla2x00_optrom_setup(struct fc_bsg_job *bsg_job, scsi_qla_host_t *vha,
1304 int valid = 0; 1298 int valid = 0;
1305 struct qla_hw_data *ha = vha->hw; 1299 struct qla_hw_data *ha = vha->hw;
1306 1300
1307 bsg_job->reply->reply_payload_rcv_len = 0;
1308
1309 if (unlikely(pci_channel_offline(ha->pdev))) 1301 if (unlikely(pci_channel_offline(ha->pdev)))
1310 return -EINVAL; 1302 return -EINVAL;
1311 1303
@@ -1331,7 +1323,7 @@ qla2x00_optrom_setup(struct fc_bsg_job *bsg_job, scsi_qla_host_t *vha,
1331 start == (ha->flt_region_fw * 4)) 1323 start == (ha->flt_region_fw * 4))
1332 valid = 1; 1324 valid = 1;
1333 else if (IS_QLA24XX_TYPE(ha) || IS_QLA25XX(ha) || 1325 else if (IS_QLA24XX_TYPE(ha) || IS_QLA25XX(ha) ||
1334 IS_QLA8XXX_TYPE(ha)) 1326 IS_CNA_CAPABLE(ha) || IS_QLA2031(ha))
1335 valid = 1; 1327 valid = 1;
1336 if (!valid) { 1328 if (!valid) {
1337 ql_log(ql_log_warn, vha, 0x7058, 1329 ql_log(ql_log_warn, vha, 0x7058,
@@ -1617,6 +1609,9 @@ qla24xx_bsg_request(struct fc_bsg_job *bsg_job)
1617 struct Scsi_Host *host; 1609 struct Scsi_Host *host;
1618 scsi_qla_host_t *vha; 1610 scsi_qla_host_t *vha;
1619 1611
1612 /* In case no data transferred. */
1613 bsg_job->reply->reply_payload_rcv_len = 0;
1614
1620 if (bsg_job->request->msgcode == FC_BSG_RPT_ELS) { 1615 if (bsg_job->request->msgcode == FC_BSG_RPT_ELS) {
1621 rport = bsg_job->rport; 1616 rport = bsg_job->rport;
1622 fcport = *(fc_port_t **) rport->dd_data; 1617 fcport = *(fc_port_t **) rport->dd_data;
@@ -1655,6 +1650,7 @@ qla24xx_bsg_request(struct fc_bsg_job *bsg_job)
1655 case FC_BSG_RPT_CT: 1650 case FC_BSG_RPT_CT:
1656 default: 1651 default:
1657 ql_log(ql_log_warn, vha, 0x705a, "Unsupported BSG request.\n"); 1652 ql_log(ql_log_warn, vha, 0x705a, "Unsupported BSG request.\n");
1653 bsg_job->reply->result = ret;
1658 break; 1654 break;
1659 } 1655 }
1660 return ret; 1656 return ret;
@@ -1669,7 +1665,6 @@ qla24xx_bsg_timeout(struct fc_bsg_job *bsg_job)
1669 int cnt, que; 1665 int cnt, que;
1670 unsigned long flags; 1666 unsigned long flags;
1671 struct req_que *req; 1667 struct req_que *req;
1672 struct srb_ctx *sp_bsg;
1673 1668
1674 /* find the bsg job from the active list of commands */ 1669 /* find the bsg job from the active list of commands */
1675 spin_lock_irqsave(&ha->hardware_lock, flags); 1670 spin_lock_irqsave(&ha->hardware_lock, flags);
@@ -1681,11 +1676,9 @@ qla24xx_bsg_timeout(struct fc_bsg_job *bsg_job)
1681 for (cnt = 1; cnt < MAX_OUTSTANDING_COMMANDS; cnt++) { 1676 for (cnt = 1; cnt < MAX_OUTSTANDING_COMMANDS; cnt++) {
1682 sp = req->outstanding_cmds[cnt]; 1677 sp = req->outstanding_cmds[cnt];
1683 if (sp) { 1678 if (sp) {
1684 sp_bsg = sp->ctx; 1679 if (((sp->type == SRB_CT_CMD) ||
1685 1680 (sp->type == SRB_ELS_CMD_HST))
1686 if (((sp_bsg->type == SRB_CT_CMD) || 1681 && (sp->u.bsg_job == bsg_job)) {
1687 (sp_bsg->type == SRB_ELS_CMD_HST))
1688 && (sp_bsg->u.bsg_job == bsg_job)) {
1689 spin_unlock_irqrestore(&ha->hardware_lock, flags); 1682 spin_unlock_irqrestore(&ha->hardware_lock, flags);
1690 if (ha->isp_ops->abort_command(sp)) { 1683 if (ha->isp_ops->abort_command(sp)) {
1691 ql_log(ql_log_warn, vha, 0x7089, 1684 ql_log(ql_log_warn, vha, 0x7089,
@@ -1715,7 +1708,6 @@ done:
1715 spin_unlock_irqrestore(&ha->hardware_lock, flags); 1708 spin_unlock_irqrestore(&ha->hardware_lock, flags);
1716 if (bsg_job->request->msgcode == FC_BSG_HST_CT) 1709 if (bsg_job->request->msgcode == FC_BSG_HST_CT)
1717 kfree(sp->fcport); 1710 kfree(sp->fcport);
1718 kfree(sp->ctx);
1719 mempool_free(sp, ha->srb_mempool); 1711 mempool_free(sp, ha->srb_mempool);
1720 return 0; 1712 return 0;
1721} 1713}
diff --git a/drivers/scsi/qla2xxx/qla_dbg.c b/drivers/scsi/qla2xxx/qla_dbg.c
index 45cbf0ba624d..897731b93df2 100644
--- a/drivers/scsi/qla2xxx/qla_dbg.c
+++ b/drivers/scsi/qla2xxx/qla_dbg.c
@@ -11,23 +11,27 @@
11 * ---------------------------------------------------------------------- 11 * ----------------------------------------------------------------------
12 * | Level | Last Value Used | Holes | 12 * | Level | Last Value Used | Holes |
13 * ---------------------------------------------------------------------- 13 * ----------------------------------------------------------------------
14 * | Module Init and Probe | 0x0116 | 0xfa | 14 * | Module Init and Probe | 0x0120 | 0x4b,0xba,0xfa |
15 * | Mailbox commands | 0x112b | | 15 * | Mailbox commands | 0x113e | 0x112c-0x112e |
16 * | Device Discovery | 0x2084 | | 16 * | | | 0x113a |
17 * | Queue Command and IO tracing | 0x302f | 0x3008,0x302d, | 17 * | Device Discovery | 0x2086 | 0x2020-0x2022 |
18 * | | | 0x302e | 18 * | Queue Command and IO tracing | 0x302f | 0x3006,0x3008 |
19 * | | | 0x302d-0x302e |
19 * | DPC Thread | 0x401c | | 20 * | DPC Thread | 0x401c | |
20 * | Async Events | 0x5057 | 0x5052 | 21 * | Async Events | 0x505d | 0x502b-0x502f |
21 * | Timer Routines | 0x6011 | 0x600e,0x600f | 22 * | | | 0x5047,0x5052 |
22 * | User Space Interactions | 0x709e | 0x7018,0x702e | 23 * | Timer Routines | 0x6011 | 0x600e-0x600f |
23 * | | | 0x7039,0x7045 | 24 * | User Space Interactions | 0x709f | 0x7018,0x702e, |
25 * | | | 0x7039,0x7045, |
26 * | | | 0x7073-0x7075, |
27 * | | | 0x708c |
24 * | Task Management | 0x803c | 0x8025-0x8026 | 28 * | Task Management | 0x803c | 0x8025-0x8026 |
25 * | | | 0x800b,0x8039 | 29 * | | | 0x800b,0x8039 |
26 * | AER/EEH | 0x900f | | 30 * | AER/EEH | 0x900f | |
27 * | Virtual Port | 0xa007 | | 31 * | Virtual Port | 0xa007 | |
28 * | ISP82XX Specific | 0xb052 | | 32 * | ISP82XX Specific | 0xb054 | 0xb053 |
29 * | MultiQ | 0xc00b | | 33 * | MultiQ | 0xc00c | |
30 * | Misc | 0xd00b | | 34 * | Misc | 0xd010 | |
31 * ---------------------------------------------------------------------- 35 * ----------------------------------------------------------------------
32 */ 36 */
33 37
@@ -85,7 +89,7 @@ qla24xx_dump_ram(struct qla_hw_data *ha, uint32_t addr, uint32_t *ram,
85 WRT_REG_WORD(&reg->mailbox0, MBC_DUMP_RISC_RAM_EXTENDED); 89 WRT_REG_WORD(&reg->mailbox0, MBC_DUMP_RISC_RAM_EXTENDED);
86 clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); 90 clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
87 91
88 dwords = GID_LIST_SIZE / 4; 92 dwords = qla2x00_gid_list_size(ha) / 4;
89 for (cnt = 0; cnt < ram_dwords && rval == QLA_SUCCESS; 93 for (cnt = 0; cnt < ram_dwords && rval == QLA_SUCCESS;
90 cnt += dwords, addr += dwords) { 94 cnt += dwords, addr += dwords) {
91 if (cnt + dwords > ram_dwords) 95 if (cnt + dwords > ram_dwords)
@@ -260,7 +264,7 @@ qla2xxx_dump_ram(struct qla_hw_data *ha, uint32_t addr, uint16_t *ram,
260 WRT_MAILBOX_REG(ha, reg, 0, MBC_DUMP_RISC_RAM_EXTENDED); 264 WRT_MAILBOX_REG(ha, reg, 0, MBC_DUMP_RISC_RAM_EXTENDED);
261 clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); 265 clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
262 266
263 words = GID_LIST_SIZE / 2; 267 words = qla2x00_gid_list_size(ha) / 2;
264 for (cnt = 0; cnt < ram_words && rval == QLA_SUCCESS; 268 for (cnt = 0; cnt < ram_words && rval == QLA_SUCCESS;
265 cnt += words, addr += words) { 269 cnt += words, addr += words) {
266 if (cnt + words > ram_words) 270 if (cnt + words > ram_words)
@@ -375,6 +379,77 @@ qla25xx_copy_fce(struct qla_hw_data *ha, void *ptr, uint32_t **last_chain)
375} 379}
376 380
377static inline void * 381static inline void *
382qla25xx_copy_mqueues(struct qla_hw_data *ha, void *ptr, uint32_t **last_chain)
383{
384 struct qla2xxx_mqueue_chain *q;
385 struct qla2xxx_mqueue_header *qh;
386 struct req_que *req;
387 struct rsp_que *rsp;
388 int que;
389
390 if (!ha->mqenable)
391 return ptr;
392
393 /* Request queues */
394 for (que = 1; que < ha->max_req_queues; que++) {
395 req = ha->req_q_map[que];
396 if (!req)
397 break;
398
399 /* Add chain. */
400 q = ptr;
401 *last_chain = &q->type;
402 q->type = __constant_htonl(DUMP_CHAIN_QUEUE);
403 q->chain_size = htonl(
404 sizeof(struct qla2xxx_mqueue_chain) +
405 sizeof(struct qla2xxx_mqueue_header) +
406 (req->length * sizeof(request_t)));
407 ptr += sizeof(struct qla2xxx_mqueue_chain);
408
409 /* Add header. */
410 qh = ptr;
411 qh->queue = __constant_htonl(TYPE_REQUEST_QUEUE);
412 qh->number = htonl(que);
413 qh->size = htonl(req->length * sizeof(request_t));
414 ptr += sizeof(struct qla2xxx_mqueue_header);
415
416 /* Add data. */
417 memcpy(ptr, req->ring, req->length * sizeof(request_t));
418 ptr += req->length * sizeof(request_t);
419 }
420
421 /* Response queues */
422 for (que = 1; que < ha->max_rsp_queues; que++) {
423 rsp = ha->rsp_q_map[que];
424 if (!rsp)
425 break;
426
427 /* Add chain. */
428 q = ptr;
429 *last_chain = &q->type;
430 q->type = __constant_htonl(DUMP_CHAIN_QUEUE);
431 q->chain_size = htonl(
432 sizeof(struct qla2xxx_mqueue_chain) +
433 sizeof(struct qla2xxx_mqueue_header) +
434 (rsp->length * sizeof(response_t)));
435 ptr += sizeof(struct qla2xxx_mqueue_chain);
436
437 /* Add header. */
438 qh = ptr;
439 qh->queue = __constant_htonl(TYPE_RESPONSE_QUEUE);
440 qh->number = htonl(que);
441 qh->size = htonl(rsp->length * sizeof(response_t));
442 ptr += sizeof(struct qla2xxx_mqueue_header);
443
444 /* Add data. */
445 memcpy(ptr, rsp->ring, rsp->length * sizeof(response_t));
446 ptr += rsp->length * sizeof(response_t);
447 }
448
449 return ptr;
450}
451
452static inline void *
378qla25xx_copy_mq(struct qla_hw_data *ha, void *ptr, uint32_t **last_chain) 453qla25xx_copy_mq(struct qla_hw_data *ha, void *ptr, uint32_t **last_chain)
379{ 454{
380 uint32_t cnt, que_idx; 455 uint32_t cnt, que_idx;
@@ -382,7 +457,7 @@ qla25xx_copy_mq(struct qla_hw_data *ha, void *ptr, uint32_t **last_chain)
382 struct qla2xxx_mq_chain *mq = ptr; 457 struct qla2xxx_mq_chain *mq = ptr;
383 struct device_reg_25xxmq __iomem *reg; 458 struct device_reg_25xxmq __iomem *reg;
384 459
385 if (!ha->mqenable) 460 if (!ha->mqenable || IS_QLA83XX(ha))
386 return ptr; 461 return ptr;
387 462
388 mq = ptr; 463 mq = ptr;
@@ -1322,12 +1397,16 @@ qla25xx_fw_dump(scsi_qla_host_t *vha, int hardware_locked)
1322 nxt = qla24xx_copy_eft(ha, nxt); 1397 nxt = qla24xx_copy_eft(ha, nxt);
1323 1398
1324 /* Chain entries -- started with MQ. */ 1399 /* Chain entries -- started with MQ. */
1325 qla25xx_copy_fce(ha, nxt_chain, &last_chain); 1400 nxt_chain = qla25xx_copy_fce(ha, nxt_chain, &last_chain);
1401 nxt_chain = qla25xx_copy_mqueues(ha, nxt_chain, &last_chain);
1326 if (last_chain) { 1402 if (last_chain) {
1327 ha->fw_dump->version |= __constant_htonl(DUMP_CHAIN_VARIANT); 1403 ha->fw_dump->version |= __constant_htonl(DUMP_CHAIN_VARIANT);
1328 *last_chain |= __constant_htonl(DUMP_CHAIN_LAST); 1404 *last_chain |= __constant_htonl(DUMP_CHAIN_LAST);
1329 } 1405 }
1330 1406
1407 /* Adjust valid length. */
1408 ha->fw_dump_len = (nxt_chain - (void *)ha->fw_dump);
1409
1331qla25xx_fw_dump_failed_0: 1410qla25xx_fw_dump_failed_0:
1332 qla2xxx_dump_post_process(base_vha, rval); 1411 qla2xxx_dump_post_process(base_vha, rval);
1333 1412
@@ -1636,12 +1715,16 @@ qla81xx_fw_dump(scsi_qla_host_t *vha, int hardware_locked)
1636 nxt = qla24xx_copy_eft(ha, nxt); 1715 nxt = qla24xx_copy_eft(ha, nxt);
1637 1716
1638 /* Chain entries -- started with MQ. */ 1717 /* Chain entries -- started with MQ. */
1639 qla25xx_copy_fce(ha, nxt_chain, &last_chain); 1718 nxt_chain = qla25xx_copy_fce(ha, nxt_chain, &last_chain);
1719 nxt_chain = qla25xx_copy_mqueues(ha, nxt_chain, &last_chain);
1640 if (last_chain) { 1720 if (last_chain) {
1641 ha->fw_dump->version |= __constant_htonl(DUMP_CHAIN_VARIANT); 1721 ha->fw_dump->version |= __constant_htonl(DUMP_CHAIN_VARIANT);
1642 *last_chain |= __constant_htonl(DUMP_CHAIN_LAST); 1722 *last_chain |= __constant_htonl(DUMP_CHAIN_LAST);
1643 } 1723 }
1644 1724
1725 /* Adjust valid length. */
1726 ha->fw_dump_len = (nxt_chain - (void *)ha->fw_dump);
1727
1645qla81xx_fw_dump_failed_0: 1728qla81xx_fw_dump_failed_0:
1646 qla2xxx_dump_post_process(base_vha, rval); 1729 qla2xxx_dump_post_process(base_vha, rval);
1647 1730
@@ -1650,6 +1733,507 @@ qla81xx_fw_dump_failed:
1650 spin_unlock_irqrestore(&ha->hardware_lock, flags); 1733 spin_unlock_irqrestore(&ha->hardware_lock, flags);
1651} 1734}
1652 1735
1736void
1737qla83xx_fw_dump(scsi_qla_host_t *vha, int hardware_locked)
1738{
1739 int rval;
1740 uint32_t cnt, reg_data;
1741 uint32_t risc_address;
1742 struct qla_hw_data *ha = vha->hw;
1743 struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
1744 uint32_t __iomem *dmp_reg;
1745 uint32_t *iter_reg;
1746 uint16_t __iomem *mbx_reg;
1747 unsigned long flags;
1748 struct qla83xx_fw_dump *fw;
1749 uint32_t ext_mem_cnt;
1750 void *nxt, *nxt_chain;
1751 uint32_t *last_chain = NULL;
1752 struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev);
1753
1754 risc_address = ext_mem_cnt = 0;
1755 flags = 0;
1756
1757 if (!hardware_locked)
1758 spin_lock_irqsave(&ha->hardware_lock, flags);
1759
1760 if (!ha->fw_dump) {
1761 ql_log(ql_log_warn, vha, 0xd00c,
1762 "No buffer available for dump!!!\n");
1763 goto qla83xx_fw_dump_failed;
1764 }
1765
1766 if (ha->fw_dumped) {
1767 ql_log(ql_log_warn, vha, 0xd00d,
1768 "Firmware has been previously dumped (%p) -- ignoring "
1769 "request...\n", ha->fw_dump);
1770 goto qla83xx_fw_dump_failed;
1771 }
1772 fw = &ha->fw_dump->isp.isp83;
1773 qla2xxx_prep_dump(ha, ha->fw_dump);
1774
1775 fw->host_status = htonl(RD_REG_DWORD(&reg->host_status));
1776
1777 /* Pause RISC. */
1778 rval = qla24xx_pause_risc(reg);
1779 if (rval != QLA_SUCCESS)
1780 goto qla83xx_fw_dump_failed_0;
1781
1782 WRT_REG_DWORD(&reg->iobase_addr, 0x6000);
1783 dmp_reg = &reg->iobase_window;
1784 reg_data = RD_REG_DWORD(dmp_reg);
1785 WRT_REG_DWORD(dmp_reg, 0);
1786
1787 dmp_reg = &reg->unused_4_1[0];
1788 reg_data = RD_REG_DWORD(dmp_reg);
1789 WRT_REG_DWORD(dmp_reg, 0);
1790
1791 WRT_REG_DWORD(&reg->iobase_addr, 0x6010);
1792 dmp_reg = &reg->unused_4_1[2];
1793 reg_data = RD_REG_DWORD(dmp_reg);
1794 WRT_REG_DWORD(dmp_reg, 0);
1795
1796 /* select PCR and disable ecc checking and correction */
1797 WRT_REG_DWORD(&reg->iobase_addr, 0x0F70);
1798 RD_REG_DWORD(&reg->iobase_addr);
1799 WRT_REG_DWORD(&reg->iobase_select, 0x60000000); /* write to F0h = PCR */
1800
1801 /* Host/Risc registers. */
1802 iter_reg = fw->host_risc_reg;
1803 iter_reg = qla24xx_read_window(reg, 0x7000, 16, iter_reg);
1804 iter_reg = qla24xx_read_window(reg, 0x7010, 16, iter_reg);
1805 qla24xx_read_window(reg, 0x7040, 16, iter_reg);
1806
1807 /* PCIe registers. */
1808 WRT_REG_DWORD(&reg->iobase_addr, 0x7C00);
1809 RD_REG_DWORD(&reg->iobase_addr);
1810 WRT_REG_DWORD(&reg->iobase_window, 0x01);
1811 dmp_reg = &reg->iobase_c4;
1812 fw->pcie_regs[0] = htonl(RD_REG_DWORD(dmp_reg++));
1813 fw->pcie_regs[1] = htonl(RD_REG_DWORD(dmp_reg++));
1814 fw->pcie_regs[2] = htonl(RD_REG_DWORD(dmp_reg));
1815 fw->pcie_regs[3] = htonl(RD_REG_DWORD(&reg->iobase_window));
1816
1817 WRT_REG_DWORD(&reg->iobase_window, 0x00);
1818 RD_REG_DWORD(&reg->iobase_window);
1819
1820 /* Host interface registers. */
1821 dmp_reg = &reg->flash_addr;
1822 for (cnt = 0; cnt < sizeof(fw->host_reg) / 4; cnt++)
1823 fw->host_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++));
1824
1825 /* Disable interrupts. */
1826 WRT_REG_DWORD(&reg->ictrl, 0);
1827 RD_REG_DWORD(&reg->ictrl);
1828
1829 /* Shadow registers. */
1830 WRT_REG_DWORD(&reg->iobase_addr, 0x0F70);
1831 RD_REG_DWORD(&reg->iobase_addr);
1832 WRT_REG_DWORD(&reg->iobase_select, 0xB0000000);
1833 fw->shadow_reg[0] = htonl(RD_REG_DWORD(&reg->iobase_sdata));
1834
1835 WRT_REG_DWORD(&reg->iobase_select, 0xB0100000);
1836 fw->shadow_reg[1] = htonl(RD_REG_DWORD(&reg->iobase_sdata));
1837
1838 WRT_REG_DWORD(&reg->iobase_select, 0xB0200000);
1839 fw->shadow_reg[2] = htonl(RD_REG_DWORD(&reg->iobase_sdata));
1840
1841 WRT_REG_DWORD(&reg->iobase_select, 0xB0300000);
1842 fw->shadow_reg[3] = htonl(RD_REG_DWORD(&reg->iobase_sdata));
1843
1844 WRT_REG_DWORD(&reg->iobase_select, 0xB0400000);
1845 fw->shadow_reg[4] = htonl(RD_REG_DWORD(&reg->iobase_sdata));
1846
1847 WRT_REG_DWORD(&reg->iobase_select, 0xB0500000);
1848 fw->shadow_reg[5] = htonl(RD_REG_DWORD(&reg->iobase_sdata));
1849
1850 WRT_REG_DWORD(&reg->iobase_select, 0xB0600000);
1851 fw->shadow_reg[6] = htonl(RD_REG_DWORD(&reg->iobase_sdata));
1852
1853 WRT_REG_DWORD(&reg->iobase_select, 0xB0700000);
1854 fw->shadow_reg[7] = htonl(RD_REG_DWORD(&reg->iobase_sdata));
1855
1856 WRT_REG_DWORD(&reg->iobase_select, 0xB0800000);
1857 fw->shadow_reg[8] = htonl(RD_REG_DWORD(&reg->iobase_sdata));
1858
1859 WRT_REG_DWORD(&reg->iobase_select, 0xB0900000);
1860 fw->shadow_reg[9] = htonl(RD_REG_DWORD(&reg->iobase_sdata));
1861
1862 WRT_REG_DWORD(&reg->iobase_select, 0xB0A00000);
1863 fw->shadow_reg[10] = htonl(RD_REG_DWORD(&reg->iobase_sdata));
1864
1865 /* RISC I/O register. */
1866 WRT_REG_DWORD(&reg->iobase_addr, 0x0010);
1867 fw->risc_io_reg = htonl(RD_REG_DWORD(&reg->iobase_window));
1868
1869 /* Mailbox registers. */
1870 mbx_reg = &reg->mailbox0;
1871 for (cnt = 0; cnt < sizeof(fw->mailbox_reg) / 2; cnt++)
1872 fw->mailbox_reg[cnt] = htons(RD_REG_WORD(mbx_reg++));
1873
1874 /* Transfer sequence registers. */
1875 iter_reg = fw->xseq_gp_reg;
1876 iter_reg = qla24xx_read_window(reg, 0xBE00, 16, iter_reg);
1877 iter_reg = qla24xx_read_window(reg, 0xBE10, 16, iter_reg);
1878 iter_reg = qla24xx_read_window(reg, 0xBE20, 16, iter_reg);
1879 iter_reg = qla24xx_read_window(reg, 0xBE30, 16, iter_reg);
1880 iter_reg = qla24xx_read_window(reg, 0xBE40, 16, iter_reg);
1881 iter_reg = qla24xx_read_window(reg, 0xBE50, 16, iter_reg);
1882 iter_reg = qla24xx_read_window(reg, 0xBE60, 16, iter_reg);
1883 iter_reg = qla24xx_read_window(reg, 0xBE70, 16, iter_reg);
1884 iter_reg = qla24xx_read_window(reg, 0xBF00, 16, iter_reg);
1885 iter_reg = qla24xx_read_window(reg, 0xBF10, 16, iter_reg);
1886 iter_reg = qla24xx_read_window(reg, 0xBF20, 16, iter_reg);
1887 iter_reg = qla24xx_read_window(reg, 0xBF30, 16, iter_reg);
1888 iter_reg = qla24xx_read_window(reg, 0xBF40, 16, iter_reg);
1889 iter_reg = qla24xx_read_window(reg, 0xBF50, 16, iter_reg);
1890 iter_reg = qla24xx_read_window(reg, 0xBF60, 16, iter_reg);
1891 qla24xx_read_window(reg, 0xBF70, 16, iter_reg);
1892
1893 iter_reg = fw->xseq_0_reg;
1894 iter_reg = qla24xx_read_window(reg, 0xBFC0, 16, iter_reg);
1895 iter_reg = qla24xx_read_window(reg, 0xBFD0, 16, iter_reg);
1896 qla24xx_read_window(reg, 0xBFE0, 16, iter_reg);
1897
1898 qla24xx_read_window(reg, 0xBFF0, 16, fw->xseq_1_reg);
1899
1900 qla24xx_read_window(reg, 0xBEF0, 16, fw->xseq_2_reg);
1901
1902 /* Receive sequence registers. */
1903 iter_reg = fw->rseq_gp_reg;
1904 iter_reg = qla24xx_read_window(reg, 0xFE00, 16, iter_reg);
1905 iter_reg = qla24xx_read_window(reg, 0xFE10, 16, iter_reg);
1906 iter_reg = qla24xx_read_window(reg, 0xFE20, 16, iter_reg);
1907 iter_reg = qla24xx_read_window(reg, 0xFE30, 16, iter_reg);
1908 iter_reg = qla24xx_read_window(reg, 0xFE40, 16, iter_reg);
1909 iter_reg = qla24xx_read_window(reg, 0xFE50, 16, iter_reg);
1910 iter_reg = qla24xx_read_window(reg, 0xFE60, 16, iter_reg);
1911 iter_reg = qla24xx_read_window(reg, 0xFE70, 16, iter_reg);
1912 iter_reg = qla24xx_read_window(reg, 0xFF00, 16, iter_reg);
1913 iter_reg = qla24xx_read_window(reg, 0xFF10, 16, iter_reg);
1914 iter_reg = qla24xx_read_window(reg, 0xFF20, 16, iter_reg);
1915 iter_reg = qla24xx_read_window(reg, 0xFF30, 16, iter_reg);
1916 iter_reg = qla24xx_read_window(reg, 0xFF40, 16, iter_reg);
1917 iter_reg = qla24xx_read_window(reg, 0xFF50, 16, iter_reg);
1918 iter_reg = qla24xx_read_window(reg, 0xFF60, 16, iter_reg);
1919 qla24xx_read_window(reg, 0xFF70, 16, iter_reg);
1920
1921 iter_reg = fw->rseq_0_reg;
1922 iter_reg = qla24xx_read_window(reg, 0xFFC0, 16, iter_reg);
1923 qla24xx_read_window(reg, 0xFFD0, 16, iter_reg);
1924
1925 qla24xx_read_window(reg, 0xFFE0, 16, fw->rseq_1_reg);
1926 qla24xx_read_window(reg, 0xFFF0, 16, fw->rseq_2_reg);
1927 qla24xx_read_window(reg, 0xFEF0, 16, fw->rseq_3_reg);
1928
1929 /* Auxiliary sequence registers. */
1930 iter_reg = fw->aseq_gp_reg;
1931 iter_reg = qla24xx_read_window(reg, 0xB000, 16, iter_reg);
1932 iter_reg = qla24xx_read_window(reg, 0xB010, 16, iter_reg);
1933 iter_reg = qla24xx_read_window(reg, 0xB020, 16, iter_reg);
1934 iter_reg = qla24xx_read_window(reg, 0xB030, 16, iter_reg);
1935 iter_reg = qla24xx_read_window(reg, 0xB040, 16, iter_reg);
1936 iter_reg = qla24xx_read_window(reg, 0xB050, 16, iter_reg);
1937 iter_reg = qla24xx_read_window(reg, 0xB060, 16, iter_reg);
1938 iter_reg = qla24xx_read_window(reg, 0xB070, 16, iter_reg);
1939 iter_reg = qla24xx_read_window(reg, 0xB100, 16, iter_reg);
1940 iter_reg = qla24xx_read_window(reg, 0xB110, 16, iter_reg);
1941 iter_reg = qla24xx_read_window(reg, 0xB120, 16, iter_reg);
1942 iter_reg = qla24xx_read_window(reg, 0xB130, 16, iter_reg);
1943 iter_reg = qla24xx_read_window(reg, 0xB140, 16, iter_reg);
1944 iter_reg = qla24xx_read_window(reg, 0xB150, 16, iter_reg);
1945 iter_reg = qla24xx_read_window(reg, 0xB160, 16, iter_reg);
1946 qla24xx_read_window(reg, 0xB170, 16, iter_reg);
1947
1948 iter_reg = fw->aseq_0_reg;
1949 iter_reg = qla24xx_read_window(reg, 0xB0C0, 16, iter_reg);
1950 qla24xx_read_window(reg, 0xB0D0, 16, iter_reg);
1951
1952 qla24xx_read_window(reg, 0xB0E0, 16, fw->aseq_1_reg);
1953 qla24xx_read_window(reg, 0xB0F0, 16, fw->aseq_2_reg);
1954 qla24xx_read_window(reg, 0xB1F0, 16, fw->aseq_3_reg);
1955
1956 /* Command DMA registers. */
1957 iter_reg = fw->cmd_dma_reg;
1958 iter_reg = qla24xx_read_window(reg, 0x7100, 16, iter_reg);
1959 iter_reg = qla24xx_read_window(reg, 0x7120, 16, iter_reg);
1960 iter_reg = qla24xx_read_window(reg, 0x7130, 16, iter_reg);
1961 qla24xx_read_window(reg, 0x71F0, 16, iter_reg);
1962
1963 /* Queues. */
1964 iter_reg = fw->req0_dma_reg;
1965 iter_reg = qla24xx_read_window(reg, 0x7200, 8, iter_reg);
1966 dmp_reg = &reg->iobase_q;
1967 for (cnt = 0; cnt < 7; cnt++)
1968 *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
1969
1970 iter_reg = fw->resp0_dma_reg;
1971 iter_reg = qla24xx_read_window(reg, 0x7300, 8, iter_reg);
1972 dmp_reg = &reg->iobase_q;
1973 for (cnt = 0; cnt < 7; cnt++)
1974 *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
1975
1976 iter_reg = fw->req1_dma_reg;
1977 iter_reg = qla24xx_read_window(reg, 0x7400, 8, iter_reg);
1978 dmp_reg = &reg->iobase_q;
1979 for (cnt = 0; cnt < 7; cnt++)
1980 *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
1981
1982 /* Transmit DMA registers. */
1983 iter_reg = fw->xmt0_dma_reg;
1984 iter_reg = qla24xx_read_window(reg, 0x7600, 16, iter_reg);
1985 qla24xx_read_window(reg, 0x7610, 16, iter_reg);
1986
1987 iter_reg = fw->xmt1_dma_reg;
1988 iter_reg = qla24xx_read_window(reg, 0x7620, 16, iter_reg);
1989 qla24xx_read_window(reg, 0x7630, 16, iter_reg);
1990
1991 iter_reg = fw->xmt2_dma_reg;
1992 iter_reg = qla24xx_read_window(reg, 0x7640, 16, iter_reg);
1993 qla24xx_read_window(reg, 0x7650, 16, iter_reg);
1994
1995 iter_reg = fw->xmt3_dma_reg;
1996 iter_reg = qla24xx_read_window(reg, 0x7660, 16, iter_reg);
1997 qla24xx_read_window(reg, 0x7670, 16, iter_reg);
1998
1999 iter_reg = fw->xmt4_dma_reg;
2000 iter_reg = qla24xx_read_window(reg, 0x7680, 16, iter_reg);
2001 qla24xx_read_window(reg, 0x7690, 16, iter_reg);
2002
2003 qla24xx_read_window(reg, 0x76A0, 16, fw->xmt_data_dma_reg);
2004
2005 /* Receive DMA registers. */
2006 iter_reg = fw->rcvt0_data_dma_reg;
2007 iter_reg = qla24xx_read_window(reg, 0x7700, 16, iter_reg);
2008 qla24xx_read_window(reg, 0x7710, 16, iter_reg);
2009
2010 iter_reg = fw->rcvt1_data_dma_reg;
2011 iter_reg = qla24xx_read_window(reg, 0x7720, 16, iter_reg);
2012 qla24xx_read_window(reg, 0x7730, 16, iter_reg);
2013
2014 /* RISC registers. */
2015 iter_reg = fw->risc_gp_reg;
2016 iter_reg = qla24xx_read_window(reg, 0x0F00, 16, iter_reg);
2017 iter_reg = qla24xx_read_window(reg, 0x0F10, 16, iter_reg);
2018 iter_reg = qla24xx_read_window(reg, 0x0F20, 16, iter_reg);
2019 iter_reg = qla24xx_read_window(reg, 0x0F30, 16, iter_reg);
2020 iter_reg = qla24xx_read_window(reg, 0x0F40, 16, iter_reg);
2021 iter_reg = qla24xx_read_window(reg, 0x0F50, 16, iter_reg);
2022 iter_reg = qla24xx_read_window(reg, 0x0F60, 16, iter_reg);
2023 qla24xx_read_window(reg, 0x0F70, 16, iter_reg);
2024
2025 /* Local memory controller registers. */
2026 iter_reg = fw->lmc_reg;
2027 iter_reg = qla24xx_read_window(reg, 0x3000, 16, iter_reg);
2028 iter_reg = qla24xx_read_window(reg, 0x3010, 16, iter_reg);
2029 iter_reg = qla24xx_read_window(reg, 0x3020, 16, iter_reg);
2030 iter_reg = qla24xx_read_window(reg, 0x3030, 16, iter_reg);
2031 iter_reg = qla24xx_read_window(reg, 0x3040, 16, iter_reg);
2032 iter_reg = qla24xx_read_window(reg, 0x3050, 16, iter_reg);
2033 iter_reg = qla24xx_read_window(reg, 0x3060, 16, iter_reg);
2034 qla24xx_read_window(reg, 0x3070, 16, iter_reg);
2035
2036 /* Fibre Protocol Module registers. */
2037 iter_reg = fw->fpm_hdw_reg;
2038 iter_reg = qla24xx_read_window(reg, 0x4000, 16, iter_reg);
2039 iter_reg = qla24xx_read_window(reg, 0x4010, 16, iter_reg);
2040 iter_reg = qla24xx_read_window(reg, 0x4020, 16, iter_reg);
2041 iter_reg = qla24xx_read_window(reg, 0x4030, 16, iter_reg);
2042 iter_reg = qla24xx_read_window(reg, 0x4040, 16, iter_reg);
2043 iter_reg = qla24xx_read_window(reg, 0x4050, 16, iter_reg);
2044 iter_reg = qla24xx_read_window(reg, 0x4060, 16, iter_reg);
2045 iter_reg = qla24xx_read_window(reg, 0x4070, 16, iter_reg);
2046 iter_reg = qla24xx_read_window(reg, 0x4080, 16, iter_reg);
2047 iter_reg = qla24xx_read_window(reg, 0x4090, 16, iter_reg);
2048 iter_reg = qla24xx_read_window(reg, 0x40A0, 16, iter_reg);
2049 iter_reg = qla24xx_read_window(reg, 0x40B0, 16, iter_reg);
2050 iter_reg = qla24xx_read_window(reg, 0x40C0, 16, iter_reg);
2051 iter_reg = qla24xx_read_window(reg, 0x40D0, 16, iter_reg);
2052 iter_reg = qla24xx_read_window(reg, 0x40E0, 16, iter_reg);
2053 qla24xx_read_window(reg, 0x40F0, 16, iter_reg);
2054
2055 /* RQ0 Array registers. */
2056 iter_reg = fw->rq0_array_reg;
2057 iter_reg = qla24xx_read_window(reg, 0x5C00, 16, iter_reg);
2058 iter_reg = qla24xx_read_window(reg, 0x5C10, 16, iter_reg);
2059 iter_reg = qla24xx_read_window(reg, 0x5C20, 16, iter_reg);
2060 iter_reg = qla24xx_read_window(reg, 0x5C30, 16, iter_reg);
2061 iter_reg = qla24xx_read_window(reg, 0x5C40, 16, iter_reg);
2062 iter_reg = qla24xx_read_window(reg, 0x5C50, 16, iter_reg);
2063 iter_reg = qla24xx_read_window(reg, 0x5C60, 16, iter_reg);
2064 iter_reg = qla24xx_read_window(reg, 0x5C70, 16, iter_reg);
2065 iter_reg = qla24xx_read_window(reg, 0x5C80, 16, iter_reg);
2066 iter_reg = qla24xx_read_window(reg, 0x5C90, 16, iter_reg);
2067 iter_reg = qla24xx_read_window(reg, 0x5CA0, 16, iter_reg);
2068 iter_reg = qla24xx_read_window(reg, 0x5CB0, 16, iter_reg);
2069 iter_reg = qla24xx_read_window(reg, 0x5CC0, 16, iter_reg);
2070 iter_reg = qla24xx_read_window(reg, 0x5CD0, 16, iter_reg);
2071 iter_reg = qla24xx_read_window(reg, 0x5CE0, 16, iter_reg);
2072 qla24xx_read_window(reg, 0x5CF0, 16, iter_reg);
2073
2074 /* RQ1 Array registers. */
2075 iter_reg = fw->rq1_array_reg;
2076 iter_reg = qla24xx_read_window(reg, 0x5D00, 16, iter_reg);
2077 iter_reg = qla24xx_read_window(reg, 0x5D10, 16, iter_reg);
2078 iter_reg = qla24xx_read_window(reg, 0x5D20, 16, iter_reg);
2079 iter_reg = qla24xx_read_window(reg, 0x5D30, 16, iter_reg);
2080 iter_reg = qla24xx_read_window(reg, 0x5D40, 16, iter_reg);
2081 iter_reg = qla24xx_read_window(reg, 0x5D50, 16, iter_reg);
2082 iter_reg = qla24xx_read_window(reg, 0x5D60, 16, iter_reg);
2083 iter_reg = qla24xx_read_window(reg, 0x5D70, 16, iter_reg);
2084 iter_reg = qla24xx_read_window(reg, 0x5D80, 16, iter_reg);
2085 iter_reg = qla24xx_read_window(reg, 0x5D90, 16, iter_reg);
2086 iter_reg = qla24xx_read_window(reg, 0x5DA0, 16, iter_reg);
2087 iter_reg = qla24xx_read_window(reg, 0x5DB0, 16, iter_reg);
2088 iter_reg = qla24xx_read_window(reg, 0x5DC0, 16, iter_reg);
2089 iter_reg = qla24xx_read_window(reg, 0x5DD0, 16, iter_reg);
2090 iter_reg = qla24xx_read_window(reg, 0x5DE0, 16, iter_reg);
2091 qla24xx_read_window(reg, 0x5DF0, 16, iter_reg);
2092
2093 /* RP0 Array registers. */
2094 iter_reg = fw->rp0_array_reg;
2095 iter_reg = qla24xx_read_window(reg, 0x5E00, 16, iter_reg);
2096 iter_reg = qla24xx_read_window(reg, 0x5E10, 16, iter_reg);
2097 iter_reg = qla24xx_read_window(reg, 0x5E20, 16, iter_reg);
2098 iter_reg = qla24xx_read_window(reg, 0x5E30, 16, iter_reg);
2099 iter_reg = qla24xx_read_window(reg, 0x5E40, 16, iter_reg);
2100 iter_reg = qla24xx_read_window(reg, 0x5E50, 16, iter_reg);
2101 iter_reg = qla24xx_read_window(reg, 0x5E60, 16, iter_reg);
2102 iter_reg = qla24xx_read_window(reg, 0x5E70, 16, iter_reg);
2103 iter_reg = qla24xx_read_window(reg, 0x5E80, 16, iter_reg);
2104 iter_reg = qla24xx_read_window(reg, 0x5E90, 16, iter_reg);
2105 iter_reg = qla24xx_read_window(reg, 0x5EA0, 16, iter_reg);
2106 iter_reg = qla24xx_read_window(reg, 0x5EB0, 16, iter_reg);
2107 iter_reg = qla24xx_read_window(reg, 0x5EC0, 16, iter_reg);
2108 iter_reg = qla24xx_read_window(reg, 0x5ED0, 16, iter_reg);
2109 iter_reg = qla24xx_read_window(reg, 0x5EE0, 16, iter_reg);
2110 qla24xx_read_window(reg, 0x5EF0, 16, iter_reg);
2111
2112 /* RP1 Array registers. */
2113 iter_reg = fw->rp1_array_reg;
2114 iter_reg = qla24xx_read_window(reg, 0x5F00, 16, iter_reg);
2115 iter_reg = qla24xx_read_window(reg, 0x5F10, 16, iter_reg);
2116 iter_reg = qla24xx_read_window(reg, 0x5F20, 16, iter_reg);
2117 iter_reg = qla24xx_read_window(reg, 0x5F30, 16, iter_reg);
2118 iter_reg = qla24xx_read_window(reg, 0x5F40, 16, iter_reg);
2119 iter_reg = qla24xx_read_window(reg, 0x5F50, 16, iter_reg);
2120 iter_reg = qla24xx_read_window(reg, 0x5F60, 16, iter_reg);
2121 iter_reg = qla24xx_read_window(reg, 0x5F70, 16, iter_reg);
2122 iter_reg = qla24xx_read_window(reg, 0x5F80, 16, iter_reg);
2123 iter_reg = qla24xx_read_window(reg, 0x5F90, 16, iter_reg);
2124 iter_reg = qla24xx_read_window(reg, 0x5FA0, 16, iter_reg);
2125 iter_reg = qla24xx_read_window(reg, 0x5FB0, 16, iter_reg);
2126 iter_reg = qla24xx_read_window(reg, 0x5FC0, 16, iter_reg);
2127 iter_reg = qla24xx_read_window(reg, 0x5FD0, 16, iter_reg);
2128 iter_reg = qla24xx_read_window(reg, 0x5FE0, 16, iter_reg);
2129 qla24xx_read_window(reg, 0x5FF0, 16, iter_reg);
2130
2131 iter_reg = fw->at0_array_reg;
2132 iter_reg = qla24xx_read_window(reg, 0x7080, 16, iter_reg);
2133 iter_reg = qla24xx_read_window(reg, 0x7090, 16, iter_reg);
2134 iter_reg = qla24xx_read_window(reg, 0x70A0, 16, iter_reg);
2135 iter_reg = qla24xx_read_window(reg, 0x70B0, 16, iter_reg);
2136 iter_reg = qla24xx_read_window(reg, 0x70C0, 16, iter_reg);
2137 iter_reg = qla24xx_read_window(reg, 0x70D0, 16, iter_reg);
2138 iter_reg = qla24xx_read_window(reg, 0x70E0, 16, iter_reg);
2139 qla24xx_read_window(reg, 0x70F0, 16, iter_reg);
2140
2141 /* I/O Queue Control registers. */
2142 qla24xx_read_window(reg, 0x7800, 16, fw->queue_control_reg);
2143
2144 /* Frame Buffer registers. */
2145 iter_reg = fw->fb_hdw_reg;
2146 iter_reg = qla24xx_read_window(reg, 0x6000, 16, iter_reg);
2147 iter_reg = qla24xx_read_window(reg, 0x6010, 16, iter_reg);
2148 iter_reg = qla24xx_read_window(reg, 0x6020, 16, iter_reg);
2149 iter_reg = qla24xx_read_window(reg, 0x6030, 16, iter_reg);
2150 iter_reg = qla24xx_read_window(reg, 0x6040, 16, iter_reg);
2151 iter_reg = qla24xx_read_window(reg, 0x6060, 16, iter_reg);
2152 iter_reg = qla24xx_read_window(reg, 0x6070, 16, iter_reg);
2153 iter_reg = qla24xx_read_window(reg, 0x6100, 16, iter_reg);
2154 iter_reg = qla24xx_read_window(reg, 0x6130, 16, iter_reg);
2155 iter_reg = qla24xx_read_window(reg, 0x6150, 16, iter_reg);
2156 iter_reg = qla24xx_read_window(reg, 0x6170, 16, iter_reg);
2157 iter_reg = qla24xx_read_window(reg, 0x6190, 16, iter_reg);
2158 iter_reg = qla24xx_read_window(reg, 0x61B0, 16, iter_reg);
2159 iter_reg = qla24xx_read_window(reg, 0x61C0, 16, iter_reg);
2160 iter_reg = qla24xx_read_window(reg, 0x6530, 16, iter_reg);
2161 iter_reg = qla24xx_read_window(reg, 0x6540, 16, iter_reg);
2162 iter_reg = qla24xx_read_window(reg, 0x6550, 16, iter_reg);
2163 iter_reg = qla24xx_read_window(reg, 0x6560, 16, iter_reg);
2164 iter_reg = qla24xx_read_window(reg, 0x6570, 16, iter_reg);
2165 iter_reg = qla24xx_read_window(reg, 0x6580, 16, iter_reg);
2166 iter_reg = qla24xx_read_window(reg, 0x6590, 16, iter_reg);
2167 iter_reg = qla24xx_read_window(reg, 0x65A0, 16, iter_reg);
2168 iter_reg = qla24xx_read_window(reg, 0x65B0, 16, iter_reg);
2169 iter_reg = qla24xx_read_window(reg, 0x65C0, 16, iter_reg);
2170 iter_reg = qla24xx_read_window(reg, 0x65D0, 16, iter_reg);
2171 iter_reg = qla24xx_read_window(reg, 0x65E0, 16, iter_reg);
2172 qla24xx_read_window(reg, 0x6F00, 16, iter_reg);
2173
2174 /* Multi queue registers */
2175 nxt_chain = qla25xx_copy_mq(ha, (void *)ha->fw_dump + ha->chain_offset,
2176 &last_chain);
2177
2178 rval = qla24xx_soft_reset(ha);
2179 if (rval != QLA_SUCCESS) {
2180 ql_log(ql_log_warn, vha, 0xd00e,
2181 "SOFT RESET FAILED, forcing continuation of dump!!!\n");
2182 rval = QLA_SUCCESS;
2183
2184 ql_log(ql_log_warn, vha, 0xd00f, "try a bigger hammer!!!\n");
2185
2186 WRT_REG_DWORD(&reg->hccr, HCCRX_SET_RISC_RESET);
2187 RD_REG_DWORD(&reg->hccr);
2188
2189 WRT_REG_DWORD(&reg->hccr, HCCRX_REL_RISC_PAUSE);
2190 RD_REG_DWORD(&reg->hccr);
2191
2192 WRT_REG_DWORD(&reg->hccr, HCCRX_CLR_RISC_RESET);
2193 RD_REG_DWORD(&reg->hccr);
2194
2195 for (cnt = 30000; cnt && (RD_REG_WORD(&reg->mailbox0)); cnt--)
2196 udelay(5);
2197
2198 if (!cnt) {
2199 nxt = fw->code_ram;
2200 nxt += sizeof(fw->code_ram),
2201 nxt += (ha->fw_memory_size - 0x100000 + 1);
2202 goto copy_queue;
2203 } else
2204 ql_log(ql_log_warn, vha, 0xd010,
2205 "bigger hammer success?\n");
2206 }
2207
2208 rval = qla24xx_dump_memory(ha, fw->code_ram, sizeof(fw->code_ram),
2209 &nxt);
2210 if (rval != QLA_SUCCESS)
2211 goto qla83xx_fw_dump_failed_0;
2212
2213copy_queue:
2214 nxt = qla2xxx_copy_queues(ha, nxt);
2215
2216 nxt = qla24xx_copy_eft(ha, nxt);
2217
2218 /* Chain entries -- started with MQ. */
2219 nxt_chain = qla25xx_copy_fce(ha, nxt_chain, &last_chain);
2220 nxt_chain = qla25xx_copy_mqueues(ha, nxt_chain, &last_chain);
2221 if (last_chain) {
2222 ha->fw_dump->version |= __constant_htonl(DUMP_CHAIN_VARIANT);
2223 *last_chain |= __constant_htonl(DUMP_CHAIN_LAST);
2224 }
2225
2226 /* Adjust valid length. */
2227 ha->fw_dump_len = (nxt_chain - (void *)ha->fw_dump);
2228
2229qla83xx_fw_dump_failed_0:
2230 qla2xxx_dump_post_process(base_vha, rval);
2231
2232qla83xx_fw_dump_failed:
2233 if (!hardware_locked)
2234 spin_unlock_irqrestore(&ha->hardware_lock, flags);
2235}
2236
1653/****************************************************************************/ 2237/****************************************************************************/
1654/* Driver Debug Functions. */ 2238/* Driver Debug Functions. */
1655/****************************************************************************/ 2239/****************************************************************************/
@@ -1782,13 +2366,13 @@ ql_log(uint32_t level, scsi_qla_host_t *vha, int32_t id, const char *fmt, ...)
1782 vaf.va = &va; 2366 vaf.va = &va;
1783 2367
1784 switch (level) { 2368 switch (level) {
1785 case 0: /* FATAL LOG */ 2369 case ql_log_fatal: /* FATAL LOG */
1786 pr_crit("%s%pV", pbuf, &vaf); 2370 pr_crit("%s%pV", pbuf, &vaf);
1787 break; 2371 break;
1788 case 1: 2372 case ql_log_warn:
1789 pr_err("%s%pV", pbuf, &vaf); 2373 pr_err("%s%pV", pbuf, &vaf);
1790 break; 2374 break;
1791 case 2: 2375 case ql_log_info:
1792 pr_warn("%s%pV", pbuf, &vaf); 2376 pr_warn("%s%pV", pbuf, &vaf);
1793 break; 2377 break;
1794 default: 2378 default:
@@ -1837,13 +2421,13 @@ ql_log_pci(uint32_t level, struct pci_dev *pdev, int32_t id,
1837 vaf.va = &va; 2421 vaf.va = &va;
1838 2422
1839 switch (level) { 2423 switch (level) {
1840 case 0: /* FATAL LOG */ 2424 case ql_log_fatal: /* FATAL LOG */
1841 pr_crit("%s%pV", pbuf, &vaf); 2425 pr_crit("%s%pV", pbuf, &vaf);
1842 break; 2426 break;
1843 case 1: 2427 case ql_log_warn:
1844 pr_err("%s%pV", pbuf, &vaf); 2428 pr_err("%s%pV", pbuf, &vaf);
1845 break; 2429 break;
1846 case 2: 2430 case ql_log_info:
1847 pr_warn("%s%pV", pbuf, &vaf); 2431 pr_warn("%s%pV", pbuf, &vaf);
1848 break; 2432 break;
1849 default: 2433 default:
diff --git a/drivers/scsi/qla2xxx/qla_dbg.h b/drivers/scsi/qla2xxx/qla_dbg.h
index 5f1b6d9c3dcb..2157bdf1569a 100644
--- a/drivers/scsi/qla2xxx/qla_dbg.h
+++ b/drivers/scsi/qla2xxx/qla_dbg.h
@@ -165,6 +165,54 @@ struct qla81xx_fw_dump {
165 uint32_t ext_mem[1]; 165 uint32_t ext_mem[1];
166}; 166};
167 167
168struct qla83xx_fw_dump {
169 uint32_t host_status;
170 uint32_t host_risc_reg[48];
171 uint32_t pcie_regs[4];
172 uint32_t host_reg[32];
173 uint32_t shadow_reg[11];
174 uint32_t risc_io_reg;
175 uint16_t mailbox_reg[32];
176 uint32_t xseq_gp_reg[256];
177 uint32_t xseq_0_reg[48];
178 uint32_t xseq_1_reg[16];
179 uint32_t xseq_2_reg[16];
180 uint32_t rseq_gp_reg[256];
181 uint32_t rseq_0_reg[32];
182 uint32_t rseq_1_reg[16];
183 uint32_t rseq_2_reg[16];
184 uint32_t rseq_3_reg[16];
185 uint32_t aseq_gp_reg[256];
186 uint32_t aseq_0_reg[32];
187 uint32_t aseq_1_reg[16];
188 uint32_t aseq_2_reg[16];
189 uint32_t aseq_3_reg[16];
190 uint32_t cmd_dma_reg[64];
191 uint32_t req0_dma_reg[15];
192 uint32_t resp0_dma_reg[15];
193 uint32_t req1_dma_reg[15];
194 uint32_t xmt0_dma_reg[32];
195 uint32_t xmt1_dma_reg[32];
196 uint32_t xmt2_dma_reg[32];
197 uint32_t xmt3_dma_reg[32];
198 uint32_t xmt4_dma_reg[32];
199 uint32_t xmt_data_dma_reg[16];
200 uint32_t rcvt0_data_dma_reg[32];
201 uint32_t rcvt1_data_dma_reg[32];
202 uint32_t risc_gp_reg[128];
203 uint32_t lmc_reg[128];
204 uint32_t fpm_hdw_reg[256];
205 uint32_t rq0_array_reg[256];
206 uint32_t rq1_array_reg[256];
207 uint32_t rp0_array_reg[256];
208 uint32_t rp1_array_reg[256];
209 uint32_t queue_control_reg[16];
210 uint32_t fb_hdw_reg[432];
211 uint32_t at0_array_reg[128];
212 uint32_t code_ram[0x2400];
213 uint32_t ext_mem[1];
214};
215
168#define EFT_NUM_BUFFERS 4 216#define EFT_NUM_BUFFERS 4
169#define EFT_BYTES_PER_BUFFER 0x4000 217#define EFT_BYTES_PER_BUFFER 0x4000
170#define EFT_SIZE ((EFT_BYTES_PER_BUFFER) * (EFT_NUM_BUFFERS)) 218#define EFT_SIZE ((EFT_BYTES_PER_BUFFER) * (EFT_NUM_BUFFERS))
@@ -192,9 +240,23 @@ struct qla2xxx_mq_chain {
192 uint32_t qregs[4 * QLA_MQ_SIZE]; 240 uint32_t qregs[4 * QLA_MQ_SIZE];
193}; 241};
194 242
243struct qla2xxx_mqueue_header {
244 uint32_t queue;
245#define TYPE_REQUEST_QUEUE 0x1
246#define TYPE_RESPONSE_QUEUE 0x2
247 uint32_t number;
248 uint32_t size;
249};
250
251struct qla2xxx_mqueue_chain {
252 uint32_t type;
253 uint32_t chain_size;
254};
255
195#define DUMP_CHAIN_VARIANT 0x80000000 256#define DUMP_CHAIN_VARIANT 0x80000000
196#define DUMP_CHAIN_FCE 0x7FFFFAF0 257#define DUMP_CHAIN_FCE 0x7FFFFAF0
197#define DUMP_CHAIN_MQ 0x7FFFFAF1 258#define DUMP_CHAIN_MQ 0x7FFFFAF1
259#define DUMP_CHAIN_QUEUE 0x7FFFFAF2
198#define DUMP_CHAIN_LAST 0x80000000 260#define DUMP_CHAIN_LAST 0x80000000
199 261
200struct qla2xxx_fw_dump { 262struct qla2xxx_fw_dump {
@@ -228,6 +290,7 @@ struct qla2xxx_fw_dump {
228 struct qla24xx_fw_dump isp24; 290 struct qla24xx_fw_dump isp24;
229 struct qla25xx_fw_dump isp25; 291 struct qla25xx_fw_dump isp25;
230 struct qla81xx_fw_dump isp81; 292 struct qla81xx_fw_dump isp81;
293 struct qla83xx_fw_dump isp83;
231 } isp; 294 } isp;
232}; 295};
233 296
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index af1003f9de1e..a2443031dbe7 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -125,17 +125,17 @@
125 * Fibre Channel device definitions. 125 * Fibre Channel device definitions.
126 */ 126 */
127#define WWN_SIZE 8 /* Size of WWPN, WWN & WWNN */ 127#define WWN_SIZE 8 /* Size of WWPN, WWN & WWNN */
128#define MAX_FIBRE_DEVICES 512 128#define MAX_FIBRE_DEVICES_2100 512
129#define MAX_FIBRE_DEVICES_2400 2048
130#define MAX_FIBRE_DEVICES_LOOP 128
131#define MAX_FIBRE_DEVICES_MAX MAX_FIBRE_DEVICES_2400
129#define MAX_FIBRE_LUNS 0xFFFF 132#define MAX_FIBRE_LUNS 0xFFFF
130#define MAX_RSCN_COUNT 32
131#define MAX_HOST_COUNT 16 133#define MAX_HOST_COUNT 16
132 134
133/* 135/*
134 * Host adapter default definitions. 136 * Host adapter default definitions.
135 */ 137 */
136#define MAX_BUSES 1 /* We only have one bus today */ 138#define MAX_BUSES 1 /* We only have one bus today */
137#define MAX_TARGETS_2100 MAX_FIBRE_DEVICES
138#define MAX_TARGETS_2200 MAX_FIBRE_DEVICES
139#define MIN_LUNS 8 139#define MIN_LUNS 8
140#define MAX_LUNS MAX_FIBRE_LUNS 140#define MAX_LUNS MAX_FIBRE_LUNS
141#define MAX_CMDS_PER_LUN 255 141#define MAX_CMDS_PER_LUN 255
@@ -202,20 +202,12 @@ struct sd_dif_tuple {
202/* 202/*
203 * SCSI Request Block 203 * SCSI Request Block
204 */ 204 */
205typedef struct srb { 205struct srb_cmd {
206 atomic_t ref_count;
207 struct fc_port *fcport;
208 uint32_t handle;
209
210 struct scsi_cmnd *cmd; /* Linux SCSI command pkt */ 206 struct scsi_cmnd *cmd; /* Linux SCSI command pkt */
211
212 uint16_t flags;
213
214 uint32_t request_sense_length; 207 uint32_t request_sense_length;
215 uint8_t *request_sense_ptr; 208 uint8_t *request_sense_ptr;
216
217 void *ctx; 209 void *ctx;
218} srb_t; 210};
219 211
220/* 212/*
221 * SRB flag definitions 213 * SRB flag definitions
@@ -254,10 +246,7 @@ struct srb_iocb {
254 } u; 246 } u;
255 247
256 struct timer_list timer; 248 struct timer_list timer;
257 249 void (*timeout)(void *);
258 void (*done)(srb_t *);
259 void (*free)(srb_t *);
260 void (*timeout)(srb_t *);
261}; 250};
262 251
263/* Values for srb_ctx type */ 252/* Values for srb_ctx type */
@@ -268,16 +257,37 @@ struct srb_iocb {
268#define SRB_CT_CMD 5 257#define SRB_CT_CMD 5
269#define SRB_ADISC_CMD 6 258#define SRB_ADISC_CMD 6
270#define SRB_TM_CMD 7 259#define SRB_TM_CMD 7
260#define SRB_SCSI_CMD 8
271 261
272struct srb_ctx { 262typedef struct srb {
263 atomic_t ref_count;
264 struct fc_port *fcport;
265 uint32_t handle;
266 uint16_t flags;
273 uint16_t type; 267 uint16_t type;
274 char *name; 268 char *name;
275 int iocbs; 269 int iocbs;
276 union { 270 union {
277 struct srb_iocb *iocb_cmd; 271 struct srb_iocb iocb_cmd;
278 struct fc_bsg_job *bsg_job; 272 struct fc_bsg_job *bsg_job;
273 struct srb_cmd scmd;
279 } u; 274 } u;
280}; 275 void (*done)(void *, void *, int);
276 void (*free)(void *, void *);
277} srb_t;
278
279#define GET_CMD_SP(sp) (sp->u.scmd.cmd)
280#define SET_CMD_SP(sp, cmd) (sp->u.scmd.cmd = cmd)
281#define GET_CMD_CTX_SP(sp) (sp->u.scmd.ctx)
282
283#define GET_CMD_SENSE_LEN(sp) \
284 (sp->u.scmd.request_sense_length)
285#define SET_CMD_SENSE_LEN(sp, len) \
286 (sp->u.scmd.request_sense_length = len)
287#define GET_CMD_SENSE_PTR(sp) \
288 (sp->u.scmd.request_sense_ptr)
289#define SET_CMD_SENSE_PTR(sp, ptr) \
290 (sp->u.scmd.request_sense_ptr = ptr)
281 291
282struct msg_echo_lb { 292struct msg_echo_lb {
283 dma_addr_t send_dma; 293 dma_addr_t send_dma;
@@ -653,8 +663,10 @@ typedef struct {
653#define MBC_DIAGNOSTIC_LOOP_BACK 0x45 /* Diagnostic loop back. */ 663#define MBC_DIAGNOSTIC_LOOP_BACK 0x45 /* Diagnostic loop back. */
654#define MBC_ONLINE_SELF_TEST 0x46 /* Online self-test. */ 664#define MBC_ONLINE_SELF_TEST 0x46 /* Online self-test. */
655#define MBC_ENHANCED_GET_PORT_DATABASE 0x47 /* Get port database + login */ 665#define MBC_ENHANCED_GET_PORT_DATABASE 0x47 /* Get port database + login */
666#define MBC_CONFIGURE_VF 0x4b /* Configure VFs */
656#define MBC_RESET_LINK_STATUS 0x52 /* Reset Link Error Status */ 667#define MBC_RESET_LINK_STATUS 0x52 /* Reset Link Error Status */
657#define MBC_IOCB_COMMAND_A64 0x54 /* Execute IOCB command (64) */ 668#define MBC_IOCB_COMMAND_A64 0x54 /* Execute IOCB command (64) */
669#define MBC_PORT_LOGOUT 0x56 /* Port Logout request */
658#define MBC_SEND_RNID_ELS 0x57 /* Send RNID ELS request */ 670#define MBC_SEND_RNID_ELS 0x57 /* Send RNID ELS request */
659#define MBC_SET_RNID_PARAMS 0x59 /* Set RNID parameters */ 671#define MBC_SET_RNID_PARAMS 0x59 /* Set RNID parameters */
660#define MBC_GET_RNID_PARAMS 0x5a /* Data Rate */ 672#define MBC_GET_RNID_PARAMS 0x5a /* Data Rate */
@@ -1709,6 +1721,7 @@ typedef struct fc_port {
1709 1721
1710 uint16_t vp_idx; 1722 uint16_t vp_idx;
1711 uint8_t fc4_type; 1723 uint8_t fc4_type;
1724 uint8_t scan_state;
1712} fc_port_t; 1725} fc_port_t;
1713 1726
1714/* 1727/*
@@ -1761,7 +1774,6 @@ static const char * const port_state_str[] = {
1761 1774
1762#define GID_PT_CMD 0x1A1 1775#define GID_PT_CMD 0x1A1
1763#define GID_PT_REQ_SIZE (16 + 4) 1776#define GID_PT_REQ_SIZE (16 + 4)
1764#define GID_PT_RSP_SIZE (16 + (MAX_FIBRE_DEVICES * 4))
1765 1777
1766#define GPN_ID_CMD 0x112 1778#define GPN_ID_CMD 0x112
1767#define GPN_ID_REQ_SIZE (16 + 4) 1779#define GPN_ID_REQ_SIZE (16 + 4)
@@ -2051,7 +2063,9 @@ struct ct_sns_rsp {
2051 } ga_nxt; 2063 } ga_nxt;
2052 2064
2053 struct { 2065 struct {
2054 struct ct_sns_gid_pt_data entries[MAX_FIBRE_DEVICES]; 2066 /* Assume the largest number of targets for the union */
2067 struct ct_sns_gid_pt_data
2068 entries[MAX_FIBRE_DEVICES_MAX];
2055 } gid_pt; 2069 } gid_pt;
2056 2070
2057 struct { 2071 struct {
@@ -2112,7 +2126,11 @@ struct ct_sns_pkt {
2112 2126
2113#define GID_PT_SNS_SCMD_LEN 6 2127#define GID_PT_SNS_SCMD_LEN 6
2114#define GID_PT_SNS_CMD_SIZE 28 2128#define GID_PT_SNS_CMD_SIZE 28
2115#define GID_PT_SNS_DATA_SIZE (MAX_FIBRE_DEVICES * 4 + 16) 2129/*
2130 * Assume MAX_FIBRE_DEVICES_2100 as these defines are only used with older
2131 * adapters.
2132 */
2133#define GID_PT_SNS_DATA_SIZE (MAX_FIBRE_DEVICES_2100 * 4 + 16)
2116 2134
2117#define GPN_ID_SNS_SCMD_LEN 6 2135#define GPN_ID_SNS_SCMD_LEN 6
2118#define GPN_ID_SNS_CMD_SIZE 28 2136#define GPN_ID_SNS_CMD_SIZE 28
@@ -2160,7 +2178,6 @@ struct gid_list_info {
2160 uint16_t loop_id; /* ISP23XX -- 6 bytes. */ 2178 uint16_t loop_id; /* ISP23XX -- 6 bytes. */
2161 uint16_t reserved_1; /* ISP24XX -- 8 bytes. */ 2179 uint16_t reserved_1; /* ISP24XX -- 8 bytes. */
2162}; 2180};
2163#define GID_LIST_SIZE (sizeof(struct gid_list_info) * MAX_FIBRE_DEVICES)
2164 2181
2165/* NPIV */ 2182/* NPIV */
2166typedef struct vport_info { 2183typedef struct vport_info {
@@ -2261,6 +2278,7 @@ struct isp_operations {
2261#define QLA_MIDX_DEFAULT 0 2278#define QLA_MIDX_DEFAULT 0
2262#define QLA_MIDX_RSP_Q 1 2279#define QLA_MIDX_RSP_Q 1
2263#define QLA_PCI_MSIX_CONTROL 0xa2 2280#define QLA_PCI_MSIX_CONTROL 0xa2
2281#define QLA_83XX_PCI_MSIX_CONTROL 0x92
2264 2282
2265struct scsi_qla_host; 2283struct scsi_qla_host;
2266 2284
@@ -2341,7 +2359,7 @@ struct qla_statistics {
2341#define QLA_MQ_SIZE 32 2359#define QLA_MQ_SIZE 32
2342#define QLA_MAX_QUEUES 256 2360#define QLA_MAX_QUEUES 256
2343#define ISP_QUE_REG(ha, id) \ 2361#define ISP_QUE_REG(ha, id) \
2344 ((ha->mqenable) ? \ 2362 ((ha->mqenable || IS_QLA83XX(ha)) ? \
2345 ((void *)(ha->mqiobase) +\ 2363 ((void *)(ha->mqiobase) +\
2346 (QLA_QUE_PAGE * id)) :\ 2364 (QLA_QUE_PAGE * id)) :\
2347 ((void *)(ha->iobase))) 2365 ((void *)(ha->iobase)))
@@ -2461,6 +2479,7 @@ struct qla_hw_data {
2461#define MIN_IOBASE_LEN 0x100 2479#define MIN_IOBASE_LEN 0x100
2462/* Multi queue data structs */ 2480/* Multi queue data structs */
2463 device_reg_t __iomem *mqiobase; 2481 device_reg_t __iomem *mqiobase;
2482 device_reg_t __iomem *msixbase;
2464 uint16_t msix_count; 2483 uint16_t msix_count;
2465 uint8_t mqenable; 2484 uint8_t mqenable;
2466 struct req_que **req_q_map; 2485 struct req_que **req_q_map;
@@ -2485,6 +2504,7 @@ struct qla_hw_data {
2485 atomic_t loop_down_timer; /* loop down timer */ 2504 atomic_t loop_down_timer; /* loop down timer */
2486 uint8_t link_down_timeout; /* link down timeout */ 2505 uint8_t link_down_timeout; /* link down timeout */
2487 uint16_t max_loop_id; 2506 uint16_t max_loop_id;
2507 uint16_t max_fibre_devices; /* Maximum number of targets */
2488 2508
2489 uint16_t fb_rev; 2509 uint16_t fb_rev;
2490 uint16_t min_external_loopid; /* First external loop Id */ 2510 uint16_t min_external_loopid; /* First external loop Id */
@@ -2494,6 +2514,7 @@ struct qla_hw_data {
2494#define PORT_SPEED_2GB 0x01 2514#define PORT_SPEED_2GB 0x01
2495#define PORT_SPEED_4GB 0x03 2515#define PORT_SPEED_4GB 0x03
2496#define PORT_SPEED_8GB 0x04 2516#define PORT_SPEED_8GB 0x04
2517#define PORT_SPEED_16GB 0x05
2497#define PORT_SPEED_10GB 0x13 2518#define PORT_SPEED_10GB 0x13
2498 uint16_t link_data_rate; /* F/W operating speed */ 2519 uint16_t link_data_rate; /* F/W operating speed */
2499 2520
@@ -2515,6 +2536,8 @@ struct qla_hw_data {
2515#define PCI_DEVICE_ID_QLOGIC_ISP2532 0x2532 2536#define PCI_DEVICE_ID_QLOGIC_ISP2532 0x2532
2516#define PCI_DEVICE_ID_QLOGIC_ISP8432 0x8432 2537#define PCI_DEVICE_ID_QLOGIC_ISP8432 0x8432
2517#define PCI_DEVICE_ID_QLOGIC_ISP8001 0x8001 2538#define PCI_DEVICE_ID_QLOGIC_ISP8001 0x8001
2539#define PCI_DEVICE_ID_QLOGIC_ISP8031 0x8031
2540#define PCI_DEVICE_ID_QLOGIC_ISP2031 0x2031
2518 uint32_t device_type; 2541 uint32_t device_type;
2519#define DT_ISP2100 BIT_0 2542#define DT_ISP2100 BIT_0
2520#define DT_ISP2200 BIT_1 2543#define DT_ISP2200 BIT_1
@@ -2531,7 +2554,9 @@ struct qla_hw_data {
2531#define DT_ISP8432 BIT_12 2554#define DT_ISP8432 BIT_12
2532#define DT_ISP8001 BIT_13 2555#define DT_ISP8001 BIT_13
2533#define DT_ISP8021 BIT_14 2556#define DT_ISP8021 BIT_14
2534#define DT_ISP_LAST (DT_ISP8021 << 1) 2557#define DT_ISP2031 BIT_15
2558#define DT_ISP8031 BIT_16
2559#define DT_ISP_LAST (DT_ISP8031 << 1)
2535 2560
2536#define DT_T10_PI BIT_25 2561#define DT_T10_PI BIT_25
2537#define DT_IIDMA BIT_26 2562#define DT_IIDMA BIT_26
@@ -2555,26 +2580,30 @@ struct qla_hw_data {
2555#define IS_QLA2532(ha) (DT_MASK(ha) & DT_ISP2532) 2580#define IS_QLA2532(ha) (DT_MASK(ha) & DT_ISP2532)
2556#define IS_QLA8432(ha) (DT_MASK(ha) & DT_ISP8432) 2581#define IS_QLA8432(ha) (DT_MASK(ha) & DT_ISP8432)
2557#define IS_QLA8001(ha) (DT_MASK(ha) & DT_ISP8001) 2582#define IS_QLA8001(ha) (DT_MASK(ha) & DT_ISP8001)
2583#define IS_QLA81XX(ha) (IS_QLA8001(ha))
2558#define IS_QLA82XX(ha) (DT_MASK(ha) & DT_ISP8021) 2584#define IS_QLA82XX(ha) (DT_MASK(ha) & DT_ISP8021)
2585#define IS_QLA2031(ha) (DT_MASK(ha) & DT_ISP2031)
2586#define IS_QLA8031(ha) (DT_MASK(ha) & DT_ISP8031)
2559 2587
2560#define IS_QLA23XX(ha) (IS_QLA2300(ha) || IS_QLA2312(ha) || IS_QLA2322(ha) || \ 2588#define IS_QLA23XX(ha) (IS_QLA2300(ha) || IS_QLA2312(ha) || IS_QLA2322(ha) || \
2561 IS_QLA6312(ha) || IS_QLA6322(ha)) 2589 IS_QLA6312(ha) || IS_QLA6322(ha))
2562#define IS_QLA24XX(ha) (IS_QLA2422(ha) || IS_QLA2432(ha)) 2590#define IS_QLA24XX(ha) (IS_QLA2422(ha) || IS_QLA2432(ha))
2563#define IS_QLA54XX(ha) (IS_QLA5422(ha) || IS_QLA5432(ha)) 2591#define IS_QLA54XX(ha) (IS_QLA5422(ha) || IS_QLA5432(ha))
2564#define IS_QLA25XX(ha) (IS_QLA2532(ha)) 2592#define IS_QLA25XX(ha) (IS_QLA2532(ha))
2593#define IS_QLA83XX(ha) (IS_QLA2031(ha) || IS_QLA8031(ha))
2565#define IS_QLA84XX(ha) (IS_QLA8432(ha)) 2594#define IS_QLA84XX(ha) (IS_QLA8432(ha))
2566#define IS_QLA24XX_TYPE(ha) (IS_QLA24XX(ha) || IS_QLA54XX(ha) || \ 2595#define IS_QLA24XX_TYPE(ha) (IS_QLA24XX(ha) || IS_QLA54XX(ha) || \
2567 IS_QLA84XX(ha)) 2596 IS_QLA84XX(ha))
2568#define IS_QLA81XX(ha) (IS_QLA8001(ha)) 2597#define IS_CNA_CAPABLE(ha) (IS_QLA81XX(ha) || IS_QLA82XX(ha) || \
2569#define IS_QLA8XXX_TYPE(ha) (IS_QLA81XX(ha) || IS_QLA82XX(ha)) 2598 IS_QLA8031(ha))
2570#define IS_QLA2XXX_MIDTYPE(ha) (IS_QLA24XX(ha) || IS_QLA84XX(ha) || \ 2599#define IS_QLA2XXX_MIDTYPE(ha) (IS_QLA24XX(ha) || IS_QLA84XX(ha) || \
2571 IS_QLA25XX(ha) || IS_QLA81XX(ha) || \ 2600 IS_QLA25XX(ha) || IS_QLA81XX(ha) || \
2572 IS_QLA82XX(ha)) 2601 IS_QLA82XX(ha) || IS_QLA83XX(ha))
2573#define IS_MSIX_NACK_CAPABLE(ha) (IS_QLA81XX(ha)) 2602#define IS_MSIX_NACK_CAPABLE(ha) (IS_QLA81XX(ha) || IS_QLA83XX(ha))
2574#define IS_NOPOLLING_TYPE(ha) ((IS_QLA25XX(ha) || IS_QLA81XX(ha)) && \ 2603#define IS_NOPOLLING_TYPE(ha) ((IS_QLA25XX(ha) || IS_QLA81XX(ha) || \
2575 (ha)->flags.msix_enabled) 2604 IS_QLA83XX(ha)) && (ha)->flags.msix_enabled)
2576#define IS_FAC_REQUIRED(ha) (IS_QLA81XX(ha)) 2605#define IS_FAC_REQUIRED(ha) (IS_QLA81XX(ha) || IS_QLA83XX(ha))
2577#define IS_NOCACHE_VPD_TYPE(ha) (IS_QLA81XX(ha)) 2606#define IS_NOCACHE_VPD_TYPE(ha) (IS_QLA81XX(ha) || IS_QLA83XX(ha))
2578#define IS_ALOGIO_CAPABLE(ha) (IS_QLA23XX(ha) || IS_FWI2_CAPABLE(ha)) 2607#define IS_ALOGIO_CAPABLE(ha) (IS_QLA23XX(ha) || IS_FWI2_CAPABLE(ha))
2579 2608
2580#define IS_T10_PI_CAPABLE(ha) ((ha)->device_type & DT_T10_PI) 2609#define IS_T10_PI_CAPABLE(ha) ((ha)->device_type & DT_T10_PI)
@@ -2583,6 +2612,8 @@ struct qla_hw_data {
2583#define IS_ZIO_SUPPORTED(ha) ((ha)->device_type & DT_ZIO_SUPPORTED) 2612#define IS_ZIO_SUPPORTED(ha) ((ha)->device_type & DT_ZIO_SUPPORTED)
2584#define IS_OEM_001(ha) ((ha)->device_type & DT_OEM_001) 2613#define IS_OEM_001(ha) ((ha)->device_type & DT_OEM_001)
2585#define HAS_EXTENDED_IDS(ha) ((ha)->device_type & DT_EXTENDED_IDS) 2614#define HAS_EXTENDED_IDS(ha) ((ha)->device_type & DT_EXTENDED_IDS)
2615#define IS_CT6_SUPPORTED(ha) ((ha)->device_type & DT_CT6_SUPPORTED)
2616#define IS_MQUE_CAPABLE(ha) ((ha)->mqenable || IS_QLA83XX(ha))
2586 2617
2587 /* HBA serial number */ 2618 /* HBA serial number */
2588 uint8_t serial0; 2619 uint8_t serial0;
@@ -2621,10 +2652,6 @@ struct qla_hw_data {
2621 void *sfp_data; 2652 void *sfp_data;
2622 dma_addr_t sfp_data_dma; 2653 dma_addr_t sfp_data_dma;
2623 2654
2624 uint8_t *edc_data;
2625 dma_addr_t edc_data_dma;
2626 uint16_t edc_data_len;
2627
2628#define XGMAC_DATA_SIZE 4096 2655#define XGMAC_DATA_SIZE 4096
2629 void *xgmac_data; 2656 void *xgmac_data;
2630 dma_addr_t xgmac_data_dma; 2657 dma_addr_t xgmac_data_dma;
@@ -2653,6 +2680,8 @@ struct qla_hw_data {
2653 void *async_pd; 2680 void *async_pd;
2654 dma_addr_t async_pd_dma; 2681 dma_addr_t async_pd_dma;
2655 2682
2683 void *swl;
2684
2656 /* These are used by mailbox operations. */ 2685 /* These are used by mailbox operations. */
2657 volatile uint16_t mailbox_out[MAILBOX_REGISTER_COUNT]; 2686 volatile uint16_t mailbox_out[MAILBOX_REGISTER_COUNT];
2658 2687
@@ -2674,6 +2703,8 @@ struct qla_hw_data {
2674 uint16_t fw_minor_version; 2703 uint16_t fw_minor_version;
2675 uint16_t fw_subminor_version; 2704 uint16_t fw_subminor_version;
2676 uint16_t fw_attributes; 2705 uint16_t fw_attributes;
2706 uint16_t fw_attributes_h;
2707 uint16_t fw_attributes_ext[2];
2677 uint32_t fw_memory_size; 2708 uint32_t fw_memory_size;
2678 uint32_t fw_transfer_size; 2709 uint32_t fw_transfer_size;
2679 uint32_t fw_srisc_address; 2710 uint32_t fw_srisc_address;
@@ -2851,7 +2882,6 @@ typedef struct scsi_qla_host {
2851 volatile struct { 2882 volatile struct {
2852 uint32_t init_done :1; 2883 uint32_t init_done :1;
2853 uint32_t online :1; 2884 uint32_t online :1;
2854 uint32_t rscn_queue_overflow :1;
2855 uint32_t reset_active :1; 2885 uint32_t reset_active :1;
2856 2886
2857 uint32_t management_server_logged_in :1; 2887 uint32_t management_server_logged_in :1;
@@ -2905,11 +2935,6 @@ typedef struct scsi_qla_host {
2905 2935
2906 2936
2907 2937
2908 /* RSCN queue. */
2909 uint32_t rscn_queue[MAX_RSCN_COUNT];
2910 uint8_t rscn_in_ptr;
2911 uint8_t rscn_out_ptr;
2912
2913 /* Timeout timers. */ 2938 /* Timeout timers. */
2914 uint8_t loop_down_abort_time; /* port down timer */ 2939 uint8_t loop_down_abort_time; /* port down timer */
2915 atomic_t loop_down_timer; /* loop down timer */ 2940 atomic_t loop_down_timer; /* loop down timer */
@@ -3005,7 +3030,6 @@ typedef struct scsi_qla_host {
3005#define QLA_ABORTED 0x105 3030#define QLA_ABORTED 0x105
3006#define QLA_SUSPENDED 0x106 3031#define QLA_SUSPENDED 0x106
3007#define QLA_BUSY 0x107 3032#define QLA_BUSY 0x107
3008#define QLA_RSCNS_HANDLED 0x108
3009#define QLA_ALREADY_REGISTERED 0x109 3033#define QLA_ALREADY_REGISTERED 0x109
3010 3034
3011#define NVRAM_DELAY() udelay(10) 3035#define NVRAM_DELAY() udelay(10)
@@ -3021,6 +3045,7 @@ typedef struct scsi_qla_host {
3021#define OPTROM_SIZE_25XX 0x200000 3045#define OPTROM_SIZE_25XX 0x200000
3022#define OPTROM_SIZE_81XX 0x400000 3046#define OPTROM_SIZE_81XX 0x400000
3023#define OPTROM_SIZE_82XX 0x800000 3047#define OPTROM_SIZE_82XX 0x800000
3048#define OPTROM_SIZE_83XX 0x1000000
3024 3049
3025#define OPTROM_BURST_SIZE 0x1000 3050#define OPTROM_BURST_SIZE 0x1000
3026#define OPTROM_BURST_DWORDS (OPTROM_BURST_SIZE / 4) 3051#define OPTROM_BURST_DWORDS (OPTROM_BURST_SIZE / 4)
diff --git a/drivers/scsi/qla2xxx/qla_dfs.c b/drivers/scsi/qla2xxx/qla_dfs.c
index 0b4c2b794c6f..499c74e39ee5 100644
--- a/drivers/scsi/qla2xxx/qla_dfs.c
+++ b/drivers/scsi/qla2xxx/qla_dfs.c
@@ -114,7 +114,7 @@ qla2x00_dfs_setup(scsi_qla_host_t *vha)
114{ 114{
115 struct qla_hw_data *ha = vha->hw; 115 struct qla_hw_data *ha = vha->hw;
116 116
117 if (!IS_QLA25XX(ha) && !IS_QLA81XX(ha)) 117 if (!IS_QLA25XX(ha) && !IS_QLA81XX(ha) && !IS_QLA83XX(ha))
118 goto out; 118 goto out;
119 if (!ha->fce) 119 if (!ha->fce)
120 goto out; 120 goto out;
diff --git a/drivers/scsi/qla2xxx/qla_fw.h b/drivers/scsi/qla2xxx/qla_fw.h
index aa69486dc064..6d7d7758c797 100644
--- a/drivers/scsi/qla2xxx/qla_fw.h
+++ b/drivers/scsi/qla2xxx/qla_fw.h
@@ -1327,6 +1327,11 @@ struct qla_flt_header {
1327#define FLT_REG_GOLD_FW 0x2f 1327#define FLT_REG_GOLD_FW 0x2f
1328#define FLT_REG_FCP_PRIO_0 0x87 1328#define FLT_REG_FCP_PRIO_0 0x87
1329#define FLT_REG_FCP_PRIO_1 0x88 1329#define FLT_REG_FCP_PRIO_1 0x88
1330#define FLT_REG_FCOE_FW 0xA4
1331#define FLT_REG_FCOE_VPD_0 0xA9
1332#define FLT_REG_FCOE_NVRAM_0 0xAA
1333#define FLT_REG_FCOE_VPD_1 0xAB
1334#define FLT_REG_FCOE_NVRAM_1 0xAC
1330 1335
1331struct qla_flt_region { 1336struct qla_flt_region {
1332 uint32_t code; 1337 uint32_t code;
@@ -1494,6 +1499,11 @@ struct access_chip_rsp_84xx {
1494#define MBC_GET_XGMAC_STATS 0x7a 1499#define MBC_GET_XGMAC_STATS 0x7a
1495#define MBC_GET_DCBX_PARAMS 0x51 1500#define MBC_GET_DCBX_PARAMS 0x51
1496 1501
1502/*
1503 * ISP83xx mailbox commands
1504 */
1505#define MBC_WRITE_REMOTE_REG 0x0001 /* Write remote register */
1506
1497/* Flash access control option field bit definitions */ 1507/* Flash access control option field bit definitions */
1498#define FAC_OPT_FORCE_SEMAPHORE BIT_15 1508#define FAC_OPT_FORCE_SEMAPHORE BIT_15
1499#define FAC_OPT_REQUESTOR_ID BIT_14 1509#define FAC_OPT_REQUESTOR_ID BIT_14
@@ -1875,4 +1885,7 @@ struct qla_fcp_prio_cfg {
1875#define FA_NPIV_CONF0_ADDR_81 0xD1000 1885#define FA_NPIV_CONF0_ADDR_81 0xD1000
1876#define FA_NPIV_CONF1_ADDR_81 0xD2000 1886#define FA_NPIV_CONF1_ADDR_81 0xD2000
1877 1887
1888/* 83XX Flash locations -- occupies second 8MB region. */
1889#define FA_FLASH_LAYOUT_ADDR_83 0xFC400
1890
1878#endif 1891#endif
diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h
index 408679be8fdf..9f065804bd12 100644
--- a/drivers/scsi/qla2xxx/qla_gbl.h
+++ b/drivers/scsi/qla2xxx/qla_gbl.h
@@ -71,8 +71,6 @@ extern void qla2x00_async_logout_done(struct scsi_qla_host *, fc_port_t *,
71 uint16_t *); 71 uint16_t *);
72extern void qla2x00_async_adisc_done(struct scsi_qla_host *, fc_port_t *, 72extern void qla2x00_async_adisc_done(struct scsi_qla_host *, fc_port_t *,
73 uint16_t *); 73 uint16_t *);
74extern void qla2x00_async_tm_cmd_done(struct scsi_qla_host *, fc_port_t *,
75 struct srb_iocb *);
76extern void *qla2x00_alloc_iocbs(struct scsi_qla_host *, srb_t *); 74extern void *qla2x00_alloc_iocbs(struct scsi_qla_host *, srb_t *);
77extern int qla24xx_update_fcport_fcp_prio(scsi_qla_host_t *, fc_port_t *); 75extern int qla24xx_update_fcport_fcp_prio(scsi_qla_host_t *, fc_port_t *);
78 76
@@ -156,8 +154,7 @@ extern void qla2x00_do_dpc_all_vps(scsi_qla_host_t *);
156extern int qla24xx_vport_create_req_sanity_check(struct fc_vport *); 154extern int qla24xx_vport_create_req_sanity_check(struct fc_vport *);
157extern scsi_qla_host_t * qla24xx_create_vhost(struct fc_vport *); 155extern scsi_qla_host_t * qla24xx_create_vhost(struct fc_vport *);
158 156
159extern void qla2x00_sp_compl(struct qla_hw_data *, srb_t *); 157extern void qla2x00_sp_free_dma(void *, void *);
160
161extern char *qla2x00_get_fw_version_str(struct scsi_qla_host *, char *); 158extern char *qla2x00_get_fw_version_str(struct scsi_qla_host *, char *);
162 159
163extern void qla2x00_mark_device_lost(scsi_qla_host_t *, fc_port_t *, int, int); 160extern void qla2x00_mark_device_lost(scsi_qla_host_t *, fc_port_t *, int, int);
@@ -205,8 +202,7 @@ extern int
205qla2x00_execute_fw(scsi_qla_host_t *, uint32_t); 202qla2x00_execute_fw(scsi_qla_host_t *, uint32_t);
206 203
207extern int 204extern int
208qla2x00_get_fw_version(scsi_qla_host_t *, uint16_t *, uint16_t *, uint16_t *, 205qla2x00_get_fw_version(scsi_qla_host_t *);
209 uint16_t *, uint32_t *, uint8_t *, uint32_t *, uint8_t *);
210 206
211extern int 207extern int
212qla2x00_get_fw_options(scsi_qla_host_t *, uint16_t *); 208qla2x00_get_fw_options(scsi_qla_host_t *, uint16_t *);
@@ -371,6 +367,9 @@ qla81xx_get_port_config(scsi_qla_host_t *, uint16_t *);
371extern int 367extern int
372qla81xx_set_port_config(scsi_qla_host_t *, uint16_t *); 368qla81xx_set_port_config(scsi_qla_host_t *, uint16_t *);
373 369
370extern int
371qla2x00_port_logout(scsi_qla_host_t *, struct fc_port *);
372
374/* 373/*
375 * Global Function Prototypes in qla_isr.c source file. 374 * Global Function Prototypes in qla_isr.c source file.
376 */ 375 */
@@ -409,8 +408,10 @@ extern void qla2x00_beacon_blink(struct scsi_qla_host *);
409extern int qla24xx_beacon_on(struct scsi_qla_host *); 408extern int qla24xx_beacon_on(struct scsi_qla_host *);
410extern int qla24xx_beacon_off(struct scsi_qla_host *); 409extern int qla24xx_beacon_off(struct scsi_qla_host *);
411extern void qla24xx_beacon_blink(struct scsi_qla_host *); 410extern void qla24xx_beacon_blink(struct scsi_qla_host *);
411extern void qla83xx_beacon_blink(struct scsi_qla_host *);
412extern int qla82xx_beacon_on(struct scsi_qla_host *); 412extern int qla82xx_beacon_on(struct scsi_qla_host *);
413extern int qla82xx_beacon_off(struct scsi_qla_host *); 413extern int qla82xx_beacon_off(struct scsi_qla_host *);
414extern int qla83xx_write_remote_reg(struct scsi_qla_host *, uint32_t, uint32_t);
414 415
415extern uint8_t *qla2x00_read_optrom_data(struct scsi_qla_host *, uint8_t *, 416extern uint8_t *qla2x00_read_optrom_data(struct scsi_qla_host *, uint8_t *,
416 uint32_t, uint32_t); 417 uint32_t, uint32_t);
@@ -541,6 +542,10 @@ extern int qla82xx_restart_isp(scsi_qla_host_t *);
541 542
542/* IOCB related functions */ 543/* IOCB related functions */
543extern int qla82xx_start_scsi(srb_t *); 544extern int qla82xx_start_scsi(srb_t *);
545extern void qla2x00_sp_free(void *, void *);
546extern void qla2x00_sp_timeout(unsigned long);
547extern void qla2x00_bsg_job_done(void *, void *, int);
548extern void qla2x00_bsg_sp_free(void *, void *);
544 549
545/* Interrupt related */ 550/* Interrupt related */
546extern irqreturn_t qla82xx_intr_handler(int, void *); 551extern irqreturn_t qla82xx_intr_handler(int, void *);
@@ -576,6 +581,8 @@ extern void qla82xx_start_iocbs(scsi_qla_host_t *);
576extern int qla82xx_fcoe_ctx_reset(scsi_qla_host_t *); 581extern int qla82xx_fcoe_ctx_reset(scsi_qla_host_t *);
577extern int qla82xx_check_md_needed(scsi_qla_host_t *); 582extern int qla82xx_check_md_needed(scsi_qla_host_t *);
578extern void qla82xx_chip_reset_cleanup(scsi_qla_host_t *); 583extern void qla82xx_chip_reset_cleanup(scsi_qla_host_t *);
584extern int qla81xx_set_led_config(scsi_qla_host_t *, uint16_t *);
585extern int qla81xx_get_led_config(scsi_qla_host_t *, uint16_t *);
579extern int qla82xx_mbx_beacon_ctl(scsi_qla_host_t *, int); 586extern int qla82xx_mbx_beacon_ctl(scsi_qla_host_t *, int);
580extern char *qdev_state(uint32_t); 587extern char *qdev_state(uint32_t);
581extern void qla82xx_clear_pending_mbx(scsi_qla_host_t *); 588extern void qla82xx_clear_pending_mbx(scsi_qla_host_t *);
@@ -589,6 +596,9 @@ extern int qla2x00_issue_iocb_timeout(scsi_qla_host_t *, void *,
589extern int qla2x00_get_idma_speed(scsi_qla_host_t *, uint16_t, 596extern int qla2x00_get_idma_speed(scsi_qla_host_t *, uint16_t,
590 uint16_t *, uint16_t *); 597 uint16_t *, uint16_t *);
591 598
599/* 83xx related functions */
600extern void qla83xx_fw_dump(scsi_qla_host_t *, int);
601
592/* Minidump related functions */ 602/* Minidump related functions */
593extern int qla82xx_md_get_template_size(scsi_qla_host_t *); 603extern int qla82xx_md_get_template_size(scsi_qla_host_t *);
594extern int qla82xx_md_get_template(scsi_qla_host_t *); 604extern int qla82xx_md_get_template(scsi_qla_host_t *);
diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c
index 4aea4ae23300..3128f80441f5 100644
--- a/drivers/scsi/qla2xxx/qla_gs.c
+++ b/drivers/scsi/qla2xxx/qla_gs.c
@@ -240,6 +240,12 @@ qla2x00_ga_nxt(scsi_qla_host_t *vha, fc_port_t *fcport)
240 return (rval); 240 return (rval);
241} 241}
242 242
243static inline int
244qla2x00_gid_pt_rsp_size(scsi_qla_host_t *vha)
245{
246 return vha->hw->max_fibre_devices * 4 + 16;
247}
248
243/** 249/**
244 * qla2x00_gid_pt() - SNS scan for fabric devices via GID_PT command. 250 * qla2x00_gid_pt() - SNS scan for fabric devices via GID_PT command.
245 * @ha: HA context 251 * @ha: HA context
@@ -261,20 +267,21 @@ qla2x00_gid_pt(scsi_qla_host_t *vha, sw_info_t *list)
261 267
262 struct ct_sns_gid_pt_data *gid_data; 268 struct ct_sns_gid_pt_data *gid_data;
263 struct qla_hw_data *ha = vha->hw; 269 struct qla_hw_data *ha = vha->hw;
270 uint16_t gid_pt_rsp_size;
264 271
265 if (IS_QLA2100(ha) || IS_QLA2200(ha)) 272 if (IS_QLA2100(ha) || IS_QLA2200(ha))
266 return qla2x00_sns_gid_pt(vha, list); 273 return qla2x00_sns_gid_pt(vha, list);
267 274
268 gid_data = NULL; 275 gid_data = NULL;
269 276 gid_pt_rsp_size = qla2x00_gid_pt_rsp_size(vha);
270 /* Issue GID_PT */ 277 /* Issue GID_PT */
271 /* Prepare common MS IOCB */ 278 /* Prepare common MS IOCB */
272 ms_pkt = ha->isp_ops->prep_ms_iocb(vha, GID_PT_REQ_SIZE, 279 ms_pkt = ha->isp_ops->prep_ms_iocb(vha, GID_PT_REQ_SIZE,
273 GID_PT_RSP_SIZE); 280 gid_pt_rsp_size);
274 281
275 /* Prepare CT request */ 282 /* Prepare CT request */
276 ct_req = qla2x00_prep_ct_req(&ha->ct_sns->p.req, GID_PT_CMD, 283 ct_req = qla2x00_prep_ct_req(&ha->ct_sns->p.req, GID_PT_CMD,
277 GID_PT_RSP_SIZE); 284 gid_pt_rsp_size);
278 ct_rsp = &ha->ct_sns->p.rsp; 285 ct_rsp = &ha->ct_sns->p.rsp;
279 286
280 /* Prepare CT arguments -- port_type */ 287 /* Prepare CT arguments -- port_type */
@@ -292,7 +299,7 @@ qla2x00_gid_pt(scsi_qla_host_t *vha, sw_info_t *list)
292 rval = QLA_FUNCTION_FAILED; 299 rval = QLA_FUNCTION_FAILED;
293 } else { 300 } else {
294 /* Set port IDs in switch info list. */ 301 /* Set port IDs in switch info list. */
295 for (i = 0; i < MAX_FIBRE_DEVICES; i++) { 302 for (i = 0; i < ha->max_fibre_devices; i++) {
296 gid_data = &ct_rsp->rsp.gid_pt.entries[i]; 303 gid_data = &ct_rsp->rsp.gid_pt.entries[i];
297 list[i].d_id.b.domain = gid_data->port_id[0]; 304 list[i].d_id.b.domain = gid_data->port_id[0];
298 list[i].d_id.b.area = gid_data->port_id[1]; 305 list[i].d_id.b.area = gid_data->port_id[1];
@@ -313,7 +320,7 @@ qla2x00_gid_pt(scsi_qla_host_t *vha, sw_info_t *list)
313 * single call. Return a failed status, and let GA_NXT handle 320 * single call. Return a failed status, and let GA_NXT handle
314 * the overload. 321 * the overload.
315 */ 322 */
316 if (i == MAX_FIBRE_DEVICES) 323 if (i == ha->max_fibre_devices)
317 rval = QLA_FUNCTION_FAILED; 324 rval = QLA_FUNCTION_FAILED;
318 } 325 }
319 326
@@ -330,7 +337,7 @@ qla2x00_gid_pt(scsi_qla_host_t *vha, sw_info_t *list)
330int 337int
331qla2x00_gpn_id(scsi_qla_host_t *vha, sw_info_t *list) 338qla2x00_gpn_id(scsi_qla_host_t *vha, sw_info_t *list)
332{ 339{
333 int rval; 340 int rval = QLA_SUCCESS;
334 uint16_t i; 341 uint16_t i;
335 342
336 ms_iocb_entry_t *ms_pkt; 343 ms_iocb_entry_t *ms_pkt;
@@ -341,7 +348,7 @@ qla2x00_gpn_id(scsi_qla_host_t *vha, sw_info_t *list)
341 if (IS_QLA2100(ha) || IS_QLA2200(ha)) 348 if (IS_QLA2100(ha) || IS_QLA2200(ha))
342 return qla2x00_sns_gpn_id(vha, list); 349 return qla2x00_sns_gpn_id(vha, list);
343 350
344 for (i = 0; i < MAX_FIBRE_DEVICES; i++) { 351 for (i = 0; i < ha->max_fibre_devices; i++) {
345 /* Issue GPN_ID */ 352 /* Issue GPN_ID */
346 /* Prepare common MS IOCB */ 353 /* Prepare common MS IOCB */
347 ms_pkt = ha->isp_ops->prep_ms_iocb(vha, GPN_ID_REQ_SIZE, 354 ms_pkt = ha->isp_ops->prep_ms_iocb(vha, GPN_ID_REQ_SIZE,
@@ -364,9 +371,11 @@ qla2x00_gpn_id(scsi_qla_host_t *vha, sw_info_t *list)
364 /*EMPTY*/ 371 /*EMPTY*/
365 ql_dbg(ql_dbg_disc, vha, 0x2056, 372 ql_dbg(ql_dbg_disc, vha, 0x2056,
366 "GPN_ID issue IOCB failed (%d).\n", rval); 373 "GPN_ID issue IOCB failed (%d).\n", rval);
374 break;
367 } else if (qla2x00_chk_ms_status(vha, ms_pkt, ct_rsp, 375 } else if (qla2x00_chk_ms_status(vha, ms_pkt, ct_rsp,
368 "GPN_ID") != QLA_SUCCESS) { 376 "GPN_ID") != QLA_SUCCESS) {
369 rval = QLA_FUNCTION_FAILED; 377 rval = QLA_FUNCTION_FAILED;
378 break;
370 } else { 379 } else {
371 /* Save portname */ 380 /* Save portname */
372 memcpy(list[i].port_name, 381 memcpy(list[i].port_name,
@@ -391,7 +400,7 @@ qla2x00_gpn_id(scsi_qla_host_t *vha, sw_info_t *list)
391int 400int
392qla2x00_gnn_id(scsi_qla_host_t *vha, sw_info_t *list) 401qla2x00_gnn_id(scsi_qla_host_t *vha, sw_info_t *list)
393{ 402{
394 int rval; 403 int rval = QLA_SUCCESS;
395 uint16_t i; 404 uint16_t i;
396 struct qla_hw_data *ha = vha->hw; 405 struct qla_hw_data *ha = vha->hw;
397 ms_iocb_entry_t *ms_pkt; 406 ms_iocb_entry_t *ms_pkt;
@@ -401,7 +410,7 @@ qla2x00_gnn_id(scsi_qla_host_t *vha, sw_info_t *list)
401 if (IS_QLA2100(ha) || IS_QLA2200(ha)) 410 if (IS_QLA2100(ha) || IS_QLA2200(ha))
402 return qla2x00_sns_gnn_id(vha, list); 411 return qla2x00_sns_gnn_id(vha, list);
403 412
404 for (i = 0; i < MAX_FIBRE_DEVICES; i++) { 413 for (i = 0; i < ha->max_fibre_devices; i++) {
405 /* Issue GNN_ID */ 414 /* Issue GNN_ID */
406 /* Prepare common MS IOCB */ 415 /* Prepare common MS IOCB */
407 ms_pkt = ha->isp_ops->prep_ms_iocb(vha, GNN_ID_REQ_SIZE, 416 ms_pkt = ha->isp_ops->prep_ms_iocb(vha, GNN_ID_REQ_SIZE,
@@ -424,9 +433,11 @@ qla2x00_gnn_id(scsi_qla_host_t *vha, sw_info_t *list)
424 /*EMPTY*/ 433 /*EMPTY*/
425 ql_dbg(ql_dbg_disc, vha, 0x2057, 434 ql_dbg(ql_dbg_disc, vha, 0x2057,
426 "GNN_ID issue IOCB failed (%d).\n", rval); 435 "GNN_ID issue IOCB failed (%d).\n", rval);
436 break;
427 } else if (qla2x00_chk_ms_status(vha, ms_pkt, ct_rsp, 437 } else if (qla2x00_chk_ms_status(vha, ms_pkt, ct_rsp,
428 "GNN_ID") != QLA_SUCCESS) { 438 "GNN_ID") != QLA_SUCCESS) {
429 rval = QLA_FUNCTION_FAILED; 439 rval = QLA_FUNCTION_FAILED;
440 break;
430 } else { 441 } else {
431 /* Save nodename */ 442 /* Save nodename */
432 memcpy(list[i].node_name, 443 memcpy(list[i].node_name,
@@ -735,7 +746,7 @@ qla2x00_prep_sns_cmd(scsi_qla_host_t *vha, uint16_t cmd, uint16_t scmd_len,
735static int 746static int
736qla2x00_sns_ga_nxt(scsi_qla_host_t *vha, fc_port_t *fcport) 747qla2x00_sns_ga_nxt(scsi_qla_host_t *vha, fc_port_t *fcport)
737{ 748{
738 int rval; 749 int rval = QLA_SUCCESS;
739 struct qla_hw_data *ha = vha->hw; 750 struct qla_hw_data *ha = vha->hw;
740 struct sns_cmd_pkt *sns_cmd; 751 struct sns_cmd_pkt *sns_cmd;
741 752
@@ -814,11 +825,14 @@ qla2x00_sns_gid_pt(scsi_qla_host_t *vha, sw_info_t *list)
814 uint16_t i; 825 uint16_t i;
815 uint8_t *entry; 826 uint8_t *entry;
816 struct sns_cmd_pkt *sns_cmd; 827 struct sns_cmd_pkt *sns_cmd;
828 uint16_t gid_pt_sns_data_size;
829
830 gid_pt_sns_data_size = qla2x00_gid_pt_rsp_size(vha);
817 831
818 /* Issue GID_PT. */ 832 /* Issue GID_PT. */
819 /* Prepare SNS command request. */ 833 /* Prepare SNS command request. */
820 sns_cmd = qla2x00_prep_sns_cmd(vha, GID_PT_CMD, GID_PT_SNS_SCMD_LEN, 834 sns_cmd = qla2x00_prep_sns_cmd(vha, GID_PT_CMD, GID_PT_SNS_SCMD_LEN,
821 GID_PT_SNS_DATA_SIZE); 835 gid_pt_sns_data_size);
822 836
823 /* Prepare SNS command arguments -- port_type. */ 837 /* Prepare SNS command arguments -- port_type. */
824 sns_cmd->p.cmd.param[0] = NS_NX_PORT_TYPE; 838 sns_cmd->p.cmd.param[0] = NS_NX_PORT_TYPE;
@@ -839,7 +853,7 @@ qla2x00_sns_gid_pt(scsi_qla_host_t *vha, sw_info_t *list)
839 rval = QLA_FUNCTION_FAILED; 853 rval = QLA_FUNCTION_FAILED;
840 } else { 854 } else {
841 /* Set port IDs in switch info list. */ 855 /* Set port IDs in switch info list. */
842 for (i = 0; i < MAX_FIBRE_DEVICES; i++) { 856 for (i = 0; i < ha->max_fibre_devices; i++) {
843 entry = &sns_cmd->p.gid_data[(i * 4) + 16]; 857 entry = &sns_cmd->p.gid_data[(i * 4) + 16];
844 list[i].d_id.b.domain = entry[1]; 858 list[i].d_id.b.domain = entry[1];
845 list[i].d_id.b.area = entry[2]; 859 list[i].d_id.b.area = entry[2];
@@ -858,7 +872,7 @@ qla2x00_sns_gid_pt(scsi_qla_host_t *vha, sw_info_t *list)
858 * single call. Return a failed status, and let GA_NXT handle 872 * single call. Return a failed status, and let GA_NXT handle
859 * the overload. 873 * the overload.
860 */ 874 */
861 if (i == MAX_FIBRE_DEVICES) 875 if (i == ha->max_fibre_devices)
862 rval = QLA_FUNCTION_FAILED; 876 rval = QLA_FUNCTION_FAILED;
863 } 877 }
864 878
@@ -877,12 +891,12 @@ qla2x00_sns_gid_pt(scsi_qla_host_t *vha, sw_info_t *list)
877static int 891static int
878qla2x00_sns_gpn_id(scsi_qla_host_t *vha, sw_info_t *list) 892qla2x00_sns_gpn_id(scsi_qla_host_t *vha, sw_info_t *list)
879{ 893{
880 int rval; 894 int rval = QLA_SUCCESS;
881 struct qla_hw_data *ha = vha->hw; 895 struct qla_hw_data *ha = vha->hw;
882 uint16_t i; 896 uint16_t i;
883 struct sns_cmd_pkt *sns_cmd; 897 struct sns_cmd_pkt *sns_cmd;
884 898
885 for (i = 0; i < MAX_FIBRE_DEVICES; i++) { 899 for (i = 0; i < ha->max_fibre_devices; i++) {
886 /* Issue GPN_ID */ 900 /* Issue GPN_ID */
887 /* Prepare SNS command request. */ 901 /* Prepare SNS command request. */
888 sns_cmd = qla2x00_prep_sns_cmd(vha, GPN_ID_CMD, 902 sns_cmd = qla2x00_prep_sns_cmd(vha, GPN_ID_CMD,
@@ -933,12 +947,12 @@ qla2x00_sns_gpn_id(scsi_qla_host_t *vha, sw_info_t *list)
933static int 947static int
934qla2x00_sns_gnn_id(scsi_qla_host_t *vha, sw_info_t *list) 948qla2x00_sns_gnn_id(scsi_qla_host_t *vha, sw_info_t *list)
935{ 949{
936 int rval; 950 int rval = QLA_SUCCESS;
937 struct qla_hw_data *ha = vha->hw; 951 struct qla_hw_data *ha = vha->hw;
938 uint16_t i; 952 uint16_t i;
939 struct sns_cmd_pkt *sns_cmd; 953 struct sns_cmd_pkt *sns_cmd;
940 954
941 for (i = 0; i < MAX_FIBRE_DEVICES; i++) { 955 for (i = 0; i < ha->max_fibre_devices; i++) {
942 /* Issue GNN_ID */ 956 /* Issue GNN_ID */
943 /* Prepare SNS command request. */ 957 /* Prepare SNS command request. */
944 sns_cmd = qla2x00_prep_sns_cmd(vha, GNN_ID_CMD, 958 sns_cmd = qla2x00_prep_sns_cmd(vha, GNN_ID_CMD,
@@ -1107,20 +1121,26 @@ qla2x00_sns_rnn_id(scsi_qla_host_t *vha)
1107static int 1121static int
1108qla2x00_mgmt_svr_login(scsi_qla_host_t *vha) 1122qla2x00_mgmt_svr_login(scsi_qla_host_t *vha)
1109{ 1123{
1110 int ret; 1124 int ret, rval;
1111 uint16_t mb[MAILBOX_REGISTER_COUNT]; 1125 uint16_t mb[MAILBOX_REGISTER_COUNT];
1112 struct qla_hw_data *ha = vha->hw; 1126 struct qla_hw_data *ha = vha->hw;
1113 ret = QLA_SUCCESS; 1127 ret = QLA_SUCCESS;
1114 if (vha->flags.management_server_logged_in) 1128 if (vha->flags.management_server_logged_in)
1115 return ret; 1129 return ret;
1116 1130
1117 ha->isp_ops->fabric_login(vha, vha->mgmt_svr_loop_id, 0xff, 0xff, 0xfa, 1131 rval = ha->isp_ops->fabric_login(vha, vha->mgmt_svr_loop_id, 0xff, 0xff,
1118 mb, BIT_1|BIT_0); 1132 0xfa, mb, BIT_1|BIT_0);
1119 if (mb[0] != MBS_COMMAND_COMPLETE) { 1133 if (rval != QLA_SUCCESS || mb[0] != MBS_COMMAND_COMPLETE) {
1120 ql_dbg(ql_dbg_disc, vha, 0x2024, 1134 if (rval == QLA_MEMORY_ALLOC_FAILED)
1121 "Failed management_server login: loopid=%x mb[0]=%x " 1135 ql_dbg(ql_dbg_disc, vha, 0x2085,
1122 "mb[1]=%x mb[2]=%x mb[6]=%x mb[7]=%x.\n", 1136 "Failed management_server login: loopid=%x "
1123 vha->mgmt_svr_loop_id, mb[0], mb[1], mb[2], mb[6], mb[7]); 1137 "rval=%d\n", vha->mgmt_svr_loop_id, rval);
1138 else
1139 ql_dbg(ql_dbg_disc, vha, 0x2024,
1140 "Failed management_server login: loopid=%x "
1141 "mb[0]=%x mb[1]=%x mb[2]=%x mb[6]=%x mb[7]=%x.\n",
1142 vha->mgmt_svr_loop_id, mb[0], mb[1], mb[2], mb[6],
1143 mb[7]);
1124 ret = QLA_FUNCTION_FAILED; 1144 ret = QLA_FUNCTION_FAILED;
1125 } else 1145 } else
1126 vha->flags.management_server_logged_in = 1; 1146 vha->flags.management_server_logged_in = 1;
@@ -1547,7 +1567,7 @@ qla2x00_fdmi_rpa(scsi_qla_host_t *vha)
1547 eiter = (struct ct_fdmi_port_attr *) (entries + size); 1567 eiter = (struct ct_fdmi_port_attr *) (entries + size);
1548 eiter->type = __constant_cpu_to_be16(FDMI_PORT_SUPPORT_SPEED); 1568 eiter->type = __constant_cpu_to_be16(FDMI_PORT_SUPPORT_SPEED);
1549 eiter->len = __constant_cpu_to_be16(4 + 4); 1569 eiter->len = __constant_cpu_to_be16(4 + 4);
1550 if (IS_QLA8XXX_TYPE(ha)) 1570 if (IS_CNA_CAPABLE(ha))
1551 eiter->a.sup_speed = __constant_cpu_to_be32( 1571 eiter->a.sup_speed = __constant_cpu_to_be32(
1552 FDMI_PORT_SPEED_10GB); 1572 FDMI_PORT_SPEED_10GB);
1553 else if (IS_QLA25XX(ha)) 1573 else if (IS_QLA25XX(ha))
@@ -1594,6 +1614,10 @@ qla2x00_fdmi_rpa(scsi_qla_host_t *vha)
1594 eiter->a.cur_speed = 1614 eiter->a.cur_speed =
1595 __constant_cpu_to_be32(FDMI_PORT_SPEED_10GB); 1615 __constant_cpu_to_be32(FDMI_PORT_SPEED_10GB);
1596 break; 1616 break;
1617 case PORT_SPEED_16GB:
1618 eiter->a.cur_speed =
1619 __constant_cpu_to_be32(FDMI_PORT_SPEED_16GB);
1620 break;
1597 default: 1621 default:
1598 eiter->a.cur_speed = 1622 eiter->a.cur_speed =
1599 __constant_cpu_to_be32(FDMI_PORT_SPEED_UNKNOWN); 1623 __constant_cpu_to_be32(FDMI_PORT_SPEED_UNKNOWN);
@@ -1724,7 +1748,7 @@ qla2x00_fdmi_register(scsi_qla_host_t *vha)
1724int 1748int
1725qla2x00_gfpn_id(scsi_qla_host_t *vha, sw_info_t *list) 1749qla2x00_gfpn_id(scsi_qla_host_t *vha, sw_info_t *list)
1726{ 1750{
1727 int rval; 1751 int rval = QLA_SUCCESS;
1728 uint16_t i; 1752 uint16_t i;
1729 struct qla_hw_data *ha = vha->hw; 1753 struct qla_hw_data *ha = vha->hw;
1730 ms_iocb_entry_t *ms_pkt; 1754 ms_iocb_entry_t *ms_pkt;
@@ -1734,7 +1758,7 @@ qla2x00_gfpn_id(scsi_qla_host_t *vha, sw_info_t *list)
1734 if (!IS_IIDMA_CAPABLE(ha)) 1758 if (!IS_IIDMA_CAPABLE(ha))
1735 return QLA_FUNCTION_FAILED; 1759 return QLA_FUNCTION_FAILED;
1736 1760
1737 for (i = 0; i < MAX_FIBRE_DEVICES; i++) { 1761 for (i = 0; i < ha->max_fibre_devices; i++) {
1738 /* Issue GFPN_ID */ 1762 /* Issue GFPN_ID */
1739 /* Prepare common MS IOCB */ 1763 /* Prepare common MS IOCB */
1740 ms_pkt = ha->isp_ops->prep_ms_iocb(vha, GFPN_ID_REQ_SIZE, 1764 ms_pkt = ha->isp_ops->prep_ms_iocb(vha, GFPN_ID_REQ_SIZE,
@@ -1757,9 +1781,11 @@ qla2x00_gfpn_id(scsi_qla_host_t *vha, sw_info_t *list)
1757 /*EMPTY*/ 1781 /*EMPTY*/
1758 ql_dbg(ql_dbg_disc, vha, 0x2023, 1782 ql_dbg(ql_dbg_disc, vha, 0x2023,
1759 "GFPN_ID issue IOCB failed (%d).\n", rval); 1783 "GFPN_ID issue IOCB failed (%d).\n", rval);
1784 break;
1760 } else if (qla2x00_chk_ms_status(vha, ms_pkt, ct_rsp, 1785 } else if (qla2x00_chk_ms_status(vha, ms_pkt, ct_rsp,
1761 "GFPN_ID") != QLA_SUCCESS) { 1786 "GFPN_ID") != QLA_SUCCESS) {
1762 rval = QLA_FUNCTION_FAILED; 1787 rval = QLA_FUNCTION_FAILED;
1788 break;
1763 } else { 1789 } else {
1764 /* Save fabric portname */ 1790 /* Save fabric portname */
1765 memcpy(list[i].fabric_port_name, 1791 memcpy(list[i].fabric_port_name,
@@ -1846,7 +1872,7 @@ qla2x00_gpsc(scsi_qla_host_t *vha, sw_info_t *list)
1846 if (rval) 1872 if (rval)
1847 return rval; 1873 return rval;
1848 1874
1849 for (i = 0; i < MAX_FIBRE_DEVICES; i++) { 1875 for (i = 0; i < ha->max_fibre_devices; i++) {
1850 /* Issue GFPN_ID */ 1876 /* Issue GFPN_ID */
1851 /* Prepare common MS IOCB */ 1877 /* Prepare common MS IOCB */
1852 ms_pkt = qla24xx_prep_ms_fm_iocb(vha, GPSC_REQ_SIZE, 1878 ms_pkt = qla24xx_prep_ms_fm_iocb(vha, GPSC_REQ_SIZE,
@@ -1947,7 +1973,7 @@ qla2x00_gff_id(scsi_qla_host_t *vha, sw_info_t *list)
1947 struct qla_hw_data *ha = vha->hw; 1973 struct qla_hw_data *ha = vha->hw;
1948 uint8_t fcp_scsi_features = 0; 1974 uint8_t fcp_scsi_features = 0;
1949 1975
1950 for (i = 0; i < MAX_FIBRE_DEVICES; i++) { 1976 for (i = 0; i < ha->max_fibre_devices; i++) {
1951 /* Set default FC4 Type as UNKNOWN so the default is to 1977 /* Set default FC4 Type as UNKNOWN so the default is to
1952 * Process this port */ 1978 * Process this port */
1953 list[i].fc4_type = FC4_TYPE_UNKNOWN; 1979 list[i].fc4_type = FC4_TYPE_UNKNOWN;
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index 1fa067e053d2..b9465643396b 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -29,7 +29,6 @@ static int qla2x00_configure_loop(scsi_qla_host_t *);
29static int qla2x00_configure_local_loop(scsi_qla_host_t *); 29static int qla2x00_configure_local_loop(scsi_qla_host_t *);
30static int qla2x00_configure_fabric(scsi_qla_host_t *); 30static int qla2x00_configure_fabric(scsi_qla_host_t *);
31static int qla2x00_find_all_fabric_devs(scsi_qla_host_t *, struct list_head *); 31static int qla2x00_find_all_fabric_devs(scsi_qla_host_t *, struct list_head *);
32static int qla2x00_device_resync(scsi_qla_host_t *);
33static int qla2x00_fabric_dev_login(scsi_qla_host_t *, fc_port_t *, 32static int qla2x00_fabric_dev_login(scsi_qla_host_t *, fc_port_t *,
34 uint16_t *); 33 uint16_t *);
35 34
@@ -41,11 +40,10 @@ static int qla25xx_init_queues(struct qla_hw_data *);
41 40
42/* SRB Extensions ---------------------------------------------------------- */ 41/* SRB Extensions ---------------------------------------------------------- */
43 42
44static void 43void
45qla2x00_ctx_sp_timeout(unsigned long __data) 44qla2x00_sp_timeout(unsigned long __data)
46{ 45{
47 srb_t *sp = (srb_t *)__data; 46 srb_t *sp = (srb_t *)__data;
48 struct srb_ctx *ctx;
49 struct srb_iocb *iocb; 47 struct srb_iocb *iocb;
50 fc_port_t *fcport = sp->fcport; 48 fc_port_t *fcport = sp->fcport;
51 struct qla_hw_data *ha = fcport->vha->hw; 49 struct qla_hw_data *ha = fcport->vha->hw;
@@ -55,79 +53,25 @@ qla2x00_ctx_sp_timeout(unsigned long __data)
55 spin_lock_irqsave(&ha->hardware_lock, flags); 53 spin_lock_irqsave(&ha->hardware_lock, flags);
56 req = ha->req_q_map[0]; 54 req = ha->req_q_map[0];
57 req->outstanding_cmds[sp->handle] = NULL; 55 req->outstanding_cmds[sp->handle] = NULL;
58 ctx = sp->ctx; 56 iocb = &sp->u.iocb_cmd;
59 iocb = ctx->u.iocb_cmd;
60 iocb->timeout(sp); 57 iocb->timeout(sp);
61 iocb->free(sp); 58 sp->free(fcport->vha, sp);
62 spin_unlock_irqrestore(&ha->hardware_lock, flags); 59 spin_unlock_irqrestore(&ha->hardware_lock, flags);
63} 60}
64 61
65static void 62void
66qla2x00_ctx_sp_free(srb_t *sp) 63qla2x00_sp_free(void *data, void *ptr)
67{ 64{
68 struct srb_ctx *ctx = sp->ctx; 65 srb_t *sp = (srb_t *)ptr;
69 struct srb_iocb *iocb = ctx->u.iocb_cmd; 66 struct srb_iocb *iocb = &sp->u.iocb_cmd;
70 struct scsi_qla_host *vha = sp->fcport->vha; 67 struct scsi_qla_host *vha = (scsi_qla_host_t *)data;
71 68
72 del_timer(&iocb->timer); 69 del_timer(&iocb->timer);
73 kfree(iocb); 70 mempool_free(sp, vha->hw->srb_mempool);
74 kfree(ctx);
75 mempool_free(sp, sp->fcport->vha->hw->srb_mempool);
76 71
77 QLA_VHA_MARK_NOT_BUSY(vha); 72 QLA_VHA_MARK_NOT_BUSY(vha);
78} 73}
79 74
80inline srb_t *
81qla2x00_get_ctx_sp(scsi_qla_host_t *vha, fc_port_t *fcport, size_t size,
82 unsigned long tmo)
83{
84 srb_t *sp = NULL;
85 struct qla_hw_data *ha = vha->hw;
86 struct srb_ctx *ctx;
87 struct srb_iocb *iocb;
88 uint8_t bail;
89
90 QLA_VHA_MARK_BUSY(vha, bail);
91 if (bail)
92 return NULL;
93
94 sp = mempool_alloc(ha->srb_mempool, GFP_KERNEL);
95 if (!sp)
96 goto done;
97 ctx = kzalloc(size, GFP_KERNEL);
98 if (!ctx) {
99 mempool_free(sp, ha->srb_mempool);
100 sp = NULL;
101 goto done;
102 }
103 iocb = kzalloc(sizeof(struct srb_iocb), GFP_KERNEL);
104 if (!iocb) {
105 mempool_free(sp, ha->srb_mempool);
106 sp = NULL;
107 kfree(ctx);
108 goto done;
109 }
110
111 memset(sp, 0, sizeof(*sp));
112 sp->fcport = fcport;
113 sp->ctx = ctx;
114 ctx->iocbs = 1;
115 ctx->u.iocb_cmd = iocb;
116 iocb->free = qla2x00_ctx_sp_free;
117
118 init_timer(&iocb->timer);
119 if (!tmo)
120 goto done;
121 iocb->timer.expires = jiffies + tmo * HZ;
122 iocb->timer.data = (unsigned long)sp;
123 iocb->timer.function = qla2x00_ctx_sp_timeout;
124 add_timer(&iocb->timer);
125done:
126 if (!sp)
127 QLA_VHA_MARK_NOT_BUSY(vha);
128 return sp;
129}
130
131/* Asynchronous Login/Logout Routines -------------------------------------- */ 75/* Asynchronous Login/Logout Routines -------------------------------------- */
132 76
133static inline unsigned long 77static inline unsigned long
@@ -149,19 +93,19 @@ qla2x00_get_async_timeout(struct scsi_qla_host *vha)
149} 93}
150 94
151static void 95static void
152qla2x00_async_iocb_timeout(srb_t *sp) 96qla2x00_async_iocb_timeout(void *data)
153{ 97{
98 srb_t *sp = (srb_t *)data;
154 fc_port_t *fcport = sp->fcport; 99 fc_port_t *fcport = sp->fcport;
155 struct srb_ctx *ctx = sp->ctx;
156 100
157 ql_dbg(ql_dbg_disc, fcport->vha, 0x2071, 101 ql_dbg(ql_dbg_disc, fcport->vha, 0x2071,
158 "Async-%s timeout - hdl=%x portid=%02x%02x%02x.\n", 102 "Async-%s timeout - hdl=%x portid=%02x%02x%02x.\n",
159 ctx->name, sp->handle, fcport->d_id.b.domain, fcport->d_id.b.area, 103 sp->name, sp->handle, fcport->d_id.b.domain, fcport->d_id.b.area,
160 fcport->d_id.b.al_pa); 104 fcport->d_id.b.al_pa);
161 105
162 fcport->flags &= ~FCF_ASYNC_SENT; 106 fcport->flags &= ~FCF_ASYNC_SENT;
163 if (ctx->type == SRB_LOGIN_CMD) { 107 if (sp->type == SRB_LOGIN_CMD) {
164 struct srb_iocb *lio = ctx->u.iocb_cmd; 108 struct srb_iocb *lio = &sp->u.iocb_cmd;
165 qla2x00_post_async_logout_work(fcport->vha, fcport, NULL); 109 qla2x00_post_async_logout_work(fcport->vha, fcport, NULL);
166 /* Retry as needed. */ 110 /* Retry as needed. */
167 lio->u.logio.data[0] = MBS_COMMAND_ERROR; 111 lio->u.logio.data[0] = MBS_COMMAND_ERROR;
@@ -173,14 +117,16 @@ qla2x00_async_iocb_timeout(srb_t *sp)
173} 117}
174 118
175static void 119static void
176qla2x00_async_login_ctx_done(srb_t *sp) 120qla2x00_async_login_sp_done(void *data, void *ptr, int res)
177{ 121{
178 struct srb_ctx *ctx = sp->ctx; 122 srb_t *sp = (srb_t *)ptr;
179 struct srb_iocb *lio = ctx->u.iocb_cmd; 123 struct srb_iocb *lio = &sp->u.iocb_cmd;
180 124 struct scsi_qla_host *vha = (scsi_qla_host_t *)data;
181 qla2x00_post_async_login_done_work(sp->fcport->vha, sp->fcport, 125
182 lio->u.logio.data); 126 if (!test_bit(UNLOADING, &vha->dpc_flags))
183 lio->free(sp); 127 qla2x00_post_async_login_done_work(sp->fcport->vha, sp->fcport,
128 lio->u.logio.data);
129 sp->free(sp->fcport->vha, sp);
184} 130}
185 131
186int 132int
@@ -188,22 +134,21 @@ qla2x00_async_login(struct scsi_qla_host *vha, fc_port_t *fcport,
188 uint16_t *data) 134 uint16_t *data)
189{ 135{
190 srb_t *sp; 136 srb_t *sp;
191 struct srb_ctx *ctx;
192 struct srb_iocb *lio; 137 struct srb_iocb *lio;
193 int rval; 138 int rval;
194 139
195 rval = QLA_FUNCTION_FAILED; 140 rval = QLA_FUNCTION_FAILED;
196 sp = qla2x00_get_ctx_sp(vha, fcport, sizeof(struct srb_ctx), 141 sp = qla2x00_get_sp(vha, fcport, GFP_KERNEL);
197 qla2x00_get_async_timeout(vha) + 2);
198 if (!sp) 142 if (!sp)
199 goto done; 143 goto done;
200 144
201 ctx = sp->ctx; 145 sp->type = SRB_LOGIN_CMD;
202 ctx->type = SRB_LOGIN_CMD; 146 sp->name = "login";
203 ctx->name = "login"; 147 qla2x00_init_timer(sp, qla2x00_get_async_timeout(vha) + 2);
204 lio = ctx->u.iocb_cmd; 148
149 lio = &sp->u.iocb_cmd;
205 lio->timeout = qla2x00_async_iocb_timeout; 150 lio->timeout = qla2x00_async_iocb_timeout;
206 lio->done = qla2x00_async_login_ctx_done; 151 sp->done = qla2x00_async_login_sp_done;
207 lio->u.logio.flags |= SRB_LOGIN_COND_PLOGI; 152 lio->u.logio.flags |= SRB_LOGIN_COND_PLOGI;
208 if (data[1] & QLA_LOGIO_LOGIN_RETRIED) 153 if (data[1] & QLA_LOGIO_LOGIN_RETRIED)
209 lio->u.logio.flags |= SRB_LOGIN_RETRIED; 154 lio->u.logio.flags |= SRB_LOGIN_RETRIED;
@@ -219,42 +164,43 @@ qla2x00_async_login(struct scsi_qla_host *vha, fc_port_t *fcport,
219 return rval; 164 return rval;
220 165
221done_free_sp: 166done_free_sp:
222 lio->free(sp); 167 sp->free(fcport->vha, sp);
223done: 168done:
224 return rval; 169 return rval;
225} 170}
226 171
227static void 172static void
228qla2x00_async_logout_ctx_done(srb_t *sp) 173qla2x00_async_logout_sp_done(void *data, void *ptr, int res)
229{ 174{
230 struct srb_ctx *ctx = sp->ctx; 175 srb_t *sp = (srb_t *)ptr;
231 struct srb_iocb *lio = ctx->u.iocb_cmd; 176 struct srb_iocb *lio = &sp->u.iocb_cmd;
232 177 struct scsi_qla_host *vha = (scsi_qla_host_t *)data;
233 qla2x00_post_async_logout_done_work(sp->fcport->vha, sp->fcport, 178
234 lio->u.logio.data); 179 if (!test_bit(UNLOADING, &vha->dpc_flags))
235 lio->free(sp); 180 qla2x00_post_async_logout_done_work(sp->fcport->vha, sp->fcport,
181 lio->u.logio.data);
182 sp->free(sp->fcport->vha, sp);
236} 183}
237 184
238int 185int
239qla2x00_async_logout(struct scsi_qla_host *vha, fc_port_t *fcport) 186qla2x00_async_logout(struct scsi_qla_host *vha, fc_port_t *fcport)
240{ 187{
241 srb_t *sp; 188 srb_t *sp;
242 struct srb_ctx *ctx;
243 struct srb_iocb *lio; 189 struct srb_iocb *lio;
244 int rval; 190 int rval;
245 191
246 rval = QLA_FUNCTION_FAILED; 192 rval = QLA_FUNCTION_FAILED;
247 sp = qla2x00_get_ctx_sp(vha, fcport, sizeof(struct srb_ctx), 193 sp = qla2x00_get_sp(vha, fcport, GFP_KERNEL);
248 qla2x00_get_async_timeout(vha) + 2);
249 if (!sp) 194 if (!sp)
250 goto done; 195 goto done;
251 196
252 ctx = sp->ctx; 197 sp->type = SRB_LOGOUT_CMD;
253 ctx->type = SRB_LOGOUT_CMD; 198 sp->name = "logout";
254 ctx->name = "logout"; 199 qla2x00_init_timer(sp, qla2x00_get_async_timeout(vha) + 2);
255 lio = ctx->u.iocb_cmd; 200
201 lio = &sp->u.iocb_cmd;
256 lio->timeout = qla2x00_async_iocb_timeout; 202 lio->timeout = qla2x00_async_iocb_timeout;
257 lio->done = qla2x00_async_logout_ctx_done; 203 sp->done = qla2x00_async_logout_sp_done;
258 rval = qla2x00_start_sp(sp); 204 rval = qla2x00_start_sp(sp);
259 if (rval != QLA_SUCCESS) 205 if (rval != QLA_SUCCESS)
260 goto done_free_sp; 206 goto done_free_sp;
@@ -266,20 +212,22 @@ qla2x00_async_logout(struct scsi_qla_host *vha, fc_port_t *fcport)
266 return rval; 212 return rval;
267 213
268done_free_sp: 214done_free_sp:
269 lio->free(sp); 215 sp->free(fcport->vha, sp);
270done: 216done:
271 return rval; 217 return rval;
272} 218}
273 219
274static void 220static void
275qla2x00_async_adisc_ctx_done(srb_t *sp) 221qla2x00_async_adisc_sp_done(void *data, void *ptr, int res)
276{ 222{
277 struct srb_ctx *ctx = sp->ctx; 223 srb_t *sp = (srb_t *)ptr;
278 struct srb_iocb *lio = ctx->u.iocb_cmd; 224 struct srb_iocb *lio = &sp->u.iocb_cmd;
279 225 struct scsi_qla_host *vha = (scsi_qla_host_t *)data;
280 qla2x00_post_async_adisc_done_work(sp->fcport->vha, sp->fcport, 226
281 lio->u.logio.data); 227 if (!test_bit(UNLOADING, &vha->dpc_flags))
282 lio->free(sp); 228 qla2x00_post_async_adisc_done_work(sp->fcport->vha, sp->fcport,
229 lio->u.logio.data);
230 sp->free(sp->fcport->vha, sp);
283} 231}
284 232
285int 233int
@@ -287,22 +235,21 @@ qla2x00_async_adisc(struct scsi_qla_host *vha, fc_port_t *fcport,
287 uint16_t *data) 235 uint16_t *data)
288{ 236{
289 srb_t *sp; 237 srb_t *sp;
290 struct srb_ctx *ctx;
291 struct srb_iocb *lio; 238 struct srb_iocb *lio;
292 int rval; 239 int rval;
293 240
294 rval = QLA_FUNCTION_FAILED; 241 rval = QLA_FUNCTION_FAILED;
295 sp = qla2x00_get_ctx_sp(vha, fcport, sizeof(struct srb_ctx), 242 sp = qla2x00_get_sp(vha, fcport, GFP_KERNEL);
296 qla2x00_get_async_timeout(vha) + 2);
297 if (!sp) 243 if (!sp)
298 goto done; 244 goto done;
299 245
300 ctx = sp->ctx; 246 sp->type = SRB_ADISC_CMD;
301 ctx->type = SRB_ADISC_CMD; 247 sp->name = "adisc";
302 ctx->name = "adisc"; 248 qla2x00_init_timer(sp, qla2x00_get_async_timeout(vha) + 2);
303 lio = ctx->u.iocb_cmd; 249
250 lio = &sp->u.iocb_cmd;
304 lio->timeout = qla2x00_async_iocb_timeout; 251 lio->timeout = qla2x00_async_iocb_timeout;
305 lio->done = qla2x00_async_adisc_ctx_done; 252 sp->done = qla2x00_async_adisc_sp_done;
306 if (data[1] & QLA_LOGIO_LOGIN_RETRIED) 253 if (data[1] & QLA_LOGIO_LOGIN_RETRIED)
307 lio->u.logio.flags |= SRB_LOGIN_RETRIED; 254 lio->u.logio.flags |= SRB_LOGIN_RETRIED;
308 rval = qla2x00_start_sp(sp); 255 rval = qla2x00_start_sp(sp);
@@ -316,46 +263,62 @@ qla2x00_async_adisc(struct scsi_qla_host *vha, fc_port_t *fcport,
316 return rval; 263 return rval;
317 264
318done_free_sp: 265done_free_sp:
319 lio->free(sp); 266 sp->free(fcport->vha, sp);
320done: 267done:
321 return rval; 268 return rval;
322} 269}
323 270
324static void 271static void
325qla2x00_async_tm_cmd_ctx_done(srb_t *sp) 272qla2x00_async_tm_cmd_done(void *data, void *ptr, int res)
326{ 273{
327 struct srb_ctx *ctx = sp->ctx; 274 srb_t *sp = (srb_t *)ptr;
328 struct srb_iocb *iocb = (struct srb_iocb *)ctx->u.iocb_cmd; 275 struct srb_iocb *iocb = &sp->u.iocb_cmd;
276 struct scsi_qla_host *vha = (scsi_qla_host_t *)data;
277 uint32_t flags;
278 uint16_t lun;
279 int rval;
280
281 if (!test_bit(UNLOADING, &vha->dpc_flags)) {
282 flags = iocb->u.tmf.flags;
283 lun = (uint16_t)iocb->u.tmf.lun;
284
285 /* Issue Marker IOCB */
286 rval = qla2x00_marker(vha, vha->hw->req_q_map[0],
287 vha->hw->rsp_q_map[0], sp->fcport->loop_id, lun,
288 flags == TCF_LUN_RESET ? MK_SYNC_ID_LUN : MK_SYNC_ID);
329 289
330 qla2x00_async_tm_cmd_done(sp->fcport->vha, sp->fcport, iocb); 290 if ((rval != QLA_SUCCESS) || iocb->u.tmf.data) {
331 iocb->free(sp); 291 ql_dbg(ql_dbg_taskm, vha, 0x8030,
292 "TM IOCB failed (%x).\n", rval);
293 }
294 }
295 sp->free(sp->fcport->vha, sp);
332} 296}
333 297
334int 298int
335qla2x00_async_tm_cmd(fc_port_t *fcport, uint32_t flags, uint32_t lun, 299qla2x00_async_tm_cmd(fc_port_t *fcport, uint32_t tm_flags, uint32_t lun,
336 uint32_t tag) 300 uint32_t tag)
337{ 301{
338 struct scsi_qla_host *vha = fcport->vha; 302 struct scsi_qla_host *vha = fcport->vha;
339 srb_t *sp; 303 srb_t *sp;
340 struct srb_ctx *ctx;
341 struct srb_iocb *tcf; 304 struct srb_iocb *tcf;
342 int rval; 305 int rval;
343 306
344 rval = QLA_FUNCTION_FAILED; 307 rval = QLA_FUNCTION_FAILED;
345 sp = qla2x00_get_ctx_sp(vha, fcport, sizeof(struct srb_ctx), 308 sp = qla2x00_get_sp(vha, fcport, GFP_KERNEL);
346 qla2x00_get_async_timeout(vha) + 2);
347 if (!sp) 309 if (!sp)
348 goto done; 310 goto done;
349 311
350 ctx = sp->ctx; 312 sp->type = SRB_TM_CMD;
351 ctx->type = SRB_TM_CMD; 313 sp->name = "tmf";
352 ctx->name = "tmf"; 314 qla2x00_init_timer(sp, qla2x00_get_async_timeout(vha) + 2);
353 tcf = ctx->u.iocb_cmd; 315
354 tcf->u.tmf.flags = flags; 316 tcf = &sp->u.iocb_cmd;
317 tcf->u.tmf.flags = tm_flags;
355 tcf->u.tmf.lun = lun; 318 tcf->u.tmf.lun = lun;
356 tcf->u.tmf.data = tag; 319 tcf->u.tmf.data = tag;
357 tcf->timeout = qla2x00_async_iocb_timeout; 320 tcf->timeout = qla2x00_async_iocb_timeout;
358 tcf->done = qla2x00_async_tm_cmd_ctx_done; 321 sp->done = qla2x00_async_tm_cmd_done;
359 322
360 rval = qla2x00_start_sp(sp); 323 rval = qla2x00_start_sp(sp);
361 if (rval != QLA_SUCCESS) 324 if (rval != QLA_SUCCESS)
@@ -368,7 +331,7 @@ qla2x00_async_tm_cmd(fc_port_t *fcport, uint32_t flags, uint32_t lun,
368 return rval; 331 return rval;
369 332
370done_free_sp: 333done_free_sp:
371 tcf->free(sp); 334 sp->free(fcport->vha, sp);
372done: 335done:
373 return rval; 336 return rval;
374} 337}
@@ -387,6 +350,13 @@ qla2x00_async_login_done(struct scsi_qla_host *vha, fc_port_t *fcport,
387 * requests. 350 * requests.
388 */ 351 */
389 rval = qla2x00_get_port_database(vha, fcport, 0); 352 rval = qla2x00_get_port_database(vha, fcport, 0);
353 if (rval == QLA_NOT_LOGGED_IN) {
354 fcport->flags &= ~FCF_ASYNC_SENT;
355 fcport->flags |= FCF_LOGIN_NEEDED;
356 set_bit(RELOGIN_NEEDED, &vha->dpc_flags);
357 break;
358 }
359
390 if (rval != QLA_SUCCESS) { 360 if (rval != QLA_SUCCESS) {
391 qla2x00_post_async_logout_work(vha, fcport, NULL); 361 qla2x00_post_async_logout_work(vha, fcport, NULL);
392 qla2x00_post_async_login_work(vha, fcport, NULL); 362 qla2x00_post_async_login_work(vha, fcport, NULL);
@@ -452,30 +422,6 @@ qla2x00_async_adisc_done(struct scsi_qla_host *vha, fc_port_t *fcport,
452 return; 422 return;
453} 423}
454 424
455void
456qla2x00_async_tm_cmd_done(struct scsi_qla_host *vha, fc_port_t *fcport,
457 struct srb_iocb *iocb)
458{
459 int rval;
460 uint32_t flags;
461 uint16_t lun;
462
463 flags = iocb->u.tmf.flags;
464 lun = (uint16_t)iocb->u.tmf.lun;
465
466 /* Issue Marker IOCB */
467 rval = qla2x00_marker(vha, vha->hw->req_q_map[0],
468 vha->hw->rsp_q_map[0], fcport->loop_id, lun,
469 flags == TCF_LUN_RESET ? MK_SYNC_ID_LUN : MK_SYNC_ID);
470
471 if ((rval != QLA_SUCCESS) || iocb->u.tmf.data) {
472 ql_dbg(ql_dbg_taskm, vha, 0x8030,
473 "TM IOCB failed (%x).\n", rval);
474 }
475
476 return;
477}
478
479/****************************************************************************/ 425/****************************************************************************/
480/* QLogic ISP2x00 Hardware Support Functions. */ 426/* QLogic ISP2x00 Hardware Support Functions. */
481/****************************************************************************/ 427/****************************************************************************/
@@ -969,6 +915,9 @@ qla81xx_reset_mpi(scsi_qla_host_t *vha)
969{ 915{
970 uint16_t mb[4] = {0x1010, 0, 1, 0}; 916 uint16_t mb[4] = {0x1010, 0, 1, 0};
971 917
918 if (!IS_QLA81XX(vha->hw))
919 return QLA_SUCCESS;
920
972 return qla81xx_write_mpi_register(vha, mb); 921 return qla81xx_write_mpi_register(vha, mb);
973} 922}
974 923
@@ -1262,7 +1211,9 @@ qla2x00_alloc_fw_dump(scsi_qla_host_t *vha)
1262 mem_size = (ha->fw_memory_size - 0x11000 + 1) * 1211 mem_size = (ha->fw_memory_size - 0x11000 + 1) *
1263 sizeof(uint16_t); 1212 sizeof(uint16_t);
1264 } else if (IS_FWI2_CAPABLE(ha)) { 1213 } else if (IS_FWI2_CAPABLE(ha)) {
1265 if (IS_QLA81XX(ha)) 1214 if (IS_QLA83XX(ha))
1215 fixed_size = offsetof(struct qla83xx_fw_dump, ext_mem);
1216 else if (IS_QLA81XX(ha))
1266 fixed_size = offsetof(struct qla81xx_fw_dump, ext_mem); 1217 fixed_size = offsetof(struct qla81xx_fw_dump, ext_mem);
1267 else if (IS_QLA25XX(ha)) 1218 else if (IS_QLA25XX(ha))
1268 fixed_size = offsetof(struct qla25xx_fw_dump, ext_mem); 1219 fixed_size = offsetof(struct qla25xx_fw_dump, ext_mem);
@@ -1270,10 +1221,20 @@ qla2x00_alloc_fw_dump(scsi_qla_host_t *vha)
1270 fixed_size = offsetof(struct qla24xx_fw_dump, ext_mem); 1221 fixed_size = offsetof(struct qla24xx_fw_dump, ext_mem);
1271 mem_size = (ha->fw_memory_size - 0x100000 + 1) * 1222 mem_size = (ha->fw_memory_size - 0x100000 + 1) *
1272 sizeof(uint32_t); 1223 sizeof(uint32_t);
1273 if (ha->mqenable) 1224 if (ha->mqenable) {
1274 mq_size = sizeof(struct qla2xxx_mq_chain); 1225 if (!IS_QLA83XX(ha))
1226 mq_size = sizeof(struct qla2xxx_mq_chain);
1227 /*
1228 * Allocate maximum buffer size for all queues.
1229 * Resizing must be done at end-of-dump processing.
1230 */
1231 mq_size += ha->max_req_queues *
1232 (req->length * sizeof(request_t));
1233 mq_size += ha->max_rsp_queues *
1234 (rsp->length * sizeof(response_t));
1235 }
1275 /* Allocate memory for Fibre Channel Event Buffer. */ 1236 /* Allocate memory for Fibre Channel Event Buffer. */
1276 if (!IS_QLA25XX(ha) && !IS_QLA81XX(ha)) 1237 if (!IS_QLA25XX(ha) && !IS_QLA81XX(ha) && !IS_QLA83XX(ha))
1277 goto try_eft; 1238 goto try_eft;
1278 1239
1279 tc = dma_alloc_coherent(&ha->pdev->dev, FCE_SIZE, &tc_dma, 1240 tc = dma_alloc_coherent(&ha->pdev->dev, FCE_SIZE, &tc_dma,
@@ -1484,17 +1445,8 @@ enable_82xx_npiv:
1484 fw_major_version = ha->fw_major_version; 1445 fw_major_version = ha->fw_major_version;
1485 if (IS_QLA82XX(ha)) 1446 if (IS_QLA82XX(ha))
1486 qla82xx_check_md_needed(vha); 1447 qla82xx_check_md_needed(vha);
1487 else { 1448 else
1488 rval = qla2x00_get_fw_version(vha, 1449 rval = qla2x00_get_fw_version(vha);
1489 &ha->fw_major_version,
1490 &ha->fw_minor_version,
1491 &ha->fw_subminor_version,
1492 &ha->fw_attributes,
1493 &ha->fw_memory_size,
1494 ha->mpi_version,
1495 &ha->mpi_capabilities,
1496 ha->phy_version);
1497 }
1498 if (rval != QLA_SUCCESS) 1450 if (rval != QLA_SUCCESS)
1499 goto failed; 1451 goto failed;
1500 ha->flags.npiv_supported = 0; 1452 ha->flags.npiv_supported = 0;
@@ -1535,6 +1487,9 @@ enable_82xx_npiv:
1535 spin_unlock_irqrestore(&ha->hardware_lock, flags); 1487 spin_unlock_irqrestore(&ha->hardware_lock, flags);
1536 } 1488 }
1537 1489
1490 if (IS_QLA83XX(ha))
1491 goto skip_fac_check;
1492
1538 if (rval == QLA_SUCCESS && IS_FAC_REQUIRED(ha)) { 1493 if (rval == QLA_SUCCESS && IS_FAC_REQUIRED(ha)) {
1539 uint32_t size; 1494 uint32_t size;
1540 1495
@@ -1547,6 +1502,11 @@ enable_82xx_npiv:
1547 "Unsupported FAC firmware (%d.%02d.%02d).\n", 1502 "Unsupported FAC firmware (%d.%02d.%02d).\n",
1548 ha->fw_major_version, ha->fw_minor_version, 1503 ha->fw_major_version, ha->fw_minor_version,
1549 ha->fw_subminor_version); 1504 ha->fw_subminor_version);
1505skip_fac_check:
1506 if (IS_QLA83XX(ha)) {
1507 ha->flags.fac_supported = 0;
1508 rval = QLA_SUCCESS;
1509 }
1550 } 1510 }
1551 } 1511 }
1552failed: 1512failed:
@@ -1725,7 +1685,7 @@ qla24xx_config_rings(struct scsi_qla_host *vha)
1725 struct req_que *req = ha->req_q_map[0]; 1685 struct req_que *req = ha->req_q_map[0];
1726 struct rsp_que *rsp = ha->rsp_q_map[0]; 1686 struct rsp_que *rsp = ha->rsp_q_map[0];
1727 1687
1728/* Setup ring parameters in initialization control block. */ 1688 /* Setup ring parameters in initialization control block. */
1729 icb = (struct init_cb_24xx *)ha->init_cb; 1689 icb = (struct init_cb_24xx *)ha->init_cb;
1730 icb->request_q_outpointer = __constant_cpu_to_le16(0); 1690 icb->request_q_outpointer = __constant_cpu_to_le16(0);
1731 icb->response_q_inpointer = __constant_cpu_to_le16(0); 1691 icb->response_q_inpointer = __constant_cpu_to_le16(0);
@@ -1736,7 +1696,7 @@ qla24xx_config_rings(struct scsi_qla_host *vha)
1736 icb->response_q_address[0] = cpu_to_le32(LSD(rsp->dma)); 1696 icb->response_q_address[0] = cpu_to_le32(LSD(rsp->dma));
1737 icb->response_q_address[1] = cpu_to_le32(MSD(rsp->dma)); 1697 icb->response_q_address[1] = cpu_to_le32(MSD(rsp->dma));
1738 1698
1739 if (ha->mqenable) { 1699 if (ha->mqenable || IS_QLA83XX(ha)) {
1740 icb->qos = __constant_cpu_to_le16(QLA_DEFAULT_QUE_QOS); 1700 icb->qos = __constant_cpu_to_le16(QLA_DEFAULT_QUE_QOS);
1741 icb->rid = __constant_cpu_to_le16(rid); 1701 icb->rid = __constant_cpu_to_le16(rid);
1742 if (ha->flags.msix_enabled) { 1702 if (ha->flags.msix_enabled) {
@@ -1756,7 +1716,8 @@ qla24xx_config_rings(struct scsi_qla_host *vha)
1756 __constant_cpu_to_le32(BIT_18); 1716 __constant_cpu_to_le32(BIT_18);
1757 1717
1758 /* Use Disable MSIX Handshake mode for capable adapters */ 1718 /* Use Disable MSIX Handshake mode for capable adapters */
1759 if (IS_MSIX_NACK_CAPABLE(ha)) { 1719 if ((ha->fw_attributes & BIT_6) && (IS_MSIX_NACK_CAPABLE(ha)) &&
1720 (ha->flags.msix_enabled)) {
1760 icb->firmware_options_2 &= 1721 icb->firmware_options_2 &=
1761 __constant_cpu_to_le32(~BIT_22); 1722 __constant_cpu_to_le32(~BIT_22);
1762 ha->flags.disable_msix_handshake = 1; 1723 ha->flags.disable_msix_handshake = 1;
@@ -1800,7 +1761,6 @@ qla2x00_init_rings(scsi_qla_host_t *vha)
1800 struct qla_hw_data *ha = vha->hw; 1761 struct qla_hw_data *ha = vha->hw;
1801 struct req_que *req; 1762 struct req_que *req;
1802 struct rsp_que *rsp; 1763 struct rsp_que *rsp;
1803 struct scsi_qla_host *vp;
1804 struct mid_init_cb_24xx *mid_init_cb = 1764 struct mid_init_cb_24xx *mid_init_cb =
1805 (struct mid_init_cb_24xx *) ha->init_cb; 1765 (struct mid_init_cb_24xx *) ha->init_cb;
1806 1766
@@ -1831,11 +1791,6 @@ qla2x00_init_rings(scsi_qla_host_t *vha)
1831 } 1791 }
1832 1792
1833 spin_lock(&ha->vport_slock); 1793 spin_lock(&ha->vport_slock);
1834 /* Clear RSCN queue. */
1835 list_for_each_entry(vp, &ha->vp_list, list) {
1836 vp->rscn_in_ptr = 0;
1837 vp->rscn_out_ptr = 0;
1838 }
1839 1794
1840 spin_unlock(&ha->vport_slock); 1795 spin_unlock(&ha->vport_slock);
1841 1796
@@ -2028,7 +1983,7 @@ qla2x00_configure_hba(scsi_qla_host_t *vha)
2028 &loop_id, &al_pa, &area, &domain, &topo, &sw_cap); 1983 &loop_id, &al_pa, &area, &domain, &topo, &sw_cap);
2029 if (rval != QLA_SUCCESS) { 1984 if (rval != QLA_SUCCESS) {
2030 if (LOOP_TRANSITION(vha) || atomic_read(&ha->loop_down_timer) || 1985 if (LOOP_TRANSITION(vha) || atomic_read(&ha->loop_down_timer) ||
2031 IS_QLA8XXX_TYPE(ha) || 1986 IS_CNA_CAPABLE(ha) ||
2032 (rval == QLA_COMMAND_ERROR && loop_id == 0x7)) { 1987 (rval == QLA_COMMAND_ERROR && loop_id == 0x7)) {
2033 ql_dbg(ql_dbg_disc, vha, 0x2008, 1988 ql_dbg(ql_dbg_disc, vha, 0x2008,
2034 "Loop is in a transition state.\n"); 1989 "Loop is in a transition state.\n");
@@ -2120,7 +2075,7 @@ qla2x00_set_model_info(scsi_qla_host_t *vha, uint8_t *model, size_t len,
2120 uint16_t index; 2075 uint16_t index;
2121 struct qla_hw_data *ha = vha->hw; 2076 struct qla_hw_data *ha = vha->hw;
2122 int use_tbl = !IS_QLA24XX_TYPE(ha) && !IS_QLA25XX(ha) && 2077 int use_tbl = !IS_QLA24XX_TYPE(ha) && !IS_QLA25XX(ha) &&
2123 !IS_QLA8XXX_TYPE(ha); 2078 !IS_CNA_CAPABLE(ha) && !IS_QLA2031(ha);
2124 2079
2125 if (memcmp(model, BINZERO, len) != 0) { 2080 if (memcmp(model, BINZERO, len) != 0) {
2126 strncpy(ha->model_number, model, len); 2081 strncpy(ha->model_number, model, len);
@@ -2596,13 +2551,11 @@ qla2x00_configure_loop(scsi_qla_host_t *vha)
2596 if (ha->current_topology == ISP_CFG_FL && 2551 if (ha->current_topology == ISP_CFG_FL &&
2597 (test_bit(LOCAL_LOOP_UPDATE, &flags))) { 2552 (test_bit(LOCAL_LOOP_UPDATE, &flags))) {
2598 2553
2599 vha->flags.rscn_queue_overflow = 1;
2600 set_bit(RSCN_UPDATE, &flags); 2554 set_bit(RSCN_UPDATE, &flags);
2601 2555
2602 } else if (ha->current_topology == ISP_CFG_F && 2556 } else if (ha->current_topology == ISP_CFG_F &&
2603 (test_bit(LOCAL_LOOP_UPDATE, &flags))) { 2557 (test_bit(LOCAL_LOOP_UPDATE, &flags))) {
2604 2558
2605 vha->flags.rscn_queue_overflow = 1;
2606 set_bit(RSCN_UPDATE, &flags); 2559 set_bit(RSCN_UPDATE, &flags);
2607 clear_bit(LOCAL_LOOP_UPDATE, &flags); 2560 clear_bit(LOCAL_LOOP_UPDATE, &flags);
2608 2561
@@ -2612,7 +2565,6 @@ qla2x00_configure_loop(scsi_qla_host_t *vha)
2612 } else if (!vha->flags.online || 2565 } else if (!vha->flags.online ||
2613 (test_bit(ABORT_ISP_ACTIVE, &flags))) { 2566 (test_bit(ABORT_ISP_ACTIVE, &flags))) {
2614 2567
2615 vha->flags.rscn_queue_overflow = 1;
2616 set_bit(RSCN_UPDATE, &flags); 2568 set_bit(RSCN_UPDATE, &flags);
2617 set_bit(LOCAL_LOOP_UPDATE, &flags); 2569 set_bit(LOCAL_LOOP_UPDATE, &flags);
2618 } 2570 }
@@ -2622,8 +2574,7 @@ qla2x00_configure_loop(scsi_qla_host_t *vha)
2622 ql_dbg(ql_dbg_disc, vha, 0x2015, 2574 ql_dbg(ql_dbg_disc, vha, 0x2015,
2623 "Loop resync needed, failing.\n"); 2575 "Loop resync needed, failing.\n");
2624 rval = QLA_FUNCTION_FAILED; 2576 rval = QLA_FUNCTION_FAILED;
2625 } 2577 } else
2626 else
2627 rval = qla2x00_configure_local_loop(vha); 2578 rval = qla2x00_configure_local_loop(vha);
2628 } 2579 }
2629 2580
@@ -2662,8 +2613,6 @@ qla2x00_configure_loop(scsi_qla_host_t *vha)
2662 set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags); 2613 set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags);
2663 if (test_bit(RSCN_UPDATE, &save_flags)) { 2614 if (test_bit(RSCN_UPDATE, &save_flags)) {
2664 set_bit(RSCN_UPDATE, &vha->dpc_flags); 2615 set_bit(RSCN_UPDATE, &vha->dpc_flags);
2665 if (!IS_ALOGIO_CAPABLE(ha))
2666 vha->flags.rscn_queue_overflow = 1;
2667 } 2616 }
2668 } 2617 }
2669 2618
@@ -2699,7 +2648,7 @@ qla2x00_configure_local_loop(scsi_qla_host_t *vha)
2699 2648
2700 found_devs = 0; 2649 found_devs = 0;
2701 new_fcport = NULL; 2650 new_fcport = NULL;
2702 entries = MAX_FIBRE_DEVICES; 2651 entries = MAX_FIBRE_DEVICES_LOOP;
2703 2652
2704 ql_dbg(ql_dbg_disc, vha, 0x2016, 2653 ql_dbg(ql_dbg_disc, vha, 0x2016,
2705 "Getting FCAL position map.\n"); 2654 "Getting FCAL position map.\n");
@@ -2707,7 +2656,7 @@ qla2x00_configure_local_loop(scsi_qla_host_t *vha)
2707 qla2x00_get_fcal_position_map(vha, NULL); 2656 qla2x00_get_fcal_position_map(vha, NULL);
2708 2657
2709 /* Get list of logged in devices. */ 2658 /* Get list of logged in devices. */
2710 memset(ha->gid_list, 0, GID_LIST_SIZE); 2659 memset(ha->gid_list, 0, qla2x00_gid_list_size(ha));
2711 rval = qla2x00_get_id_list(vha, ha->gid_list, ha->gid_list_dma, 2660 rval = qla2x00_get_id_list(vha, ha->gid_list, ha->gid_list_dma,
2712 &entries); 2661 &entries);
2713 if (rval != QLA_SUCCESS) 2662 if (rval != QLA_SUCCESS)
@@ -2971,7 +2920,7 @@ qla2x00_update_fcport(scsi_qla_host_t *vha, fc_port_t *fcport)
2971static int 2920static int
2972qla2x00_configure_fabric(scsi_qla_host_t *vha) 2921qla2x00_configure_fabric(scsi_qla_host_t *vha)
2973{ 2922{
2974 int rval, rval2; 2923 int rval;
2975 fc_port_t *fcport, *fcptemp; 2924 fc_port_t *fcport, *fcptemp;
2976 uint16_t next_loopid; 2925 uint16_t next_loopid;
2977 uint16_t mb[MAILBOX_REGISTER_COUNT]; 2926 uint16_t mb[MAILBOX_REGISTER_COUNT];
@@ -2995,12 +2944,6 @@ qla2x00_configure_fabric(scsi_qla_host_t *vha)
2995 } 2944 }
2996 vha->device_flags |= SWITCH_FOUND; 2945 vha->device_flags |= SWITCH_FOUND;
2997 2946
2998 /* Mark devices that need re-synchronization. */
2999 rval2 = qla2x00_device_resync(vha);
3000 if (rval2 == QLA_RSCNS_HANDLED) {
3001 /* No point doing the scan, just continue. */
3002 return (QLA_SUCCESS);
3003 }
3004 do { 2947 do {
3005 /* FDMI support. */ 2948 /* FDMI support. */
3006 if (ql2xfdmienable && 2949 if (ql2xfdmienable &&
@@ -3012,8 +2955,12 @@ qla2x00_configure_fabric(scsi_qla_host_t *vha)
3012 loop_id = NPH_SNS; 2955 loop_id = NPH_SNS;
3013 else 2956 else
3014 loop_id = SIMPLE_NAME_SERVER; 2957 loop_id = SIMPLE_NAME_SERVER;
3015 ha->isp_ops->fabric_login(vha, loop_id, 0xff, 0xff, 2958 rval = ha->isp_ops->fabric_login(vha, loop_id, 0xff, 0xff,
3016 0xfc, mb, BIT_1 | BIT_0); 2959 0xfc, mb, BIT_1|BIT_0);
2960 if (rval != QLA_SUCCESS) {
2961 set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
2962 return rval;
2963 }
3017 if (mb[0] != MBS_COMMAND_COMPLETE) { 2964 if (mb[0] != MBS_COMMAND_COMPLETE) {
3018 ql_dbg(ql_dbg_disc, vha, 0x2042, 2965 ql_dbg(ql_dbg_disc, vha, 0x2042,
3019 "Failed SNS login: loop_id=%x mb[0]=%x mb[1]=%x mb[2]=%x " 2966 "Failed SNS login: loop_id=%x mb[0]=%x mb[1]=%x mb[2]=%x "
@@ -3044,6 +2991,13 @@ qla2x00_configure_fabric(scsi_qla_host_t *vha)
3044 } 2991 }
3045 } 2992 }
3046 2993
2994#define QLA_FCPORT_SCAN 1
2995#define QLA_FCPORT_FOUND 2
2996
2997 list_for_each_entry(fcport, &vha->vp_fcports, list) {
2998 fcport->scan_state = QLA_FCPORT_SCAN;
2999 }
3000
3047 rval = qla2x00_find_all_fabric_devs(vha, &new_fcports); 3001 rval = qla2x00_find_all_fabric_devs(vha, &new_fcports);
3048 if (rval != QLA_SUCCESS) 3002 if (rval != QLA_SUCCESS)
3049 break; 3003 break;
@@ -3059,7 +3013,8 @@ qla2x00_configure_fabric(scsi_qla_host_t *vha)
3059 if ((fcport->flags & FCF_FABRIC_DEVICE) == 0) 3013 if ((fcport->flags & FCF_FABRIC_DEVICE) == 0)
3060 continue; 3014 continue;
3061 3015
3062 if (atomic_read(&fcport->state) == FCS_DEVICE_LOST) { 3016 if (fcport->scan_state == QLA_FCPORT_SCAN &&
3017 atomic_read(&fcport->state) == FCS_ONLINE) {
3063 qla2x00_mark_device_lost(vha, fcport, 3018 qla2x00_mark_device_lost(vha, fcport,
3064 ql2xplogiabsentdevice, 0); 3019 ql2xplogiabsentdevice, 0);
3065 if (fcport->loop_id != FC_NO_LOOP_ID && 3020 if (fcport->loop_id != FC_NO_LOOP_ID &&
@@ -3184,20 +3139,21 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *vha,
3184 rval = QLA_SUCCESS; 3139 rval = QLA_SUCCESS;
3185 3140
3186 /* Try GID_PT to get device list, else GAN. */ 3141 /* Try GID_PT to get device list, else GAN. */
3187 swl = kcalloc(MAX_FIBRE_DEVICES, sizeof(sw_info_t), GFP_KERNEL); 3142 if (!ha->swl)
3143 ha->swl = kcalloc(ha->max_fibre_devices, sizeof(sw_info_t),
3144 GFP_KERNEL);
3145 swl = ha->swl;
3188 if (!swl) { 3146 if (!swl) {
3189 /*EMPTY*/ 3147 /*EMPTY*/
3190 ql_dbg(ql_dbg_disc, vha, 0x2054, 3148 ql_dbg(ql_dbg_disc, vha, 0x2054,
3191 "GID_PT allocations failed, fallback on GA_NXT.\n"); 3149 "GID_PT allocations failed, fallback on GA_NXT.\n");
3192 } else { 3150 } else {
3151 memset(swl, 0, ha->max_fibre_devices * sizeof(sw_info_t));
3193 if (qla2x00_gid_pt(vha, swl) != QLA_SUCCESS) { 3152 if (qla2x00_gid_pt(vha, swl) != QLA_SUCCESS) {
3194 kfree(swl);
3195 swl = NULL; 3153 swl = NULL;
3196 } else if (qla2x00_gpn_id(vha, swl) != QLA_SUCCESS) { 3154 } else if (qla2x00_gpn_id(vha, swl) != QLA_SUCCESS) {
3197 kfree(swl);
3198 swl = NULL; 3155 swl = NULL;
3199 } else if (qla2x00_gnn_id(vha, swl) != QLA_SUCCESS) { 3156 } else if (qla2x00_gnn_id(vha, swl) != QLA_SUCCESS) {
3200 kfree(swl);
3201 swl = NULL; 3157 swl = NULL;
3202 } else if (ql2xiidmaenable && 3158 } else if (ql2xiidmaenable &&
3203 qla2x00_gfpn_id(vha, swl) == QLA_SUCCESS) { 3159 qla2x00_gfpn_id(vha, swl) == QLA_SUCCESS) {
@@ -3215,7 +3171,6 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *vha,
3215 if (new_fcport == NULL) { 3171 if (new_fcport == NULL) {
3216 ql_log(ql_log_warn, vha, 0x205e, 3172 ql_log(ql_log_warn, vha, 0x205e,
3217 "Failed to allocate memory for fcport.\n"); 3173 "Failed to allocate memory for fcport.\n");
3218 kfree(swl);
3219 return (QLA_MEMORY_ALLOC_FAILED); 3174 return (QLA_MEMORY_ALLOC_FAILED);
3220 } 3175 }
3221 new_fcport->flags |= (FCF_FABRIC_DEVICE | FCF_LOGIN_NEEDED); 3176 new_fcport->flags |= (FCF_FABRIC_DEVICE | FCF_LOGIN_NEEDED);
@@ -3332,6 +3287,8 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *vha,
3332 WWN_SIZE)) 3287 WWN_SIZE))
3333 continue; 3288 continue;
3334 3289
3290 fcport->scan_state = QLA_FCPORT_FOUND;
3291
3335 found++; 3292 found++;
3336 3293
3337 /* Update port state. */ 3294 /* Update port state. */
@@ -3368,6 +3325,7 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *vha,
3368 fcport->flags |= FCF_LOGIN_NEEDED; 3325 fcport->flags |= FCF_LOGIN_NEEDED;
3369 if (fcport->loop_id != FC_NO_LOOP_ID && 3326 if (fcport->loop_id != FC_NO_LOOP_ID &&
3370 (fcport->flags & FCF_FCP2_DEVICE) == 0 && 3327 (fcport->flags & FCF_FCP2_DEVICE) == 0 &&
3328 (fcport->flags & FCF_ASYNC_SENT) == 0 &&
3371 fcport->port_type != FCT_INITIATOR && 3329 fcport->port_type != FCT_INITIATOR &&
3372 fcport->port_type != FCT_BROADCAST) { 3330 fcport->port_type != FCT_BROADCAST) {
3373 ha->isp_ops->fabric_logout(vha, fcport->loop_id, 3331 ha->isp_ops->fabric_logout(vha, fcport->loop_id,
@@ -3390,14 +3348,12 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *vha,
3390 if (new_fcport == NULL) { 3348 if (new_fcport == NULL) {
3391 ql_log(ql_log_warn, vha, 0x2066, 3349 ql_log(ql_log_warn, vha, 0x2066,
3392 "Memory allocation failed for fcport.\n"); 3350 "Memory allocation failed for fcport.\n");
3393 kfree(swl);
3394 return (QLA_MEMORY_ALLOC_FAILED); 3351 return (QLA_MEMORY_ALLOC_FAILED);
3395 } 3352 }
3396 new_fcport->flags |= (FCF_FABRIC_DEVICE | FCF_LOGIN_NEEDED); 3353 new_fcport->flags |= (FCF_FABRIC_DEVICE | FCF_LOGIN_NEEDED);
3397 new_fcport->d_id.b24 = nxt_d_id.b24; 3354 new_fcport->d_id.b24 = nxt_d_id.b24;
3398 } 3355 }
3399 3356
3400 kfree(swl);
3401 kfree(new_fcport); 3357 kfree(new_fcport);
3402 3358
3403 return (rval); 3359 return (rval);
@@ -3470,6 +3426,9 @@ qla2x00_find_new_loop_id(scsi_qla_host_t *vha, fc_port_t *dev)
3470 3426
3471 /* If not in use then it is free to use. */ 3427 /* If not in use then it is free to use. */
3472 if (!found) { 3428 if (!found) {
3429 ql_dbg(ql_dbg_disc, dev->vha, 0x2086,
3430 "Assigning new loopid=%x, portid=%x.\n",
3431 dev->loop_id, dev->d_id.b24);
3473 break; 3432 break;
3474 } 3433 }
3475 3434
@@ -3488,110 +3447,6 @@ qla2x00_find_new_loop_id(scsi_qla_host_t *vha, fc_port_t *dev)
3488} 3447}
3489 3448
3490/* 3449/*
3491 * qla2x00_device_resync
3492 * Marks devices in the database that needs resynchronization.
3493 *
3494 * Input:
3495 * ha = adapter block pointer.
3496 *
3497 * Context:
3498 * Kernel context.
3499 */
3500static int
3501qla2x00_device_resync(scsi_qla_host_t *vha)
3502{
3503 int rval;
3504 uint32_t mask;
3505 fc_port_t *fcport;
3506 uint32_t rscn_entry;
3507 uint8_t rscn_out_iter;
3508 uint8_t format;
3509 port_id_t d_id = {};
3510
3511 rval = QLA_RSCNS_HANDLED;
3512
3513 while (vha->rscn_out_ptr != vha->rscn_in_ptr ||
3514 vha->flags.rscn_queue_overflow) {
3515
3516 rscn_entry = vha->rscn_queue[vha->rscn_out_ptr];
3517 format = MSB(MSW(rscn_entry));
3518 d_id.b.domain = LSB(MSW(rscn_entry));
3519 d_id.b.area = MSB(LSW(rscn_entry));
3520 d_id.b.al_pa = LSB(LSW(rscn_entry));
3521
3522 ql_dbg(ql_dbg_disc, vha, 0x2020,
3523 "RSCN queue entry[%d] = [%02x/%02x%02x%02x].\n",
3524 vha->rscn_out_ptr, format, d_id.b.domain, d_id.b.area,
3525 d_id.b.al_pa);
3526
3527 vha->rscn_out_ptr++;
3528 if (vha->rscn_out_ptr == MAX_RSCN_COUNT)
3529 vha->rscn_out_ptr = 0;
3530
3531 /* Skip duplicate entries. */
3532 for (rscn_out_iter = vha->rscn_out_ptr;
3533 !vha->flags.rscn_queue_overflow &&
3534 rscn_out_iter != vha->rscn_in_ptr;
3535 rscn_out_iter = (rscn_out_iter ==
3536 (MAX_RSCN_COUNT - 1)) ? 0: rscn_out_iter + 1) {
3537
3538 if (rscn_entry != vha->rscn_queue[rscn_out_iter])
3539 break;
3540
3541 ql_dbg(ql_dbg_disc, vha, 0x2021,
3542 "Skipping duplicate RSCN queue entry found at "
3543 "[%d].\n", rscn_out_iter);
3544
3545 vha->rscn_out_ptr = rscn_out_iter;
3546 }
3547
3548 /* Queue overflow, set switch default case. */
3549 if (vha->flags.rscn_queue_overflow) {
3550 ql_dbg(ql_dbg_disc, vha, 0x2022,
3551 "device_resync: rscn overflow.\n");
3552
3553 format = 3;
3554 vha->flags.rscn_queue_overflow = 0;
3555 }
3556
3557 switch (format) {
3558 case 0:
3559 mask = 0xffffff;
3560 break;
3561 case 1:
3562 mask = 0xffff00;
3563 break;
3564 case 2:
3565 mask = 0xff0000;
3566 break;
3567 default:
3568 mask = 0x0;
3569 d_id.b24 = 0;
3570 vha->rscn_out_ptr = vha->rscn_in_ptr;
3571 break;
3572 }
3573
3574 rval = QLA_SUCCESS;
3575
3576 list_for_each_entry(fcport, &vha->vp_fcports, list) {
3577 if ((fcport->flags & FCF_FABRIC_DEVICE) == 0 ||
3578 (fcport->d_id.b24 & mask) != d_id.b24 ||
3579 fcport->port_type == FCT_BROADCAST)
3580 continue;
3581
3582 if (atomic_read(&fcport->state) == FCS_ONLINE) {
3583 if (format != 3 ||
3584 fcport->port_type != FCT_INITIATOR) {
3585 qla2x00_mark_device_lost(vha, fcport,
3586 0, 0);
3587 }
3588 }
3589 }
3590 }
3591 return (rval);
3592}
3593
3594/*
3595 * qla2x00_fabric_dev_login 3450 * qla2x00_fabric_dev_login
3596 * Login fabric target device and update FC port database. 3451 * Login fabric target device and update FC port database.
3597 * 3452 *
@@ -3644,6 +3499,9 @@ qla2x00_fabric_dev_login(scsi_qla_host_t *vha, fc_port_t *fcport,
3644 } else { 3499 } else {
3645 qla2x00_update_fcport(vha, fcport); 3500 qla2x00_update_fcport(vha, fcport);
3646 } 3501 }
3502 } else {
3503 /* Retry Login. */
3504 qla2x00_mark_device_lost(vha, fcport, 1, 0);
3647 } 3505 }
3648 3506
3649 return (rval); 3507 return (rval);
@@ -3684,9 +3542,12 @@ qla2x00_fabric_login(scsi_qla_host_t *vha, fc_port_t *fcport,
3684 fcport->d_id.b.area, fcport->d_id.b.al_pa); 3542 fcport->d_id.b.area, fcport->d_id.b.al_pa);
3685 3543
3686 /* Login fcport on switch. */ 3544 /* Login fcport on switch. */
3687 ha->isp_ops->fabric_login(vha, fcport->loop_id, 3545 rval = ha->isp_ops->fabric_login(vha, fcport->loop_id,
3688 fcport->d_id.b.domain, fcport->d_id.b.area, 3546 fcport->d_id.b.domain, fcport->d_id.b.area,
3689 fcport->d_id.b.al_pa, mb, BIT_0); 3547 fcport->d_id.b.al_pa, mb, BIT_0);
3548 if (rval != QLA_SUCCESS) {
3549 return rval;
3550 }
3690 if (mb[0] == MBS_PORT_ID_USED) { 3551 if (mb[0] == MBS_PORT_ID_USED) {
3691 /* 3552 /*
3692 * Device has another loop ID. The firmware team 3553 * Device has another loop ID. The firmware team
@@ -4100,15 +3961,8 @@ qla2x00_abort_isp(scsi_qla_host_t *vha)
4100 ha->isp_abort_cnt = 0; 3961 ha->isp_abort_cnt = 0;
4101 clear_bit(ISP_ABORT_RETRY, &vha->dpc_flags); 3962 clear_bit(ISP_ABORT_RETRY, &vha->dpc_flags);
4102 3963
4103 if (IS_QLA81XX(ha)) 3964 if (IS_QLA81XX(ha) || IS_QLA8031(ha))
4104 qla2x00_get_fw_version(vha, 3965 qla2x00_get_fw_version(vha);
4105 &ha->fw_major_version,
4106 &ha->fw_minor_version,
4107 &ha->fw_subminor_version,
4108 &ha->fw_attributes, &ha->fw_memory_size,
4109 ha->mpi_version, &ha->mpi_capabilities,
4110 ha->phy_version);
4111
4112 if (ha->fce) { 3966 if (ha->fce) {
4113 ha->flags.fce_enabled = 1; 3967 ha->flags.fce_enabled = 1;
4114 memset(ha->fce, 0, 3968 memset(ha->fce, 0,
@@ -4974,7 +4828,6 @@ try_blob_fw:
4974 4828
4975 ql_log(ql_log_info, vha, 0x009a, "Update operational firmware.\n"); 4829 ql_log(ql_log_info, vha, 0x009a, "Update operational firmware.\n");
4976 ha->flags.running_gold_fw = 1; 4830 ha->flags.running_gold_fw = 1;
4977
4978 return rval; 4831 return rval;
4979} 4832}
4980 4833
@@ -5009,6 +4862,7 @@ int
5009qla24xx_configure_vhba(scsi_qla_host_t *vha) 4862qla24xx_configure_vhba(scsi_qla_host_t *vha)
5010{ 4863{
5011 int rval = QLA_SUCCESS; 4864 int rval = QLA_SUCCESS;
4865 int rval2;
5012 uint16_t mb[MAILBOX_REGISTER_COUNT]; 4866 uint16_t mb[MAILBOX_REGISTER_COUNT];
5013 struct qla_hw_data *ha = vha->hw; 4867 struct qla_hw_data *ha = vha->hw;
5014 struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev); 4868 struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev);
@@ -5033,12 +4887,18 @@ qla24xx_configure_vhba(scsi_qla_host_t *vha)
5033 vha->flags.management_server_logged_in = 0; 4887 vha->flags.management_server_logged_in = 0;
5034 4888
5035 /* Login to SNS first */ 4889 /* Login to SNS first */
5036 ha->isp_ops->fabric_login(vha, NPH_SNS, 0xff, 0xff, 0xfc, mb, BIT_1); 4890 rval2 = ha->isp_ops->fabric_login(vha, NPH_SNS, 0xff, 0xff, 0xfc, mb,
5037 if (mb[0] != MBS_COMMAND_COMPLETE) { 4891 BIT_1);
5038 ql_dbg(ql_dbg_init, vha, 0x0103, 4892 if (rval2 != QLA_SUCCESS || mb[0] != MBS_COMMAND_COMPLETE) {
5039 "Failed SNS login: loop_id=%x mb[0]=%x mb[1]=%x mb[2]=%x " 4893 if (rval2 == QLA_MEMORY_ALLOC_FAILED)
5040 "mb[6]=%x mb[7]=%x.\n", 4894 ql_dbg(ql_dbg_init, vha, 0x0120,
5041 NPH_SNS, mb[0], mb[1], mb[2], mb[6], mb[7]); 4895 "Failed SNS login: loop_id=%x, rval2=%d\n",
4896 NPH_SNS, rval2);
4897 else
4898 ql_dbg(ql_dbg_init, vha, 0x0103,
4899 "Failed SNS login: loop_id=%x mb[0]=%x mb[1]=%x "
4900 "mb[2]=%x mb[6]=%x mb[7]=%x.\n",
4901 NPH_SNS, mb[0], mb[1], mb[2], mb[6], mb[7]);
5042 return (QLA_FUNCTION_FAILED); 4902 return (QLA_FUNCTION_FAILED);
5043 } 4903 }
5044 4904
@@ -5214,10 +5074,10 @@ qla81xx_nvram_config(scsi_qla_host_t *vha)
5214 nv->reset_delay = 5; 5074 nv->reset_delay = 5;
5215 nv->max_luns_per_target = __constant_cpu_to_le16(128); 5075 nv->max_luns_per_target = __constant_cpu_to_le16(128);
5216 nv->port_down_retry_count = __constant_cpu_to_le16(30); 5076 nv->port_down_retry_count = __constant_cpu_to_le16(30);
5217 nv->link_down_timeout = __constant_cpu_to_le16(30); 5077 nv->link_down_timeout = __constant_cpu_to_le16(180);
5218 nv->enode_mac[0] = 0x00; 5078 nv->enode_mac[0] = 0x00;
5219 nv->enode_mac[1] = 0x02; 5079 nv->enode_mac[1] = 0xC0;
5220 nv->enode_mac[2] = 0x03; 5080 nv->enode_mac[2] = 0xDD;
5221 nv->enode_mac[3] = 0x04; 5081 nv->enode_mac[3] = 0x04;
5222 nv->enode_mac[4] = 0x05; 5082 nv->enode_mac[4] = 0x05;
5223 nv->enode_mac[5] = 0x06 + ha->port_no; 5083 nv->enode_mac[5] = 0x06 + ha->port_no;
@@ -5248,9 +5108,9 @@ qla81xx_nvram_config(scsi_qla_host_t *vha)
5248 memcpy(icb->enode_mac, nv->enode_mac, sizeof(icb->enode_mac)); 5108 memcpy(icb->enode_mac, nv->enode_mac, sizeof(icb->enode_mac));
5249 /* Some boards (with valid NVRAMs) still have NULL enode_mac!! */ 5109 /* Some boards (with valid NVRAMs) still have NULL enode_mac!! */
5250 if (!memcmp(icb->enode_mac, "\0\0\0\0\0\0", sizeof(icb->enode_mac))) { 5110 if (!memcmp(icb->enode_mac, "\0\0\0\0\0\0", sizeof(icb->enode_mac))) {
5251 icb->enode_mac[0] = 0x01; 5111 icb->enode_mac[0] = 0x00;
5252 icb->enode_mac[1] = 0x02; 5112 icb->enode_mac[1] = 0xC0;
5253 icb->enode_mac[2] = 0x03; 5113 icb->enode_mac[2] = 0xDD;
5254 icb->enode_mac[3] = 0x04; 5114 icb->enode_mac[3] = 0x04;
5255 icb->enode_mac[4] = 0x05; 5115 icb->enode_mac[4] = 0x05;
5256 icb->enode_mac[5] = 0x06 + ha->port_no; 5116 icb->enode_mac[5] = 0x06 + ha->port_no;
@@ -5353,6 +5213,10 @@ qla81xx_nvram_config(scsi_qla_host_t *vha)
5353 if (ql2xloginretrycount) 5213 if (ql2xloginretrycount)
5354 ha->login_retry_count = ql2xloginretrycount; 5214 ha->login_retry_count = ql2xloginretrycount;
5355 5215
5216 /* if not running MSI-X we need handshaking on interrupts */
5217 if (!vha->hw->flags.msix_enabled && IS_QLA83XX(ha))
5218 icb->firmware_options_2 |= __constant_cpu_to_le32(BIT_22);
5219
5356 /* Enable ZIO. */ 5220 /* Enable ZIO. */
5357 if (!vha->flags.init_done) { 5221 if (!vha->flags.init_done) {
5358 ha->zio_mode = le32_to_cpu(icb->firmware_options_2) & 5222 ha->zio_mode = le32_to_cpu(icb->firmware_options_2) &
diff --git a/drivers/scsi/qla2xxx/qla_inline.h b/drivers/scsi/qla2xxx/qla_inline.h
index 7cc4f36cd539..6e457643c639 100644
--- a/drivers/scsi/qla2xxx/qla_inline.h
+++ b/drivers/scsi/qla2xxx/qla_inline.h
@@ -72,16 +72,19 @@ static inline void
72qla2x00_clean_dsd_pool(struct qla_hw_data *ha, srb_t *sp) 72qla2x00_clean_dsd_pool(struct qla_hw_data *ha, srb_t *sp)
73{ 73{
74 struct dsd_dma *dsd_ptr, *tdsd_ptr; 74 struct dsd_dma *dsd_ptr, *tdsd_ptr;
75 struct crc_context *ctx;
76
77 ctx = (struct crc_context *)GET_CMD_CTX_SP(sp);
75 78
76 /* clean up allocated prev pool */ 79 /* clean up allocated prev pool */
77 list_for_each_entry_safe(dsd_ptr, tdsd_ptr, 80 list_for_each_entry_safe(dsd_ptr, tdsd_ptr,
78 &((struct crc_context *)sp->ctx)->dsd_list, list) { 81 &ctx->dsd_list, list) {
79 dma_pool_free(ha->dl_dma_pool, dsd_ptr->dsd_addr, 82 dma_pool_free(ha->dl_dma_pool, dsd_ptr->dsd_addr,
80 dsd_ptr->dsd_list_dma); 83 dsd_ptr->dsd_list_dma);
81 list_del(&dsd_ptr->list); 84 list_del(&dsd_ptr->list);
82 kfree(dsd_ptr); 85 kfree(dsd_ptr);
83 } 86 }
84 INIT_LIST_HEAD(&((struct crc_context *)sp->ctx)->dsd_list); 87 INIT_LIST_HEAD(&ctx->dsd_list);
85} 88}
86 89
87static inline void 90static inline void
@@ -113,8 +116,7 @@ qla2x00_hba_err_chk_enabled(srb_t *sp)
113 return 0; 116 return 0;
114 * 117 *
115 */ 118 */
116 119 switch (scsi_get_prot_op(GET_CMD_SP(sp))) {
117 switch (scsi_get_prot_op(sp->cmd)) {
118 case SCSI_PROT_READ_STRIP: 120 case SCSI_PROT_READ_STRIP:
119 case SCSI_PROT_WRITE_INSERT: 121 case SCSI_PROT_WRITE_INSERT:
120 if (ql2xenablehba_err_chk >= 1) 122 if (ql2xenablehba_err_chk >= 1)
@@ -144,3 +146,44 @@ qla2x00_reset_active(scsi_qla_host_t *vha)
144 test_bit(ISP_ABORT_NEEDED, &vha->dpc_flags) || 146 test_bit(ISP_ABORT_NEEDED, &vha->dpc_flags) ||
145 test_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags); 147 test_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags);
146} 148}
149
150static inline srb_t *
151qla2x00_get_sp(scsi_qla_host_t *vha, fc_port_t *fcport, gfp_t flag)
152{
153 srb_t *sp = NULL;
154 struct qla_hw_data *ha = vha->hw;
155 uint8_t bail;
156
157 QLA_VHA_MARK_BUSY(vha, bail);
158 if (unlikely(bail))
159 return NULL;
160
161 sp = mempool_alloc(ha->srb_mempool, flag);
162 if (!sp)
163 goto done;
164
165 memset(sp, 0, sizeof(*sp));
166 sp->fcport = fcport;
167 sp->iocbs = 1;
168done:
169 if (!sp)
170 QLA_VHA_MARK_NOT_BUSY(vha);
171 return sp;
172}
173
174static inline void
175qla2x00_init_timer(srb_t *sp, unsigned long tmo)
176{
177 init_timer(&sp->u.iocb_cmd.timer);
178 sp->u.iocb_cmd.timer.expires = jiffies + tmo * HZ;
179 sp->u.iocb_cmd.timer.data = (unsigned long)sp;
180 sp->u.iocb_cmd.timer.function = qla2x00_sp_timeout;
181 add_timer(&sp->u.iocb_cmd.timer);
182 sp->free = qla2x00_sp_free;
183}
184
185static inline int
186qla2x00_gid_list_size(struct qla_hw_data *ha)
187{
188 return sizeof(struct gid_list_info) * ha->max_fibre_devices;
189}
diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c
index 55a96761b5a4..eac950924497 100644
--- a/drivers/scsi/qla2xxx/qla_iocb.c
+++ b/drivers/scsi/qla2xxx/qla_iocb.c
@@ -22,18 +22,19 @@ static inline uint16_t
22qla2x00_get_cmd_direction(srb_t *sp) 22qla2x00_get_cmd_direction(srb_t *sp)
23{ 23{
24 uint16_t cflags; 24 uint16_t cflags;
25 struct scsi_cmnd *cmd = GET_CMD_SP(sp);
25 26
26 cflags = 0; 27 cflags = 0;
27 28
28 /* Set transfer direction */ 29 /* Set transfer direction */
29 if (sp->cmd->sc_data_direction == DMA_TO_DEVICE) { 30 if (cmd->sc_data_direction == DMA_TO_DEVICE) {
30 cflags = CF_WRITE; 31 cflags = CF_WRITE;
31 sp->fcport->vha->hw->qla_stats.output_bytes += 32 sp->fcport->vha->hw->qla_stats.output_bytes +=
32 scsi_bufflen(sp->cmd); 33 scsi_bufflen(cmd);
33 } else if (sp->cmd->sc_data_direction == DMA_FROM_DEVICE) { 34 } else if (cmd->sc_data_direction == DMA_FROM_DEVICE) {
34 cflags = CF_READ; 35 cflags = CF_READ;
35 sp->fcport->vha->hw->qla_stats.input_bytes += 36 sp->fcport->vha->hw->qla_stats.input_bytes +=
36 scsi_bufflen(sp->cmd); 37 scsi_bufflen(cmd);
37 } 38 }
38 return (cflags); 39 return (cflags);
39} 40}
@@ -143,12 +144,13 @@ qla2x00_prep_cont_type1_iocb(scsi_qla_host_t *vha, struct req_que *req)
143static inline int 144static inline int
144qla24xx_configure_prot_mode(srb_t *sp, uint16_t *fw_prot_opts) 145qla24xx_configure_prot_mode(srb_t *sp, uint16_t *fw_prot_opts)
145{ 146{
146 uint8_t guard = scsi_host_get_guard(sp->cmd->device->host); 147 struct scsi_cmnd *cmd = GET_CMD_SP(sp);
148 uint8_t guard = scsi_host_get_guard(cmd->device->host);
147 149
148 /* We only support T10 DIF right now */ 150 /* We only support T10 DIF right now */
149 if (guard != SHOST_DIX_GUARD_CRC) { 151 if (guard != SHOST_DIX_GUARD_CRC) {
150 ql_dbg(ql_dbg_io, sp->fcport->vha, 0x3007, 152 ql_dbg(ql_dbg_io, sp->fcport->vha, 0x3007,
151 "Unsupported guard: %d for cmd=%p.\n", guard, sp->cmd); 153 "Unsupported guard: %d for cmd=%p.\n", guard, cmd);
152 return 0; 154 return 0;
153 } 155 }
154 156
@@ -156,7 +158,7 @@ qla24xx_configure_prot_mode(srb_t *sp, uint16_t *fw_prot_opts)
156 *fw_prot_opts = 0; 158 *fw_prot_opts = 0;
157 159
158 /* Translate SCSI opcode to a protection opcode */ 160 /* Translate SCSI opcode to a protection opcode */
159 switch (scsi_get_prot_op(sp->cmd)) { 161 switch (scsi_get_prot_op(cmd)) {
160 case SCSI_PROT_READ_STRIP: 162 case SCSI_PROT_READ_STRIP:
161 *fw_prot_opts |= PO_MODE_DIF_REMOVE; 163 *fw_prot_opts |= PO_MODE_DIF_REMOVE;
162 break; 164 break;
@@ -180,7 +182,7 @@ qla24xx_configure_prot_mode(srb_t *sp, uint16_t *fw_prot_opts)
180 break; 182 break;
181 } 183 }
182 184
183 return scsi_prot_sg_count(sp->cmd); 185 return scsi_prot_sg_count(cmd);
184} 186}
185 187
186/* 188/*
@@ -201,7 +203,7 @@ void qla2x00_build_scsi_iocbs_32(srb_t *sp, cmd_entry_t *cmd_pkt,
201 struct scatterlist *sg; 203 struct scatterlist *sg;
202 int i; 204 int i;
203 205
204 cmd = sp->cmd; 206 cmd = GET_CMD_SP(sp);
205 207
206 /* Update entry type to indicate Command Type 2 IOCB */ 208 /* Update entry type to indicate Command Type 2 IOCB */
207 *((uint32_t *)(&cmd_pkt->entry_type)) = 209 *((uint32_t *)(&cmd_pkt->entry_type)) =
@@ -259,7 +261,7 @@ void qla2x00_build_scsi_iocbs_64(srb_t *sp, cmd_entry_t *cmd_pkt,
259 struct scatterlist *sg; 261 struct scatterlist *sg;
260 int i; 262 int i;
261 263
262 cmd = sp->cmd; 264 cmd = GET_CMD_SP(sp);
263 265
264 /* Update entry type to indicate Command Type 3 IOCB */ 266 /* Update entry type to indicate Command Type 3 IOCB */
265 *((uint32_t *)(&cmd_pkt->entry_type)) = 267 *((uint32_t *)(&cmd_pkt->entry_type)) =
@@ -333,7 +335,7 @@ qla2x00_start_scsi(srb_t *sp)
333 vha = sp->fcport->vha; 335 vha = sp->fcport->vha;
334 ha = vha->hw; 336 ha = vha->hw;
335 reg = &ha->iobase->isp; 337 reg = &ha->iobase->isp;
336 cmd = sp->cmd; 338 cmd = GET_CMD_SP(sp);
337 req = ha->req_q_map[0]; 339 req = ha->req_q_map[0];
338 rsp = ha->rsp_q_map[0]; 340 rsp = ha->rsp_q_map[0];
339 /* So we know we haven't pci_map'ed anything yet */ 341 /* So we know we haven't pci_map'ed anything yet */
@@ -391,7 +393,7 @@ qla2x00_start_scsi(srb_t *sp)
391 req->current_outstanding_cmd = handle; 393 req->current_outstanding_cmd = handle;
392 req->outstanding_cmds[handle] = sp; 394 req->outstanding_cmds[handle] = sp;
393 sp->handle = handle; 395 sp->handle = handle;
394 sp->cmd->host_scribble = (unsigned char *)(unsigned long)handle; 396 cmd->host_scribble = (unsigned char *)(unsigned long)handle;
395 req->cnt -= req_cnt; 397 req->cnt -= req_cnt;
396 398
397 cmd_pkt = (cmd_entry_t *)req->ring_ptr; 399 cmd_pkt = (cmd_entry_t *)req->ring_ptr;
@@ -403,7 +405,7 @@ qla2x00_start_scsi(srb_t *sp)
403 405
404 /* Set target ID and LUN number*/ 406 /* Set target ID and LUN number*/
405 SET_TARGET_ID(ha, cmd_pkt->target, sp->fcport->loop_id); 407 SET_TARGET_ID(ha, cmd_pkt->target, sp->fcport->loop_id);
406 cmd_pkt->lun = cpu_to_le16(sp->cmd->device->lun); 408 cmd_pkt->lun = cpu_to_le16(cmd->device->lun);
407 409
408 /* Update tagged queuing modifier */ 410 /* Update tagged queuing modifier */
409 if (scsi_populate_tag_msg(cmd, tag)) { 411 if (scsi_populate_tag_msg(cmd, tag)) {
@@ -473,7 +475,6 @@ qla2x00_start_iocbs(struct scsi_qla_host *vha, struct req_que *req)
473{ 475{
474 struct qla_hw_data *ha = vha->hw; 476 struct qla_hw_data *ha = vha->hw;
475 device_reg_t __iomem *reg = ISP_QUE_REG(ha, req->id); 477 device_reg_t __iomem *reg = ISP_QUE_REG(ha, req->id);
476 struct device_reg_2xxx __iomem *ioreg = &ha->iobase->isp;
477 478
478 if (IS_QLA82XX(ha)) { 479 if (IS_QLA82XX(ha)) {
479 qla82xx_start_iocbs(vha); 480 qla82xx_start_iocbs(vha);
@@ -487,9 +488,9 @@ qla2x00_start_iocbs(struct scsi_qla_host *vha, struct req_que *req)
487 req->ring_ptr++; 488 req->ring_ptr++;
488 489
489 /* Set chip new ring index. */ 490 /* Set chip new ring index. */
490 if (ha->mqenable) { 491 if (ha->mqenable || IS_QLA83XX(ha)) {
491 WRT_REG_DWORD(&reg->isp25mq.req_q_in, req->ring_index); 492 WRT_REG_DWORD(req->req_q_in, req->ring_index);
492 RD_REG_DWORD(&ioreg->hccr); 493 RD_REG_DWORD_RELAXED(&ha->iobase->isp24.hccr);
493 } else if (IS_FWI2_CAPABLE(ha)) { 494 } else if (IS_FWI2_CAPABLE(ha)) {
494 WRT_REG_DWORD(&reg->isp24.req_q_in, req->ring_index); 495 WRT_REG_DWORD(&reg->isp24.req_q_in, req->ring_index);
495 RD_REG_DWORD_RELAXED(&reg->isp24.req_q_in); 496 RD_REG_DWORD_RELAXED(&reg->isp24.req_q_in);
@@ -609,7 +610,7 @@ qla24xx_build_scsi_type_6_iocbs(srb_t *sp, struct cmd_type_6 *cmd_pkt,
609 struct dsd_dma *dsd_ptr; 610 struct dsd_dma *dsd_ptr;
610 struct ct6_dsd *ctx; 611 struct ct6_dsd *ctx;
611 612
612 cmd = sp->cmd; 613 cmd = GET_CMD_SP(sp);
613 614
614 /* Update entry type to indicate Command Type 3 IOCB */ 615 /* Update entry type to indicate Command Type 3 IOCB */
615 *((uint32_t *)(&cmd_pkt->entry_type)) = 616 *((uint32_t *)(&cmd_pkt->entry_type)) =
@@ -636,7 +637,7 @@ qla24xx_build_scsi_type_6_iocbs(srb_t *sp, struct cmd_type_6 *cmd_pkt,
636 } 637 }
637 638
638 cur_seg = scsi_sglist(cmd); 639 cur_seg = scsi_sglist(cmd);
639 ctx = sp->ctx; 640 ctx = GET_CMD_CTX_SP(sp);
640 641
641 while (tot_dsds) { 642 while (tot_dsds) {
642 avail_dsds = (tot_dsds > QLA_DSDS_PER_IOCB) ? 643 avail_dsds = (tot_dsds > QLA_DSDS_PER_IOCB) ?
@@ -725,7 +726,7 @@ qla24xx_build_scsi_iocbs(srb_t *sp, struct cmd_type_7 *cmd_pkt,
725 int i; 726 int i;
726 struct req_que *req; 727 struct req_que *req;
727 728
728 cmd = sp->cmd; 729 cmd = GET_CMD_SP(sp);
729 730
730 /* Update entry type to indicate Command Type 3 IOCB */ 731 /* Update entry type to indicate Command Type 3 IOCB */
731 *((uint32_t *)(&cmd_pkt->entry_type)) = 732 *((uint32_t *)(&cmd_pkt->entry_type)) =
@@ -745,12 +746,12 @@ qla24xx_build_scsi_iocbs(srb_t *sp, struct cmd_type_7 *cmd_pkt,
745 cmd_pkt->task_mgmt_flags = 746 cmd_pkt->task_mgmt_flags =
746 __constant_cpu_to_le16(TMF_WRITE_DATA); 747 __constant_cpu_to_le16(TMF_WRITE_DATA);
747 sp->fcport->vha->hw->qla_stats.output_bytes += 748 sp->fcport->vha->hw->qla_stats.output_bytes +=
748 scsi_bufflen(sp->cmd); 749 scsi_bufflen(cmd);
749 } else if (cmd->sc_data_direction == DMA_FROM_DEVICE) { 750 } else if (cmd->sc_data_direction == DMA_FROM_DEVICE) {
750 cmd_pkt->task_mgmt_flags = 751 cmd_pkt->task_mgmt_flags =
751 __constant_cpu_to_le16(TMF_READ_DATA); 752 __constant_cpu_to_le16(TMF_READ_DATA);
752 sp->fcport->vha->hw->qla_stats.input_bytes += 753 sp->fcport->vha->hw->qla_stats.input_bytes +=
753 scsi_bufflen(sp->cmd); 754 scsi_bufflen(cmd);
754 } 755 }
755 756
756 /* One DSD is available in the Command Type 3 IOCB */ 757 /* One DSD is available in the Command Type 3 IOCB */
@@ -797,7 +798,7 @@ static inline void
797qla24xx_set_t10dif_tags(srb_t *sp, struct fw_dif_context *pkt, 798qla24xx_set_t10dif_tags(srb_t *sp, struct fw_dif_context *pkt,
798 unsigned int protcnt) 799 unsigned int protcnt)
799{ 800{
800 struct scsi_cmnd *cmd = sp->cmd; 801 struct scsi_cmnd *cmd = GET_CMD_SP(sp);
801 scsi_qla_host_t *vha = shost_priv(cmd->device->host); 802 scsi_qla_host_t *vha = shost_priv(cmd->device->host);
802 803
803 switch (scsi_get_prot_type(cmd)) { 804 switch (scsi_get_prot_type(cmd)) {
@@ -952,16 +953,16 @@ qla24xx_walk_and_build_sglist_no_difb(struct qla_hw_data *ha, srb_t *sp,
952 struct qla2_sgx sgx; 953 struct qla2_sgx sgx;
953 dma_addr_t sle_dma; 954 dma_addr_t sle_dma;
954 uint32_t sle_dma_len, tot_prot_dma_len = 0; 955 uint32_t sle_dma_len, tot_prot_dma_len = 0;
955 struct scsi_cmnd *cmd = sp->cmd; 956 struct scsi_cmnd *cmd = GET_CMD_SP(sp);
956 957
957 prot_int = cmd->device->sector_size; 958 prot_int = cmd->device->sector_size;
958 959
959 memset(&sgx, 0, sizeof(struct qla2_sgx)); 960 memset(&sgx, 0, sizeof(struct qla2_sgx));
960 sgx.tot_bytes = scsi_bufflen(sp->cmd); 961 sgx.tot_bytes = scsi_bufflen(cmd);
961 sgx.cur_sg = scsi_sglist(sp->cmd); 962 sgx.cur_sg = scsi_sglist(cmd);
962 sgx.sp = sp; 963 sgx.sp = sp;
963 964
964 sg_prot = scsi_prot_sglist(sp->cmd); 965 sg_prot = scsi_prot_sglist(cmd);
965 966
966 while (qla24xx_get_one_block_sg(prot_int, &sgx, &partial)) { 967 while (qla24xx_get_one_block_sg(prot_int, &sgx, &partial)) {
967 968
@@ -995,7 +996,7 @@ alloc_and_fill:
995 } 996 }
996 997
997 list_add_tail(&dsd_ptr->list, 998 list_add_tail(&dsd_ptr->list,
998 &((struct crc_context *)sp->ctx)->dsd_list); 999 &((struct crc_context *)sp->u.scmd.ctx)->dsd_list);
999 1000
1000 sp->flags |= SRB_CRC_CTX_DSD_VALID; 1001 sp->flags |= SRB_CRC_CTX_DSD_VALID;
1001 1002
@@ -1044,11 +1045,12 @@ qla24xx_walk_and_build_sglist(struct qla_hw_data *ha, srb_t *sp, uint32_t *dsd,
1044 uint32_t *cur_dsd = dsd; 1045 uint32_t *cur_dsd = dsd;
1045 int i; 1046 int i;
1046 uint16_t used_dsds = tot_dsds; 1047 uint16_t used_dsds = tot_dsds;
1047 scsi_qla_host_t *vha = shost_priv(sp->cmd->device->host); 1048 struct scsi_cmnd *cmd = GET_CMD_SP(sp);
1049 scsi_qla_host_t *vha = shost_priv(cmd->device->host);
1048 1050
1049 uint8_t *cp; 1051 uint8_t *cp;
1050 1052
1051 scsi_for_each_sg(sp->cmd, sg, tot_dsds, i) { 1053 scsi_for_each_sg(cmd, sg, tot_dsds, i) {
1052 dma_addr_t sle_dma; 1054 dma_addr_t sle_dma;
1053 1055
1054 /* Allocate additional continuation packets? */ 1056 /* Allocate additional continuation packets? */
@@ -1078,7 +1080,7 @@ qla24xx_walk_and_build_sglist(struct qla_hw_data *ha, srb_t *sp, uint32_t *dsd,
1078 } 1080 }
1079 1081
1080 list_add_tail(&dsd_ptr->list, 1082 list_add_tail(&dsd_ptr->list,
1081 &((struct crc_context *)sp->ctx)->dsd_list); 1083 &((struct crc_context *)sp->u.scmd.ctx)->dsd_list);
1082 1084
1083 sp->flags |= SRB_CRC_CTX_DSD_VALID; 1085 sp->flags |= SRB_CRC_CTX_DSD_VALID;
1084 1086
@@ -1091,17 +1093,16 @@ qla24xx_walk_and_build_sglist(struct qla_hw_data *ha, srb_t *sp, uint32_t *dsd,
1091 sle_dma = sg_dma_address(sg); 1093 sle_dma = sg_dma_address(sg);
1092 ql_dbg(ql_dbg_io, vha, 0x300a, 1094 ql_dbg(ql_dbg_io, vha, 0x300a,
1093 "sg entry %d - addr=0x%x 0x%x, " "len=%d for cmd=%p.\n", 1095 "sg entry %d - addr=0x%x 0x%x, " "len=%d for cmd=%p.\n",
1094 i, LSD(sle_dma), MSD(sle_dma), sg_dma_len(sg), 1096 i, LSD(sle_dma), MSD(sle_dma), sg_dma_len(sg), cmd);
1095 sp->cmd);
1096 *cur_dsd++ = cpu_to_le32(LSD(sle_dma)); 1097 *cur_dsd++ = cpu_to_le32(LSD(sle_dma));
1097 *cur_dsd++ = cpu_to_le32(MSD(sle_dma)); 1098 *cur_dsd++ = cpu_to_le32(MSD(sle_dma));
1098 *cur_dsd++ = cpu_to_le32(sg_dma_len(sg)); 1099 *cur_dsd++ = cpu_to_le32(sg_dma_len(sg));
1099 avail_dsds--; 1100 avail_dsds--;
1100 1101
1101 if (scsi_get_prot_op(sp->cmd) == SCSI_PROT_WRITE_PASS) { 1102 if (scsi_get_prot_op(cmd) == SCSI_PROT_WRITE_PASS) {
1102 cp = page_address(sg_page(sg)) + sg->offset; 1103 cp = page_address(sg_page(sg)) + sg->offset;
1103 ql_dbg(ql_dbg_io, vha, 0x300b, 1104 ql_dbg(ql_dbg_io, vha, 0x300b,
1104 "User data buffer=%p for cmd=%p.\n", cp, sp->cmd); 1105 "User data buffer=%p for cmd=%p.\n", cp, cmd);
1105 } 1106 }
1106 } 1107 }
1107 /* Null termination */ 1108 /* Null termination */
@@ -1128,8 +1129,7 @@ qla24xx_walk_and_build_prot_sglist(struct qla_hw_data *ha, srb_t *sp,
1128 scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev); 1129 scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev);
1129 uint8_t *cp; 1130 uint8_t *cp;
1130 1131
1131 1132 cmd = GET_CMD_SP(sp);
1132 cmd = sp->cmd;
1133 scsi_for_each_prot_sg(cmd, sg, tot_dsds, i) { 1133 scsi_for_each_prot_sg(cmd, sg, tot_dsds, i) {
1134 dma_addr_t sle_dma; 1134 dma_addr_t sle_dma;
1135 1135
@@ -1160,7 +1160,7 @@ qla24xx_walk_and_build_prot_sglist(struct qla_hw_data *ha, srb_t *sp,
1160 } 1160 }
1161 1161
1162 list_add_tail(&dsd_ptr->list, 1162 list_add_tail(&dsd_ptr->list,
1163 &((struct crc_context *)sp->ctx)->dsd_list); 1163 &((struct crc_context *)sp->u.scmd.ctx)->dsd_list);
1164 1164
1165 sp->flags |= SRB_CRC_CTX_DSD_VALID; 1165 sp->flags |= SRB_CRC_CTX_DSD_VALID;
1166 1166
@@ -1171,7 +1171,7 @@ qla24xx_walk_and_build_prot_sglist(struct qla_hw_data *ha, srb_t *sp,
1171 cur_dsd = (uint32_t *)next_dsd; 1171 cur_dsd = (uint32_t *)next_dsd;
1172 } 1172 }
1173 sle_dma = sg_dma_address(sg); 1173 sle_dma = sg_dma_address(sg);
1174 if (scsi_get_prot_op(sp->cmd) == SCSI_PROT_WRITE_PASS) { 1174 if (scsi_get_prot_op(cmd) == SCSI_PROT_WRITE_PASS) {
1175 ql_dbg(ql_dbg_io, vha, 0x3027, 1175 ql_dbg(ql_dbg_io, vha, 0x3027,
1176 "%s(): %p, sg_entry %d - " 1176 "%s(): %p, sg_entry %d - "
1177 "addr=0x%x0x%x, len=%d.\n", 1177 "addr=0x%x0x%x, len=%d.\n",
@@ -1182,7 +1182,7 @@ qla24xx_walk_and_build_prot_sglist(struct qla_hw_data *ha, srb_t *sp,
1182 *cur_dsd++ = cpu_to_le32(MSD(sle_dma)); 1182 *cur_dsd++ = cpu_to_le32(MSD(sle_dma));
1183 *cur_dsd++ = cpu_to_le32(sg_dma_len(sg)); 1183 *cur_dsd++ = cpu_to_le32(sg_dma_len(sg));
1184 1184
1185 if (scsi_get_prot_op(sp->cmd) == SCSI_PROT_WRITE_PASS) { 1185 if (scsi_get_prot_op(cmd) == SCSI_PROT_WRITE_PASS) {
1186 cp = page_address(sg_page(sg)) + sg->offset; 1186 cp = page_address(sg_page(sg)) + sg->offset;
1187 ql_dbg(ql_dbg_io, vha, 0x3028, 1187 ql_dbg(ql_dbg_io, vha, 0x3028,
1188 "%s(): Protection Data buffer = %p.\n", __func__, 1188 "%s(): Protection Data buffer = %p.\n", __func__,
@@ -1228,7 +1228,7 @@ qla24xx_build_scsi_crc_2_iocbs(srb_t *sp, struct cmd_type_crc_2 *cmd_pkt,
1228 dma_addr_t crc_ctx_dma; 1228 dma_addr_t crc_ctx_dma;
1229 char tag[2]; 1229 char tag[2];
1230 1230
1231 cmd = sp->cmd; 1231 cmd = GET_CMD_SP(sp);
1232 1232
1233 sgc = 0; 1233 sgc = 0;
1234 /* Update entry type to indicate Command Type CRC_2 IOCB */ 1234 /* Update entry type to indicate Command Type CRC_2 IOCB */
@@ -1256,15 +1256,15 @@ qla24xx_build_scsi_crc_2_iocbs(srb_t *sp, struct cmd_type_crc_2 *cmd_pkt,
1256 __constant_cpu_to_le16(CF_READ_DATA); 1256 __constant_cpu_to_le16(CF_READ_DATA);
1257 } 1257 }
1258 1258
1259 if ((scsi_get_prot_op(sp->cmd) == SCSI_PROT_READ_INSERT) || 1259 if ((scsi_get_prot_op(cmd) == SCSI_PROT_READ_INSERT) ||
1260 (scsi_get_prot_op(sp->cmd) == SCSI_PROT_WRITE_STRIP) || 1260 (scsi_get_prot_op(cmd) == SCSI_PROT_WRITE_STRIP) ||
1261 (scsi_get_prot_op(sp->cmd) == SCSI_PROT_READ_STRIP) || 1261 (scsi_get_prot_op(cmd) == SCSI_PROT_READ_STRIP) ||
1262 (scsi_get_prot_op(sp->cmd) == SCSI_PROT_WRITE_INSERT)) 1262 (scsi_get_prot_op(cmd) == SCSI_PROT_WRITE_INSERT))
1263 bundling = 0; 1263 bundling = 0;
1264 1264
1265 /* Allocate CRC context from global pool */ 1265 /* Allocate CRC context from global pool */
1266 crc_ctx_pkt = sp->ctx = dma_pool_alloc(ha->dl_dma_pool, 1266 crc_ctx_pkt = sp->u.scmd.ctx =
1267 GFP_ATOMIC, &crc_ctx_dma); 1267 dma_pool_alloc(ha->dl_dma_pool, GFP_ATOMIC, &crc_ctx_dma);
1268 1268
1269 if (!crc_ctx_pkt) 1269 if (!crc_ctx_pkt)
1270 goto crc_queuing_error; 1270 goto crc_queuing_error;
@@ -1310,7 +1310,7 @@ qla24xx_build_scsi_crc_2_iocbs(srb_t *sp, struct cmd_type_crc_2 *cmd_pkt,
1310 else if (cmd->sc_data_direction == DMA_FROM_DEVICE) 1310 else if (cmd->sc_data_direction == DMA_FROM_DEVICE)
1311 fcp_cmnd->additional_cdb_len |= 2; 1311 fcp_cmnd->additional_cdb_len |= 2;
1312 1312
1313 int_to_scsilun(sp->cmd->device->lun, &fcp_cmnd->lun); 1313 int_to_scsilun(cmd->device->lun, &fcp_cmnd->lun);
1314 memcpy(fcp_cmnd->cdb, cmd->cmnd, cmd->cmd_len); 1314 memcpy(fcp_cmnd->cdb, cmd->cmnd, cmd->cmd_len);
1315 cmd_pkt->fcp_cmnd_dseg_len = cpu_to_le16(fcp_cmnd_len); 1315 cmd_pkt->fcp_cmnd_dseg_len = cpu_to_le16(fcp_cmnd_len);
1316 cmd_pkt->fcp_cmnd_dseg_address[0] = cpu_to_le32( 1316 cmd_pkt->fcp_cmnd_dseg_address[0] = cpu_to_le32(
@@ -1345,7 +1345,7 @@ qla24xx_build_scsi_crc_2_iocbs(srb_t *sp, struct cmd_type_crc_2 *cmd_pkt,
1345 blk_size = cmd->device->sector_size; 1345 blk_size = cmd->device->sector_size;
1346 dif_bytes = (data_bytes / blk_size) * 8; 1346 dif_bytes = (data_bytes / blk_size) * 8;
1347 1347
1348 switch (scsi_get_prot_op(sp->cmd)) { 1348 switch (scsi_get_prot_op(GET_CMD_SP(sp))) {
1349 case SCSI_PROT_READ_INSERT: 1349 case SCSI_PROT_READ_INSERT:
1350 case SCSI_PROT_WRITE_STRIP: 1350 case SCSI_PROT_WRITE_STRIP:
1351 total_bytes = data_bytes; 1351 total_bytes = data_bytes;
@@ -1445,7 +1445,7 @@ qla24xx_start_scsi(srb_t *sp)
1445 uint16_t tot_dsds; 1445 uint16_t tot_dsds;
1446 struct req_que *req = NULL; 1446 struct req_que *req = NULL;
1447 struct rsp_que *rsp = NULL; 1447 struct rsp_que *rsp = NULL;
1448 struct scsi_cmnd *cmd = sp->cmd; 1448 struct scsi_cmnd *cmd = GET_CMD_SP(sp);
1449 struct scsi_qla_host *vha = sp->fcport->vha; 1449 struct scsi_qla_host *vha = sp->fcport->vha;
1450 struct qla_hw_data *ha = vha->hw; 1450 struct qla_hw_data *ha = vha->hw;
1451 char tag[2]; 1451 char tag[2];
@@ -1510,7 +1510,7 @@ qla24xx_start_scsi(srb_t *sp)
1510 req->current_outstanding_cmd = handle; 1510 req->current_outstanding_cmd = handle;
1511 req->outstanding_cmds[handle] = sp; 1511 req->outstanding_cmds[handle] = sp;
1512 sp->handle = handle; 1512 sp->handle = handle;
1513 sp->cmd->host_scribble = (unsigned char *)(unsigned long)handle; 1513 cmd->host_scribble = (unsigned char *)(unsigned long)handle;
1514 req->cnt -= req_cnt; 1514 req->cnt -= req_cnt;
1515 1515
1516 cmd_pkt = (struct cmd_type_7 *)req->ring_ptr; 1516 cmd_pkt = (struct cmd_type_7 *)req->ring_ptr;
@@ -1529,7 +1529,7 @@ qla24xx_start_scsi(srb_t *sp)
1529 cmd_pkt->port_id[2] = sp->fcport->d_id.b.domain; 1529 cmd_pkt->port_id[2] = sp->fcport->d_id.b.domain;
1530 cmd_pkt->vp_index = sp->fcport->vp_idx; 1530 cmd_pkt->vp_index = sp->fcport->vp_idx;
1531 1531
1532 int_to_scsilun(sp->cmd->device->lun, &cmd_pkt->lun); 1532 int_to_scsilun(cmd->device->lun, &cmd_pkt->lun);
1533 host_to_fcp_swap((uint8_t *)&cmd_pkt->lun, sizeof(cmd_pkt->lun)); 1533 host_to_fcp_swap((uint8_t *)&cmd_pkt->lun, sizeof(cmd_pkt->lun));
1534 1534
1535 /* Update tagged queuing modifier -- default is TSK_SIMPLE (0). */ 1535 /* Update tagged queuing modifier -- default is TSK_SIMPLE (0). */
@@ -1611,7 +1611,7 @@ qla24xx_dif_start_scsi(srb_t *sp)
1611 uint16_t fw_prot_opts = 0; 1611 uint16_t fw_prot_opts = 0;
1612 struct req_que *req = NULL; 1612 struct req_que *req = NULL;
1613 struct rsp_que *rsp = NULL; 1613 struct rsp_que *rsp = NULL;
1614 struct scsi_cmnd *cmd = sp->cmd; 1614 struct scsi_cmnd *cmd = GET_CMD_SP(sp);
1615 struct scsi_qla_host *vha = sp->fcport->vha; 1615 struct scsi_qla_host *vha = sp->fcport->vha;
1616 struct qla_hw_data *ha = vha->hw; 1616 struct qla_hw_data *ha = vha->hw;
1617 struct cmd_type_crc_2 *cmd_pkt; 1617 struct cmd_type_crc_2 *cmd_pkt;
@@ -1728,7 +1728,7 @@ qla24xx_dif_start_scsi(srb_t *sp)
1728 req->current_outstanding_cmd = handle; 1728 req->current_outstanding_cmd = handle;
1729 req->outstanding_cmds[handle] = sp; 1729 req->outstanding_cmds[handle] = sp;
1730 sp->handle = handle; 1730 sp->handle = handle;
1731 sp->cmd->host_scribble = (unsigned char *)(unsigned long)handle; 1731 cmd->host_scribble = (unsigned char *)(unsigned long)handle;
1732 req->cnt -= req_cnt; 1732 req->cnt -= req_cnt;
1733 1733
1734 /* Fill-in common area */ 1734 /* Fill-in common area */
@@ -1744,7 +1744,7 @@ qla24xx_dif_start_scsi(srb_t *sp)
1744 cmd_pkt->port_id[1] = sp->fcport->d_id.b.area; 1744 cmd_pkt->port_id[1] = sp->fcport->d_id.b.area;
1745 cmd_pkt->port_id[2] = sp->fcport->d_id.b.domain; 1745 cmd_pkt->port_id[2] = sp->fcport->d_id.b.domain;
1746 1746
1747 int_to_scsilun(sp->cmd->device->lun, &cmd_pkt->lun); 1747 int_to_scsilun(cmd->device->lun, &cmd_pkt->lun);
1748 host_to_fcp_swap((uint8_t *)&cmd_pkt->lun, sizeof(cmd_pkt->lun)); 1748 host_to_fcp_swap((uint8_t *)&cmd_pkt->lun, sizeof(cmd_pkt->lun));
1749 1749
1750 /* Total Data and protection segment(s) */ 1750 /* Total Data and protection segment(s) */
@@ -1797,7 +1797,7 @@ queuing_error:
1797 1797
1798static void qla25xx_set_que(srb_t *sp, struct rsp_que **rsp) 1798static void qla25xx_set_que(srb_t *sp, struct rsp_que **rsp)
1799{ 1799{
1800 struct scsi_cmnd *cmd = sp->cmd; 1800 struct scsi_cmnd *cmd = GET_CMD_SP(sp);
1801 struct qla_hw_data *ha = sp->fcport->vha->hw; 1801 struct qla_hw_data *ha = sp->fcport->vha->hw;
1802 int affinity = cmd->request->cpu; 1802 int affinity = cmd->request->cpu;
1803 1803
@@ -1818,7 +1818,6 @@ qla2x00_alloc_iocbs(scsi_qla_host_t *vha, srb_t *sp)
1818 uint32_t index, handle; 1818 uint32_t index, handle;
1819 request_t *pkt; 1819 request_t *pkt;
1820 uint16_t cnt, req_cnt; 1820 uint16_t cnt, req_cnt;
1821 struct srb_ctx *ctx;
1822 1821
1823 pkt = NULL; 1822 pkt = NULL;
1824 req_cnt = 1; 1823 req_cnt = 1;
@@ -1848,15 +1847,13 @@ qla2x00_alloc_iocbs(scsi_qla_host_t *vha, srb_t *sp)
1848 sp->handle = handle; 1847 sp->handle = handle;
1849 1848
1850 /* Adjust entry-counts as needed. */ 1849 /* Adjust entry-counts as needed. */
1851 if (sp->ctx) { 1850 if (sp->type != SRB_SCSI_CMD)
1852 ctx = sp->ctx; 1851 req_cnt = sp->iocbs;
1853 req_cnt = ctx->iocbs;
1854 }
1855 1852
1856skip_cmd_array: 1853skip_cmd_array:
1857 /* Check for room on request queue. */ 1854 /* Check for room on request queue. */
1858 if (req->cnt < req_cnt) { 1855 if (req->cnt < req_cnt) {
1859 if (ha->mqenable) 1856 if (ha->mqenable || IS_QLA83XX(ha))
1860 cnt = RD_REG_DWORD(&reg->isp25mq.req_q_out); 1857 cnt = RD_REG_DWORD(&reg->isp25mq.req_q_out);
1861 else if (IS_QLA82XX(ha)) 1858 else if (IS_QLA82XX(ha))
1862 cnt = RD_REG_DWORD(&reg->isp82.req_q_out); 1859 cnt = RD_REG_DWORD(&reg->isp82.req_q_out);
@@ -1889,8 +1886,7 @@ queuing_error:
1889static void 1886static void
1890qla24xx_login_iocb(srb_t *sp, struct logio_entry_24xx *logio) 1887qla24xx_login_iocb(srb_t *sp, struct logio_entry_24xx *logio)
1891{ 1888{
1892 struct srb_ctx *ctx = sp->ctx; 1889 struct srb_iocb *lio = &sp->u.iocb_cmd;
1893 struct srb_iocb *lio = ctx->u.iocb_cmd;
1894 1890
1895 logio->entry_type = LOGINOUT_PORT_IOCB_TYPE; 1891 logio->entry_type = LOGINOUT_PORT_IOCB_TYPE;
1896 logio->control_flags = cpu_to_le16(LCF_COMMAND_PLOGI); 1892 logio->control_flags = cpu_to_le16(LCF_COMMAND_PLOGI);
@@ -1909,8 +1905,7 @@ static void
1909qla2x00_login_iocb(srb_t *sp, struct mbx_entry *mbx) 1905qla2x00_login_iocb(srb_t *sp, struct mbx_entry *mbx)
1910{ 1906{
1911 struct qla_hw_data *ha = sp->fcport->vha->hw; 1907 struct qla_hw_data *ha = sp->fcport->vha->hw;
1912 struct srb_ctx *ctx = sp->ctx; 1908 struct srb_iocb *lio = &sp->u.iocb_cmd;
1913 struct srb_iocb *lio = ctx->u.iocb_cmd;
1914 uint16_t opts; 1909 uint16_t opts;
1915 1910
1916 mbx->entry_type = MBX_IOCB_TYPE; 1911 mbx->entry_type = MBX_IOCB_TYPE;
@@ -1999,8 +1994,7 @@ qla24xx_tm_iocb(srb_t *sp, struct tsk_mgmt_entry *tsk)
1999 struct fc_port *fcport = sp->fcport; 1994 struct fc_port *fcport = sp->fcport;
2000 scsi_qla_host_t *vha = fcport->vha; 1995 scsi_qla_host_t *vha = fcport->vha;
2001 struct qla_hw_data *ha = vha->hw; 1996 struct qla_hw_data *ha = vha->hw;
2002 struct srb_ctx *ctx = sp->ctx; 1997 struct srb_iocb *iocb = &sp->u.iocb_cmd;
2003 struct srb_iocb *iocb = ctx->u.iocb_cmd;
2004 struct req_que *req = vha->req; 1998 struct req_que *req = vha->req;
2005 1999
2006 flags = iocb->u.tmf.flags; 2000 flags = iocb->u.tmf.flags;
@@ -2027,7 +2021,7 @@ qla24xx_tm_iocb(srb_t *sp, struct tsk_mgmt_entry *tsk)
2027static void 2021static void
2028qla24xx_els_iocb(srb_t *sp, struct els_entry_24xx *els_iocb) 2022qla24xx_els_iocb(srb_t *sp, struct els_entry_24xx *els_iocb)
2029{ 2023{
2030 struct fc_bsg_job *bsg_job = ((struct srb_ctx *)sp->ctx)->u.bsg_job; 2024 struct fc_bsg_job *bsg_job = sp->u.bsg_job;
2031 2025
2032 els_iocb->entry_type = ELS_IOCB_TYPE; 2026 els_iocb->entry_type = ELS_IOCB_TYPE;
2033 els_iocb->entry_count = 1; 2027 els_iocb->entry_count = 1;
@@ -2041,7 +2035,7 @@ qla24xx_els_iocb(srb_t *sp, struct els_entry_24xx *els_iocb)
2041 els_iocb->rx_dsd_count = __constant_cpu_to_le16(bsg_job->reply_payload.sg_cnt); 2035 els_iocb->rx_dsd_count = __constant_cpu_to_le16(bsg_job->reply_payload.sg_cnt);
2042 2036
2043 els_iocb->opcode = 2037 els_iocb->opcode =
2044 (((struct srb_ctx *)sp->ctx)->type == SRB_ELS_CMD_RPT) ? 2038 sp->type == SRB_ELS_CMD_RPT ?
2045 bsg_job->request->rqst_data.r_els.els_code : 2039 bsg_job->request->rqst_data.r_els.els_code :
2046 bsg_job->request->rqst_data.h_els.command_code; 2040 bsg_job->request->rqst_data.h_els.command_code;
2047 els_iocb->port_id[0] = sp->fcport->d_id.b.al_pa; 2041 els_iocb->port_id[0] = sp->fcport->d_id.b.al_pa;
@@ -2078,7 +2072,7 @@ qla2x00_ct_iocb(srb_t *sp, ms_iocb_entry_t *ct_iocb)
2078 uint16_t tot_dsds; 2072 uint16_t tot_dsds;
2079 scsi_qla_host_t *vha = sp->fcport->vha; 2073 scsi_qla_host_t *vha = sp->fcport->vha;
2080 struct qla_hw_data *ha = vha->hw; 2074 struct qla_hw_data *ha = vha->hw;
2081 struct fc_bsg_job *bsg_job = ((struct srb_ctx *)sp->ctx)->u.bsg_job; 2075 struct fc_bsg_job *bsg_job = sp->u.bsg_job;
2082 int loop_iterartion = 0; 2076 int loop_iterartion = 0;
2083 int cont_iocb_prsnt = 0; 2077 int cont_iocb_prsnt = 0;
2084 int entry_count = 1; 2078 int entry_count = 1;
@@ -2155,7 +2149,7 @@ qla24xx_ct_iocb(srb_t *sp, struct ct_entry_24xx *ct_iocb)
2155 uint16_t tot_dsds; 2149 uint16_t tot_dsds;
2156 scsi_qla_host_t *vha = sp->fcport->vha; 2150 scsi_qla_host_t *vha = sp->fcport->vha;
2157 struct qla_hw_data *ha = vha->hw; 2151 struct qla_hw_data *ha = vha->hw;
2158 struct fc_bsg_job *bsg_job = ((struct srb_ctx *)sp->ctx)->u.bsg_job; 2152 struct fc_bsg_job *bsg_job = sp->u.bsg_job;
2159 int loop_iterartion = 0; 2153 int loop_iterartion = 0;
2160 int cont_iocb_prsnt = 0; 2154 int cont_iocb_prsnt = 0;
2161 int entry_count = 1; 2155 int entry_count = 1;
@@ -2245,12 +2239,12 @@ qla82xx_start_scsi(srb_t *sp)
2245 struct qla_hw_data *ha = vha->hw; 2239 struct qla_hw_data *ha = vha->hw;
2246 struct req_que *req = NULL; 2240 struct req_que *req = NULL;
2247 struct rsp_que *rsp = NULL; 2241 struct rsp_que *rsp = NULL;
2248 char tag[2]; 2242 char tag[2];
2249 2243
2250 /* Setup device pointers. */ 2244 /* Setup device pointers. */
2251 ret = 0; 2245 ret = 0;
2252 reg = &ha->iobase->isp82; 2246 reg = &ha->iobase->isp82;
2253 cmd = sp->cmd; 2247 cmd = GET_CMD_SP(sp);
2254 req = vha->req; 2248 req = vha->req;
2255 rsp = ha->rsp_q_map[0]; 2249 rsp = ha->rsp_q_map[0];
2256 2250
@@ -2354,12 +2348,14 @@ sufficient_dsds:
2354 if (req->cnt < (req_cnt + 2)) 2348 if (req->cnt < (req_cnt + 2))
2355 goto queuing_error; 2349 goto queuing_error;
2356 2350
2357 ctx = sp->ctx = mempool_alloc(ha->ctx_mempool, GFP_ATOMIC); 2351 ctx = sp->u.scmd.ctx =
2358 if (!sp->ctx) { 2352 mempool_alloc(ha->ctx_mempool, GFP_ATOMIC);
2353 if (!ctx) {
2359 ql_log(ql_log_fatal, vha, 0x3010, 2354 ql_log(ql_log_fatal, vha, 0x3010,
2360 "Failed to allocate ctx for cmd=%p.\n", cmd); 2355 "Failed to allocate ctx for cmd=%p.\n", cmd);
2361 goto queuing_error; 2356 goto queuing_error;
2362 } 2357 }
2358
2363 memset(ctx, 0, sizeof(struct ct6_dsd)); 2359 memset(ctx, 0, sizeof(struct ct6_dsd));
2364 ctx->fcp_cmnd = dma_pool_alloc(ha->fcp_cmnd_dma_pool, 2360 ctx->fcp_cmnd = dma_pool_alloc(ha->fcp_cmnd_dma_pool,
2365 GFP_ATOMIC, &ctx->fcp_cmnd_dma); 2361 GFP_ATOMIC, &ctx->fcp_cmnd_dma);
@@ -2410,12 +2406,12 @@ sufficient_dsds:
2410 if (qla24xx_build_scsi_type_6_iocbs(sp, cmd_pkt, tot_dsds)) 2406 if (qla24xx_build_scsi_type_6_iocbs(sp, cmd_pkt, tot_dsds))
2411 goto queuing_error_fcp_cmnd; 2407 goto queuing_error_fcp_cmnd;
2412 2408
2413 int_to_scsilun(sp->cmd->device->lun, &cmd_pkt->lun); 2409 int_to_scsilun(cmd->device->lun, &cmd_pkt->lun);
2414 host_to_fcp_swap((uint8_t *)&cmd_pkt->lun, sizeof(cmd_pkt->lun)); 2410 host_to_fcp_swap((uint8_t *)&cmd_pkt->lun, sizeof(cmd_pkt->lun));
2415 2411
2416 /* build FCP_CMND IU */ 2412 /* build FCP_CMND IU */
2417 memset(ctx->fcp_cmnd, 0, sizeof(struct fcp_cmnd)); 2413 memset(ctx->fcp_cmnd, 0, sizeof(struct fcp_cmnd));
2418 int_to_scsilun(sp->cmd->device->lun, &ctx->fcp_cmnd->lun); 2414 int_to_scsilun(cmd->device->lun, &ctx->fcp_cmnd->lun);
2419 ctx->fcp_cmnd->additional_cdb_len = additional_cdb_len; 2415 ctx->fcp_cmnd->additional_cdb_len = additional_cdb_len;
2420 2416
2421 if (cmd->sc_data_direction == DMA_TO_DEVICE) 2417 if (cmd->sc_data_direction == DMA_TO_DEVICE)
@@ -2495,9 +2491,9 @@ sufficient_dsds:
2495 cmd_pkt->port_id[2] = sp->fcport->d_id.b.domain; 2491 cmd_pkt->port_id[2] = sp->fcport->d_id.b.domain;
2496 cmd_pkt->vp_index = sp->fcport->vp_idx; 2492 cmd_pkt->vp_index = sp->fcport->vp_idx;
2497 2493
2498 int_to_scsilun(sp->cmd->device->lun, &cmd_pkt->lun); 2494 int_to_scsilun(cmd->device->lun, &cmd_pkt->lun);
2499 host_to_fcp_swap((uint8_t *)&cmd_pkt->lun, 2495 host_to_fcp_swap((uint8_t *)&cmd_pkt->lun,
2500 sizeof(cmd_pkt->lun)); 2496 sizeof(cmd_pkt->lun));
2501 2497
2502 /* 2498 /*
2503 * Update tagged queuing modifier -- default is TSK_SIMPLE (0). 2499 * Update tagged queuing modifier -- default is TSK_SIMPLE (0).
@@ -2538,7 +2534,7 @@ sufficient_dsds:
2538 req->current_outstanding_cmd = handle; 2534 req->current_outstanding_cmd = handle;
2539 req->outstanding_cmds[handle] = sp; 2535 req->outstanding_cmds[handle] = sp;
2540 sp->handle = handle; 2536 sp->handle = handle;
2541 sp->cmd->host_scribble = (unsigned char *)(unsigned long)handle; 2537 cmd->host_scribble = (unsigned char *)(unsigned long)handle;
2542 req->cnt -= req_cnt; 2538 req->cnt -= req_cnt;
2543 wmb(); 2539 wmb();
2544 2540
@@ -2584,9 +2580,9 @@ queuing_error:
2584 if (tot_dsds) 2580 if (tot_dsds)
2585 scsi_dma_unmap(cmd); 2581 scsi_dma_unmap(cmd);
2586 2582
2587 if (sp->ctx) { 2583 if (sp->u.scmd.ctx) {
2588 mempool_free(sp->ctx, ha->ctx_mempool); 2584 mempool_free(sp->u.scmd.ctx, ha->ctx_mempool);
2589 sp->ctx = NULL; 2585 sp->u.scmd.ctx = NULL;
2590 } 2586 }
2591 spin_unlock_irqrestore(&ha->hardware_lock, flags); 2587 spin_unlock_irqrestore(&ha->hardware_lock, flags);
2592 2588
@@ -2599,7 +2595,6 @@ qla2x00_start_sp(srb_t *sp)
2599 int rval; 2595 int rval;
2600 struct qla_hw_data *ha = sp->fcport->vha->hw; 2596 struct qla_hw_data *ha = sp->fcport->vha->hw;
2601 void *pkt; 2597 void *pkt;
2602 struct srb_ctx *ctx = sp->ctx;
2603 unsigned long flags; 2598 unsigned long flags;
2604 2599
2605 rval = QLA_FUNCTION_FAILED; 2600 rval = QLA_FUNCTION_FAILED;
@@ -2612,7 +2607,7 @@ qla2x00_start_sp(srb_t *sp)
2612 } 2607 }
2613 2608
2614 rval = QLA_SUCCESS; 2609 rval = QLA_SUCCESS;
2615 switch (ctx->type) { 2610 switch (sp->type) {
2616 case SRB_LOGIN_CMD: 2611 case SRB_LOGIN_CMD:
2617 IS_FWI2_CAPABLE(ha) ? 2612 IS_FWI2_CAPABLE(ha) ?
2618 qla24xx_login_iocb(sp, pkt) : 2613 qla24xx_login_iocb(sp, pkt) :
diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c
index 349843ea32f6..f79844ce7122 100644
--- a/drivers/scsi/qla2xxx/qla_isr.c
+++ b/drivers/scsi/qla2xxx/qla_isr.c
@@ -44,8 +44,8 @@ qla2100_intr_handler(int irq, void *dev_id)
44 44
45 rsp = (struct rsp_que *) dev_id; 45 rsp = (struct rsp_que *) dev_id;
46 if (!rsp) { 46 if (!rsp) {
47 printk(KERN_INFO 47 ql_log(ql_log_info, NULL, 0x505d,
48 "%s(): NULL response queue pointer.\n", __func__); 48 "%s: NULL response queue pointer.\n", __func__);
49 return (IRQ_NONE); 49 return (IRQ_NONE);
50 } 50 }
51 51
@@ -141,8 +141,8 @@ qla2300_intr_handler(int irq, void *dev_id)
141 141
142 rsp = (struct rsp_que *) dev_id; 142 rsp = (struct rsp_que *) dev_id;
143 if (!rsp) { 143 if (!rsp) {
144 printk(KERN_INFO 144 ql_log(ql_log_info, NULL, 0x5058,
145 "%s(): NULL response queue pointer.\n", __func__); 145 "%s: NULL response queue pointer.\n", __func__);
146 return (IRQ_NONE); 146 return (IRQ_NONE);
147 } 147 }
148 148
@@ -289,7 +289,7 @@ qla81xx_idc_event(scsi_qla_host_t *vha, uint16_t aen, uint16_t descr)
289 mb[cnt] = RD_REG_WORD(wptr); 289 mb[cnt] = RD_REG_WORD(wptr);
290 290
291 ql_dbg(ql_dbg_async, vha, 0x5021, 291 ql_dbg(ql_dbg_async, vha, 0x5021,
292 "Inter-Driver Commucation %s -- " 292 "Inter-Driver Communication %s -- "
293 "%04x %04x %04x %04x %04x %04x %04x.\n", 293 "%04x %04x %04x %04x %04x %04x %04x.\n",
294 event[aen & 0xff], mb[0], mb[1], mb[2], mb[3], 294 event[aen & 0xff], mb[0], mb[1], mb[2], mb[3],
295 mb[4], mb[5], mb[6]); 295 mb[4], mb[5], mb[6]);
@@ -318,7 +318,7 @@ void
318qla2x00_async_event(scsi_qla_host_t *vha, struct rsp_que *rsp, uint16_t *mb) 318qla2x00_async_event(scsi_qla_host_t *vha, struct rsp_que *rsp, uint16_t *mb)
319{ 319{
320#define LS_UNKNOWN 2 320#define LS_UNKNOWN 2
321 static char *link_speeds[] = { "1", "2", "?", "4", "8", "10" }; 321 static char *link_speeds[] = { "1", "2", "?", "4", "8", "16", "10" };
322 char *link_speed; 322 char *link_speed;
323 uint16_t handle_cnt; 323 uint16_t handle_cnt;
324 uint16_t cnt, mbx; 324 uint16_t cnt, mbx;
@@ -328,12 +328,11 @@ qla2x00_async_event(scsi_qla_host_t *vha, struct rsp_que *rsp, uint16_t *mb)
328 struct device_reg_24xx __iomem *reg24 = &ha->iobase->isp24; 328 struct device_reg_24xx __iomem *reg24 = &ha->iobase->isp24;
329 struct device_reg_82xx __iomem *reg82 = &ha->iobase->isp82; 329 struct device_reg_82xx __iomem *reg82 = &ha->iobase->isp82;
330 uint32_t rscn_entry, host_pid; 330 uint32_t rscn_entry, host_pid;
331 uint8_t rscn_queue_index;
332 unsigned long flags; 331 unsigned long flags;
333 332
334 /* Setup to process RIO completion. */ 333 /* Setup to process RIO completion. */
335 handle_cnt = 0; 334 handle_cnt = 0;
336 if (IS_QLA8XXX_TYPE(ha)) 335 if (IS_CNA_CAPABLE(ha))
337 goto skip_rio; 336 goto skip_rio;
338 switch (mb[0]) { 337 switch (mb[0]) {
339 case MBA_SCSI_COMPLETION: 338 case MBA_SCSI_COMPLETION:
@@ -405,7 +404,8 @@ skip_rio:
405 break; 404 break;
406 405
407 case MBA_SYSTEM_ERR: /* System Error */ 406 case MBA_SYSTEM_ERR: /* System Error */
408 mbx = IS_QLA81XX(ha) ? RD_REG_WORD(&reg24->mailbox7) : 0; 407 mbx = (IS_QLA81XX(ha) || IS_QLA83XX(ha)) ?
408 RD_REG_WORD(&reg24->mailbox7) : 0;
409 ql_log(ql_log_warn, vha, 0x5003, 409 ql_log(ql_log_warn, vha, 0x5003,
410 "ISP System Error - mbx1=%xh mbx2=%xh mbx3=%xh " 410 "ISP System Error - mbx1=%xh mbx2=%xh mbx3=%xh "
411 "mbx7=%xh.\n", mb[1], mb[2], mb[3], mbx); 411 "mbx7=%xh.\n", mb[1], mb[2], mb[3], mbx);
@@ -418,6 +418,7 @@ skip_rio:
418 "Unrecoverable Hardware Error: adapter " 418 "Unrecoverable Hardware Error: adapter "
419 "marked OFFLINE!\n"); 419 "marked OFFLINE!\n");
420 vha->flags.online = 0; 420 vha->flags.online = 0;
421 vha->device_flags |= DFLG_DEV_FAILED;
421 } else { 422 } else {
422 /* Check to see if MPI timeout occurred */ 423 /* Check to see if MPI timeout occurred */
423 if ((mbx & MBX_3) && (ha->flags.port0)) 424 if ((mbx & MBX_3) && (ha->flags.port0))
@@ -431,6 +432,7 @@ skip_rio:
431 "Unrecoverable Hardware Error: adapter marked " 432 "Unrecoverable Hardware Error: adapter marked "
432 "OFFLINE!\n"); 433 "OFFLINE!\n");
433 vha->flags.online = 0; 434 vha->flags.online = 0;
435 vha->device_flags |= DFLG_DEV_FAILED;
434 } else 436 } else
435 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); 437 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
436 break; 438 break;
@@ -482,10 +484,10 @@ skip_rio:
482 ha->link_data_rate = PORT_SPEED_1GB; 484 ha->link_data_rate = PORT_SPEED_1GB;
483 } else { 485 } else {
484 link_speed = link_speeds[LS_UNKNOWN]; 486 link_speed = link_speeds[LS_UNKNOWN];
485 if (mb[1] < 5) 487 if (mb[1] < 6)
486 link_speed = link_speeds[mb[1]]; 488 link_speed = link_speeds[mb[1]];
487 else if (mb[1] == 0x13) 489 else if (mb[1] == 0x13)
488 link_speed = link_speeds[5]; 490 link_speed = link_speeds[6];
489 ha->link_data_rate = mb[1]; 491 ha->link_data_rate = mb[1];
490 } 492 }
491 493
@@ -497,7 +499,8 @@ skip_rio:
497 break; 499 break;
498 500
499 case MBA_LOOP_DOWN: /* Loop Down Event */ 501 case MBA_LOOP_DOWN: /* Loop Down Event */
500 mbx = IS_QLA81XX(ha) ? RD_REG_WORD(&reg24->mailbox4) : 0; 502 mbx = (IS_QLA81XX(ha) || IS_QLA8031(ha))
503 ? RD_REG_WORD(&reg24->mailbox4) : 0;
501 mbx = IS_QLA82XX(ha) ? RD_REG_WORD(&reg82->mailbox_out[4]) : mbx; 504 mbx = IS_QLA82XX(ha) ? RD_REG_WORD(&reg82->mailbox_out[4]) : mbx;
502 ql_dbg(ql_dbg_async, vha, 0x500b, 505 ql_dbg(ql_dbg_async, vha, 0x500b,
503 "LOOP DOWN detected (%x %x %x %x).\n", 506 "LOOP DOWN detected (%x %x %x %x).\n",
@@ -547,7 +550,7 @@ skip_rio:
547 if (IS_QLA2100(ha)) 550 if (IS_QLA2100(ha))
548 break; 551 break;
549 552
550 if (IS_QLA8XXX_TYPE(ha)) { 553 if (IS_QLA81XX(ha) || IS_QLA82XX(ha) || IS_QLA8031(ha)) {
551 ql_dbg(ql_dbg_async, vha, 0x500d, 554 ql_dbg(ql_dbg_async, vha, 0x500d,
552 "DCBX Completed -- %04x %04x %04x.\n", 555 "DCBX Completed -- %04x %04x %04x.\n",
553 mb[1], mb[2], mb[3]); 556 mb[1], mb[2], mb[3]);
@@ -681,8 +684,6 @@ skip_rio:
681 684
682 qla2x00_mark_all_devices_lost(vha, 1); 685 qla2x00_mark_all_devices_lost(vha, 1);
683 686
684 vha->flags.rscn_queue_overflow = 1;
685
686 set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags); 687 set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
687 set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags); 688 set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags);
688 break; 689 break;
@@ -711,15 +712,6 @@ skip_rio:
711 712
712 /* Ignore reserved bits from RSCN-payload. */ 713 /* Ignore reserved bits from RSCN-payload. */
713 rscn_entry = ((mb[1] & 0x3ff) << 16) | mb[2]; 714 rscn_entry = ((mb[1] & 0x3ff) << 16) | mb[2];
714 rscn_queue_index = vha->rscn_in_ptr + 1;
715 if (rscn_queue_index == MAX_RSCN_COUNT)
716 rscn_queue_index = 0;
717 if (rscn_queue_index != vha->rscn_out_ptr) {
718 vha->rscn_queue[vha->rscn_in_ptr] = rscn_entry;
719 vha->rscn_in_ptr = rscn_queue_index;
720 } else {
721 vha->flags.rscn_queue_overflow = 1;
722 }
723 715
724 atomic_set(&vha->loop_down_timer, 0); 716 atomic_set(&vha->loop_down_timer, 0);
725 vha->flags.management_server_logged_in = 0; 717 vha->flags.management_server_logged_in = 0;
@@ -809,6 +801,10 @@ skip_rio:
809 case MBA_IDC_TIME_EXT: 801 case MBA_IDC_TIME_EXT:
810 qla81xx_idc_event(vha, mb[0], mb[1]); 802 qla81xx_idc_event(vha, mb[0], mb[1]);
811 break; 803 break;
804 default:
805 ql_dbg(ql_dbg_async, vha, 0x5057,
806 "Unknown AEN:%04x %04x %04x %04x\n",
807 mb[0], mb[1], mb[2], mb[3]);
812 } 808 }
813 809
814 if (!vha->vp_idx && ha->num_vhosts) 810 if (!vha->vp_idx && ha->num_vhosts)
@@ -845,8 +841,7 @@ qla2x00_process_completed_request(struct scsi_qla_host *vha,
845 req->outstanding_cmds[index] = NULL; 841 req->outstanding_cmds[index] = NULL;
846 842
847 /* Save ISP completion status */ 843 /* Save ISP completion status */
848 sp->cmd->result = DID_OK << 16; 844 sp->done(ha, sp, DID_OK << 16);
849 qla2x00_sp_compl(ha, sp);
850 } else { 845 } else {
851 ql_log(ql_log_warn, vha, 0x3016, "Invalid SCSI SRB.\n"); 846 ql_log(ql_log_warn, vha, 0x3016, "Invalid SCSI SRB.\n");
852 847
@@ -903,7 +898,6 @@ qla2x00_mbx_iocb_entry(scsi_qla_host_t *vha, struct req_que *req,
903 fc_port_t *fcport; 898 fc_port_t *fcport;
904 srb_t *sp; 899 srb_t *sp;
905 struct srb_iocb *lio; 900 struct srb_iocb *lio;
906 struct srb_ctx *ctx;
907 uint16_t *data; 901 uint16_t *data;
908 uint16_t status; 902 uint16_t status;
909 903
@@ -911,9 +905,8 @@ qla2x00_mbx_iocb_entry(scsi_qla_host_t *vha, struct req_que *req,
911 if (!sp) 905 if (!sp)
912 return; 906 return;
913 907
914 ctx = sp->ctx; 908 lio = &sp->u.iocb_cmd;
915 lio = ctx->u.iocb_cmd; 909 type = sp->name;
916 type = ctx->name;
917 fcport = sp->fcport; 910 fcport = sp->fcport;
918 data = lio->u.logio.data; 911 data = lio->u.logio.data;
919 912
@@ -937,7 +930,7 @@ qla2x00_mbx_iocb_entry(scsi_qla_host_t *vha, struct req_que *req,
937 } 930 }
938 931
939 status = le16_to_cpu(mbx->status); 932 status = le16_to_cpu(mbx->status);
940 if (status == 0x30 && ctx->type == SRB_LOGIN_CMD && 933 if (status == 0x30 && sp->type == SRB_LOGIN_CMD &&
941 le16_to_cpu(mbx->mb0) == MBS_COMMAND_COMPLETE) 934 le16_to_cpu(mbx->mb0) == MBS_COMMAND_COMPLETE)
942 status = 0; 935 status = 0;
943 if (!status && le16_to_cpu(mbx->mb0) == MBS_COMMAND_COMPLETE) { 936 if (!status && le16_to_cpu(mbx->mb0) == MBS_COMMAND_COMPLETE) {
@@ -948,7 +941,7 @@ qla2x00_mbx_iocb_entry(scsi_qla_host_t *vha, struct req_que *req,
948 le16_to_cpu(mbx->mb1)); 941 le16_to_cpu(mbx->mb1));
949 942
950 data[0] = MBS_COMMAND_COMPLETE; 943 data[0] = MBS_COMMAND_COMPLETE;
951 if (ctx->type == SRB_LOGIN_CMD) { 944 if (sp->type == SRB_LOGIN_CMD) {
952 fcport->port_type = FCT_TARGET; 945 fcport->port_type = FCT_TARGET;
953 if (le16_to_cpu(mbx->mb1) & BIT_0) 946 if (le16_to_cpu(mbx->mb1) & BIT_0)
954 fcport->port_type = FCT_INITIATOR; 947 fcport->port_type = FCT_INITIATOR;
@@ -979,7 +972,7 @@ qla2x00_mbx_iocb_entry(scsi_qla_host_t *vha, struct req_que *req,
979 le16_to_cpu(mbx->mb7)); 972 le16_to_cpu(mbx->mb7));
980 973
981logio_done: 974logio_done:
982 lio->done(sp); 975 sp->done(vha, sp, 0);
983} 976}
984 977
985static void 978static void
@@ -988,29 +981,18 @@ qla2x00_ct_entry(scsi_qla_host_t *vha, struct req_que *req,
988{ 981{
989 const char func[] = "CT_IOCB"; 982 const char func[] = "CT_IOCB";
990 const char *type; 983 const char *type;
991 struct qla_hw_data *ha = vha->hw;
992 srb_t *sp; 984 srb_t *sp;
993 struct srb_ctx *sp_bsg;
994 struct fc_bsg_job *bsg_job; 985 struct fc_bsg_job *bsg_job;
995 uint16_t comp_status; 986 uint16_t comp_status;
987 int res;
996 988
997 sp = qla2x00_get_sp_from_handle(vha, func, req, pkt); 989 sp = qla2x00_get_sp_from_handle(vha, func, req, pkt);
998 if (!sp) 990 if (!sp)
999 return; 991 return;
1000 992
1001 sp_bsg = sp->ctx; 993 bsg_job = sp->u.bsg_job;
1002 bsg_job = sp_bsg->u.bsg_job;
1003 994
1004 type = NULL; 995 type = "ct pass-through";
1005 switch (sp_bsg->type) {
1006 case SRB_CT_CMD:
1007 type = "ct pass-through";
1008 break;
1009 default:
1010 ql_log(ql_log_warn, vha, 0x5047,
1011 "Unrecognized SRB: (%p) type=%d.\n", sp, sp_bsg->type);
1012 return;
1013 }
1014 996
1015 comp_status = le16_to_cpu(pkt->comp_status); 997 comp_status = le16_to_cpu(pkt->comp_status);
1016 998
@@ -1022,7 +1004,7 @@ qla2x00_ct_entry(scsi_qla_host_t *vha, struct req_que *req,
1022 1004
1023 if (comp_status != CS_COMPLETE) { 1005 if (comp_status != CS_COMPLETE) {
1024 if (comp_status == CS_DATA_UNDERRUN) { 1006 if (comp_status == CS_DATA_UNDERRUN) {
1025 bsg_job->reply->result = DID_OK << 16; 1007 res = DID_OK << 16;
1026 bsg_job->reply->reply_payload_rcv_len = 1008 bsg_job->reply->reply_payload_rcv_len =
1027 le16_to_cpu(((sts_entry_t *)pkt)->rsp_info_len); 1009 le16_to_cpu(((sts_entry_t *)pkt)->rsp_info_len);
1028 1010
@@ -1035,30 +1017,19 @@ qla2x00_ct_entry(scsi_qla_host_t *vha, struct req_que *req,
1035 ql_log(ql_log_warn, vha, 0x5049, 1017 ql_log(ql_log_warn, vha, 0x5049,
1036 "CT pass-through-%s error " 1018 "CT pass-through-%s error "
1037 "comp_status-status=0x%x.\n", type, comp_status); 1019 "comp_status-status=0x%x.\n", type, comp_status);
1038 bsg_job->reply->result = DID_ERROR << 16; 1020 res = DID_ERROR << 16;
1039 bsg_job->reply->reply_payload_rcv_len = 0; 1021 bsg_job->reply->reply_payload_rcv_len = 0;
1040 } 1022 }
1041 ql_dump_buffer(ql_dbg_async + ql_dbg_buffer, vha, 0x5035, 1023 ql_dump_buffer(ql_dbg_async + ql_dbg_buffer, vha, 0x5035,
1042 (uint8_t *)pkt, sizeof(*pkt)); 1024 (uint8_t *)pkt, sizeof(*pkt));
1043 } else { 1025 } else {
1044 bsg_job->reply->result = DID_OK << 16; 1026 res = DID_OK << 16;
1045 bsg_job->reply->reply_payload_rcv_len = 1027 bsg_job->reply->reply_payload_rcv_len =
1046 bsg_job->reply_payload.payload_len; 1028 bsg_job->reply_payload.payload_len;
1047 bsg_job->reply_len = 0; 1029 bsg_job->reply_len = 0;
1048 } 1030 }
1049 1031
1050 dma_unmap_sg(&ha->pdev->dev, bsg_job->request_payload.sg_list, 1032 sp->done(vha, sp, res);
1051 bsg_job->request_payload.sg_cnt, DMA_TO_DEVICE);
1052
1053 dma_unmap_sg(&ha->pdev->dev, bsg_job->reply_payload.sg_list,
1054 bsg_job->reply_payload.sg_cnt, DMA_FROM_DEVICE);
1055
1056 if (sp_bsg->type == SRB_ELS_CMD_HST || sp_bsg->type == SRB_CT_CMD)
1057 kfree(sp->fcport);
1058
1059 kfree(sp->ctx);
1060 mempool_free(sp, ha->srb_mempool);
1061 bsg_job->job_done(bsg_job);
1062} 1033}
1063 1034
1064static void 1035static void
@@ -1067,22 +1038,20 @@ qla24xx_els_ct_entry(scsi_qla_host_t *vha, struct req_que *req,
1067{ 1038{
1068 const char func[] = "ELS_CT_IOCB"; 1039 const char func[] = "ELS_CT_IOCB";
1069 const char *type; 1040 const char *type;
1070 struct qla_hw_data *ha = vha->hw;
1071 srb_t *sp; 1041 srb_t *sp;
1072 struct srb_ctx *sp_bsg;
1073 struct fc_bsg_job *bsg_job; 1042 struct fc_bsg_job *bsg_job;
1074 uint16_t comp_status; 1043 uint16_t comp_status;
1075 uint32_t fw_status[3]; 1044 uint32_t fw_status[3];
1076 uint8_t* fw_sts_ptr; 1045 uint8_t* fw_sts_ptr;
1046 int res;
1077 1047
1078 sp = qla2x00_get_sp_from_handle(vha, func, req, pkt); 1048 sp = qla2x00_get_sp_from_handle(vha, func, req, pkt);
1079 if (!sp) 1049 if (!sp)
1080 return; 1050 return;
1081 sp_bsg = sp->ctx; 1051 bsg_job = sp->u.bsg_job;
1082 bsg_job = sp_bsg->u.bsg_job;
1083 1052
1084 type = NULL; 1053 type = NULL;
1085 switch (sp_bsg->type) { 1054 switch (sp->type) {
1086 case SRB_ELS_CMD_RPT: 1055 case SRB_ELS_CMD_RPT:
1087 case SRB_ELS_CMD_HST: 1056 case SRB_ELS_CMD_HST:
1088 type = "els"; 1057 type = "els";
@@ -1091,8 +1060,8 @@ qla24xx_els_ct_entry(scsi_qla_host_t *vha, struct req_que *req,
1091 type = "ct pass-through"; 1060 type = "ct pass-through";
1092 break; 1061 break;
1093 default: 1062 default:
1094 ql_log(ql_log_warn, vha, 0x503e, 1063 ql_dbg(ql_dbg_user, vha, 0x503e,
1095 "Unrecognized SRB: (%p) type=%d.\n", sp, sp_bsg->type); 1064 "Unrecognized SRB: (%p) type=%d.\n", sp, sp->type);
1096 return; 1065 return;
1097 } 1066 }
1098 1067
@@ -1108,11 +1077,11 @@ qla24xx_els_ct_entry(scsi_qla_host_t *vha, struct req_que *req,
1108 1077
1109 if (comp_status != CS_COMPLETE) { 1078 if (comp_status != CS_COMPLETE) {
1110 if (comp_status == CS_DATA_UNDERRUN) { 1079 if (comp_status == CS_DATA_UNDERRUN) {
1111 bsg_job->reply->result = DID_OK << 16; 1080 res = DID_OK << 16;
1112 bsg_job->reply->reply_payload_rcv_len = 1081 bsg_job->reply->reply_payload_rcv_len =
1113 le16_to_cpu(((struct els_sts_entry_24xx*)pkt)->total_byte_count); 1082 le16_to_cpu(((struct els_sts_entry_24xx *)pkt)->total_byte_count);
1114 1083
1115 ql_log(ql_log_info, vha, 0x503f, 1084 ql_dbg(ql_dbg_user, vha, 0x503f,
1116 "ELS-CT pass-through-%s error hdl=%x comp_status-status=0x%x " 1085 "ELS-CT pass-through-%s error hdl=%x comp_status-status=0x%x "
1117 "error subcode 1=0x%x error subcode 2=0x%x total_byte = 0x%x.\n", 1086 "error subcode 1=0x%x error subcode 2=0x%x total_byte = 0x%x.\n",
1118 type, sp->handle, comp_status, fw_status[1], fw_status[2], 1087 type, sp->handle, comp_status, fw_status[1], fw_status[2],
@@ -1122,7 +1091,7 @@ qla24xx_els_ct_entry(scsi_qla_host_t *vha, struct req_que *req,
1122 memcpy( fw_sts_ptr, fw_status, sizeof(fw_status)); 1091 memcpy( fw_sts_ptr, fw_status, sizeof(fw_status));
1123 } 1092 }
1124 else { 1093 else {
1125 ql_log(ql_log_info, vha, 0x5040, 1094 ql_dbg(ql_dbg_user, vha, 0x5040,
1126 "ELS-CT pass-through-%s error hdl=%x comp_status-status=0x%x " 1095 "ELS-CT pass-through-%s error hdl=%x comp_status-status=0x%x "
1127 "error subcode 1=0x%x error subcode 2=0x%x.\n", 1096 "error subcode 1=0x%x error subcode 2=0x%x.\n",
1128 type, sp->handle, comp_status, 1097 type, sp->handle, comp_status,
@@ -1130,32 +1099,21 @@ qla24xx_els_ct_entry(scsi_qla_host_t *vha, struct req_que *req,
1130 pkt)->error_subcode_1), 1099 pkt)->error_subcode_1),
1131 le16_to_cpu(((struct els_sts_entry_24xx *) 1100 le16_to_cpu(((struct els_sts_entry_24xx *)
1132 pkt)->error_subcode_2)); 1101 pkt)->error_subcode_2));
1133 bsg_job->reply->result = DID_ERROR << 16; 1102 res = DID_ERROR << 16;
1134 bsg_job->reply->reply_payload_rcv_len = 0; 1103 bsg_job->reply->reply_payload_rcv_len = 0;
1135 fw_sts_ptr = ((uint8_t*)bsg_job->req->sense) + sizeof(struct fc_bsg_reply); 1104 fw_sts_ptr = ((uint8_t*)bsg_job->req->sense) + sizeof(struct fc_bsg_reply);
1136 memcpy( fw_sts_ptr, fw_status, sizeof(fw_status)); 1105 memcpy( fw_sts_ptr, fw_status, sizeof(fw_status));
1137 } 1106 }
1138 ql_dump_buffer(ql_dbg_async + ql_dbg_buffer, vha, 0x5056, 1107 ql_dump_buffer(ql_dbg_user + ql_dbg_buffer, vha, 0x5056,
1139 (uint8_t *)pkt, sizeof(*pkt)); 1108 (uint8_t *)pkt, sizeof(*pkt));
1140 } 1109 }
1141 else { 1110 else {
1142 bsg_job->reply->result = DID_OK << 16; 1111 res = DID_OK << 16;
1143 bsg_job->reply->reply_payload_rcv_len = bsg_job->reply_payload.payload_len; 1112 bsg_job->reply->reply_payload_rcv_len = bsg_job->reply_payload.payload_len;
1144 bsg_job->reply_len = 0; 1113 bsg_job->reply_len = 0;
1145 } 1114 }
1146 1115
1147 dma_unmap_sg(&ha->pdev->dev, 1116 sp->done(vha, sp, res);
1148 bsg_job->request_payload.sg_list,
1149 bsg_job->request_payload.sg_cnt, DMA_TO_DEVICE);
1150 dma_unmap_sg(&ha->pdev->dev,
1151 bsg_job->reply_payload.sg_list,
1152 bsg_job->reply_payload.sg_cnt, DMA_FROM_DEVICE);
1153 if ((sp_bsg->type == SRB_ELS_CMD_HST) ||
1154 (sp_bsg->type == SRB_CT_CMD))
1155 kfree(sp->fcport);
1156 kfree(sp->ctx);
1157 mempool_free(sp, ha->srb_mempool);
1158 bsg_job->job_done(bsg_job);
1159} 1117}
1160 1118
1161static void 1119static void
@@ -1167,7 +1125,6 @@ qla24xx_logio_entry(scsi_qla_host_t *vha, struct req_que *req,
1167 fc_port_t *fcport; 1125 fc_port_t *fcport;
1168 srb_t *sp; 1126 srb_t *sp;
1169 struct srb_iocb *lio; 1127 struct srb_iocb *lio;
1170 struct srb_ctx *ctx;
1171 uint16_t *data; 1128 uint16_t *data;
1172 uint32_t iop[2]; 1129 uint32_t iop[2];
1173 1130
@@ -1175,9 +1132,8 @@ qla24xx_logio_entry(scsi_qla_host_t *vha, struct req_que *req,
1175 if (!sp) 1132 if (!sp)
1176 return; 1133 return;
1177 1134
1178 ctx = sp->ctx; 1135 lio = &sp->u.iocb_cmd;
1179 lio = ctx->u.iocb_cmd; 1136 type = sp->name;
1180 type = ctx->name;
1181 fcport = sp->fcport; 1137 fcport = sp->fcport;
1182 data = lio->u.logio.data; 1138 data = lio->u.logio.data;
1183 1139
@@ -1185,7 +1141,7 @@ qla24xx_logio_entry(scsi_qla_host_t *vha, struct req_que *req,
1185 data[1] = lio->u.logio.flags & SRB_LOGIN_RETRIED ? 1141 data[1] = lio->u.logio.flags & SRB_LOGIN_RETRIED ?
1186 QLA_LOGIO_LOGIN_RETRIED : 0; 1142 QLA_LOGIO_LOGIN_RETRIED : 0;
1187 if (logio->entry_status) { 1143 if (logio->entry_status) {
1188 ql_log(ql_log_warn, vha, 0x5034, 1144 ql_log(ql_log_warn, fcport->vha, 0x5034,
1189 "Async-%s error entry - hdl=%x" 1145 "Async-%s error entry - hdl=%x"
1190 "portid=%02x%02x%02x entry-status=%x.\n", 1146 "portid=%02x%02x%02x entry-status=%x.\n",
1191 type, sp->handle, fcport->d_id.b.domain, 1147 type, sp->handle, fcport->d_id.b.domain,
@@ -1198,14 +1154,14 @@ qla24xx_logio_entry(scsi_qla_host_t *vha, struct req_que *req,
1198 } 1154 }
1199 1155
1200 if (le16_to_cpu(logio->comp_status) == CS_COMPLETE) { 1156 if (le16_to_cpu(logio->comp_status) == CS_COMPLETE) {
1201 ql_dbg(ql_dbg_async, vha, 0x5036, 1157 ql_dbg(ql_dbg_async, fcport->vha, 0x5036,
1202 "Async-%s complete - hdl=%x portid=%02x%02x%02x " 1158 "Async-%s complete - hdl=%x portid=%02x%02x%02x "
1203 "iop0=%x.\n", type, sp->handle, fcport->d_id.b.domain, 1159 "iop0=%x.\n", type, sp->handle, fcport->d_id.b.domain,
1204 fcport->d_id.b.area, fcport->d_id.b.al_pa, 1160 fcport->d_id.b.area, fcport->d_id.b.al_pa,
1205 le32_to_cpu(logio->io_parameter[0])); 1161 le32_to_cpu(logio->io_parameter[0]));
1206 1162
1207 data[0] = MBS_COMMAND_COMPLETE; 1163 data[0] = MBS_COMMAND_COMPLETE;
1208 if (ctx->type != SRB_LOGIN_CMD) 1164 if (sp->type != SRB_LOGIN_CMD)
1209 goto logio_done; 1165 goto logio_done;
1210 1166
1211 iop[0] = le32_to_cpu(logio->io_parameter[0]); 1167 iop[0] = le32_to_cpu(logio->io_parameter[0]);
@@ -1239,7 +1195,7 @@ qla24xx_logio_entry(scsi_qla_host_t *vha, struct req_que *req,
1239 break; 1195 break;
1240 } 1196 }
1241 1197
1242 ql_dbg(ql_dbg_async, vha, 0x5037, 1198 ql_dbg(ql_dbg_async, fcport->vha, 0x5037,
1243 "Async-%s failed - hdl=%x portid=%02x%02x%02x comp=%x " 1199 "Async-%s failed - hdl=%x portid=%02x%02x%02x comp=%x "
1244 "iop0=%x iop1=%x.\n", type, sp->handle, fcport->d_id.b.domain, 1200 "iop0=%x iop1=%x.\n", type, sp->handle, fcport->d_id.b.domain,
1245 fcport->d_id.b.area, fcport->d_id.b.al_pa, 1201 fcport->d_id.b.area, fcport->d_id.b.al_pa,
@@ -1248,7 +1204,7 @@ qla24xx_logio_entry(scsi_qla_host_t *vha, struct req_que *req,
1248 le32_to_cpu(logio->io_parameter[1])); 1204 le32_to_cpu(logio->io_parameter[1]));
1249 1205
1250logio_done: 1206logio_done:
1251 lio->done(sp); 1207 sp->done(vha, sp, 0);
1252} 1208}
1253 1209
1254static void 1210static void
@@ -1260,7 +1216,6 @@ qla24xx_tm_iocb_entry(scsi_qla_host_t *vha, struct req_que *req,
1260 fc_port_t *fcport; 1216 fc_port_t *fcport;
1261 srb_t *sp; 1217 srb_t *sp;
1262 struct srb_iocb *iocb; 1218 struct srb_iocb *iocb;
1263 struct srb_ctx *ctx;
1264 struct sts_entry_24xx *sts = (struct sts_entry_24xx *)tsk; 1219 struct sts_entry_24xx *sts = (struct sts_entry_24xx *)tsk;
1265 int error = 1; 1220 int error = 1;
1266 1221
@@ -1268,30 +1223,29 @@ qla24xx_tm_iocb_entry(scsi_qla_host_t *vha, struct req_que *req,
1268 if (!sp) 1223 if (!sp)
1269 return; 1224 return;
1270 1225
1271 ctx = sp->ctx; 1226 iocb = &sp->u.iocb_cmd;
1272 iocb = ctx->u.iocb_cmd; 1227 type = sp->name;
1273 type = ctx->name;
1274 fcport = sp->fcport; 1228 fcport = sp->fcport;
1275 1229
1276 if (sts->entry_status) { 1230 if (sts->entry_status) {
1277 ql_log(ql_log_warn, vha, 0x5038, 1231 ql_log(ql_log_warn, fcport->vha, 0x5038,
1278 "Async-%s error - hdl=%x entry-status(%x).\n", 1232 "Async-%s error - hdl=%x entry-status(%x).\n",
1279 type, sp->handle, sts->entry_status); 1233 type, sp->handle, sts->entry_status);
1280 } else if (sts->comp_status != __constant_cpu_to_le16(CS_COMPLETE)) { 1234 } else if (sts->comp_status != __constant_cpu_to_le16(CS_COMPLETE)) {
1281 ql_log(ql_log_warn, vha, 0x5039, 1235 ql_log(ql_log_warn, fcport->vha, 0x5039,
1282 "Async-%s error - hdl=%x completion status(%x).\n", 1236 "Async-%s error - hdl=%x completion status(%x).\n",
1283 type, sp->handle, sts->comp_status); 1237 type, sp->handle, sts->comp_status);
1284 } else if (!(le16_to_cpu(sts->scsi_status) & 1238 } else if (!(le16_to_cpu(sts->scsi_status) &
1285 SS_RESPONSE_INFO_LEN_VALID)) { 1239 SS_RESPONSE_INFO_LEN_VALID)) {
1286 ql_log(ql_log_warn, vha, 0x503a, 1240 ql_log(ql_log_warn, fcport->vha, 0x503a,
1287 "Async-%s error - hdl=%x no response info(%x).\n", 1241 "Async-%s error - hdl=%x no response info(%x).\n",
1288 type, sp->handle, sts->scsi_status); 1242 type, sp->handle, sts->scsi_status);
1289 } else if (le32_to_cpu(sts->rsp_data_len) < 4) { 1243 } else if (le32_to_cpu(sts->rsp_data_len) < 4) {
1290 ql_log(ql_log_warn, vha, 0x503b, 1244 ql_log(ql_log_warn, fcport->vha, 0x503b,
1291 "Async-%s error - hdl=%x not enough response(%d).\n", 1245 "Async-%s error - hdl=%x not enough response(%d).\n",
1292 type, sp->handle, sts->rsp_data_len); 1246 type, sp->handle, sts->rsp_data_len);
1293 } else if (sts->data[3]) { 1247 } else if (sts->data[3]) {
1294 ql_log(ql_log_warn, vha, 0x503c, 1248 ql_log(ql_log_warn, fcport->vha, 0x503c,
1295 "Async-%s error - hdl=%x response(%x).\n", 1249 "Async-%s error - hdl=%x response(%x).\n",
1296 type, sp->handle, sts->data[3]); 1250 type, sp->handle, sts->data[3]);
1297 } else { 1251 } else {
@@ -1304,7 +1258,7 @@ qla24xx_tm_iocb_entry(scsi_qla_host_t *vha, struct req_que *req,
1304 (uint8_t *)sts, sizeof(*sts)); 1258 (uint8_t *)sts, sizeof(*sts));
1305 } 1259 }
1306 1260
1307 iocb->done(sp); 1261 sp->done(vha, sp, 0);
1308} 1262}
1309 1263
1310/** 1264/**
@@ -1390,25 +1344,32 @@ qla2x00_process_response_queue(struct rsp_que *rsp)
1390 1344
1391static inline void 1345static inline void
1392qla2x00_handle_sense(srb_t *sp, uint8_t *sense_data, uint32_t par_sense_len, 1346qla2x00_handle_sense(srb_t *sp, uint8_t *sense_data, uint32_t par_sense_len,
1393 uint32_t sense_len, struct rsp_que *rsp) 1347 uint32_t sense_len, struct rsp_que *rsp, int res)
1394{ 1348{
1395 struct scsi_qla_host *vha = sp->fcport->vha; 1349 struct scsi_qla_host *vha = sp->fcport->vha;
1396 struct scsi_cmnd *cp = sp->cmd; 1350 struct scsi_cmnd *cp = GET_CMD_SP(sp);
1351 uint32_t track_sense_len;
1397 1352
1398 if (sense_len >= SCSI_SENSE_BUFFERSIZE) 1353 if (sense_len >= SCSI_SENSE_BUFFERSIZE)
1399 sense_len = SCSI_SENSE_BUFFERSIZE; 1354 sense_len = SCSI_SENSE_BUFFERSIZE;
1400 1355
1401 sp->request_sense_length = sense_len; 1356 SET_CMD_SENSE_LEN(sp, sense_len);
1402 sp->request_sense_ptr = cp->sense_buffer; 1357 SET_CMD_SENSE_PTR(sp, cp->sense_buffer);
1403 if (sp->request_sense_length > par_sense_len) 1358 track_sense_len = sense_len;
1359
1360 if (sense_len > par_sense_len)
1404 sense_len = par_sense_len; 1361 sense_len = par_sense_len;
1405 1362
1406 memcpy(cp->sense_buffer, sense_data, sense_len); 1363 memcpy(cp->sense_buffer, sense_data, sense_len);
1407 1364
1408 sp->request_sense_ptr += sense_len; 1365 SET_CMD_SENSE_PTR(sp, cp->sense_buffer + sense_len);
1409 sp->request_sense_length -= sense_len; 1366 track_sense_len -= sense_len;
1410 if (sp->request_sense_length != 0) 1367 SET_CMD_SENSE_LEN(sp, track_sense_len);
1368
1369 if (track_sense_len != 0) {
1411 rsp->status_srb = sp; 1370 rsp->status_srb = sp;
1371 cp->result = res;
1372 }
1412 1373
1413 if (sense_len) { 1374 if (sense_len) {
1414 ql_dbg(ql_dbg_io + ql_dbg_buffer, vha, 0x301c, 1375 ql_dbg(ql_dbg_io + ql_dbg_buffer, vha, 0x301c,
@@ -1436,7 +1397,7 @@ static inline int
1436qla2x00_handle_dif_error(srb_t *sp, struct sts_entry_24xx *sts24) 1397qla2x00_handle_dif_error(srb_t *sp, struct sts_entry_24xx *sts24)
1437{ 1398{
1438 struct scsi_qla_host *vha = sp->fcport->vha; 1399 struct scsi_qla_host *vha = sp->fcport->vha;
1439 struct scsi_cmnd *cmd = sp->cmd; 1400 struct scsi_cmnd *cmd = GET_CMD_SP(sp);
1440 uint8_t *ap = &sts24->data[12]; 1401 uint8_t *ap = &sts24->data[12];
1441 uint8_t *ep = &sts24->data[20]; 1402 uint8_t *ep = &sts24->data[20];
1442 uint32_t e_ref_tag, a_ref_tag; 1403 uint32_t e_ref_tag, a_ref_tag;
@@ -1580,6 +1541,7 @@ qla2x00_status_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, void *pkt)
1580 uint16_t que; 1541 uint16_t que;
1581 struct req_que *req; 1542 struct req_que *req;
1582 int logit = 1; 1543 int logit = 1;
1544 int res = 0;
1583 1545
1584 sts = (sts_entry_t *) pkt; 1546 sts = (sts_entry_t *) pkt;
1585 sts24 = (struct sts_entry_24xx *) pkt; 1547 sts24 = (struct sts_entry_24xx *) pkt;
@@ -1619,7 +1581,7 @@ qla2x00_status_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, void *pkt)
1619 qla2xxx_wake_dpc(vha); 1581 qla2xxx_wake_dpc(vha);
1620 return; 1582 return;
1621 } 1583 }
1622 cp = sp->cmd; 1584 cp = GET_CMD_SP(sp);
1623 if (cp == NULL) { 1585 if (cp == NULL) {
1624 ql_dbg(ql_dbg_io, vha, 0x3018, 1586 ql_dbg(ql_dbg_io, vha, 0x3018,
1625 "Command already returned (0x%x/%p).\n", 1587 "Command already returned (0x%x/%p).\n",
@@ -1668,11 +1630,11 @@ qla2x00_status_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, void *pkt)
1668 par_sense_len -= rsp_info_len; 1630 par_sense_len -= rsp_info_len;
1669 } 1631 }
1670 if (rsp_info_len > 3 && rsp_info[3]) { 1632 if (rsp_info_len > 3 && rsp_info[3]) {
1671 ql_dbg(ql_dbg_io, vha, 0x3019, 1633 ql_dbg(ql_dbg_io, fcport->vha, 0x3019,
1672 "FCP I/O protocol failure (0x%x/0x%x).\n", 1634 "FCP I/O protocol failure (0x%x/0x%x).\n",
1673 rsp_info_len, rsp_info[3]); 1635 rsp_info_len, rsp_info[3]);
1674 1636
1675 cp->result = DID_BUS_BUSY << 16; 1637 res = DID_BUS_BUSY << 16;
1676 goto out; 1638 goto out;
1677 } 1639 }
1678 } 1640 }
@@ -1689,7 +1651,7 @@ qla2x00_status_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, void *pkt)
1689 case CS_COMPLETE: 1651 case CS_COMPLETE:
1690 case CS_QUEUE_FULL: 1652 case CS_QUEUE_FULL:
1691 if (scsi_status == 0) { 1653 if (scsi_status == 0) {
1692 cp->result = DID_OK << 16; 1654 res = DID_OK << 16;
1693 break; 1655 break;
1694 } 1656 }
1695 if (scsi_status & (SS_RESIDUAL_UNDER | SS_RESIDUAL_OVER)) { 1657 if (scsi_status & (SS_RESIDUAL_UNDER | SS_RESIDUAL_OVER)) {
@@ -1699,19 +1661,19 @@ qla2x00_status_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, void *pkt)
1699 if (!lscsi_status && 1661 if (!lscsi_status &&
1700 ((unsigned)(scsi_bufflen(cp) - resid) < 1662 ((unsigned)(scsi_bufflen(cp) - resid) <
1701 cp->underflow)) { 1663 cp->underflow)) {
1702 ql_dbg(ql_dbg_io, vha, 0x301a, 1664 ql_dbg(ql_dbg_io, fcport->vha, 0x301a,
1703 "Mid-layer underflow " 1665 "Mid-layer underflow "
1704 "detected (0x%x of 0x%x bytes).\n", 1666 "detected (0x%x of 0x%x bytes).\n",
1705 resid, scsi_bufflen(cp)); 1667 resid, scsi_bufflen(cp));
1706 1668
1707 cp->result = DID_ERROR << 16; 1669 res = DID_ERROR << 16;
1708 break; 1670 break;
1709 } 1671 }
1710 } 1672 }
1711 cp->result = DID_OK << 16 | lscsi_status; 1673 res = DID_OK << 16 | lscsi_status;
1712 1674
1713 if (lscsi_status == SAM_STAT_TASK_SET_FULL) { 1675 if (lscsi_status == SAM_STAT_TASK_SET_FULL) {
1714 ql_dbg(ql_dbg_io, vha, 0x301b, 1676 ql_dbg(ql_dbg_io, fcport->vha, 0x301b,
1715 "QUEUE FULL detected.\n"); 1677 "QUEUE FULL detected.\n");
1716 break; 1678 break;
1717 } 1679 }
@@ -1724,7 +1686,7 @@ qla2x00_status_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, void *pkt)
1724 break; 1686 break;
1725 1687
1726 qla2x00_handle_sense(sp, sense_data, par_sense_len, sense_len, 1688 qla2x00_handle_sense(sp, sense_data, par_sense_len, sense_len,
1727 rsp); 1689 rsp, res);
1728 break; 1690 break;
1729 1691
1730 case CS_DATA_UNDERRUN: 1692 case CS_DATA_UNDERRUN:
@@ -1733,36 +1695,36 @@ qla2x00_status_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, void *pkt)
1733 scsi_set_resid(cp, resid); 1695 scsi_set_resid(cp, resid);
1734 if (scsi_status & SS_RESIDUAL_UNDER) { 1696 if (scsi_status & SS_RESIDUAL_UNDER) {
1735 if (IS_FWI2_CAPABLE(ha) && fw_resid_len != resid_len) { 1697 if (IS_FWI2_CAPABLE(ha) && fw_resid_len != resid_len) {
1736 ql_dbg(ql_dbg_io, vha, 0x301d, 1698 ql_dbg(ql_dbg_io, fcport->vha, 0x301d,
1737 "Dropped frame(s) detected " 1699 "Dropped frame(s) detected "
1738 "(0x%x of 0x%x bytes).\n", 1700 "(0x%x of 0x%x bytes).\n",
1739 resid, scsi_bufflen(cp)); 1701 resid, scsi_bufflen(cp));
1740 1702
1741 cp->result = DID_ERROR << 16 | lscsi_status; 1703 res = DID_ERROR << 16 | lscsi_status;
1742 goto check_scsi_status; 1704 goto check_scsi_status;
1743 } 1705 }
1744 1706
1745 if (!lscsi_status && 1707 if (!lscsi_status &&
1746 ((unsigned)(scsi_bufflen(cp) - resid) < 1708 ((unsigned)(scsi_bufflen(cp) - resid) <
1747 cp->underflow)) { 1709 cp->underflow)) {
1748 ql_dbg(ql_dbg_io, vha, 0x301e, 1710 ql_dbg(ql_dbg_io, fcport->vha, 0x301e,
1749 "Mid-layer underflow " 1711 "Mid-layer underflow "
1750 "detected (0x%x of 0x%x bytes).\n", 1712 "detected (0x%x of 0x%x bytes).\n",
1751 resid, scsi_bufflen(cp)); 1713 resid, scsi_bufflen(cp));
1752 1714
1753 cp->result = DID_ERROR << 16; 1715 res = DID_ERROR << 16;
1754 break; 1716 break;
1755 } 1717 }
1756 } else { 1718 } else {
1757 ql_dbg(ql_dbg_io, vha, 0x301f, 1719 ql_dbg(ql_dbg_io, fcport->vha, 0x301f,
1758 "Dropped frame(s) detected (0x%x " 1720 "Dropped frame(s) detected (0x%x "
1759 "of 0x%x bytes).\n", resid, scsi_bufflen(cp)); 1721 "of 0x%x bytes).\n", resid, scsi_bufflen(cp));
1760 1722
1761 cp->result = DID_ERROR << 16 | lscsi_status; 1723 res = DID_ERROR << 16 | lscsi_status;
1762 goto check_scsi_status; 1724 goto check_scsi_status;
1763 } 1725 }
1764 1726
1765 cp->result = DID_OK << 16 | lscsi_status; 1727 res = DID_OK << 16 | lscsi_status;
1766 logit = 0; 1728 logit = 0;
1767 1729
1768check_scsi_status: 1730check_scsi_status:
@@ -1772,7 +1734,7 @@ check_scsi_status:
1772 */ 1734 */
1773 if (lscsi_status != 0) { 1735 if (lscsi_status != 0) {
1774 if (lscsi_status == SAM_STAT_TASK_SET_FULL) { 1736 if (lscsi_status == SAM_STAT_TASK_SET_FULL) {
1775 ql_dbg(ql_dbg_io, vha, 0x3020, 1737 ql_dbg(ql_dbg_io, fcport->vha, 0x3020,
1776 "QUEUE FULL detected.\n"); 1738 "QUEUE FULL detected.\n");
1777 logit = 1; 1739 logit = 1;
1778 break; 1740 break;
@@ -1785,7 +1747,7 @@ check_scsi_status:
1785 break; 1747 break;
1786 1748
1787 qla2x00_handle_sense(sp, sense_data, par_sense_len, 1749 qla2x00_handle_sense(sp, sense_data, par_sense_len,
1788 sense_len, rsp); 1750 sense_len, rsp, res);
1789 } 1751 }
1790 break; 1752 break;
1791 1753
@@ -1802,7 +1764,7 @@ check_scsi_status:
1802 * while we try to recover so instruct the mid layer 1764 * while we try to recover so instruct the mid layer
1803 * to requeue until the class decides how to handle this. 1765 * to requeue until the class decides how to handle this.
1804 */ 1766 */
1805 cp->result = DID_TRANSPORT_DISRUPTED << 16; 1767 res = DID_TRANSPORT_DISRUPTED << 16;
1806 1768
1807 if (comp_status == CS_TIMEOUT) { 1769 if (comp_status == CS_TIMEOUT) {
1808 if (IS_FWI2_CAPABLE(ha)) 1770 if (IS_FWI2_CAPABLE(ha))
@@ -1812,7 +1774,7 @@ check_scsi_status:
1812 break; 1774 break;
1813 } 1775 }
1814 1776
1815 ql_dbg(ql_dbg_io, vha, 0x3021, 1777 ql_dbg(ql_dbg_io, fcport->vha, 0x3021,
1816 "Port down status: port-state=0x%x.\n", 1778 "Port down status: port-state=0x%x.\n",
1817 atomic_read(&fcport->state)); 1779 atomic_read(&fcport->state));
1818 1780
@@ -1821,25 +1783,25 @@ check_scsi_status:
1821 break; 1783 break;
1822 1784
1823 case CS_ABORTED: 1785 case CS_ABORTED:
1824 cp->result = DID_RESET << 16; 1786 res = DID_RESET << 16;
1825 break; 1787 break;
1826 1788
1827 case CS_DIF_ERROR: 1789 case CS_DIF_ERROR:
1828 logit = qla2x00_handle_dif_error(sp, sts24); 1790 logit = qla2x00_handle_dif_error(sp, sts24);
1829 break; 1791 break;
1830 default: 1792 default:
1831 cp->result = DID_ERROR << 16; 1793 res = DID_ERROR << 16;
1832 break; 1794 break;
1833 } 1795 }
1834 1796
1835out: 1797out:
1836 if (logit) 1798 if (logit)
1837 ql_dbg(ql_dbg_io, vha, 0x3022, 1799 ql_dbg(ql_dbg_io, fcport->vha, 0x3022,
1838 "FCP command status: 0x%x-0x%x (0x%x) " 1800 "FCP command status: 0x%x-0x%x (0x%x) "
1839 "nexus=%ld:%d:%d portid=%02x%02x%02x oxid=0x%x " 1801 "nexus=%ld:%d:%d portid=%02x%02x%02x oxid=0x%x "
1840 "cdb=%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x len=0x%x " 1802 "cdb=%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x len=0x%x "
1841 "rsp_info=0x%x resid=0x%x fw_resid=0x%x.\n", 1803 "rsp_info=0x%x resid=0x%x fw_resid=0x%x.\n",
1842 comp_status, scsi_status, cp->result, vha->host_no, 1804 comp_status, scsi_status, res, vha->host_no,
1843 cp->device->id, cp->device->lun, fcport->d_id.b.domain, 1805 cp->device->id, cp->device->lun, fcport->d_id.b.domain,
1844 fcport->d_id.b.area, fcport->d_id.b.al_pa, ox_id, 1806 fcport->d_id.b.area, fcport->d_id.b.al_pa, ox_id,
1845 cp->cmnd[0], cp->cmnd[1], cp->cmnd[2], cp->cmnd[3], 1807 cp->cmnd[0], cp->cmnd[1], cp->cmnd[2], cp->cmnd[3],
@@ -1848,7 +1810,7 @@ out:
1848 resid_len, fw_resid_len); 1810 resid_len, fw_resid_len);
1849 1811
1850 if (rsp->status_srb == NULL) 1812 if (rsp->status_srb == NULL)
1851 qla2x00_sp_compl(ha, sp); 1813 sp->done(ha, sp, res);
1852} 1814}
1853 1815
1854/** 1816/**
@@ -1861,84 +1823,52 @@ out:
1861static void 1823static void
1862qla2x00_status_cont_entry(struct rsp_que *rsp, sts_cont_entry_t *pkt) 1824qla2x00_status_cont_entry(struct rsp_que *rsp, sts_cont_entry_t *pkt)
1863{ 1825{
1864 uint8_t sense_sz = 0; 1826 uint8_t sense_sz = 0;
1865 struct qla_hw_data *ha = rsp->hw; 1827 struct qla_hw_data *ha = rsp->hw;
1866 struct scsi_qla_host *vha = pci_get_drvdata(ha->pdev); 1828 struct scsi_qla_host *vha = pci_get_drvdata(ha->pdev);
1867 srb_t *sp = rsp->status_srb; 1829 srb_t *sp = rsp->status_srb;
1868 struct scsi_cmnd *cp; 1830 struct scsi_cmnd *cp;
1831 uint32_t sense_len;
1832 uint8_t *sense_ptr;
1869 1833
1870 if (sp != NULL && sp->request_sense_length != 0) { 1834 if (!sp || !GET_CMD_SENSE_LEN(sp))
1871 cp = sp->cmd; 1835 return;
1872 if (cp == NULL) {
1873 ql_log(ql_log_warn, vha, 0x3025,
1874 "cmd is NULL: already returned to OS (sp=%p).\n",
1875 sp);
1876 1836
1877 rsp->status_srb = NULL; 1837 sense_len = GET_CMD_SENSE_LEN(sp);
1878 return; 1838 sense_ptr = GET_CMD_SENSE_PTR(sp);
1879 }
1880 1839
1881 if (sp->request_sense_length > sizeof(pkt->data)) { 1840 cp = GET_CMD_SP(sp);
1882 sense_sz = sizeof(pkt->data); 1841 if (cp == NULL) {
1883 } else { 1842 ql_log(ql_log_warn, vha, 0x3025,
1884 sense_sz = sp->request_sense_length; 1843 "cmd is NULL: already returned to OS (sp=%p).\n", sp);
1885 }
1886 1844
1887 /* Move sense data. */ 1845 rsp->status_srb = NULL;
1888 if (IS_FWI2_CAPABLE(ha)) 1846 return;
1889 host_to_fcp_swap(pkt->data, sizeof(pkt->data));
1890 memcpy(sp->request_sense_ptr, pkt->data, sense_sz);
1891 ql_dump_buffer(ql_dbg_io + ql_dbg_buffer, vha, 0x302c,
1892 sp->request_sense_ptr, sense_sz);
1893
1894 sp->request_sense_ptr += sense_sz;
1895 sp->request_sense_length -= sense_sz;
1896
1897 /* Place command on done queue. */
1898 if (sp->request_sense_length == 0) {
1899 rsp->status_srb = NULL;
1900 qla2x00_sp_compl(ha, sp);
1901 }
1902 } 1847 }
1903}
1904 1848
1905static int 1849 if (sense_len > sizeof(pkt->data))
1906qla2x00_free_sp_ctx(scsi_qla_host_t *vha, srb_t *sp) 1850 sense_sz = sizeof(pkt->data);
1907{ 1851 else
1908 struct qla_hw_data *ha = vha->hw; 1852 sense_sz = sense_len;
1909 struct srb_ctx *ctx;
1910 1853
1911 if (!sp->ctx) 1854 /* Move sense data. */
1912 return 1; 1855 if (IS_FWI2_CAPABLE(ha))
1856 host_to_fcp_swap(pkt->data, sizeof(pkt->data));
1857 memcpy(sense_ptr, pkt->data, sense_sz);
1858 ql_dump_buffer(ql_dbg_io + ql_dbg_buffer, vha, 0x302c,
1859 sense_ptr, sense_sz);
1913 1860
1914 ctx = sp->ctx; 1861 sense_len -= sense_sz;
1862 sense_ptr += sense_sz;
1915 1863
1916 if (ctx->type == SRB_LOGIN_CMD || 1864 SET_CMD_SENSE_PTR(sp, sense_ptr);
1917 ctx->type == SRB_LOGOUT_CMD || 1865 SET_CMD_SENSE_LEN(sp, sense_len);
1918 ctx->type == SRB_TM_CMD) { 1866
1919 ctx->u.iocb_cmd->done(sp); 1867 /* Place command on done queue. */
1920 return 0; 1868 if (sense_len == 0) {
1921 } else if (ctx->type == SRB_ADISC_CMD) { 1869 rsp->status_srb = NULL;
1922 ctx->u.iocb_cmd->free(sp); 1870 sp->done(ha, sp, cp->result);
1923 return 0;
1924 } else {
1925 struct fc_bsg_job *bsg_job;
1926
1927 bsg_job = ctx->u.bsg_job;
1928 if (ctx->type == SRB_ELS_CMD_HST ||
1929 ctx->type == SRB_CT_CMD)
1930 kfree(sp->fcport);
1931
1932 bsg_job->reply->reply_data.ctels_reply.status =
1933 FC_CTELS_STATUS_OK;
1934 bsg_job->reply->result = DID_ERROR << 16;
1935 bsg_job->reply->reply_payload_rcv_len = 0;
1936 kfree(sp->ctx);
1937 mempool_free(sp, ha->srb_mempool);
1938 bsg_job->job_done(bsg_job);
1939 return 0;
1940 } 1871 }
1941 return 1;
1942} 1872}
1943 1873
1944/** 1874/**
@@ -1953,53 +1883,34 @@ qla2x00_error_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, sts_entry_t *pkt)
1953 struct qla_hw_data *ha = vha->hw; 1883 struct qla_hw_data *ha = vha->hw;
1954 const char func[] = "ERROR-IOCB"; 1884 const char func[] = "ERROR-IOCB";
1955 uint16_t que = MSW(pkt->handle); 1885 uint16_t que = MSW(pkt->handle);
1956 struct req_que *req = ha->req_q_map[que]; 1886 struct req_que *req = NULL;
1957 1887 int res = DID_ERROR << 16;
1958 if (pkt->entry_status & RF_INV_E_ORDER) 1888
1959 ql_dbg(ql_dbg_async, vha, 0x502a, 1889 ql_dbg(ql_dbg_async, vha, 0x502a,
1960 "Invalid Entry Order.\n"); 1890 "type of error status in response: 0x%x\n", pkt->entry_status);
1961 else if (pkt->entry_status & RF_INV_E_COUNT) 1891
1962 ql_dbg(ql_dbg_async, vha, 0x502b, 1892 if (que >= ha->max_req_queues || !ha->req_q_map[que])
1963 "Invalid Entry Count.\n"); 1893 goto fatal;
1964 else if (pkt->entry_status & RF_INV_E_PARAM) 1894
1965 ql_dbg(ql_dbg_async, vha, 0x502c, 1895 req = ha->req_q_map[que];
1966 "Invalid Entry Parameter.\n"); 1896
1967 else if (pkt->entry_status & RF_INV_E_TYPE) 1897 if (pkt->entry_status & RF_BUSY)
1968 ql_dbg(ql_dbg_async, vha, 0x502d, 1898 res = DID_BUS_BUSY << 16;
1969 "Invalid Entry Type.\n");
1970 else if (pkt->entry_status & RF_BUSY)
1971 ql_dbg(ql_dbg_async, vha, 0x502e,
1972 "Busy.\n");
1973 else
1974 ql_dbg(ql_dbg_async, vha, 0x502f,
1975 "UNKNOWN flag error.\n");
1976 1899
1977 sp = qla2x00_get_sp_from_handle(vha, func, req, pkt); 1900 sp = qla2x00_get_sp_from_handle(vha, func, req, pkt);
1978 if (sp) { 1901 if (sp) {
1979 if (qla2x00_free_sp_ctx(vha, sp)) { 1902 sp->done(ha, sp, res);
1980 if (pkt->entry_status & 1903 return;
1981 (RF_INV_E_ORDER | RF_INV_E_COUNT |
1982 RF_INV_E_PARAM | RF_INV_E_TYPE)) {
1983 sp->cmd->result = DID_ERROR << 16;
1984 } else if (pkt->entry_status & RF_BUSY) {
1985 sp->cmd->result = DID_BUS_BUSY << 16;
1986 } else {
1987 sp->cmd->result = DID_ERROR << 16;
1988 }
1989 qla2x00_sp_compl(ha, sp);
1990 }
1991 } else if (pkt->entry_type == COMMAND_A64_TYPE || pkt->entry_type ==
1992 COMMAND_TYPE || pkt->entry_type == COMMAND_TYPE_7
1993 || pkt->entry_type == COMMAND_TYPE_6) {
1994 ql_log(ql_log_warn, vha, 0x5030,
1995 "Error entry - invalid handle.\n");
1996
1997 if (IS_QLA82XX(ha))
1998 set_bit(FCOE_CTX_RESET_NEEDED, &vha->dpc_flags);
1999 else
2000 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
2001 qla2xxx_wake_dpc(vha);
2002 } 1904 }
1905fatal:
1906 ql_log(ql_log_warn, vha, 0x5030,
1907 "Error entry - invalid handle/queue.\n");
1908
1909 if (IS_QLA82XX(ha))
1910 set_bit(FCOE_CTX_RESET_NEEDED, &vha->dpc_flags);
1911 else
1912 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
1913 qla2xxx_wake_dpc(vha);
2003} 1914}
2004 1915
2005/** 1916/**
@@ -2127,7 +2038,7 @@ qla2xxx_check_risc_status(scsi_qla_host_t *vha)
2127 struct qla_hw_data *ha = vha->hw; 2038 struct qla_hw_data *ha = vha->hw;
2128 struct device_reg_24xx __iomem *reg = &ha->iobase->isp24; 2039 struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
2129 2040
2130 if (!IS_QLA25XX(ha) && !IS_QLA81XX(ha)) 2041 if (!IS_QLA25XX(ha) && !IS_QLA81XX(ha) && !IS_QLA83XX(ha))
2131 return; 2042 return;
2132 2043
2133 rval = QLA_SUCCESS; 2044 rval = QLA_SUCCESS;
@@ -2168,7 +2079,7 @@ done:
2168} 2079}
2169 2080
2170/** 2081/**
2171 * qla24xx_intr_handler() - Process interrupts for the ISP23xx and ISP63xx. 2082 * qla24xx_intr_handler() - Process interrupts for the ISP23xx and ISP24xx.
2172 * @irq: 2083 * @irq:
2173 * @dev_id: SCSI driver HA context 2084 * @dev_id: SCSI driver HA context
2174 * 2085 *
@@ -2192,8 +2103,8 @@ qla24xx_intr_handler(int irq, void *dev_id)
2192 2103
2193 rsp = (struct rsp_que *) dev_id; 2104 rsp = (struct rsp_que *) dev_id;
2194 if (!rsp) { 2105 if (!rsp) {
2195 printk(KERN_INFO 2106 ql_log(ql_log_info, NULL, 0x5059,
2196 "%s(): NULL response queue pointer.\n", __func__); 2107 "%s: NULL response queue pointer.\n", __func__);
2197 return IRQ_NONE; 2108 return IRQ_NONE;
2198 } 2109 }
2199 2110
@@ -2276,8 +2187,8 @@ qla24xx_msix_rsp_q(int irq, void *dev_id)
2276 2187
2277 rsp = (struct rsp_que *) dev_id; 2188 rsp = (struct rsp_que *) dev_id;
2278 if (!rsp) { 2189 if (!rsp) {
2279 printk(KERN_INFO 2190 ql_log(ql_log_info, NULL, 0x505a,
2280 "%s(): NULL response queue pointer.\n", __func__); 2191 "%s: NULL response queue pointer.\n", __func__);
2281 return IRQ_NONE; 2192 return IRQ_NONE;
2282 } 2193 }
2283 ha = rsp->hw; 2194 ha = rsp->hw;
@@ -2306,8 +2217,8 @@ qla25xx_msix_rsp_q(int irq, void *dev_id)
2306 2217
2307 rsp = (struct rsp_que *) dev_id; 2218 rsp = (struct rsp_que *) dev_id;
2308 if (!rsp) { 2219 if (!rsp) {
2309 printk(KERN_INFO 2220 ql_log(ql_log_info, NULL, 0x505b,
2310 "%s(): NULL response queue pointer.\n", __func__); 2221 "%s: NULL response queue pointer.\n", __func__);
2311 return IRQ_NONE; 2222 return IRQ_NONE;
2312 } 2223 }
2313 ha = rsp->hw; 2224 ha = rsp->hw;
@@ -2340,8 +2251,8 @@ qla24xx_msix_default(int irq, void *dev_id)
2340 2251
2341 rsp = (struct rsp_que *) dev_id; 2252 rsp = (struct rsp_que *) dev_id;
2342 if (!rsp) { 2253 if (!rsp) {
2343 printk(KERN_INFO 2254 ql_log(ql_log_info, NULL, 0x505c,
2344 "%s(): NULL response queue pointer.\n", __func__); 2255 "%s: NULL response queue pointer.\n", __func__);
2345 return IRQ_NONE; 2256 return IRQ_NONE;
2346 } 2257 }
2347 ha = rsp->hw; 2258 ha = rsp->hw;
@@ -2530,8 +2441,14 @@ msix_failed:
2530 } 2441 }
2531 2442
2532 /* Enable MSI-X vector for response queue update for queue 0 */ 2443 /* Enable MSI-X vector for response queue update for queue 0 */
2533 if (ha->mqiobase && (ha->max_rsp_queues > 1 || ha->max_req_queues > 1)) 2444 if (IS_QLA83XX(ha)) {
2534 ha->mqenable = 1; 2445 if (ha->msixbase && ha->mqiobase &&
2446 (ha->max_rsp_queues > 1 || ha->max_req_queues > 1))
2447 ha->mqenable = 1;
2448 } else
2449 if (ha->mqiobase
2450 && (ha->max_rsp_queues > 1 || ha->max_req_queues > 1))
2451 ha->mqenable = 1;
2535 ql_dbg(ql_dbg_multiq, vha, 0xc005, 2452 ql_dbg(ql_dbg_multiq, vha, 0xc005,
2536 "mqiobase=%p, max_rsp_queues=%d, max_req_queues=%d.\n", 2453 "mqiobase=%p, max_rsp_queues=%d, max_req_queues=%d.\n",
2537 ha->mqiobase, ha->max_rsp_queues, ha->max_req_queues); 2454 ha->mqiobase, ha->max_rsp_queues, ha->max_req_queues);
@@ -2552,8 +2469,8 @@ qla2x00_request_irqs(struct qla_hw_data *ha, struct rsp_que *rsp)
2552 scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev); 2469 scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev);
2553 2470
2554 /* If possible, enable MSI-X. */ 2471 /* If possible, enable MSI-X. */
2555 if (!IS_QLA2432(ha) && !IS_QLA2532(ha) && 2472 if (!IS_QLA2432(ha) && !IS_QLA2532(ha) && !IS_QLA8432(ha) &&
2556 !IS_QLA8432(ha) && !IS_QLA8XXX_TYPE(ha)) 2473 !IS_CNA_CAPABLE(ha) && !IS_QLA2031(ha))
2557 goto skip_msi; 2474 goto skip_msi;
2558 2475
2559 if (ha->pdev->subsystem_vendor == PCI_VENDOR_ID_HP && 2476 if (ha->pdev->subsystem_vendor == PCI_VENDOR_ID_HP &&
@@ -2615,7 +2532,7 @@ clear_risc_ints:
2615 * FIXME: Noted that 8014s were being dropped during NK testing. 2532 * FIXME: Noted that 8014s were being dropped during NK testing.
2616 * Timing deltas during MSI-X/INTa transitions? 2533 * Timing deltas during MSI-X/INTa transitions?
2617 */ 2534 */
2618 if (IS_QLA81XX(ha) || IS_QLA82XX(ha)) 2535 if (IS_QLA81XX(ha) || IS_QLA82XX(ha) || IS_QLA83XX(ha))
2619 goto fail; 2536 goto fail;
2620 spin_lock_irq(&ha->hardware_lock); 2537 spin_lock_irq(&ha->hardware_lock);
2621 if (IS_FWI2_CAPABLE(ha)) { 2538 if (IS_FWI2_CAPABLE(ha)) {
diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c
index 08f1d01bdc1c..b4a23394a7bd 100644
--- a/drivers/scsi/qla2xxx/qla_mbx.c
+++ b/drivers/scsi/qla2xxx/qla_mbx.c
@@ -46,17 +46,17 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp)
46 struct qla_hw_data *ha = vha->hw; 46 struct qla_hw_data *ha = vha->hw;
47 scsi_qla_host_t *base_vha = pci_get_drvdata(ha->pdev); 47 scsi_qla_host_t *base_vha = pci_get_drvdata(ha->pdev);
48 48
49 ql_dbg(ql_dbg_mbx, base_vha, 0x1000, "Entered %s.\n", __func__); 49 ql_dbg(ql_dbg_mbx, vha, 0x1000, "Entered %s.\n", __func__);
50 50
51 if (ha->pdev->error_state > pci_channel_io_frozen) { 51 if (ha->pdev->error_state > pci_channel_io_frozen) {
52 ql_log(ql_log_warn, base_vha, 0x1001, 52 ql_log(ql_log_warn, vha, 0x1001,
53 "error_state is greater than pci_channel_io_frozen, " 53 "error_state is greater than pci_channel_io_frozen, "
54 "exiting.\n"); 54 "exiting.\n");
55 return QLA_FUNCTION_TIMEOUT; 55 return QLA_FUNCTION_TIMEOUT;
56 } 56 }
57 57
58 if (vha->device_flags & DFLG_DEV_FAILED) { 58 if (vha->device_flags & DFLG_DEV_FAILED) {
59 ql_log(ql_log_warn, base_vha, 0x1002, 59 ql_log(ql_log_warn, vha, 0x1002,
60 "Device in failed state, exiting.\n"); 60 "Device in failed state, exiting.\n");
61 return QLA_FUNCTION_TIMEOUT; 61 return QLA_FUNCTION_TIMEOUT;
62 } 62 }
@@ -69,7 +69,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp)
69 69
70 70
71 if (ha->flags.pci_channel_io_perm_failure) { 71 if (ha->flags.pci_channel_io_perm_failure) {
72 ql_log(ql_log_warn, base_vha, 0x1003, 72 ql_log(ql_log_warn, vha, 0x1003,
73 "Perm failure on EEH timeout MBX, exiting.\n"); 73 "Perm failure on EEH timeout MBX, exiting.\n");
74 return QLA_FUNCTION_TIMEOUT; 74 return QLA_FUNCTION_TIMEOUT;
75 } 75 }
@@ -77,7 +77,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp)
77 if (ha->flags.isp82xx_fw_hung) { 77 if (ha->flags.isp82xx_fw_hung) {
78 /* Setting Link-Down error */ 78 /* Setting Link-Down error */
79 mcp->mb[0] = MBS_LINK_DOWN_ERROR; 79 mcp->mb[0] = MBS_LINK_DOWN_ERROR;
80 ql_log(ql_log_warn, base_vha, 0x1004, 80 ql_log(ql_log_warn, vha, 0x1004,
81 "FW hung = %d.\n", ha->flags.isp82xx_fw_hung); 81 "FW hung = %d.\n", ha->flags.isp82xx_fw_hung);
82 return QLA_FUNCTION_TIMEOUT; 82 return QLA_FUNCTION_TIMEOUT;
83 } 83 }
@@ -89,8 +89,9 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp)
89 */ 89 */
90 if (!wait_for_completion_timeout(&ha->mbx_cmd_comp, mcp->tov * HZ)) { 90 if (!wait_for_completion_timeout(&ha->mbx_cmd_comp, mcp->tov * HZ)) {
91 /* Timeout occurred. Return error. */ 91 /* Timeout occurred. Return error. */
92 ql_log(ql_log_warn, base_vha, 0x1005, 92 ql_log(ql_log_warn, vha, 0x1005,
93 "Cmd access timeout, Exiting.\n"); 93 "Cmd access timeout, cmd=0x%x, Exiting.\n",
94 mcp->mb[0]);
94 return QLA_FUNCTION_TIMEOUT; 95 return QLA_FUNCTION_TIMEOUT;
95 } 96 }
96 97
@@ -98,7 +99,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp)
98 /* Save mailbox command for debug */ 99 /* Save mailbox command for debug */
99 ha->mcp = mcp; 100 ha->mcp = mcp;
100 101
101 ql_dbg(ql_dbg_mbx, base_vha, 0x1006, 102 ql_dbg(ql_dbg_mbx, vha, 0x1006,
102 "Prepare to issue mbox cmd=0x%x.\n", mcp->mb[0]); 103 "Prepare to issue mbox cmd=0x%x.\n", mcp->mb[0]);
103 104
104 spin_lock_irqsave(&ha->hardware_lock, flags); 105 spin_lock_irqsave(&ha->hardware_lock, flags);
@@ -127,28 +128,28 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp)
127 iptr++; 128 iptr++;
128 } 129 }
129 130
130 ql_dbg(ql_dbg_mbx + ql_dbg_buffer, base_vha, 0x1111, 131 ql_dbg(ql_dbg_mbx + ql_dbg_buffer, vha, 0x1111,
131 "Loaded MBX registers (displayed in bytes) =.\n"); 132 "Loaded MBX registers (displayed in bytes) =.\n");
132 ql_dump_buffer(ql_dbg_mbx + ql_dbg_buffer, base_vha, 0x1112, 133 ql_dump_buffer(ql_dbg_mbx + ql_dbg_buffer, vha, 0x1112,
133 (uint8_t *)mcp->mb, 16); 134 (uint8_t *)mcp->mb, 16);
134 ql_dbg(ql_dbg_mbx + ql_dbg_buffer, base_vha, 0x1113, 135 ql_dbg(ql_dbg_mbx + ql_dbg_buffer, vha, 0x1113,
135 ".\n"); 136 ".\n");
136 ql_dump_buffer(ql_dbg_mbx + ql_dbg_buffer, base_vha, 0x1114, 137 ql_dump_buffer(ql_dbg_mbx + ql_dbg_buffer, vha, 0x1114,
137 ((uint8_t *)mcp->mb + 0x10), 16); 138 ((uint8_t *)mcp->mb + 0x10), 16);
138 ql_dbg(ql_dbg_mbx + ql_dbg_buffer, base_vha, 0x1115, 139 ql_dbg(ql_dbg_mbx + ql_dbg_buffer, vha, 0x1115,
139 ".\n"); 140 ".\n");
140 ql_dump_buffer(ql_dbg_mbx + ql_dbg_buffer, base_vha, 0x1116, 141 ql_dump_buffer(ql_dbg_mbx + ql_dbg_buffer, vha, 0x1116,
141 ((uint8_t *)mcp->mb + 0x20), 8); 142 ((uint8_t *)mcp->mb + 0x20), 8);
142 ql_dbg(ql_dbg_mbx + ql_dbg_buffer, base_vha, 0x1117, 143 ql_dbg(ql_dbg_mbx + ql_dbg_buffer, vha, 0x1117,
143 "I/O Address = %p.\n", optr); 144 "I/O Address = %p.\n", optr);
144 ql_dump_regs(ql_dbg_mbx + ql_dbg_buffer, base_vha, 0x100e); 145 ql_dump_regs(ql_dbg_mbx + ql_dbg_buffer, vha, 0x100e);
145 146
146 /* Issue set host interrupt command to send cmd out. */ 147 /* Issue set host interrupt command to send cmd out. */
147 ha->flags.mbox_int = 0; 148 ha->flags.mbox_int = 0;
148 clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); 149 clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
149 150
150 /* Unlock mbx registers and wait for interrupt */ 151 /* Unlock mbx registers and wait for interrupt */
151 ql_dbg(ql_dbg_mbx, base_vha, 0x100f, 152 ql_dbg(ql_dbg_mbx, vha, 0x100f,
152 "Going to unlock irq & waiting for interrupts. " 153 "Going to unlock irq & waiting for interrupts. "
153 "jiffies=%lx.\n", jiffies); 154 "jiffies=%lx.\n", jiffies);
154 155
@@ -163,7 +164,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp)
163 spin_unlock_irqrestore(&ha->hardware_lock, 164 spin_unlock_irqrestore(&ha->hardware_lock,
164 flags); 165 flags);
165 ha->flags.mbox_busy = 0; 166 ha->flags.mbox_busy = 0;
166 ql_dbg(ql_dbg_mbx, base_vha, 0x1010, 167 ql_dbg(ql_dbg_mbx, vha, 0x1010,
167 "Pending mailbox timeout, exiting.\n"); 168 "Pending mailbox timeout, exiting.\n");
168 rval = QLA_FUNCTION_TIMEOUT; 169 rval = QLA_FUNCTION_TIMEOUT;
169 goto premature_exit; 170 goto premature_exit;
@@ -180,7 +181,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp)
180 clear_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags); 181 clear_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags);
181 182
182 } else { 183 } else {
183 ql_dbg(ql_dbg_mbx, base_vha, 0x1011, 184 ql_dbg(ql_dbg_mbx, vha, 0x1011,
184 "Cmd=%x Polling Mode.\n", command); 185 "Cmd=%x Polling Mode.\n", command);
185 186
186 if (IS_QLA82XX(ha)) { 187 if (IS_QLA82XX(ha)) {
@@ -189,7 +190,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp)
189 spin_unlock_irqrestore(&ha->hardware_lock, 190 spin_unlock_irqrestore(&ha->hardware_lock,
190 flags); 191 flags);
191 ha->flags.mbox_busy = 0; 192 ha->flags.mbox_busy = 0;
192 ql_dbg(ql_dbg_mbx, base_vha, 0x1012, 193 ql_dbg(ql_dbg_mbx, vha, 0x1012,
193 "Pending mailbox timeout, exiting.\n"); 194 "Pending mailbox timeout, exiting.\n");
194 rval = QLA_FUNCTION_TIMEOUT; 195 rval = QLA_FUNCTION_TIMEOUT;
195 goto premature_exit; 196 goto premature_exit;
@@ -214,7 +215,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp)
214 command == MBC_LOAD_RISC_RAM_EXTENDED)) 215 command == MBC_LOAD_RISC_RAM_EXTENDED))
215 msleep(10); 216 msleep(10);
216 } /* while */ 217 } /* while */
217 ql_dbg(ql_dbg_mbx, base_vha, 0x1013, 218 ql_dbg(ql_dbg_mbx, vha, 0x1013,
218 "Waited %d sec.\n", 219 "Waited %d sec.\n",
219 (uint)((jiffies - (wait_time - (mcp->tov * HZ)))/HZ)); 220 (uint)((jiffies - (wait_time - (mcp->tov * HZ)))/HZ));
220 } 221 }
@@ -223,7 +224,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp)
223 if (ha->flags.mbox_int) { 224 if (ha->flags.mbox_int) {
224 uint16_t *iptr2; 225 uint16_t *iptr2;
225 226
226 ql_dbg(ql_dbg_mbx, base_vha, 0x1014, 227 ql_dbg(ql_dbg_mbx, vha, 0x1014,
227 "Cmd=%x completed.\n", command); 228 "Cmd=%x completed.\n", command);
228 229
229 /* Got interrupt. Clear the flag. */ 230 /* Got interrupt. Clear the flag. */
@@ -236,7 +237,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp)
236 mcp->mb[0] = MBS_LINK_DOWN_ERROR; 237 mcp->mb[0] = MBS_LINK_DOWN_ERROR;
237 ha->mcp = NULL; 238 ha->mcp = NULL;
238 rval = QLA_FUNCTION_FAILED; 239 rval = QLA_FUNCTION_FAILED;
239 ql_log(ql_log_warn, base_vha, 0x1015, 240 ql_log(ql_log_warn, vha, 0x1015,
240 "FW hung = %d.\n", ha->flags.isp82xx_fw_hung); 241 "FW hung = %d.\n", ha->flags.isp82xx_fw_hung);
241 goto premature_exit; 242 goto premature_exit;
242 } 243 }
@@ -268,13 +269,19 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp)
268 mb0 = RD_MAILBOX_REG(ha, &reg->isp, 0); 269 mb0 = RD_MAILBOX_REG(ha, &reg->isp, 0);
269 ictrl = RD_REG_WORD(&reg->isp.ictrl); 270 ictrl = RD_REG_WORD(&reg->isp.ictrl);
270 } 271 }
271 ql_dbg(ql_dbg_mbx + ql_dbg_buffer, base_vha, 0x1119, 272 ql_dbg(ql_dbg_mbx + ql_dbg_buffer, vha, 0x1119,
272 "MBX Command timeout for cmd %x.\n", command); 273 "MBX Command timeout for cmd %x.\n", command);
273 ql_dbg(ql_dbg_mbx + ql_dbg_buffer, base_vha, 0x111a, 274 ql_dbg(ql_dbg_mbx + ql_dbg_buffer, vha, 0x111a,
274 "iocontrol=%x jiffies=%lx.\n", ictrl, jiffies); 275 "iocontrol=%x jiffies=%lx.\n", ictrl, jiffies);
275 ql_dbg(ql_dbg_mbx + ql_dbg_buffer, base_vha, 0x111b, 276 ql_dbg(ql_dbg_mbx + ql_dbg_buffer, vha, 0x111b,
276 "mb[0] = 0x%x.\n", mb0); 277 "mb[0] = 0x%x.\n", mb0);
277 ql_dump_regs(ql_dbg_mbx + ql_dbg_buffer, base_vha, 0x1019); 278 ql_dump_regs(ql_dbg_mbx + ql_dbg_buffer, vha, 0x1019);
279
280 /*
281 * Attempt to capture a firmware dump for further analysis
282 * of the current firmware state
283 */
284 ha->isp_ops->fw_dump(vha, 0);
278 285
279 rval = QLA_FUNCTION_TIMEOUT; 286 rval = QLA_FUNCTION_TIMEOUT;
280 } 287 }
@@ -285,7 +292,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp)
285 ha->mcp = NULL; 292 ha->mcp = NULL;
286 293
287 if ((abort_active || !io_lock_on) && !IS_NOPOLLING_TYPE(ha)) { 294 if ((abort_active || !io_lock_on) && !IS_NOPOLLING_TYPE(ha)) {
288 ql_dbg(ql_dbg_mbx, base_vha, 0x101a, 295 ql_dbg(ql_dbg_mbx, vha, 0x101a,
289 "Checking for additional resp interrupt.\n"); 296 "Checking for additional resp interrupt.\n");
290 297
291 /* polling mode for non isp_abort commands. */ 298 /* polling mode for non isp_abort commands. */
@@ -297,7 +304,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp)
297 if (!io_lock_on || (mcp->flags & IOCTL_CMD) || 304 if (!io_lock_on || (mcp->flags & IOCTL_CMD) ||
298 ha->flags.eeh_busy) { 305 ha->flags.eeh_busy) {
299 /* not in dpc. schedule it for dpc to take over. */ 306 /* not in dpc. schedule it for dpc to take over. */
300 ql_dbg(ql_dbg_mbx, base_vha, 0x101b, 307 ql_dbg(ql_dbg_mbx, vha, 0x101b,
301 "Timeout, schedule isp_abort_needed.\n"); 308 "Timeout, schedule isp_abort_needed.\n");
302 309
303 if (!test_bit(ISP_ABORT_NEEDED, &vha->dpc_flags) && 310 if (!test_bit(ISP_ABORT_NEEDED, &vha->dpc_flags) &&
@@ -313,15 +320,16 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp)
313 CRB_NIU_XG_PAUSE_CTL_P1); 320 CRB_NIU_XG_PAUSE_CTL_P1);
314 } 321 }
315 ql_log(ql_log_info, base_vha, 0x101c, 322 ql_log(ql_log_info, base_vha, 0x101c,
316 "Mailbox cmd timeout occured. " 323 "Mailbox cmd timeout occured, cmd=0x%x, "
317 "Scheduling ISP abort eeh_busy=0x%x.\n", 324 "mb[0]=0x%x, eeh_busy=0x%x. Scheduling ISP "
318 ha->flags.eeh_busy); 325 "abort.\n", command, mcp->mb[0],
326 ha->flags.eeh_busy);
319 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); 327 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
320 qla2xxx_wake_dpc(vha); 328 qla2xxx_wake_dpc(vha);
321 } 329 }
322 } else if (!abort_active) { 330 } else if (!abort_active) {
323 /* call abort directly since we are in the DPC thread */ 331 /* call abort directly since we are in the DPC thread */
324 ql_dbg(ql_dbg_mbx, base_vha, 0x101d, 332 ql_dbg(ql_dbg_mbx, vha, 0x101d,
325 "Timeout, calling abort_isp.\n"); 333 "Timeout, calling abort_isp.\n");
326 334
327 if (!test_bit(ISP_ABORT_NEEDED, &vha->dpc_flags) && 335 if (!test_bit(ISP_ABORT_NEEDED, &vha->dpc_flags) &&
@@ -337,9 +345,9 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp)
337 CRB_NIU_XG_PAUSE_CTL_P1); 345 CRB_NIU_XG_PAUSE_CTL_P1);
338 } 346 }
339 ql_log(ql_log_info, base_vha, 0x101e, 347 ql_log(ql_log_info, base_vha, 0x101e,
340 "Mailbox cmd timeout occured. " 348 "Mailbox cmd timeout occured, cmd=0x%x, "
341 "Scheduling ISP abort.\n"); 349 "mb[0]=0x%x. Scheduling ISP abort ",
342 350 command, mcp->mb[0]);
343 set_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags); 351 set_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags);
344 clear_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); 352 clear_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
345 /* Allow next mbx cmd to come in. */ 353 /* Allow next mbx cmd to come in. */
@@ -350,7 +358,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp)
350 &vha->dpc_flags); 358 &vha->dpc_flags);
351 } 359 }
352 clear_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags); 360 clear_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags);
353 ql_dbg(ql_dbg_mbx, base_vha, 0x101f, 361 ql_dbg(ql_dbg_mbx, vha, 0x101f,
354 "Finished abort_isp.\n"); 362 "Finished abort_isp.\n");
355 goto mbx_done; 363 goto mbx_done;
356 } 364 }
@@ -364,8 +372,8 @@ premature_exit:
364mbx_done: 372mbx_done:
365 if (rval) { 373 if (rval) {
366 ql_dbg(ql_dbg_mbx, base_vha, 0x1020, 374 ql_dbg(ql_dbg_mbx, base_vha, 0x1020,
367 "**** Failed mbx[0]=%x, mb[1]=%x, mb[2]=%x, cmd=%x ****.\n", 375 "**** Failed mbx[0]=%x, mb[1]=%x, mb[2]=%x, mb[3]=%x, cmd=%x ****.\n",
368 mcp->mb[0], mcp->mb[1], mcp->mb[2], command); 376 mcp->mb[0], mcp->mb[1], mcp->mb[2], mcp->mb[3], command);
369 } else { 377 } else {
370 ql_dbg(ql_dbg_mbx, base_vha, 0x1021, "Done %s.\n", __func__); 378 ql_dbg(ql_dbg_mbx, base_vha, 0x1021, "Done %s.\n", __func__);
371 } 379 }
@@ -455,7 +463,7 @@ qla2x00_execute_fw(scsi_qla_host_t *vha, uint32_t risc_addr)
455 mcp->mb[1] = MSW(risc_addr); 463 mcp->mb[1] = MSW(risc_addr);
456 mcp->mb[2] = LSW(risc_addr); 464 mcp->mb[2] = LSW(risc_addr);
457 mcp->mb[3] = 0; 465 mcp->mb[3] = 0;
458 if (IS_QLA81XX(ha)) { 466 if (IS_QLA81XX(ha) || IS_QLA83XX(ha)) {
459 struct nvram_81xx *nv = ha->nvram; 467 struct nvram_81xx *nv = ha->nvram;
460 mcp->mb[4] = (nv->enhanced_features & 468 mcp->mb[4] = (nv->enhanced_features &
461 EXTENDED_BB_CREDITS); 469 EXTENDED_BB_CREDITS);
@@ -508,21 +516,22 @@ qla2x00_execute_fw(scsi_qla_host_t *vha, uint32_t risc_addr)
508 * Kernel context. 516 * Kernel context.
509 */ 517 */
510int 518int
511qla2x00_get_fw_version(scsi_qla_host_t *vha, uint16_t *major, uint16_t *minor, 519qla2x00_get_fw_version(scsi_qla_host_t *vha)
512 uint16_t *subminor, uint16_t *attributes, uint32_t *memory, uint8_t *mpi,
513 uint32_t *mpi_caps, uint8_t *phy)
514{ 520{
515 int rval; 521 int rval;
516 mbx_cmd_t mc; 522 mbx_cmd_t mc;
517 mbx_cmd_t *mcp = &mc; 523 mbx_cmd_t *mcp = &mc;
524 struct qla_hw_data *ha = vha->hw;
518 525
519 ql_dbg(ql_dbg_mbx, vha, 0x1029, "Entered %s.\n", __func__); 526 ql_dbg(ql_dbg_mbx, vha, 0x1029, "Entered %s.\n", __func__);
520 527
521 mcp->mb[0] = MBC_GET_FIRMWARE_VERSION; 528 mcp->mb[0] = MBC_GET_FIRMWARE_VERSION;
522 mcp->out_mb = MBX_0; 529 mcp->out_mb = MBX_0;
523 mcp->in_mb = MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; 530 mcp->in_mb = MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
524 if (IS_QLA81XX(vha->hw)) 531 if (IS_QLA81XX(vha->hw) || IS_QLA8031(ha))
525 mcp->in_mb |= MBX_13|MBX_12|MBX_11|MBX_10|MBX_9|MBX_8; 532 mcp->in_mb |= MBX_13|MBX_12|MBX_11|MBX_10|MBX_9|MBX_8;
533 if (IS_QLA83XX(vha->hw))
534 mcp->in_mb |= MBX_17|MBX_16|MBX_15;
526 mcp->flags = 0; 535 mcp->flags = 0;
527 mcp->tov = MBX_TOV_SECONDS; 536 mcp->tov = MBX_TOV_SECONDS;
528 rval = qla2x00_mailbox_command(vha, mcp); 537 rval = qla2x00_mailbox_command(vha, mcp);
@@ -530,23 +539,37 @@ qla2x00_get_fw_version(scsi_qla_host_t *vha, uint16_t *major, uint16_t *minor,
530 goto failed; 539 goto failed;
531 540
532 /* Return mailbox data. */ 541 /* Return mailbox data. */
533 *major = mcp->mb[1]; 542 ha->fw_major_version = mcp->mb[1];
534 *minor = mcp->mb[2]; 543 ha->fw_minor_version = mcp->mb[2];
535 *subminor = mcp->mb[3]; 544 ha->fw_subminor_version = mcp->mb[3];
536 *attributes = mcp->mb[6]; 545 ha->fw_attributes = mcp->mb[6];
537 if (IS_QLA2100(vha->hw) || IS_QLA2200(vha->hw)) 546 if (IS_QLA2100(vha->hw) || IS_QLA2200(vha->hw))
538 *memory = 0x1FFFF; /* Defaults to 128KB. */ 547 ha->fw_memory_size = 0x1FFFF; /* Defaults to 128KB. */
539 else 548 else
540 *memory = (mcp->mb[5] << 16) | mcp->mb[4]; 549 ha->fw_memory_size = (mcp->mb[5] << 16) | mcp->mb[4];
541 if (IS_QLA81XX(vha->hw)) { 550 if (IS_QLA81XX(vha->hw) || IS_QLA8031(vha->hw)) {
542 mpi[0] = mcp->mb[10] & 0xff; 551 ha->mpi_version[0] = mcp->mb[10] & 0xff;
543 mpi[1] = mcp->mb[11] >> 8; 552 ha->mpi_version[1] = mcp->mb[11] >> 8;
544 mpi[2] = mcp->mb[11] & 0xff; 553 ha->mpi_version[2] = mcp->mb[11] & 0xff;
545 *mpi_caps = (mcp->mb[12] << 16) | mcp->mb[13]; 554 ha->mpi_capabilities = (mcp->mb[12] << 16) | mcp->mb[13];
546 phy[0] = mcp->mb[8] & 0xff; 555 ha->phy_version[0] = mcp->mb[8] & 0xff;
547 phy[1] = mcp->mb[9] >> 8; 556 ha->phy_version[1] = mcp->mb[9] >> 8;
548 phy[2] = mcp->mb[9] & 0xff; 557 ha->phy_version[2] = mcp->mb[9] & 0xff;
558 }
559 if (IS_QLA83XX(ha)) {
560 if (mcp->mb[6] & BIT_15) {
561 ha->fw_attributes_h = mcp->mb[15];
562 ha->fw_attributes_ext[0] = mcp->mb[16];
563 ha->fw_attributes_ext[1] = mcp->mb[17];
564 ql_dbg(ql_dbg_mbx, vha, 0x1139,
565 "%s: FW_attributes Upper: 0x%x, Lower: 0x%x.\n",
566 __func__, mcp->mb[15], mcp->mb[6]);
567 } else
568 ql_dbg(ql_dbg_mbx, vha, 0x112f,
569 "%s: FwAttributes [Upper] invalid, MB6:%04x\n",
570 __func__, mcp->mb[6]);
549 } 571 }
572
550failed: 573failed:
551 if (rval != QLA_SUCCESS) { 574 if (rval != QLA_SUCCESS) {
552 /*EMPTY*/ 575 /*EMPTY*/
@@ -859,6 +882,7 @@ qla2x00_abort_command(srb_t *sp)
859 scsi_qla_host_t *vha = fcport->vha; 882 scsi_qla_host_t *vha = fcport->vha;
860 struct qla_hw_data *ha = vha->hw; 883 struct qla_hw_data *ha = vha->hw;
861 struct req_que *req = vha->req; 884 struct req_que *req = vha->req;
885 struct scsi_cmnd *cmd = GET_CMD_SP(sp);
862 886
863 ql_dbg(ql_dbg_mbx, vha, 0x103b, "Entered %s.\n", __func__); 887 ql_dbg(ql_dbg_mbx, vha, 0x103b, "Entered %s.\n", __func__);
864 888
@@ -881,7 +905,7 @@ qla2x00_abort_command(srb_t *sp)
881 mcp->mb[1] = fcport->loop_id << 8; 905 mcp->mb[1] = fcport->loop_id << 8;
882 mcp->mb[2] = (uint16_t)handle; 906 mcp->mb[2] = (uint16_t)handle;
883 mcp->mb[3] = (uint16_t)(handle >> 16); 907 mcp->mb[3] = (uint16_t)(handle >> 16);
884 mcp->mb[6] = (uint16_t)sp->cmd->device->lun; 908 mcp->mb[6] = (uint16_t)cmd->device->lun;
885 mcp->out_mb = MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; 909 mcp->out_mb = MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
886 mcp->in_mb = MBX_0; 910 mcp->in_mb = MBX_0;
887 mcp->tov = MBX_TOV_SECONDS; 911 mcp->tov = MBX_TOV_SECONDS;
@@ -1028,7 +1052,7 @@ qla2x00_get_adapter_id(scsi_qla_host_t *vha, uint16_t *id, uint8_t *al_pa,
1028 mcp->mb[9] = vha->vp_idx; 1052 mcp->mb[9] = vha->vp_idx;
1029 mcp->out_mb = MBX_9|MBX_0; 1053 mcp->out_mb = MBX_9|MBX_0;
1030 mcp->in_mb = MBX_9|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; 1054 mcp->in_mb = MBX_9|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
1031 if (IS_QLA8XXX_TYPE(vha->hw)) 1055 if (IS_CNA_CAPABLE(vha->hw))
1032 mcp->in_mb |= MBX_13|MBX_12|MBX_11|MBX_10; 1056 mcp->in_mb |= MBX_13|MBX_12|MBX_11|MBX_10;
1033 mcp->tov = MBX_TOV_SECONDS; 1057 mcp->tov = MBX_TOV_SECONDS;
1034 mcp->flags = 0; 1058 mcp->flags = 0;
@@ -1052,7 +1076,7 @@ qla2x00_get_adapter_id(scsi_qla_host_t *vha, uint16_t *id, uint8_t *al_pa,
1052 } else { 1076 } else {
1053 ql_dbg(ql_dbg_mbx, vha, 0x1048, "Done %s.\n", __func__); 1077 ql_dbg(ql_dbg_mbx, vha, 0x1048, "Done %s.\n", __func__);
1054 1078
1055 if (IS_QLA8XXX_TYPE(vha->hw)) { 1079 if (IS_CNA_CAPABLE(vha->hw)) {
1056 vha->fcoe_vlan_id = mcp->mb[9] & 0xfff; 1080 vha->fcoe_vlan_id = mcp->mb[9] & 0xfff;
1057 vha->fcoe_fcf_idx = mcp->mb[10]; 1081 vha->fcoe_fcf_idx = mcp->mb[10];
1058 vha->fcoe_vn_port_mac[5] = mcp->mb[11] >> 8; 1082 vha->fcoe_vn_port_mac[5] = mcp->mb[11] >> 8;
@@ -1163,7 +1187,7 @@ qla2x00_init_firmware(scsi_qla_host_t *vha, uint16_t size)
1163 mcp->mb[6] = MSW(MSD(ha->init_cb_dma)); 1187 mcp->mb[6] = MSW(MSD(ha->init_cb_dma));
1164 mcp->mb[7] = LSW(MSD(ha->init_cb_dma)); 1188 mcp->mb[7] = LSW(MSD(ha->init_cb_dma));
1165 mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; 1189 mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
1166 if (IS_QLA81XX(ha) && ha->ex_init_cb->ex_version) { 1190 if ((IS_QLA81XX(ha) || IS_QLA83XX(ha)) && ha->ex_init_cb->ex_version) {
1167 mcp->mb[1] = BIT_0; 1191 mcp->mb[1] = BIT_0;
1168 mcp->mb[10] = MSW(ha->ex_init_cb_dma); 1192 mcp->mb[10] = MSW(ha->ex_init_cb_dma);
1169 mcp->mb[11] = LSW(ha->ex_init_cb_dma); 1193 mcp->mb[11] = LSW(ha->ex_init_cb_dma);
@@ -1172,7 +1196,11 @@ qla2x00_init_firmware(scsi_qla_host_t *vha, uint16_t size)
1172 mcp->mb[14] = sizeof(*ha->ex_init_cb); 1196 mcp->mb[14] = sizeof(*ha->ex_init_cb);
1173 mcp->out_mb |= MBX_14|MBX_13|MBX_12|MBX_11|MBX_10; 1197 mcp->out_mb |= MBX_14|MBX_13|MBX_12|MBX_11|MBX_10;
1174 } 1198 }
1175 mcp->in_mb = MBX_0; 1199 /* 1 and 2 should normally be captured. */
1200 mcp->in_mb = MBX_2|MBX_1|MBX_0;
1201 if (IS_QLA83XX(ha))
1202 /* mb3 is additional info about the installed SFP. */
1203 mcp->in_mb |= MBX_3;
1176 mcp->buf_size = size; 1204 mcp->buf_size = size;
1177 mcp->flags = MBX_DMA_OUT; 1205 mcp->flags = MBX_DMA_OUT;
1178 mcp->tov = MBX_TOV_SECONDS; 1206 mcp->tov = MBX_TOV_SECONDS;
@@ -1181,7 +1209,8 @@ qla2x00_init_firmware(scsi_qla_host_t *vha, uint16_t size)
1181 if (rval != QLA_SUCCESS) { 1209 if (rval != QLA_SUCCESS) {
1182 /*EMPTY*/ 1210 /*EMPTY*/
1183 ql_dbg(ql_dbg_mbx, vha, 0x104d, 1211 ql_dbg(ql_dbg_mbx, vha, 0x104d,
1184 "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]); 1212 "Failed=%x mb[0]=%x, mb[1]=%x, mb[2]=%x, mb[3]=%x,.\n",
1213 rval, mcp->mb[0], mcp->mb[1], mcp->mb[2], mcp->mb[3]);
1185 } else { 1214 } else {
1186 /*EMPTY*/ 1215 /*EMPTY*/
1187 ql_dbg(ql_dbg_mbx, vha, 0x104e, "Done %s.\n", __func__); 1216 ql_dbg(ql_dbg_mbx, vha, 0x104e, "Done %s.\n", __func__);
@@ -1260,6 +1289,7 @@ qla2x00_get_port_database(scsi_qla_host_t *vha, fc_port_t *fcport, uint8_t opt)
1260 goto gpd_error_out; 1289 goto gpd_error_out;
1261 1290
1262 if (IS_FWI2_CAPABLE(ha)) { 1291 if (IS_FWI2_CAPABLE(ha)) {
1292 uint64_t zero = 0;
1263 pd24 = (struct port_database_24xx *) pd; 1293 pd24 = (struct port_database_24xx *) pd;
1264 1294
1265 /* Check for logged in state. */ 1295 /* Check for logged in state. */
@@ -1273,6 +1303,14 @@ qla2x00_get_port_database(scsi_qla_host_t *vha, fc_port_t *fcport, uint8_t opt)
1273 goto gpd_error_out; 1303 goto gpd_error_out;
1274 } 1304 }
1275 1305
1306 if (fcport->loop_id == FC_NO_LOOP_ID ||
1307 (memcmp(fcport->port_name, (uint8_t *)&zero, 8) &&
1308 memcmp(fcport->port_name, pd24->port_name, 8))) {
1309 /* We lost the device mid way. */
1310 rval = QLA_NOT_LOGGED_IN;
1311 goto gpd_error_out;
1312 }
1313
1276 /* Names are little-endian. */ 1314 /* Names are little-endian. */
1277 memcpy(fcport->node_name, pd24->node_name, WWN_SIZE); 1315 memcpy(fcport->node_name, pd24->node_name, WWN_SIZE);
1278 memcpy(fcport->port_name, pd24->port_name, WWN_SIZE); 1316 memcpy(fcport->port_name, pd24->port_name, WWN_SIZE);
@@ -1289,6 +1327,8 @@ qla2x00_get_port_database(scsi_qla_host_t *vha, fc_port_t *fcport, uint8_t opt)
1289 else 1327 else
1290 fcport->port_type = FCT_TARGET; 1328 fcport->port_type = FCT_TARGET;
1291 } else { 1329 } else {
1330 uint64_t zero = 0;
1331
1292 /* Check for logged in state. */ 1332 /* Check for logged in state. */
1293 if (pd->master_state != PD_STATE_PORT_LOGGED_IN && 1333 if (pd->master_state != PD_STATE_PORT_LOGGED_IN &&
1294 pd->slave_state != PD_STATE_PORT_LOGGED_IN) { 1334 pd->slave_state != PD_STATE_PORT_LOGGED_IN) {
@@ -1301,6 +1341,14 @@ qla2x00_get_port_database(scsi_qla_host_t *vha, fc_port_t *fcport, uint8_t opt)
1301 goto gpd_error_out; 1341 goto gpd_error_out;
1302 } 1342 }
1303 1343
1344 if (fcport->loop_id == FC_NO_LOOP_ID ||
1345 (memcmp(fcport->port_name, (uint8_t *)&zero, 8) &&
1346 memcmp(fcport->port_name, pd->port_name, 8))) {
1347 /* We lost the device mid way. */
1348 rval = QLA_NOT_LOGGED_IN;
1349 goto gpd_error_out;
1350 }
1351
1304 /* Names are little-endian. */ 1352 /* Names are little-endian. */
1305 memcpy(fcport->node_name, pd->node_name, WWN_SIZE); 1353 memcpy(fcport->node_name, pd->node_name, WWN_SIZE);
1306 memcpy(fcport->port_name, pd->port_name, WWN_SIZE); 1354 memcpy(fcport->port_name, pd->port_name, WWN_SIZE);
@@ -1481,7 +1529,7 @@ qla2x00_lip_reset(scsi_qla_host_t *vha)
1481 1529
1482 ql_dbg(ql_dbg_mbx, vha, 0x105a, "Entered %s.\n", __func__); 1530 ql_dbg(ql_dbg_mbx, vha, 0x105a, "Entered %s.\n", __func__);
1483 1531
1484 if (IS_QLA8XXX_TYPE(vha->hw)) { 1532 if (IS_CNA_CAPABLE(vha->hw)) {
1485 /* Logout across all FCFs. */ 1533 /* Logout across all FCFs. */
1486 mcp->mb[0] = MBC_LIP_FULL_LOGIN; 1534 mcp->mb[0] = MBC_LIP_FULL_LOGIN;
1487 mcp->mb[1] = BIT_1; 1535 mcp->mb[1] = BIT_1;
@@ -1622,7 +1670,8 @@ qla24xx_login_fabric(scsi_qla_host_t *vha, uint16_t loop_id, uint8_t domain,
1622 lg->port_id[1] = area; 1670 lg->port_id[1] = area;
1623 lg->port_id[2] = domain; 1671 lg->port_id[2] = domain;
1624 lg->vp_index = vha->vp_idx; 1672 lg->vp_index = vha->vp_idx;
1625 rval = qla2x00_issue_iocb(vha, lg, lg_dma, 0); 1673 rval = qla2x00_issue_iocb_timeout(vha, lg, lg_dma, 0,
1674 (ha->r_a_tov / 10 * 2) + 2);
1626 if (rval != QLA_SUCCESS) { 1675 if (rval != QLA_SUCCESS) {
1627 ql_dbg(ql_dbg_mbx, vha, 0x1063, 1676 ql_dbg(ql_dbg_mbx, vha, 0x1063,
1628 "Failed to issue login IOCB (%x).\n", rval); 1677 "Failed to issue login IOCB (%x).\n", rval);
@@ -1885,8 +1934,8 @@ qla24xx_fabric_logout(scsi_qla_host_t *vha, uint16_t loop_id, uint8_t domain,
1885 lg->port_id[1] = area; 1934 lg->port_id[1] = area;
1886 lg->port_id[2] = domain; 1935 lg->port_id[2] = domain;
1887 lg->vp_index = vha->vp_idx; 1936 lg->vp_index = vha->vp_idx;
1888 1937 rval = qla2x00_issue_iocb_timeout(vha, lg, lg_dma, 0,
1889 rval = qla2x00_issue_iocb(vha, lg, lg_dma, 0); 1938 (ha->r_a_tov / 10 * 2) + 2);
1890 if (rval != QLA_SUCCESS) { 1939 if (rval != QLA_SUCCESS) {
1891 ql_dbg(ql_dbg_mbx, vha, 0x106f, 1940 ql_dbg(ql_dbg_mbx, vha, 0x106f,
1892 "Failed to issue logout IOCB (%x).\n", rval); 1941 "Failed to issue logout IOCB (%x).\n", rval);
@@ -2094,7 +2143,7 @@ qla2x00_get_resource_cnts(scsi_qla_host_t *vha, uint16_t *cur_xchg_cnt,
2094 mcp->mb[0] = MBC_GET_RESOURCE_COUNTS; 2143 mcp->mb[0] = MBC_GET_RESOURCE_COUNTS;
2095 mcp->out_mb = MBX_0; 2144 mcp->out_mb = MBX_0;
2096 mcp->in_mb = MBX_11|MBX_10|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; 2145 mcp->in_mb = MBX_11|MBX_10|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
2097 if (IS_QLA81XX(vha->hw)) 2146 if (IS_QLA81XX(vha->hw) || IS_QLA83XX(vha->hw))
2098 mcp->in_mb |= MBX_12; 2147 mcp->in_mb |= MBX_12;
2099 mcp->tov = MBX_TOV_SECONDS; 2148 mcp->tov = MBX_TOV_SECONDS;
2100 mcp->flags = 0; 2149 mcp->flags = 0;
@@ -2121,7 +2170,7 @@ qla2x00_get_resource_cnts(scsi_qla_host_t *vha, uint16_t *cur_xchg_cnt,
2121 *orig_iocb_cnt = mcp->mb[10]; 2170 *orig_iocb_cnt = mcp->mb[10];
2122 if (vha->hw->flags.npiv_supported && max_npiv_vports) 2171 if (vha->hw->flags.npiv_supported && max_npiv_vports)
2123 *max_npiv_vports = mcp->mb[11]; 2172 *max_npiv_vports = mcp->mb[11];
2124 if (IS_QLA81XX(vha->hw) && max_fcfs) 2173 if ((IS_QLA81XX(vha->hw) || IS_QLA83XX(vha->hw)) && max_fcfs)
2125 *max_fcfs = mcp->mb[12]; 2174 *max_fcfs = mcp->mb[12];
2126 } 2175 }
2127 2176
@@ -2686,7 +2735,8 @@ qla2x00_enable_fce_trace(scsi_qla_host_t *vha, dma_addr_t fce_dma,
2686 2735
2687 ql_dbg(ql_dbg_mbx, vha, 0x10aa, "Entered %s.\n", __func__); 2736 ql_dbg(ql_dbg_mbx, vha, 0x10aa, "Entered %s.\n", __func__);
2688 2737
2689 if (!IS_QLA25XX(vha->hw) && !IS_QLA81XX(vha->hw)) 2738 if (!IS_QLA25XX(vha->hw) && !IS_QLA81XX(vha->hw) &&
2739 !IS_QLA83XX(vha->hw))
2690 return QLA_FUNCTION_FAILED; 2740 return QLA_FUNCTION_FAILED;
2691 2741
2692 if (unlikely(pci_channel_offline(vha->hw->pdev))) 2742 if (unlikely(pci_channel_offline(vha->hw->pdev)))
@@ -2828,7 +2878,7 @@ qla2x00_set_idma_speed(scsi_qla_host_t *vha, uint16_t loop_id,
2828 mcp->mb[0] = MBC_PORT_PARAMS; 2878 mcp->mb[0] = MBC_PORT_PARAMS;
2829 mcp->mb[1] = loop_id; 2879 mcp->mb[1] = loop_id;
2830 mcp->mb[2] = BIT_0; 2880 mcp->mb[2] = BIT_0;
2831 if (IS_QLA8XXX_TYPE(vha->hw)) 2881 if (IS_CNA_CAPABLE(vha->hw))
2832 mcp->mb[3] = port_speed & (BIT_5|BIT_4|BIT_3|BIT_2|BIT_1|BIT_0); 2882 mcp->mb[3] = port_speed & (BIT_5|BIT_4|BIT_3|BIT_2|BIT_1|BIT_0);
2833 else 2883 else
2834 mcp->mb[3] = port_speed & (BIT_2|BIT_1|BIT_0); 2884 mcp->mb[3] = port_speed & (BIT_2|BIT_1|BIT_0);
@@ -3298,6 +3348,8 @@ qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req)
3298 mcp->mb[12] = req->qos; 3348 mcp->mb[12] = req->qos;
3299 mcp->mb[11] = req->vp_idx; 3349 mcp->mb[11] = req->vp_idx;
3300 mcp->mb[13] = req->rid; 3350 mcp->mb[13] = req->rid;
3351 if (IS_QLA83XX(ha))
3352 mcp->mb[15] = 0;
3301 3353
3302 reg = (struct device_reg_25xxmq *)((void *)(ha->mqiobase) + 3354 reg = (struct device_reg_25xxmq *)((void *)(ha->mqiobase) +
3303 QLA_QUE_PAGE * req->id); 3355 QLA_QUE_PAGE * req->id);
@@ -3311,12 +3363,21 @@ qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req)
3311 MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; 3363 MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
3312 mcp->in_mb = MBX_0; 3364 mcp->in_mb = MBX_0;
3313 mcp->flags = MBX_DMA_OUT; 3365 mcp->flags = MBX_DMA_OUT;
3314 mcp->tov = 60; 3366 mcp->tov = MBX_TOV_SECONDS * 2;
3367
3368 if (IS_QLA81XX(ha) || IS_QLA83XX(ha))
3369 mcp->in_mb |= MBX_1;
3370 if (IS_QLA83XX(ha)) {
3371 mcp->out_mb |= MBX_15;
3372 /* debug q create issue in SR-IOV */
3373 mcp->in_mb |= MBX_9 | MBX_8 | MBX_7;
3374 }
3315 3375
3316 spin_lock_irqsave(&ha->hardware_lock, flags); 3376 spin_lock_irqsave(&ha->hardware_lock, flags);
3317 if (!(req->options & BIT_0)) { 3377 if (!(req->options & BIT_0)) {
3318 WRT_REG_DWORD(&reg->req_q_in, 0); 3378 WRT_REG_DWORD(&reg->req_q_in, 0);
3319 WRT_REG_DWORD(&reg->req_q_out, 0); 3379 if (!IS_QLA83XX(ha))
3380 WRT_REG_DWORD(&reg->req_q_out, 0);
3320 } 3381 }
3321 req->req_q_in = &reg->req_q_in; 3382 req->req_q_in = &reg->req_q_in;
3322 req->req_q_out = &reg->req_q_out; 3383 req->req_q_out = &reg->req_q_out;
@@ -3354,6 +3415,8 @@ qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp)
3354 mcp->mb[5] = rsp->length; 3415 mcp->mb[5] = rsp->length;
3355 mcp->mb[14] = rsp->msix->entry; 3416 mcp->mb[14] = rsp->msix->entry;
3356 mcp->mb[13] = rsp->rid; 3417 mcp->mb[13] = rsp->rid;
3418 if (IS_QLA83XX(ha))
3419 mcp->mb[15] = 0;
3357 3420
3358 reg = (struct device_reg_25xxmq *)((void *)(ha->mqiobase) + 3421 reg = (struct device_reg_25xxmq *)((void *)(ha->mqiobase) +
3359 QLA_QUE_PAGE * rsp->id); 3422 QLA_QUE_PAGE * rsp->id);
@@ -3367,12 +3430,23 @@ qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp)
3367 |MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; 3430 |MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
3368 mcp->in_mb = MBX_0; 3431 mcp->in_mb = MBX_0;
3369 mcp->flags = MBX_DMA_OUT; 3432 mcp->flags = MBX_DMA_OUT;
3370 mcp->tov = 60; 3433 mcp->tov = MBX_TOV_SECONDS * 2;
3434
3435 if (IS_QLA81XX(ha)) {
3436 mcp->out_mb |= MBX_12|MBX_11|MBX_10;
3437 mcp->in_mb |= MBX_1;
3438 } else if (IS_QLA83XX(ha)) {
3439 mcp->out_mb |= MBX_15|MBX_12|MBX_11|MBX_10;
3440 mcp->in_mb |= MBX_1;
3441 /* debug q create issue in SR-IOV */
3442 mcp->in_mb |= MBX_9 | MBX_8 | MBX_7;
3443 }
3371 3444
3372 spin_lock_irqsave(&ha->hardware_lock, flags); 3445 spin_lock_irqsave(&ha->hardware_lock, flags);
3373 if (!(rsp->options & BIT_0)) { 3446 if (!(rsp->options & BIT_0)) {
3374 WRT_REG_DWORD(&reg->rsp_q_out, 0); 3447 WRT_REG_DWORD(&reg->rsp_q_out, 0);
3375 WRT_REG_DWORD(&reg->rsp_q_in, 0); 3448 if (!IS_QLA83XX(ha))
3449 WRT_REG_DWORD(&reg->rsp_q_in, 0);
3376 } 3450 }
3377 3451
3378 spin_unlock_irqrestore(&ha->hardware_lock, flags); 3452 spin_unlock_irqrestore(&ha->hardware_lock, flags);
@@ -3424,7 +3498,7 @@ qla81xx_fac_get_sector_size(scsi_qla_host_t *vha, uint32_t *sector_size)
3424 3498
3425 ql_dbg(ql_dbg_mbx, vha, 0x10dc, "Entered %s.\n", __func__); 3499 ql_dbg(ql_dbg_mbx, vha, 0x10dc, "Entered %s.\n", __func__);
3426 3500
3427 if (!IS_QLA81XX(vha->hw)) 3501 if (!IS_QLA81XX(vha->hw) && !IS_QLA83XX(vha->hw))
3428 return QLA_FUNCTION_FAILED; 3502 return QLA_FUNCTION_FAILED;
3429 3503
3430 mcp->mb[0] = MBC_FLASH_ACCESS_CTRL; 3504 mcp->mb[0] = MBC_FLASH_ACCESS_CTRL;
@@ -3454,7 +3528,7 @@ qla81xx_fac_do_write_enable(scsi_qla_host_t *vha, int enable)
3454 mbx_cmd_t mc; 3528 mbx_cmd_t mc;
3455 mbx_cmd_t *mcp = &mc; 3529 mbx_cmd_t *mcp = &mc;
3456 3530
3457 if (!IS_QLA81XX(vha->hw)) 3531 if (!IS_QLA81XX(vha->hw) && !IS_QLA83XX(vha->hw))
3458 return QLA_FUNCTION_FAILED; 3532 return QLA_FUNCTION_FAILED;
3459 3533
3460 ql_dbg(ql_dbg_mbx, vha, 0x10df, "Entered %s.\n", __func__); 3534 ql_dbg(ql_dbg_mbx, vha, 0x10df, "Entered %s.\n", __func__);
@@ -3486,7 +3560,7 @@ qla81xx_fac_erase_sector(scsi_qla_host_t *vha, uint32_t start, uint32_t finish)
3486 mbx_cmd_t mc; 3560 mbx_cmd_t mc;
3487 mbx_cmd_t *mcp = &mc; 3561 mbx_cmd_t *mcp = &mc;
3488 3562
3489 if (!IS_QLA81XX(vha->hw)) 3563 if (!IS_QLA81XX(vha->hw) && !IS_QLA83XX(vha->hw))
3490 return QLA_FUNCTION_FAILED; 3564 return QLA_FUNCTION_FAILED;
3491 3565
3492 ql_dbg(ql_dbg_mbx, vha, 0x10e2, "Entered %s.\n", __func__); 3566 ql_dbg(ql_dbg_mbx, vha, 0x10e2, "Entered %s.\n", __func__);
@@ -3641,7 +3715,7 @@ qla2x00_get_xgmac_stats(scsi_qla_host_t *vha, dma_addr_t stats_dma,
3641 3715
3642 ql_dbg(ql_dbg_mbx, vha, 0x10ee, "Entered %s.\n", __func__); 3716 ql_dbg(ql_dbg_mbx, vha, 0x10ee, "Entered %s.\n", __func__);
3643 3717
3644 if (!IS_QLA8XXX_TYPE(vha->hw)) 3718 if (!IS_CNA_CAPABLE(vha->hw))
3645 return QLA_FUNCTION_FAILED; 3719 return QLA_FUNCTION_FAILED;
3646 3720
3647 mcp->mb[0] = MBC_GET_XGMAC_STATS; 3721 mcp->mb[0] = MBC_GET_XGMAC_STATS;
@@ -3680,7 +3754,7 @@ qla2x00_get_dcbx_params(scsi_qla_host_t *vha, dma_addr_t tlv_dma,
3680 3754
3681 ql_dbg(ql_dbg_mbx, vha, 0x10f1, "Entered %s.\n", __func__); 3755 ql_dbg(ql_dbg_mbx, vha, 0x10f1, "Entered %s.\n", __func__);
3682 3756
3683 if (!IS_QLA8XXX_TYPE(vha->hw)) 3757 if (!IS_CNA_CAPABLE(vha->hw))
3684 return QLA_FUNCTION_FAILED; 3758 return QLA_FUNCTION_FAILED;
3685 3759
3686 mcp->mb[0] = MBC_GET_DCBX_PARAMS; 3760 mcp->mb[0] = MBC_GET_DCBX_PARAMS;
@@ -3775,7 +3849,7 @@ qla2x00_loopback_test(scsi_qla_host_t *vha, struct msg_echo_lb *mreq,
3775 3849
3776 mcp->out_mb = MBX_21|MBX_20|MBX_19|MBX_18|MBX_17|MBX_16|MBX_15| 3850 mcp->out_mb = MBX_21|MBX_20|MBX_19|MBX_18|MBX_17|MBX_16|MBX_15|
3777 MBX_14|MBX_13|MBX_12|MBX_11|MBX_10|MBX_7|MBX_6|MBX_1|MBX_0; 3851 MBX_14|MBX_13|MBX_12|MBX_11|MBX_10|MBX_7|MBX_6|MBX_1|MBX_0;
3778 if (IS_QLA8XXX_TYPE(vha->hw)) 3852 if (IS_CNA_CAPABLE(vha->hw))
3779 mcp->out_mb |= MBX_2; 3853 mcp->out_mb |= MBX_2;
3780 mcp->in_mb = MBX_19|MBX_18|MBX_3|MBX_2|MBX_1|MBX_0; 3854 mcp->in_mb = MBX_19|MBX_18|MBX_3|MBX_2|MBX_1|MBX_0;
3781 3855
@@ -3813,7 +3887,7 @@ qla2x00_echo_test(scsi_qla_host_t *vha, struct msg_echo_lb *mreq,
3813 memset(mcp->mb, 0 , sizeof(mcp->mb)); 3887 memset(mcp->mb, 0 , sizeof(mcp->mb));
3814 mcp->mb[0] = MBC_DIAGNOSTIC_ECHO; 3888 mcp->mb[0] = MBC_DIAGNOSTIC_ECHO;
3815 mcp->mb[1] = mreq->options | BIT_6; /* BIT_6 specifies 64bit address */ 3889 mcp->mb[1] = mreq->options | BIT_6; /* BIT_6 specifies 64bit address */
3816 if (IS_QLA8XXX_TYPE(ha)) { 3890 if (IS_CNA_CAPABLE(ha)) {
3817 mcp->mb[1] |= BIT_15; 3891 mcp->mb[1] |= BIT_15;
3818 mcp->mb[2] = vha->fcoe_fcf_idx; 3892 mcp->mb[2] = vha->fcoe_fcf_idx;
3819 } 3893 }
@@ -3831,13 +3905,14 @@ qla2x00_echo_test(scsi_qla_host_t *vha, struct msg_echo_lb *mreq,
3831 3905
3832 mcp->out_mb = MBX_21|MBX_20|MBX_17|MBX_16|MBX_15| 3906 mcp->out_mb = MBX_21|MBX_20|MBX_17|MBX_16|MBX_15|
3833 MBX_14|MBX_10|MBX_7|MBX_6|MBX_1|MBX_0; 3907 MBX_14|MBX_10|MBX_7|MBX_6|MBX_1|MBX_0;
3834 if (IS_QLA8XXX_TYPE(ha)) 3908 if (IS_CNA_CAPABLE(ha))
3835 mcp->out_mb |= MBX_2; 3909 mcp->out_mb |= MBX_2;
3836 3910
3837 mcp->in_mb = MBX_0; 3911 mcp->in_mb = MBX_0;
3838 if (IS_QLA24XX_TYPE(ha) || IS_QLA25XX(ha) || IS_QLA8XXX_TYPE(ha)) 3912 if (IS_QLA24XX_TYPE(ha) || IS_QLA25XX(ha) ||
3913 IS_CNA_CAPABLE(ha) || IS_QLA2031(ha))
3839 mcp->in_mb |= MBX_1; 3914 mcp->in_mb |= MBX_1;
3840 if (IS_QLA8XXX_TYPE(ha)) 3915 if (IS_CNA_CAPABLE(ha) || IS_QLA2031(ha))
3841 mcp->in_mb |= MBX_3; 3916 mcp->in_mb |= MBX_3;
3842 3917
3843 mcp->tov = MBX_TOV_SECONDS; 3918 mcp->tov = MBX_TOV_SECONDS;
@@ -3976,6 +4051,7 @@ qla81xx_write_mpi_register(scsi_qla_host_t *vha, uint16_t *mb)
3976 4051
3977 return rval; 4052 return rval;
3978} 4053}
4054
3979int 4055int
3980qla2x00_get_data_rate(scsi_qla_host_t *vha) 4056qla2x00_get_data_rate(scsi_qla_host_t *vha)
3981{ 4057{
@@ -3993,6 +4069,8 @@ qla2x00_get_data_rate(scsi_qla_host_t *vha)
3993 mcp->mb[1] = 0; 4069 mcp->mb[1] = 0;
3994 mcp->out_mb = MBX_1|MBX_0; 4070 mcp->out_mb = MBX_1|MBX_0;
3995 mcp->in_mb = MBX_2|MBX_1|MBX_0; 4071 mcp->in_mb = MBX_2|MBX_1|MBX_0;
4072 if (IS_QLA83XX(ha))
4073 mcp->in_mb |= MBX_3;
3996 mcp->tov = MBX_TOV_SECONDS; 4074 mcp->tov = MBX_TOV_SECONDS;
3997 mcp->flags = 0; 4075 mcp->flags = 0;
3998 rval = qla2x00_mailbox_command(vha, mcp); 4076 rval = qla2x00_mailbox_command(vha, mcp);
@@ -4018,7 +4096,7 @@ qla81xx_get_port_config(scsi_qla_host_t *vha, uint16_t *mb)
4018 4096
4019 ql_dbg(ql_dbg_mbx, vha, 0x1109, "Entered %s.\n", __func__); 4097 ql_dbg(ql_dbg_mbx, vha, 0x1109, "Entered %s.\n", __func__);
4020 4098
4021 if (!IS_QLA81XX(ha)) 4099 if (!IS_QLA81XX(ha) && !IS_QLA83XX(ha))
4022 return QLA_FUNCTION_FAILED; 4100 return QLA_FUNCTION_FAILED;
4023 mcp->mb[0] = MBC_GET_PORT_CONFIG; 4101 mcp->mb[0] = MBC_GET_PORT_CONFIG;
4024 mcp->out_mb = MBX_0; 4102 mcp->out_mb = MBX_0;
@@ -4299,6 +4377,90 @@ qla82xx_md_get_template(scsi_qla_host_t *vha)
4299} 4377}
4300 4378
4301int 4379int
4380qla81xx_set_led_config(scsi_qla_host_t *vha, uint16_t *led_cfg)
4381{
4382 int rval;
4383 struct qla_hw_data *ha = vha->hw;
4384 mbx_cmd_t mc;
4385 mbx_cmd_t *mcp = &mc;
4386
4387 if (!IS_QLA81XX(ha) && !IS_QLA8031(ha))
4388 return QLA_FUNCTION_FAILED;
4389
4390 ql_dbg(ql_dbg_mbx, vha, 0x1133, "Entered %s.\n", __func__);
4391
4392 memset(mcp, 0, sizeof(mbx_cmd_t));
4393 mcp->mb[0] = MBC_SET_LED_CONFIG;
4394 mcp->mb[1] = led_cfg[0];
4395 mcp->mb[2] = led_cfg[1];
4396 if (IS_QLA8031(ha)) {
4397 mcp->mb[3] = led_cfg[2];
4398 mcp->mb[4] = led_cfg[3];
4399 mcp->mb[5] = led_cfg[4];
4400 mcp->mb[6] = led_cfg[5];
4401 }
4402
4403 mcp->out_mb = MBX_2|MBX_1|MBX_0;
4404 if (IS_QLA8031(ha))
4405 mcp->out_mb |= MBX_6|MBX_5|MBX_4|MBX_3;
4406 mcp->in_mb = MBX_0;
4407 mcp->tov = 30;
4408 mcp->flags = 0;
4409
4410 rval = qla2x00_mailbox_command(vha, mcp);
4411 if (rval != QLA_SUCCESS) {
4412 ql_dbg(ql_dbg_mbx, vha, 0x1134,
4413 "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
4414 } else {
4415 ql_dbg(ql_dbg_mbx, vha, 0x1135, "Done %s.\n", __func__);
4416 }
4417
4418 return rval;
4419}
4420
4421int
4422qla81xx_get_led_config(scsi_qla_host_t *vha, uint16_t *led_cfg)
4423{
4424 int rval;
4425 struct qla_hw_data *ha = vha->hw;
4426 mbx_cmd_t mc;
4427 mbx_cmd_t *mcp = &mc;
4428
4429 if (!IS_QLA81XX(ha) && !IS_QLA8031(ha))
4430 return QLA_FUNCTION_FAILED;
4431
4432 ql_dbg(ql_dbg_mbx, vha, 0x1136, "Entered %s.\n", __func__);
4433
4434 memset(mcp, 0, sizeof(mbx_cmd_t));
4435 mcp->mb[0] = MBC_GET_LED_CONFIG;
4436
4437 mcp->out_mb = MBX_0;
4438 mcp->in_mb = MBX_2|MBX_1|MBX_0;
4439 if (IS_QLA8031(ha))
4440 mcp->in_mb |= MBX_6|MBX_5|MBX_4|MBX_3;
4441 mcp->tov = 30;
4442 mcp->flags = 0;
4443
4444 rval = qla2x00_mailbox_command(vha, mcp);
4445 if (rval != QLA_SUCCESS) {
4446 ql_dbg(ql_dbg_mbx, vha, 0x1137,
4447 "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
4448 } else {
4449 led_cfg[0] = mcp->mb[1];
4450 led_cfg[1] = mcp->mb[2];
4451 if (IS_QLA8031(ha)) {
4452 led_cfg[2] = mcp->mb[3];
4453 led_cfg[3] = mcp->mb[4];
4454 led_cfg[4] = mcp->mb[5];
4455 led_cfg[5] = mcp->mb[6];
4456 }
4457 ql_dbg(ql_dbg_mbx, vha, 0x1138, "Done %s.\n", __func__);
4458 }
4459
4460 return rval;
4461}
4462
4463int
4302qla82xx_mbx_beacon_ctl(scsi_qla_host_t *vha, int enable) 4464qla82xx_mbx_beacon_ctl(scsi_qla_host_t *vha, int enable)
4303{ 4465{
4304 int rval; 4466 int rval;
@@ -4321,7 +4483,7 @@ qla82xx_mbx_beacon_ctl(scsi_qla_host_t *vha, int enable)
4321 4483
4322 mcp->out_mb = MBX_7|MBX_0; 4484 mcp->out_mb = MBX_7|MBX_0;
4323 mcp->in_mb = MBX_0; 4485 mcp->in_mb = MBX_0;
4324 mcp->tov = 30; 4486 mcp->tov = MBX_TOV_SECONDS;
4325 mcp->flags = 0; 4487 mcp->flags = 0;
4326 4488
4327 rval = qla2x00_mailbox_command(vha, mcp); 4489 rval = qla2x00_mailbox_command(vha, mcp);
@@ -4335,3 +4497,75 @@ qla82xx_mbx_beacon_ctl(scsi_qla_host_t *vha, int enable)
4335 4497
4336 return rval; 4498 return rval;
4337} 4499}
4500
4501int
4502qla83xx_write_remote_reg(scsi_qla_host_t *vha, uint32_t reg, uint32_t data)
4503{
4504 int rval;
4505 struct qla_hw_data *ha = vha->hw;
4506 mbx_cmd_t mc;
4507 mbx_cmd_t *mcp = &mc;
4508
4509 if (!IS_QLA83XX(ha))
4510 return QLA_FUNCTION_FAILED;
4511
4512 ql_dbg(ql_dbg_mbx, vha, 0x1130, "Entered %s.\n", __func__);
4513
4514 mcp->mb[0] = MBC_WRITE_REMOTE_REG;
4515 mcp->mb[1] = LSW(reg);
4516 mcp->mb[2] = MSW(reg);
4517 mcp->mb[3] = LSW(data);
4518 mcp->mb[4] = MSW(data);
4519 mcp->out_mb = MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
4520
4521 mcp->in_mb = MBX_1|MBX_0;
4522 mcp->tov = MBX_TOV_SECONDS;
4523 mcp->flags = 0;
4524 rval = qla2x00_mailbox_command(vha, mcp);
4525
4526 if (rval != QLA_SUCCESS) {
4527 ql_dbg(ql_dbg_mbx, vha, 0x1131,
4528 "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
4529 } else {
4530 ql_dbg(ql_dbg_mbx, vha, 0x1132,
4531 "Done %s.\n", __func__);
4532 }
4533
4534 return rval;
4535}
4536
4537int
4538qla2x00_port_logout(scsi_qla_host_t *vha, struct fc_port *fcport)
4539{
4540 int rval;
4541 struct qla_hw_data *ha = vha->hw;
4542 mbx_cmd_t mc;
4543 mbx_cmd_t *mcp = &mc;
4544
4545 if (IS_QLA2100(ha) || IS_QLA2200(ha)) {
4546 ql_dbg(ql_dbg_mbx, vha, 0x113b,
4547 "Implicit LOGO Unsupported.\n");
4548 return QLA_FUNCTION_FAILED;
4549 }
4550
4551
4552 ql_dbg(ql_dbg_mbx, vha, 0x113c, "Done %s.\n", __func__);
4553
4554 /* Perform Implicit LOGO. */
4555 mcp->mb[0] = MBC_PORT_LOGOUT;
4556 mcp->mb[1] = fcport->loop_id;
4557 mcp->mb[10] = BIT_15;
4558 mcp->out_mb = MBX_10|MBX_1|MBX_0;
4559 mcp->in_mb = MBX_0;
4560 mcp->tov = MBX_TOV_SECONDS;
4561 mcp->flags = 0;
4562 rval = qla2x00_mailbox_command(vha, mcp);
4563 if (rval != QLA_SUCCESS)
4564 ql_dbg(ql_dbg_mbx, vha, 0x113d,
4565 "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
4566 else
4567 ql_dbg(ql_dbg_mbx, vha, 0x113e, "Done %s.\n", __func__);
4568
4569 return rval;
4570}
4571
diff --git a/drivers/scsi/qla2xxx/qla_mid.c b/drivers/scsi/qla2xxx/qla_mid.c
index f488cc69fc79..aa062a1b0ca4 100644
--- a/drivers/scsi/qla2xxx/qla_mid.c
+++ b/drivers/scsi/qla2xxx/qla_mid.c
@@ -479,7 +479,7 @@ qla24xx_create_vhost(struct fc_vport *fc_vport)
479 host->max_channel = MAX_BUSES - 1; 479 host->max_channel = MAX_BUSES - 1;
480 host->max_lun = ql2xmaxlun; 480 host->max_lun = ql2xmaxlun;
481 host->unique_id = host->host_no; 481 host->unique_id = host->host_no;
482 host->max_id = MAX_TARGETS_2200; 482 host->max_id = ha->max_fibre_devices;
483 host->transportt = qla2xxx_transport_vport_template; 483 host->transportt = qla2xxx_transport_vport_template;
484 484
485 ql_dbg(ql_dbg_vport, vha, 0xa007, 485 ql_dbg(ql_dbg_vport, vha, 0xa007,
diff --git a/drivers/scsi/qla2xxx/qla_nx.c b/drivers/scsi/qla2xxx/qla_nx.c
index 270ba3130fde..f0528539bbbc 100644
--- a/drivers/scsi/qla2xxx/qla_nx.c
+++ b/drivers/scsi/qla2xxx/qla_nx.c
@@ -908,27 +908,37 @@ qla82xx_wait_rom_done(struct qla_hw_data *ha)
908 return 0; 908 return 0;
909} 909}
910 910
911int
912qla82xx_md_rw_32(struct qla_hw_data *ha, uint32_t off, u32 data, uint8_t flag)
913{
914 uint32_t off_value, rval = 0;
915
916 WRT_REG_DWORD((void *)(CRB_WINDOW_2M + ha->nx_pcibase),
917 (off & 0xFFFF0000));
918
919 /* Read back value to make sure write has gone through */
920 RD_REG_DWORD((void *)(CRB_WINDOW_2M + ha->nx_pcibase));
921 off_value = (off & 0x0000FFFF);
922
923 if (flag)
924 WRT_REG_DWORD((void *)
925 (off_value + CRB_INDIRECT_2M + ha->nx_pcibase),
926 data);
927 else
928 rval = RD_REG_DWORD((void *)
929 (off_value + CRB_INDIRECT_2M + ha->nx_pcibase));
930
931 return rval;
932}
933
911static int 934static int
912qla82xx_do_rom_fast_read(struct qla_hw_data *ha, int addr, int *valp) 935qla82xx_do_rom_fast_read(struct qla_hw_data *ha, int addr, int *valp)
913{ 936{
914 scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev); 937 /* Dword reads to flash. */
938 qla82xx_md_rw_32(ha, MD_DIRECT_ROM_WINDOW, (addr & 0xFFFF0000), 1);
939 *valp = qla82xx_md_rw_32(ha, MD_DIRECT_ROM_READ_BASE +
940 (addr & 0x0000FFFF), 0, 0);
915 941
916 qla82xx_wr_32(ha, QLA82XX_ROMUSB_ROM_ADDRESS, addr);
917 qla82xx_wr_32(ha, QLA82XX_ROMUSB_ROM_DUMMY_BYTE_CNT, 0);
918 qla82xx_wr_32(ha, QLA82XX_ROMUSB_ROM_ABYTE_CNT, 3);
919 qla82xx_wr_32(ha, QLA82XX_ROMUSB_ROM_INSTR_OPCODE, 0xb);
920 qla82xx_wait_rom_busy(ha);
921 if (qla82xx_wait_rom_done(ha)) {
922 ql_log(ql_log_fatal, vha, 0x00ba,
923 "Error waiting for rom done.\n");
924 return -1;
925 }
926 /* Reset abyte_cnt and dummy_byte_cnt */
927 qla82xx_wr_32(ha, QLA82XX_ROMUSB_ROM_DUMMY_BYTE_CNT, 0);
928 udelay(10);
929 cond_resched();
930 qla82xx_wr_32(ha, QLA82XX_ROMUSB_ROM_ABYTE_CNT, 0);
931 *valp = qla82xx_rd_32(ha, QLA82XX_ROMUSB_ROM_RDATA);
932 return 0; 942 return 0;
933} 943}
934 944
@@ -2040,8 +2050,8 @@ qla82xx_intr_handler(int irq, void *dev_id)
2040 2050
2041 rsp = (struct rsp_que *) dev_id; 2051 rsp = (struct rsp_que *) dev_id;
2042 if (!rsp) { 2052 if (!rsp) {
2043 printk(KERN_INFO 2053 ql_log(ql_log_info, NULL, 0xb054,
2044 "%s(): NULL response queue pointer.\n", __func__); 2054 "%s: NULL response queue pointer.\n", __func__);
2045 return IRQ_NONE; 2055 return IRQ_NONE;
2046 } 2056 }
2047 ha = rsp->hw; 2057 ha = rsp->hw;
@@ -3136,12 +3146,7 @@ qla82xx_check_md_needed(scsi_qla_host_t *vha)
3136 fw_minor_version = ha->fw_minor_version; 3146 fw_minor_version = ha->fw_minor_version;
3137 fw_subminor_version = ha->fw_subminor_version; 3147 fw_subminor_version = ha->fw_subminor_version;
3138 3148
3139 rval = qla2x00_get_fw_version(vha, &ha->fw_major_version, 3149 rval = qla2x00_get_fw_version(vha);
3140 &ha->fw_minor_version, &ha->fw_subminor_version,
3141 &ha->fw_attributes, &ha->fw_memory_size,
3142 ha->mpi_version, &ha->mpi_capabilities,
3143 ha->phy_version);
3144
3145 if (rval != QLA_SUCCESS) 3150 if (rval != QLA_SUCCESS)
3146 return rval; 3151 return rval;
3147 3152
@@ -3150,7 +3155,6 @@ qla82xx_check_md_needed(scsi_qla_host_t *vha)
3150 if (fw_major_version != ha->fw_major_version || 3155 if (fw_major_version != ha->fw_major_version ||
3151 fw_minor_version != ha->fw_minor_version || 3156 fw_minor_version != ha->fw_minor_version ||
3152 fw_subminor_version != ha->fw_subminor_version) { 3157 fw_subminor_version != ha->fw_subminor_version) {
3153
3154 ql_log(ql_log_info, vha, 0xb02d, 3158 ql_log(ql_log_info, vha, 0xb02d,
3155 "Firmware version differs " 3159 "Firmware version differs "
3156 "Previous version: %d:%d:%d - " 3160 "Previous version: %d:%d:%d - "
@@ -3614,7 +3618,7 @@ qla82xx_chip_reset_cleanup(scsi_qla_host_t *vha)
3614 for (cnt = 1; cnt < MAX_OUTSTANDING_COMMANDS; cnt++) { 3618 for (cnt = 1; cnt < MAX_OUTSTANDING_COMMANDS; cnt++) {
3615 sp = req->outstanding_cmds[cnt]; 3619 sp = req->outstanding_cmds[cnt];
3616 if (sp) { 3620 if (sp) {
3617 if (!sp->ctx || 3621 if (!sp->u.scmd.ctx ||
3618 (sp->flags & SRB_FCP_CMND_DMA_VALID)) { 3622 (sp->flags & SRB_FCP_CMND_DMA_VALID)) {
3619 spin_unlock_irqrestore( 3623 spin_unlock_irqrestore(
3620 &ha->hardware_lock, flags); 3624 &ha->hardware_lock, flags);
@@ -3645,29 +3649,6 @@ qla82xx_chip_reset_cleanup(scsi_qla_host_t *vha)
3645} 3649}
3646 3650
3647/* Minidump related functions */ 3651/* Minidump related functions */
3648int
3649qla82xx_md_rw_32(struct qla_hw_data *ha, uint32_t off, u32 data, uint8_t flag)
3650{
3651 uint32_t off_value, rval = 0;
3652
3653 WRT_REG_DWORD((void *)(CRB_WINDOW_2M + ha->nx_pcibase),
3654 (off & 0xFFFF0000));
3655
3656 /* Read back value to make sure write has gone through */
3657 RD_REG_DWORD((void *)(CRB_WINDOW_2M + ha->nx_pcibase));
3658 off_value = (off & 0x0000FFFF);
3659
3660 if (flag)
3661 WRT_REG_DWORD((void *)
3662 (off_value + CRB_INDIRECT_2M + ha->nx_pcibase),
3663 data);
3664 else
3665 rval = RD_REG_DWORD((void *)
3666 (off_value + CRB_INDIRECT_2M + ha->nx_pcibase));
3667
3668 return rval;
3669}
3670
3671static int 3652static int
3672qla82xx_minidump_process_control(scsi_qla_host_t *vha, 3653qla82xx_minidump_process_control(scsi_qla_host_t *vha,
3673 qla82xx_md_entry_hdr_t *entry_hdr, uint32_t **d_ptr) 3654 qla82xx_md_entry_hdr_t *entry_hdr, uint32_t **d_ptr)
@@ -4117,8 +4098,9 @@ qla82xx_md_collect(scsi_qla_host_t *vha)
4117 data_ptr = (uint32_t *)ha->md_dump; 4098 data_ptr = (uint32_t *)ha->md_dump;
4118 4099
4119 if (ha->fw_dumped) { 4100 if (ha->fw_dumped) {
4120 ql_log(ql_log_info, vha, 0xb037, 4101 ql_log(ql_log_warn, vha, 0xb037,
4121 "Firmware dump available to retrive\n"); 4102 "Firmware has been previously dumped (%p) "
4103 "-- ignoring request.\n", ha->fw_dump);
4122 goto md_failed; 4104 goto md_failed;
4123 } 4105 }
4124 4106
@@ -4161,7 +4143,7 @@ qla82xx_md_collect(scsi_qla_host_t *vha)
4161 4143
4162 total_data_size = ha->md_dump_size; 4144 total_data_size = ha->md_dump_size;
4163 4145
4164 ql_dbg(ql_log_info, vha, 0xb03d, 4146 ql_dbg(ql_dbg_p3p, vha, 0xb03d,
4165 "Total minidump data_size 0x%x to be captured\n", total_data_size); 4147 "Total minidump data_size 0x%x to be captured\n", total_data_size);
4166 4148
4167 /* Check whether template obtained is valid */ 4149 /* Check whether template obtained is valid */
@@ -4284,7 +4266,7 @@ skip_nxt_entry:
4284 } 4266 }
4285 4267
4286 if (data_collected != total_data_size) { 4268 if (data_collected != total_data_size) {
4287 ql_dbg(ql_log_warn, vha, 0xb043, 4269 ql_dbg(ql_dbg_p3p, vha, 0xb043,
4288 "MiniDump data mismatch: Data collected: [0x%x]," 4270 "MiniDump data mismatch: Data collected: [0x%x],"
4289 "total_data_size:[0x%x]\n", 4271 "total_data_size:[0x%x]\n",
4290 data_collected, total_data_size); 4272 data_collected, total_data_size);
diff --git a/drivers/scsi/qla2xxx/qla_nx.h b/drivers/scsi/qla2xxx/qla_nx.h
index 57a226be339a..4ac50e274661 100644
--- a/drivers/scsi/qla2xxx/qla_nx.h
+++ b/drivers/scsi/qla2xxx/qla_nx.h
@@ -888,7 +888,8 @@ struct ct6_dsd {
888}; 888};
889 889
890#define MBC_TOGGLE_INTERRUPT 0x10 890#define MBC_TOGGLE_INTERRUPT 0x10
891#define MBC_SET_LED_CONFIG 0x125 891#define MBC_SET_LED_CONFIG 0x125 /* FCoE specific LED control */
892#define MBC_GET_LED_CONFIG 0x126 /* FCoE specific LED control */
892 893
893/* Flash offset */ 894/* Flash offset */
894#define FLT_REG_BOOTLOAD_82XX 0x72 895#define FLT_REG_BOOTLOAD_82XX 0x72
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
index 036030c95339..a2f999273a5f 100644
--- a/drivers/scsi/qla2xxx/qla_os.c
+++ b/drivers/scsi/qla2xxx/qla_os.c
@@ -304,7 +304,6 @@ static int qla2x00_mem_alloc(struct qla_hw_data *, uint16_t, uint16_t,
304 struct req_que **, struct rsp_que **); 304 struct req_que **, struct rsp_que **);
305static void qla2x00_free_fw_dump(struct qla_hw_data *); 305static void qla2x00_free_fw_dump(struct qla_hw_data *);
306static void qla2x00_mem_free(struct qla_hw_data *); 306static void qla2x00_mem_free(struct qla_hw_data *);
307static void qla2x00_sp_free_dma(srb_t *);
308 307
309/* -------------------------------------------------------------------------- */ 308/* -------------------------------------------------------------------------- */
310static int qla2x00_alloc_queues(struct qla_hw_data *ha) 309static int qla2x00_alloc_queues(struct qla_hw_data *ha)
@@ -559,28 +558,75 @@ qla24xx_fw_version_str(struct scsi_qla_host *vha, char *str)
559 return str; 558 return str;
560} 559}
561 560
562static inline srb_t * 561void
563qla2x00_get_new_sp(scsi_qla_host_t *vha, fc_port_t *fcport, 562qla2x00_sp_free_dma(void *vha, void *ptr)
564 struct scsi_cmnd *cmd)
565{ 563{
566 srb_t *sp; 564 srb_t *sp = (srb_t *)ptr;
567 struct qla_hw_data *ha = vha->hw; 565 struct scsi_cmnd *cmd = GET_CMD_SP(sp);
566 struct qla_hw_data *ha = sp->fcport->vha->hw;
567 void *ctx = GET_CMD_CTX_SP(sp);
568 568
569 sp = mempool_alloc(ha->srb_mempool, GFP_ATOMIC); 569 if (sp->flags & SRB_DMA_VALID) {
570 if (!sp) { 570 scsi_dma_unmap(cmd);
571 ql_log(ql_log_warn, vha, 0x3006, 571 sp->flags &= ~SRB_DMA_VALID;
572 "Memory allocation failed for sp.\n");
573 return sp;
574 } 572 }
575 573
576 atomic_set(&sp->ref_count, 1); 574 if (sp->flags & SRB_CRC_PROT_DMA_VALID) {
577 sp->fcport = fcport; 575 dma_unmap_sg(&ha->pdev->dev, scsi_prot_sglist(cmd),
578 sp->cmd = cmd; 576 scsi_prot_sg_count(cmd), cmd->sc_data_direction);
579 sp->flags = 0; 577 sp->flags &= ~SRB_CRC_PROT_DMA_VALID;
580 CMD_SP(cmd) = (void *)sp; 578 }
581 sp->ctx = NULL;
582 579
583 return sp; 580 if (sp->flags & SRB_CRC_CTX_DSD_VALID) {
581 /* List assured to be having elements */
582 qla2x00_clean_dsd_pool(ha, sp);
583 sp->flags &= ~SRB_CRC_CTX_DSD_VALID;
584 }
585
586 if (sp->flags & SRB_CRC_CTX_DMA_VALID) {
587 dma_pool_free(ha->dl_dma_pool, ctx,
588 ((struct crc_context *)ctx)->crc_ctx_dma);
589 sp->flags &= ~SRB_CRC_CTX_DMA_VALID;
590 }
591
592 if (sp->flags & SRB_FCP_CMND_DMA_VALID) {
593 struct ct6_dsd *ctx1 = (struct ct6_dsd *)ctx;
594
595 dma_pool_free(ha->fcp_cmnd_dma_pool, ctx1->fcp_cmnd,
596 ctx1->fcp_cmnd_dma);
597 list_splice(&ctx1->dsd_list, &ha->gbl_dsd_list);
598 ha->gbl_dsd_inuse -= ctx1->dsd_use_cnt;
599 ha->gbl_dsd_avail += ctx1->dsd_use_cnt;
600 mempool_free(ctx1, ha->ctx_mempool);
601 ctx1 = NULL;
602 }
603
604 CMD_SP(cmd) = NULL;
605 mempool_free(sp, ha->srb_mempool);
606}
607
608static void
609qla2x00_sp_compl(void *data, void *ptr, int res)
610{
611 struct qla_hw_data *ha = (struct qla_hw_data *)data;
612 srb_t *sp = (srb_t *)ptr;
613 struct scsi_cmnd *cmd = GET_CMD_SP(sp);
614
615 cmd->result = res;
616
617 if (atomic_read(&sp->ref_count) == 0) {
618 ql_dbg(ql_dbg_io, sp->fcport->vha, 0x3015,
619 "SP reference-count to ZERO -- sp=%p cmd=%p.\n",
620 sp, GET_CMD_SP(sp));
621 if (ql2xextended_error_logging & ql_dbg_io)
622 BUG();
623 return;
624 }
625 if (!atomic_dec_and_test(&sp->ref_count))
626 return;
627
628 qla2x00_sp_free_dma(ha, sp);
629 cmd->scsi_done(cmd);
584} 630}
585 631
586static int 632static int
@@ -644,10 +690,17 @@ qla2xxx_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd)
644 goto qc24_target_busy; 690 goto qc24_target_busy;
645 } 691 }
646 692
647 sp = qla2x00_get_new_sp(base_vha, fcport, cmd); 693 sp = qla2x00_get_sp(base_vha, fcport, GFP_ATOMIC);
648 if (!sp) 694 if (!sp)
649 goto qc24_host_busy; 695 goto qc24_host_busy;
650 696
697 sp->u.scmd.cmd = cmd;
698 sp->type = SRB_SCSI_CMD;
699 atomic_set(&sp->ref_count, 1);
700 CMD_SP(cmd) = (void *)sp;
701 sp->free = qla2x00_sp_free_dma;
702 sp->done = qla2x00_sp_compl;
703
651 rval = ha->isp_ops->start_scsi(sp); 704 rval = ha->isp_ops->start_scsi(sp);
652 if (rval != QLA_SUCCESS) { 705 if (rval != QLA_SUCCESS) {
653 ql_dbg(ql_dbg_io, vha, 0x3013, 706 ql_dbg(ql_dbg_io, vha, 0x3013,
@@ -658,8 +711,7 @@ qla2xxx_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd)
658 return 0; 711 return 0;
659 712
660qc24_host_busy_free_sp: 713qc24_host_busy_free_sp:
661 qla2x00_sp_free_dma(sp); 714 qla2x00_sp_free_dma(ha, sp);
662 mempool_free(sp, ha->srb_mempool);
663 715
664qc24_host_busy: 716qc24_host_busy:
665 return SCSI_MLQUEUE_HOST_BUSY; 717 return SCSI_MLQUEUE_HOST_BUSY;
@@ -893,7 +945,7 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd)
893 } 945 }
894 946
895 spin_lock_irqsave(&ha->hardware_lock, flags); 947 spin_lock_irqsave(&ha->hardware_lock, flags);
896 qla2x00_sp_compl(ha, sp); 948 sp->done(ha, sp, 0);
897 spin_unlock_irqrestore(&ha->hardware_lock, flags); 949 spin_unlock_irqrestore(&ha->hardware_lock, flags);
898 950
899 /* Did the command return during mailbox execution? */ 951 /* Did the command return during mailbox execution? */
@@ -925,6 +977,7 @@ qla2x00_eh_wait_for_pending_commands(scsi_qla_host_t *vha, unsigned int t,
925 struct qla_hw_data *ha = vha->hw; 977 struct qla_hw_data *ha = vha->hw;
926 struct req_que *req; 978 struct req_que *req;
927 srb_t *sp; 979 srb_t *sp;
980 struct scsi_cmnd *cmd;
928 981
929 status = QLA_SUCCESS; 982 status = QLA_SUCCESS;
930 983
@@ -935,28 +988,29 @@ qla2x00_eh_wait_for_pending_commands(scsi_qla_host_t *vha, unsigned int t,
935 sp = req->outstanding_cmds[cnt]; 988 sp = req->outstanding_cmds[cnt];
936 if (!sp) 989 if (!sp)
937 continue; 990 continue;
938 if ((sp->ctx) && !IS_PROT_IO(sp)) 991 if (sp->type != SRB_SCSI_CMD)
939 continue; 992 continue;
940 if (vha->vp_idx != sp->fcport->vha->vp_idx) 993 if (vha->vp_idx != sp->fcport->vha->vp_idx)
941 continue; 994 continue;
942 match = 0; 995 match = 0;
996 cmd = GET_CMD_SP(sp);
943 switch (type) { 997 switch (type) {
944 case WAIT_HOST: 998 case WAIT_HOST:
945 match = 1; 999 match = 1;
946 break; 1000 break;
947 case WAIT_TARGET: 1001 case WAIT_TARGET:
948 match = sp->cmd->device->id == t; 1002 match = cmd->device->id == t;
949 break; 1003 break;
950 case WAIT_LUN: 1004 case WAIT_LUN:
951 match = (sp->cmd->device->id == t && 1005 match = (cmd->device->id == t &&
952 sp->cmd->device->lun == l); 1006 cmd->device->lun == l);
953 break; 1007 break;
954 } 1008 }
955 if (!match) 1009 if (!match)
956 continue; 1010 continue;
957 1011
958 spin_unlock_irqrestore(&ha->hardware_lock, flags); 1012 spin_unlock_irqrestore(&ha->hardware_lock, flags);
959 status = qla2x00_eh_wait_on_command(sp->cmd); 1013 status = qla2x00_eh_wait_on_command(cmd);
960 spin_lock_irqsave(&ha->hardware_lock, flags); 1014 spin_lock_irqsave(&ha->hardware_lock, flags);
961 } 1015 }
962 spin_unlock_irqrestore(&ha->hardware_lock, flags); 1016 spin_unlock_irqrestore(&ha->hardware_lock, flags);
@@ -1219,7 +1273,7 @@ qla2x00_loop_reset(scsi_qla_host_t *vha)
1219 } 1273 }
1220 } 1274 }
1221 1275
1222 if (ha->flags.enable_lip_full_login && !IS_QLA8XXX_TYPE(ha)) { 1276 if (ha->flags.enable_lip_full_login && !IS_CNA_CAPABLE(ha)) {
1223 ret = qla2x00_full_login_lip(vha); 1277 ret = qla2x00_full_login_lip(vha);
1224 if (ret != QLA_SUCCESS) { 1278 if (ret != QLA_SUCCESS) {
1225 ql_dbg(ql_dbg_taskm, vha, 0x802d, 1279 ql_dbg(ql_dbg_taskm, vha, 0x802d,
@@ -1249,7 +1303,6 @@ qla2x00_abort_all_cmds(scsi_qla_host_t *vha, int res)
1249 int que, cnt; 1303 int que, cnt;
1250 unsigned long flags; 1304 unsigned long flags;
1251 srb_t *sp; 1305 srb_t *sp;
1252 struct srb_ctx *ctx;
1253 struct qla_hw_data *ha = vha->hw; 1306 struct qla_hw_data *ha = vha->hw;
1254 struct req_que *req; 1307 struct req_que *req;
1255 1308
@@ -1262,31 +1315,7 @@ qla2x00_abort_all_cmds(scsi_qla_host_t *vha, int res)
1262 sp = req->outstanding_cmds[cnt]; 1315 sp = req->outstanding_cmds[cnt];
1263 if (sp) { 1316 if (sp) {
1264 req->outstanding_cmds[cnt] = NULL; 1317 req->outstanding_cmds[cnt] = NULL;
1265 if (!sp->ctx || 1318 sp->done(vha, sp, res);
1266 (sp->flags & SRB_FCP_CMND_DMA_VALID) ||
1267 IS_PROT_IO(sp)) {
1268 sp->cmd->result = res;
1269 qla2x00_sp_compl(ha, sp);
1270 } else {
1271 ctx = sp->ctx;
1272 if (ctx->type == SRB_ELS_CMD_RPT ||
1273 ctx->type == SRB_ELS_CMD_HST ||
1274 ctx->type == SRB_CT_CMD) {
1275 struct fc_bsg_job *bsg_job =
1276 ctx->u.bsg_job;
1277 if (bsg_job->request->msgcode
1278 == FC_BSG_HST_CT)
1279 kfree(sp->fcport);
1280 bsg_job->req->errors = 0;
1281 bsg_job->reply->result = res;
1282 bsg_job->job_done(bsg_job);
1283 kfree(sp->ctx);
1284 mempool_free(sp,
1285 ha->srb_mempool);
1286 } else {
1287 ctx->u.iocb_cmd->free(sp);
1288 }
1289 }
1290 } 1319 }
1291 } 1320 }
1292 } 1321 }
@@ -1488,9 +1517,6 @@ qla2x00_iospace_config(struct qla_hw_data *ha)
1488 uint16_t msix; 1517 uint16_t msix;
1489 int cpus; 1518 int cpus;
1490 1519
1491 if (IS_QLA82XX(ha))
1492 return qla82xx_iospace_config(ha);
1493
1494 if (pci_request_selected_regions(ha->pdev, ha->bars, 1520 if (pci_request_selected_regions(ha->pdev, ha->bars,
1495 QLA2XXX_DRIVER_NAME)) { 1521 QLA2XXX_DRIVER_NAME)) {
1496 ql_log_pci(ql_log_fatal, ha->pdev, 0x0011, 1522 ql_log_pci(ql_log_fatal, ha->pdev, 0x0011,
@@ -1593,6 +1619,96 @@ iospace_error_exit:
1593} 1619}
1594 1620
1595 1621
1622static int
1623qla83xx_iospace_config(struct qla_hw_data *ha)
1624{
1625 uint16_t msix;
1626 int cpus;
1627
1628 if (pci_request_selected_regions(ha->pdev, ha->bars,
1629 QLA2XXX_DRIVER_NAME)) {
1630 ql_log_pci(ql_log_fatal, ha->pdev, 0x0117,
1631 "Failed to reserve PIO/MMIO regions (%s), aborting.\n",
1632 pci_name(ha->pdev));
1633
1634 goto iospace_error_exit;
1635 }
1636
1637 /* Use MMIO operations for all accesses. */
1638 if (!(pci_resource_flags(ha->pdev, 0) & IORESOURCE_MEM)) {
1639 ql_log_pci(ql_log_warn, ha->pdev, 0x0118,
1640 "Invalid pci I/O region size (%s).\n",
1641 pci_name(ha->pdev));
1642 goto iospace_error_exit;
1643 }
1644 if (pci_resource_len(ha->pdev, 0) < MIN_IOBASE_LEN) {
1645 ql_log_pci(ql_log_warn, ha->pdev, 0x0119,
1646 "Invalid PCI mem region size (%s), aborting\n",
1647 pci_name(ha->pdev));
1648 goto iospace_error_exit;
1649 }
1650
1651 ha->iobase = ioremap(pci_resource_start(ha->pdev, 0), MIN_IOBASE_LEN);
1652 if (!ha->iobase) {
1653 ql_log_pci(ql_log_fatal, ha->pdev, 0x011a,
1654 "Cannot remap MMIO (%s), aborting.\n",
1655 pci_name(ha->pdev));
1656 goto iospace_error_exit;
1657 }
1658
1659 /* 64bit PCI BAR - BAR2 will correspoond to region 4 */
1660 /* 83XX 26XX always use MQ type access for queues
1661 * - mbar 2, a.k.a region 4 */
1662 ha->max_req_queues = ha->max_rsp_queues = 1;
1663 ha->mqiobase = ioremap(pci_resource_start(ha->pdev, 4),
1664 pci_resource_len(ha->pdev, 4));
1665
1666 if (!ha->mqiobase) {
1667 ql_log_pci(ql_log_fatal, ha->pdev, 0x011d,
1668 "BAR2/region4 not enabled\n");
1669 goto mqiobase_exit;
1670 }
1671
1672 ha->msixbase = ioremap(pci_resource_start(ha->pdev, 2),
1673 pci_resource_len(ha->pdev, 2));
1674 if (ha->msixbase) {
1675 /* Read MSIX vector size of the board */
1676 pci_read_config_word(ha->pdev,
1677 QLA_83XX_PCI_MSIX_CONTROL, &msix);
1678 ha->msix_count = msix;
1679 /* Max queues are bounded by available msix vectors */
1680 /* queue 0 uses two msix vectors */
1681 if (ql2xmultique_tag) {
1682 cpus = num_online_cpus();
1683 ha->max_rsp_queues = (ha->msix_count - 1 > cpus) ?
1684 (cpus + 1) : (ha->msix_count - 1);
1685 ha->max_req_queues = 2;
1686 } else if (ql2xmaxqueues > 1) {
1687 ha->max_req_queues = ql2xmaxqueues > QLA_MQ_SIZE ?
1688 QLA_MQ_SIZE : ql2xmaxqueues;
1689 ql_dbg_pci(ql_dbg_multiq, ha->pdev, 0xc00c,
1690 "QoS mode set, max no of request queues:%d.\n",
1691 ha->max_req_queues);
1692 ql_dbg_pci(ql_dbg_init, ha->pdev, 0x011b,
1693 "QoS mode set, max no of request queues:%d.\n",
1694 ha->max_req_queues);
1695 }
1696 ql_log_pci(ql_log_info, ha->pdev, 0x011c,
1697 "MSI-X vector count: %d.\n", msix);
1698 } else
1699 ql_log_pci(ql_log_info, ha->pdev, 0x011e,
1700 "BAR 1 not enabled.\n");
1701
1702mqiobase_exit:
1703 ha->msix_count = ha->max_rsp_queues + 1;
1704 ql_dbg_pci(ql_dbg_init, ha->pdev, 0x011f,
1705 "MSIX Count:%d.\n", ha->msix_count);
1706 return 0;
1707
1708iospace_error_exit:
1709 return -ENOMEM;
1710}
1711
1596static struct isp_operations qla2100_isp_ops = { 1712static struct isp_operations qla2100_isp_ops = {
1597 .pci_config = qla2100_pci_config, 1713 .pci_config = qla2100_pci_config,
1598 .reset_chip = qla2x00_reset_chip, 1714 .reset_chip = qla2x00_reset_chip,
@@ -1769,7 +1885,7 @@ static struct isp_operations qla81xx_isp_ops = {
1769 .fw_dump = qla81xx_fw_dump, 1885 .fw_dump = qla81xx_fw_dump,
1770 .beacon_on = qla24xx_beacon_on, 1886 .beacon_on = qla24xx_beacon_on,
1771 .beacon_off = qla24xx_beacon_off, 1887 .beacon_off = qla24xx_beacon_off,
1772 .beacon_blink = qla24xx_beacon_blink, 1888 .beacon_blink = qla83xx_beacon_blink,
1773 .read_optrom = qla25xx_read_optrom_data, 1889 .read_optrom = qla25xx_read_optrom_data,
1774 .write_optrom = qla24xx_write_optrom_data, 1890 .write_optrom = qla24xx_write_optrom_data,
1775 .get_flash_version = qla24xx_get_flash_version, 1891 .get_flash_version = qla24xx_get_flash_version,
@@ -1815,6 +1931,43 @@ static struct isp_operations qla82xx_isp_ops = {
1815 .iospace_config = qla82xx_iospace_config, 1931 .iospace_config = qla82xx_iospace_config,
1816}; 1932};
1817 1933
1934static struct isp_operations qla83xx_isp_ops = {
1935 .pci_config = qla25xx_pci_config,
1936 .reset_chip = qla24xx_reset_chip,
1937 .chip_diag = qla24xx_chip_diag,
1938 .config_rings = qla24xx_config_rings,
1939 .reset_adapter = qla24xx_reset_adapter,
1940 .nvram_config = qla81xx_nvram_config,
1941 .update_fw_options = qla81xx_update_fw_options,
1942 .load_risc = qla81xx_load_risc,
1943 .pci_info_str = qla24xx_pci_info_str,
1944 .fw_version_str = qla24xx_fw_version_str,
1945 .intr_handler = qla24xx_intr_handler,
1946 .enable_intrs = qla24xx_enable_intrs,
1947 .disable_intrs = qla24xx_disable_intrs,
1948 .abort_command = qla24xx_abort_command,
1949 .target_reset = qla24xx_abort_target,
1950 .lun_reset = qla24xx_lun_reset,
1951 .fabric_login = qla24xx_login_fabric,
1952 .fabric_logout = qla24xx_fabric_logout,
1953 .calc_req_entries = NULL,
1954 .build_iocbs = NULL,
1955 .prep_ms_iocb = qla24xx_prep_ms_iocb,
1956 .prep_ms_fdmi_iocb = qla24xx_prep_ms_fdmi_iocb,
1957 .read_nvram = NULL,
1958 .write_nvram = NULL,
1959 .fw_dump = qla83xx_fw_dump,
1960 .beacon_on = qla24xx_beacon_on,
1961 .beacon_off = qla24xx_beacon_off,
1962 .beacon_blink = qla83xx_beacon_blink,
1963 .read_optrom = qla25xx_read_optrom_data,
1964 .write_optrom = qla24xx_write_optrom_data,
1965 .get_flash_version = qla24xx_get_flash_version,
1966 .start_scsi = qla24xx_dif_start_scsi,
1967 .abort_isp = qla2x00_abort_isp,
1968 .iospace_config = qla83xx_iospace_config,
1969};
1970
1818static inline void 1971static inline void
1819qla2x00_set_isp_flags(struct qla_hw_data *ha) 1972qla2x00_set_isp_flags(struct qla_hw_data *ha)
1820{ 1973{
@@ -1909,6 +2062,22 @@ qla2x00_set_isp_flags(struct qla_hw_data *ha)
1909 /* Initialize 82XX ISP flags */ 2062 /* Initialize 82XX ISP flags */
1910 qla82xx_init_flags(ha); 2063 qla82xx_init_flags(ha);
1911 break; 2064 break;
2065 case PCI_DEVICE_ID_QLOGIC_ISP2031:
2066 ha->device_type |= DT_ISP2031;
2067 ha->device_type |= DT_ZIO_SUPPORTED;
2068 ha->device_type |= DT_FWI2;
2069 ha->device_type |= DT_IIDMA;
2070 ha->device_type |= DT_T10_PI;
2071 ha->fw_srisc_address = RISC_START_ADDRESS_2400;
2072 break;
2073 case PCI_DEVICE_ID_QLOGIC_ISP8031:
2074 ha->device_type |= DT_ISP8031;
2075 ha->device_type |= DT_ZIO_SUPPORTED;
2076 ha->device_type |= DT_FWI2;
2077 ha->device_type |= DT_IIDMA;
2078 ha->device_type |= DT_T10_PI;
2079 ha->fw_srisc_address = RISC_START_ADDRESS_2400;
2080 break;
1912 } 2081 }
1913 2082
1914 if (IS_QLA82XX(ha)) 2083 if (IS_QLA82XX(ha))
@@ -1966,7 +2135,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
1966 char pci_info[30]; 2135 char pci_info[30];
1967 char fw_str[30]; 2136 char fw_str[30];
1968 struct scsi_host_template *sht; 2137 struct scsi_host_template *sht;
1969 int bars, max_id, mem_only = 0; 2138 int bars, mem_only = 0;
1970 uint16_t req_length = 0, rsp_length = 0; 2139 uint16_t req_length = 0, rsp_length = 0;
1971 struct req_que *req = NULL; 2140 struct req_que *req = NULL;
1972 struct rsp_que *rsp = NULL; 2141 struct rsp_que *rsp = NULL;
@@ -1980,7 +2149,9 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
1980 pdev->device == PCI_DEVICE_ID_QLOGIC_ISP5432 || 2149 pdev->device == PCI_DEVICE_ID_QLOGIC_ISP5432 ||
1981 pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2532 || 2150 pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2532 ||
1982 pdev->device == PCI_DEVICE_ID_QLOGIC_ISP8001 || 2151 pdev->device == PCI_DEVICE_ID_QLOGIC_ISP8001 ||
1983 pdev->device == PCI_DEVICE_ID_QLOGIC_ISP8021) { 2152 pdev->device == PCI_DEVICE_ID_QLOGIC_ISP8021 ||
2153 pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2031 ||
2154 pdev->device == PCI_DEVICE_ID_QLOGIC_ISP8031) {
1984 bars = pci_select_bars(pdev, IORESOURCE_MEM); 2155 bars = pci_select_bars(pdev, IORESOURCE_MEM);
1985 mem_only = 1; 2156 mem_only = 1;
1986 ql_dbg_pci(ql_dbg_init, pdev, 0x0007, 2157 ql_dbg_pci(ql_dbg_init, pdev, 0x0007,
@@ -2020,9 +2191,8 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
2020 qla2x00_set_isp_flags(ha); 2191 qla2x00_set_isp_flags(ha);
2021 2192
2022 /* Set EEH reset type to fundamental if required by hba */ 2193 /* Set EEH reset type to fundamental if required by hba */
2023 if ( IS_QLA24XX(ha) || IS_QLA25XX(ha) || IS_QLA81XX(ha)) { 2194 if (IS_QLA24XX(ha) || IS_QLA25XX(ha) || IS_QLA81XX(ha))
2024 pdev->needs_freset = 1; 2195 pdev->needs_freset = 1;
2025 }
2026 2196
2027 ha->prev_topology = 0; 2197 ha->prev_topology = 0;
2028 ha->init_cb_size = sizeof(init_cb_t); 2198 ha->init_cb_size = sizeof(init_cb_t);
@@ -2030,9 +2200,8 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
2030 ha->optrom_size = OPTROM_SIZE_2300; 2200 ha->optrom_size = OPTROM_SIZE_2300;
2031 2201
2032 /* Assign ISP specific operations. */ 2202 /* Assign ISP specific operations. */
2033 max_id = MAX_TARGETS_2200;
2034 if (IS_QLA2100(ha)) { 2203 if (IS_QLA2100(ha)) {
2035 max_id = MAX_TARGETS_2100; 2204 ha->max_fibre_devices = MAX_FIBRE_DEVICES_2100;
2036 ha->mbx_count = MAILBOX_REGISTER_COUNT_2100; 2205 ha->mbx_count = MAILBOX_REGISTER_COUNT_2100;
2037 req_length = REQUEST_ENTRY_CNT_2100; 2206 req_length = REQUEST_ENTRY_CNT_2100;
2038 rsp_length = RESPONSE_ENTRY_CNT_2100; 2207 rsp_length = RESPONSE_ENTRY_CNT_2100;
@@ -2044,6 +2213,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
2044 ha->nvram_data_off = ~0; 2213 ha->nvram_data_off = ~0;
2045 ha->isp_ops = &qla2100_isp_ops; 2214 ha->isp_ops = &qla2100_isp_ops;
2046 } else if (IS_QLA2200(ha)) { 2215 } else if (IS_QLA2200(ha)) {
2216 ha->max_fibre_devices = MAX_FIBRE_DEVICES_2100;
2047 ha->mbx_count = MAILBOX_REGISTER_COUNT_2200; 2217 ha->mbx_count = MAILBOX_REGISTER_COUNT_2200;
2048 req_length = REQUEST_ENTRY_CNT_2200; 2218 req_length = REQUEST_ENTRY_CNT_2200;
2049 rsp_length = RESPONSE_ENTRY_CNT_2100; 2219 rsp_length = RESPONSE_ENTRY_CNT_2100;
@@ -2055,6 +2225,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
2055 ha->nvram_data_off = ~0; 2225 ha->nvram_data_off = ~0;
2056 ha->isp_ops = &qla2100_isp_ops; 2226 ha->isp_ops = &qla2100_isp_ops;
2057 } else if (IS_QLA23XX(ha)) { 2227 } else if (IS_QLA23XX(ha)) {
2228 ha->max_fibre_devices = MAX_FIBRE_DEVICES_2100;
2058 ha->mbx_count = MAILBOX_REGISTER_COUNT; 2229 ha->mbx_count = MAILBOX_REGISTER_COUNT;
2059 req_length = REQUEST_ENTRY_CNT_2200; 2230 req_length = REQUEST_ENTRY_CNT_2200;
2060 rsp_length = RESPONSE_ENTRY_CNT_2300; 2231 rsp_length = RESPONSE_ENTRY_CNT_2300;
@@ -2068,6 +2239,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
2068 ha->nvram_data_off = ~0; 2239 ha->nvram_data_off = ~0;
2069 ha->isp_ops = &qla2300_isp_ops; 2240 ha->isp_ops = &qla2300_isp_ops;
2070 } else if (IS_QLA24XX_TYPE(ha)) { 2241 } else if (IS_QLA24XX_TYPE(ha)) {
2242 ha->max_fibre_devices = MAX_FIBRE_DEVICES_2400;
2071 ha->mbx_count = MAILBOX_REGISTER_COUNT; 2243 ha->mbx_count = MAILBOX_REGISTER_COUNT;
2072 req_length = REQUEST_ENTRY_CNT_24XX; 2244 req_length = REQUEST_ENTRY_CNT_24XX;
2073 rsp_length = RESPONSE_ENTRY_CNT_2300; 2245 rsp_length = RESPONSE_ENTRY_CNT_2300;
@@ -2082,6 +2254,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
2082 ha->nvram_conf_off = FARX_ACCESS_NVRAM_CONF; 2254 ha->nvram_conf_off = FARX_ACCESS_NVRAM_CONF;
2083 ha->nvram_data_off = FARX_ACCESS_NVRAM_DATA; 2255 ha->nvram_data_off = FARX_ACCESS_NVRAM_DATA;
2084 } else if (IS_QLA25XX(ha)) { 2256 } else if (IS_QLA25XX(ha)) {
2257 ha->max_fibre_devices = MAX_FIBRE_DEVICES_2400;
2085 ha->mbx_count = MAILBOX_REGISTER_COUNT; 2258 ha->mbx_count = MAILBOX_REGISTER_COUNT;
2086 req_length = REQUEST_ENTRY_CNT_24XX; 2259 req_length = REQUEST_ENTRY_CNT_24XX;
2087 rsp_length = RESPONSE_ENTRY_CNT_2300; 2260 rsp_length = RESPONSE_ENTRY_CNT_2300;
@@ -2096,6 +2269,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
2096 ha->nvram_conf_off = FARX_ACCESS_NVRAM_CONF; 2269 ha->nvram_conf_off = FARX_ACCESS_NVRAM_CONF;
2097 ha->nvram_data_off = FARX_ACCESS_NVRAM_DATA; 2270 ha->nvram_data_off = FARX_ACCESS_NVRAM_DATA;
2098 } else if (IS_QLA81XX(ha)) { 2271 } else if (IS_QLA81XX(ha)) {
2272 ha->max_fibre_devices = MAX_FIBRE_DEVICES_2400;
2099 ha->mbx_count = MAILBOX_REGISTER_COUNT; 2273 ha->mbx_count = MAILBOX_REGISTER_COUNT;
2100 req_length = REQUEST_ENTRY_CNT_24XX; 2274 req_length = REQUEST_ENTRY_CNT_24XX;
2101 rsp_length = RESPONSE_ENTRY_CNT_2300; 2275 rsp_length = RESPONSE_ENTRY_CNT_2300;
@@ -2110,6 +2284,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
2110 ha->nvram_conf_off = ~0; 2284 ha->nvram_conf_off = ~0;
2111 ha->nvram_data_off = ~0; 2285 ha->nvram_data_off = ~0;
2112 } else if (IS_QLA82XX(ha)) { 2286 } else if (IS_QLA82XX(ha)) {
2287 ha->max_fibre_devices = MAX_FIBRE_DEVICES_2400;
2113 ha->mbx_count = MAILBOX_REGISTER_COUNT; 2288 ha->mbx_count = MAILBOX_REGISTER_COUNT;
2114 req_length = REQUEST_ENTRY_CNT_82XX; 2289 req_length = REQUEST_ENTRY_CNT_82XX;
2115 rsp_length = RESPONSE_ENTRY_CNT_82XX; 2290 rsp_length = RESPONSE_ENTRY_CNT_82XX;
@@ -2123,14 +2298,31 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
2123 ha->flash_data_off = FARX_ACCESS_FLASH_DATA; 2298 ha->flash_data_off = FARX_ACCESS_FLASH_DATA;
2124 ha->nvram_conf_off = FARX_ACCESS_NVRAM_CONF; 2299 ha->nvram_conf_off = FARX_ACCESS_NVRAM_CONF;
2125 ha->nvram_data_off = FARX_ACCESS_NVRAM_DATA; 2300 ha->nvram_data_off = FARX_ACCESS_NVRAM_DATA;
2301 } else if (IS_QLA83XX(ha)) {
2302 ha->max_fibre_devices = MAX_FIBRE_DEVICES_2400;
2303 ha->mbx_count = MAILBOX_REGISTER_COUNT;
2304 req_length = REQUEST_ENTRY_CNT_24XX;
2305 rsp_length = RESPONSE_ENTRY_CNT_2300;
2306 ha->max_loop_id = SNS_LAST_LOOP_ID_2300;
2307 ha->init_cb_size = sizeof(struct mid_init_cb_81xx);
2308 ha->gid_list_info_size = 8;
2309 ha->optrom_size = OPTROM_SIZE_83XX;
2310 ha->nvram_npiv_size = QLA_MAX_VPORTS_QLA25XX;
2311 ha->isp_ops = &qla83xx_isp_ops;
2312 ha->flash_conf_off = FARX_ACCESS_FLASH_CONF_81XX;
2313 ha->flash_data_off = FARX_ACCESS_FLASH_DATA_81XX;
2314 ha->nvram_conf_off = ~0;
2315 ha->nvram_data_off = ~0;
2126 } 2316 }
2317
2127 ql_dbg_pci(ql_dbg_init, pdev, 0x001e, 2318 ql_dbg_pci(ql_dbg_init, pdev, 0x001e,
2128 "mbx_count=%d, req_length=%d, " 2319 "mbx_count=%d, req_length=%d, "
2129 "rsp_length=%d, max_loop_id=%d, init_cb_size=%d, " 2320 "rsp_length=%d, max_loop_id=%d, init_cb_size=%d, "
2130 "gid_list_info_size=%d, optrom_size=%d, nvram_npiv_size=%d, .\n", 2321 "gid_list_info_size=%d, optrom_size=%d, nvram_npiv_size=%d, "
2322 "max_fibre_devices=%d.\n",
2131 ha->mbx_count, req_length, rsp_length, ha->max_loop_id, 2323 ha->mbx_count, req_length, rsp_length, ha->max_loop_id,
2132 ha->init_cb_size, ha->gid_list_info_size, ha->optrom_size, 2324 ha->init_cb_size, ha->gid_list_info_size, ha->optrom_size,
2133 ha->nvram_npiv_size); 2325 ha->nvram_npiv_size, ha->max_fibre_devices);
2134 ql_dbg_pci(ql_dbg_init, pdev, 0x001f, 2326 ql_dbg_pci(ql_dbg_init, pdev, 0x001f,
2135 "isp_ops=%p, flash_conf_off=%d, " 2327 "isp_ops=%p, flash_conf_off=%d, "
2136 "flash_data_off=%d, nvram_conf_off=%d, nvram_data_off=%d.\n", 2328 "flash_data_off=%d, nvram_conf_off=%d, nvram_data_off=%d.\n",
@@ -2204,7 +2396,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
2204 "mgmt_svr_loop_id=%d, sg_tablesize=%d.\n", 2396 "mgmt_svr_loop_id=%d, sg_tablesize=%d.\n",
2205 host->can_queue, base_vha->req, 2397 host->can_queue, base_vha->req,
2206 base_vha->mgmt_svr_loop_id, host->sg_tablesize); 2398 base_vha->mgmt_svr_loop_id, host->sg_tablesize);
2207 host->max_id = max_id; 2399 host->max_id = ha->max_fibre_devices;
2208 host->this_id = 255; 2400 host->this_id = 255;
2209 host->cmd_per_lun = 3; 2401 host->cmd_per_lun = 3;
2210 host->unique_id = host->host_no; 2402 host->unique_id = host->host_no;
@@ -2251,7 +2443,7 @@ que_init:
2251 req->req_q_out = &ha->iobase->isp24.req_q_out; 2443 req->req_q_out = &ha->iobase->isp24.req_q_out;
2252 rsp->rsp_q_in = &ha->iobase->isp24.rsp_q_in; 2444 rsp->rsp_q_in = &ha->iobase->isp24.rsp_q_in;
2253 rsp->rsp_q_out = &ha->iobase->isp24.rsp_q_out; 2445 rsp->rsp_q_out = &ha->iobase->isp24.rsp_q_out;
2254 if (ha->mqenable) { 2446 if (ha->mqenable || IS_QLA83XX(ha)) {
2255 req->req_q_in = &ha->mqiobase->isp25mq.req_q_in; 2447 req->req_q_in = &ha->mqiobase->isp25mq.req_q_in;
2256 req->req_q_out = &ha->mqiobase->isp25mq.req_q_out; 2448 req->req_q_out = &ha->mqiobase->isp25mq.req_q_out;
2257 rsp->rsp_q_in = &ha->mqiobase->isp25mq.rsp_q_in; 2449 rsp->rsp_q_in = &ha->mqiobase->isp25mq.rsp_q_in;
@@ -2552,6 +2744,9 @@ qla2x00_remove_one(struct pci_dev *pdev)
2552 2744
2553 if (ha->mqiobase) 2745 if (ha->mqiobase)
2554 iounmap(ha->mqiobase); 2746 iounmap(ha->mqiobase);
2747
2748 if (IS_QLA83XX(ha) && ha->msixbase)
2749 iounmap(ha->msixbase);
2555 } 2750 }
2556 2751
2557 pci_release_selected_regions(ha->pdev, ha->bars); 2752 pci_release_selected_regions(ha->pdev, ha->bars);
@@ -2751,8 +2946,8 @@ qla2x00_mem_alloc(struct qla_hw_data *ha, uint16_t req_len, uint16_t rsp_len,
2751 if (!ha->init_cb) 2946 if (!ha->init_cb)
2752 goto fail; 2947 goto fail;
2753 2948
2754 ha->gid_list = dma_alloc_coherent(&ha->pdev->dev, GID_LIST_SIZE, 2949 ha->gid_list = dma_alloc_coherent(&ha->pdev->dev,
2755 &ha->gid_list_dma, GFP_KERNEL); 2950 qla2x00_gid_list_size(ha), &ha->gid_list_dma, GFP_KERNEL);
2756 if (!ha->gid_list) 2951 if (!ha->gid_list)
2757 goto fail_free_init_cb; 2952 goto fail_free_init_cb;
2758 2953
@@ -2893,7 +3088,7 @@ qla2x00_mem_alloc(struct qla_hw_data *ha, uint16_t req_len, uint16_t rsp_len,
2893 ha->npiv_info = NULL; 3088 ha->npiv_info = NULL;
2894 3089
2895 /* Get consistent memory allocated for EX-INIT-CB. */ 3090 /* Get consistent memory allocated for EX-INIT-CB. */
2896 if (IS_QLA8XXX_TYPE(ha)) { 3091 if (IS_CNA_CAPABLE(ha) || IS_QLA2031(ha)) {
2897 ha->ex_init_cb = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, 3092 ha->ex_init_cb = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL,
2898 &ha->ex_init_cb_dma); 3093 &ha->ex_init_cb_dma);
2899 if (!ha->ex_init_cb) 3094 if (!ha->ex_init_cb)
@@ -2967,7 +3162,8 @@ fail_free_srb_mempool:
2967 mempool_destroy(ha->srb_mempool); 3162 mempool_destroy(ha->srb_mempool);
2968 ha->srb_mempool = NULL; 3163 ha->srb_mempool = NULL;
2969fail_free_gid_list: 3164fail_free_gid_list:
2970 dma_free_coherent(&ha->pdev->dev, GID_LIST_SIZE, ha->gid_list, 3165 dma_free_coherent(&ha->pdev->dev, qla2x00_gid_list_size(ha),
3166 ha->gid_list,
2971 ha->gid_list_dma); 3167 ha->gid_list_dma);
2972 ha->gid_list = NULL; 3168 ha->gid_list = NULL;
2973 ha->gid_list_dma = 0; 3169 ha->gid_list_dma = 0;
@@ -3045,9 +3241,6 @@ qla2x00_mem_free(struct qla_hw_data *ha)
3045 if (ha->sfp_data) 3241 if (ha->sfp_data)
3046 dma_pool_free(ha->s_dma_pool, ha->sfp_data, ha->sfp_data_dma); 3242 dma_pool_free(ha->s_dma_pool, ha->sfp_data, ha->sfp_data_dma);
3047 3243
3048 if (ha->edc_data)
3049 dma_pool_free(ha->s_dma_pool, ha->edc_data, ha->edc_data_dma);
3050
3051 if (ha->ms_iocb) 3244 if (ha->ms_iocb)
3052 dma_pool_free(ha->s_dma_pool, ha->ms_iocb, ha->ms_iocb_dma); 3245 dma_pool_free(ha->s_dma_pool, ha->ms_iocb, ha->ms_iocb_dma);
3053 3246
@@ -3062,8 +3255,8 @@ qla2x00_mem_free(struct qla_hw_data *ha)
3062 dma_pool_destroy(ha->s_dma_pool); 3255 dma_pool_destroy(ha->s_dma_pool);
3063 3256
3064 if (ha->gid_list) 3257 if (ha->gid_list)
3065 dma_free_coherent(&ha->pdev->dev, GID_LIST_SIZE, ha->gid_list, 3258 dma_free_coherent(&ha->pdev->dev, qla2x00_gid_list_size(ha),
3066 ha->gid_list_dma); 3259 ha->gid_list, ha->gid_list_dma);
3067 3260
3068 if (IS_QLA82XX(ha)) { 3261 if (IS_QLA82XX(ha)) {
3069 if (!list_empty(&ha->gbl_dsd_list)) { 3262 if (!list_empty(&ha->gbl_dsd_list)) {
@@ -3095,6 +3288,7 @@ qla2x00_mem_free(struct qla_hw_data *ha)
3095 vfree(ha->optrom_buffer); 3288 vfree(ha->optrom_buffer);
3096 kfree(ha->nvram); 3289 kfree(ha->nvram);
3097 kfree(ha->npiv_info); 3290 kfree(ha->npiv_info);
3291 kfree(ha->swl);
3098 3292
3099 ha->srb_mempool = NULL; 3293 ha->srb_mempool = NULL;
3100 ha->ctx_mempool = NULL; 3294 ha->ctx_mempool = NULL;
@@ -3661,75 +3855,6 @@ qla2x00_rst_aen(scsi_qla_host_t *vha)
3661 } 3855 }
3662} 3856}
3663 3857
3664static void
3665qla2x00_sp_free_dma(srb_t *sp)
3666{
3667 struct scsi_cmnd *cmd = sp->cmd;
3668 struct qla_hw_data *ha = sp->fcport->vha->hw;
3669
3670 if (sp->flags & SRB_DMA_VALID) {
3671 scsi_dma_unmap(cmd);
3672 sp->flags &= ~SRB_DMA_VALID;
3673 }
3674
3675 if (sp->flags & SRB_CRC_PROT_DMA_VALID) {
3676 dma_unmap_sg(&ha->pdev->dev, scsi_prot_sglist(cmd),
3677 scsi_prot_sg_count(cmd), cmd->sc_data_direction);
3678 sp->flags &= ~SRB_CRC_PROT_DMA_VALID;
3679 }
3680
3681 if (sp->flags & SRB_CRC_CTX_DSD_VALID) {
3682 /* List assured to be having elements */
3683 qla2x00_clean_dsd_pool(ha, sp);
3684 sp->flags &= ~SRB_CRC_CTX_DSD_VALID;
3685 }
3686
3687 if (sp->flags & SRB_CRC_CTX_DMA_VALID) {
3688 dma_pool_free(ha->dl_dma_pool, sp->ctx,
3689 ((struct crc_context *)sp->ctx)->crc_ctx_dma);
3690 sp->flags &= ~SRB_CRC_CTX_DMA_VALID;
3691 }
3692
3693 if (sp->flags & SRB_FCP_CMND_DMA_VALID) {
3694 struct ct6_dsd *ctx = sp->ctx;
3695 dma_pool_free(ha->fcp_cmnd_dma_pool, ctx->fcp_cmnd,
3696 ctx->fcp_cmnd_dma);
3697 list_splice(&ctx->dsd_list, &ha->gbl_dsd_list);
3698 ha->gbl_dsd_inuse -= ctx->dsd_use_cnt;
3699 ha->gbl_dsd_avail += ctx->dsd_use_cnt;
3700 mempool_free(sp->ctx, ha->ctx_mempool);
3701 sp->ctx = NULL;
3702 }
3703
3704 CMD_SP(cmd) = NULL;
3705}
3706
3707static void
3708qla2x00_sp_final_compl(struct qla_hw_data *ha, srb_t *sp)
3709{
3710 struct scsi_cmnd *cmd = sp->cmd;
3711
3712 qla2x00_sp_free_dma(sp);
3713 mempool_free(sp, ha->srb_mempool);
3714 cmd->scsi_done(cmd);
3715}
3716
3717void
3718qla2x00_sp_compl(struct qla_hw_data *ha, srb_t *sp)
3719{
3720 if (atomic_read(&sp->ref_count) == 0) {
3721 ql_dbg(ql_dbg_io, sp->fcport->vha, 0x3015,
3722 "SP reference-count to ZERO -- sp=%p cmd=%p.\n",
3723 sp, sp->cmd);
3724 if (ql2xextended_error_logging & ql_dbg_io)
3725 BUG();
3726 return;
3727 }
3728 if (!atomic_dec_and_test(&sp->ref_count))
3729 return;
3730 qla2x00_sp_final_compl(ha, sp);
3731}
3732
3733/************************************************************************** 3858/**************************************************************************
3734* qla2x00_timer 3859* qla2x00_timer
3735* 3860*
@@ -3800,7 +3925,7 @@ qla2x00_timer(scsi_qla_host_t *vha)
3800 sp = req->outstanding_cmds[index]; 3925 sp = req->outstanding_cmds[index];
3801 if (!sp) 3926 if (!sp)
3802 continue; 3927 continue;
3803 if (sp->ctx && !IS_PROT_IO(sp)) 3928 if (sp->type != SRB_SCSI_CMD)
3804 continue; 3929 continue;
3805 sfcp = sp->fcport; 3930 sfcp = sp->fcport;
3806 if (!(sfcp->flags & FCF_FCP2_DEVICE)) 3931 if (!(sfcp->flags & FCF_FCP2_DEVICE))
@@ -3889,7 +4014,7 @@ qla2x00_timer(scsi_qla_host_t *vha)
3889 4014
3890/* Firmware interface routines. */ 4015/* Firmware interface routines. */
3891 4016
3892#define FW_BLOBS 8 4017#define FW_BLOBS 10
3893#define FW_ISP21XX 0 4018#define FW_ISP21XX 0
3894#define FW_ISP22XX 1 4019#define FW_ISP22XX 1
3895#define FW_ISP2300 2 4020#define FW_ISP2300 2
@@ -3898,6 +4023,8 @@ qla2x00_timer(scsi_qla_host_t *vha)
3898#define FW_ISP25XX 5 4023#define FW_ISP25XX 5
3899#define FW_ISP81XX 6 4024#define FW_ISP81XX 6
3900#define FW_ISP82XX 7 4025#define FW_ISP82XX 7
4026#define FW_ISP2031 8
4027#define FW_ISP8031 9
3901 4028
3902#define FW_FILE_ISP21XX "ql2100_fw.bin" 4029#define FW_FILE_ISP21XX "ql2100_fw.bin"
3903#define FW_FILE_ISP22XX "ql2200_fw.bin" 4030#define FW_FILE_ISP22XX "ql2200_fw.bin"
@@ -3907,6 +4034,8 @@ qla2x00_timer(scsi_qla_host_t *vha)
3907#define FW_FILE_ISP25XX "ql2500_fw.bin" 4034#define FW_FILE_ISP25XX "ql2500_fw.bin"
3908#define FW_FILE_ISP81XX "ql8100_fw.bin" 4035#define FW_FILE_ISP81XX "ql8100_fw.bin"
3909#define FW_FILE_ISP82XX "ql8200_fw.bin" 4036#define FW_FILE_ISP82XX "ql8200_fw.bin"
4037#define FW_FILE_ISP2031 "ql2600_fw.bin"
4038#define FW_FILE_ISP8031 "ql8300_fw.bin"
3910 4039
3911static DEFINE_MUTEX(qla_fw_lock); 4040static DEFINE_MUTEX(qla_fw_lock);
3912 4041
@@ -3919,6 +4048,8 @@ static struct fw_blob qla_fw_blobs[FW_BLOBS] = {
3919 { .name = FW_FILE_ISP25XX, }, 4048 { .name = FW_FILE_ISP25XX, },
3920 { .name = FW_FILE_ISP81XX, }, 4049 { .name = FW_FILE_ISP81XX, },
3921 { .name = FW_FILE_ISP82XX, }, 4050 { .name = FW_FILE_ISP82XX, },
4051 { .name = FW_FILE_ISP2031, },
4052 { .name = FW_FILE_ISP8031, },
3922}; 4053};
3923 4054
3924struct fw_blob * 4055struct fw_blob *
@@ -3927,7 +4058,6 @@ qla2x00_request_firmware(scsi_qla_host_t *vha)
3927 struct qla_hw_data *ha = vha->hw; 4058 struct qla_hw_data *ha = vha->hw;
3928 struct fw_blob *blob; 4059 struct fw_blob *blob;
3929 4060
3930 blob = NULL;
3931 if (IS_QLA2100(ha)) { 4061 if (IS_QLA2100(ha)) {
3932 blob = &qla_fw_blobs[FW_ISP21XX]; 4062 blob = &qla_fw_blobs[FW_ISP21XX];
3933 } else if (IS_QLA2200(ha)) { 4063 } else if (IS_QLA2200(ha)) {
@@ -3944,6 +4074,12 @@ qla2x00_request_firmware(scsi_qla_host_t *vha)
3944 blob = &qla_fw_blobs[FW_ISP81XX]; 4074 blob = &qla_fw_blobs[FW_ISP81XX];
3945 } else if (IS_QLA82XX(ha)) { 4075 } else if (IS_QLA82XX(ha)) {
3946 blob = &qla_fw_blobs[FW_ISP82XX]; 4076 blob = &qla_fw_blobs[FW_ISP82XX];
4077 } else if (IS_QLA2031(ha)) {
4078 blob = &qla_fw_blobs[FW_ISP2031];
4079 } else if (IS_QLA8031(ha)) {
4080 blob = &qla_fw_blobs[FW_ISP8031];
4081 } else {
4082 return NULL;
3947 } 4083 }
3948 4084
3949 mutex_lock(&qla_fw_lock); 4085 mutex_lock(&qla_fw_lock);
@@ -4265,6 +4401,7 @@ static struct pci_device_id qla2xxx_pci_tbl[] = {
4265 { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP5422) }, 4401 { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP5422) },
4266 { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP5432) }, 4402 { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP5432) },
4267 { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2532) }, 4403 { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2532) },
4404 { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2031) },
4268 { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP8001) }, 4405 { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP8001) },
4269 { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP8021) }, 4406 { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP8021) },
4270 { 0 }, 4407 { 0 },
diff --git a/drivers/scsi/qla2xxx/qla_sup.c b/drivers/scsi/qla2xxx/qla_sup.c
index 16bc72844a97..3c13c0a6be63 100644
--- a/drivers/scsi/qla2xxx/qla_sup.c
+++ b/drivers/scsi/qla2xxx/qla_sup.c
@@ -568,6 +568,9 @@ qla2xxx_find_flt_start(scsi_qla_host_t *vha, uint32_t *start)
568 else if (IS_QLA82XX(ha)) { 568 else if (IS_QLA82XX(ha)) {
569 *start = FA_FLASH_LAYOUT_ADDR_82; 569 *start = FA_FLASH_LAYOUT_ADDR_82;
570 goto end; 570 goto end;
571 } else if (IS_QLA83XX(ha)) {
572 *start = FA_FLASH_LAYOUT_ADDR_83;
573 goto end;
571 } 574 }
572 /* Begin with first PCI expansion ROM header. */ 575 /* Begin with first PCI expansion ROM header. */
573 buf = (uint8_t *)req->ring; 576 buf = (uint8_t *)req->ring;
@@ -721,13 +724,22 @@ qla2xxx_get_flt_info(scsi_qla_host_t *vha, uint32_t flt_addr)
721 le32_to_cpu(region->size)); 724 le32_to_cpu(region->size));
722 725
723 switch (le32_to_cpu(region->code) & 0xff) { 726 switch (le32_to_cpu(region->code) & 0xff) {
727 case FLT_REG_FCOE_FW:
728 if (!IS_QLA8031(ha))
729 break;
730 ha->flt_region_fw = start;
731 break;
724 case FLT_REG_FW: 732 case FLT_REG_FW:
733 if (IS_QLA8031(ha))
734 break;
725 ha->flt_region_fw = start; 735 ha->flt_region_fw = start;
726 break; 736 break;
727 case FLT_REG_BOOT_CODE: 737 case FLT_REG_BOOT_CODE:
728 ha->flt_region_boot = start; 738 ha->flt_region_boot = start;
729 break; 739 break;
730 case FLT_REG_VPD_0: 740 case FLT_REG_VPD_0:
741 if (IS_QLA8031(ha))
742 break;
731 ha->flt_region_vpd_nvram = start; 743 ha->flt_region_vpd_nvram = start;
732 if (IS_QLA82XX(ha)) 744 if (IS_QLA82XX(ha))
733 break; 745 break;
@@ -735,16 +747,20 @@ qla2xxx_get_flt_info(scsi_qla_host_t *vha, uint32_t flt_addr)
735 ha->flt_region_vpd = start; 747 ha->flt_region_vpd = start;
736 break; 748 break;
737 case FLT_REG_VPD_1: 749 case FLT_REG_VPD_1:
738 if (IS_QLA82XX(ha)) 750 if (IS_QLA82XX(ha) || IS_QLA8031(ha))
739 break; 751 break;
740 if (!ha->flags.port0) 752 if (!ha->flags.port0)
741 ha->flt_region_vpd = start; 753 ha->flt_region_vpd = start;
742 break; 754 break;
743 case FLT_REG_NVRAM_0: 755 case FLT_REG_NVRAM_0:
756 if (IS_QLA8031(ha))
757 break;
744 if (ha->flags.port0) 758 if (ha->flags.port0)
745 ha->flt_region_nvram = start; 759 ha->flt_region_nvram = start;
746 break; 760 break;
747 case FLT_REG_NVRAM_1: 761 case FLT_REG_NVRAM_1:
762 if (IS_QLA8031(ha))
763 break;
748 if (!ha->flags.port0) 764 if (!ha->flags.port0)
749 ha->flt_region_nvram = start; 765 ha->flt_region_nvram = start;
750 break; 766 break;
@@ -785,6 +801,31 @@ qla2xxx_get_flt_info(scsi_qla_host_t *vha, uint32_t flt_addr)
785 case FLT_REG_VPD_82XX: 801 case FLT_REG_VPD_82XX:
786 ha->flt_region_vpd = start; 802 ha->flt_region_vpd = start;
787 break; 803 break;
804 case FLT_REG_FCOE_VPD_0:
805 if (!IS_QLA8031(ha))
806 break;
807 ha->flt_region_vpd_nvram = start;
808 if (ha->flags.port0)
809 ha->flt_region_vpd = start;
810 break;
811 case FLT_REG_FCOE_VPD_1:
812 if (!IS_QLA8031(ha))
813 break;
814 if (!ha->flags.port0)
815 ha->flt_region_vpd = start;
816 break;
817 case FLT_REG_FCOE_NVRAM_0:
818 if (!IS_QLA8031(ha))
819 break;
820 if (ha->flags.port0)
821 ha->flt_region_nvram = start;
822 break;
823 case FLT_REG_FCOE_NVRAM_1:
824 if (!IS_QLA8031(ha))
825 break;
826 if (!ha->flags.port0)
827 ha->flt_region_nvram = start;
828 break;
788 } 829 }
789 } 830 }
790 goto done; 831 goto done;
@@ -804,15 +845,12 @@ no_flash_data:
804 def_npiv_conf0[def] : def_npiv_conf1[def]; 845 def_npiv_conf0[def] : def_npiv_conf1[def];
805done: 846done:
806 ql_dbg(ql_dbg_init, vha, 0x004a, 847 ql_dbg(ql_dbg_init, vha, 0x004a,
807 "FLT[%s]: boot=0x%x fw=0x%x vpd_nvram=0x%x vpd=0x%x.\n", 848 "FLT[%s]: boot=0x%x fw=0x%x vpd_nvram=0x%x vpd=0x%x nvram=0x%x "
808 loc, ha->flt_region_boot, 849 "fdt=0x%x flt=0x%x npiv=0x%x fcp_prif_cfg=0x%x.\n",
809 ha->flt_region_fw, ha->flt_region_vpd_nvram, 850 loc, ha->flt_region_boot, ha->flt_region_fw,
810 ha->flt_region_vpd); 851 ha->flt_region_vpd_nvram, ha->flt_region_vpd, ha->flt_region_nvram,
811 ql_dbg(ql_dbg_init, vha, 0x004b, 852 ha->flt_region_fdt, ha->flt_region_flt, ha->flt_region_npiv_conf,
812 "nvram=0x%x fdt=0x%x flt=0x%x npiv=0x%x fcp_prif_cfg=0x%x.\n", 853 ha->flt_region_fcp_prio);
813 ha->flt_region_nvram,
814 ha->flt_region_fdt, ha->flt_region_flt,
815 ha->flt_region_npiv_conf, ha->flt_region_fcp_prio);
816} 854}
817 855
818static void 856static void
@@ -948,7 +986,8 @@ qla2xxx_get_flash_info(scsi_qla_host_t *vha)
948 uint32_t flt_addr; 986 uint32_t flt_addr;
949 struct qla_hw_data *ha = vha->hw; 987 struct qla_hw_data *ha = vha->hw;
950 988
951 if (!IS_QLA24XX_TYPE(ha) && !IS_QLA25XX(ha) && !IS_QLA8XXX_TYPE(ha)) 989 if (!IS_QLA24XX_TYPE(ha) && !IS_QLA25XX(ha) &&
990 !IS_CNA_CAPABLE(ha) && !IS_QLA2031(ha))
952 return QLA_SUCCESS; 991 return QLA_SUCCESS;
953 992
954 ret = qla2xxx_find_flt_start(vha, &flt_addr); 993 ret = qla2xxx_find_flt_start(vha, &flt_addr);
@@ -974,7 +1013,8 @@ qla2xxx_flash_npiv_conf(scsi_qla_host_t *vha)
974 struct qla_npiv_entry *entry; 1013 struct qla_npiv_entry *entry;
975 struct qla_hw_data *ha = vha->hw; 1014 struct qla_hw_data *ha = vha->hw;
976 1015
977 if (!IS_QLA24XX_TYPE(ha) && !IS_QLA25XX(ha) && !IS_QLA8XXX_TYPE(ha)) 1016 if (!IS_QLA24XX_TYPE(ha) && !IS_QLA25XX(ha) &&
1017 !IS_CNA_CAPABLE(ha) && !IS_QLA2031(ha))
978 return; 1018 return;
979 1019
980 ha->isp_ops->read_optrom(vha, (uint8_t *)&hdr, 1020 ha->isp_ops->read_optrom(vha, (uint8_t *)&hdr,
@@ -1144,8 +1184,8 @@ qla24xx_write_flash_data(scsi_qla_host_t *vha, uint32_t *dwptr, uint32_t faddr,
1144 struct qla_hw_data *ha = vha->hw; 1184 struct qla_hw_data *ha = vha->hw;
1145 1185
1146 /* Prepare burst-capable write on supported ISPs. */ 1186 /* Prepare burst-capable write on supported ISPs. */
1147 if ((IS_QLA25XX(ha) || IS_QLA81XX(ha)) && !(faddr & 0xfff) && 1187 if ((IS_QLA25XX(ha) || IS_QLA81XX(ha) || IS_QLA83XX(ha)) &&
1148 dwords > OPTROM_BURST_DWORDS) { 1188 !(faddr & 0xfff) && dwords > OPTROM_BURST_DWORDS) {
1149 optrom = dma_alloc_coherent(&ha->pdev->dev, OPTROM_BURST_SIZE, 1189 optrom = dma_alloc_coherent(&ha->pdev->dev, OPTROM_BURST_SIZE,
1150 &optrom_dma, GFP_KERNEL); 1190 &optrom_dma, GFP_KERNEL);
1151 if (!optrom) { 1191 if (!optrom) {
@@ -1619,6 +1659,71 @@ qla24xx_beacon_blink(struct scsi_qla_host *vha)
1619 spin_unlock_irqrestore(&ha->hardware_lock, flags); 1659 spin_unlock_irqrestore(&ha->hardware_lock, flags);
1620} 1660}
1621 1661
1662void
1663qla83xx_beacon_blink(struct scsi_qla_host *vha)
1664{
1665 uint32_t led_select_value;
1666 struct qla_hw_data *ha = vha->hw;
1667 uint16_t led_cfg[6];
1668 uint16_t orig_led_cfg[6];
1669
1670 if (!IS_QLA83XX(ha) && !IS_QLA81XX(ha))
1671 return;
1672
1673 if (IS_QLA2031(ha) && ha->beacon_blink_led) {
1674 if (ha->flags.port0)
1675 led_select_value = 0x00201320;
1676 else
1677 led_select_value = 0x00201328;
1678
1679 qla83xx_write_remote_reg(vha, led_select_value, 0x40002000);
1680 qla83xx_write_remote_reg(vha, led_select_value + 4, 0x40002000);
1681 msleep(1000);
1682 qla83xx_write_remote_reg(vha, led_select_value, 0x40004000);
1683 qla83xx_write_remote_reg(vha, led_select_value + 4, 0x40004000);
1684 } else if ((IS_QLA8031(ha) || IS_QLA81XX(ha)) && ha->beacon_blink_led) {
1685 int rval;
1686
1687 /* Save Current */
1688 rval = qla81xx_get_led_config(vha, orig_led_cfg);
1689 /* Do the blink */
1690 if (rval == QLA_SUCCESS) {
1691 if (IS_QLA81XX(ha)) {
1692 led_cfg[0] = 0x4000;
1693 led_cfg[1] = 0x2000;
1694 led_cfg[2] = 0;
1695 led_cfg[3] = 0;
1696 led_cfg[4] = 0;
1697 led_cfg[5] = 0;
1698 } else {
1699 led_cfg[0] = 0x4000;
1700 led_cfg[1] = 0x4000;
1701 led_cfg[2] = 0x4000;
1702 led_cfg[3] = 0x2000;
1703 led_cfg[4] = 0;
1704 led_cfg[5] = 0x2000;
1705 }
1706 rval = qla81xx_set_led_config(vha, led_cfg);
1707 msleep(1000);
1708 if (IS_QLA81XX(ha)) {
1709 led_cfg[0] = 0x4000;
1710 led_cfg[1] = 0x2000;
1711 led_cfg[2] = 0;
1712 } else {
1713 led_cfg[0] = 0x4000;
1714 led_cfg[1] = 0x2000;
1715 led_cfg[2] = 0x4000;
1716 led_cfg[3] = 0x4000;
1717 led_cfg[4] = 0;
1718 led_cfg[5] = 0x2000;
1719 }
1720 rval = qla81xx_set_led_config(vha, led_cfg);
1721 }
1722 /* On exit, restore original (presumes no status change) */
1723 qla81xx_set_led_config(vha, orig_led_cfg);
1724 }
1725}
1726
1622int 1727int
1623qla24xx_beacon_on(struct scsi_qla_host *vha) 1728qla24xx_beacon_on(struct scsi_qla_host *vha)
1624{ 1729{
@@ -1630,6 +1735,9 @@ qla24xx_beacon_on(struct scsi_qla_host *vha)
1630 if (IS_QLA82XX(ha)) 1735 if (IS_QLA82XX(ha))
1631 return QLA_SUCCESS; 1736 return QLA_SUCCESS;
1632 1737
1738 if (IS_QLA8031(ha) || IS_QLA81XX(ha))
1739 goto skip_gpio; /* let blink handle it */
1740
1633 if (ha->beacon_blink_led == 0) { 1741 if (ha->beacon_blink_led == 0) {
1634 /* Enable firmware for update */ 1742 /* Enable firmware for update */
1635 ha->fw_options[1] |= ADD_FO1_DISABLE_GPIO_LED_CTRL; 1743 ha->fw_options[1] |= ADD_FO1_DISABLE_GPIO_LED_CTRL;
@@ -1644,6 +1752,9 @@ qla24xx_beacon_on(struct scsi_qla_host *vha)
1644 return QLA_FUNCTION_FAILED; 1752 return QLA_FUNCTION_FAILED;
1645 } 1753 }
1646 1754
1755 if (IS_QLA2031(ha))
1756 goto skip_gpio;
1757
1647 spin_lock_irqsave(&ha->hardware_lock, flags); 1758 spin_lock_irqsave(&ha->hardware_lock, flags);
1648 gpio_data = RD_REG_DWORD(&reg->gpiod); 1759 gpio_data = RD_REG_DWORD(&reg->gpiod);
1649 1760
@@ -1658,6 +1769,7 @@ qla24xx_beacon_on(struct scsi_qla_host *vha)
1658 /* So all colors blink together. */ 1769 /* So all colors blink together. */
1659 ha->beacon_color_state = 0; 1770 ha->beacon_color_state = 0;
1660 1771
1772skip_gpio:
1661 /* Let the per HBA timer kick off the blinking process. */ 1773 /* Let the per HBA timer kick off the blinking process. */
1662 ha->beacon_blink_led = 1; 1774 ha->beacon_blink_led = 1;
1663 1775
@@ -1676,6 +1788,13 @@ qla24xx_beacon_off(struct scsi_qla_host *vha)
1676 return QLA_SUCCESS; 1788 return QLA_SUCCESS;
1677 1789
1678 ha->beacon_blink_led = 0; 1790 ha->beacon_blink_led = 0;
1791
1792 if (IS_QLA2031(ha))
1793 goto set_fw_options;
1794
1795 if (IS_QLA8031(ha) || IS_QLA81XX(ha))
1796 return QLA_SUCCESS;
1797
1679 ha->beacon_color_state = QLA_LED_ALL_ON; 1798 ha->beacon_color_state = QLA_LED_ALL_ON;
1680 1799
1681 ha->isp_ops->beacon_blink(vha); /* Will flip to all off. */ 1800 ha->isp_ops->beacon_blink(vha); /* Will flip to all off. */
@@ -1690,6 +1809,7 @@ qla24xx_beacon_off(struct scsi_qla_host *vha)
1690 RD_REG_DWORD(&reg->gpiod); 1809 RD_REG_DWORD(&reg->gpiod);
1691 spin_unlock_irqrestore(&ha->hardware_lock, flags); 1810 spin_unlock_irqrestore(&ha->hardware_lock, flags);
1692 1811
1812set_fw_options:
1693 ha->fw_options[1] &= ~ADD_FO1_DISABLE_GPIO_LED_CTRL; 1813 ha->fw_options[1] &= ~ADD_FO1_DISABLE_GPIO_LED_CTRL;
1694 1814
1695 if (qla2x00_set_fw_options(vha, ha->fw_options) != QLA_SUCCESS) { 1815 if (qla2x00_set_fw_options(vha, ha->fw_options) != QLA_SUCCESS) {
diff --git a/drivers/scsi/qla4xxx/ql4_def.h b/drivers/scsi/qla4xxx/ql4_def.h
index bfe68545203f..7f2492e88be7 100644
--- a/drivers/scsi/qla4xxx/ql4_def.h
+++ b/drivers/scsi/qla4xxx/ql4_def.h
@@ -150,8 +150,6 @@
150#define QL4_SESS_RECOVERY_TMO 120 /* iSCSI session */ 150#define QL4_SESS_RECOVERY_TMO 120 /* iSCSI session */
151 /* recovery timeout */ 151 /* recovery timeout */
152 152
153#define MSB(x) ((uint8_t)((uint16_t)(x) >> 8))
154#define LSW(x) ((uint16_t)(x))
155#define LSDW(x) ((u32)((u64)(x))) 153#define LSDW(x) ((u32)((u64)(x)))
156#define MSDW(x) ((u32)((((u64)(x)) >> 16) >> 16)) 154#define MSDW(x) ((u32)((((u64)(x)) >> 16) >> 16))
157 155
@@ -223,6 +221,15 @@ struct srb {
223 uint16_t reserved2; 221 uint16_t reserved2;
224}; 222};
225 223
224/* Mailbox request block structure */
225struct mrb {
226 struct scsi_qla_host *ha;
227 struct mbox_cmd_iocb *mbox;
228 uint32_t mbox_cmd;
229 uint16_t iocb_cnt; /* Number of used iocbs */
230 uint32_t pid;
231};
232
226/* 233/*
227 * Asynchronous Event Queue structure 234 * Asynchronous Event Queue structure
228 */ 235 */
@@ -265,7 +272,7 @@ struct ddb_entry {
265 * retried */ 272 * retried */
266 uint32_t default_time2wait; /* Default Min time between 273 uint32_t default_time2wait; /* Default Min time between
267 * relogins (+aens) */ 274 * relogins (+aens) */
268 275 uint16_t chap_tbl_idx;
269}; 276};
270 277
271struct qla_ddb_index { 278struct qla_ddb_index {
@@ -284,6 +291,7 @@ struct ql4_tuple_ddb {
284 uint16_t options; 291 uint16_t options;
285#define DDB_OPT_IPV6 0x0e0e 292#define DDB_OPT_IPV6 0x0e0e
286#define DDB_OPT_IPV4 0x0f0f 293#define DDB_OPT_IPV4 0x0f0f
294 uint8_t isid[6];
287}; 295};
288 296
289/* 297/*
@@ -303,7 +311,28 @@ struct ql4_tuple_ddb {
303#define DF_ISNS_DISCOVERED 2 /* Device was discovered via iSNS */ 311#define DF_ISNS_DISCOVERED 2 /* Device was discovered via iSNS */
304#define DF_FO_MASKED 3 312#define DF_FO_MASKED 3
305 313
314enum qla4_work_type {
315 QLA4_EVENT_AEN,
316 QLA4_EVENT_PING_STATUS,
317};
306 318
319struct qla4_work_evt {
320 struct list_head list;
321 enum qla4_work_type type;
322 union {
323 struct {
324 enum iscsi_host_event_code code;
325 uint32_t data_size;
326 uint8_t data[0];
327 } aen;
328 struct {
329 uint32_t status;
330 uint32_t pid;
331 uint32_t data_size;
332 uint8_t data[0];
333 } ping;
334 } u;
335};
307 336
308struct ql82xx_hw_data { 337struct ql82xx_hw_data {
309 /* Offsets for flash/nvram access (set to ~0 if not used). */ 338 /* Offsets for flash/nvram access (set to ~0 if not used). */
@@ -657,6 +686,7 @@ struct scsi_qla_host {
657 struct dma_pool *chap_dma_pool; 686 struct dma_pool *chap_dma_pool;
658 uint8_t *chap_list; /* CHAP table cache */ 687 uint8_t *chap_list; /* CHAP table cache */
659 struct mutex chap_sem; 688 struct mutex chap_sem;
689
660#define CHAP_DMA_BLOCK_SIZE 512 690#define CHAP_DMA_BLOCK_SIZE 512
661 struct workqueue_struct *task_wq; 691 struct workqueue_struct *task_wq;
662 unsigned long ddb_idx_map[MAX_DDB_ENTRIES / BITS_PER_LONG]; 692 unsigned long ddb_idx_map[MAX_DDB_ENTRIES / BITS_PER_LONG];
@@ -674,6 +704,15 @@ struct scsi_qla_host {
674 uint16_t sec_ddb_idx; 704 uint16_t sec_ddb_idx;
675 int is_reset; 705 int is_reset;
676 uint16_t temperature; 706 uint16_t temperature;
707
708 /* event work list */
709 struct list_head work_list;
710 spinlock_t work_lock;
711
712 /* mbox iocb */
713#define MAX_MRB 128
714 struct mrb *active_mrb_array[MAX_MRB];
715 uint32_t mrb_index;
677}; 716};
678 717
679struct ql4_task_data { 718struct ql4_task_data {
diff --git a/drivers/scsi/qla4xxx/ql4_fw.h b/drivers/scsi/qla4xxx/ql4_fw.h
index 7825c141bc1a..210cd1d64475 100644
--- a/drivers/scsi/qla4xxx/ql4_fw.h
+++ b/drivers/scsi/qla4xxx/ql4_fw.h
@@ -331,6 +331,10 @@ struct qla_flt_region {
331/* Mailbox command definitions */ 331/* Mailbox command definitions */
332#define MBOX_CMD_ABOUT_FW 0x0009 332#define MBOX_CMD_ABOUT_FW 0x0009
333#define MBOX_CMD_PING 0x000B 333#define MBOX_CMD_PING 0x000B
334#define PING_IPV6_PROTOCOL_ENABLE 0x1
335#define PING_IPV6_LINKLOCAL_ADDR 0x4
336#define PING_IPV6_ADDR0 0x8
337#define PING_IPV6_ADDR1 0xC
334#define MBOX_CMD_ENABLE_INTRS 0x0010 338#define MBOX_CMD_ENABLE_INTRS 0x0010
335#define INTR_DISABLE 0 339#define INTR_DISABLE 0
336#define INTR_ENABLE 1 340#define INTR_ENABLE 1
@@ -396,6 +400,10 @@ struct qla_flt_region {
396#define FW_ADDSTATE_DHCPv4_LEASE_EXPIRED 0x0008 400#define FW_ADDSTATE_DHCPv4_LEASE_EXPIRED 0x0008
397#define FW_ADDSTATE_LINK_UP 0x0010 401#define FW_ADDSTATE_LINK_UP 0x0010
398#define FW_ADDSTATE_ISNS_SVC_ENABLED 0x0020 402#define FW_ADDSTATE_ISNS_SVC_ENABLED 0x0020
403#define FW_ADDSTATE_LINK_SPEED_10MBPS 0x0100
404#define FW_ADDSTATE_LINK_SPEED_100MBPS 0x0200
405#define FW_ADDSTATE_LINK_SPEED_1GBPS 0x0400
406#define FW_ADDSTATE_LINK_SPEED_10GBPS 0x0800
399 407
400#define MBOX_CMD_GET_DATABASE_ENTRY_DEFAULTS 0x006B 408#define MBOX_CMD_GET_DATABASE_ENTRY_DEFAULTS 0x006B
401#define IPV6_DEFAULT_DDB_ENTRY 0x0001 409#define IPV6_DEFAULT_DDB_ENTRY 0x0001
@@ -918,6 +926,8 @@ struct qla4_header {
918#define ET_CMND_T3 0x19 926#define ET_CMND_T3 0x19
919#define ET_PASSTHRU0 0x3A 927#define ET_PASSTHRU0 0x3A
920#define ET_PASSTHRU_STATUS 0x3C 928#define ET_PASSTHRU_STATUS 0x3C
929#define ET_MBOX_CMD 0x38
930#define ET_MBOX_STATUS 0x39
921 931
922 uint8_t entryStatus; 932 uint8_t entryStatus;
923 uint8_t systemDefined; 933 uint8_t systemDefined;
@@ -1118,6 +1128,20 @@ struct passthru_status {
1118 uint8_t res4[16]; /* 30-3F */ 1128 uint8_t res4[16]; /* 30-3F */
1119}; 1129};
1120 1130
1131struct mbox_cmd_iocb {
1132 struct qla4_header hdr; /* 00-03 */
1133 uint32_t handle; /* 04-07 */
1134 uint32_t in_mbox[8]; /* 08-25 */
1135 uint32_t res1[6]; /* 26-3F */
1136};
1137
1138struct mbox_status_iocb {
1139 struct qla4_header hdr; /* 00-03 */
1140 uint32_t handle; /* 04-07 */
1141 uint32_t out_mbox[8]; /* 08-25 */
1142 uint32_t res1[6]; /* 26-3F */
1143};
1144
1121/* 1145/*
1122 * ISP queue - response queue entry definition. 1146 * ISP queue - response queue entry definition.
1123 */ 1147 */
diff --git a/drivers/scsi/qla4xxx/ql4_glbl.h b/drivers/scsi/qla4xxx/ql4_glbl.h
index d0dd4b330206..910536667cf5 100644
--- a/drivers/scsi/qla4xxx/ql4_glbl.h
+++ b/drivers/scsi/qla4xxx/ql4_glbl.h
@@ -81,6 +81,8 @@ int qla4xxx_set_flash(struct scsi_qla_host *ha, dma_addr_t dma_addr,
81 uint32_t offset, uint32_t length, uint32_t options); 81 uint32_t offset, uint32_t length, uint32_t options);
82int qla4xxx_mailbox_command(struct scsi_qla_host *ha, uint8_t inCount, 82int qla4xxx_mailbox_command(struct scsi_qla_host *ha, uint8_t inCount,
83 uint8_t outCount, uint32_t *mbx_cmd, uint32_t *mbx_sts); 83 uint8_t outCount, uint32_t *mbx_cmd, uint32_t *mbx_sts);
84int qla4xxx_get_chap_index(struct scsi_qla_host *ha, char *username,
85 char *password, int bidi, uint16_t *chap_index);
84 86
85void qla4xxx_queue_iocb(struct scsi_qla_host *ha); 87void qla4xxx_queue_iocb(struct scsi_qla_host *ha);
86void qla4xxx_complete_iocb(struct scsi_qla_host *ha); 88void qla4xxx_complete_iocb(struct scsi_qla_host *ha);
@@ -181,6 +183,13 @@ int qla4xxx_flash_ddb_change(struct scsi_qla_host *ha, uint32_t fw_ddb_index,
181int qla4xxx_ddb_change(struct scsi_qla_host *ha, uint32_t fw_ddb_index, 183int qla4xxx_ddb_change(struct scsi_qla_host *ha, uint32_t fw_ddb_index,
182 struct ddb_entry *ddb_entry, uint32_t state); 184 struct ddb_entry *ddb_entry, uint32_t state);
183void qla4xxx_build_ddb_list(struct scsi_qla_host *ha, int is_reset); 185void qla4xxx_build_ddb_list(struct scsi_qla_host *ha, int is_reset);
186int qla4xxx_post_aen_work(struct scsi_qla_host *ha, uint32_t aen_code,
187 uint32_t data_size, uint8_t *data);
188int qla4xxx_ping_iocb(struct scsi_qla_host *ha, uint32_t options,
189 uint32_t payload_size, uint32_t pid, uint8_t *ipaddr);
190int qla4xxx_post_ping_evt_work(struct scsi_qla_host *ha,
191 uint32_t status, uint32_t pid,
192 uint32_t data_size, uint8_t *data);
184 193
185/* BSG Functions */ 194/* BSG Functions */
186int qla4xxx_bsg_request(struct bsg_job *bsg_job); 195int qla4xxx_bsg_request(struct bsg_job *bsg_job);
diff --git a/drivers/scsi/qla4xxx/ql4_init.c b/drivers/scsi/qla4xxx/ql4_init.c
index 90614f38b55d..90ee5d8fa731 100644
--- a/drivers/scsi/qla4xxx/ql4_init.c
+++ b/drivers/scsi/qla4xxx/ql4_init.c
@@ -86,6 +86,7 @@ static void qla4xxx_init_response_q_entries(struct scsi_qla_host *ha)
86int qla4xxx_init_rings(struct scsi_qla_host *ha) 86int qla4xxx_init_rings(struct scsi_qla_host *ha)
87{ 87{
88 unsigned long flags = 0; 88 unsigned long flags = 0;
89 int i;
89 90
90 /* Initialize request queue. */ 91 /* Initialize request queue. */
91 spin_lock_irqsave(&ha->hardware_lock, flags); 92 spin_lock_irqsave(&ha->hardware_lock, flags);
@@ -125,6 +126,10 @@ int qla4xxx_init_rings(struct scsi_qla_host *ha)
125 126
126 qla4xxx_init_response_q_entries(ha); 127 qla4xxx_init_response_q_entries(ha);
127 128
129 /* Initialize mabilbox active array */
130 for (i = 0; i < MAX_MRB; i++)
131 ha->active_mrb_array[i] = NULL;
132
128 spin_unlock_irqrestore(&ha->hardware_lock, flags); 133 spin_unlock_irqrestore(&ha->hardware_lock, flags);
129 134
130 return QLA_SUCCESS; 135 return QLA_SUCCESS;
diff --git a/drivers/scsi/qla4xxx/ql4_iocb.c b/drivers/scsi/qla4xxx/ql4_iocb.c
index 410669351906..2a2022a6bb9b 100644
--- a/drivers/scsi/qla4xxx/ql4_iocb.c
+++ b/drivers/scsi/qla4xxx/ql4_iocb.c
@@ -445,3 +445,95 @@ queuing_error:
445 spin_unlock_irqrestore(&ha->hardware_lock, flags); 445 spin_unlock_irqrestore(&ha->hardware_lock, flags);
446 return ret; 446 return ret;
447} 447}
448
449static struct mrb *qla4xxx_get_new_mrb(struct scsi_qla_host *ha)
450{
451 struct mrb *mrb;
452
453 mrb = kzalloc(sizeof(*mrb), GFP_KERNEL);
454 if (!mrb)
455 return mrb;
456
457 mrb->ha = ha;
458 return mrb;
459}
460
461static int qla4xxx_send_mbox_iocb(struct scsi_qla_host *ha, struct mrb *mrb,
462 uint32_t *in_mbox)
463{
464 int rval = QLA_SUCCESS;
465 uint32_t i;
466 unsigned long flags;
467 uint32_t index = 0;
468
469 /* Acquire hardware specific lock */
470 spin_lock_irqsave(&ha->hardware_lock, flags);
471
472 /* Get pointer to the queue entry for the marker */
473 rval = qla4xxx_get_req_pkt(ha, (struct queue_entry **) &(mrb->mbox));
474 if (rval != QLA_SUCCESS)
475 goto exit_mbox_iocb;
476
477 index = ha->mrb_index;
478 /* get valid mrb index*/
479 for (i = 0; i < MAX_MRB; i++) {
480 index++;
481 if (index == MAX_MRB)
482 index = 1;
483 if (ha->active_mrb_array[index] == NULL) {
484 ha->mrb_index = index;
485 break;
486 }
487 }
488
489 mrb->iocb_cnt = 1;
490 ha->active_mrb_array[index] = mrb;
491 mrb->mbox->handle = index;
492 mrb->mbox->hdr.entryType = ET_MBOX_CMD;
493 mrb->mbox->hdr.entryCount = mrb->iocb_cnt;
494 memcpy(mrb->mbox->in_mbox, in_mbox, 32);
495 mrb->mbox_cmd = in_mbox[0];
496 wmb();
497
498 ha->isp_ops->queue_iocb(ha);
499exit_mbox_iocb:
500 spin_unlock_irqrestore(&ha->hardware_lock, flags);
501 return rval;
502}
503
504int qla4xxx_ping_iocb(struct scsi_qla_host *ha, uint32_t options,
505 uint32_t payload_size, uint32_t pid, uint8_t *ipaddr)
506{
507 uint32_t in_mbox[8];
508 struct mrb *mrb = NULL;
509 int rval = QLA_SUCCESS;
510
511 memset(in_mbox, 0, sizeof(in_mbox));
512
513 mrb = qla4xxx_get_new_mrb(ha);
514 if (!mrb) {
515 DEBUG2(ql4_printk(KERN_WARNING, ha, "%s: fail to get new mrb\n",
516 __func__));
517 rval = QLA_ERROR;
518 goto exit_ping;
519 }
520
521 in_mbox[0] = MBOX_CMD_PING;
522 in_mbox[1] = options;
523 memcpy(&in_mbox[2], &ipaddr[0], 4);
524 memcpy(&in_mbox[3], &ipaddr[4], 4);
525 memcpy(&in_mbox[4], &ipaddr[8], 4);
526 memcpy(&in_mbox[5], &ipaddr[12], 4);
527 in_mbox[6] = payload_size;
528
529 mrb->pid = pid;
530 rval = qla4xxx_send_mbox_iocb(ha, mrb, in_mbox);
531
532 if (rval != QLA_SUCCESS)
533 goto exit_ping;
534
535 return rval;
536exit_ping:
537 kfree(mrb);
538 return rval;
539}
diff --git a/drivers/scsi/qla4xxx/ql4_isr.c b/drivers/scsi/qla4xxx/ql4_isr.c
index 95828862eea0..7c9f28b7da72 100644
--- a/drivers/scsi/qla4xxx/ql4_isr.c
+++ b/drivers/scsi/qla4xxx/ql4_isr.c
@@ -385,6 +385,71 @@ static void qla4xxx_passthru_status_entry(struct scsi_qla_host *ha,
385 queue_work(ha->task_wq, &task_data->task_work); 385 queue_work(ha->task_wq, &task_data->task_work);
386} 386}
387 387
388static struct mrb *qla4xxx_del_mrb_from_active_array(struct scsi_qla_host *ha,
389 uint32_t index)
390{
391 struct mrb *mrb = NULL;
392
393 /* validate handle and remove from active array */
394 if (index >= MAX_MRB)
395 return mrb;
396
397 mrb = ha->active_mrb_array[index];
398 ha->active_mrb_array[index] = NULL;
399 if (!mrb)
400 return mrb;
401
402 /* update counters */
403 ha->req_q_count += mrb->iocb_cnt;
404 ha->iocb_cnt -= mrb->iocb_cnt;
405
406 return mrb;
407}
408
409static void qla4xxx_mbox_status_entry(struct scsi_qla_host *ha,
410 struct mbox_status_iocb *mbox_sts_entry)
411{
412 struct mrb *mrb;
413 uint32_t status;
414 uint32_t data_size;
415
416 mrb = qla4xxx_del_mrb_from_active_array(ha,
417 le32_to_cpu(mbox_sts_entry->handle));
418
419 if (mrb == NULL) {
420 ql4_printk(KERN_WARNING, ha, "%s: mrb[%d] is null\n", __func__,
421 mbox_sts_entry->handle);
422 return;
423 }
424
425 switch (mrb->mbox_cmd) {
426 case MBOX_CMD_PING:
427 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: mbox_cmd = 0x%x, "
428 "mbox_sts[0] = 0x%x, mbox_sts[6] = 0x%x\n",
429 __func__, mrb->mbox_cmd,
430 mbox_sts_entry->out_mbox[0],
431 mbox_sts_entry->out_mbox[6]));
432
433 if (mbox_sts_entry->out_mbox[0] == MBOX_STS_COMMAND_COMPLETE)
434 status = QLA_SUCCESS;
435 else
436 status = QLA_ERROR;
437
438 data_size = sizeof(mbox_sts_entry->out_mbox);
439
440 qla4xxx_post_ping_evt_work(ha, status, mrb->pid, data_size,
441 (uint8_t *) mbox_sts_entry->out_mbox);
442 break;
443
444 default:
445 DEBUG2(ql4_printk(KERN_WARNING, ha, "%s: invalid mbox_cmd = "
446 "0x%x\n", __func__, mrb->mbox_cmd));
447 }
448
449 kfree(mrb);
450 return;
451}
452
388/** 453/**
389 * qla4xxx_process_response_queue - process response queue completions 454 * qla4xxx_process_response_queue - process response queue completions
390 * @ha: Pointer to host adapter structure. 455 * @ha: Pointer to host adapter structure.
@@ -461,6 +526,13 @@ void qla4xxx_process_response_queue(struct scsi_qla_host *ha)
461 "ignoring\n", ha->host_no, __func__)); 526 "ignoring\n", ha->host_no, __func__));
462 break; 527 break;
463 528
529 case ET_MBOX_STATUS:
530 DEBUG2(ql4_printk(KERN_INFO, ha,
531 "%s: mbox status IOCB\n", __func__));
532 qla4xxx_mbox_status_entry(ha,
533 (struct mbox_status_iocb *)sts_entry);
534 break;
535
464 default: 536 default:
465 /* 537 /*
466 * Invalid entry in response queue, reset RISC 538 * Invalid entry in response queue, reset RISC
@@ -576,6 +648,9 @@ static void qla4xxx_isr_decode_mailbox(struct scsi_qla_host * ha,
576 set_bit(DPC_LINK_CHANGED, &ha->dpc_flags); 648 set_bit(DPC_LINK_CHANGED, &ha->dpc_flags);
577 649
578 ql4_printk(KERN_INFO, ha, "%s: LINK UP\n", __func__); 650 ql4_printk(KERN_INFO, ha, "%s: LINK UP\n", __func__);
651 qla4xxx_post_aen_work(ha, ISCSI_EVENT_LINKUP,
652 sizeof(mbox_sts),
653 (uint8_t *) mbox_sts);
579 break; 654 break;
580 655
581 case MBOX_ASTS_LINK_DOWN: 656 case MBOX_ASTS_LINK_DOWN:
@@ -584,6 +659,9 @@ static void qla4xxx_isr_decode_mailbox(struct scsi_qla_host * ha,
584 set_bit(DPC_LINK_CHANGED, &ha->dpc_flags); 659 set_bit(DPC_LINK_CHANGED, &ha->dpc_flags);
585 660
586 ql4_printk(KERN_INFO, ha, "%s: LINK DOWN\n", __func__); 661 ql4_printk(KERN_INFO, ha, "%s: LINK DOWN\n", __func__);
662 qla4xxx_post_aen_work(ha, ISCSI_EVENT_LINKDOWN,
663 sizeof(mbox_sts),
664 (uint8_t *) mbox_sts);
587 break; 665 break;
588 666
589 case MBOX_ASTS_HEARTBEAT: 667 case MBOX_ASTS_HEARTBEAT:
diff --git a/drivers/scsi/qla4xxx/ql4_mbx.c b/drivers/scsi/qla4xxx/ql4_mbx.c
index e1e66a45e4d0..7ac21dabbf22 100644
--- a/drivers/scsi/qla4xxx/ql4_mbx.c
+++ b/drivers/scsi/qla4xxx/ql4_mbx.c
@@ -622,7 +622,7 @@ int qla4xxx_get_firmware_status(struct scsi_qla_host * ha)
622 return QLA_ERROR; 622 return QLA_ERROR;
623 } 623 }
624 624
625 ql4_printk(KERN_INFO, ha, "%ld firmare IOCBs available (%d).\n", 625 ql4_printk(KERN_INFO, ha, "%ld firmware IOCBs available (%d).\n",
626 ha->host_no, mbox_sts[2]); 626 ha->host_no, mbox_sts[2]);
627 627
628 return QLA_SUCCESS; 628 return QLA_SUCCESS;
@@ -661,6 +661,8 @@ int qla4xxx_get_fwddb_entry(struct scsi_qla_host *ha,
661 } 661 }
662 memset(&mbox_cmd, 0, sizeof(mbox_cmd)); 662 memset(&mbox_cmd, 0, sizeof(mbox_cmd));
663 memset(&mbox_sts, 0, sizeof(mbox_sts)); 663 memset(&mbox_sts, 0, sizeof(mbox_sts));
664 if (fw_ddb_entry)
665 memset(fw_ddb_entry, 0, sizeof(struct dev_db_entry));
664 666
665 mbox_cmd[0] = MBOX_CMD_GET_DATABASE_ENTRY; 667 mbox_cmd[0] = MBOX_CMD_GET_DATABASE_ENTRY;
666 mbox_cmd[1] = (uint32_t) fw_ddb_index; 668 mbox_cmd[1] = (uint32_t) fw_ddb_index;
@@ -1424,8 +1426,8 @@ exit_set_chap:
1424 * match is found. If a match is not found then add the entry in FLASH and 1426 * match is found. If a match is not found then add the entry in FLASH and
1425 * return the index at which entry is written in the FLASH. 1427 * return the index at which entry is written in the FLASH.
1426 **/ 1428 **/
1427static int qla4xxx_get_chap_index(struct scsi_qla_host *ha, char *username, 1429int qla4xxx_get_chap_index(struct scsi_qla_host *ha, char *username,
1428 char *password, int bidi, uint16_t *chap_index) 1430 char *password, int bidi, uint16_t *chap_index)
1429{ 1431{
1430 int i, rval; 1432 int i, rval;
1431 int free_index = -1; 1433 int free_index = -1;
@@ -1444,6 +1446,11 @@ static int qla4xxx_get_chap_index(struct scsi_qla_host *ha, char *username,
1444 return QLA_ERROR; 1446 return QLA_ERROR;
1445 } 1447 }
1446 1448
1449 if (!username || !password) {
1450 ql4_printk(KERN_ERR, ha, "Do not have username and psw\n");
1451 return QLA_ERROR;
1452 }
1453
1447 mutex_lock(&ha->chap_sem); 1454 mutex_lock(&ha->chap_sem);
1448 for (i = 0; i < max_chap_entries; i++) { 1455 for (i = 0; i < max_chap_entries; i++) {
1449 chap_table = (struct ql4_chap_table *)ha->chap_list + i; 1456 chap_table = (struct ql4_chap_table *)ha->chap_list + i;
@@ -1600,7 +1607,7 @@ int qla4xxx_set_param_ddbentry(struct scsi_qla_host *ha,
1600 char *ip; 1607 char *ip;
1601 uint16_t iscsi_opts = 0; 1608 uint16_t iscsi_opts = 0;
1602 uint32_t options = 0; 1609 uint32_t options = 0;
1603 uint16_t idx; 1610 uint16_t idx, *ptid;
1604 1611
1605 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), 1612 fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry),
1606 &fw_ddb_entry_dma, GFP_KERNEL); 1613 &fw_ddb_entry_dma, GFP_KERNEL);
@@ -1626,6 +1633,14 @@ int qla4xxx_set_param_ddbentry(struct scsi_qla_host *ha,
1626 goto exit_set_param; 1633 goto exit_set_param;
1627 } 1634 }
1628 1635
1636 ptid = (uint16_t *)&fw_ddb_entry->isid[1];
1637 *ptid = cpu_to_le16((uint16_t)ddb_entry->sess->target_id);
1638
1639 DEBUG2(ql4_printk(KERN_INFO, ha, "ISID [%02x%02x%02x%02x%02x%02x]\n",
1640 fw_ddb_entry->isid[5], fw_ddb_entry->isid[4],
1641 fw_ddb_entry->isid[3], fw_ddb_entry->isid[2],
1642 fw_ddb_entry->isid[1], fw_ddb_entry->isid[0]));
1643
1629 iscsi_opts = le16_to_cpu(fw_ddb_entry->iscsi_options); 1644 iscsi_opts = le16_to_cpu(fw_ddb_entry->iscsi_options);
1630 memset(fw_ddb_entry->iscsi_alias, 0, sizeof(fw_ddb_entry->iscsi_alias)); 1645 memset(fw_ddb_entry->iscsi_alias, 0, sizeof(fw_ddb_entry->iscsi_alias));
1631 1646
diff --git a/drivers/scsi/qla4xxx/ql4_nx.c b/drivers/scsi/qla4xxx/ql4_nx.c
index 65253dfbe962..e1e46b6dac75 100644
--- a/drivers/scsi/qla4xxx/ql4_nx.c
+++ b/drivers/scsi/qla4xxx/ql4_nx.c
@@ -841,11 +841,8 @@ qla4_8xxx_rom_lock(struct scsi_qla_host *ha)
841 done = qla4_8xxx_rd_32(ha, QLA82XX_PCIE_REG(PCIE_SEM2_LOCK)); 841 done = qla4_8xxx_rd_32(ha, QLA82XX_PCIE_REG(PCIE_SEM2_LOCK));
842 if (done == 1) 842 if (done == 1)
843 break; 843 break;
844 if (timeout >= qla4_8xxx_rom_lock_timeout) { 844 if (timeout >= qla4_8xxx_rom_lock_timeout)
845 ql4_printk(KERN_WARNING, ha,
846 "%s: Failed to acquire rom lock", __func__);
847 return -1; 845 return -1;
848 }
849 846
850 timeout++; 847 timeout++;
851 848
@@ -996,18 +993,6 @@ qla4_8xxx_pinit_from_rom(struct scsi_qla_host *ha, int verbose)
996 else 993 else
997 qla4_8xxx_wr_32(ha, QLA82XX_ROMUSB_GLB_SW_RESET, 0xffffffff); 994 qla4_8xxx_wr_32(ha, QLA82XX_ROMUSB_GLB_SW_RESET, 0xffffffff);
998 995
999 /* reset ms */
1000 val = qla4_8xxx_rd_32(ha, QLA82XX_CRB_QDR_NET + 0xe4);
1001 val |= (1 << 1);
1002 qla4_8xxx_wr_32(ha, QLA82XX_CRB_QDR_NET + 0xe4, val);
1003
1004 msleep(20);
1005 /* unreset ms */
1006 val = qla4_8xxx_rd_32(ha, QLA82XX_CRB_QDR_NET + 0xe4);
1007 val &= ~(1 << 1);
1008 qla4_8xxx_wr_32(ha, QLA82XX_CRB_QDR_NET + 0xe4, val);
1009 msleep(20);
1010
1011 qla4_8xxx_rom_unlock(ha); 996 qla4_8xxx_rom_unlock(ha);
1012 997
1013 /* Read the signature value from the flash. 998 /* Read the signature value from the flash.
diff --git a/drivers/scsi/qla4xxx/ql4_nx.h b/drivers/scsi/qla4xxx/ql4_nx.h
index dc45ac923691..dc7500e47b8b 100644
--- a/drivers/scsi/qla4xxx/ql4_nx.h
+++ b/drivers/scsi/qla4xxx/ql4_nx.h
@@ -623,6 +623,7 @@ struct crb_addr_pair {
623 623
624#define ADDR_ERROR ((unsigned long) 0xffffffff) 624#define ADDR_ERROR ((unsigned long) 0xffffffff)
625#define MAX_CTL_CHECK 1000 625#define MAX_CTL_CHECK 1000
626#define QLA82XX_FWERROR_CODE(code) ((code >> 8) & 0x1fffff)
626 627
627/*************************************************************************** 628/***************************************************************************
628 * PCI related defines. 629 * PCI related defines.
diff --git a/drivers/scsi/qla4xxx/ql4_os.c b/drivers/scsi/qla4xxx/ql4_os.c
index edf503437e96..3d9419460e0c 100644
--- a/drivers/scsi/qla4xxx/ql4_os.c
+++ b/drivers/scsi/qla4xxx/ql4_os.c
@@ -32,14 +32,14 @@ static struct kmem_cache *srb_cachep;
32/* 32/*
33 * Module parameter information and variables 33 * Module parameter information and variables
34 */ 34 */
35int ql4xdisablesysfsboot = 1; 35static int ql4xdisablesysfsboot = 1;
36module_param(ql4xdisablesysfsboot, int, S_IRUGO | S_IWUSR); 36module_param(ql4xdisablesysfsboot, int, S_IRUGO | S_IWUSR);
37MODULE_PARM_DESC(ql4xdisablesysfsboot, 37MODULE_PARM_DESC(ql4xdisablesysfsboot,
38 " Set to disable exporting boot targets to sysfs.\n" 38 " Set to disable exporting boot targets to sysfs.\n"
39 "\t\t 0 - Export boot targets\n" 39 "\t\t 0 - Export boot targets\n"
40 "\t\t 1 - Do not export boot targets (Default)"); 40 "\t\t 1 - Do not export boot targets (Default)");
41 41
42int ql4xdontresethba = 0; 42int ql4xdontresethba;
43module_param(ql4xdontresethba, int, S_IRUGO | S_IWUSR); 43module_param(ql4xdontresethba, int, S_IRUGO | S_IWUSR);
44MODULE_PARM_DESC(ql4xdontresethba, 44MODULE_PARM_DESC(ql4xdontresethba,
45 " Don't reset the HBA for driver recovery.\n" 45 " Don't reset the HBA for driver recovery.\n"
@@ -71,7 +71,7 @@ MODULE_PARM_DESC(ql4xmaxqdepth,
71static int ql4xsess_recovery_tmo = QL4_SESS_RECOVERY_TMO; 71static int ql4xsess_recovery_tmo = QL4_SESS_RECOVERY_TMO;
72module_param(ql4xsess_recovery_tmo, int, S_IRUGO); 72module_param(ql4xsess_recovery_tmo, int, S_IRUGO);
73MODULE_PARM_DESC(ql4xsess_recovery_tmo, 73MODULE_PARM_DESC(ql4xsess_recovery_tmo,
74 "Target Session Recovery Timeout.\n" 74 " Target Session Recovery Timeout.\n"
75 "\t\t Default: 120 sec."); 75 "\t\t Default: 120 sec.");
76 76
77static int qla4xxx_wait_for_hba_online(struct scsi_qla_host *ha); 77static int qla4xxx_wait_for_hba_online(struct scsi_qla_host *ha);
@@ -83,6 +83,8 @@ static void qla4xxx_config_dma_addressing(struct scsi_qla_host *ha);
83/* 83/*
84 * iSCSI template entry points 84 * iSCSI template entry points
85 */ 85 */
86static int qla4xxx_session_get_param(struct iscsi_cls_session *cls_sess,
87 enum iscsi_param param, char *buf);
86static int qla4xxx_conn_get_param(struct iscsi_cls_conn *conn, 88static int qla4xxx_conn_get_param(struct iscsi_cls_conn *conn,
87 enum iscsi_param param, char *buf); 89 enum iscsi_param param, char *buf);
88static int qla4xxx_host_get_param(struct Scsi_Host *shost, 90static int qla4xxx_host_get_param(struct Scsi_Host *shost,
@@ -118,6 +120,13 @@ static void qla4xxx_task_cleanup(struct iscsi_task *);
118static void qla4xxx_fail_session(struct iscsi_cls_session *cls_session); 120static void qla4xxx_fail_session(struct iscsi_cls_session *cls_session);
119static void qla4xxx_conn_get_stats(struct iscsi_cls_conn *cls_conn, 121static void qla4xxx_conn_get_stats(struct iscsi_cls_conn *cls_conn,
120 struct iscsi_stats *stats); 122 struct iscsi_stats *stats);
123static int qla4xxx_send_ping(struct Scsi_Host *shost, uint32_t iface_num,
124 uint32_t iface_type, uint32_t payload_size,
125 uint32_t pid, struct sockaddr *dst_addr);
126static int qla4xxx_get_chap_list(struct Scsi_Host *shost, uint16_t chap_tbl_idx,
127 uint32_t *num_entries, char *buf);
128static int qla4xxx_delete_chap(struct Scsi_Host *shost, uint16_t chap_tbl_idx);
129
121/* 130/*
122 * SCSI host template entry points 131 * SCSI host template entry points
123 */ 132 */
@@ -179,7 +188,7 @@ static struct iscsi_transport qla4xxx_iscsi_transport = {
179 .destroy_conn = qla4xxx_conn_destroy, 188 .destroy_conn = qla4xxx_conn_destroy,
180 .set_param = iscsi_set_param, 189 .set_param = iscsi_set_param,
181 .get_conn_param = qla4xxx_conn_get_param, 190 .get_conn_param = qla4xxx_conn_get_param,
182 .get_session_param = iscsi_session_get_param, 191 .get_session_param = qla4xxx_session_get_param,
183 .get_ep_param = qla4xxx_get_ep_param, 192 .get_ep_param = qla4xxx_get_ep_param,
184 .ep_connect = qla4xxx_ep_connect, 193 .ep_connect = qla4xxx_ep_connect,
185 .ep_poll = qla4xxx_ep_poll, 194 .ep_poll = qla4xxx_ep_poll,
@@ -194,10 +203,93 @@ static struct iscsi_transport qla4xxx_iscsi_transport = {
194 .set_iface_param = qla4xxx_iface_set_param, 203 .set_iface_param = qla4xxx_iface_set_param,
195 .get_iface_param = qla4xxx_get_iface_param, 204 .get_iface_param = qla4xxx_get_iface_param,
196 .bsg_request = qla4xxx_bsg_request, 205 .bsg_request = qla4xxx_bsg_request,
206 .send_ping = qla4xxx_send_ping,
207 .get_chap = qla4xxx_get_chap_list,
208 .delete_chap = qla4xxx_delete_chap,
197}; 209};
198 210
199static struct scsi_transport_template *qla4xxx_scsi_transport; 211static struct scsi_transport_template *qla4xxx_scsi_transport;
200 212
213static int qla4xxx_send_ping(struct Scsi_Host *shost, uint32_t iface_num,
214 uint32_t iface_type, uint32_t payload_size,
215 uint32_t pid, struct sockaddr *dst_addr)
216{
217 struct scsi_qla_host *ha = to_qla_host(shost);
218 struct sockaddr_in *addr;
219 struct sockaddr_in6 *addr6;
220 uint32_t options = 0;
221 uint8_t ipaddr[IPv6_ADDR_LEN];
222 int rval;
223
224 memset(ipaddr, 0, IPv6_ADDR_LEN);
225 /* IPv4 to IPv4 */
226 if ((iface_type == ISCSI_IFACE_TYPE_IPV4) &&
227 (dst_addr->sa_family == AF_INET)) {
228 addr = (struct sockaddr_in *)dst_addr;
229 memcpy(ipaddr, &addr->sin_addr.s_addr, IP_ADDR_LEN);
230 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: IPv4 Ping src: %pI4 "
231 "dest: %pI4\n", __func__,
232 &ha->ip_config.ip_address, ipaddr));
233 rval = qla4xxx_ping_iocb(ha, options, payload_size, pid,
234 ipaddr);
235 if (rval)
236 rval = -EINVAL;
237 } else if ((iface_type == ISCSI_IFACE_TYPE_IPV6) &&
238 (dst_addr->sa_family == AF_INET6)) {
239 /* IPv6 to IPv6 */
240 addr6 = (struct sockaddr_in6 *)dst_addr;
241 memcpy(ipaddr, &addr6->sin6_addr.in6_u.u6_addr8, IPv6_ADDR_LEN);
242
243 options |= PING_IPV6_PROTOCOL_ENABLE;
244
245 /* Ping using LinkLocal address */
246 if ((iface_num == 0) || (iface_num == 1)) {
247 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: LinkLocal Ping "
248 "src: %pI6 dest: %pI6\n", __func__,
249 &ha->ip_config.ipv6_link_local_addr,
250 ipaddr));
251 options |= PING_IPV6_LINKLOCAL_ADDR;
252 rval = qla4xxx_ping_iocb(ha, options, payload_size,
253 pid, ipaddr);
254 } else {
255 ql4_printk(KERN_WARNING, ha, "%s: iface num = %d "
256 "not supported\n", __func__, iface_num);
257 rval = -ENOSYS;
258 goto exit_send_ping;
259 }
260
261 /*
262 * If ping using LinkLocal address fails, try ping using
263 * IPv6 address
264 */
265 if (rval != QLA_SUCCESS) {
266 options &= ~PING_IPV6_LINKLOCAL_ADDR;
267 if (iface_num == 0) {
268 options |= PING_IPV6_ADDR0;
269 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: IPv6 "
270 "Ping src: %pI6 "
271 "dest: %pI6\n", __func__,
272 &ha->ip_config.ipv6_addr0,
273 ipaddr));
274 } else if (iface_num == 1) {
275 options |= PING_IPV6_ADDR1;
276 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: IPv6 "
277 "Ping src: %pI6 "
278 "dest: %pI6\n", __func__,
279 &ha->ip_config.ipv6_addr1,
280 ipaddr));
281 }
282 rval = qla4xxx_ping_iocb(ha, options, payload_size,
283 pid, ipaddr);
284 if (rval)
285 rval = -EINVAL;
286 }
287 } else
288 rval = -ENOSYS;
289exit_send_ping:
290 return rval;
291}
292
201static umode_t ql4_attr_is_visible(int param_type, int param) 293static umode_t ql4_attr_is_visible(int param_type, int param)
202{ 294{
203 switch (param_type) { 295 switch (param_type) {
@@ -206,6 +298,8 @@ static umode_t ql4_attr_is_visible(int param_type, int param)
206 case ISCSI_HOST_PARAM_HWADDRESS: 298 case ISCSI_HOST_PARAM_HWADDRESS:
207 case ISCSI_HOST_PARAM_IPADDRESS: 299 case ISCSI_HOST_PARAM_IPADDRESS:
208 case ISCSI_HOST_PARAM_INITIATOR_NAME: 300 case ISCSI_HOST_PARAM_INITIATOR_NAME:
301 case ISCSI_HOST_PARAM_PORT_STATE:
302 case ISCSI_HOST_PARAM_PORT_SPEED:
209 return S_IRUGO; 303 return S_IRUGO;
210 default: 304 default:
211 return 0; 305 return 0;
@@ -225,6 +319,12 @@ static umode_t ql4_attr_is_visible(int param_type, int param)
225 case ISCSI_PARAM_MAX_RECV_DLENGTH: 319 case ISCSI_PARAM_MAX_RECV_DLENGTH:
226 case ISCSI_PARAM_MAX_XMIT_DLENGTH: 320 case ISCSI_PARAM_MAX_XMIT_DLENGTH:
227 case ISCSI_PARAM_IFACE_NAME: 321 case ISCSI_PARAM_IFACE_NAME:
322 case ISCSI_PARAM_CHAP_OUT_IDX:
323 case ISCSI_PARAM_CHAP_IN_IDX:
324 case ISCSI_PARAM_USERNAME:
325 case ISCSI_PARAM_PASSWORD:
326 case ISCSI_PARAM_USERNAME_IN:
327 case ISCSI_PARAM_PASSWORD_IN:
228 return S_IRUGO; 328 return S_IRUGO;
229 default: 329 default:
230 return 0; 330 return 0;
@@ -255,6 +355,189 @@ static umode_t ql4_attr_is_visible(int param_type, int param)
255 return 0; 355 return 0;
256} 356}
257 357
358static int qla4xxx_get_chap_list(struct Scsi_Host *shost, uint16_t chap_tbl_idx,
359 uint32_t *num_entries, char *buf)
360{
361 struct scsi_qla_host *ha = to_qla_host(shost);
362 struct ql4_chap_table *chap_table;
363 struct iscsi_chap_rec *chap_rec;
364 int max_chap_entries = 0;
365 int valid_chap_entries = 0;
366 int ret = 0, i;
367
368 if (is_qla8022(ha))
369 max_chap_entries = (ha->hw.flt_chap_size / 2) /
370 sizeof(struct ql4_chap_table);
371 else
372 max_chap_entries = MAX_CHAP_ENTRIES_40XX;
373
374 ql4_printk(KERN_INFO, ha, "%s: num_entries = %d, CHAP idx = %d\n",
375 __func__, *num_entries, chap_tbl_idx);
376
377 if (!buf) {
378 ret = -ENOMEM;
379 goto exit_get_chap_list;
380 }
381
382 chap_rec = (struct iscsi_chap_rec *) buf;
383 mutex_lock(&ha->chap_sem);
384 for (i = chap_tbl_idx; i < max_chap_entries; i++) {
385 chap_table = (struct ql4_chap_table *)ha->chap_list + i;
386 if (chap_table->cookie !=
387 __constant_cpu_to_le16(CHAP_VALID_COOKIE))
388 continue;
389
390 chap_rec->chap_tbl_idx = i;
391 strncpy(chap_rec->username, chap_table->name,
392 ISCSI_CHAP_AUTH_NAME_MAX_LEN);
393 strncpy(chap_rec->password, chap_table->secret,
394 QL4_CHAP_MAX_SECRET_LEN);
395 chap_rec->password_length = chap_table->secret_len;
396
397 if (chap_table->flags & BIT_7) /* local */
398 chap_rec->chap_type = CHAP_TYPE_OUT;
399
400 if (chap_table->flags & BIT_6) /* peer */
401 chap_rec->chap_type = CHAP_TYPE_IN;
402
403 chap_rec++;
404
405 valid_chap_entries++;
406 if (valid_chap_entries == *num_entries)
407 break;
408 else
409 continue;
410 }
411 mutex_unlock(&ha->chap_sem);
412
413exit_get_chap_list:
414 ql4_printk(KERN_INFO, ha, "%s: Valid CHAP Entries = %d\n",
415 __func__, valid_chap_entries);
416 *num_entries = valid_chap_entries;
417 return ret;
418}
419
420static int __qla4xxx_is_chap_active(struct device *dev, void *data)
421{
422 int ret = 0;
423 uint16_t *chap_tbl_idx = (uint16_t *) data;
424 struct iscsi_cls_session *cls_session;
425 struct iscsi_session *sess;
426 struct ddb_entry *ddb_entry;
427
428 if (!iscsi_is_session_dev(dev))
429 goto exit_is_chap_active;
430
431 cls_session = iscsi_dev_to_session(dev);
432 sess = cls_session->dd_data;
433 ddb_entry = sess->dd_data;
434
435 if (iscsi_session_chkready(cls_session))
436 goto exit_is_chap_active;
437
438 if (ddb_entry->chap_tbl_idx == *chap_tbl_idx)
439 ret = 1;
440
441exit_is_chap_active:
442 return ret;
443}
444
445static int qla4xxx_is_chap_active(struct Scsi_Host *shost,
446 uint16_t chap_tbl_idx)
447{
448 int ret = 0;
449
450 ret = device_for_each_child(&shost->shost_gendev, &chap_tbl_idx,
451 __qla4xxx_is_chap_active);
452
453 return ret;
454}
455
456static int qla4xxx_delete_chap(struct Scsi_Host *shost, uint16_t chap_tbl_idx)
457{
458 struct scsi_qla_host *ha = to_qla_host(shost);
459 struct ql4_chap_table *chap_table;
460 dma_addr_t chap_dma;
461 int max_chap_entries = 0;
462 uint32_t offset = 0;
463 uint32_t chap_size;
464 int ret = 0;
465
466 chap_table = dma_pool_alloc(ha->chap_dma_pool, GFP_KERNEL, &chap_dma);
467 if (chap_table == NULL)
468 return -ENOMEM;
469
470 memset(chap_table, 0, sizeof(struct ql4_chap_table));
471
472 if (is_qla8022(ha))
473 max_chap_entries = (ha->hw.flt_chap_size / 2) /
474 sizeof(struct ql4_chap_table);
475 else
476 max_chap_entries = MAX_CHAP_ENTRIES_40XX;
477
478 if (chap_tbl_idx > max_chap_entries) {
479 ret = -EINVAL;
480 goto exit_delete_chap;
481 }
482
483 /* Check if chap index is in use.
484 * If chap is in use don't delet chap entry */
485 ret = qla4xxx_is_chap_active(shost, chap_tbl_idx);
486 if (ret) {
487 ql4_printk(KERN_INFO, ha, "CHAP entry %d is in use, cannot "
488 "delete from flash\n", chap_tbl_idx);
489 ret = -EBUSY;
490 goto exit_delete_chap;
491 }
492
493 chap_size = sizeof(struct ql4_chap_table);
494 if (is_qla40XX(ha))
495 offset = FLASH_CHAP_OFFSET | (chap_tbl_idx * chap_size);
496 else {
497 offset = FLASH_RAW_ACCESS_ADDR + (ha->hw.flt_region_chap << 2);
498 /* flt_chap_size is CHAP table size for both ports
499 * so divide it by 2 to calculate the offset for second port
500 */
501 if (ha->port_num == 1)
502 offset += (ha->hw.flt_chap_size / 2);
503 offset += (chap_tbl_idx * chap_size);
504 }
505
506 ret = qla4xxx_get_flash(ha, chap_dma, offset, chap_size);
507 if (ret != QLA_SUCCESS) {
508 ret = -EINVAL;
509 goto exit_delete_chap;
510 }
511
512 DEBUG2(ql4_printk(KERN_INFO, ha, "Chap Cookie: x%x\n",
513 __le16_to_cpu(chap_table->cookie)));
514
515 if (__le16_to_cpu(chap_table->cookie) != CHAP_VALID_COOKIE) {
516 ql4_printk(KERN_ERR, ha, "No valid chap entry found\n");
517 goto exit_delete_chap;
518 }
519
520 chap_table->cookie = __constant_cpu_to_le16(0xFFFF);
521
522 offset = FLASH_CHAP_OFFSET |
523 (chap_tbl_idx * sizeof(struct ql4_chap_table));
524 ret = qla4xxx_set_flash(ha, chap_dma, offset, chap_size,
525 FLASH_OPT_RMW_COMMIT);
526 if (ret == QLA_SUCCESS && ha->chap_list) {
527 mutex_lock(&ha->chap_sem);
528 /* Update ha chap_list cache */
529 memcpy((struct ql4_chap_table *)ha->chap_list + chap_tbl_idx,
530 chap_table, sizeof(struct ql4_chap_table));
531 mutex_unlock(&ha->chap_sem);
532 }
533 if (ret != QLA_SUCCESS)
534 ret = -EINVAL;
535
536exit_delete_chap:
537 dma_pool_free(ha->chap_dma_pool, chap_table, chap_dma);
538 return ret;
539}
540
258static int qla4xxx_get_iface_param(struct iscsi_iface *iface, 541static int qla4xxx_get_iface_param(struct iscsi_iface *iface,
259 enum iscsi_param_type param_type, 542 enum iscsi_param_type param_type,
260 int param, char *buf) 543 int param, char *buf)
@@ -548,6 +831,43 @@ static enum blk_eh_timer_return qla4xxx_eh_cmd_timed_out(struct scsi_cmnd *sc)
548 return ret; 831 return ret;
549} 832}
550 833
834static void qla4xxx_set_port_speed(struct Scsi_Host *shost)
835{
836 struct scsi_qla_host *ha = to_qla_host(shost);
837 struct iscsi_cls_host *ihost = shost_priv(shost);
838 uint32_t speed = ISCSI_PORT_SPEED_UNKNOWN;
839
840 qla4xxx_get_firmware_state(ha);
841
842 switch (ha->addl_fw_state & 0x0F00) {
843 case FW_ADDSTATE_LINK_SPEED_10MBPS:
844 speed = ISCSI_PORT_SPEED_10MBPS;
845 break;
846 case FW_ADDSTATE_LINK_SPEED_100MBPS:
847 speed = ISCSI_PORT_SPEED_100MBPS;
848 break;
849 case FW_ADDSTATE_LINK_SPEED_1GBPS:
850 speed = ISCSI_PORT_SPEED_1GBPS;
851 break;
852 case FW_ADDSTATE_LINK_SPEED_10GBPS:
853 speed = ISCSI_PORT_SPEED_10GBPS;
854 break;
855 }
856 ihost->port_speed = speed;
857}
858
859static void qla4xxx_set_port_state(struct Scsi_Host *shost)
860{
861 struct scsi_qla_host *ha = to_qla_host(shost);
862 struct iscsi_cls_host *ihost = shost_priv(shost);
863 uint32_t state = ISCSI_PORT_STATE_DOWN;
864
865 if (test_bit(AF_LINK_UP, &ha->flags))
866 state = ISCSI_PORT_STATE_UP;
867
868 ihost->port_state = state;
869}
870
551static int qla4xxx_host_get_param(struct Scsi_Host *shost, 871static int qla4xxx_host_get_param(struct Scsi_Host *shost,
552 enum iscsi_host_param param, char *buf) 872 enum iscsi_host_param param, char *buf)
553{ 873{
@@ -564,6 +884,14 @@ static int qla4xxx_host_get_param(struct Scsi_Host *shost,
564 case ISCSI_HOST_PARAM_INITIATOR_NAME: 884 case ISCSI_HOST_PARAM_INITIATOR_NAME:
565 len = sprintf(buf, "%s\n", ha->name_string); 885 len = sprintf(buf, "%s\n", ha->name_string);
566 break; 886 break;
887 case ISCSI_HOST_PARAM_PORT_STATE:
888 qla4xxx_set_port_state(shost);
889 len = sprintf(buf, "%s\n", iscsi_get_port_state_name(shost));
890 break;
891 case ISCSI_HOST_PARAM_PORT_SPEED:
892 qla4xxx_set_port_speed(shost);
893 len = sprintf(buf, "%s\n", iscsi_get_port_speed_name(shost));
894 break;
567 default: 895 default:
568 return -ENOSYS; 896 return -ENOSYS;
569 } 897 }
@@ -968,6 +1296,41 @@ exit_init_fw_cb:
968 return rval; 1296 return rval;
969} 1297}
970 1298
1299static int qla4xxx_session_get_param(struct iscsi_cls_session *cls_sess,
1300 enum iscsi_param param, char *buf)
1301{
1302 struct iscsi_session *sess = cls_sess->dd_data;
1303 struct ddb_entry *ddb_entry = sess->dd_data;
1304 struct scsi_qla_host *ha = ddb_entry->ha;
1305 int rval, len;
1306 uint16_t idx;
1307
1308 switch (param) {
1309 case ISCSI_PARAM_CHAP_IN_IDX:
1310 rval = qla4xxx_get_chap_index(ha, sess->username_in,
1311 sess->password_in, BIDI_CHAP,
1312 &idx);
1313 if (rval)
1314 return -EINVAL;
1315
1316 len = sprintf(buf, "%hu\n", idx);
1317 break;
1318 case ISCSI_PARAM_CHAP_OUT_IDX:
1319 rval = qla4xxx_get_chap_index(ha, sess->username,
1320 sess->password, LOCAL_CHAP,
1321 &idx);
1322 if (rval)
1323 return -EINVAL;
1324
1325 len = sprintf(buf, "%hu\n", idx);
1326 break;
1327 default:
1328 return iscsi_session_get_param(cls_sess, param, buf);
1329 }
1330
1331 return len;
1332}
1333
971static int qla4xxx_conn_get_param(struct iscsi_cls_conn *cls_conn, 1334static int qla4xxx_conn_get_param(struct iscsi_cls_conn *cls_conn,
972 enum iscsi_param param, char *buf) 1335 enum iscsi_param param, char *buf)
973{ 1336{
@@ -1506,13 +1869,17 @@ static void qla4xxx_copy_fwddb_param(struct scsi_qla_host *ha,
1506{ 1869{
1507 int buflen = 0; 1870 int buflen = 0;
1508 struct iscsi_session *sess; 1871 struct iscsi_session *sess;
1872 struct ddb_entry *ddb_entry;
1509 struct iscsi_conn *conn; 1873 struct iscsi_conn *conn;
1510 char ip_addr[DDB_IPADDR_LEN]; 1874 char ip_addr[DDB_IPADDR_LEN];
1511 uint16_t options = 0; 1875 uint16_t options = 0;
1512 1876
1513 sess = cls_sess->dd_data; 1877 sess = cls_sess->dd_data;
1878 ddb_entry = sess->dd_data;
1514 conn = cls_conn->dd_data; 1879 conn = cls_conn->dd_data;
1515 1880
1881 ddb_entry->chap_tbl_idx = le16_to_cpu(fw_ddb_entry->chap_tbl_idx);
1882
1516 conn->max_recv_dlength = BYTE_UNITS * 1883 conn->max_recv_dlength = BYTE_UNITS *
1517 le16_to_cpu(fw_ddb_entry->iscsi_max_rcv_data_seg_len); 1884 le16_to_cpu(fw_ddb_entry->iscsi_max_rcv_data_seg_len);
1518 1885
@@ -1552,6 +1919,8 @@ static void qla4xxx_copy_fwddb_param(struct scsi_qla_host *ha,
1552 (char *)ha->name_string, buflen); 1919 (char *)ha->name_string, buflen);
1553 iscsi_set_param(cls_conn, ISCSI_PARAM_PERSISTENT_ADDRESS, 1920 iscsi_set_param(cls_conn, ISCSI_PARAM_PERSISTENT_ADDRESS,
1554 (char *)ip_addr, buflen); 1921 (char *)ip_addr, buflen);
1922 iscsi_set_param(cls_conn, ISCSI_PARAM_TARGET_ALIAS,
1923 (char *)fw_ddb_entry->iscsi_alias, buflen);
1555} 1924}
1556 1925
1557void qla4xxx_update_session_conn_fwddb_param(struct scsi_qla_host *ha, 1926void qla4xxx_update_session_conn_fwddb_param(struct scsi_qla_host *ha,
@@ -1638,6 +2007,7 @@ void qla4xxx_update_session_conn_param(struct scsi_qla_host *ha,
1638 le16_to_cpu(fw_ddb_entry->iscsi_def_time2wait); 2007 le16_to_cpu(fw_ddb_entry->iscsi_def_time2wait);
1639 2008
1640 /* Update params */ 2009 /* Update params */
2010 ddb_entry->chap_tbl_idx = le16_to_cpu(fw_ddb_entry->chap_tbl_idx);
1641 conn->max_recv_dlength = BYTE_UNITS * 2011 conn->max_recv_dlength = BYTE_UNITS *
1642 le16_to_cpu(fw_ddb_entry->iscsi_max_rcv_data_seg_len); 2012 le16_to_cpu(fw_ddb_entry->iscsi_max_rcv_data_seg_len);
1643 2013
@@ -1666,6 +2036,9 @@ void qla4xxx_update_session_conn_param(struct scsi_qla_host *ha,
1666 memcpy(sess->initiatorname, ha->name_string, 2036 memcpy(sess->initiatorname, ha->name_string,
1667 min(sizeof(ha->name_string), sizeof(sess->initiatorname))); 2037 min(sizeof(ha->name_string), sizeof(sess->initiatorname)));
1668 2038
2039 iscsi_set_param(cls_conn, ISCSI_PARAM_TARGET_ALIAS,
2040 (char *)fw_ddb_entry->iscsi_alias, 0);
2041
1669exit_session_conn_param: 2042exit_session_conn_param:
1670 if (fw_ddb_entry) 2043 if (fw_ddb_entry)
1671 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), 2044 dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry),
@@ -2113,7 +2486,7 @@ void qla4_8xxx_watchdog(struct scsi_qla_host *ha)
2113 halt_status = qla4_8xxx_rd_32(ha, 2486 halt_status = qla4_8xxx_rd_32(ha,
2114 QLA82XX_PEG_HALT_STATUS1); 2487 QLA82XX_PEG_HALT_STATUS1);
2115 2488
2116 if (LSW(MSB(halt_status)) == 0x67) 2489 if (QLA82XX_FWERROR_CODE(halt_status) == 0x67)
2117 ql4_printk(KERN_ERR, ha, "%s:" 2490 ql4_printk(KERN_ERR, ha, "%s:"
2118 " Firmware aborted with" 2491 " Firmware aborted with"
2119 " error code 0x00006700." 2492 " error code 0x00006700."
@@ -2230,6 +2603,10 @@ static void qla4xxx_timer(struct scsi_qla_host *ha)
2230 } 2603 }
2231 } 2604 }
2232 2605
2606 /* Process any deferred work. */
2607 if (!list_empty(&ha->work_list))
2608 start_dpc++;
2609
2233 /* Wakeup the dpc routine for this adapter, if needed. */ 2610 /* Wakeup the dpc routine for this adapter, if needed. */
2234 if (start_dpc || 2611 if (start_dpc ||
2235 test_bit(DPC_RESET_HA, &ha->dpc_flags) || 2612 test_bit(DPC_RESET_HA, &ha->dpc_flags) ||
@@ -2795,6 +3172,109 @@ void qla4xxx_wake_dpc(struct scsi_qla_host *ha)
2795 queue_work(ha->dpc_thread, &ha->dpc_work); 3172 queue_work(ha->dpc_thread, &ha->dpc_work);
2796} 3173}
2797 3174
3175static struct qla4_work_evt *
3176qla4xxx_alloc_work(struct scsi_qla_host *ha, uint32_t data_size,
3177 enum qla4_work_type type)
3178{
3179 struct qla4_work_evt *e;
3180 uint32_t size = sizeof(struct qla4_work_evt) + data_size;
3181
3182 e = kzalloc(size, GFP_ATOMIC);
3183 if (!e)
3184 return NULL;
3185
3186 INIT_LIST_HEAD(&e->list);
3187 e->type = type;
3188 return e;
3189}
3190
3191static void qla4xxx_post_work(struct scsi_qla_host *ha,
3192 struct qla4_work_evt *e)
3193{
3194 unsigned long flags;
3195
3196 spin_lock_irqsave(&ha->work_lock, flags);
3197 list_add_tail(&e->list, &ha->work_list);
3198 spin_unlock_irqrestore(&ha->work_lock, flags);
3199 qla4xxx_wake_dpc(ha);
3200}
3201
3202int qla4xxx_post_aen_work(struct scsi_qla_host *ha,
3203 enum iscsi_host_event_code aen_code,
3204 uint32_t data_size, uint8_t *data)
3205{
3206 struct qla4_work_evt *e;
3207
3208 e = qla4xxx_alloc_work(ha, data_size, QLA4_EVENT_AEN);
3209 if (!e)
3210 return QLA_ERROR;
3211
3212 e->u.aen.code = aen_code;
3213 e->u.aen.data_size = data_size;
3214 memcpy(e->u.aen.data, data, data_size);
3215
3216 qla4xxx_post_work(ha, e);
3217
3218 return QLA_SUCCESS;
3219}
3220
3221int qla4xxx_post_ping_evt_work(struct scsi_qla_host *ha,
3222 uint32_t status, uint32_t pid,
3223 uint32_t data_size, uint8_t *data)
3224{
3225 struct qla4_work_evt *e;
3226
3227 e = qla4xxx_alloc_work(ha, data_size, QLA4_EVENT_PING_STATUS);
3228 if (!e)
3229 return QLA_ERROR;
3230
3231 e->u.ping.status = status;
3232 e->u.ping.pid = pid;
3233 e->u.ping.data_size = data_size;
3234 memcpy(e->u.ping.data, data, data_size);
3235
3236 qla4xxx_post_work(ha, e);
3237
3238 return QLA_SUCCESS;
3239}
3240
3241static void qla4xxx_do_work(struct scsi_qla_host *ha)
3242{
3243 struct qla4_work_evt *e, *tmp;
3244 unsigned long flags;
3245 LIST_HEAD(work);
3246
3247 spin_lock_irqsave(&ha->work_lock, flags);
3248 list_splice_init(&ha->work_list, &work);
3249 spin_unlock_irqrestore(&ha->work_lock, flags);
3250
3251 list_for_each_entry_safe(e, tmp, &work, list) {
3252 list_del_init(&e->list);
3253
3254 switch (e->type) {
3255 case QLA4_EVENT_AEN:
3256 iscsi_post_host_event(ha->host_no,
3257 &qla4xxx_iscsi_transport,
3258 e->u.aen.code,
3259 e->u.aen.data_size,
3260 e->u.aen.data);
3261 break;
3262 case QLA4_EVENT_PING_STATUS:
3263 iscsi_ping_comp_event(ha->host_no,
3264 &qla4xxx_iscsi_transport,
3265 e->u.ping.status,
3266 e->u.ping.pid,
3267 e->u.ping.data_size,
3268 e->u.ping.data);
3269 break;
3270 default:
3271 ql4_printk(KERN_WARNING, ha, "event type: 0x%x not "
3272 "supported", e->type);
3273 }
3274 kfree(e);
3275 }
3276}
3277
2798/** 3278/**
2799 * qla4xxx_do_dpc - dpc routine 3279 * qla4xxx_do_dpc - dpc routine
2800 * @data: in our case pointer to adapter structure 3280 * @data: in our case pointer to adapter structure
@@ -2826,6 +3306,9 @@ static void qla4xxx_do_dpc(struct work_struct *work)
2826 return; 3306 return;
2827 } 3307 }
2828 3308
3309 /* post events to application */
3310 qla4xxx_do_work(ha);
3311
2829 if (is_qla8022(ha)) { 3312 if (is_qla8022(ha)) {
2830 if (test_bit(DPC_HA_UNRECOVERABLE, &ha->dpc_flags)) { 3313 if (test_bit(DPC_HA_UNRECOVERABLE, &ha->dpc_flags)) {
2831 qla4_8xxx_idc_lock(ha); 3314 qla4_8xxx_idc_lock(ha);
@@ -3341,9 +3824,8 @@ static int get_fw_boot_info(struct scsi_qla_host *ha, uint16_t ddb_index[])
3341 /* Check Boot Mode */ 3824 /* Check Boot Mode */
3342 val = rd_nvram_byte(ha, addr); 3825 val = rd_nvram_byte(ha, addr);
3343 if (!(val & 0x07)) { 3826 if (!(val & 0x07)) {
3344 DEBUG2(ql4_printk(KERN_ERR, ha, 3827 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: Adapter boot "
3345 "%s: Failed Boot options : 0x%x\n", 3828 "options : 0x%x\n", __func__, val));
3346 __func__, val));
3347 ret = QLA_ERROR; 3829 ret = QLA_ERROR;
3348 goto exit_boot_info; 3830 goto exit_boot_info;
3349 } 3831 }
@@ -3388,9 +3870,8 @@ static int get_fw_boot_info(struct scsi_qla_host *ha, uint16_t ddb_index[])
3388 } 3870 }
3389 /* Check Boot Mode */ 3871 /* Check Boot Mode */
3390 if (!(buf[1] & 0x07)) { 3872 if (!(buf[1] & 0x07)) {
3391 DEBUG2(ql4_printk(KERN_INFO, ha, 3873 DEBUG2(ql4_printk(KERN_INFO, ha, "Firmware boot options"
3392 "Failed: Boot options : 0x%x\n", 3874 " : 0x%x\n", buf[1]));
3393 buf[1]));
3394 ret = QLA_ERROR; 3875 ret = QLA_ERROR;
3395 goto exit_boot_info_free; 3876 goto exit_boot_info_free;
3396 } 3877 }
@@ -3411,12 +3892,11 @@ static int get_fw_boot_info(struct scsi_qla_host *ha, uint16_t ddb_index[])
3411 " target ID %d\n", __func__, ddb_index[0], 3892 " target ID %d\n", __func__, ddb_index[0],
3412 ddb_index[1])); 3893 ddb_index[1]));
3413 3894
3414 ha->pri_ddb_idx = ddb_index[0];
3415 ha->sec_ddb_idx = ddb_index[1];
3416
3417exit_boot_info_free: 3895exit_boot_info_free:
3418 dma_free_coherent(&ha->pdev->dev, size, buf, buf_dma); 3896 dma_free_coherent(&ha->pdev->dev, size, buf, buf_dma);
3419exit_boot_info: 3897exit_boot_info:
3898 ha->pri_ddb_idx = ddb_index[0];
3899 ha->sec_ddb_idx = ddb_index[1];
3420 return ret; 3900 return ret;
3421} 3901}
3422 3902
@@ -3497,8 +3977,8 @@ static int qla4xxx_get_boot_target(struct scsi_qla_host *ha,
3497 3977
3498 if (qla4xxx_bootdb_by_index(ha, fw_ddb_entry, 3978 if (qla4xxx_bootdb_by_index(ha, fw_ddb_entry,
3499 fw_ddb_entry_dma, ddb_index)) { 3979 fw_ddb_entry_dma, ddb_index)) {
3500 DEBUG2(ql4_printk(KERN_ERR, ha, 3980 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: No Flash DDB found at "
3501 "%s: Flash DDB read Failed\n", __func__)); 3981 "index [%d]\n", __func__, ddb_index));
3502 ret = QLA_ERROR; 3982 ret = QLA_ERROR;
3503 goto exit_boot_target; 3983 goto exit_boot_target;
3504 } 3984 }
@@ -3576,8 +4056,8 @@ static int qla4xxx_get_boot_info(struct scsi_qla_host *ha)
3576 ddb_index[1] = 0xffff; 4056 ddb_index[1] = 0xffff;
3577 ret = get_fw_boot_info(ha, ddb_index); 4057 ret = get_fw_boot_info(ha, ddb_index);
3578 if (ret != QLA_SUCCESS) { 4058 if (ret != QLA_SUCCESS) {
3579 DEBUG2(ql4_printk(KERN_ERR, ha, 4059 DEBUG2(ql4_printk(KERN_INFO, ha,
3580 "%s: Failed to set boot info.\n", __func__)); 4060 "%s: No boot target configured.\n", __func__));
3581 return ret; 4061 return ret;
3582 } 4062 }
3583 4063
@@ -3590,8 +4070,8 @@ static int qla4xxx_get_boot_info(struct scsi_qla_host *ha)
3590 rval = qla4xxx_get_boot_target(ha, &(ha->boot_tgt.boot_pri_sess), 4070 rval = qla4xxx_get_boot_target(ha, &(ha->boot_tgt.boot_pri_sess),
3591 ddb_index[0]); 4071 ddb_index[0]);
3592 if (rval != QLA_SUCCESS) { 4072 if (rval != QLA_SUCCESS) {
3593 DEBUG2(ql4_printk(KERN_ERR, ha, "%s: Failed to get " 4073 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: Primary boot target not "
3594 "primary target\n", __func__)); 4074 "configured\n", __func__));
3595 } else 4075 } else
3596 ret = QLA_SUCCESS; 4076 ret = QLA_SUCCESS;
3597 4077
@@ -3602,8 +4082,8 @@ sec_target:
3602 rval = qla4xxx_get_boot_target(ha, &(ha->boot_tgt.boot_sec_sess), 4082 rval = qla4xxx_get_boot_target(ha, &(ha->boot_tgt.boot_sec_sess),
3603 ddb_index[1]); 4083 ddb_index[1]);
3604 if (rval != QLA_SUCCESS) { 4084 if (rval != QLA_SUCCESS) {
3605 DEBUG2(ql4_printk(KERN_ERR, ha, "%s: Failed to get " 4085 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: Secondary boot target not"
3606 "secondary target\n", __func__)); 4086 " configured\n", __func__));
3607 } else 4087 } else
3608 ret = QLA_SUCCESS; 4088 ret = QLA_SUCCESS;
3609 4089
@@ -3772,11 +4252,13 @@ static void qla4xxx_convert_param_ddb(struct dev_db_entry *fw_ddb_entry,
3772 sprintf(tddb->ip_addr, "%pI4", fw_ddb_entry->ip_addr); 4252 sprintf(tddb->ip_addr, "%pI4", fw_ddb_entry->ip_addr);
3773 4253
3774 tddb->port = le16_to_cpu(fw_ddb_entry->port); 4254 tddb->port = le16_to_cpu(fw_ddb_entry->port);
4255 memcpy(&tddb->isid[0], &fw_ddb_entry->isid[0], sizeof(tddb->isid));
3775} 4256}
3776 4257
3777static int qla4xxx_compare_tuple_ddb(struct scsi_qla_host *ha, 4258static int qla4xxx_compare_tuple_ddb(struct scsi_qla_host *ha,
3778 struct ql4_tuple_ddb *old_tddb, 4259 struct ql4_tuple_ddb *old_tddb,
3779 struct ql4_tuple_ddb *new_tddb) 4260 struct ql4_tuple_ddb *new_tddb,
4261 uint8_t is_isid_compare)
3780{ 4262{
3781 if (strcmp(old_tddb->iscsi_name, new_tddb->iscsi_name)) 4263 if (strcmp(old_tddb->iscsi_name, new_tddb->iscsi_name))
3782 return QLA_ERROR; 4264 return QLA_ERROR;
@@ -3787,6 +4269,26 @@ static int qla4xxx_compare_tuple_ddb(struct scsi_qla_host *ha,
3787 if (old_tddb->port != new_tddb->port) 4269 if (old_tddb->port != new_tddb->port)
3788 return QLA_ERROR; 4270 return QLA_ERROR;
3789 4271
4272 /* For multi sessions, driver generates the ISID, so do not compare
4273 * ISID in reset path since it would be a comparision between the
4274 * driver generated ISID and firmware generated ISID. This could
4275 * lead to adding duplicated DDBs in the list as driver generated
4276 * ISID would not match firmware generated ISID.
4277 */
4278 if (is_isid_compare) {
4279 DEBUG2(ql4_printk(KERN_INFO, ha, "%s: old ISID [%02x%02x%02x"
4280 "%02x%02x%02x] New ISID [%02x%02x%02x%02x%02x%02x]\n",
4281 __func__, old_tddb->isid[5], old_tddb->isid[4],
4282 old_tddb->isid[3], old_tddb->isid[2], old_tddb->isid[1],
4283 old_tddb->isid[0], new_tddb->isid[5], new_tddb->isid[4],
4284 new_tddb->isid[3], new_tddb->isid[2], new_tddb->isid[1],
4285 new_tddb->isid[0]));
4286
4287 if (memcmp(&old_tddb->isid[0], &new_tddb->isid[0],
4288 sizeof(old_tddb->isid)))
4289 return QLA_ERROR;
4290 }
4291
3790 DEBUG2(ql4_printk(KERN_INFO, ha, 4292 DEBUG2(ql4_printk(KERN_INFO, ha,
3791 "Match Found, fw[%d,%d,%s,%s], [%d,%d,%s,%s]", 4293 "Match Found, fw[%d,%d,%s,%s], [%d,%d,%s,%s]",
3792 old_tddb->port, old_tddb->tpgt, old_tddb->ip_addr, 4294 old_tddb->port, old_tddb->tpgt, old_tddb->ip_addr,
@@ -3829,7 +4331,7 @@ static int qla4xxx_is_session_exists(struct scsi_qla_host *ha,
3829 continue; 4331 continue;
3830 4332
3831 qla4xxx_get_param_ddb(ddb_entry, tmp_tddb); 4333 qla4xxx_get_param_ddb(ddb_entry, tmp_tddb);
3832 if (!qla4xxx_compare_tuple_ddb(ha, fw_tddb, tmp_tddb)) { 4334 if (!qla4xxx_compare_tuple_ddb(ha, fw_tddb, tmp_tddb, false)) {
3833 ret = QLA_SUCCESS; /* found */ 4335 ret = QLA_SUCCESS; /* found */
3834 goto exit_check; 4336 goto exit_check;
3835 } 4337 }
@@ -3872,7 +4374,7 @@ static int qla4xxx_is_flash_ddb_exists(struct scsi_qla_host *ha,
3872 4374
3873 list_for_each_entry_safe(nt_ddb_idx, nt_ddb_idx_tmp, list_nt, list) { 4375 list_for_each_entry_safe(nt_ddb_idx, nt_ddb_idx_tmp, list_nt, list) {
3874 qla4xxx_convert_param_ddb(&nt_ddb_idx->fw_ddb, tmp_tddb); 4376 qla4xxx_convert_param_ddb(&nt_ddb_idx->fw_ddb, tmp_tddb);
3875 if (!qla4xxx_compare_tuple_ddb(ha, fw_tddb, tmp_tddb)) { 4377 if (!qla4xxx_compare_tuple_ddb(ha, fw_tddb, tmp_tddb, true)) {
3876 ret = QLA_SUCCESS; /* found */ 4378 ret = QLA_SUCCESS; /* found */
3877 goto exit_check; 4379 goto exit_check;
3878 } 4380 }
@@ -4038,6 +4540,10 @@ static void qla4xxx_build_st_list(struct scsi_qla_host *ha,
4038 if (ret == QLA_ERROR) 4540 if (ret == QLA_ERROR)
4039 break; 4541 break;
4040 4542
4543 /* Ignore DDB if invalid state (unassigned) */
4544 if (state == DDB_DS_UNASSIGNED)
4545 goto continue_next_st;
4546
4041 /* Check if ST, add to the list_st */ 4547 /* Check if ST, add to the list_st */
4042 if (strlen((char *) fw_ddb_entry->iscsi_name) != 0) 4548 if (strlen((char *) fw_ddb_entry->iscsi_name) != 0)
4043 goto continue_next_st; 4549 goto continue_next_st;
@@ -4397,6 +4903,9 @@ static int __devinit qla4xxx_probe_adapter(struct pci_dev *pdev,
4397 4903
4398 spin_lock_init(&ha->hardware_lock); 4904 spin_lock_init(&ha->hardware_lock);
4399 4905
4906 /* Initialize work list */
4907 INIT_LIST_HEAD(&ha->work_list);
4908
4400 /* Allocate dma buffers */ 4909 /* Allocate dma buffers */
4401 if (qla4xxx_mem_alloc(ha)) { 4910 if (qla4xxx_mem_alloc(ha)) {
4402 ql4_printk(KERN_WARNING, ha, 4911 ql4_printk(KERN_WARNING, ha,
@@ -4524,8 +5033,8 @@ static int __devinit qla4xxx_probe_adapter(struct pci_dev *pdev,
4524 ha->patch_number, ha->build_number); 5033 ha->patch_number, ha->build_number);
4525 5034
4526 if (qla4xxx_setup_boot_info(ha)) 5035 if (qla4xxx_setup_boot_info(ha))
4527 ql4_printk(KERN_ERR, ha, "%s:ISCSI boot info setup failed\n", 5036 ql4_printk(KERN_ERR, ha,
4528 __func__); 5037 "%s: No iSCSI boot target configured\n", __func__);
4529 5038
4530 /* Perform the build ddb list and login to each */ 5039 /* Perform the build ddb list and login to each */
4531 qla4xxx_build_ddb_list(ha, INIT_ADAPTER); 5040 qla4xxx_build_ddb_list(ha, INIT_ADAPTER);
diff --git a/drivers/scsi/qla4xxx/ql4_version.h b/drivers/scsi/qla4xxx/ql4_version.h
index 133989b3a9f4..ede9af944141 100644
--- a/drivers/scsi/qla4xxx/ql4_version.h
+++ b/drivers/scsi/qla4xxx/ql4_version.h
@@ -5,4 +5,4 @@
5 * See LICENSE.qla4xxx for copyright and licensing details. 5 * See LICENSE.qla4xxx for copyright and licensing details.
6 */ 6 */
7 7
8#define QLA4XXX_DRIVER_VERSION "5.02.00-k12" 8#define QLA4XXX_DRIVER_VERSION "5.02.00-k15"
diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c
index 2aeb2e9c4d3b..07322ecff90d 100644
--- a/drivers/scsi/scsi.c
+++ b/drivers/scsi/scsi.c
@@ -782,12 +782,6 @@ static void scsi_done(struct scsi_cmnd *cmd)
782 blk_complete_request(cmd->request); 782 blk_complete_request(cmd->request);
783} 783}
784 784
785/* Move this to a header if it becomes more generally useful */
786static struct scsi_driver *scsi_cmd_to_driver(struct scsi_cmnd *cmd)
787{
788 return *(struct scsi_driver **)cmd->request->rq_disk->private_data;
789}
790
791/** 785/**
792 * scsi_finish_command - cleanup and pass command back to upper layer 786 * scsi_finish_command - cleanup and pass command back to upper layer
793 * @cmd: the command 787 * @cmd: the command
diff --git a/drivers/scsi/scsi_debug.c b/drivers/scsi/scsi_debug.c
index 68da6c092f65..591856131c4e 100644
--- a/drivers/scsi/scsi_debug.c
+++ b/drivers/scsi/scsi_debug.c
@@ -126,6 +126,7 @@ static const char * scsi_debug_version_date = "20100324";
126#define SCSI_DEBUG_OPT_TRANSPORT_ERR 16 126#define SCSI_DEBUG_OPT_TRANSPORT_ERR 16
127#define SCSI_DEBUG_OPT_DIF_ERR 32 127#define SCSI_DEBUG_OPT_DIF_ERR 32
128#define SCSI_DEBUG_OPT_DIX_ERR 64 128#define SCSI_DEBUG_OPT_DIX_ERR 64
129#define SCSI_DEBUG_OPT_MAC_TIMEOUT 128
129/* When "every_nth" > 0 then modulo "every_nth" commands: 130/* When "every_nth" > 0 then modulo "every_nth" commands:
130 * - a no response is simulated if SCSI_DEBUG_OPT_TIMEOUT is set 131 * - a no response is simulated if SCSI_DEBUG_OPT_TIMEOUT is set
131 * - a RECOVERED_ERROR is simulated on successful read and write 132 * - a RECOVERED_ERROR is simulated on successful read and write
@@ -2220,7 +2221,7 @@ static int resp_get_lba_status(struct scsi_cmnd * scmd,
2220 mapped = map_state(lba, &num); 2221 mapped = map_state(lba, &num);
2221 2222
2222 memset(arr, 0, SDEBUG_GET_LBA_STATUS_LEN); 2223 memset(arr, 0, SDEBUG_GET_LBA_STATUS_LEN);
2223 put_unaligned_be32(16, &arr[0]); /* Parameter Data Length */ 2224 put_unaligned_be32(20, &arr[0]); /* Parameter Data Length */
2224 put_unaligned_be64(lba, &arr[8]); /* LBA */ 2225 put_unaligned_be64(lba, &arr[8]); /* LBA */
2225 put_unaligned_be32(num, &arr[16]); /* Number of blocks */ 2226 put_unaligned_be32(num, &arr[16]); /* Number of blocks */
2226 arr[20] = !mapped; /* mapped = 0, unmapped = 1 */ 2227 arr[20] = !mapped; /* mapped = 0, unmapped = 1 */
@@ -3615,6 +3616,9 @@ int scsi_debug_queuecommand_lck(struct scsi_cmnd *SCpnt, done_funct_t done)
3615 scsi_debug_every_nth = -1; 3616 scsi_debug_every_nth = -1;
3616 if (SCSI_DEBUG_OPT_TIMEOUT & scsi_debug_opts) 3617 if (SCSI_DEBUG_OPT_TIMEOUT & scsi_debug_opts)
3617 return 0; /* ignore command causing timeout */ 3618 return 0; /* ignore command causing timeout */
3619 else if (SCSI_DEBUG_OPT_MAC_TIMEOUT & scsi_debug_opts &&
3620 scsi_medium_access_command(SCpnt))
3621 return 0; /* time out reads and writes */
3618 else if (SCSI_DEBUG_OPT_RECOVERED_ERR & scsi_debug_opts) 3622 else if (SCSI_DEBUG_OPT_RECOVERED_ERR & scsi_debug_opts)
3619 inj_recovered = 1; /* to reads and writes below */ 3623 inj_recovered = 1; /* to reads and writes below */
3620 else if (SCSI_DEBUG_OPT_TRANSPORT_ERR & scsi_debug_opts) 3624 else if (SCSI_DEBUG_OPT_TRANSPORT_ERR & scsi_debug_opts)
diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
index 5f84a148eb14..2cfcbffa41fd 100644
--- a/drivers/scsi/scsi_error.c
+++ b/drivers/scsi/scsi_error.c
@@ -30,6 +30,7 @@
30#include <scsi/scsi_cmnd.h> 30#include <scsi/scsi_cmnd.h>
31#include <scsi/scsi_dbg.h> 31#include <scsi/scsi_dbg.h>
32#include <scsi/scsi_device.h> 32#include <scsi/scsi_device.h>
33#include <scsi/scsi_driver.h>
33#include <scsi/scsi_eh.h> 34#include <scsi/scsi_eh.h>
34#include <scsi/scsi_transport.h> 35#include <scsi/scsi_transport.h>
35#include <scsi/scsi_host.h> 36#include <scsi/scsi_host.h>
@@ -141,11 +142,11 @@ enum blk_eh_timer_return scsi_times_out(struct request *req)
141 else if (host->hostt->eh_timed_out) 142 else if (host->hostt->eh_timed_out)
142 rtn = host->hostt->eh_timed_out(scmd); 143 rtn = host->hostt->eh_timed_out(scmd);
143 144
145 scmd->result |= DID_TIME_OUT << 16;
146
144 if (unlikely(rtn == BLK_EH_NOT_HANDLED && 147 if (unlikely(rtn == BLK_EH_NOT_HANDLED &&
145 !scsi_eh_scmd_add(scmd, SCSI_EH_CANCEL_CMD))) { 148 !scsi_eh_scmd_add(scmd, SCSI_EH_CANCEL_CMD)))
146 scmd->result |= DID_TIME_OUT << 16;
147 rtn = BLK_EH_HANDLED; 149 rtn = BLK_EH_HANDLED;
148 }
149 150
150 return rtn; 151 return rtn;
151} 152}
@@ -366,6 +367,14 @@ static int scsi_check_sense(struct scsi_cmnd *scmd)
366 return TARGET_ERROR; 367 return TARGET_ERROR;
367 368
368 case ILLEGAL_REQUEST: 369 case ILLEGAL_REQUEST:
370 if (sshdr.asc == 0x20 || /* Invalid command operation code */
371 sshdr.asc == 0x21 || /* Logical block address out of range */
372 sshdr.asc == 0x24 || /* Invalid field in cdb */
373 sshdr.asc == 0x26) { /* Parameter value invalid */
374 return TARGET_ERROR;
375 }
376 return SUCCESS;
377
369 default: 378 default:
370 return SUCCESS; 379 return SUCCESS;
371 } 380 }
@@ -770,6 +779,7 @@ static int scsi_send_eh_cmnd(struct scsi_cmnd *scmd, unsigned char *cmnd,
770 int cmnd_size, int timeout, unsigned sense_bytes) 779 int cmnd_size, int timeout, unsigned sense_bytes)
771{ 780{
772 struct scsi_device *sdev = scmd->device; 781 struct scsi_device *sdev = scmd->device;
782 struct scsi_driver *sdrv = scsi_cmd_to_driver(scmd);
773 struct Scsi_Host *shost = sdev->host; 783 struct Scsi_Host *shost = sdev->host;
774 DECLARE_COMPLETION_ONSTACK(done); 784 DECLARE_COMPLETION_ONSTACK(done);
775 unsigned long timeleft; 785 unsigned long timeleft;
@@ -824,6 +834,10 @@ static int scsi_send_eh_cmnd(struct scsi_cmnd *scmd, unsigned char *cmnd,
824 } 834 }
825 835
826 scsi_eh_restore_cmnd(scmd, &ses); 836 scsi_eh_restore_cmnd(scmd, &ses);
837
838 if (sdrv->eh_action)
839 rtn = sdrv->eh_action(scmd, cmnd, cmnd_size, rtn);
840
827 return rtn; 841 return rtn;
828} 842}
829 843
@@ -1540,7 +1554,7 @@ int scsi_decide_disposition(struct scsi_cmnd *scmd)
1540 * Need to modify host byte to signal a 1554 * Need to modify host byte to signal a
1541 * permanent target failure 1555 * permanent target failure
1542 */ 1556 */
1543 scmd->result |= (DID_TARGET_FAILURE << 16); 1557 set_host_byte(scmd, DID_TARGET_FAILURE);
1544 rtn = SUCCESS; 1558 rtn = SUCCESS;
1545 } 1559 }
1546 /* if rtn == FAILED, we have no sense information; 1560 /* if rtn == FAILED, we have no sense information;
@@ -1560,7 +1574,7 @@ int scsi_decide_disposition(struct scsi_cmnd *scmd)
1560 case RESERVATION_CONFLICT: 1574 case RESERVATION_CONFLICT:
1561 sdev_printk(KERN_INFO, scmd->device, 1575 sdev_printk(KERN_INFO, scmd->device,
1562 "reservation conflict\n"); 1576 "reservation conflict\n");
1563 scmd->result |= (DID_NEXUS_FAILURE << 16); 1577 set_host_byte(scmd, DID_NEXUS_FAILURE);
1564 return SUCCESS; /* causes immediate i/o error */ 1578 return SUCCESS; /* causes immediate i/o error */
1565 default: 1579 default:
1566 return FAILED; 1580 return FAILED;
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index a33b2b66da67..ead6405f3e51 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -682,11 +682,11 @@ static int __scsi_error_from_host_byte(struct scsi_cmnd *cmd, int result)
682 error = -ENOLINK; 682 error = -ENOLINK;
683 break; 683 break;
684 case DID_TARGET_FAILURE: 684 case DID_TARGET_FAILURE:
685 cmd->result |= (DID_OK << 16); 685 set_host_byte(cmd, DID_OK);
686 error = -EREMOTEIO; 686 error = -EREMOTEIO;
687 break; 687 break;
688 case DID_NEXUS_FAILURE: 688 case DID_NEXUS_FAILURE:
689 cmd->result |= (DID_OK << 16); 689 set_host_byte(cmd, DID_OK);
690 error = -EBADE; 690 error = -EBADE;
691 break; 691 break;
692 default: 692 default:
@@ -880,6 +880,7 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
880 cmd->cmnd[0] == WRITE_SAME)) { 880 cmd->cmnd[0] == WRITE_SAME)) {
881 description = "Discard failure"; 881 description = "Discard failure";
882 action = ACTION_FAIL; 882 action = ACTION_FAIL;
883 error = -EREMOTEIO;
883 } else 884 } else
884 action = ACTION_FAIL; 885 action = ACTION_FAIL;
885 break; 886 break;
diff --git a/drivers/scsi/scsi_transport_fc.c b/drivers/scsi/scsi_transport_fc.c
index f59d4a05ecd7..80fbe2ac0b47 100644
--- a/drivers/scsi/scsi_transport_fc.c
+++ b/drivers/scsi/scsi_transport_fc.c
@@ -313,7 +313,7 @@ static void fc_scsi_scan_rport(struct work_struct *work);
313#define FC_STARGET_NUM_ATTRS 3 313#define FC_STARGET_NUM_ATTRS 3
314#define FC_RPORT_NUM_ATTRS 10 314#define FC_RPORT_NUM_ATTRS 10
315#define FC_VPORT_NUM_ATTRS 9 315#define FC_VPORT_NUM_ATTRS 9
316#define FC_HOST_NUM_ATTRS 22 316#define FC_HOST_NUM_ATTRS 29
317 317
318struct fc_internal { 318struct fc_internal {
319 struct scsi_transport_template t; 319 struct scsi_transport_template t;
@@ -399,6 +399,20 @@ static int fc_host_setup(struct transport_container *tc, struct device *dev,
399 fc_host->max_npiv_vports = 0; 399 fc_host->max_npiv_vports = 0;
400 memset(fc_host->serial_number, 0, 400 memset(fc_host->serial_number, 0,
401 sizeof(fc_host->serial_number)); 401 sizeof(fc_host->serial_number));
402 memset(fc_host->manufacturer, 0,
403 sizeof(fc_host->manufacturer));
404 memset(fc_host->model, 0,
405 sizeof(fc_host->model));
406 memset(fc_host->model_description, 0,
407 sizeof(fc_host->model_description));
408 memset(fc_host->hardware_version, 0,
409 sizeof(fc_host->hardware_version));
410 memset(fc_host->driver_version, 0,
411 sizeof(fc_host->driver_version));
412 memset(fc_host->firmware_version, 0,
413 sizeof(fc_host->firmware_version));
414 memset(fc_host->optionrom_version, 0,
415 sizeof(fc_host->optionrom_version));
402 416
403 fc_host->port_id = -1; 417 fc_host->port_id = -1;
404 fc_host->port_type = FC_PORTTYPE_UNKNOWN; 418 fc_host->port_type = FC_PORTTYPE_UNKNOWN;
@@ -1513,6 +1527,13 @@ fc_private_host_rd_attr_cast(permanent_port_name, "0x%llx\n", 20,
1513fc_private_host_rd_attr(maxframe_size, "%u bytes\n", 20); 1527fc_private_host_rd_attr(maxframe_size, "%u bytes\n", 20);
1514fc_private_host_rd_attr(max_npiv_vports, "%u\n", 20); 1528fc_private_host_rd_attr(max_npiv_vports, "%u\n", 20);
1515fc_private_host_rd_attr(serial_number, "%s\n", (FC_SERIAL_NUMBER_SIZE +1)); 1529fc_private_host_rd_attr(serial_number, "%s\n", (FC_SERIAL_NUMBER_SIZE +1));
1530fc_private_host_rd_attr(manufacturer, "%s\n", FC_SERIAL_NUMBER_SIZE + 1);
1531fc_private_host_rd_attr(model, "%s\n", FC_SYMBOLIC_NAME_SIZE + 1);
1532fc_private_host_rd_attr(model_description, "%s\n", FC_SYMBOLIC_NAME_SIZE + 1);
1533fc_private_host_rd_attr(hardware_version, "%s\n", FC_VERSION_STRING_SIZE + 1);
1534fc_private_host_rd_attr(driver_version, "%s\n", FC_VERSION_STRING_SIZE + 1);
1535fc_private_host_rd_attr(firmware_version, "%s\n", FC_VERSION_STRING_SIZE + 1);
1536fc_private_host_rd_attr(optionrom_version, "%s\n", FC_VERSION_STRING_SIZE + 1);
1516 1537
1517 1538
1518/* Dynamic Host Attributes */ 1539/* Dynamic Host Attributes */
@@ -2208,6 +2229,13 @@ fc_attach_transport(struct fc_function_template *ft)
2208 SETUP_HOST_ATTRIBUTE_RD_NS(npiv_vports_inuse); 2229 SETUP_HOST_ATTRIBUTE_RD_NS(npiv_vports_inuse);
2209 } 2230 }
2210 SETUP_HOST_ATTRIBUTE_RD(serial_number); 2231 SETUP_HOST_ATTRIBUTE_RD(serial_number);
2232 SETUP_HOST_ATTRIBUTE_RD(manufacturer);
2233 SETUP_HOST_ATTRIBUTE_RD(model);
2234 SETUP_HOST_ATTRIBUTE_RD(model_description);
2235 SETUP_HOST_ATTRIBUTE_RD(hardware_version);
2236 SETUP_HOST_ATTRIBUTE_RD(driver_version);
2237 SETUP_HOST_ATTRIBUTE_RD(firmware_version);
2238 SETUP_HOST_ATTRIBUTE_RD(optionrom_version);
2211 2239
2212 SETUP_HOST_ATTRIBUTE_RD(port_id); 2240 SETUP_HOST_ATTRIBUTE_RD(port_id);
2213 SETUP_HOST_ATTRIBUTE_RD(port_type); 2241 SETUP_HOST_ATTRIBUTE_RD(port_type);
diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c
index cfd491437239..fac31730addf 100644
--- a/drivers/scsi/scsi_transport_iscsi.c
+++ b/drivers/scsi/scsi_transport_iscsi.c
@@ -727,10 +727,11 @@ static void iscsi_session_release(struct device *dev)
727 kfree(session); 727 kfree(session);
728} 728}
729 729
730static int iscsi_is_session_dev(const struct device *dev) 730int iscsi_is_session_dev(const struct device *dev)
731{ 731{
732 return dev->release == iscsi_session_release; 732 return dev->release == iscsi_session_release;
733} 733}
734EXPORT_SYMBOL_GPL(iscsi_is_session_dev);
734 735
735static int iscsi_iter_session_fn(struct device *dev, void *data) 736static int iscsi_iter_session_fn(struct device *dev, void *data)
736{ 737{
@@ -1476,6 +1477,66 @@ void iscsi_conn_login_event(struct iscsi_cls_conn *conn,
1476} 1477}
1477EXPORT_SYMBOL_GPL(iscsi_conn_login_event); 1478EXPORT_SYMBOL_GPL(iscsi_conn_login_event);
1478 1479
1480void iscsi_post_host_event(uint32_t host_no, struct iscsi_transport *transport,
1481 enum iscsi_host_event_code code, uint32_t data_size,
1482 uint8_t *data)
1483{
1484 struct nlmsghdr *nlh;
1485 struct sk_buff *skb;
1486 struct iscsi_uevent *ev;
1487 int len = NLMSG_SPACE(sizeof(*ev) + data_size);
1488
1489 skb = alloc_skb(len, GFP_KERNEL);
1490 if (!skb) {
1491 printk(KERN_ERR "gracefully ignored host event (%d):%d OOM\n",
1492 host_no, code);
1493 return;
1494 }
1495
1496 nlh = __nlmsg_put(skb, 0, 0, 0, (len - sizeof(*nlh)), 0);
1497 ev = NLMSG_DATA(nlh);
1498 ev->transport_handle = iscsi_handle(transport);
1499 ev->type = ISCSI_KEVENT_HOST_EVENT;
1500 ev->r.host_event.host_no = host_no;
1501 ev->r.host_event.code = code;
1502 ev->r.host_event.data_size = data_size;
1503
1504 if (data_size)
1505 memcpy((char *)ev + sizeof(*ev), data, data_size);
1506
1507 iscsi_multicast_skb(skb, ISCSI_NL_GRP_ISCSID, GFP_KERNEL);
1508}
1509EXPORT_SYMBOL_GPL(iscsi_post_host_event);
1510
1511void iscsi_ping_comp_event(uint32_t host_no, struct iscsi_transport *transport,
1512 uint32_t status, uint32_t pid, uint32_t data_size,
1513 uint8_t *data)
1514{
1515 struct nlmsghdr *nlh;
1516 struct sk_buff *skb;
1517 struct iscsi_uevent *ev;
1518 int len = NLMSG_SPACE(sizeof(*ev) + data_size);
1519
1520 skb = alloc_skb(len, GFP_KERNEL);
1521 if (!skb) {
1522 printk(KERN_ERR "gracefully ignored ping comp: OOM\n");
1523 return;
1524 }
1525
1526 nlh = __nlmsg_put(skb, 0, 0, 0, (len - sizeof(*nlh)), 0);
1527 ev = NLMSG_DATA(nlh);
1528 ev->transport_handle = iscsi_handle(transport);
1529 ev->type = ISCSI_KEVENT_PING_COMP;
1530 ev->r.ping_comp.host_no = host_no;
1531 ev->r.ping_comp.status = status;
1532 ev->r.ping_comp.pid = pid;
1533 ev->r.ping_comp.data_size = data_size;
1534 memcpy((char *)ev + sizeof(*ev), data, data_size);
1535
1536 iscsi_multicast_skb(skb, ISCSI_NL_GRP_ISCSID, GFP_KERNEL);
1537}
1538EXPORT_SYMBOL_GPL(iscsi_ping_comp_event);
1539
1479static int 1540static int
1480iscsi_if_send_reply(uint32_t group, int seq, int type, int done, int multi, 1541iscsi_if_send_reply(uint32_t group, int seq, int type, int done, int multi,
1481 void *payload, int size) 1542 void *payload, int size)
@@ -1915,6 +1976,123 @@ iscsi_set_iface_params(struct iscsi_transport *transport,
1915} 1976}
1916 1977
1917static int 1978static int
1979iscsi_send_ping(struct iscsi_transport *transport, struct iscsi_uevent *ev)
1980{
1981 struct Scsi_Host *shost;
1982 struct sockaddr *dst_addr;
1983 int err;
1984
1985 if (!transport->send_ping)
1986 return -ENOSYS;
1987
1988 shost = scsi_host_lookup(ev->u.iscsi_ping.host_no);
1989 if (!shost) {
1990 printk(KERN_ERR "iscsi_ping could not find host no %u\n",
1991 ev->u.iscsi_ping.host_no);
1992 return -ENODEV;
1993 }
1994
1995 dst_addr = (struct sockaddr *)((char *)ev + sizeof(*ev));
1996 err = transport->send_ping(shost, ev->u.iscsi_ping.iface_num,
1997 ev->u.iscsi_ping.iface_type,
1998 ev->u.iscsi_ping.payload_size,
1999 ev->u.iscsi_ping.pid,
2000 dst_addr);
2001 scsi_host_put(shost);
2002 return err;
2003}
2004
2005static int
2006iscsi_get_chap(struct iscsi_transport *transport, struct nlmsghdr *nlh)
2007{
2008 struct iscsi_uevent *ev = NLMSG_DATA(nlh);
2009 struct Scsi_Host *shost = NULL;
2010 struct iscsi_chap_rec *chap_rec;
2011 struct iscsi_internal *priv;
2012 struct sk_buff *skbchap;
2013 struct nlmsghdr *nlhchap;
2014 struct iscsi_uevent *evchap;
2015 uint32_t chap_buf_size;
2016 int len, err = 0;
2017 char *buf;
2018
2019 if (!transport->get_chap)
2020 return -EINVAL;
2021
2022 priv = iscsi_if_transport_lookup(transport);
2023 if (!priv)
2024 return -EINVAL;
2025
2026 chap_buf_size = (ev->u.get_chap.num_entries * sizeof(*chap_rec));
2027 len = NLMSG_SPACE(sizeof(*ev) + chap_buf_size);
2028
2029 shost = scsi_host_lookup(ev->u.get_chap.host_no);
2030 if (!shost) {
2031 printk(KERN_ERR "%s: failed. Cound not find host no %u\n",
2032 __func__, ev->u.get_chap.host_no);
2033 return -ENODEV;
2034 }
2035
2036 do {
2037 int actual_size;
2038
2039 skbchap = alloc_skb(len, GFP_KERNEL);
2040 if (!skbchap) {
2041 printk(KERN_ERR "can not deliver chap: OOM\n");
2042 err = -ENOMEM;
2043 goto exit_get_chap;
2044 }
2045
2046 nlhchap = __nlmsg_put(skbchap, 0, 0, 0,
2047 (len - sizeof(*nlhchap)), 0);
2048 evchap = NLMSG_DATA(nlhchap);
2049 memset(evchap, 0, sizeof(*evchap));
2050 evchap->transport_handle = iscsi_handle(transport);
2051 evchap->type = nlh->nlmsg_type;
2052 evchap->u.get_chap.host_no = ev->u.get_chap.host_no;
2053 evchap->u.get_chap.chap_tbl_idx = ev->u.get_chap.chap_tbl_idx;
2054 evchap->u.get_chap.num_entries = ev->u.get_chap.num_entries;
2055 buf = (char *) ((char *)evchap + sizeof(*evchap));
2056 memset(buf, 0, chap_buf_size);
2057
2058 err = transport->get_chap(shost, ev->u.get_chap.chap_tbl_idx,
2059 &evchap->u.get_chap.num_entries, buf);
2060
2061 actual_size = NLMSG_SPACE(sizeof(*ev) + chap_buf_size);
2062 skb_trim(skbchap, NLMSG_ALIGN(actual_size));
2063 nlhchap->nlmsg_len = actual_size;
2064
2065 err = iscsi_multicast_skb(skbchap, ISCSI_NL_GRP_ISCSID,
2066 GFP_KERNEL);
2067 } while (err < 0 && err != -ECONNREFUSED);
2068
2069exit_get_chap:
2070 scsi_host_put(shost);
2071 return err;
2072}
2073
2074static int iscsi_delete_chap(struct iscsi_transport *transport,
2075 struct iscsi_uevent *ev)
2076{
2077 struct Scsi_Host *shost;
2078 int err = 0;
2079
2080 if (!transport->delete_chap)
2081 return -ENOSYS;
2082
2083 shost = scsi_host_lookup(ev->u.delete_chap.host_no);
2084 if (!shost) {
2085 printk(KERN_ERR "%s could not find host no %u\n",
2086 __func__, ev->u.delete_chap.host_no);
2087 return -ENODEV;
2088 }
2089
2090 err = transport->delete_chap(shost, ev->u.delete_chap.chap_tbl_idx);
2091 scsi_host_put(shost);
2092 return err;
2093}
2094
2095static int
1918iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, uint32_t *group) 2096iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, uint32_t *group)
1919{ 2097{
1920 int err = 0; 2098 int err = 0;
@@ -1941,7 +2119,7 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, uint32_t *group)
1941 switch (nlh->nlmsg_type) { 2119 switch (nlh->nlmsg_type) {
1942 case ISCSI_UEVENT_CREATE_SESSION: 2120 case ISCSI_UEVENT_CREATE_SESSION:
1943 err = iscsi_if_create_session(priv, ep, ev, 2121 err = iscsi_if_create_session(priv, ep, ev,
1944 NETLINK_CREDS(skb)->pid, 2122 NETLINK_CB(skb).pid,
1945 ev->u.c_session.initial_cmdsn, 2123 ev->u.c_session.initial_cmdsn,
1946 ev->u.c_session.cmds_max, 2124 ev->u.c_session.cmds_max,
1947 ev->u.c_session.queue_depth); 2125 ev->u.c_session.queue_depth);
@@ -1954,7 +2132,7 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, uint32_t *group)
1954 } 2132 }
1955 2133
1956 err = iscsi_if_create_session(priv, ep, ev, 2134 err = iscsi_if_create_session(priv, ep, ev,
1957 NETLINK_CREDS(skb)->pid, 2135 NETLINK_CB(skb).pid,
1958 ev->u.c_bound_session.initial_cmdsn, 2136 ev->u.c_bound_session.initial_cmdsn,
1959 ev->u.c_bound_session.cmds_max, 2137 ev->u.c_bound_session.cmds_max,
1960 ev->u.c_bound_session.queue_depth); 2138 ev->u.c_bound_session.queue_depth);
@@ -2059,6 +2237,15 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, uint32_t *group)
2059 err = iscsi_set_iface_params(transport, ev, 2237 err = iscsi_set_iface_params(transport, ev,
2060 nlmsg_attrlen(nlh, sizeof(*ev))); 2238 nlmsg_attrlen(nlh, sizeof(*ev)));
2061 break; 2239 break;
2240 case ISCSI_UEVENT_PING:
2241 err = iscsi_send_ping(transport, ev);
2242 break;
2243 case ISCSI_UEVENT_GET_CHAP:
2244 err = iscsi_get_chap(transport, nlh);
2245 break;
2246 case ISCSI_UEVENT_DELETE_CHAP:
2247 err = iscsi_delete_chap(transport, ev);
2248 break;
2062 default: 2249 default:
2063 err = -ENOSYS; 2250 err = -ENOSYS;
2064 break; 2251 break;
@@ -2108,9 +2295,11 @@ iscsi_if_rx(struct sk_buff *skb)
2108 */ 2295 */
2109 if (ev->type == ISCSI_UEVENT_GET_STATS && !err) 2296 if (ev->type == ISCSI_UEVENT_GET_STATS && !err)
2110 break; 2297 break;
2298 if (ev->type == ISCSI_UEVENT_GET_CHAP && !err)
2299 break;
2111 err = iscsi_if_send_reply(group, nlh->nlmsg_seq, 2300 err = iscsi_if_send_reply(group, nlh->nlmsg_seq,
2112 nlh->nlmsg_type, 0, 0, ev, sizeof(*ev)); 2301 nlh->nlmsg_type, 0, 0, ev, sizeof(*ev));
2113 } while (err < 0 && err != -ECONNREFUSED); 2302 } while (err < 0 && err != -ECONNREFUSED && err != -ESRCH);
2114 skb_pull(skb, rlen); 2303 skb_pull(skb, rlen);
2115 } 2304 }
2116 mutex_unlock(&rx_queue_mutex); 2305 mutex_unlock(&rx_queue_mutex);
@@ -2286,6 +2475,8 @@ iscsi_session_attr(username, ISCSI_PARAM_USERNAME, 1);
2286iscsi_session_attr(username_in, ISCSI_PARAM_USERNAME_IN, 1); 2475iscsi_session_attr(username_in, ISCSI_PARAM_USERNAME_IN, 1);
2287iscsi_session_attr(password, ISCSI_PARAM_PASSWORD, 1); 2476iscsi_session_attr(password, ISCSI_PARAM_PASSWORD, 1);
2288iscsi_session_attr(password_in, ISCSI_PARAM_PASSWORD_IN, 1); 2477iscsi_session_attr(password_in, ISCSI_PARAM_PASSWORD_IN, 1);
2478iscsi_session_attr(chap_out_idx, ISCSI_PARAM_CHAP_OUT_IDX, 1);
2479iscsi_session_attr(chap_in_idx, ISCSI_PARAM_CHAP_IN_IDX, 1);
2289iscsi_session_attr(fast_abort, ISCSI_PARAM_FAST_ABORT, 0); 2480iscsi_session_attr(fast_abort, ISCSI_PARAM_FAST_ABORT, 0);
2290iscsi_session_attr(abort_tmo, ISCSI_PARAM_ABORT_TMO, 0); 2481iscsi_session_attr(abort_tmo, ISCSI_PARAM_ABORT_TMO, 0);
2291iscsi_session_attr(lu_reset_tmo, ISCSI_PARAM_LU_RESET_TMO, 0); 2482iscsi_session_attr(lu_reset_tmo, ISCSI_PARAM_LU_RESET_TMO, 0);
@@ -2382,6 +2573,8 @@ static struct attribute *iscsi_session_attrs[] = {
2382 &dev_attr_priv_sess_recovery_tmo.attr, 2573 &dev_attr_priv_sess_recovery_tmo.attr,
2383 &dev_attr_priv_sess_state.attr, 2574 &dev_attr_priv_sess_state.attr,
2384 &dev_attr_priv_sess_creator.attr, 2575 &dev_attr_priv_sess_creator.attr,
2576 &dev_attr_sess_chap_out_idx.attr,
2577 &dev_attr_sess_chap_in_idx.attr,
2385 NULL, 2578 NULL,
2386}; 2579};
2387 2580
@@ -2413,6 +2606,10 @@ static umode_t iscsi_session_attr_is_visible(struct kobject *kobj,
2413 param = ISCSI_PARAM_TARGET_NAME; 2606 param = ISCSI_PARAM_TARGET_NAME;
2414 else if (attr == &dev_attr_sess_tpgt.attr) 2607 else if (attr == &dev_attr_sess_tpgt.attr)
2415 param = ISCSI_PARAM_TPGT; 2608 param = ISCSI_PARAM_TPGT;
2609 else if (attr == &dev_attr_sess_chap_in_idx.attr)
2610 param = ISCSI_PARAM_CHAP_IN_IDX;
2611 else if (attr == &dev_attr_sess_chap_out_idx.attr)
2612 param = ISCSI_PARAM_CHAP_OUT_IDX;
2416 else if (attr == &dev_attr_sess_password.attr) 2613 else if (attr == &dev_attr_sess_password.attr)
2417 param = ISCSI_PARAM_USERNAME; 2614 param = ISCSI_PARAM_USERNAME;
2418 else if (attr == &dev_attr_sess_password_in.attr) 2615 else if (attr == &dev_attr_sess_password_in.attr)
@@ -2476,12 +2673,16 @@ iscsi_host_attr(netdev, ISCSI_HOST_PARAM_NETDEV_NAME);
2476iscsi_host_attr(hwaddress, ISCSI_HOST_PARAM_HWADDRESS); 2673iscsi_host_attr(hwaddress, ISCSI_HOST_PARAM_HWADDRESS);
2477iscsi_host_attr(ipaddress, ISCSI_HOST_PARAM_IPADDRESS); 2674iscsi_host_attr(ipaddress, ISCSI_HOST_PARAM_IPADDRESS);
2478iscsi_host_attr(initiatorname, ISCSI_HOST_PARAM_INITIATOR_NAME); 2675iscsi_host_attr(initiatorname, ISCSI_HOST_PARAM_INITIATOR_NAME);
2676iscsi_host_attr(port_state, ISCSI_HOST_PARAM_PORT_STATE);
2677iscsi_host_attr(port_speed, ISCSI_HOST_PARAM_PORT_SPEED);
2479 2678
2480static struct attribute *iscsi_host_attrs[] = { 2679static struct attribute *iscsi_host_attrs[] = {
2481 &dev_attr_host_netdev.attr, 2680 &dev_attr_host_netdev.attr,
2482 &dev_attr_host_hwaddress.attr, 2681 &dev_attr_host_hwaddress.attr,
2483 &dev_attr_host_ipaddress.attr, 2682 &dev_attr_host_ipaddress.attr,
2484 &dev_attr_host_initiatorname.attr, 2683 &dev_attr_host_initiatorname.attr,
2684 &dev_attr_host_port_state.attr,
2685 &dev_attr_host_port_speed.attr,
2485 NULL, 2686 NULL,
2486}; 2687};
2487 2688
@@ -2501,6 +2702,10 @@ static umode_t iscsi_host_attr_is_visible(struct kobject *kobj,
2501 param = ISCSI_HOST_PARAM_IPADDRESS; 2702 param = ISCSI_HOST_PARAM_IPADDRESS;
2502 else if (attr == &dev_attr_host_initiatorname.attr) 2703 else if (attr == &dev_attr_host_initiatorname.attr)
2503 param = ISCSI_HOST_PARAM_INITIATOR_NAME; 2704 param = ISCSI_HOST_PARAM_INITIATOR_NAME;
2705 else if (attr == &dev_attr_host_port_state.attr)
2706 param = ISCSI_HOST_PARAM_PORT_STATE;
2707 else if (attr == &dev_attr_host_port_speed.attr)
2708 param = ISCSI_HOST_PARAM_PORT_SPEED;
2504 else { 2709 else {
2505 WARN_ONCE(1, "Invalid host attr"); 2710 WARN_ONCE(1, "Invalid host attr");
2506 return 0; 2711 return 0;
@@ -2514,6 +2719,61 @@ static struct attribute_group iscsi_host_group = {
2514 .is_visible = iscsi_host_attr_is_visible, 2719 .is_visible = iscsi_host_attr_is_visible,
2515}; 2720};
2516 2721
2722/* convert iscsi_port_speed values to ascii string name */
2723static const struct {
2724 enum iscsi_port_speed value;
2725 char *name;
2726} iscsi_port_speed_names[] = {
2727 {ISCSI_PORT_SPEED_UNKNOWN, "Unknown" },
2728 {ISCSI_PORT_SPEED_10MBPS, "10 Mbps" },
2729 {ISCSI_PORT_SPEED_100MBPS, "100 Mbps" },
2730 {ISCSI_PORT_SPEED_1GBPS, "1 Gbps" },
2731 {ISCSI_PORT_SPEED_10GBPS, "10 Gbps" },
2732};
2733
2734char *iscsi_get_port_speed_name(struct Scsi_Host *shost)
2735{
2736 int i;
2737 char *speed = "Unknown!";
2738 struct iscsi_cls_host *ihost = shost->shost_data;
2739 uint32_t port_speed = ihost->port_speed;
2740
2741 for (i = 0; i < ARRAY_SIZE(iscsi_port_speed_names); i++) {
2742 if (iscsi_port_speed_names[i].value & port_speed) {
2743 speed = iscsi_port_speed_names[i].name;
2744 break;
2745 }
2746 }
2747 return speed;
2748}
2749EXPORT_SYMBOL_GPL(iscsi_get_port_speed_name);
2750
2751/* convert iscsi_port_state values to ascii string name */
2752static const struct {
2753 enum iscsi_port_state value;
2754 char *name;
2755} iscsi_port_state_names[] = {
2756 {ISCSI_PORT_STATE_DOWN, "LINK DOWN" },
2757 {ISCSI_PORT_STATE_UP, "LINK UP" },
2758};
2759
2760char *iscsi_get_port_state_name(struct Scsi_Host *shost)
2761{
2762 int i;
2763 char *state = "Unknown!";
2764 struct iscsi_cls_host *ihost = shost->shost_data;
2765 uint32_t port_state = ihost->port_state;
2766
2767 for (i = 0; i < ARRAY_SIZE(iscsi_port_state_names); i++) {
2768 if (iscsi_port_state_names[i].value & port_state) {
2769 state = iscsi_port_state_names[i].name;
2770 break;
2771 }
2772 }
2773 return state;
2774}
2775EXPORT_SYMBOL_GPL(iscsi_get_port_state_name);
2776
2517static int iscsi_session_match(struct attribute_container *cont, 2777static int iscsi_session_match(struct attribute_container *cont,
2518 struct device *dev) 2778 struct device *dev)
2519{ 2779{
diff --git a/drivers/scsi/scsi_transport_sas.c b/drivers/scsi/scsi_transport_sas.c
index 9d9330ae4213..f7565fc4f0e3 100644
--- a/drivers/scsi/scsi_transport_sas.c
+++ b/drivers/scsi/scsi_transport_sas.c
@@ -615,6 +615,7 @@ do_sas_phy_reset(struct device *dev, size_t count, int hard_reset)
615 error = i->f->phy_reset(phy, hard_reset); 615 error = i->f->phy_reset(phy, hard_reset);
616 if (error) 616 if (error)
617 return error; 617 return error;
618 phy->enabled = 1;
618 return count; 619 return count;
619}; 620};
620 621
@@ -652,9 +653,21 @@ sas_phy_linkerror_attr(running_disparity_error_count);
652sas_phy_linkerror_attr(loss_of_dword_sync_count); 653sas_phy_linkerror_attr(loss_of_dword_sync_count);
653sas_phy_linkerror_attr(phy_reset_problem_count); 654sas_phy_linkerror_attr(phy_reset_problem_count);
654 655
656static int sas_phy_setup(struct transport_container *tc, struct device *dev,
657 struct device *cdev)
658{
659 struct sas_phy *phy = dev_to_phy(dev);
660 struct Scsi_Host *shost = dev_to_shost(phy->dev.parent);
661 struct sas_internal *i = to_sas_internal(shost->transportt);
662
663 if (i->f->phy_setup)
664 i->f->phy_setup(phy);
665
666 return 0;
667}
655 668
656static DECLARE_TRANSPORT_CLASS(sas_phy_class, 669static DECLARE_TRANSPORT_CLASS(sas_phy_class,
657 "sas_phy", NULL, NULL, NULL); 670 "sas_phy", sas_phy_setup, NULL, NULL);
658 671
659static int sas_phy_match(struct attribute_container *cont, struct device *dev) 672static int sas_phy_match(struct attribute_container *cont, struct device *dev)
660{ 673{
@@ -678,7 +691,11 @@ static int sas_phy_match(struct attribute_container *cont, struct device *dev)
678static void sas_phy_release(struct device *dev) 691static void sas_phy_release(struct device *dev)
679{ 692{
680 struct sas_phy *phy = dev_to_phy(dev); 693 struct sas_phy *phy = dev_to_phy(dev);
694 struct Scsi_Host *shost = dev_to_shost(phy->dev.parent);
695 struct sas_internal *i = to_sas_internal(shost->transportt);
681 696
697 if (i->f->phy_release)
698 i->f->phy_release(phy);
682 put_device(dev->parent); 699 put_device(dev->parent);
683 kfree(phy); 700 kfree(phy);
684} 701}
@@ -1044,6 +1061,29 @@ int scsi_is_sas_port(const struct device *dev)
1044EXPORT_SYMBOL(scsi_is_sas_port); 1061EXPORT_SYMBOL(scsi_is_sas_port);
1045 1062
1046/** 1063/**
1064 * sas_port_get_phy - try to take a reference on a port member
1065 * @port: port to check
1066 */
1067struct sas_phy *sas_port_get_phy(struct sas_port *port)
1068{
1069 struct sas_phy *phy;
1070
1071 mutex_lock(&port->phy_list_mutex);
1072 if (list_empty(&port->phy_list))
1073 phy = NULL;
1074 else {
1075 struct list_head *ent = port->phy_list.next;
1076
1077 phy = list_entry(ent, typeof(*phy), port_siblings);
1078 get_device(&phy->dev);
1079 }
1080 mutex_unlock(&port->phy_list_mutex);
1081
1082 return phy;
1083}
1084EXPORT_SYMBOL(sas_port_get_phy);
1085
1086/**
1047 * sas_port_add_phy - add another phy to a port to form a wide port 1087 * sas_port_add_phy - add another phy to a port to form a wide port
1048 * @port: port to add the phy to 1088 * @port: port to add the phy to
1049 * @phy: phy to add 1089 * @phy: phy to add
@@ -1603,6 +1643,20 @@ sas_rphy_delete(struct sas_rphy *rphy)
1603EXPORT_SYMBOL(sas_rphy_delete); 1643EXPORT_SYMBOL(sas_rphy_delete);
1604 1644
1605/** 1645/**
1646 * sas_rphy_unlink - unlink SAS remote PHY
1647 * @rphy: SAS remote phy to unlink from its parent port
1648 *
1649 * Removes port reference to an rphy
1650 */
1651void sas_rphy_unlink(struct sas_rphy *rphy)
1652{
1653 struct sas_port *parent = dev_to_sas_port(rphy->dev.parent);
1654
1655 parent->rphy = NULL;
1656}
1657EXPORT_SYMBOL(sas_rphy_unlink);
1658
1659/**
1606 * sas_rphy_remove - remove SAS remote PHY 1660 * sas_rphy_remove - remove SAS remote PHY
1607 * @rphy: SAS remote phy to remove 1661 * @rphy: SAS remote phy to remove
1608 * 1662 *
@@ -1612,7 +1666,6 @@ void
1612sas_rphy_remove(struct sas_rphy *rphy) 1666sas_rphy_remove(struct sas_rphy *rphy)
1613{ 1667{
1614 struct device *dev = &rphy->dev; 1668 struct device *dev = &rphy->dev;
1615 struct sas_port *parent = dev_to_sas_port(dev->parent);
1616 1669
1617 switch (rphy->identify.device_type) { 1670 switch (rphy->identify.device_type) {
1618 case SAS_END_DEVICE: 1671 case SAS_END_DEVICE:
@@ -1626,10 +1679,9 @@ sas_rphy_remove(struct sas_rphy *rphy)
1626 break; 1679 break;
1627 } 1680 }
1628 1681
1682 sas_rphy_unlink(rphy);
1629 transport_remove_device(dev); 1683 transport_remove_device(dev);
1630 device_del(dev); 1684 device_del(dev);
1631
1632 parent->rphy = NULL;
1633} 1685}
1634EXPORT_SYMBOL(sas_rphy_remove); 1686EXPORT_SYMBOL(sas_rphy_remove);
1635 1687
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
index d173b90b25e9..09e3df42a402 100644
--- a/drivers/scsi/sd.c
+++ b/drivers/scsi/sd.c
@@ -107,6 +107,7 @@ static int sd_suspend(struct device *, pm_message_t state);
107static int sd_resume(struct device *); 107static int sd_resume(struct device *);
108static void sd_rescan(struct device *); 108static void sd_rescan(struct device *);
109static int sd_done(struct scsi_cmnd *); 109static int sd_done(struct scsi_cmnd *);
110static int sd_eh_action(struct scsi_cmnd *, unsigned char *, int, int);
110static void sd_read_capacity(struct scsi_disk *sdkp, unsigned char *buffer); 111static void sd_read_capacity(struct scsi_disk *sdkp, unsigned char *buffer);
111static void scsi_disk_release(struct device *cdev); 112static void scsi_disk_release(struct device *cdev);
112static void sd_print_sense_hdr(struct scsi_disk *, struct scsi_sense_hdr *); 113static void sd_print_sense_hdr(struct scsi_disk *, struct scsi_sense_hdr *);
@@ -346,6 +347,31 @@ sd_store_provisioning_mode(struct device *dev, struct device_attribute *attr,
346 return count; 347 return count;
347} 348}
348 349
350static ssize_t
351sd_show_max_medium_access_timeouts(struct device *dev,
352 struct device_attribute *attr, char *buf)
353{
354 struct scsi_disk *sdkp = to_scsi_disk(dev);
355
356 return snprintf(buf, 20, "%u\n", sdkp->max_medium_access_timeouts);
357}
358
359static ssize_t
360sd_store_max_medium_access_timeouts(struct device *dev,
361 struct device_attribute *attr,
362 const char *buf, size_t count)
363{
364 struct scsi_disk *sdkp = to_scsi_disk(dev);
365 int err;
366
367 if (!capable(CAP_SYS_ADMIN))
368 return -EACCES;
369
370 err = kstrtouint(buf, 10, &sdkp->max_medium_access_timeouts);
371
372 return err ? err : count;
373}
374
349static struct device_attribute sd_disk_attrs[] = { 375static struct device_attribute sd_disk_attrs[] = {
350 __ATTR(cache_type, S_IRUGO|S_IWUSR, sd_show_cache_type, 376 __ATTR(cache_type, S_IRUGO|S_IWUSR, sd_show_cache_type,
351 sd_store_cache_type), 377 sd_store_cache_type),
@@ -360,6 +386,9 @@ static struct device_attribute sd_disk_attrs[] = {
360 __ATTR(thin_provisioning, S_IRUGO, sd_show_thin_provisioning, NULL), 386 __ATTR(thin_provisioning, S_IRUGO, sd_show_thin_provisioning, NULL),
361 __ATTR(provisioning_mode, S_IRUGO|S_IWUSR, sd_show_provisioning_mode, 387 __ATTR(provisioning_mode, S_IRUGO|S_IWUSR, sd_show_provisioning_mode,
362 sd_store_provisioning_mode), 388 sd_store_provisioning_mode),
389 __ATTR(max_medium_access_timeouts, S_IRUGO|S_IWUSR,
390 sd_show_max_medium_access_timeouts,
391 sd_store_max_medium_access_timeouts),
363 __ATTR_NULL, 392 __ATTR_NULL,
364}; 393};
365 394
@@ -382,6 +411,7 @@ static struct scsi_driver sd_template = {
382 }, 411 },
383 .rescan = sd_rescan, 412 .rescan = sd_rescan,
384 .done = sd_done, 413 .done = sd_done,
414 .eh_action = sd_eh_action,
385}; 415};
386 416
387/* 417/*
@@ -497,6 +527,8 @@ static void sd_config_discard(struct scsi_disk *sdkp, unsigned int mode)
497 max(sdkp->physical_block_size, 527 max(sdkp->physical_block_size,
498 sdkp->unmap_granularity * logical_block_size); 528 sdkp->unmap_granularity * logical_block_size);
499 529
530 sdkp->provisioning_mode = mode;
531
500 switch (mode) { 532 switch (mode) {
501 533
502 case SD_LBP_DISABLE: 534 case SD_LBP_DISABLE:
@@ -524,8 +556,6 @@ static void sd_config_discard(struct scsi_disk *sdkp, unsigned int mode)
524 556
525 q->limits.max_discard_sectors = max_blocks * (logical_block_size >> 9); 557 q->limits.max_discard_sectors = max_blocks * (logical_block_size >> 9);
526 queue_flag_set_unlocked(QUEUE_FLAG_DISCARD, q); 558 queue_flag_set_unlocked(QUEUE_FLAG_DISCARD, q);
527
528 sdkp->provisioning_mode = mode;
529} 559}
530 560
531/** 561/**
@@ -1313,6 +1343,55 @@ static const struct block_device_operations sd_fops = {
1313 .unlock_native_capacity = sd_unlock_native_capacity, 1343 .unlock_native_capacity = sd_unlock_native_capacity,
1314}; 1344};
1315 1345
1346/**
1347 * sd_eh_action - error handling callback
1348 * @scmd: sd-issued command that has failed
1349 * @eh_cmnd: The command that was sent during error handling
1350 * @eh_cmnd_len: Length of eh_cmnd in bytes
1351 * @eh_disp: The recovery disposition suggested by the midlayer
1352 *
1353 * This function is called by the SCSI midlayer upon completion of
1354 * an error handling command (TEST UNIT READY, START STOP UNIT,
1355 * etc.) The command sent to the device by the error handler is
1356 * stored in eh_cmnd. The result of sending the eh command is
1357 * passed in eh_disp.
1358 **/
1359static int sd_eh_action(struct scsi_cmnd *scmd, unsigned char *eh_cmnd,
1360 int eh_cmnd_len, int eh_disp)
1361{
1362 struct scsi_disk *sdkp = scsi_disk(scmd->request->rq_disk);
1363
1364 if (!scsi_device_online(scmd->device) ||
1365 !scsi_medium_access_command(scmd))
1366 return eh_disp;
1367
1368 /*
1369 * The device has timed out executing a medium access command.
1370 * However, the TEST UNIT READY command sent during error
1371 * handling completed successfully. Either the device is in the
1372 * process of recovering or has it suffered an internal failure
1373 * that prevents access to the storage medium.
1374 */
1375 if (host_byte(scmd->result) == DID_TIME_OUT && eh_disp == SUCCESS &&
1376 eh_cmnd_len && eh_cmnd[0] == TEST_UNIT_READY)
1377 sdkp->medium_access_timed_out++;
1378
1379 /*
1380 * If the device keeps failing read/write commands but TEST UNIT
1381 * READY always completes successfully we assume that medium
1382 * access is no longer possible and take the device offline.
1383 */
1384 if (sdkp->medium_access_timed_out >= sdkp->max_medium_access_timeouts) {
1385 scmd_printk(KERN_ERR, scmd,
1386 "Medium access timeout failure. Offlining disk!\n");
1387 scsi_device_set_state(scmd->device, SDEV_OFFLINE);
1388
1389 return FAILED;
1390 }
1391
1392 return eh_disp;
1393}
1394
1316static unsigned int sd_completed_bytes(struct scsi_cmnd *scmd) 1395static unsigned int sd_completed_bytes(struct scsi_cmnd *scmd)
1317{ 1396{
1318 u64 start_lba = blk_rq_pos(scmd->request); 1397 u64 start_lba = blk_rq_pos(scmd->request);
@@ -1402,6 +1481,8 @@ static int sd_done(struct scsi_cmnd *SCpnt)
1402 (!sense_valid || sense_deferred)) 1481 (!sense_valid || sense_deferred))
1403 goto out; 1482 goto out;
1404 1483
1484 sdkp->medium_access_timed_out = 0;
1485
1405 switch (sshdr.sense_key) { 1486 switch (sshdr.sense_key) {
1406 case HARDWARE_ERROR: 1487 case HARDWARE_ERROR:
1407 case MEDIUM_ERROR: 1488 case MEDIUM_ERROR:
@@ -2523,6 +2604,7 @@ static void sd_probe_async(void *data, async_cookie_t cookie)
2523 sdkp->RCD = 0; 2604 sdkp->RCD = 0;
2524 sdkp->ATO = 0; 2605 sdkp->ATO = 0;
2525 sdkp->first_scan = 1; 2606 sdkp->first_scan = 1;
2607 sdkp->max_medium_access_timeouts = SD_MAX_MEDIUM_TIMEOUTS;
2526 2608
2527 sd_revalidate_disk(gd); 2609 sd_revalidate_disk(gd);
2528 2610
diff --git a/drivers/scsi/sd.h b/drivers/scsi/sd.h
index 4163f2910e3d..f703f4827b6f 100644
--- a/drivers/scsi/sd.h
+++ b/drivers/scsi/sd.h
@@ -20,6 +20,7 @@
20 */ 20 */
21#define SD_MAX_RETRIES 5 21#define SD_MAX_RETRIES 5
22#define SD_PASSTHROUGH_RETRIES 1 22#define SD_PASSTHROUGH_RETRIES 1
23#define SD_MAX_MEDIUM_TIMEOUTS 2
23 24
24/* 25/*
25 * Size of the initial data buffer for mode and read capacity data 26 * Size of the initial data buffer for mode and read capacity data
@@ -59,6 +60,8 @@ struct scsi_disk {
59 u32 unmap_alignment; 60 u32 unmap_alignment;
60 u32 index; 61 u32 index;
61 unsigned int physical_block_size; 62 unsigned int physical_block_size;
63 unsigned int max_medium_access_timeouts;
64 unsigned int medium_access_timed_out;
62 u8 media_present; 65 u8 media_present;
63 u8 write_prot; 66 u8 write_prot;
64 u8 protection_type;/* Data Integrity Field */ 67 u8 protection_type;/* Data Integrity Field */
@@ -88,6 +91,38 @@ static inline struct scsi_disk *scsi_disk(struct gendisk *disk)
88 (sdsk)->disk->disk_name, ##a) : \ 91 (sdsk)->disk->disk_name, ##a) : \
89 sdev_printk(prefix, (sdsk)->device, fmt, ##a) 92 sdev_printk(prefix, (sdsk)->device, fmt, ##a)
90 93
94static inline int scsi_medium_access_command(struct scsi_cmnd *scmd)
95{
96 switch (scmd->cmnd[0]) {
97 case READ_6:
98 case READ_10:
99 case READ_12:
100 case READ_16:
101 case SYNCHRONIZE_CACHE:
102 case VERIFY:
103 case VERIFY_12:
104 case VERIFY_16:
105 case WRITE_6:
106 case WRITE_10:
107 case WRITE_12:
108 case WRITE_16:
109 case WRITE_SAME:
110 case WRITE_SAME_16:
111 case UNMAP:
112 return 1;
113 case VARIABLE_LENGTH_CMD:
114 switch (scmd->cmnd[9]) {
115 case READ_32:
116 case VERIFY_32:
117 case WRITE_32:
118 case WRITE_SAME_32:
119 return 1;
120 }
121 }
122
123 return 0;
124}
125
91/* 126/*
92 * A DIF-capable target device can be formatted with different 127 * A DIF-capable target device can be formatted with different
93 * protection schemes. Currently 0 through 3 are defined: 128 * protection schemes. Currently 0 through 3 are defined:
diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c
index 9b28f39bac26..9262cdfa4b23 100644
--- a/drivers/scsi/st.c
+++ b/drivers/scsi/st.c
@@ -1177,6 +1177,7 @@ static int check_tape(struct scsi_tape *STp, struct file *filp)
1177static int st_open(struct inode *inode, struct file *filp) 1177static int st_open(struct inode *inode, struct file *filp)
1178{ 1178{
1179 int i, retval = (-EIO); 1179 int i, retval = (-EIO);
1180 int resumed = 0;
1180 struct scsi_tape *STp; 1181 struct scsi_tape *STp;
1181 struct st_partstat *STps; 1182 struct st_partstat *STps;
1182 int dev = TAPE_NR(inode); 1183 int dev = TAPE_NR(inode);
@@ -1211,6 +1212,11 @@ static int st_open(struct inode *inode, struct file *filp)
1211 write_unlock(&st_dev_arr_lock); 1212 write_unlock(&st_dev_arr_lock);
1212 STp->rew_at_close = STp->autorew_dev = (iminor(inode) & 0x80) == 0; 1213 STp->rew_at_close = STp->autorew_dev = (iminor(inode) & 0x80) == 0;
1213 1214
1215 if (scsi_autopm_get_device(STp->device) < 0) {
1216 retval = -EIO;
1217 goto err_out;
1218 }
1219 resumed = 1;
1214 if (!scsi_block_when_processing_errors(STp->device)) { 1220 if (!scsi_block_when_processing_errors(STp->device)) {
1215 retval = (-ENXIO); 1221 retval = (-ENXIO);
1216 goto err_out; 1222 goto err_out;
@@ -1258,6 +1264,8 @@ static int st_open(struct inode *inode, struct file *filp)
1258 normalize_buffer(STp->buffer); 1264 normalize_buffer(STp->buffer);
1259 STp->in_use = 0; 1265 STp->in_use = 0;
1260 scsi_tape_put(STp); 1266 scsi_tape_put(STp);
1267 if (resumed)
1268 scsi_autopm_put_device(STp->device);
1261 mutex_unlock(&st_mutex); 1269 mutex_unlock(&st_mutex);
1262 return retval; 1270 return retval;
1263 1271
@@ -1391,6 +1399,7 @@ static int st_release(struct inode *inode, struct file *filp)
1391 write_lock(&st_dev_arr_lock); 1399 write_lock(&st_dev_arr_lock);
1392 STp->in_use = 0; 1400 STp->in_use = 0;
1393 write_unlock(&st_dev_arr_lock); 1401 write_unlock(&st_dev_arr_lock);
1402 scsi_autopm_put_device(STp->device);
1394 scsi_tape_put(STp); 1403 scsi_tape_put(STp);
1395 1404
1396 return result; 1405 return result;
@@ -4154,6 +4163,7 @@ static int st_probe(struct device *dev)
4154 if (error) 4163 if (error)
4155 goto out_free_tape; 4164 goto out_free_tape;
4156 } 4165 }
4166 scsi_autopm_put_device(SDp);
4157 4167
4158 sdev_printk(KERN_NOTICE, SDp, 4168 sdev_printk(KERN_NOTICE, SDp,
4159 "Attached scsi tape %s\n", tape_name(tpnt)); 4169 "Attached scsi tape %s\n", tape_name(tpnt));
@@ -4201,6 +4211,7 @@ static int st_remove(struct device *dev)
4201 struct scsi_tape *tpnt; 4211 struct scsi_tape *tpnt;
4202 int i, j, mode; 4212 int i, j, mode;
4203 4213
4214 scsi_autopm_get_device(SDp);
4204 write_lock(&st_dev_arr_lock); 4215 write_lock(&st_dev_arr_lock);
4205 for (i = 0; i < st_dev_max; i++) { 4216 for (i = 0; i < st_dev_max; i++) {
4206 tpnt = scsi_tapes[i]; 4217 tpnt = scsi_tapes[i];
diff --git a/drivers/scsi/virtio_scsi.c b/drivers/scsi/virtio_scsi.c
new file mode 100644
index 000000000000..efccd72c4a3e
--- /dev/null
+++ b/drivers/scsi/virtio_scsi.c
@@ -0,0 +1,594 @@
1/*
2 * Virtio SCSI HBA driver
3 *
4 * Copyright IBM Corp. 2010
5 * Copyright Red Hat, Inc. 2011
6 *
7 * Authors:
8 * Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
9 * Paolo Bonzini <pbonzini@redhat.com>
10 *
11 * This work is licensed under the terms of the GNU GPL, version 2 or later.
12 * See the COPYING file in the top-level directory.
13 *
14 */
15
16#include <linux/module.h>
17#include <linux/slab.h>
18#include <linux/mempool.h>
19#include <linux/virtio.h>
20#include <linux/virtio_ids.h>
21#include <linux/virtio_config.h>
22#include <linux/virtio_scsi.h>
23#include <scsi/scsi_host.h>
24#include <scsi/scsi_device.h>
25#include <scsi/scsi_cmnd.h>
26
27#define VIRTIO_SCSI_MEMPOOL_SZ 64
28
29/* Command queue element */
30struct virtio_scsi_cmd {
31 struct scsi_cmnd *sc;
32 struct completion *comp;
33 union {
34 struct virtio_scsi_cmd_req cmd;
35 struct virtio_scsi_ctrl_tmf_req tmf;
36 struct virtio_scsi_ctrl_an_req an;
37 } req;
38 union {
39 struct virtio_scsi_cmd_resp cmd;
40 struct virtio_scsi_ctrl_tmf_resp tmf;
41 struct virtio_scsi_ctrl_an_resp an;
42 struct virtio_scsi_event evt;
43 } resp;
44} ____cacheline_aligned_in_smp;
45
46/* Driver instance state */
47struct virtio_scsi {
48 /* Protects ctrl_vq, req_vq and sg[] */
49 spinlock_t vq_lock;
50
51 struct virtio_device *vdev;
52 struct virtqueue *ctrl_vq;
53 struct virtqueue *event_vq;
54 struct virtqueue *req_vq;
55
56 /* For sglist construction when adding commands to the virtqueue. */
57 struct scatterlist sg[];
58};
59
60static struct kmem_cache *virtscsi_cmd_cache;
61static mempool_t *virtscsi_cmd_pool;
62
63static inline struct Scsi_Host *virtio_scsi_host(struct virtio_device *vdev)
64{
65 return vdev->priv;
66}
67
68static void virtscsi_compute_resid(struct scsi_cmnd *sc, u32 resid)
69{
70 if (!resid)
71 return;
72
73 if (!scsi_bidi_cmnd(sc)) {
74 scsi_set_resid(sc, resid);
75 return;
76 }
77
78 scsi_in(sc)->resid = min(resid, scsi_in(sc)->length);
79 scsi_out(sc)->resid = resid - scsi_in(sc)->resid;
80}
81
82/**
83 * virtscsi_complete_cmd - finish a scsi_cmd and invoke scsi_done
84 *
85 * Called with vq_lock held.
86 */
87static void virtscsi_complete_cmd(void *buf)
88{
89 struct virtio_scsi_cmd *cmd = buf;
90 struct scsi_cmnd *sc = cmd->sc;
91 struct virtio_scsi_cmd_resp *resp = &cmd->resp.cmd;
92
93 dev_dbg(&sc->device->sdev_gendev,
94 "cmd %p response %u status %#02x sense_len %u\n",
95 sc, resp->response, resp->status, resp->sense_len);
96
97 sc->result = resp->status;
98 virtscsi_compute_resid(sc, resp->resid);
99 switch (resp->response) {
100 case VIRTIO_SCSI_S_OK:
101 set_host_byte(sc, DID_OK);
102 break;
103 case VIRTIO_SCSI_S_OVERRUN:
104 set_host_byte(sc, DID_ERROR);
105 break;
106 case VIRTIO_SCSI_S_ABORTED:
107 set_host_byte(sc, DID_ABORT);
108 break;
109 case VIRTIO_SCSI_S_BAD_TARGET:
110 set_host_byte(sc, DID_BAD_TARGET);
111 break;
112 case VIRTIO_SCSI_S_RESET:
113 set_host_byte(sc, DID_RESET);
114 break;
115 case VIRTIO_SCSI_S_BUSY:
116 set_host_byte(sc, DID_BUS_BUSY);
117 break;
118 case VIRTIO_SCSI_S_TRANSPORT_FAILURE:
119 set_host_byte(sc, DID_TRANSPORT_DISRUPTED);
120 break;
121 case VIRTIO_SCSI_S_TARGET_FAILURE:
122 set_host_byte(sc, DID_TARGET_FAILURE);
123 break;
124 case VIRTIO_SCSI_S_NEXUS_FAILURE:
125 set_host_byte(sc, DID_NEXUS_FAILURE);
126 break;
127 default:
128 scmd_printk(KERN_WARNING, sc, "Unknown response %d",
129 resp->response);
130 /* fall through */
131 case VIRTIO_SCSI_S_FAILURE:
132 set_host_byte(sc, DID_ERROR);
133 break;
134 }
135
136 WARN_ON(resp->sense_len > VIRTIO_SCSI_SENSE_SIZE);
137 if (sc->sense_buffer) {
138 memcpy(sc->sense_buffer, resp->sense,
139 min_t(u32, resp->sense_len, VIRTIO_SCSI_SENSE_SIZE));
140 if (resp->sense_len)
141 set_driver_byte(sc, DRIVER_SENSE);
142 }
143
144 mempool_free(cmd, virtscsi_cmd_pool);
145 sc->scsi_done(sc);
146}
147
148static void virtscsi_vq_done(struct virtqueue *vq, void (*fn)(void *buf))
149{
150 struct Scsi_Host *sh = virtio_scsi_host(vq->vdev);
151 struct virtio_scsi *vscsi = shost_priv(sh);
152 void *buf;
153 unsigned long flags;
154 unsigned int len;
155
156 spin_lock_irqsave(&vscsi->vq_lock, flags);
157
158 do {
159 virtqueue_disable_cb(vq);
160 while ((buf = virtqueue_get_buf(vq, &len)) != NULL)
161 fn(buf);
162 } while (!virtqueue_enable_cb(vq));
163
164 spin_unlock_irqrestore(&vscsi->vq_lock, flags);
165}
166
167static void virtscsi_req_done(struct virtqueue *vq)
168{
169 virtscsi_vq_done(vq, virtscsi_complete_cmd);
170};
171
172static void virtscsi_complete_free(void *buf)
173{
174 struct virtio_scsi_cmd *cmd = buf;
175
176 if (cmd->comp)
177 complete_all(cmd->comp);
178 mempool_free(cmd, virtscsi_cmd_pool);
179}
180
181static void virtscsi_ctrl_done(struct virtqueue *vq)
182{
183 virtscsi_vq_done(vq, virtscsi_complete_free);
184};
185
186static void virtscsi_event_done(struct virtqueue *vq)
187{
188 virtscsi_vq_done(vq, virtscsi_complete_free);
189};
190
191static void virtscsi_map_sgl(struct scatterlist *sg, unsigned int *p_idx,
192 struct scsi_data_buffer *sdb)
193{
194 struct sg_table *table = &sdb->table;
195 struct scatterlist *sg_elem;
196 unsigned int idx = *p_idx;
197 int i;
198
199 for_each_sg(table->sgl, sg_elem, table->nents, i)
200 sg_set_buf(&sg[idx++], sg_virt(sg_elem), sg_elem->length);
201
202 *p_idx = idx;
203}
204
205/**
206 * virtscsi_map_cmd - map a scsi_cmd to a virtqueue scatterlist
207 * @vscsi : virtio_scsi state
208 * @cmd : command structure
209 * @out_num : number of read-only elements
210 * @in_num : number of write-only elements
211 * @req_size : size of the request buffer
212 * @resp_size : size of the response buffer
213 *
214 * Called with vq_lock held.
215 */
216static void virtscsi_map_cmd(struct virtio_scsi *vscsi,
217 struct virtio_scsi_cmd *cmd,
218 unsigned *out_num, unsigned *in_num,
219 size_t req_size, size_t resp_size)
220{
221 struct scsi_cmnd *sc = cmd->sc;
222 struct scatterlist *sg = vscsi->sg;
223 unsigned int idx = 0;
224
225 if (sc) {
226 struct Scsi_Host *shost = virtio_scsi_host(vscsi->vdev);
227 BUG_ON(scsi_sg_count(sc) > shost->sg_tablesize);
228
229 /* TODO: check feature bit and fail if unsupported? */
230 BUG_ON(sc->sc_data_direction == DMA_BIDIRECTIONAL);
231 }
232
233 /* Request header. */
234 sg_set_buf(&sg[idx++], &cmd->req, req_size);
235
236 /* Data-out buffer. */
237 if (sc && sc->sc_data_direction != DMA_FROM_DEVICE)
238 virtscsi_map_sgl(sg, &idx, scsi_out(sc));
239
240 *out_num = idx;
241
242 /* Response header. */
243 sg_set_buf(&sg[idx++], &cmd->resp, resp_size);
244
245 /* Data-in buffer */
246 if (sc && sc->sc_data_direction != DMA_TO_DEVICE)
247 virtscsi_map_sgl(sg, &idx, scsi_in(sc));
248
249 *in_num = idx - *out_num;
250}
251
252static int virtscsi_kick_cmd(struct virtio_scsi *vscsi, struct virtqueue *vq,
253 struct virtio_scsi_cmd *cmd,
254 size_t req_size, size_t resp_size, gfp_t gfp)
255{
256 unsigned int out_num, in_num;
257 unsigned long flags;
258 int ret;
259
260 spin_lock_irqsave(&vscsi->vq_lock, flags);
261
262 virtscsi_map_cmd(vscsi, cmd, &out_num, &in_num, req_size, resp_size);
263
264 ret = virtqueue_add_buf(vq, vscsi->sg, out_num, in_num, cmd, gfp);
265 if (ret >= 0)
266 virtqueue_kick(vq);
267
268 spin_unlock_irqrestore(&vscsi->vq_lock, flags);
269 return ret;
270}
271
272static int virtscsi_queuecommand(struct Scsi_Host *sh, struct scsi_cmnd *sc)
273{
274 struct virtio_scsi *vscsi = shost_priv(sh);
275 struct virtio_scsi_cmd *cmd;
276 int ret;
277
278 dev_dbg(&sc->device->sdev_gendev,
279 "cmd %p CDB: %#02x\n", sc, sc->cmnd[0]);
280
281 ret = SCSI_MLQUEUE_HOST_BUSY;
282 cmd = mempool_alloc(virtscsi_cmd_pool, GFP_ATOMIC);
283 if (!cmd)
284 goto out;
285
286 memset(cmd, 0, sizeof(*cmd));
287 cmd->sc = sc;
288 cmd->req.cmd = (struct virtio_scsi_cmd_req){
289 .lun[0] = 1,
290 .lun[1] = sc->device->id,
291 .lun[2] = (sc->device->lun >> 8) | 0x40,
292 .lun[3] = sc->device->lun & 0xff,
293 .tag = (unsigned long)sc,
294 .task_attr = VIRTIO_SCSI_S_SIMPLE,
295 .prio = 0,
296 .crn = 0,
297 };
298
299 BUG_ON(sc->cmd_len > VIRTIO_SCSI_CDB_SIZE);
300 memcpy(cmd->req.cmd.cdb, sc->cmnd, sc->cmd_len);
301
302 if (virtscsi_kick_cmd(vscsi, vscsi->req_vq, cmd,
303 sizeof cmd->req.cmd, sizeof cmd->resp.cmd,
304 GFP_ATOMIC) >= 0)
305 ret = 0;
306
307out:
308 return ret;
309}
310
311static int virtscsi_tmf(struct virtio_scsi *vscsi, struct virtio_scsi_cmd *cmd)
312{
313 DECLARE_COMPLETION_ONSTACK(comp);
314 int ret;
315
316 cmd->comp = &comp;
317 ret = virtscsi_kick_cmd(vscsi, vscsi->ctrl_vq, cmd,
318 sizeof cmd->req.tmf, sizeof cmd->resp.tmf,
319 GFP_NOIO);
320 if (ret < 0)
321 return FAILED;
322
323 wait_for_completion(&comp);
324 if (cmd->resp.tmf.response != VIRTIO_SCSI_S_OK &&
325 cmd->resp.tmf.response != VIRTIO_SCSI_S_FUNCTION_SUCCEEDED)
326 return FAILED;
327
328 return SUCCESS;
329}
330
331static int virtscsi_device_reset(struct scsi_cmnd *sc)
332{
333 struct virtio_scsi *vscsi = shost_priv(sc->device->host);
334 struct virtio_scsi_cmd *cmd;
335
336 sdev_printk(KERN_INFO, sc->device, "device reset\n");
337 cmd = mempool_alloc(virtscsi_cmd_pool, GFP_NOIO);
338 if (!cmd)
339 return FAILED;
340
341 memset(cmd, 0, sizeof(*cmd));
342 cmd->sc = sc;
343 cmd->req.tmf = (struct virtio_scsi_ctrl_tmf_req){
344 .type = VIRTIO_SCSI_T_TMF,
345 .subtype = VIRTIO_SCSI_T_TMF_LOGICAL_UNIT_RESET,
346 .lun[0] = 1,
347 .lun[1] = sc->device->id,
348 .lun[2] = (sc->device->lun >> 8) | 0x40,
349 .lun[3] = sc->device->lun & 0xff,
350 };
351 return virtscsi_tmf(vscsi, cmd);
352}
353
354static int virtscsi_abort(struct scsi_cmnd *sc)
355{
356 struct virtio_scsi *vscsi = shost_priv(sc->device->host);
357 struct virtio_scsi_cmd *cmd;
358
359 scmd_printk(KERN_INFO, sc, "abort\n");
360 cmd = mempool_alloc(virtscsi_cmd_pool, GFP_NOIO);
361 if (!cmd)
362 return FAILED;
363
364 memset(cmd, 0, sizeof(*cmd));
365 cmd->sc = sc;
366 cmd->req.tmf = (struct virtio_scsi_ctrl_tmf_req){
367 .type = VIRTIO_SCSI_T_TMF,
368 .subtype = VIRTIO_SCSI_T_TMF_ABORT_TASK,
369 .lun[0] = 1,
370 .lun[1] = sc->device->id,
371 .lun[2] = (sc->device->lun >> 8) | 0x40,
372 .lun[3] = sc->device->lun & 0xff,
373 .tag = (unsigned long)sc,
374 };
375 return virtscsi_tmf(vscsi, cmd);
376}
377
378static struct scsi_host_template virtscsi_host_template = {
379 .module = THIS_MODULE,
380 .name = "Virtio SCSI HBA",
381 .proc_name = "virtio_scsi",
382 .queuecommand = virtscsi_queuecommand,
383 .this_id = -1,
384 .eh_abort_handler = virtscsi_abort,
385 .eh_device_reset_handler = virtscsi_device_reset,
386
387 .can_queue = 1024,
388 .dma_boundary = UINT_MAX,
389 .use_clustering = ENABLE_CLUSTERING,
390};
391
392#define virtscsi_config_get(vdev, fld) \
393 ({ \
394 typeof(((struct virtio_scsi_config *)0)->fld) __val; \
395 vdev->config->get(vdev, \
396 offsetof(struct virtio_scsi_config, fld), \
397 &__val, sizeof(__val)); \
398 __val; \
399 })
400
401#define virtscsi_config_set(vdev, fld, val) \
402 (void)({ \
403 typeof(((struct virtio_scsi_config *)0)->fld) __val = (val); \
404 vdev->config->set(vdev, \
405 offsetof(struct virtio_scsi_config, fld), \
406 &__val, sizeof(__val)); \
407 })
408
409static int virtscsi_init(struct virtio_device *vdev,
410 struct virtio_scsi *vscsi)
411{
412 int err;
413 struct virtqueue *vqs[3];
414 vq_callback_t *callbacks[] = {
415 virtscsi_ctrl_done,
416 virtscsi_event_done,
417 virtscsi_req_done
418 };
419 const char *names[] = {
420 "control",
421 "event",
422 "request"
423 };
424
425 /* Discover virtqueues and write information to configuration. */
426 err = vdev->config->find_vqs(vdev, 3, vqs, callbacks, names);
427 if (err)
428 return err;
429
430 vscsi->ctrl_vq = vqs[0];
431 vscsi->event_vq = vqs[1];
432 vscsi->req_vq = vqs[2];
433
434 virtscsi_config_set(vdev, cdb_size, VIRTIO_SCSI_CDB_SIZE);
435 virtscsi_config_set(vdev, sense_size, VIRTIO_SCSI_SENSE_SIZE);
436 return 0;
437}
438
439static int __devinit virtscsi_probe(struct virtio_device *vdev)
440{
441 struct Scsi_Host *shost;
442 struct virtio_scsi *vscsi;
443 int err;
444 u32 sg_elems;
445 u32 cmd_per_lun;
446
447 /* We need to know how many segments before we allocate.
448 * We need an extra sg elements at head and tail.
449 */
450 sg_elems = virtscsi_config_get(vdev, seg_max) ?: 1;
451
452 /* Allocate memory and link the structs together. */
453 shost = scsi_host_alloc(&virtscsi_host_template,
454 sizeof(*vscsi) + sizeof(vscsi->sg[0]) * (sg_elems + 2));
455
456 if (!shost)
457 return -ENOMEM;
458
459 shost->sg_tablesize = sg_elems;
460 vscsi = shost_priv(shost);
461 vscsi->vdev = vdev;
462 vdev->priv = shost;
463
464 /* Random initializations. */
465 spin_lock_init(&vscsi->vq_lock);
466 sg_init_table(vscsi->sg, sg_elems + 2);
467
468 err = virtscsi_init(vdev, vscsi);
469 if (err)
470 goto virtscsi_init_failed;
471
472 cmd_per_lun = virtscsi_config_get(vdev, cmd_per_lun) ?: 1;
473 shost->cmd_per_lun = min_t(u32, cmd_per_lun, shost->can_queue);
474 shost->max_sectors = virtscsi_config_get(vdev, max_sectors) ?: 0xFFFF;
475 shost->max_lun = virtscsi_config_get(vdev, max_lun) + 1;
476 shost->max_id = virtscsi_config_get(vdev, max_target) + 1;
477 shost->max_channel = 0;
478 shost->max_cmd_len = VIRTIO_SCSI_CDB_SIZE;
479 err = scsi_add_host(shost, &vdev->dev);
480 if (err)
481 goto scsi_add_host_failed;
482
483 scsi_scan_host(shost);
484
485 return 0;
486
487scsi_add_host_failed:
488 vdev->config->del_vqs(vdev);
489virtscsi_init_failed:
490 scsi_host_put(shost);
491 return err;
492}
493
494static void virtscsi_remove_vqs(struct virtio_device *vdev)
495{
496 /* Stop all the virtqueues. */
497 vdev->config->reset(vdev);
498
499 vdev->config->del_vqs(vdev);
500}
501
502static void __devexit virtscsi_remove(struct virtio_device *vdev)
503{
504 struct Scsi_Host *shost = virtio_scsi_host(vdev);
505
506 scsi_remove_host(shost);
507
508 virtscsi_remove_vqs(vdev);
509 scsi_host_put(shost);
510}
511
512#ifdef CONFIG_PM
513static int virtscsi_freeze(struct virtio_device *vdev)
514{
515 virtscsi_remove_vqs(vdev);
516 return 0;
517}
518
519static int virtscsi_restore(struct virtio_device *vdev)
520{
521 struct Scsi_Host *sh = virtio_scsi_host(vdev);
522 struct virtio_scsi *vscsi = shost_priv(sh);
523
524 return virtscsi_init(vdev, vscsi);
525}
526#endif
527
528static struct virtio_device_id id_table[] = {
529 { VIRTIO_ID_SCSI, VIRTIO_DEV_ANY_ID },
530 { 0 },
531};
532
533static struct virtio_driver virtio_scsi_driver = {
534 .driver.name = KBUILD_MODNAME,
535 .driver.owner = THIS_MODULE,
536 .id_table = id_table,
537 .probe = virtscsi_probe,
538#ifdef CONFIG_PM
539 .freeze = virtscsi_freeze,
540 .restore = virtscsi_restore,
541#endif
542 .remove = __devexit_p(virtscsi_remove),
543};
544
545static int __init init(void)
546{
547 int ret = -ENOMEM;
548
549 virtscsi_cmd_cache = KMEM_CACHE(virtio_scsi_cmd, 0);
550 if (!virtscsi_cmd_cache) {
551 printk(KERN_ERR "kmem_cache_create() for "
552 "virtscsi_cmd_cache failed\n");
553 goto error;
554 }
555
556
557 virtscsi_cmd_pool =
558 mempool_create_slab_pool(VIRTIO_SCSI_MEMPOOL_SZ,
559 virtscsi_cmd_cache);
560 if (!virtscsi_cmd_pool) {
561 printk(KERN_ERR "mempool_create() for"
562 "virtscsi_cmd_pool failed\n");
563 goto error;
564 }
565 ret = register_virtio_driver(&virtio_scsi_driver);
566 if (ret < 0)
567 goto error;
568
569 return 0;
570
571error:
572 if (virtscsi_cmd_pool) {
573 mempool_destroy(virtscsi_cmd_pool);
574 virtscsi_cmd_pool = NULL;
575 }
576 if (virtscsi_cmd_cache) {
577 kmem_cache_destroy(virtscsi_cmd_cache);
578 virtscsi_cmd_cache = NULL;
579 }
580 return ret;
581}
582
583static void __exit fini(void)
584{
585 unregister_virtio_driver(&virtio_scsi_driver);
586 mempool_destroy(virtscsi_cmd_pool);
587 kmem_cache_destroy(virtscsi_cmd_cache);
588}
589module_init(init);
590module_exit(fini);
591
592MODULE_DEVICE_TABLE(virtio, id_table);
593MODULE_DESCRIPTION("Virtio SCSI HBA driver");
594MODULE_LICENSE("GPL");