ocs_pci_probe()開始做PCI device註冊ocs_device_attach() 在此註冊callback function ocs_unsolicited_cb()
並且在此
/*Allocate buffers for unsolicited received data and give to the HAL*/
可以看到create
buffers 並且給予HAL , copy data用, 但是這裡並沒有整理成一個完整的結構, 透過兩個32bit的buffer 放入queue, hal 會從queue拿, 這個函數也帶有大量的初始. 可以參考.
接下來是ocs_unsolicited_cb()
frame =
ocs_fc_frame_alloc(ocs, status, header, header_len, payload, payload_len);
ocs_list_add_tail(&node->pend_frames,
frame);
這邊只是將上述參數, 打包成一個frame結構, 並且放入pend_frames.
接下來ocs_dispatch_frame()
Cbdata 包含了header
address, payload address , 看來是打算傳給下面, 準備傳data給這些的address
接下來ocs_dispatch_unsolicited_fcp()
第一次出現io結構
接下來ocs_scsi_recv_cmd()->ocs_scsi_recv_cmd_common()
io->tgt_io 繼續填io 結構. scst_cmd_init_done()這邊為止,已經create一個新的cmd, 並且給值
接下來scst_cmd_init_done()
透過SCST_CONTEXT_THREAD, 放入&cmd->cmd_threads->active_cmd_list
然後會在scst_cmd_thread()
scst_do_job_active(&p_cmd_threads->active_cmd_list,
&p_cmd_threads->cmd_list_lock,
false);
開始處理active_cmd_list
接下來scst_process_active_cmd()
這邊可以看到一個狀態機, 處理cmd的情形, 但是此時, hal data應該還沒拿到
針對DATA 問題, scst_rdy_to_xfer()->tgtt->rdy_to_xfer()->ocs_scst_rdy_to_xfer()
->ocs_scst_write_phase_start()->ocs_scsi_recv_wr_data()->ocs_scsi_xfer_data()->ocs_scsi_io_dispatch()
->ocs_hal_io_send()->sli_queue_write()在這邊可以看到將wqe寫入hal->wq ,那麼, 我們從work queue取得entry位置是在? ocs_hal_process()這邊可以取得entry …待續
沒有留言:
張貼留言