* [PATCH 13/17] lpfc: Fix external loopback failure.
@ 2015-12-16 23:12 James Smart
2015-12-17 8:33 ` Hannes Reinecke
0 siblings, 1 reply; 2+ messages in thread
From: James Smart @ 2015-12-16 23:12 UTC (permalink / raw)
To: linux-scsi
Fix external loopback failure.
Rx sequence reassembly was incorrect.
Signed-off-by: Dick Kennedy <dick.kennedy@avagotech.com>
Signed-off-by: James Smart <james.smart@avagotech.com>
---
drivers/scsi/lpfc/lpfc_sli.c | 15 +++++++++++++--
1 file changed, 13 insertions(+), 2 deletions(-)
diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c
index e504d51..b4bff35 100644
--- a/drivers/scsi/lpfc/lpfc_sli.c
+++ b/drivers/scsi/lpfc/lpfc_sli.c
@@ -14849,10 +14849,12 @@ lpfc_fc_frame_add(struct lpfc_vport *vport, struct hbq_dmabuf *dmabuf)
struct lpfc_dmabuf *h_buf;
struct hbq_dmabuf *seq_dmabuf = NULL;
struct hbq_dmabuf *temp_dmabuf = NULL;
+ uint8_t found = 0;
INIT_LIST_HEAD(&dmabuf->dbuf.list);
dmabuf->time_stamp = jiffies;
new_hdr = (struct fc_frame_header *)dmabuf->hbuf.virt;
+
/* Use the hdr_buf to find the sequence that this frame belongs to */
list_for_each_entry(h_buf, &vport->rcv_buffer_list, list) {
temp_hdr = (struct fc_frame_header *)h_buf->virt;
@@ -14892,7 +14894,8 @@ lpfc_fc_frame_add(struct lpfc_vport *vport, struct hbq_dmabuf *dmabuf)
return seq_dmabuf;
}
/* find the correct place in the sequence to insert this frame */
- list_for_each_entry_reverse(d_buf, &seq_dmabuf->dbuf.list, list) {
+ d_buf = list_entry(seq_dmabuf->dbuf.list.prev, typeof(*d_buf), list);
+ while (!found) {
temp_dmabuf = container_of(d_buf, struct hbq_dmabuf, dbuf);
temp_hdr = (struct fc_frame_header *)temp_dmabuf->hbuf.virt;
/*
@@ -14902,9 +14905,17 @@ lpfc_fc_frame_add(struct lpfc_vport *vport, struct hbq_dmabuf *dmabuf)
if (be16_to_cpu(new_hdr->fh_seq_cnt) >
be16_to_cpu(temp_hdr->fh_seq_cnt)) {
list_add(&dmabuf->dbuf.list, &temp_dmabuf->dbuf.list);
- return seq_dmabuf;
+ found = 1;
+ break;
}
+
+ if (&d_buf->list == &seq_dmabuf->dbuf.list)
+ break;
+ d_buf = list_entry(d_buf->list.prev, typeof(*d_buf), list);
}
+
+ if (found)
+ return seq_dmabuf;
return NULL;
}
--
1.7.11.7
^ permalink raw reply related [flat|nested] 2+ messages in thread* Re: [PATCH 13/17] lpfc: Fix external loopback failure.
2015-12-16 23:12 [PATCH 13/17] lpfc: Fix external loopback failure James Smart
@ 2015-12-17 8:33 ` Hannes Reinecke
0 siblings, 0 replies; 2+ messages in thread
From: Hannes Reinecke @ 2015-12-17 8:33 UTC (permalink / raw)
To: James Smart, linux-scsi
On 12/17/2015 12:12 AM, James Smart wrote:
>
> Fix external loopback failure.
>
> Rx sequence reassembly was incorrect.
>
> Signed-off-by: Dick Kennedy <dick.kennedy@avagotech.com>
> Signed-off-by: James Smart <james.smart@avagotech.com>
> ---
> drivers/scsi/lpfc/lpfc_sli.c | 15 +++++++++++++--
> 1 file changed, 13 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c
> index e504d51..b4bff35 100644
> --- a/drivers/scsi/lpfc/lpfc_sli.c
> +++ b/drivers/scsi/lpfc/lpfc_sli.c
> @@ -14849,10 +14849,12 @@ lpfc_fc_frame_add(struct lpfc_vport *vport, struct hbq_dmabuf *dmabuf)
> struct lpfc_dmabuf *h_buf;
> struct hbq_dmabuf *seq_dmabuf = NULL;
> struct hbq_dmabuf *temp_dmabuf = NULL;
> + uint8_t found = 0;
>
> INIT_LIST_HEAD(&dmabuf->dbuf.list);
> dmabuf->time_stamp = jiffies;
> new_hdr = (struct fc_frame_header *)dmabuf->hbuf.virt;
> +
> /* Use the hdr_buf to find the sequence that this frame belongs to */
> list_for_each_entry(h_buf, &vport->rcv_buffer_list, list) {
> temp_hdr = (struct fc_frame_header *)h_buf->virt;
> @@ -14892,7 +14894,8 @@ lpfc_fc_frame_add(struct lpfc_vport *vport, struct hbq_dmabuf *dmabuf)
> return seq_dmabuf;
> }
> /* find the correct place in the sequence to insert this frame */
> - list_for_each_entry_reverse(d_buf, &seq_dmabuf->dbuf.list, list) {
> + d_buf = list_entry(seq_dmabuf->dbuf.list.prev, typeof(*d_buf), list);
> + while (!found) {
> temp_dmabuf = container_of(d_buf, struct hbq_dmabuf, dbuf);
> temp_hdr = (struct fc_frame_header *)temp_dmabuf->hbuf.virt;
> /*
> @@ -14902,9 +14905,17 @@ lpfc_fc_frame_add(struct lpfc_vport *vport, struct hbq_dmabuf *dmabuf)
> if (be16_to_cpu(new_hdr->fh_seq_cnt) >
> be16_to_cpu(temp_hdr->fh_seq_cnt)) {
> list_add(&dmabuf->dbuf.list, &temp_dmabuf->dbuf.list);
> - return seq_dmabuf;
> + found = 1;
> + break;
> }
> +
> + if (&d_buf->list == &seq_dmabuf->dbuf.list)
> + break;
> + d_buf = list_entry(d_buf->list.prev, typeof(*d_buf), list);
> }
> +
> + if (found)
> + return seq_dmabuf;
> return NULL;
> }
>
>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Cheers,
Hannes
--
Dr. Hannes Reinecke zSeries & Storage
hare@suse.de +49 911 74053 688
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton
HRB 21284 (AG Nürnberg)
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2015-12-17 8:33 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-12-16 23:12 [PATCH 13/17] lpfc: Fix external loopback failure James Smart
2015-12-17 8:33 ` Hannes Reinecke
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.