* [PATCH 1/8] be2iscsi: Fix handling timed out MBX completion from FW
@ 2014-01-29 7:16 Jayamohan Kallickal
2014-01-29 7:16 ` [PATCH 2/8] be2iscsi: Fix port speed typo in driver Jayamohan Kallickal
` (7 more replies)
0 siblings, 8 replies; 12+ messages in thread
From: Jayamohan Kallickal @ 2014-01-29 7:16 UTC (permalink / raw)
To: jbottomley, linux-scsi, michaelc; +Cc: Jayamohan Kallickal, John Soni Jose
From: Jayamohan Kallickal <jayamohan.kallickal@emulex.com>
When an MBX command timeout happens,the resources associated with
the MBX command were freed. If FW were to give the response to
host after the timeout value set by driver then driver crashes as the MBX Cmd
resources were already freed.
This patch fixes this issue by maintaing a state flag for each of
the MBX command posted/timedout/completed.
Signed-off-by: John Soni Jose <sony.john-n@emulex.com>
Signed-off-by: Jayamohan Kallickal <jayamohan.kallickal@emulex.com>
---
drivers/scsi/be2iscsi/be.h | 10 +++++
drivers/scsi/be2iscsi/be_cmds.c | 90 ++++++++++++++++++++++++++++++----------
drivers/scsi/be2iscsi/be_cmds.h | 3 +-
drivers/scsi/be2iscsi/be_iscsi.c | 10 +++--
drivers/scsi/be2iscsi/be_main.c | 27 ++++++++----
drivers/scsi/be2iscsi/be_mgmt.c | 22 +++++-----
6 files changed, 117 insertions(+), 45 deletions(-)
diff --git a/drivers/scsi/be2iscsi/be.h b/drivers/scsi/be2iscsi/be.h
index 2e28f6c..23c73fe 100644
--- a/drivers/scsi/be2iscsi/be.h
+++ b/drivers/scsi/be2iscsi/be.h
@@ -98,6 +98,14 @@ struct be_mcc_obj {
struct be_queue_info cq;
};
+struct beiscsi_mcc_tag_state {
+#define MCC_TAG_STATE_COMPLETED 0x00
+#define MCC_TAG_STATE_RUNNING 0x01
+#define MCC_TAG_STATE_TIMEOUT 0x02
+ uint8_t tag_state;
+ struct be_dma_mem tag_mem_state;
+};
+
struct be_ctrl_info {
u8 __iomem *csr;
u8 __iomem *db; /* Door Bell */
@@ -122,6 +130,8 @@ struct be_ctrl_info {
unsigned short mcc_alloc_index;
unsigned short mcc_free_index;
unsigned int mcc_tag_available;
+
+ struct beiscsi_mcc_tag_state ptag_state[MAX_MCC_CMD + 1];
};
#include "be_cmds.h"
diff --git a/drivers/scsi/be2iscsi/be_cmds.c b/drivers/scsi/be2iscsi/be_cmds.c
index 3338391..b14949a 100644
--- a/drivers/scsi/be2iscsi/be_cmds.c
+++ b/drivers/scsi/be2iscsi/be_cmds.c
@@ -138,7 +138,7 @@ unsigned int alloc_mcc_tag(struct beiscsi_hba *phba)
* @phba: Driver private structure
* @tag: Tag for the MBX Command
* @wrb: the WRB used for the MBX Command
- * @cmd_hdr: IOCTL Hdr for the MBX Cmd
+ * @mbx_cmd_mem: ptr to memory allocated for MBX Cmd
*
* Waits for MBX completion with the passed TAG.
*
@@ -148,21 +148,26 @@ unsigned int alloc_mcc_tag(struct beiscsi_hba *phba)
**/
int beiscsi_mccq_compl(struct beiscsi_hba *phba,
uint32_t tag, struct be_mcc_wrb **wrb,
- void *cmd_hdr)
+ struct be_dma_mem *mbx_cmd_mem)
{
int rc = 0;
uint32_t mcc_tag_response;
uint16_t status = 0, addl_status = 0, wrb_num = 0;
struct be_mcc_wrb *temp_wrb;
- struct be_cmd_req_hdr *ioctl_hdr;
- struct be_cmd_resp_hdr *ioctl_resp_hdr;
+ struct be_cmd_req_hdr *mbx_hdr;
+ struct be_cmd_resp_hdr *mbx_resp_hdr;
struct be_queue_info *mccq = &phba->ctrl.mcc_obj.q;
if (beiscsi_error(phba)) {
free_mcc_tag(&phba->ctrl, tag);
- return -EIO;
+ return -EPERM;
}
+ /* Set MBX Tag state to Active */
+ spin_lock(&phba->ctrl.mbox_lock);
+ phba->ctrl.ptag_state[tag].tag_state = MCC_TAG_STATE_RUNNING;
+ spin_unlock(&phba->ctrl.mbox_lock);
+
/* wait for the mccq completion */
rc = wait_event_interruptible_timeout(
phba->ctrl.mcc_wait[tag],
@@ -171,56 +176,71 @@ int beiscsi_mccq_compl(struct beiscsi_hba *phba,
BEISCSI_HOST_MBX_TIMEOUT));
if (rc <= 0) {
+ struct be_dma_mem *tag_mem;
+ /* Set MBX Tag state to timeout */
+ spin_lock(&phba->ctrl.mbox_lock);
+ phba->ctrl.ptag_state[tag].tag_state = MCC_TAG_STATE_TIMEOUT;
+ spin_unlock(&phba->ctrl.mbox_lock);
+
+ /* Store resource addr to be freed later */
+ tag_mem = &phba->ctrl.ptag_state[tag].tag_mem_state;
+ if (mbx_cmd_mem) {
+ tag_mem->size = mbx_cmd_mem->size;
+ tag_mem->va = mbx_cmd_mem->va;
+ tag_mem->dma = mbx_cmd_mem->dma;
+ } else
+ tag_mem->size = 0;
+
beiscsi_log(phba, KERN_ERR,
BEISCSI_LOG_INIT | BEISCSI_LOG_EH |
BEISCSI_LOG_CONFIG,
"BC_%d : MBX Cmd Completion timed out\n");
- rc = -EBUSY;
-
- /* decrement the mccq used count */
- atomic_dec(&phba->ctrl.mcc_obj.q.used);
-
- goto release_mcc_tag;
- } else
+ return -EBUSY;
+ } else {
rc = 0;
+ /* Set MBX Tag state to completed */
+ spin_lock(&phba->ctrl.mbox_lock);
+ phba->ctrl.ptag_state[tag].tag_state = MCC_TAG_STATE_COMPLETED;
+ spin_unlock(&phba->ctrl.mbox_lock);
+ }
mcc_tag_response = phba->ctrl.mcc_numtag[tag];
status = (mcc_tag_response & CQE_STATUS_MASK);
addl_status = ((mcc_tag_response & CQE_STATUS_ADDL_MASK) >>
CQE_STATUS_ADDL_SHIFT);
- if (cmd_hdr) {
- ioctl_hdr = (struct be_cmd_req_hdr *)cmd_hdr;
+ if (mbx_cmd_mem) {
+ mbx_hdr = (struct be_cmd_req_hdr *)mbx_cmd_mem->va;
} else {
wrb_num = (mcc_tag_response & CQE_STATUS_WRB_MASK) >>
CQE_STATUS_WRB_SHIFT;
temp_wrb = (struct be_mcc_wrb *)queue_get_wrb(mccq, wrb_num);
- ioctl_hdr = embedded_payload(temp_wrb);
+ mbx_hdr = embedded_payload(temp_wrb);
if (wrb)
*wrb = temp_wrb;
}
if (status || addl_status) {
- beiscsi_log(phba, KERN_ERR,
+ beiscsi_log(phba, KERN_WARNING,
BEISCSI_LOG_INIT | BEISCSI_LOG_EH |
BEISCSI_LOG_CONFIG,
"BC_%d : MBX Cmd Failed for "
"Subsys : %d Opcode : %d with "
"Status : %d and Extd_Status : %d\n",
- ioctl_hdr->subsystem,
- ioctl_hdr->opcode,
+ mbx_hdr->subsystem,
+ mbx_hdr->opcode,
status, addl_status);
if (status == MCC_STATUS_INSUFFICIENT_BUFFER) {
- ioctl_resp_hdr = (struct be_cmd_resp_hdr *) ioctl_hdr;
+ mbx_resp_hdr = (struct be_cmd_resp_hdr *) mbx_hdr;
beiscsi_log(phba, KERN_WARNING,
BEISCSI_LOG_INIT | BEISCSI_LOG_EH |
BEISCSI_LOG_CONFIG,
"BC_%d : Insufficent Buffer Error "
"Resp_Len : %d Actual_Resp_Len : %d\n",
- ioctl_resp_hdr->response_length,
- ioctl_resp_hdr->actual_resp_len);
+ mbx_resp_hdr->response_length,
+ mbx_resp_hdr->actual_resp_len);
rc = -EAGAIN;
goto release_mcc_tag;
@@ -319,6 +339,7 @@ static int be_mcc_compl_process(struct be_ctrl_info *ctrl,
int be_mcc_compl_process_isr(struct be_ctrl_info *ctrl,
struct be_mcc_compl *compl)
{
+ struct beiscsi_hba *phba = pci_get_drvdata(ctrl->pdev);
u16 compl_status, extd_status;
unsigned short tag;
@@ -338,7 +359,32 @@ int be_mcc_compl_process_isr(struct be_ctrl_info *ctrl,
ctrl->mcc_numtag[tag] |= (compl->tag0 & 0x00FF0000);
ctrl->mcc_numtag[tag] |= (extd_status & 0x000000FF) << 8;
ctrl->mcc_numtag[tag] |= (compl_status & 0x000000FF);
- wake_up_interruptible(&ctrl->mcc_wait[tag]);
+
+ if (ctrl->ptag_state[tag].tag_state == MCC_TAG_STATE_RUNNING) {
+ wake_up_interruptible(&ctrl->mcc_wait[tag]);
+ } else if (ctrl->ptag_state[tag].tag_state == MCC_TAG_STATE_TIMEOUT) {
+ struct be_dma_mem *tag_mem;
+ tag_mem = &ctrl->ptag_state[tag].tag_mem_state;
+
+ beiscsi_log(phba, KERN_WARNING,
+ BEISCSI_LOG_MBOX | BEISCSI_LOG_INIT |
+ BEISCSI_LOG_CONFIG,
+ "BC_%d : MBX Completion for timeout Command "
+ "from FW\n");
+ /* Check if memory needs to be freed */
+ if (tag_mem->size)
+ pci_free_consistent(ctrl->pdev, tag_mem->size,
+ tag_mem->va, tag_mem->dma);
+
+ /* Change tag state */
+ spin_lock(&phba->ctrl.mbox_lock);
+ ctrl->ptag_state[tag].tag_state = MCC_TAG_STATE_COMPLETED;
+ spin_unlock(&phba->ctrl.mbox_lock);
+
+ /* Free MCC Tag */
+ free_mcc_tag(ctrl, tag);
+ }
+
return 0;
}
diff --git a/drivers/scsi/be2iscsi/be_cmds.h b/drivers/scsi/be2iscsi/be_cmds.h
index 627ebbe..770b6c8 100644
--- a/drivers/scsi/be2iscsi/be_cmds.h
+++ b/drivers/scsi/be2iscsi/be_cmds.h
@@ -709,7 +709,8 @@ unsigned int be_cmd_get_port_speed(struct beiscsi_hba *phba);
void free_mcc_tag(struct be_ctrl_info *ctrl, unsigned int tag);
int beiscsi_mccq_compl(struct beiscsi_hba *phba,
- uint32_t tag, struct be_mcc_wrb **wrb, void *cmd_va);
+ uint32_t tag, struct be_mcc_wrb **wrb,
+ struct be_dma_mem *mbx_cmd_mem);
/*ISCSI Functuions */
int be_cmd_fw_initialize(struct be_ctrl_info *ctrl);
int be_cmd_fw_uninit(struct be_ctrl_info *ctrl);
diff --git a/drivers/scsi/be2iscsi/be_iscsi.c b/drivers/scsi/be2iscsi/be_iscsi.c
index 889066d..bdd0f05 100644
--- a/drivers/scsi/be2iscsi/be_iscsi.c
+++ b/drivers/scsi/be2iscsi/be_iscsi.c
@@ -1153,16 +1153,18 @@ static int beiscsi_open_conn(struct iscsi_endpoint *ep,
return -EAGAIN;
}
- ret = beiscsi_mccq_compl(phba, tag, NULL, nonemb_cmd.va);
+ ret = beiscsi_mccq_compl(phba, tag, NULL, &nonemb_cmd);
if (ret) {
beiscsi_log(phba, KERN_ERR,
BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX,
"BS_%d : mgmt_open_connection Failed");
- pci_free_consistent(phba->ctrl.pdev, nonemb_cmd.size,
- nonemb_cmd.va, nonemb_cmd.dma);
+ if (ret != -EBUSY)
+ pci_free_consistent(phba->ctrl.pdev, nonemb_cmd.size,
+ nonemb_cmd.va, nonemb_cmd.dma);
+
beiscsi_free_ep(beiscsi_ep);
- return -EBUSY;
+ return ret;
}
ptcpcnct_out = (struct tcp_connect_and_offload_out *)nonemb_cmd.va;
diff --git a/drivers/scsi/be2iscsi/be_main.c b/drivers/scsi/be2iscsi/be_main.c
index 1f37505..1a1729b 100644
--- a/drivers/scsi/be2iscsi/be_main.c
+++ b/drivers/scsi/be2iscsi/be_main.c
@@ -228,6 +228,7 @@ static int beiscsi_eh_abort(struct scsi_cmnd *sc)
struct invalidate_command_table *inv_tbl;
struct be_dma_mem nonemb_cmd;
unsigned int cid, tag, num_invalidate;
+ int rc;
cls_session = starget_to_session(scsi_target(sc->device));
session = cls_session->dd_data;
@@ -285,9 +286,11 @@ static int beiscsi_eh_abort(struct scsi_cmnd *sc)
return FAILED;
}
- beiscsi_mccq_compl(phba, tag, NULL, nonemb_cmd.va);
- pci_free_consistent(phba->ctrl.pdev, nonemb_cmd.size,
- nonemb_cmd.va, nonemb_cmd.dma);
+ rc = beiscsi_mccq_compl(phba, tag, NULL, &nonemb_cmd);
+ if (rc != -EBUSY)
+ pci_free_consistent(phba->ctrl.pdev, nonemb_cmd.size,
+ nonemb_cmd.va, nonemb_cmd.dma);
+
return iscsi_eh_abort(sc);
}
@@ -303,6 +306,7 @@ static int beiscsi_eh_device_reset(struct scsi_cmnd *sc)
struct invalidate_command_table *inv_tbl;
struct be_dma_mem nonemb_cmd;
unsigned int cid, tag, i, num_invalidate;
+ int rc;
/* invalidate iocbs */
cls_session = starget_to_session(scsi_target(sc->device));
@@ -363,9 +367,10 @@ static int beiscsi_eh_device_reset(struct scsi_cmnd *sc)
return FAILED;
}
- beiscsi_mccq_compl(phba, tag, NULL, nonemb_cmd.va);
- pci_free_consistent(phba->ctrl.pdev, nonemb_cmd.size,
- nonemb_cmd.va, nonemb_cmd.dma);
+ rc = beiscsi_mccq_compl(phba, tag, NULL, &nonemb_cmd);
+ if (rc != -EBUSY)
+ pci_free_consistent(phba->ctrl.pdev, nonemb_cmd.size,
+ nonemb_cmd.va, nonemb_cmd.dma);
return iscsi_eh_device_reset(sc);
}
@@ -4360,12 +4365,16 @@ static int beiscsi_get_boot_info(struct beiscsi_hba *phba)
goto boot_freemem;
}
- ret = beiscsi_mccq_compl(phba, tag, NULL, nonemb_cmd.va);
+ ret = beiscsi_mccq_compl(phba, tag, NULL, &nonemb_cmd);
if (ret) {
beiscsi_log(phba, KERN_ERR,
BEISCSI_LOG_INIT | BEISCSI_LOG_CONFIG,
"BM_%d : beiscsi_get_session_info Failed");
- goto boot_freemem;
+
+ if (ret != -EBUSY)
+ goto boot_freemem;
+ else
+ return ret;
}
session_resp = nonemb_cmd.va ;
@@ -5594,6 +5603,8 @@ static int beiscsi_dev_probe(struct pci_dev *pcidev,
phba->ctrl.mcc_tag[i] = i + 1;
phba->ctrl.mcc_numtag[i + 1] = 0;
phba->ctrl.mcc_tag_available++;
+ memset(&phba->ctrl.ptag_state[i].tag_mem_state, 0,
+ sizeof(struct beiscsi_mcc_tag_state));
}
phba->ctrl.mcc_alloc_index = phba->ctrl.mcc_free_index = 0;
diff --git a/drivers/scsi/be2iscsi/be_mgmt.c b/drivers/scsi/be2iscsi/be_mgmt.c
index b2fcac7..088bdf7 100644
--- a/drivers/scsi/be2iscsi/be_mgmt.c
+++ b/drivers/scsi/be2iscsi/be_mgmt.c
@@ -828,22 +828,25 @@ static int mgmt_exec_nonemb_cmd(struct beiscsi_hba *phba,
be_mcc_notify(phba);
spin_unlock(&ctrl->mbox_lock);
- rc = beiscsi_mccq_compl(phba, tag, NULL, nonemb_cmd->va);
+ rc = beiscsi_mccq_compl(phba, tag, NULL, nonemb_cmd);
+
+ if (resp_buf)
+ memcpy(resp_buf, nonemb_cmd->va, resp_buf_len);
+
if (rc) {
- /* Check if the IOCTL needs to be re-issued */
+ /* Check if the MBX Cmd needs to be re-issued */
if (rc == -EAGAIN)
return rc;
- beiscsi_log(phba, KERN_ERR,
+ beiscsi_log(phba, KERN_WARNING,
BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX,
"BG_%d : mgmt_exec_nonemb_cmd Failed status\n");
- goto free_cmd;
+ if (rc != -EBUSY)
+ goto free_cmd;
+ else
+ return rc;
}
-
- if (resp_buf)
- memcpy(resp_buf, nonemb_cmd->va, resp_buf_len);
-
free_cmd:
pci_free_consistent(ctrl->pdev, nonemb_cmd->size,
nonemb_cmd->va, nonemb_cmd->dma);
@@ -1348,7 +1351,6 @@ int mgmt_set_vlan(struct beiscsi_hba *phba,
{
int rc;
unsigned int tag;
- struct be_mcc_wrb *wrb = NULL;
tag = be_cmd_set_vlan(phba, vlan_tag);
if (!tag) {
@@ -1358,7 +1360,7 @@ int mgmt_set_vlan(struct beiscsi_hba *phba,
return -EBUSY;
}
- rc = beiscsi_mccq_compl(phba, tag, &wrb, NULL);
+ rc = beiscsi_mccq_compl(phba, tag, NULL, NULL);
if (rc) {
beiscsi_log(phba, KERN_ERR,
(BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX),
--
1.8.5.3
^ permalink raw reply related [flat|nested] 12+ messages in thread* [PATCH 2/8] be2iscsi: Fix port speed typo in driver. 2014-01-29 7:16 [PATCH 1/8] be2iscsi: Fix handling timed out MBX completion from FW Jayamohan Kallickal @ 2014-01-29 7:16 ` Jayamohan Kallickal 2014-01-29 7:16 ` [PATCH 3/8] be2iscsi : Fix IRQ_Affinity support " Jayamohan Kallickal ` (6 subsequent siblings) 7 siblings, 0 replies; 12+ messages in thread From: Jayamohan Kallickal @ 2014-01-29 7:16 UTC (permalink / raw) To: jbottomley, linux-scsi, michaelc; +Cc: Jayamohan Kallickal, John Soni Jose From: Jayamohan Kallickal <jayamohan.kallickal@emulex.com> The 100Mbps port speed macro used was not proper. Signed-off-by: John Soni Jose <sony.john-n@emulex.com> Signed-off-by: Jayamohan Kallickal <jayamohan.kallickal@emulex.com> --- drivers/scsi/be2iscsi/be_iscsi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/scsi/be2iscsi/be_iscsi.c b/drivers/scsi/be2iscsi/be_iscsi.c index bdd0f05..a7a210e 100644 --- a/drivers/scsi/be2iscsi/be_iscsi.c +++ b/drivers/scsi/be2iscsi/be_iscsi.c @@ -793,7 +793,7 @@ static int beiscsi_get_port_speed(struct Scsi_Host *shost) ihost->port_speed = ISCSI_PORT_SPEED_10MBPS; break; case BE2ISCSI_LINK_SPEED_100MBPS: - ihost->port_speed = BE2ISCSI_LINK_SPEED_100MBPS; + ihost->port_speed = ISCSI_PORT_SPEED_100MBPS; break; case BE2ISCSI_LINK_SPEED_1GBPS: ihost->port_speed = ISCSI_PORT_SPEED_1GBPS; -- 1.8.5.3 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 3/8] be2iscsi : Fix IRQ_Affinity support in driver. 2014-01-29 7:16 [PATCH 1/8] be2iscsi: Fix handling timed out MBX completion from FW Jayamohan Kallickal 2014-01-29 7:16 ` [PATCH 2/8] be2iscsi: Fix port speed typo in driver Jayamohan Kallickal @ 2014-01-29 7:16 ` Jayamohan Kallickal 2014-02-01 22:46 ` Mike Christie 2014-01-29 7:16 ` [PATCH 4/8] be2iscsi: Fix doorbell format for EQ/CQ/RQ s per SLI spec Jayamohan Kallickal ` (5 subsequent siblings) 7 siblings, 1 reply; 12+ messages in thread From: Jayamohan Kallickal @ 2014-01-29 7:16 UTC (permalink / raw) To: jbottomley, linux-scsi, michaelc; +Cc: Jayamohan Kallickal, John Soni Jose From: Jayamohan Kallickal <jayamohan.kallickal@emulex.com> Provides IRQ_Affinity setting for the driver. Enabling IRQ_Affinity is through module params. Default IRQ_AFFINITY support is OFF. Signed-off-by: John Soni Jose <sony.john-n@emulex.com> Signed-off-by: Jayamohan Kallickal <jayamohan.kallickal@emulex.com> --- drivers/scsi/be2iscsi/be_cmds.h | 9 +++- drivers/scsi/be2iscsi/be_main.c | 97 +++++++++++++++++++++++++++++++++++++++-- drivers/scsi/be2iscsi/be_main.h | 22 +++++++--- drivers/scsi/be2iscsi/be_mgmt.c | 63 ++++++++++++++++++++++++-- drivers/scsi/be2iscsi/be_mgmt.h | 49 ++++++++++++++++++--- 5 files changed, 222 insertions(+), 18 deletions(-) diff --git a/drivers/scsi/be2iscsi/be_cmds.h b/drivers/scsi/be2iscsi/be_cmds.h index 770b6c8..69f849e 100644 --- a/drivers/scsi/be2iscsi/be_cmds.h +++ b/drivers/scsi/be2iscsi/be_cmds.h @@ -174,6 +174,7 @@ struct be_mcc_mailbox { #define OPCODE_COMMON_EQ_DESTROY 55 #define OPCODE_COMMON_QUERY_FIRMWARE_CONFIG 58 #define OPCODE_COMMON_FUNCTION_RESET 61 +#define OPCODE_COMMON_GET_CNTL_ADV_ATTRIB 121 /** * LIST of opcodes that are common between Initiator and Target @@ -197,6 +198,8 @@ struct be_mcc_mailbox { #define OPCODE_COMMON_ISCSI_WRBQ_CREATE 66 #define OPCODE_COMMON_ISCSI_WRBQ_DESTROY 67 +#define MBOX_CMD_V2 0x01 + struct be_cmd_req_hdr { u8 opcode; /* dword 0 */ u8 subsystem; /* dword 0 */ @@ -966,6 +969,9 @@ struct amap_it_dmsg_cqe_v2 { #define DB_DEF_PDU_WRB_INDEX_SHIFT 16 #define DB_DEF_PDU_NUM_POSTED_SHIFT 24 +#define BEISCSI_IFD_STATE_DISABLE 0x0 +#define BEISCSI_IFD_STATE_ENABLE 0x1 + struct fragnum_bits_for_sgl_cra_in { struct be_cmd_req_hdr hdr; u32 num_bits; @@ -1002,7 +1008,8 @@ struct tcp_connect_and_offload_in { u16 hdr_ring_id; u16 data_ring_id; u8 do_offload; - u8 rsvd0[3]; + u8 ifd_state; + u8 rsvd0[2]; } __packed; struct tcp_connect_and_offload_out { diff --git a/drivers/scsi/be2iscsi/be_main.c b/drivers/scsi/be2iscsi/be_main.c index 1a1729b..89bf558 100644 --- a/drivers/scsi/be2iscsi/be_main.c +++ b/drivers/scsi/be2iscsi/be_main.c @@ -47,6 +47,7 @@ static unsigned int be_iopoll_budget = 10; static unsigned int be_max_phys_size = 64; static unsigned int enable_msix = 1; +static unsigned int beiscsi_irq_affinity_enable; MODULE_DEVICE_TABLE(pci, beiscsi_pci_id_table); MODULE_DESCRIPTION(DRV_DESC " " BUILD_STR); @@ -59,6 +60,7 @@ module_param(be_max_phys_size, uint, S_IRUGO); MODULE_PARM_DESC(be_max_phys_size, "Maximum Size (In Kilobytes) of physically contiguous " "memory that can be allocated. Range is 16 - 128"); +module_param(beiscsi_irq_affinity_enable, uint, 0); #define beiscsi_disp_param(_name)\ ssize_t \ @@ -1026,6 +1028,46 @@ static irqreturn_t be_isr(int irq, void *dev_id) } } +static void beiscsi_set_irq_affinity_params(struct beiscsi_hba *phba, + uint16_t cpu_index, uint16_t eqcq_index, uint16_t msix_vec) +{ + struct hwi_controller *phwi_ctrlr; + struct hwi_context_memory *phwi_context; + + phwi_ctrlr = phba->phwi_ctrlr; + phwi_context = phwi_ctrlr->phwi_ctxt; + + if (msix_vec) { + if (cpu_online(cpu_index)) + cpumask_set_cpu(cpu_index, + &phba->msix_cpu_map[ + cpu_index].affinity_mask); + else + cpumask_copy(&phba->msix_cpu_map[ + cpu_index].affinity_mask, + cpu_online_mask); + + phba->msix_cpu_map[cpu_index].eq_id = + phwi_context->be_eq[eqcq_index].q.id; + phba->msix_cpu_map[cpu_index].cq_id = + phwi_context->be_cq[eqcq_index].id; + phba->msix_cpu_map[cpu_index].cpu_id = cpu_index; + phba->msix_cpu_map[cpu_index].nvec = msix_vec; + phba->msix_cpu_map[cpu_index].node_id = + cpu_to_node(cpu_index); + + irq_set_affinity_hint(msix_vec, + &phba->msix_cpu_map[ + cpu_index].affinity_mask); + } else { + phba->msix_cpu_map[cpu_index].eq_id = + phba->msix_cpu_map[eqcq_index].eq_id; + phba->msix_cpu_map[cpu_index].cq_id = + phba->msix_cpu_map[eqcq_index].cq_id; + phba->msix_cpu_map[cpu_index].cpu_id = cpu_index; + } +} + static int beiscsi_init_irqs(struct beiscsi_hba *phba) { struct pci_dev *pcidev = phba->pcidev; @@ -1059,7 +1101,11 @@ static int beiscsi_init_irqs(struct beiscsi_hba *phba) kfree(phba->msi_name[i]); goto free_msix_irqs; } + if (beiscsi_irq_affinity_enable) + beiscsi_set_irq_affinity_params(phba, + i, i, msix_vec); } + phba->msi_name[i] = kzalloc(BEISCSI_MSI_NAME, GFP_KERNEL); if (!phba->msi_name[i]) { ret = -ENOMEM; @@ -1078,6 +1124,12 @@ static int beiscsi_init_irqs(struct beiscsi_hba *phba) goto free_msix_irqs; } + if (beiscsi_irq_affinity_enable) { + j = i; + while (i++ < num_online_cpus()) + beiscsi_set_irq_affinity_params(phba, + i, (i - j), 0); + } } else { ret = request_irq(pcidev->irq, be_isr, IRQF_SHARED, "beiscsi", phba); @@ -4663,10 +4715,9 @@ beiscsi_offload_connection(struct beiscsi_conn *beiscsi_conn, /* Check for the adapter family */ if (is_chip_be2_be3r(phba)) - beiscsi_offload_cxn_v0(params, pwrb_handle, - phba->init_mem); + beiscsi_offload_cxn_v0(phba, params, pwrb_handle); else - beiscsi_offload_cxn_v2(params, pwrb_handle); + beiscsi_offload_cxn_v2(phba, params, pwrb_handle); be_dws_le_to_cpu(pwrb_handle->pwrb, sizeof(struct iscsi_target_context_update_wrb)); @@ -4860,6 +4911,8 @@ int beiscsi_iotask_v2(struct iscsi_task *task, struct scatterlist *sg, struct beiscsi_hba *phba = beiscsi_conn->phba; struct iscsi_wrb *pwrb = NULL; unsigned int doorbell = 0; + uint8_t cpu_num; + u8 cq_num; pwrb = io_task->pwrb_handle->pwrb; @@ -4891,6 +4944,13 @@ int beiscsi_iotask_v2(struct iscsi_task *task, struct scatterlist *sg, io_task->psgl_handle->sgl_index); hwi_write_sgl_v2(pwrb, sg, num_sg, io_task); + if (phba->func_caps & BE_ADAPTER_IFD_CAP) { + cpu_num = get_cpu(); + cq_num = phba->msix_cpu_map[cpu_num].cq_id; + AMAP_SET_BITS(struct amap_iscsi_wrb_v2, cq_id, pwrb, cq_num); + put_cpu(); + } + AMAP_SET_BITS(struct amap_iscsi_wrb_v2, ptr2nextwrb, pwrb, io_task->pwrb_handle->nxt_wrb_index); @@ -4917,6 +4977,7 @@ static int beiscsi_iotask(struct iscsi_task *task, struct scatterlist *sg, struct beiscsi_hba *phba = beiscsi_conn->phba; struct iscsi_wrb *pwrb = NULL; unsigned int doorbell = 0; + uint8_t cpu_num, cq_num; pwrb = io_task->pwrb_handle->pwrb; io_task->cmd_bhs->iscsi_hdr.exp_statsn = 0; @@ -4948,6 +5009,13 @@ static int beiscsi_iotask(struct iscsi_task *task, struct scatterlist *sg, hwi_write_sgl(pwrb, sg, num_sg, io_task); + if (phba->func_caps & BE_ADAPTER_IFD_CAP) { + cpu_num = get_cpu(); + cq_num = phba->msix_cpu_map[cpu_num].cq_id; + AMAP_SET_BITS(struct amap_iscsi_wrb, cq_id, pwrb, cq_num); + put_cpu(); + } + AMAP_SET_BITS(struct amap_iscsi_wrb, ptr2nextwrb, pwrb, io_task->pwrb_handle->nxt_wrb_index); be_dws_le_to_cpu(pwrb, sizeof(struct iscsi_wrb)); @@ -4972,6 +5040,7 @@ static int beiscsi_mtask(struct iscsi_task *task) unsigned int doorbell = 0; unsigned int cid; unsigned int pwrb_typeoffset = 0; + uint8_t cpu_num, cq_num; cid = beiscsi_conn->beiscsi_conn_cid; pwrb = io_task->pwrb_handle->pwrb; @@ -5003,6 +5072,19 @@ static int beiscsi_mtask(struct iscsi_task *task) pwrb_typeoffset = SKH_WRB_TYPE_OFFSET; } + if (phba->func_caps & BE_ADAPTER_IFD_CAP) { + cpu_num = get_cpu(); + cq_num = phba->msix_cpu_map[cpu_num].cq_id; + + if (is_chip_be2_be3r(phba)) + AMAP_SET_BITS(struct amap_iscsi_wrb, + cq_id, pwrb, cq_num); + else + AMAP_SET_BITS(struct amap_iscsi_wrb_v2, + cq_id, pwrb, cq_num); + put_cpu(); + } + switch (task->hdr->opcode & ISCSI_OPCODE_MASK) { case ISCSI_OP_LOGIN: @@ -5587,6 +5669,15 @@ static int beiscsi_dev_probe(struct pci_dev *pcidev, phba->num_cpus = 1; } + + if (beiscsi_irq_affinity_enable) { + if (mgmt_get_adapter_caps(phba)) + beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_INIT, + "BM_%d : Error in getting Capabilites" + "IRQ_Affinity setting is disabled\n"); + } else + phba->func_caps = BEISCSI_IFD_STATE_DISABLE; + phba->shost->max_id = phba->params.cxns_per_ctrl; beiscsi_get_params(phba); phba->shost->can_queue = phba->params.ios_per_ctrl; diff --git a/drivers/scsi/be2iscsi/be_main.h b/drivers/scsi/be2iscsi/be_main.h index 31fa27b..0076119 100644 --- a/drivers/scsi/be2iscsi/be_main.h +++ b/drivers/scsi/be2iscsi/be_main.h @@ -234,6 +234,15 @@ struct sgl_handle { struct iscsi_sge *pfrag; }; +struct msix_vec_map { + cpumask_t affinity_mask; + u16 eq_id; + u16 cq_id; + u32 nvec; + unsigned int cpu_id; + unsigned int node_id; +}; + struct hba_parameters { unsigned int ios_per_ctrl; unsigned int cxns_per_ctrl; @@ -412,12 +421,13 @@ struct beiscsi_hba { unsigned int interface_handle; struct mgmt_session_info boot_sess; struct invalidate_command_table inv_tbl[128]; - + struct msix_vec_map msix_cpu_map[MAX_CPUS]; unsigned int attr_log_enable; int (*iotask_fn)(struct iscsi_task *, struct scatterlist *sg, uint32_t num_sg, uint32_t xferlen, uint32_t writedir); + uint32_t func_caps; }; struct beiscsi_session { @@ -479,20 +489,21 @@ struct be_cmd_bhs { struct beiscsi_io_task { struct wrb_handle *pwrb_handle; + struct be_cmd_bhs *cmd_bhs; + unsigned short bhs_len; struct sgl_handle *psgl_handle; + struct hwi_wrb_context *pwrb_context; struct beiscsi_conn *conn; struct scsi_cmnd *scsi_cmnd; + uint8_t wrb_type; unsigned int cmd_sn; unsigned int flags; unsigned short cid; unsigned short header_len; itt_t libiscsi_itt; - struct be_cmd_bhs *cmd_bhs; struct be_bus_address bhs_pa; - unsigned short bhs_len; dma_addr_t mtask_addr; uint32_t mtask_data_count; - uint8_t wrb_type; }; struct be_nonio_bhs { @@ -745,7 +756,8 @@ struct amap_iscsi_wrb { u8 ptr2nextwrb[8]; /* DWORD 1 */ u8 r2t_exp_dtl[24]; /* DWORD 1 */ u8 sgl_icd_idx[12]; /* DWORD 2 */ - u8 rsvd0[20]; /* DWORD 2 */ + u8 cq_id[10]; /* DWORD 2 */ + u8 rsvd0[10]; /* DWORD 2 */ u8 exp_data_sn[32]; /* DWORD 3 */ u8 iscsi_bhs_addr_hi[32]; /* DWORD 4 */ u8 iscsi_bhs_addr_lo[32]; /* DWORD 5 */ diff --git a/drivers/scsi/be2iscsi/be_mgmt.c b/drivers/scsi/be2iscsi/be_mgmt.c index 088bdf7..1b6c3fb 100644 --- a/drivers/scsi/be2iscsi/be_mgmt.c +++ b/drivers/scsi/be2iscsi/be_mgmt.c @@ -758,11 +758,47 @@ int mgmt_open_connection(struct beiscsi_hba *phba, sge->pa_hi = cpu_to_le32(upper_32_bits(nonemb_cmd->dma)); sge->pa_lo = cpu_to_le32(nonemb_cmd->dma & 0xFFFFFFFF); sge->len = cpu_to_le32(nonemb_cmd->size); + + /* Enable interrupt redirection for CXN */ + if (phba->func_caps & BE_ADAPTER_IFD_CAP) + req->ifd_state = BEISCSI_IFD_STATE_ENABLE; + be_mcc_notify(phba); spin_unlock(&ctrl->mbox_lock); return tag; } +int mgmt_get_adapter_caps(struct beiscsi_hba *phba) +{ + struct be_ctrl_info *ctrl = &phba->ctrl; + struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem); + struct be_mgmt_cntl_additional_attrib *req = embedded_payload(wrb); + int status = 0; + + spin_lock(&ctrl->mbox_lock); + memset(wrb, 0, sizeof(*wrb)); + + be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); + be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, + OPCODE_COMMON_GET_CNTL_ADV_ATTRIB, + sizeof(*req)); + status = be_mbox_notify(ctrl); + + if (status) { + beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_INIT, + "BG_%d : Failed in mgmt_get_adapter_caps\n"); + spin_unlock(&ctrl->mbox_lock); + phba->func_caps = BEISCSI_IFD_STATE_DISABLE; + return status; + } + + phba->func_caps = req->params.func_caps; + spin_unlock(&ctrl->mbox_lock); + return status; +} + + + unsigned int mgmt_get_all_if_id(struct beiscsi_hba *phba) { struct be_ctrl_info *ctrl = &phba->ctrl; @@ -1525,11 +1561,13 @@ beiscsi_phys_port_disp(struct device *dev, struct device_attribute *attr, phba->fw_config.phys_port); } -void beiscsi_offload_cxn_v0(struct beiscsi_offload_params *params, - struct wrb_handle *pwrb_handle, - struct be_mem_descriptor *mem_descr) +void beiscsi_offload_cxn_v0(struct beiscsi_hba *phba, + struct beiscsi_offload_params *params, + struct wrb_handle *pwrb_handle) { struct iscsi_wrb *pwrb = pwrb_handle->pwrb; + struct be_mem_descriptor *mem_descr = phba->init_mem; + uint8_t cpu_num, cq_num; memset(pwrb, 0, sizeof(*pwrb)); AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, @@ -1588,12 +1626,21 @@ void beiscsi_offload_cxn_v0(struct beiscsi_offload_params *params, AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, pad_buffer_addr_lo, pwrb, mem_descr->mem_array[0].bus_address.u.a32.address_lo); + + if (phba->func_caps & BE_ADAPTER_IFD_CAP) { + cpu_num = get_cpu(); + cq_num = phba->msix_cpu_map[cpu_num].cq_id; + AMAP_SET_BITS(struct amap_iscsi_wrb, cq_id, pwrb, cq_num); + put_cpu(); + } } -void beiscsi_offload_cxn_v2(struct beiscsi_offload_params *params, +void beiscsi_offload_cxn_v2(struct beiscsi_hba *phba, + struct beiscsi_offload_params *params, struct wrb_handle *pwrb_handle) { struct iscsi_wrb *pwrb = pwrb_handle->pwrb; + uint8_t cpu_num, cq_num; memset(pwrb, 0, sizeof(*pwrb)); @@ -1660,4 +1707,12 @@ void beiscsi_offload_cxn_v2(struct beiscsi_offload_params *params, pwrb, (params->dw[offsetof(struct amap_beiscsi_offload_params, exp_statsn) / 32] + 1)); + + if (phba->func_caps & BE_ADAPTER_IFD_CAP) { + cpu_num = get_cpu(); + cq_num = phba->msix_cpu_map[cpu_num].cq_id; + AMAP_SET_BITS(struct amap_iscsi_wrb_v2, cq_id, pwrb, cq_num); + put_cpu(); + } + } diff --git a/drivers/scsi/be2iscsi/be_mgmt.h b/drivers/scsi/be2iscsi/be_mgmt.h index 01b8c97..e1dd796 100644 --- a/drivers/scsi/be2iscsi/be_mgmt.h +++ b/drivers/scsi/be2iscsi/be_mgmt.h @@ -221,6 +221,41 @@ struct be_mgmt_controller_attributes_resp { struct mgmt_controller_attributes params; } __packed; +#define BE_ADAPTER_IFD_CAP 0x01 +struct mgmt_cntrl_additional_attrib { + u16 ipl_file_number; + u8 ipl_file_version; + u8 rsvd0; + u8 on_die_temp; + u8 rsvd1[3]; + u32 func_caps; + u32 rsvd2[4]; + u8 fcoe_universal_bios_version[32]; + u8 fcoe_x86_bios_version[32]; + u8 fcoe_efi_bios_version[32]; + u8 fcoe_fcode_version[32]; + u8 uefi_bios_version[32]; + u8 uefi_nic_version[32]; + u8 uefi_fcode_version[32]; + u8 uefi_iscsi_version[32]; + u8 iscsi_x86_bios_version[32]; + u8 pxe_x86_bios_version[32]; + u8 fcoe_default_wwpn[8]; + u8 ext_phy_version[32]; + u8 fc_universal_bios_version[32]; + u8 fc_x86_bios_version[32]; + u8 fc_efi_bios_version[32]; + u8 fc_fcode_version[32]; + u8 ext_phy_crc_label[8]; + u8 rsvd3[88]; +} __packed; + +struct be_mgmt_cntl_additional_attrib { + struct be_cmd_req_hdr hdr; + struct mgmt_cntrl_additional_attrib params; +} __packed; + + struct be_bsg_vendor_cmd { struct be_cmd_req_hdr hdr; unsigned short region; @@ -269,6 +304,8 @@ struct beiscsi_endpoint { int mgmt_get_fw_config(struct be_ctrl_info *ctrl, struct beiscsi_hba *phba); +int mgmt_get_adapter_caps(struct beiscsi_hba *phba); + unsigned int mgmt_invalidate_connection(struct beiscsi_hba *phba, struct beiscsi_endpoint *beiscsi_ep, unsigned short cid, @@ -328,12 +365,14 @@ ssize_t beiscsi_free_session_disp(struct device *dev, ssize_t beiscsi_phys_port_disp(struct device *dev, struct device_attribute *attr, char *buf); -void beiscsi_offload_cxn_v0(struct beiscsi_offload_params *params, - struct wrb_handle *pwrb_handle, - struct be_mem_descriptor *mem_descr); - -void beiscsi_offload_cxn_v2(struct beiscsi_offload_params *params, +void beiscsi_offload_cxn_v0(struct beiscsi_hba *phba, + struct beiscsi_offload_params *params, struct wrb_handle *pwrb_handle); + +void beiscsi_offload_cxn_v2(struct beiscsi_hba *phba, + struct beiscsi_offload_params *params, + struct wrb_handle *pwrb_handle); + void beiscsi_ue_detect(struct beiscsi_hba *phba); #endif -- 1.8.5.3 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH 3/8] be2iscsi : Fix IRQ_Affinity support in driver. 2014-01-29 7:16 ` [PATCH 3/8] be2iscsi : Fix IRQ_Affinity support " Jayamohan Kallickal @ 2014-02-01 22:46 ` Mike Christie 2014-02-05 5:09 ` Jayamohan Kallickal 0 siblings, 1 reply; 12+ messages in thread From: Mike Christie @ 2014-02-01 22:46 UTC (permalink / raw) To: Jayamohan Kallickal Cc: jbottomley, linux-scsi, Jayamohan Kallickal, John Soni Jose On 01/29/2014 01:16 AM, Jayamohan Kallickal wrote: > + > + if (msix_vec) { > + if (cpu_online(cpu_index)) > + cpumask_set_cpu(cpu_index, > + &phba->msix_cpu_map[ > + cpu_index].affinity_mask); > + else > + cpumask_copy(&phba->msix_cpu_map[ > + cpu_index].affinity_mask, > + cpu_online_mask); > + I think this code works, but I am not sure if this what you wanted to do. It seems we set num_cpus in find_num_cpus. It can be the number of online or some driver limited value. We then loop for (i = 0; i < num_cpus i++). Above, then if the cpu is not online then you just set it to the online cpu mask instead of a specific cpu. Is it possible num_cpus can be 7, but it is possible the online cpus are 0 to 5 and 8. So, when you loop the last vec is set to all online cpus instead of 8 when it is possible to set it to a specific cpu? Do you want to be doing a for_each_online_cpu to loop instead? ^ permalink raw reply [flat|nested] 12+ messages in thread
* RE: [PATCH 3/8] be2iscsi : Fix IRQ_Affinity support in driver. 2014-02-01 22:46 ` Mike Christie @ 2014-02-05 5:09 ` Jayamohan Kallickal 0 siblings, 0 replies; 12+ messages in thread From: Jayamohan Kallickal @ 2014-02-05 5:09 UTC (permalink / raw) To: Mike Christie, Jayamohan Kallickal Cc: jbottomley@parallels.com, linux-scsi@vger.kernel.org, Sony John-N -----Original Message----- From: Mike Christie [mailto:michaelc@cs.wisc.edu] Sent: Saturday, February 01, 2014 2:47 PM To: Jayamohan Kallickal Cc: jbottomley@parallels.com; linux-scsi@vger.kernel.org; Jayamohan Kallickal; Sony John-N Subject: Re: [PATCH 3/8] be2iscsi : Fix IRQ_Affinity support in driver. On 01/29/2014 01:16 AM, Jayamohan Kallickal wrote: > + > + if (msix_vec) { > + if (cpu_online(cpu_index)) > + cpumask_set_cpu(cpu_index, > + &phba->msix_cpu_map[ > + cpu_index].affinity_mask); > + else > + cpumask_copy(&phba->msix_cpu_map[ > + cpu_index].affinity_mask, > + cpu_online_mask); > + I think this code works, but I am not sure if this what you wanted to do. It seems we set num_cpus in find_num_cpus. It can be the number of online or some driver limited value. We then loop for (i = 0; i < num_cpus i++). Above, then if the cpu is not online then you just set it to the online cpu mask instead of a specific cpu. Is it possible num_cpus can be 7, but it is possible the online cpus are 0 to 5 and 8. So, when you loop the last vec is set to all online cpus instead of 8 when it is possible to set it to a specific cpu? Do you want to be doing a for_each_online_cpu to loop instead? Yes, the original code could have the behavior you had explained. I want to rewrite that portion and will send this as as part of the next patchset. For now, I want to withdraw this patch i.e PATCH 3/8. Thanks Jay --l ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 4/8] be2iscsi: Fix doorbell format for EQ/CQ/RQ s per SLI spec. 2014-01-29 7:16 [PATCH 1/8] be2iscsi: Fix handling timed out MBX completion from FW Jayamohan Kallickal 2014-01-29 7:16 ` [PATCH 2/8] be2iscsi: Fix port speed typo in driver Jayamohan Kallickal 2014-01-29 7:16 ` [PATCH 3/8] be2iscsi : Fix IRQ_Affinity support " Jayamohan Kallickal @ 2014-01-29 7:16 ` Jayamohan Kallickal 2014-01-29 7:16 ` [PATCH 5/8] be2iscsi: Fix the session cleanup when reboot/shutdown happens Jayamohan Kallickal ` (4 subsequent siblings) 7 siblings, 0 replies; 12+ messages in thread From: Jayamohan Kallickal @ 2014-01-29 7:16 UTC (permalink / raw) To: jbottomley, linux-scsi, michaelc; +Cc: Jayamohan Kallickal, John Soni Jose From: Jayamohan Kallickal <jayamohan.kallickal@emulex.com> The doorbel format has been updated to support additonal functionalities of SKH-R adapter. These changes are made such that older FW also works fine. Signed-off-by: John Soni Jose <sony.john-n@emulex.com> Signed-off-by: Jayamohan Kallickal <jayamohan.kallickal@emulex.com> --- drivers/scsi/be2iscsi/be_cmds.c | 14 +------------- drivers/scsi/be2iscsi/be_cmds.h | 6 +++--- drivers/scsi/be2iscsi/be_main.c | 25 ++++++++++++++++++++++--- drivers/scsi/be2iscsi/be_main.h | 16 ++++++++++++++-- 4 files changed, 40 insertions(+), 21 deletions(-) diff --git a/drivers/scsi/be2iscsi/be_cmds.c b/drivers/scsi/be2iscsi/be_cmds.c index b14949a..86d91f3 100644 --- a/drivers/scsi/be2iscsi/be_cmds.c +++ b/drivers/scsi/be2iscsi/be_cmds.c @@ -432,18 +432,6 @@ void beiscsi_async_link_state_process(struct beiscsi_hba *phba, } } -static void beiscsi_cq_notify(struct beiscsi_hba *phba, u16 qid, bool arm, - u16 num_popped) -{ - u32 val = 0; - val |= qid & DB_CQ_RING_ID_MASK; - if (arm) - val |= 1 << DB_CQ_REARM_SHIFT; - val |= num_popped << DB_CQ_NUM_POPPED_SHIFT; - iowrite32(val, phba->db_va + DB_CQ_OFFSET); -} - - int beiscsi_process_mcc(struct beiscsi_hba *phba) { struct be_mcc_compl *compl; @@ -474,7 +462,7 @@ int beiscsi_process_mcc(struct beiscsi_hba *phba) } if (num) - beiscsi_cq_notify(phba, phba->ctrl.mcc_obj.cq.id, true, num); + hwi_ring_cq_db(phba, phba->ctrl.mcc_obj.cq.id, num, 1, 0); spin_unlock_bh(&phba->ctrl.mcc_cq_lock); return status; diff --git a/drivers/scsi/be2iscsi/be_cmds.h b/drivers/scsi/be2iscsi/be_cmds.h index 69f849e..59abd27 100644 --- a/drivers/scsi/be2iscsi/be_cmds.h +++ b/drivers/scsi/be2iscsi/be_cmds.h @@ -103,7 +103,7 @@ struct be_mcc_compl { /********** MCC door bell ************/ #define DB_MCCQ_OFFSET 0x140 -#define DB_MCCQ_RING_ID_MASK 0x7FF /* bits 0 - 10 */ +#define DB_MCCQ_RING_ID_MASK 0xFFFF /* bits 0 - 15 */ /* Number of entries posted */ #define DB_MCCQ_NUM_POSTED_SHIFT 16 /* bits 16 - 29 */ @@ -1025,8 +1025,8 @@ struct be_mcc_wrb_context { int *users_final_status; } __packed; -#define DB_DEF_PDU_RING_ID_MASK 0x3FF /* bits 0 - 9 */ -#define DB_DEF_PDU_CQPROC_MASK 0x3FFF /* bits 0 - 9 */ +#define DB_DEF_PDU_RING_ID_MASK 0x3FFF /* bits 0 - 13 */ +#define DB_DEF_PDU_CQPROC_MASK 0x3FFF /* bits 16 - 29 */ #define DB_DEF_PDU_REARM_SHIFT 14 #define DB_DEF_PDU_EVENT_SHIFT 15 #define DB_DEF_PDU_CQPROC_SHIFT 16 diff --git a/drivers/scsi/be2iscsi/be_main.c b/drivers/scsi/be2iscsi/be_main.c index 89bf558..257e2d2 100644 --- a/drivers/scsi/be2iscsi/be_main.c +++ b/drivers/scsi/be2iscsi/be_main.c @@ -811,14 +811,23 @@ static void hwi_ring_eq_db(struct beiscsi_hba *phba, unsigned char rearm, unsigned char event) { u32 val = 0; - val |= id & DB_EQ_RING_ID_MASK; + if (rearm) val |= 1 << DB_EQ_REARM_SHIFT; if (clr_interrupt) val |= 1 << DB_EQ_CLR_SHIFT; if (event) val |= 1 << DB_EQ_EVNT_SHIFT; + val |= num_processed << DB_EQ_NUM_POPPED_SHIFT; + /* Setting lower order EQ_ID Bits */ + val |= (id & DB_EQ_RING_ID_LOW_MASK); + + /* Setting Higher order EQ_ID Bits */ + val |= (((id >> DB_EQ_HIGH_FEILD_SHIFT) & + DB_EQ_RING_ID_HIGH_MASK) + << DB_EQ_HIGH_SET_SHIFT); + iowrite32(val, phba->db_va + DB_EQ_OFFSET); } @@ -1150,15 +1159,25 @@ free_msix_irqs: return ret; } -static void hwi_ring_cq_db(struct beiscsi_hba *phba, +void hwi_ring_cq_db(struct beiscsi_hba *phba, unsigned int id, unsigned int num_processed, unsigned char rearm, unsigned char event) { u32 val = 0; - val |= id & DB_CQ_RING_ID_MASK; + if (rearm) val |= 1 << DB_CQ_REARM_SHIFT; + val |= num_processed << DB_CQ_NUM_POPPED_SHIFT; + + /* Setting lower order CQ_ID Bits */ + val |= (id & DB_CQ_RING_ID_LOW_MASK); + + /* Setting Higher order CQ_ID Bits */ + val |= (((id >> DB_CQ_HIGH_FEILD_SHIFT) & + DB_CQ_RING_ID_HIGH_MASK) + << DB_CQ_HIGH_SET_SHIFT); + iowrite32(val, phba->db_va + DB_CQ_OFFSET); } diff --git a/drivers/scsi/be2iscsi/be_main.h b/drivers/scsi/be2iscsi/be_main.h index 0076119..224a8ae 100644 --- a/drivers/scsi/be2iscsi/be_main.h +++ b/drivers/scsi/be2iscsi/be_main.h @@ -135,11 +135,15 @@ #define DB_RXULP0_OFFSET 0xA0 /********* Event Q door bell *************/ #define DB_EQ_OFFSET DB_CQ_OFFSET -#define DB_EQ_RING_ID_MASK 0x1FF /* bits 0 - 8 */ +#define DB_EQ_RING_ID_LOW_MASK 0x1FF /* bits 0 - 8 */ /* Clear the interrupt for this eq */ #define DB_EQ_CLR_SHIFT (9) /* bit 9 */ /* Must be 1 */ #define DB_EQ_EVNT_SHIFT (10) /* bit 10 */ +/* Higher Order EQ_ID bit */ +#define DB_EQ_RING_ID_HIGH_MASK 0x1F /* bits 11 - 15 */ +#define DB_EQ_HIGH_SET_SHIFT 11 +#define DB_EQ_HIGH_FEILD_SHIFT 9 /* Number of event entries processed */ #define DB_EQ_NUM_POPPED_SHIFT (16) /* bits 16 - 28 */ /* Rearm bit */ @@ -147,7 +151,12 @@ /********* Compl Q door bell *************/ #define DB_CQ_OFFSET 0x120 -#define DB_CQ_RING_ID_MASK 0x3FF /* bits 0 - 9 */ +#define DB_CQ_RING_ID_LOW_MASK 0x3FF /* bits 0 - 9 */ +/* Higher Order CQ_ID bit */ +#define DB_CQ_RING_ID_HIGH_MASK 0x1F /* bits 11 - 15 */ +#define DB_CQ_HIGH_SET_SHIFT 11 +#define DB_CQ_HIGH_FEILD_SHIFT 10 + /* Number of event entries processed */ #define DB_CQ_NUM_POPPED_SHIFT (16) /* bits 16 - 28 */ /* Rearm bit */ @@ -833,6 +842,9 @@ void beiscsi_process_all_cqs(struct work_struct *work); void beiscsi_free_mgmt_task_handles(struct beiscsi_conn *beiscsi_conn, struct iscsi_task *task); +void hwi_ring_cq_db(struct beiscsi_hba *phba, + unsigned int id, unsigned int num_processed, + unsigned char rearm, unsigned char event); static inline bool beiscsi_error(struct beiscsi_hba *phba) { return phba->ue_detected || phba->fw_timeout; -- 1.8.5.3 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 5/8] be2iscsi: Fix the session cleanup when reboot/shutdown happens 2014-01-29 7:16 [PATCH 1/8] be2iscsi: Fix handling timed out MBX completion from FW Jayamohan Kallickal ` (2 preceding siblings ...) 2014-01-29 7:16 ` [PATCH 4/8] be2iscsi: Fix doorbell format for EQ/CQ/RQ s per SLI spec Jayamohan Kallickal @ 2014-01-29 7:16 ` Jayamohan Kallickal 2014-01-29 7:16 ` [PATCH 6/8] be2iscsi: Fix scsi_cmnd leakage in driver Jayamohan Kallickal ` (3 subsequent siblings) 7 siblings, 0 replies; 12+ messages in thread From: Jayamohan Kallickal @ 2014-01-29 7:16 UTC (permalink / raw) To: jbottomley, linux-scsi, michaelc; +Cc: Jayamohan Kallickal, John Soni Jose From: Jayamohan Kallickal <jayamohan.kallickal@emulex.com> In iSCSI Boot scenario, when machine is reboot/shutdown phase the active sessions are not closed. Driver queue cleanup is done as part of unload and device is disabled. Sessions are still active, iSCSI commands are issued from session which comes to driver, as driver cleanup and device disabled there is kernel stack dump with errors. Fix is invoking iscsi_session_failure with ISCSI_ERR_INVALID_HOST on all the active sessions when shutdown routine is called. Signed-off-by: John Soni Jose <sony.john-n@emulex.com> Signed-off-by: Jayamohan Kallickal <jayamohan.kallickal@emulex.com> --- drivers/scsi/be2iscsi/be.h | 1 + drivers/scsi/be2iscsi/be_cmds.c | 17 ++++++++++++++++- drivers/scsi/be2iscsi/be_cmds.h | 1 + drivers/scsi/be2iscsi/be_iscsi.c | 1 + drivers/scsi/be2iscsi/be_main.c | 2 ++ drivers/scsi/be2iscsi/be_main.h | 5 +++++ 6 files changed, 26 insertions(+), 1 deletion(-) diff --git a/drivers/scsi/be2iscsi/be.h b/drivers/scsi/be2iscsi/be.h index 23c73fe..1bfb0bd 100644 --- a/drivers/scsi/be2iscsi/be.h +++ b/drivers/scsi/be2iscsi/be.h @@ -139,6 +139,7 @@ struct be_ctrl_info { #define PAGE_SHIFT_4K 12 #define PAGE_SIZE_4K (1 << PAGE_SHIFT_4K) #define mcc_timeout 120000 /* 12s timeout */ +#define BEISCSI_LOGOUT_SYNC_DELAY 250 /* Returns number of pages spanned by the data starting at the given addr */ #define PAGES_4K_SPANNED(_address, size) \ diff --git a/drivers/scsi/be2iscsi/be_cmds.c b/drivers/scsi/be2iscsi/be_cmds.c index 86d91f3..1432ed5 100644 --- a/drivers/scsi/be2iscsi/be_cmds.c +++ b/drivers/scsi/be2iscsi/be_cmds.c @@ -400,8 +400,23 @@ static struct be_mcc_compl *be_mcc_compl_get(struct beiscsi_hba *phba) return NULL; } -static void be2iscsi_fail_session(struct iscsi_cls_session *cls_session) +/** + * be2iscsi_fail_session(): Closing session with appropriate error + * @cls_session: ptr to session + * + * Depending on adapter state appropriate error flag is passed. + **/ +void be2iscsi_fail_session(struct iscsi_cls_session *cls_session) { + struct Scsi_Host *shost = iscsi_session_to_shost(cls_session); + struct beiscsi_hba *phba = iscsi_host_priv(shost); + uint32_t iscsi_err_flag; + + if (phba->state & BE_ADAPTER_STATE_SHUTDOWN) + iscsi_err_flag = ISCSI_ERR_INVALID_HOST; + else + iscsi_err_flag = ISCSI_ERR_CONN_FAILED; + iscsi_session_failure(cls_session->dd_data, ISCSI_ERR_CONN_FAILED); } diff --git a/drivers/scsi/be2iscsi/be_cmds.h b/drivers/scsi/be2iscsi/be_cmds.h index 59abd27..64b60e7 100644 --- a/drivers/scsi/be2iscsi/be_cmds.h +++ b/drivers/scsi/be2iscsi/be_cmds.h @@ -1325,4 +1325,5 @@ void be_wrb_hdr_prepare(struct be_mcc_wrb *wrb, int payload_len, void be_cmd_hdr_prepare(struct be_cmd_req_hdr *req_hdr, u8 subsystem, u8 opcode, int cmd_len); +void be2iscsi_fail_session(struct iscsi_cls_session *cls_session); #endif /* !BEISCSI_CMDS_H */ diff --git a/drivers/scsi/be2iscsi/be_iscsi.c b/drivers/scsi/be2iscsi/be_iscsi.c index a7a210e..a3df433 100644 --- a/drivers/scsi/be2iscsi/be_iscsi.c +++ b/drivers/scsi/be2iscsi/be_iscsi.c @@ -1361,6 +1361,7 @@ void beiscsi_ep_disconnect(struct iscsi_endpoint *ep) beiscsi_mccq_compl(phba, tag, NULL, NULL); beiscsi_close_conn(beiscsi_ep, tcp_upload_flag); free_ep: + msleep(BEISCSI_LOGOUT_SYNC_DELAY); beiscsi_free_ep(beiscsi_ep); beiscsi_unbind_conn_to_cid(phba, beiscsi_ep->ep_cid); iscsi_destroy_endpoint(beiscsi_ep->openiscsi_ep); diff --git a/drivers/scsi/be2iscsi/be_main.c b/drivers/scsi/be2iscsi/be_main.c index 257e2d2..ee6094c 100644 --- a/drivers/scsi/be2iscsi/be_main.c +++ b/drivers/scsi/be2iscsi/be_main.c @@ -5383,6 +5383,8 @@ static void beiscsi_shutdown(struct pci_dev *pcidev) return; } + phba->state = BE_ADAPTER_STATE_SHUTDOWN; + iscsi_host_for_each_session(phba->shost, be2iscsi_fail_session); beiscsi_quiesce(phba, BEISCSI_CLEAN_UNLOAD); pci_disable_device(pcidev); } diff --git a/drivers/scsi/be2iscsi/be_main.h b/drivers/scsi/be2iscsi/be_main.h index 224a8ae..f86b7f1 100644 --- a/drivers/scsi/be2iscsi/be_main.h +++ b/drivers/scsi/be2iscsi/be_main.h @@ -97,9 +97,14 @@ #define INVALID_SESS_HANDLE 0xFFFFFFFF +/** + * Adapter States + **/ #define BE_ADAPTER_LINK_UP 0x001 #define BE_ADAPTER_LINK_DOWN 0x002 #define BE_ADAPTER_PCI_ERR 0x004 +#define BE_ADAPTER_STATE_SHUTDOWN 0x008 + #define BEISCSI_CLEAN_UNLOAD 0x01 #define BEISCSI_EEH_UNLOAD 0x02 -- 1.8.5.3 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 6/8] be2iscsi: Fix scsi_cmnd leakage in driver. 2014-01-29 7:16 [PATCH 1/8] be2iscsi: Fix handling timed out MBX completion from FW Jayamohan Kallickal ` (3 preceding siblings ...) 2014-01-29 7:16 ` [PATCH 5/8] be2iscsi: Fix the session cleanup when reboot/shutdown happens Jayamohan Kallickal @ 2014-01-29 7:16 ` Jayamohan Kallickal 2014-01-29 7:16 ` [PATCH 7/8] be2iscsi : Fix DMA Out of SW-IOMMU space error Jayamohan Kallickal ` (2 subsequent siblings) 7 siblings, 0 replies; 12+ messages in thread From: Jayamohan Kallickal @ 2014-01-29 7:16 UTC (permalink / raw) To: jbottomley, linux-scsi, michaelc; +Cc: Jayamohan Kallickal, John Soni Jose From: Jayamohan Kallickal <jayamohan.kallickal@emulex.com> scsi_cmnd n io_task was not NULL when - Link goes down while IO was happening and session is closed. - Task for which TMF was sent. Signed-off-by: John Soni Jose <sony.john-n@emulex.com> Signed-off-by: Jayamohan Kallickal <jayamohan.kallickal@emulex.com> --- drivers/scsi/be2iscsi/be_main.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/drivers/scsi/be2iscsi/be_main.c b/drivers/scsi/be2iscsi/be_main.c index ee6094c..d9bd4b9 100644 --- a/drivers/scsi/be2iscsi/be_main.c +++ b/drivers/scsi/be2iscsi/be_main.c @@ -1418,8 +1418,10 @@ be_complete_io(struct beiscsi_conn *beiscsi_conn, resid = csol_cqe->res_cnt; if (!task->sc) { - if (io_task->scsi_cmnd) + if (io_task->scsi_cmnd) { scsi_dma_unmap(io_task->scsi_cmnd); + io_task->scsi_cmnd = NULL; + } return; } @@ -1456,6 +1458,7 @@ be_complete_io(struct beiscsi_conn *beiscsi_conn, conn->rxdata_octets += resid; unmap: scsi_dma_unmap(io_task->scsi_cmnd); + io_task->scsi_cmnd = NULL; iscsi_complete_scsi_task(task, exp_cmdsn, max_cmdsn); } @@ -4705,6 +4708,11 @@ static void beiscsi_cleanup_task(struct iscsi_task *task) spin_unlock(&phba->io_sgl_lock); io_task->psgl_handle = NULL; } + + if (io_task->scsi_cmnd) { + scsi_dma_unmap(io_task->scsi_cmnd); + io_task->scsi_cmnd = NULL; + } } else { if (!beiscsi_conn->login_in_progress) beiscsi_free_mgmt_task_handles(beiscsi_conn, task); -- 1.8.5.3 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 7/8] be2iscsi : Fix DMA Out of SW-IOMMU space error 2014-01-29 7:16 [PATCH 1/8] be2iscsi: Fix handling timed out MBX completion from FW Jayamohan Kallickal ` (4 preceding siblings ...) 2014-01-29 7:16 ` [PATCH 6/8] be2iscsi: Fix scsi_cmnd leakage in driver Jayamohan Kallickal @ 2014-01-29 7:16 ` Jayamohan Kallickal 2014-01-29 7:16 ` [PATCH 8/8] be2iscsi : Bump the driver version Jayamohan Kallickal 2014-01-29 7:16 ` [PATCH V2 0/8] be2iscsi: Update to 10.2.125.0 Jayamohan Kallickal 7 siblings, 0 replies; 12+ messages in thread From: Jayamohan Kallickal @ 2014-01-29 7:16 UTC (permalink / raw) To: jbottomley, linux-scsi, michaelc; +Cc: Jayamohan Kallickal, Minh Tran From: Jayamohan Kallickal <jayamohan.kallickal@emulex.com> Setting DMA bit mask 64 and roll back to 32 if not supported. Signed-off-by: Minh Tran <minhduc.tran@emulex.com> Signed-off-by: Jayamohan Kallickal <jayamohan.kallickal@emulex.com> --- drivers/scsi/be2iscsi/be_main.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/drivers/scsi/be2iscsi/be_main.c b/drivers/scsi/be2iscsi/be_main.c index d9bd4b9..dd7eb12 100644 --- a/drivers/scsi/be2iscsi/be_main.c +++ b/drivers/scsi/be2iscsi/be_main.c @@ -681,8 +681,19 @@ static int beiscsi_enable_pci(struct pci_dev *pcidev) } pci_set_master(pcidev); - if (pci_set_consistent_dma_mask(pcidev, DMA_BIT_MASK(64))) { - ret = pci_set_consistent_dma_mask(pcidev, DMA_BIT_MASK(32)); + ret = pci_set_dma_mask(pcidev, DMA_BIT_MASK(64)); + if (ret) { + ret = pci_set_dma_mask(pcidev, DMA_BIT_MASK(32)); + if (ret) { + dev_err(&pcidev->dev, "Could not set PCI DMA Mask\n"); + pci_disable_device(pcidev); + return ret; + } else { + ret = pci_set_consistent_dma_mask(pcidev, + DMA_BIT_MASK(32)); + } + } else { + ret = pci_set_consistent_dma_mask(pcidev, DMA_BIT_MASK(64)); if (ret) { dev_err(&pcidev->dev, "Could not set PCI DMA Mask\n"); pci_disable_device(pcidev); -- 1.8.5.3 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 8/8] be2iscsi : Bump the driver version 2014-01-29 7:16 [PATCH 1/8] be2iscsi: Fix handling timed out MBX completion from FW Jayamohan Kallickal ` (5 preceding siblings ...) 2014-01-29 7:16 ` [PATCH 7/8] be2iscsi : Fix DMA Out of SW-IOMMU space error Jayamohan Kallickal @ 2014-01-29 7:16 ` Jayamohan Kallickal 2014-01-29 7:16 ` [PATCH V2 0/8] be2iscsi: Update to 10.2.125.0 Jayamohan Kallickal 7 siblings, 0 replies; 12+ messages in thread From: Jayamohan Kallickal @ 2014-01-29 7:16 UTC (permalink / raw) To: jbottomley, linux-scsi, michaelc; +Cc: Jayamohan Kallickal, John Soni Jose From: Jayamohan Kallickal <jayamohan.kallickal@emulex.com> Bump Driver Version Signed-off-by: John Soni Jose <sony.john-n@emulex.com> Signed-off-by: Jayamohan Kallickal <jayamohan.kallickal@emulex.com> --- drivers/scsi/be2iscsi/be_main.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/scsi/be2iscsi/be_main.h b/drivers/scsi/be2iscsi/be_main.h index f86b7f1..09ba0b9 100644 --- a/drivers/scsi/be2iscsi/be_main.h +++ b/drivers/scsi/be2iscsi/be_main.h @@ -36,7 +36,7 @@ #include <scsi/scsi_transport_iscsi.h> #define DRV_NAME "be2iscsi" -#define BUILD_STR "10.0.659.0" +#define BUILD_STR "10.2.125.0" #define BE_NAME "Emulex OneConnect" \ "Open-iSCSI Driver version" BUILD_STR #define DRV_DESC BE_NAME " " "Driver" -- 1.8.5.3 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH V2 0/8] be2iscsi: Update to 10.2.125.0 2014-01-29 7:16 [PATCH 1/8] be2iscsi: Fix handling timed out MBX completion from FW Jayamohan Kallickal ` (6 preceding siblings ...) 2014-01-29 7:16 ` [PATCH 8/8] be2iscsi : Bump the driver version Jayamohan Kallickal @ 2014-01-29 7:16 ` Jayamohan Kallickal 2014-02-05 21:44 ` Mike Christie 7 siblings, 1 reply; 12+ messages in thread From: Jayamohan Kallickal @ 2014-01-29 7:16 UTC (permalink / raw) To: jbottomley, linux-scsi, michaelc; +Cc: Jayamohan Kallickal From: Jayamohan Kallickal <jayamohan.kallickal@emulex.com> This patchset updates be2iscsi driver to 10.2.125.0. Regarding comments by Mike Christie on Version 1 Patch 5/7) - converted to common function Patch 4/7 - Will withdraw for now as there is lots of changes to be done. These patches are based of scsi.git scsi 0001 - Fix handling timed out MBX completion from FW 0002 - Fix port speed typo in driver 0003 - Fix IRQ_Affinity support in driver 0004 - Fix doorbell format for EQ CQ RQ per SLI 0005 - Fix the session cleanup when reboot shutdown 0006 - Fix scsi_cmnd leakage in driver 0007 - Fix DMA Out of SW IOMMU space error 0008 - Bump the driver version Thanks Jay Signed-off-by: Jayamohan Kallickal <jayamohan.kallickal@emulex.com> --- ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH V2 0/8] be2iscsi: Update to 10.2.125.0 2014-01-29 7:16 ` [PATCH V2 0/8] be2iscsi: Update to 10.2.125.0 Jayamohan Kallickal @ 2014-02-05 21:44 ` Mike Christie 0 siblings, 0 replies; 12+ messages in thread From: Mike Christie @ 2014-02-05 21:44 UTC (permalink / raw) To: Jayamohan Kallickal; +Cc: jbottomley, linux-scsi, Jayamohan Kallickal On 01/29/2014 01:16 AM, Jayamohan Kallickal wrote: > From: Jayamohan Kallickal <jayamohan.kallickal@emulex.com> > > This patchset updates be2iscsi driver to 10.2.125.0. > > Regarding comments by Mike Christie on Version 1 > > Patch 5/7) - converted to common function > Patch 4/7 - Will withdraw for now as there is lots of > changes to be done. > > These patches are based of scsi.git scsi > > 0001 - Fix handling timed out MBX completion from FW > 0002 - Fix port speed typo in driver > 0003 - Fix IRQ_Affinity support in driver > 0004 - Fix doorbell format for EQ CQ RQ per SLI > 0005 - Fix the session cleanup when reboot shutdown > 0006 - Fix scsi_cmnd leakage in driver > 0007 - Fix DMA Out of SW IOMMU space error > 0008 - Bump the driver version > > > Thanks > Jay > > Signed-off-by: Jayamohan Kallickal <jayamohan.kallickal@emulex.com> > --- > Ok, looks like Jay dropped 3/8 and the other patches look ok. Reviewed-by: Mike Christie <michaelc@cs.wisc.edu> ^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2014-02-05 21:45 UTC | newest] Thread overview: 12+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2014-01-29 7:16 [PATCH 1/8] be2iscsi: Fix handling timed out MBX completion from FW Jayamohan Kallickal 2014-01-29 7:16 ` [PATCH 2/8] be2iscsi: Fix port speed typo in driver Jayamohan Kallickal 2014-01-29 7:16 ` [PATCH 3/8] be2iscsi : Fix IRQ_Affinity support " Jayamohan Kallickal 2014-02-01 22:46 ` Mike Christie 2014-02-05 5:09 ` Jayamohan Kallickal 2014-01-29 7:16 ` [PATCH 4/8] be2iscsi: Fix doorbell format for EQ/CQ/RQ s per SLI spec Jayamohan Kallickal 2014-01-29 7:16 ` [PATCH 5/8] be2iscsi: Fix the session cleanup when reboot/shutdown happens Jayamohan Kallickal 2014-01-29 7:16 ` [PATCH 6/8] be2iscsi: Fix scsi_cmnd leakage in driver Jayamohan Kallickal 2014-01-29 7:16 ` [PATCH 7/8] be2iscsi : Fix DMA Out of SW-IOMMU space error Jayamohan Kallickal 2014-01-29 7:16 ` [PATCH 8/8] be2iscsi : Bump the driver version Jayamohan Kallickal 2014-01-29 7:16 ` [PATCH V2 0/8] be2iscsi: Update to 10.2.125.0 Jayamohan Kallickal 2014-02-05 21:44 ` Mike Christie
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox