be2iscsi: Use start cid and number of cid / icd from FW
PATCH 1/4 be2iscsi: Use start cid and number of cid / icd from FW
This patch enablesi be2iscsi to use the start number and number
of cids/icd provided by FW rather than hard coded values.
--- drivers/scsi/be2iscsi/be_iscsi.c | 7 ++- drivers/scsi/be2iscsi/be_main.c | 106 +++++++++++++++++++++----------------- drivers/scsi/be2iscsi/be_main.h | 10 +--- drivers/scsi/be2iscsi/be_mgmt.c | 11 ++++- 4 files changed, 75 insertions(+), 59 deletions(-)
drivers/scsi/be2iscsi/be_iscsi.c +4 -3
@@ -431,9 +431,10 @@ static int beiscsi_open_conn(struct iscsi_endpoint *ep, }SE_DEBUG (DBG_LVL_8 ,"In beiscsi_open_conn, ep_cid=%d " , beiscsi_ep->ep_cid); - phba->ep_array[beiscsi_ep->ep_cid] = ep; -if (beiscsi_ep->ep_cid > - (phba->fw_config.iscsi_cid_start + phba->params.cxns_per_ctrl)) { + phba->ep_array[beiscsi_ep->ep_cid - + phba->fw_config.iscsi_cid_start] = ep; +if (beiscsi_ep->ep_cid > (phba->fw_config.iscsi_cid_start + + phba->params.cxns_per_ctrl *2 )) {SE_DEBUG (DBG_LVL_1 ,"Failed in allocate iscsi cid\n" );return ret; }
drivers/scsi/be2iscsi/be_main.c +59 -47
250 lines not on this page · raw message
drivers/scsi/be2iscsi/be_main.h +2 -8
@@ -46,23 +46,18 @@#define OC_DEVICE_ID3 0x712#define OC_DEVICE_ID4 0x222 -#define BE2_MAX_SESSIONS 64 +#define BE2_IO_DEPTH 1024 +#define BE2_MAX_SESSIONS 256#define BE2_CMDS_PER_CXN 128 -#define BE2_LOGOUTS BE2_MAX_SESSIONS#define BE2_TMFS 16#define BE2_NOPOUT_REQ 16 -#define BE2_ASYNCPDUS BE2_MAX_SESSIONS -#define BE2_MAX_ICDS 2048#define BE2_SGE 32#define BE2_DEFPDU_HDR_SZ 64#define BE2_DEFPDU_DATA_SZ 8192 -#define BE2_IO_DEPTH \ - (BE2_MAX_ICDS / 2 - (BE2_LOGOUTS + BE2_TMFS + BE2_NOPOUT_REQ))#define MAX_CPUS 31#define BEISCSI_SGLIST_ELEMENTS BE2_SGE -#define BEISCSI_MAX_CMNDS 1024/* Max IO's per Ctrlr sht->can_queue */ #define BEISCSI_CMD_PER_LUN 128/* scsi_host->cmd_per_lun */ #define BEISCSI_MAX_SECTORS 2048/* scsi_host->max_sectors */
@@ -802,7 +797,6 @@ struct hwi_controller {struct be_ring default_pdu_hdr;struct be_ring default_pdu_data;struct hwi_context_memory *phwi_ctxt; -unsigned short cq_errors[CXN_KILLED_CMND_DATA_NOT_ON_SAME_CONN ]; };enum hwh_type_enum {
drivers/scsi/be2iscsi/be_mgmt.c +10 -1
@@ -48,6 +48,14 @@ unsigned char mgmt_get_fw_config(struct be_ctrl_info *ctrl, pfw_cfg->ulp[0 ].sq_base; phba->fw_config.iscsi_cid_count = pfw_cfg->ulp[0 ].sq_count; +if (phba->fw_config.iscsi_cid_count > (BE2_MAX_SESSIONS /2 )) { + status =1 ; +shost_printk (KERN_WARNING , phba->shost, +"FW reported MAX CXNS as %d \t" +"Max Supported = %d. Failing to load \n" , + phba->fw_config.iscsi_cid_count, +BE2_MAX_SESSIONS ); + } }else {shost_printk (KERN_WARNING , phba->shost,"Failed in mgmt_get_fw_config \n" );
@@ -317,7 +325,8 @@ int mgmt_open_connection(struct beiscsi_hba *phba,struct tcp_connect_and_offload_out *ptcpcnct_out =embedded_payload (wrb); - ep = phba->ep_array[ptcpcnct_out->cid]; + ep = phba->ep_array[ptcpcnct_out->cid - + phba->fw_config.iscsi_cid_start]; beiscsi_ep = ep->dd_data; beiscsi_ep->fw_handle = ptcpcnct_out->connection_handle; beiscsi_ep->cid_vld =1 ;
Signature · 1 line
1.6.4
PATCH 1/5 pm8001: Fix for sata io circular lock dependency.
This patch fix for sata io circular lock dependency. when we calltask_done for SATA io, we have get pm8001_ha->lock ,and in sas_ata_task_done, it will get
(dev->sata_dev.ap->lock. then cause circular lock dependency .So we should droppm8001_ha->lock when we call task_done for SATA task.
Quoted 1 line
From
5ed129af3c06470953f2f8126b61af38545db314Mon Sep 17 00:00:00 2001
From: Jack Wang <[email protected]>
Date: Wed, 18 Nov 2009 15:19:08 +0800
Subject: [PATCH 1/4] Fix sata circular lock dependency
--- drivers/scsi/pm8001/pm8001_hwi.c | 40 +++++++++++++++++++++++++++++++++---- 1 files changed, 35 insertions(+), 5 deletions(-)
drivers/scsi/pm8001/pm8001_hwi.c +35 -5
@@ -1901,7 +1901,7 @@ mpi_sata_completion(struct pm8001_hba_info *pm8001_ha, void *piomb) {struct sas_task *t;struct pm8001_ccb_info *ccb; -unsigned long flags; +unsigned long flags =0 ;u32 param;u32 status;u32 tag;
@@ -2040,7 +2040,9 @@ mpi_sata_completion(struct pm8001_hba_info *pm8001_ha, void *piomb) ts->stat =SAS_QUEUE_FULL ;pm8001_ccb_task_free (pm8001_ha, t, ccb, tag);mb ();/*in order to force CPU ordering*/ +spin_unlock_irqrestore (&pm8001_ha->lock, flags); t->task_done (t); +spin_lock_irqsave (&pm8001_ha->lock, flags);return ; }break ;
@@ -2058,7 +2060,9 @@ mpi_sata_completion(struct pm8001_hba_info *pm8001_ha, void *piomb) ts->stat =SAS_QUEUE_FULL ;pm8001_ccb_task_free (pm8001_ha, t, ccb, tag);mb ();/*ditto*/ +spin_unlock_irqrestore (&pm8001_ha->lock, flags); t->task_done (t); +spin_lock_irqsave (&pm8001_ha->lock, flags);return ; }break ;
@@ -2084,7 +2088,9 @@ mpi_sata_completion(struct pm8001_hba_info *pm8001_ha, void *piomb) ts->stat =SAS_QUEUE_FULL ;pm8001_ccb_task_free (pm8001_ha, t, ccb, tag);mb ();/* ditto*/ +spin_unlock_irqrestore (&pm8001_ha->lock, flags); t->task_done (t); +spin_lock_irqsave (&pm8001_ha->lock, flags);return ; }break ;
@@ -2149,7 +2155,9 @@ mpi_sata_completion(struct pm8001_hba_info *pm8001_ha, void *piomb) ts->stat =SAS_QUEUE_FULL ;pm8001_ccb_task_free (pm8001_ha, t, ccb, tag);mb ();/*ditto*/ +spin_unlock_irqrestore (&pm8001_ha->lock, flags); t->task_done (t); +spin_lock_irqsave (&pm8001_ha->lock, flags);return ; }break ;
@@ -2171,7 +2179,9 @@ mpi_sata_completion(struct pm8001_hba_info *pm8001_ha, void *piomb) ts->stat =SAS_QUEUE_FULL ;pm8001_ccb_task_free (pm8001_ha, t, ccb, tag);mb ();/*ditto*/ +spin_unlock_irqrestore (&pm8001_ha->lock, flags); t->task_done (t); +spin_lock_irqsave (&pm8001_ha->lock, flags);return ; }break ;
@@ -2200,11 +2210,20 @@ mpi_sata_completion(struct pm8001_hba_info *pm8001_ha, void *piomb)" resp 0x%x stat 0x%x but aborted by upper layer!\n" , t, status, ts->resp, ts->stat));pm8001_ccb_task_free (pm8001_ha, t, ccb, tag); - }else { + }else if (t->uldd_task) {spin_unlock_irqrestore (&t->task_state_lock, flags);pm8001_ccb_task_free (pm8001_ha, t, ccb, tag);mb ();/* ditto */ +spin_unlock_irqrestore (&pm8001_ha->lock, flags); + t->task_done (t); +spin_lock_irqsave (&pm8001_ha->lock, flags); + }else if (!t->uldd_task) { +spin_unlock_irqrestore (&t->task_state_lock, flags); +pm8001_ccb_task_free (pm8001_ha, t, ccb, tag); +mb ();/*ditto*/ +spin_unlock_irqrestore (&pm8001_ha->lock, flags); t->task_done (t); +spin_lock_irqsave (&pm8001_ha->lock, flags); } }
@@ -2212,7 +2231,7 @@ mpi_sata_completion(struct pm8001_hba_info *pm8001_ha, void *piomb)static void mpi_sata_event (struct pm8001_hba_info *pm8001_ha ,void *piomb) {struct sas_task *t; -unsigned long flags; +unsigned long flags =0 ;struct task_status_struct *ts;struct pm8001_ccb_info *ccb;struct pm8001_device *pm8001_dev;
@@ -2292,7 +2311,9 @@ static void mpi_sata_event(struct pm8001_hba_info *pm8001_ha , void *piomb) ts->stat =SAS_QUEUE_FULL ;pm8001_ccb_task_free (pm8001_ha, t, ccb, tag);mb ();/*ditto*/ +spin_unlock_irqrestore (&pm8001_ha->lock, flags); t->task_done (t); +spin_lock_irqsave (&pm8001_ha->lock, flags);return ; }break ;
@@ -2401,11 +2422,20 @@ static void mpi_sata_event(struct pm8001_hba_info *pm8001_ha , void *piomb)" resp 0x%x stat 0x%x but aborted by upper layer!\n" , t, event, ts->resp, ts->stat));pm8001_ccb_task_free (pm8001_ha, t, ccb, tag); - }else { + }else if (t->uldd_task) {spin_unlock_irqrestore (&t->task_state_lock, flags);pm8001_ccb_task_free (pm8001_ha, t, ccb, tag); -mb ();/* in order to force CPU ordering */ +mb ();/* ditto */ +spin_unlock_irqrestore (&pm8001_ha->lock, flags); + t->task_done (t); +spin_lock_irqsave (&pm8001_ha->lock, flags); + }else if (!t->uldd_task) { +spin_unlock_irqrestore (&t->task_state_lock, flags); +pm8001_ccb_task_free (pm8001_ha, t, ccb, tag); +mb ();/*ditto*/ +spin_unlock_irqrestore (&pm8001_ha->lock, flags); t->task_done (t); +spin_lock_irqsave (&pm8001_ha->lock, flags); } }
Signature · 1 line
1.6.5.1.1367.gcd48