|
@@ -146,6 +146,11 @@ void vnic_rq_init(struct vnic_rq *rq, unsigned int cq_index,
|
|
|
/* Use current fetch_index as the ring starting point */
|
|
|
fetch_index = ioread32(&rq->ctrl->fetch_index);
|
|
|
|
|
|
+ if (fetch_index == 0xFFFFFFFF) { /* check for hardware gone */
|
|
|
+ /* Hardware surprise removal: reset fetch_index */
|
|
|
+ fetch_index = 0;
|
|
|
+ }
|
|
|
+
|
|
|
vnic_rq_init_start(rq, cq_index,
|
|
|
fetch_index, fetch_index,
|
|
|
error_interrupt_enable,
|
|
@@ -187,8 +192,6 @@ void vnic_rq_clean(struct vnic_rq *rq,
|
|
|
u32 fetch_index;
|
|
|
unsigned int count = rq->ring.desc_count;
|
|
|
|
|
|
- BUG_ON(ioread32(&rq->ctrl->enable));
|
|
|
-
|
|
|
buf = rq->to_clean;
|
|
|
|
|
|
while (vnic_rq_desc_used(rq) > 0) {
|
|
@@ -201,6 +204,12 @@ void vnic_rq_clean(struct vnic_rq *rq,
|
|
|
|
|
|
/* Use current fetch_index as the ring starting point */
|
|
|
fetch_index = ioread32(&rq->ctrl->fetch_index);
|
|
|
+
|
|
|
+ if (fetch_index == 0xFFFFFFFF) { /* check for hardware gone */
|
|
|
+ /* Hardware surprise removal: reset fetch_index */
|
|
|
+ fetch_index = 0;
|
|
|
+ }
|
|
|
+
|
|
|
rq->to_use = rq->to_clean =
|
|
|
&rq->bufs[fetch_index / VNIC_RQ_BUF_BLK_ENTRIES(count)]
|
|
|
[fetch_index % VNIC_RQ_BUF_BLK_ENTRIES(count)];
|