mirror of
https://github.com/torvalds/linux.git
synced 2024-11-02 02:01:29 +00:00
lpfc: Fix external loopback failure.
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> Reviewed-by: Hannes Reinicke <hare@suse.de> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
01c73bbcd7
commit
4360ca9c24
@ -14842,10 +14842,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;
|
||||
@ -14885,7 +14887,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;
|
||||
/*
|
||||
@ -14895,9 +14898,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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user