[SCSI] bfa: Fix to handle firmware tskim abort request response
authorKrishna Gudipati <kgudipat@brocade.com>
Sat, 22 Sep 2012 00:25:30 +0000 (17:25 -0700)
committerJames Bottomley <JBottomley@Parallels.com>
Sun, 7 Oct 2012 10:16:24 +0000 (11:16 +0100)
- Enhance tracing to include both tskim tag and event.
- Handle the tskim abort response from firmware in the
  tskim state machine cleanup state and proceed with the
  tskim cleanup.

Signed-off-by: Krishna Gudipati <kgudipat@brocade.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
drivers/scsi/bfa/bfa_fcpim.c
drivers/scsi/bfa/bfa_fcpim.h
drivers/scsi/bfa/bfi_ms.h

index 1633963c66cac646cea41c4a1ba7a386873fa4c7..4118d84be6eb0415157cc8dcab21727043ee3c09 100644 (file)
@@ -158,6 +158,7 @@ enum bfa_tskim_event {
        BFA_TSKIM_SM_IOS_DONE   = 7,    /*  IO and sub TM completions   */
        BFA_TSKIM_SM_CLEANUP    = 8,    /*  TM cleanup on ITN offline   */
        BFA_TSKIM_SM_CLEANUP_DONE = 9,  /*  TM abort completion */
+       BFA_TSKIM_SM_UTAG       = 10,   /*  TM completion unknown tag  */
 };
 
 /*
@@ -3036,7 +3037,7 @@ bfa_ioim_abort(struct bfa_ioim_s *ioim)
 static void
 bfa_tskim_sm_uninit(struct bfa_tskim_s *tskim, enum bfa_tskim_event event)
 {
-       bfa_trc(tskim->bfa, event);
+       bfa_trc(tskim->bfa, tskim->tsk_tag << 16 | event);
 
        switch (event) {
        case BFA_TSKIM_SM_START:
@@ -3074,7 +3075,7 @@ bfa_tskim_sm_uninit(struct bfa_tskim_s *tskim, enum bfa_tskim_event event)
 static void
 bfa_tskim_sm_active(struct bfa_tskim_s *tskim, enum bfa_tskim_event event)
 {
-       bfa_trc(tskim->bfa, event);
+       bfa_trc(tskim->bfa, tskim->tsk_tag << 16 | event);
 
        switch (event) {
        case BFA_TSKIM_SM_DONE:
@@ -3110,7 +3111,7 @@ bfa_tskim_sm_active(struct bfa_tskim_s *tskim, enum bfa_tskim_event event)
 static void
 bfa_tskim_sm_cleanup(struct bfa_tskim_s *tskim, enum bfa_tskim_event event)
 {
-       bfa_trc(tskim->bfa, event);
+       bfa_trc(tskim->bfa, tskim->tsk_tag << 16 | event);
 
        switch (event) {
        case BFA_TSKIM_SM_DONE:
@@ -3119,6 +3120,7 @@ bfa_tskim_sm_cleanup(struct bfa_tskim_s *tskim, enum bfa_tskim_event event)
                 */
                break;
 
+       case BFA_TSKIM_SM_UTAG:
        case BFA_TSKIM_SM_CLEANUP_DONE:
                bfa_sm_set_state(tskim, bfa_tskim_sm_iocleanup);
                bfa_tskim_cleanup_ios(tskim);
@@ -3138,7 +3140,7 @@ bfa_tskim_sm_cleanup(struct bfa_tskim_s *tskim, enum bfa_tskim_event event)
 static void
 bfa_tskim_sm_iocleanup(struct bfa_tskim_s *tskim, enum bfa_tskim_event event)
 {
-       bfa_trc(tskim->bfa, event);
+       bfa_trc(tskim->bfa, tskim->tsk_tag << 16 | event);
 
        switch (event) {
        case BFA_TSKIM_SM_IOS_DONE:
@@ -3170,7 +3172,7 @@ bfa_tskim_sm_iocleanup(struct bfa_tskim_s *tskim, enum bfa_tskim_event event)
 static void
 bfa_tskim_sm_qfull(struct bfa_tskim_s *tskim, enum bfa_tskim_event event)
 {
-       bfa_trc(tskim->bfa, event);
+       bfa_trc(tskim->bfa, tskim->tsk_tag << 16 | event);
 
        switch (event) {
        case BFA_TSKIM_SM_QRESUME:
@@ -3207,7 +3209,7 @@ static void
 bfa_tskim_sm_cleanup_qfull(struct bfa_tskim_s *tskim,
                enum bfa_tskim_event event)
 {
-       bfa_trc(tskim->bfa, event);
+       bfa_trc(tskim->bfa, tskim->tsk_tag << 16 | event);
 
        switch (event) {
        case BFA_TSKIM_SM_DONE:
@@ -3238,7 +3240,7 @@ bfa_tskim_sm_cleanup_qfull(struct bfa_tskim_s *tskim,
 static void
 bfa_tskim_sm_hcb(struct bfa_tskim_s *tskim, enum bfa_tskim_event event)
 {
-       bfa_trc(tskim->bfa, event);
+       bfa_trc(tskim->bfa, tskim->tsk_tag << 16 | event);
 
        switch (event) {
        case BFA_TSKIM_SM_HCB:
@@ -3560,6 +3562,8 @@ bfa_tskim_isr(struct bfa_s *bfa, struct bfi_msg_s *m)
        if (rsp->tsk_status == BFI_TSKIM_STS_ABORTED) {
                bfa_stats(tskim->itnim, tm_cleanup_comps);
                bfa_sm_send_event(tskim, BFA_TSKIM_SM_CLEANUP_DONE);
+       } else if (rsp->tsk_status == BFI_TSKIM_STS_UTAG) {
+               bfa_sm_send_event(tskim, BFA_TSKIM_SM_UTAG);
        } else {
                bfa_stats(tskim->itnim, tm_fw_rsps);
                bfa_sm_send_event(tskim, BFA_TSKIM_SM_DONE);
index 36f26da80f76c1c496ec20bc1e42ae93e878df11..b81d51cfe2bb3120ba1b6f2f61734b85af7e5c57 100644 (file)
@@ -51,7 +51,9 @@ void bfa_fcp_res_recfg(struct bfa_s *bfa, u16 num_ioim_fw);
 #define BFA_ITN_FROM_TAG(_fcp, _tag)   \
        ((_fcp)->itn_arr + ((_tag) & ((_fcp)->num_itns - 1)))
 #define BFA_SNSINFO_FROM_TAG(_fcp, _tag) \
-       bfa_mem_get_dmabuf_kva(_fcp, _tag, BFI_IOIM_SNSLEN)
+       bfa_mem_get_dmabuf_kva(_fcp, (_tag & BFA_IOIM_IOTAG_MASK),      \
+       BFI_IOIM_SNSLEN)
+
 
 #define BFA_ITNIM_MIN   32
 #define BFA_ITNIM_MAX   1024
index 1f73db97fe24bb9e36411662d886f7ef59c00929..c89defc9bb925fbd9a130a3f208e727a77445227 100644 (file)
@@ -840,6 +840,7 @@ enum bfi_tskim_status {
         */
        BFI_TSKIM_STS_TIMEOUT  = 10,    /*  TM request timedout */
        BFI_TSKIM_STS_ABORTED  = 11,    /*  Aborted on host request */
+       BFI_TSKIM_STS_UTAG     = 12,    /*  unknown tag for request */
 };
 
 struct bfi_tskim_rsp_s {