Commit 15821f05 authored by Krishna Gudipati's avatar Krishna Gudipati Committed by James Bottomley

[SCSI] bfa: io tag handling and minor bug fix.

Fix iotag handling:

1) Update and check io tag for retry case.
2) Clearing upper 3 bits in io tag when an IO completes.
   The 3 upper bits in io tags are used for counting FCP exchange retry.
   Un-cleared bits will cause firmware to access invalid memory when the
   same io tag is used for an IO to a target that doesn't support FCP
   exchange retry.
3) Only check the effective bits when validating an iotag.

Other minor fixes:

1) Added trace to get FC header type with assert of unhandled packet received.
   Ignore the type FC_TYPE_FC_FSS (FC_XS).
2) Fixed the adapter info display check - to check for fcmode flag even.
Signed-off-by: default avatarKrishna Gudipati <kgudipat@brocade.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>
parent b704495c
...@@ -1540,8 +1540,8 @@ bfa_ioim_sm_active(struct bfa_ioim_s *ioim, enum bfa_ioim_event event) ...@@ -1540,8 +1540,8 @@ bfa_ioim_sm_active(struct bfa_ioim_s *ioim, enum bfa_ioim_event event)
break; break;
case BFA_IOIM_SM_SQRETRY: case BFA_IOIM_SM_SQRETRY:
if (bfa_ioim_get_iotag(ioim) != BFA_TRUE) { if (bfa_ioim_maxretry_reached(ioim)) {
/* max retry completed free IO */ /* max retry reached, free IO */
bfa_sm_set_state(ioim, bfa_ioim_sm_hcb_free); bfa_sm_set_state(ioim, bfa_ioim_sm_hcb_free);
bfa_ioim_move_to_comp_q(ioim); bfa_ioim_move_to_comp_q(ioim);
bfa_cb_queue(ioim->bfa, &ioim->hcb_qe, bfa_cb_queue(ioim->bfa, &ioim->hcb_qe,
...@@ -1569,6 +1569,7 @@ bfa_ioim_sm_cmnd_retry(struct bfa_ioim_s *ioim, enum bfa_ioim_event event) ...@@ -1569,6 +1569,7 @@ bfa_ioim_sm_cmnd_retry(struct bfa_ioim_s *ioim, enum bfa_ioim_event event)
switch (event) { switch (event) {
case BFA_IOIM_SM_FREE: case BFA_IOIM_SM_FREE:
/* abts and rrq done. Now retry the IO with new tag */ /* abts and rrq done. Now retry the IO with new tag */
bfa_ioim_update_iotag(ioim);
if (!bfa_ioim_send_ioreq(ioim)) { if (!bfa_ioim_send_ioreq(ioim)) {
bfa_sm_set_state(ioim, bfa_ioim_sm_qfull); bfa_sm_set_state(ioim, bfa_ioim_sm_qfull);
break; break;
...@@ -2526,7 +2527,7 @@ bfa_ioim_good_comp_isr(struct bfa_s *bfa, struct bfi_msg_s *m) ...@@ -2526,7 +2527,7 @@ bfa_ioim_good_comp_isr(struct bfa_s *bfa, struct bfi_msg_s *m)
iotag = be16_to_cpu(rsp->io_tag); iotag = be16_to_cpu(rsp->io_tag);
ioim = BFA_IOIM_FROM_TAG(fcpim, iotag); ioim = BFA_IOIM_FROM_TAG(fcpim, iotag);
bfa_assert(ioim->iotag == iotag); bfa_assert(BFA_IOIM_TAG_2_ID(ioim->iotag) == iotag);
bfa_trc_fp(ioim->bfa, ioim->iotag); bfa_trc_fp(ioim->bfa, ioim->iotag);
bfa_ioim_cb_profile_comp(fcpim, ioim); bfa_ioim_cb_profile_comp(fcpim, ioim);
...@@ -2629,6 +2630,7 @@ bfa_ioim_free(struct bfa_ioim_s *ioim) ...@@ -2629,6 +2630,7 @@ bfa_ioim_free(struct bfa_ioim_s *ioim)
bfa_stats(ioim->itnim, io_comps); bfa_stats(ioim->itnim, io_comps);
fcpim->ios_active--; fcpim->ios_active--;
ioim->iotag &= BFA_IOIM_IOTAG_MASK;
list_del(&ioim->qe); list_del(&ioim->qe);
list_add_tail(&ioim->qe, &fcpim->ioim_free_q); list_add_tail(&ioim->qe, &fcpim->ioim_free_q);
} }
......
...@@ -41,7 +41,7 @@ ...@@ -41,7 +41,7 @@
(__itnim->ioprofile.iocomps[__index]++) (__itnim->ioprofile.iocomps[__index]++)
#define BFA_IOIM_RETRY_TAG_OFFSET 11 #define BFA_IOIM_RETRY_TAG_OFFSET 11
#define BFA_IOIM_RETRY_TAG_MASK 0x07ff /* 2K IOs */ #define BFA_IOIM_IOTAG_MASK 0x07ff /* 2K IOs */
#define BFA_IOIM_RETRY_MAX 7 #define BFA_IOIM_RETRY_MAX 7
/* Buckets are are 512 bytes to 2MB */ /* Buckets are are 512 bytes to 2MB */
...@@ -189,8 +189,9 @@ struct bfa_itnim_s { ...@@ -189,8 +189,9 @@ struct bfa_itnim_s {
#define bfa_itnim_is_online(_itnim) ((_itnim)->is_online) #define bfa_itnim_is_online(_itnim) ((_itnim)->is_online)
#define BFA_FCPIM_MOD(_hal) (&(_hal)->modules.fcpim_mod) #define BFA_FCPIM_MOD(_hal) (&(_hal)->modules.fcpim_mod)
#define BFA_IOIM_TAG_2_ID(_iotag) ((_iotag) & BFA_IOIM_IOTAG_MASK)
#define BFA_IOIM_FROM_TAG(_fcpim, _iotag) \ #define BFA_IOIM_FROM_TAG(_fcpim, _iotag) \
(&fcpim->ioim_arr[(_iotag & BFA_IOIM_RETRY_TAG_MASK)]) (&fcpim->ioim_arr[(_iotag & BFA_IOIM_IOTAG_MASK)])
#define BFA_TSKIM_FROM_TAG(_fcpim, _tmtag) \ #define BFA_TSKIM_FROM_TAG(_fcpim, _tmtag) \
(&fcpim->tskim_arr[_tmtag & (fcpim->num_tskim_reqs - 1)]) (&fcpim->tskim_arr[_tmtag & (fcpim->num_tskim_reqs - 1)])
...@@ -198,20 +199,21 @@ struct bfa_itnim_s { ...@@ -198,20 +199,21 @@ struct bfa_itnim_s {
(_bfa->modules.fcpim_mod.io_profile_start_time) (_bfa->modules.fcpim_mod.io_profile_start_time)
#define bfa_fcpim_get_io_profile(_bfa) \ #define bfa_fcpim_get_io_profile(_bfa) \
(_bfa->modules.fcpim_mod.io_profile) (_bfa->modules.fcpim_mod.io_profile)
#define bfa_ioim_update_iotag(__ioim) do { \
uint16_t k = (__ioim)->iotag >> BFA_IOIM_RETRY_TAG_OFFSET; \
k++; (__ioim)->iotag &= BFA_IOIM_IOTAG_MASK; \
(__ioim)->iotag |= k << BFA_IOIM_RETRY_TAG_OFFSET; \
} while (0)
static inline bfa_boolean_t static inline bfa_boolean_t
bfa_ioim_get_iotag(struct bfa_ioim_s *ioim) bfa_ioim_maxretry_reached(struct bfa_ioim_s *ioim)
{ {
u16 k = ioim->iotag; uint16_t k = ioim->iotag >> BFA_IOIM_RETRY_TAG_OFFSET;
if (k < BFA_IOIM_RETRY_MAX)
k >>= BFA_IOIM_RETRY_TAG_OFFSET; k++;
if (k > BFA_IOIM_RETRY_MAX)
return BFA_FALSE; return BFA_FALSE;
ioim->iotag &= BFA_IOIM_RETRY_TAG_MASK;
ioim->iotag |= k<<BFA_IOIM_RETRY_TAG_OFFSET;
return BFA_TRUE; return BFA_TRUE;
} }
/* /*
* function prototypes * function prototypes
*/ */
......
...@@ -604,6 +604,7 @@ bfa_fcs_lport_uf_recv(struct bfa_fcs_lport_s *lport, ...@@ -604,6 +604,7 @@ bfa_fcs_lport_uf_recv(struct bfa_fcs_lport_s *lport,
struct fc_els_cmd_s *els_cmd = (struct fc_els_cmd_s *) (fchs + 1); struct fc_els_cmd_s *els_cmd = (struct fc_els_cmd_s *) (fchs + 1);
bfa_stats(lport, uf_recvs); bfa_stats(lport, uf_recvs);
bfa_trc(lport->fcs, fchs->type);
if (!bfa_fcs_lport_is_online(lport)) { if (!bfa_fcs_lport_is_online(lport)) {
bfa_stats(lport, uf_recv_drops); bfa_stats(lport, uf_recv_drops);
...@@ -663,8 +664,11 @@ bfa_fcs_lport_uf_recv(struct bfa_fcs_lport_s *lport, ...@@ -663,8 +664,11 @@ bfa_fcs_lport_uf_recv(struct bfa_fcs_lport_s *lport,
* Only handles ELS frames for now. * Only handles ELS frames for now.
*/ */
if (fchs->type != FC_TYPE_ELS) { if (fchs->type != FC_TYPE_ELS) {
bfa_trc(lport->fcs, fchs->type); bfa_trc(lport->fcs, fchs->s_id);
bfa_assert(0); bfa_trc(lport->fcs, fchs->d_id);
/* ignore type FC_TYPE_FC_FSS */
if (fchs->type != FC_TYPE_FC_FSS)
bfa_sm_fault(lport->fcs, fchs->type);
return; return;
} }
......
...@@ -182,7 +182,7 @@ bfad_im_info(struct Scsi_Host *shost) ...@@ -182,7 +182,7 @@ bfad_im_info(struct Scsi_Host *shost)
bfa_get_adapter_model(bfa, model); bfa_get_adapter_model(bfa, model);
memset(bfa_buf, 0, sizeof(bfa_buf)); memset(bfa_buf, 0, sizeof(bfa_buf));
if (ioc->ctdev) if (ioc->ctdev && !ioc->fcmode)
snprintf(bfa_buf, sizeof(bfa_buf), snprintf(bfa_buf, sizeof(bfa_buf),
"Brocade FCOE Adapter, " "model: %s hwpath: %s driver: %s", "Brocade FCOE Adapter, " "model: %s hwpath: %s driver: %s",
model, bfad->pci_name, BFAD_DRIVER_VERSION); model, bfad->pci_name, BFAD_DRIVER_VERSION);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment