[PATCH 3/6] qla2xxx: Enable target mode support for ISP83xx.

2013-01-30 Thread Saurav Kashyap
From: Arun Easi arun.e...@qlogic.com

Signed-off-by: Arun Easi arun.e...@qlogic.com
Signed-off-by: Saurav Kashyap saurav.kash...@qlogic.com
---
 drivers/scsi/qla2xxx/qla_dbg.c|2 +-
 drivers/scsi/qla2xxx/qla_def.h|8 ++
 drivers/scsi/qla2xxx/qla_fw.h |3 +-
 drivers/scsi/qla2xxx/qla_init.c   |6 +-
 drivers/scsi/qla2xxx/qla_isr.c|   16 +++-
 drivers/scsi/qla2xxx/qla_os.c |4 +
 drivers/scsi/qla2xxx/qla_target.c |  159 +
 drivers/scsi/qla2xxx/qla_target.h |   14 +++-
 8 files changed, 187 insertions(+), 25 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_dbg.c b/drivers/scsi/qla2xxx/qla_dbg.c
index f7cdd25..e690d05 100644
--- a/drivers/scsi/qla2xxx/qla_dbg.c
+++ b/drivers/scsi/qla2xxx/qla_dbg.c
@@ -39,7 +39,7 @@
  * | MultiQ   |   0xc00c   |   |
  * | Misc |   0xd010   |   |
  * | Target Mode |   0xe06f   ||
- * | Target Mode Management  |   0xf071   ||
+ * | Target Mode Management  |   0xf072   ||
  * | Target Mode Task Management  |  0x1000b  ||
  * --
  */
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index 06c6271..b5fc478 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -537,6 +537,8 @@ struct device_reg_25xxmq {
uint32_t req_q_out;
uint32_t rsp_q_in;
uint32_t rsp_q_out;
+   uint32_t atio_q_in;
+   uint32_t atio_q_out;
 };
 
 typedef union {
@@ -563,6 +565,9 @@ typedef union {
 (reg)-u.isp2100.mailbox5 : \
 (reg)-u.isp2300.rsp_q_out)
 
+#define ISP_ATIO_Q_IN(vha) (vha-hw-tgt.atio_q_in)
+#define ISP_ATIO_Q_OUT(vha) (vha-hw-tgt.atio_q_out)
+
 #define MAILBOX_REG(ha, reg, num) \
(IS_QLA2100(ha) || IS_QLA2200(ha) ? \
 (num  8 ? \
@@ -2559,6 +2564,8 @@ struct qlt_hw_data {
struct atio *atio_ring_ptr; /* Current address. */
uint16_t atio_ring_index; /* Current index. */
uint16_t atio_q_length;
+   uint32_t __iomem *atio_q_in;
+   uint32_t __iomem *atio_q_out;
 
void *target_lport_ptr;
struct qla_tgt_func_tmpl *tgt_ops;
@@ -2790,6 +2797,7 @@ struct qla_hw_data {
 #define IS_PI_SPLIT_DET_CAPABLE_HBA(ha)(IS_QLA83XX(ha))
 #define IS_PI_SPLIT_DET_CAPABLE(ha)(IS_PI_SPLIT_DET_CAPABLE_HBA(ha)  \
 (((ha)-fw_attributes_h  16 | (ha)-fw_attributes)  BIT_22))
+#define IS_ATIO_MSIX_CAPABLE(ha) (IS_QLA83XX(ha))
 
/* HBA serial number */
uint8_t serial0;
diff --git a/drivers/scsi/qla2xxx/qla_fw.h b/drivers/scsi/qla2xxx/qla_fw.h
index be6d61a..7105d5e 100644
--- a/drivers/scsi/qla2xxx/qla_fw.h
+++ b/drivers/scsi/qla2xxx/qla_fw.h
@@ -300,7 +300,8 @@ struct init_cb_24xx {
uint32_t prio_request_q_address[2];
 
uint16_t msix;
-   uint8_t reserved_2[6];
+   uint16_t msix_atio;
+   uint8_t reserved_2[4];
 
uint16_t atio_q_inpointer;
uint16_t atio_q_length;
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index 81e8cca..a581c85 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -1964,7 +1964,7 @@ qla24xx_config_rings(struct scsi_qla_host *vha)
WRT_REG_DWORD(reg-isp24.rsp_q_in, 0);
WRT_REG_DWORD(reg-isp24.rsp_q_out, 0);
}
-   qlt_24xx_config_rings(vha, reg);
+   qlt_24xx_config_rings(vha);
 
/* PCI posting */
RD_REG_DWORD(ioreg-hccr);
@@ -5579,6 +5579,8 @@ qla81xx_nvram_config(scsi_qla_host_t *vha)
if (IS_T10_PI_CAPABLE(ha))
nv-frame_payload_size = ~7;
 
+   qlt_81xx_config_nvram_stage1(vha, nv);
+
/* Reset Initialization control block */
memset(icb, 0, ha-init_cb_size);
 
@@ -5619,6 +5621,8 @@ qla81xx_nvram_config(scsi_qla_host_t *vha)
qla2x00_set_model_info(vha, nv-model_name, sizeof(nv-model_name),
QLE8XXX);
 
+   qlt_81xx_config_nvram_stage2(vha, icb);
+
/* Use alternate WWN? */
if (nv-host_p  __constant_cpu_to_le32(BIT_15)) {
memcpy(icb-node_name, nv-alternate_node_name, WWN_SIZE);
diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c
index 1b192c8..26a3086 100644
--- a/drivers/scsi/qla2xxx/qla_isr.c
+++ b/drivers/scsi/qla2xxx/qla_isr.c
@@ -13,6 +13,8 @@
 #include scsi/scsi_bsg_fc.h
 #include scsi/scsi_eh.h
 
+#include qla_target.h
+
 static void qla2x00_mbx_completion(scsi_qla_host_t *, uint16_t);
 static void qla2x00_process_completed_request(struct scsi_qla_host *,
struct req_que *, uint32_t);
@@ -2751,6 +2753,12 @@ static struct qla_init_msix_entry 
qla82xx_msix_entries[2] = {
{ qla2xxx (rsp_q), qla82xx_msix_rsp_q },
 };
 
+static struct qla_init_msix_entry 

Re: [PATCH 3/6] qla2xxx: Enable target mode support for ISP83xx.

2012-12-08 Thread Nicholas A. Bellinger
Hi Saurav, Arun  Co,

Very exciting to see this code submitted to linux-scsi for-3.8

On Fri, 2012-12-07 at 02:30 -0500, Saurav Kashyap wrote:
 From: Arun Easi arun.e...@qlogic.com
 
 Signed-off-by: Arun Easi arun.e...@qlogic.com
 Signed-off-by: Saurav Kashyap saurav.kash...@qlogic.com
 ---
  drivers/scsi/qla2xxx/qla_dbg.c|2 +-
  drivers/scsi/qla2xxx/qla_def.h|8 ++
  drivers/scsi/qla2xxx/qla_fw.h |3 +-
  drivers/scsi/qla2xxx/qla_init.c   |6 +-
  drivers/scsi/qla2xxx/qla_isr.c|   16 +++-
  drivers/scsi/qla2xxx/qla_os.c |4 +
  drivers/scsi/qla2xxx/qla_target.c |  159 
 +
  drivers/scsi/qla2xxx/qla_target.h |   14 +++-
  8 files changed, 187 insertions(+), 25 deletions(-)
 

For the 83xx target LLD specific pieces:

Acked-by: Nicholas Bellinger n...@linux-iscsi.org

Thank you!

 diff --git a/drivers/scsi/qla2xxx/qla_dbg.c b/drivers/scsi/qla2xxx/qla_dbg.c
 index f7cdd25..e690d05 100644
 --- a/drivers/scsi/qla2xxx/qla_dbg.c
 +++ b/drivers/scsi/qla2xxx/qla_dbg.c
 @@ -39,7 +39,7 @@
   * | MultiQ   |   0xc00c   | |
   * | Misc |   0xd010   | |
   * | Target Mode   |   0xe06f   ||
 - * | Target Mode Management|   0xf071   ||
 + * | Target Mode Management|   0xf072   ||
   * | Target Mode Task Management  |0x1000b  ||
   * --
   */
 diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
 index 06c6271..b5fc478 100644
 --- a/drivers/scsi/qla2xxx/qla_def.h
 +++ b/drivers/scsi/qla2xxx/qla_def.h
 @@ -537,6 +537,8 @@ struct device_reg_25xxmq {
   uint32_t req_q_out;
   uint32_t rsp_q_in;
   uint32_t rsp_q_out;
 + uint32_t atio_q_in;
 + uint32_t atio_q_out;
  };
  
  typedef union {
 @@ -563,6 +565,9 @@ typedef union {
(reg)-u.isp2100.mailbox5 : \
(reg)-u.isp2300.rsp_q_out)
  
 +#define ISP_ATIO_Q_IN(vha) (vha-hw-tgt.atio_q_in)
 +#define ISP_ATIO_Q_OUT(vha) (vha-hw-tgt.atio_q_out)
 +
  #define MAILBOX_REG(ha, reg, num) \
   (IS_QLA2100(ha) || IS_QLA2200(ha) ? \
(num  8 ? \
 @@ -2559,6 +2564,8 @@ struct qlt_hw_data {
   struct atio *atio_ring_ptr; /* Current address. */
   uint16_t atio_ring_index; /* Current index. */
   uint16_t atio_q_length;
 + uint32_t __iomem *atio_q_in;
 + uint32_t __iomem *atio_q_out;
  
   void *target_lport_ptr;
   struct qla_tgt_func_tmpl *tgt_ops;
 @@ -2790,6 +2797,7 @@ struct qla_hw_data {
  #define IS_PI_SPLIT_DET_CAPABLE_HBA(ha)  (IS_QLA83XX(ha))
  #define IS_PI_SPLIT_DET_CAPABLE(ha)  (IS_PI_SPLIT_DET_CAPABLE_HBA(ha)  \
  (((ha)-fw_attributes_h  16 | (ha)-fw_attributes)  BIT_22))
 +#define IS_ATIO_MSIX_CAPABLE(ha) (IS_QLA83XX(ha))
  
   /* HBA serial number */
   uint8_t serial0;
 diff --git a/drivers/scsi/qla2xxx/qla_fw.h b/drivers/scsi/qla2xxx/qla_fw.h
 index be6d61a..7105d5e 100644
 --- a/drivers/scsi/qla2xxx/qla_fw.h
 +++ b/drivers/scsi/qla2xxx/qla_fw.h
 @@ -300,7 +300,8 @@ struct init_cb_24xx {
   uint32_t prio_request_q_address[2];
  
   uint16_t msix;
 - uint8_t reserved_2[6];
 + uint16_t msix_atio;
 + uint8_t reserved_2[4];
  
   uint16_t atio_q_inpointer;
   uint16_t atio_q_length;
 diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
 index 81e8cca..a581c85 100644
 --- a/drivers/scsi/qla2xxx/qla_init.c
 +++ b/drivers/scsi/qla2xxx/qla_init.c
 @@ -1964,7 +1964,7 @@ qla24xx_config_rings(struct scsi_qla_host *vha)
   WRT_REG_DWORD(reg-isp24.rsp_q_in, 0);
   WRT_REG_DWORD(reg-isp24.rsp_q_out, 0);
   }
 - qlt_24xx_config_rings(vha, reg);
 + qlt_24xx_config_rings(vha);
  
   /* PCI posting */
   RD_REG_DWORD(ioreg-hccr);
 @@ -5579,6 +5579,8 @@ qla81xx_nvram_config(scsi_qla_host_t *vha)
   if (IS_T10_PI_CAPABLE(ha))
   nv-frame_payload_size = ~7;
  
 + qlt_81xx_config_nvram_stage1(vha, nv);
 +
   /* Reset Initialization control block */
   memset(icb, 0, ha-init_cb_size);
  
 @@ -5619,6 +5621,8 @@ qla81xx_nvram_config(scsi_qla_host_t *vha)
   qla2x00_set_model_info(vha, nv-model_name, sizeof(nv-model_name),
   QLE8XXX);
  
 + qlt_81xx_config_nvram_stage2(vha, icb);
 +
   /* Use alternate WWN? */
   if (nv-host_p  __constant_cpu_to_le32(BIT_15)) {
   memcpy(icb-node_name, nv-alternate_node_name, WWN_SIZE);
 diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c
 index 1b192c8..26a3086 100644
 --- a/drivers/scsi/qla2xxx/qla_isr.c
 +++ b/drivers/scsi/qla2xxx/qla_isr.c
 @@ -13,6 +13,8 @@
  #include scsi/scsi_bsg_fc.h
  #include scsi/scsi_eh.h
  
 +#include qla_target.h
 +
  static void qla2x00_mbx_completion(scsi_qla_host_t *, uint16_t);
  static void 

[PATCH 3/6] qla2xxx: Enable target mode support for ISP83xx.

2012-12-06 Thread Saurav Kashyap
From: Arun Easi arun.e...@qlogic.com

Signed-off-by: Arun Easi arun.e...@qlogic.com
Signed-off-by: Saurav Kashyap saurav.kash...@qlogic.com
---
 drivers/scsi/qla2xxx/qla_dbg.c|2 +-
 drivers/scsi/qla2xxx/qla_def.h|8 ++
 drivers/scsi/qla2xxx/qla_fw.h |3 +-
 drivers/scsi/qla2xxx/qla_init.c   |6 +-
 drivers/scsi/qla2xxx/qla_isr.c|   16 +++-
 drivers/scsi/qla2xxx/qla_os.c |4 +
 drivers/scsi/qla2xxx/qla_target.c |  159 +
 drivers/scsi/qla2xxx/qla_target.h |   14 +++-
 8 files changed, 187 insertions(+), 25 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_dbg.c b/drivers/scsi/qla2xxx/qla_dbg.c
index f7cdd25..e690d05 100644
--- a/drivers/scsi/qla2xxx/qla_dbg.c
+++ b/drivers/scsi/qla2xxx/qla_dbg.c
@@ -39,7 +39,7 @@
  * | MultiQ   |   0xc00c   |   |
  * | Misc |   0xd010   |   |
  * | Target Mode |   0xe06f   ||
- * | Target Mode Management  |   0xf071   ||
+ * | Target Mode Management  |   0xf072   ||
  * | Target Mode Task Management  |  0x1000b  ||
  * --
  */
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index 06c6271..b5fc478 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -537,6 +537,8 @@ struct device_reg_25xxmq {
uint32_t req_q_out;
uint32_t rsp_q_in;
uint32_t rsp_q_out;
+   uint32_t atio_q_in;
+   uint32_t atio_q_out;
 };
 
 typedef union {
@@ -563,6 +565,9 @@ typedef union {
 (reg)-u.isp2100.mailbox5 : \
 (reg)-u.isp2300.rsp_q_out)
 
+#define ISP_ATIO_Q_IN(vha) (vha-hw-tgt.atio_q_in)
+#define ISP_ATIO_Q_OUT(vha) (vha-hw-tgt.atio_q_out)
+
 #define MAILBOX_REG(ha, reg, num) \
(IS_QLA2100(ha) || IS_QLA2200(ha) ? \
 (num  8 ? \
@@ -2559,6 +2564,8 @@ struct qlt_hw_data {
struct atio *atio_ring_ptr; /* Current address. */
uint16_t atio_ring_index; /* Current index. */
uint16_t atio_q_length;
+   uint32_t __iomem *atio_q_in;
+   uint32_t __iomem *atio_q_out;
 
void *target_lport_ptr;
struct qla_tgt_func_tmpl *tgt_ops;
@@ -2790,6 +2797,7 @@ struct qla_hw_data {
 #define IS_PI_SPLIT_DET_CAPABLE_HBA(ha)(IS_QLA83XX(ha))
 #define IS_PI_SPLIT_DET_CAPABLE(ha)(IS_PI_SPLIT_DET_CAPABLE_HBA(ha)  \
 (((ha)-fw_attributes_h  16 | (ha)-fw_attributes)  BIT_22))
+#define IS_ATIO_MSIX_CAPABLE(ha) (IS_QLA83XX(ha))
 
/* HBA serial number */
uint8_t serial0;
diff --git a/drivers/scsi/qla2xxx/qla_fw.h b/drivers/scsi/qla2xxx/qla_fw.h
index be6d61a..7105d5e 100644
--- a/drivers/scsi/qla2xxx/qla_fw.h
+++ b/drivers/scsi/qla2xxx/qla_fw.h
@@ -300,7 +300,8 @@ struct init_cb_24xx {
uint32_t prio_request_q_address[2];
 
uint16_t msix;
-   uint8_t reserved_2[6];
+   uint16_t msix_atio;
+   uint8_t reserved_2[4];
 
uint16_t atio_q_inpointer;
uint16_t atio_q_length;
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index 81e8cca..a581c85 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -1964,7 +1964,7 @@ qla24xx_config_rings(struct scsi_qla_host *vha)
WRT_REG_DWORD(reg-isp24.rsp_q_in, 0);
WRT_REG_DWORD(reg-isp24.rsp_q_out, 0);
}
-   qlt_24xx_config_rings(vha, reg);
+   qlt_24xx_config_rings(vha);
 
/* PCI posting */
RD_REG_DWORD(ioreg-hccr);
@@ -5579,6 +5579,8 @@ qla81xx_nvram_config(scsi_qla_host_t *vha)
if (IS_T10_PI_CAPABLE(ha))
nv-frame_payload_size = ~7;
 
+   qlt_81xx_config_nvram_stage1(vha, nv);
+
/* Reset Initialization control block */
memset(icb, 0, ha-init_cb_size);
 
@@ -5619,6 +5621,8 @@ qla81xx_nvram_config(scsi_qla_host_t *vha)
qla2x00_set_model_info(vha, nv-model_name, sizeof(nv-model_name),
QLE8XXX);
 
+   qlt_81xx_config_nvram_stage2(vha, icb);
+
/* Use alternate WWN? */
if (nv-host_p  __constant_cpu_to_le32(BIT_15)) {
memcpy(icb-node_name, nv-alternate_node_name, WWN_SIZE);
diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c
index 1b192c8..26a3086 100644
--- a/drivers/scsi/qla2xxx/qla_isr.c
+++ b/drivers/scsi/qla2xxx/qla_isr.c
@@ -13,6 +13,8 @@
 #include scsi/scsi_bsg_fc.h
 #include scsi/scsi_eh.h
 
+#include qla_target.h
+
 static void qla2x00_mbx_completion(scsi_qla_host_t *, uint16_t);
 static void qla2x00_process_completed_request(struct scsi_qla_host *,
struct req_que *, uint32_t);
@@ -2751,6 +2753,12 @@ static struct qla_init_msix_entry 
qla82xx_msix_entries[2] = {
{ qla2xxx (rsp_q), qla82xx_msix_rsp_q },
 };
 
+static struct qla_init_msix_entry