aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/qla4xxx/ql4_isr.c
diff options
context:
space:
mode:
authorManish Rangankar <manish.rangankar@qlogic.com>2011-07-25 14:48:53 -0400
committerJames Bottomley <JBottomley@Parallels.com>2011-08-27 10:36:24 -0400
commitb3a271a94d0034dd3bab10b8d8cd432843be629e (patch)
treee6b3db659daf0aa5c18394e0e58eb43c0a1c68af /drivers/scsi/qla4xxx/ql4_isr.c
parent17fa575eec7254fb089f858cae135d64cd015440 (diff)
[SCSI] qla4xxx: support iscsiadm session mgmt
Add scsi_transport_iscsi hooks in qla4xxx to support iSCSI session management using iscsiadm. This patch is based on discussion here http://groups.google.com/group/open-iscsi/browse_thread/thread/e89fd888baf656a0# Now users can use iscsiadm to do target discovery and do login/logout to individual targets using the qla4xxx iSCSI class interface. This patch leaves some dead code, but to make it easier to review we are leaving and in the next patch we will remove that old code. V2 - NOTE: Added code to avoid waiting for AEN during login/logout in the driver, instead added a kernel to user event to notify iscsid about login status. Because of this iscsid will not get blocked. Signed-off-by: Manish Rangankar <manish.rangankar@qlogic.com> Signed-off-by: Lalit Chandivade <lalit.chandivade@qlogic.com> Signed-off-by: Mike Christie <michaelc@cs.wisc.edu> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
Diffstat (limited to 'drivers/scsi/qla4xxx/ql4_isr.c')
-rw-r--r--drivers/scsi/qla4xxx/ql4_isr.c81
1 files changed, 67 insertions, 14 deletions
diff --git a/drivers/scsi/qla4xxx/ql4_isr.c b/drivers/scsi/qla4xxx/ql4_isr.c
index 0e72921c752d..ee1104a3686c 100644
--- a/drivers/scsi/qla4xxx/ql4_isr.c
+++ b/drivers/scsi/qla4xxx/ql4_isr.c
@@ -224,8 +224,8 @@ static void qla4xxx_status_entry(struct scsi_qla_host *ha,
224 * I/O to this device. We should get a ddb state change 224 * I/O to this device. We should get a ddb state change
225 * AEN soon. 225 * AEN soon.
226 */ 226 */
227 if (atomic_read(&ddb_entry->state) == DDB_STATE_ONLINE) 227 if (iscsi_is_session_online(ddb_entry->sess))
228 qla4xxx_mark_device_missing(ha, ddb_entry); 228 qla4xxx_mark_device_missing(ddb_entry->sess);
229 break; 229 break;
230 230
231 case SCS_DATA_UNDERRUN: 231 case SCS_DATA_UNDERRUN:
@@ -306,8 +306,8 @@ static void qla4xxx_status_entry(struct scsi_qla_host *ha,
306 * send I/O to this device. We should get a ddb 306 * send I/O to this device. We should get a ddb
307 * state change AEN soon. 307 * state change AEN soon.
308 */ 308 */
309 if (atomic_read(&ddb_entry->state) == DDB_STATE_ONLINE) 309 if (iscsi_is_session_online(ddb_entry->sess))
310 qla4xxx_mark_device_missing(ha, ddb_entry); 310 qla4xxx_mark_device_missing(ddb_entry->sess);
311 311
312 cmd->result = DID_TRANSPORT_DISRUPTED << 16; 312 cmd->result = DID_TRANSPORT_DISRUPTED << 16;
313 break; 313 break;
@@ -341,6 +341,51 @@ status_entry_exit:
341} 341}
342 342
343/** 343/**
344 * qla4xxx_passthru_status_entry - processes passthru status IOCBs (0x3C)
345 * @ha: Pointer to host adapter structure.
346 * @sts_entry: Pointer to status entry structure.
347 **/
348static void qla4xxx_passthru_status_entry(struct scsi_qla_host *ha,
349 struct passthru_status *sts_entry)
350{
351 struct iscsi_task *task;
352 struct ddb_entry *ddb_entry;
353 struct ql4_task_data *task_data;
354 struct iscsi_cls_conn *cls_conn;
355 struct iscsi_conn *conn;
356 itt_t itt;
357 uint32_t fw_ddb_index;
358
359 itt = sts_entry->handle;
360 fw_ddb_index = le32_to_cpu(sts_entry->target);
361
362 ddb_entry = qla4xxx_lookup_ddb_by_fw_index(ha, fw_ddb_index);
363
364 if (ddb_entry == NULL) {
365 ql4_printk(KERN_ERR, ha, "%s: Invalid target index = 0x%x\n",
366 __func__, sts_entry->target);
367 return;
368 }
369
370 cls_conn = ddb_entry->conn;
371 conn = cls_conn->dd_data;
372 spin_lock(&conn->session->lock);
373 task = iscsi_itt_to_task(conn, itt);
374 spin_unlock(&conn->session->lock);
375
376 if (task == NULL) {
377 ql4_printk(KERN_ERR, ha, "%s: Task is NULL\n", __func__);
378 return;
379 }
380
381 task_data = task->dd_data;
382 memcpy(&task_data->sts, sts_entry, sizeof(struct passthru_status));
383 ha->req_q_count += task_data->iocb_req_cnt;
384 ha->iocb_cnt -= task_data->iocb_req_cnt;
385 queue_work(ha->task_wq, &task_data->task_work);
386}
387
388/**
344 * qla4xxx_process_response_queue - process response queue completions 389 * qla4xxx_process_response_queue - process response queue completions
345 * @ha: Pointer to host adapter structure. 390 * @ha: Pointer to host adapter structure.
346 * 391 *
@@ -375,6 +420,14 @@ void qla4xxx_process_response_queue(struct scsi_qla_host *ha)
375 break; 420 break;
376 421
377 case ET_PASSTHRU_STATUS: 422 case ET_PASSTHRU_STATUS:
423 if (sts_entry->hdr.systemDefined == SD_ISCSI_PDU)
424 qla4xxx_passthru_status_entry(ha,
425 (struct passthru_status *)sts_entry);
426 else
427 ql4_printk(KERN_ERR, ha,
428 "%s: Invalid status received\n",
429 __func__);
430
378 break; 431 break;
379 432
380 case ET_STATUS_CONTINUATION: 433 case ET_STATUS_CONTINUATION:
@@ -1009,23 +1062,23 @@ void qla4xxx_process_aen(struct scsi_qla_host * ha, uint8_t process_aen)
1009 1062
1010 switch (mbox_sts[0]) { 1063 switch (mbox_sts[0]) {
1011 case MBOX_ASTS_DATABASE_CHANGED: 1064 case MBOX_ASTS_DATABASE_CHANGED:
1012 if (process_aen == FLUSH_DDB_CHANGED_AENS) { 1065 switch (process_aen) {
1066 case FLUSH_DDB_CHANGED_AENS:
1013 DEBUG2(printk("scsi%ld: AEN[%d] %04x, index " 1067 DEBUG2(printk("scsi%ld: AEN[%d] %04x, index "
1014 "[%d] state=%04x FLUSHED!\n", 1068 "[%d] state=%04x FLUSHED!\n",
1015 ha->host_no, ha->aen_out, 1069 ha->host_no, ha->aen_out,
1016 mbox_sts[0], mbox_sts[2], 1070 mbox_sts[0], mbox_sts[2],
1017 mbox_sts[3])); 1071 mbox_sts[3]));
1018 break; 1072 break;
1073 case PROCESS_ALL_AENS:
1074 default:
1075 /* Specific device. */
1076 if (mbox_sts[1] == 1)
1077 qla4xxx_process_ddb_changed(ha,
1078 mbox_sts[2], mbox_sts[3],
1079 mbox_sts[4]);
1080 break;
1019 } 1081 }
1020 case PROCESS_ALL_AENS:
1021 default:
1022 if (mbox_sts[1] == 0) { /* Global DB change. */
1023 qla4xxx_reinitialize_ddb_list(ha);
1024 } else if (mbox_sts[1] == 1) { /* Specific device. */
1025 qla4xxx_process_ddb_changed(ha, mbox_sts[2],
1026 mbox_sts[3], mbox_sts[4]);
1027 }
1028 break;
1029 } 1082 }
1030 spin_lock_irqsave(&ha->hardware_lock, flags); 1083 spin_lock_irqsave(&ha->hardware_lock, flags);
1031 } 1084 }