Skip to content

Commit

Permalink
[efi] Poll for TX completions only when there is an outstanding TX bu…
Browse files Browse the repository at this point in the history
…ffer

At least one NII implementation (in a Microsoft Surface tablet) seems
to fail to report the absence (sic) of TX completions properly.  Work
around this by checking for TX completions only when we expect to see
one.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
  • Loading branch information
mcb30 committed Apr 14, 2015
1 parent 729c16a commit c6c7e78
Showing 1 changed file with 4 additions and 8 deletions.
12 changes: 4 additions & 8 deletions src/drivers/net/efi/nii.c
Expand Up @@ -785,12 +785,7 @@ static void nii_poll_tx ( struct net_device *netdev, unsigned int stat ) {
return;

/* Sanity check */
if ( ! nii->txbuf ) {
DBGC ( nii, "NII %s reported spurious TX completion\n",
nii->dev.name );
netdev_tx_err ( netdev, NULL, -EPIPE );
return;
}
assert ( nii->txbuf != NULL );

/* Complete transmission */
iobuf = nii->txbuf;
Expand Down Expand Up @@ -888,7 +883,7 @@ static void nii_poll ( struct net_device *netdev ) {
/* Get status */
op = NII_OP ( PXE_OPCODE_GET_STATUS,
( PXE_OPFLAGS_GET_INTERRUPT_STATUS |
PXE_OPFLAGS_GET_TRANSMITTED_BUFFERS |
( nii->txbuf ? PXE_OPFLAGS_GET_TRANSMITTED_BUFFERS : 0)|
( nii->media ? PXE_OPFLAGS_GET_MEDIA_STATUS : 0 ) ) );
if ( ( stat = nii_issue_db ( nii, op, &db, sizeof ( db ) ) ) < 0 ) {
rc = -EIO_STAT ( stat );
Expand All @@ -898,7 +893,8 @@ static void nii_poll ( struct net_device *netdev ) {
}

/* Process any TX completions */
nii_poll_tx ( netdev, stat );
if ( nii->txbuf )
nii_poll_tx ( netdev, stat );

/* Process any RX completions */
nii_poll_rx ( netdev );
Expand Down

0 comments on commit c6c7e78

Please sign in to comment.