|
@@ -402,11 +402,24 @@ void netdev_tx_complete_err ( struct net_device *netdev,
|
402
|
402
|
list_del ( &iobuf->list );
|
403
|
403
|
netdev_tx_err ( netdev, iobuf, rc );
|
404
|
404
|
|
405
|
|
- /* Transmit first pending packet, if any */
|
406
|
|
- if ( ( iobuf = list_first_entry ( &netdev->tx_deferred,
|
407
|
|
- struct io_buffer, list ) ) != NULL ) {
|
|
405
|
+ /* Handle pending transmit queue */
|
|
406
|
+ while ( ( iobuf = list_first_entry ( &netdev->tx_deferred,
|
|
407
|
+ struct io_buffer, list ) ) ) {
|
|
408
|
+
|
|
409
|
+ /* Remove from pending transmit queue */
|
408
|
410
|
list_del ( &iobuf->list );
|
|
411
|
+
|
|
412
|
+ /* When any transmit completion fails, cancel all
|
|
413
|
+ * pending transmissions.
|
|
414
|
+ */
|
|
415
|
+ if ( rc != 0 ) {
|
|
416
|
+ netdev_tx_err ( netdev, iobuf, -ECANCELED );
|
|
417
|
+ continue;
|
|
418
|
+ }
|
|
419
|
+
|
|
420
|
+ /* Otherwise, attempt to transmit the first pending packet */
|
409
|
421
|
netdev_tx ( netdev, iobuf );
|
|
422
|
+ break;
|
410
|
423
|
}
|
411
|
424
|
}
|
412
|
425
|
|