]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[snpnet] Give up entirely on the transmit queue
authorJarrod Johnson <jarrod.b.johnson@gmail.com>
Sat, 14 Jan 2012 18:18:34 +0000 (13:18 -0500)
committerMichael Brown <mcb30@ipxe.org>
Sun, 12 Feb 2012 13:57:07 +0000 (13:57 +0000)
Practically speaking, it seems the convention is to only have one
packet pending and not rely upon any mechanism to associate returned
txbuf with txqueue.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/drivers/net/efi/snpnet.c

index b725d407f206c91fbc214de798564ee055a3f5fa..9779081511019ceb088edd30cd5e9cb9b282efdb 100644 (file)
@@ -57,28 +57,25 @@ static int snpnet_transmit ( struct net_device *netdev,
        struct snpnet_device *snpnetdev = netdev->priv;
        EFI_SIMPLE_NETWORK_PROTOCOL *snp = snpnetdev->snp;
        EFI_STATUS efirc;
+       void *txbuf=NULL;
        size_t len = iob_len ( iobuf );
 
        efirc = snp->Transmit ( snp, 0, len, iobuf->data, NULL, NULL, NULL );
-       return EFIRC_TO_RC ( efirc );
-}
-
-/**
- * Find a I/O buffer on the list of outstanding Tx buffers and complete it.
- *
- * @v snpnetdev                SNP network device
- * @v txbuf            Buffer address
- */
-static void snpnet_complete ( struct net_device *netdev, void *txbuf ) {
-       struct io_buffer *tmp;
-       struct io_buffer *iobuf;
-
-       list_for_each_entry_safe ( iobuf, tmp, &netdev->tx_queue, list ) {
-               if ( iobuf->data == txbuf ) {
-                       netdev_tx_complete ( netdev, iobuf );
+       if (efirc) {
+               return EFIRC_TO_RC ( efirc );
+       }
+       /* since GetStatus is so inconsistent, don't try more than one outstanding transmit at a time */
+       while ( txbuf == NULL ) {
+               efirc = snp->GetStatus ( snp, NULL, &txbuf );
+               if ( efirc ) {
+                       DBGC ( snp, "SNP %p could not get status %s\n", snp,
+                              efi_strerror ( efirc ) );
                        break;
                }
+
        }
+       netdev_tx_complete ( netdev, iobuf );
+       return 0;
 }
 
 /**
@@ -92,22 +89,6 @@ static void snpnet_poll ( struct net_device *netdev ) {
        EFI_STATUS efirc;
        struct io_buffer *iobuf = NULL;
        UINTN len;
-       void *txbuf;
-
-       /* Process Tx completions */
-       while ( 1 ) {
-               efirc = snp->GetStatus ( snp, NULL, &txbuf );
-               if ( efirc ) {
-                       DBGC ( snp, "SNP %p could not get status %s\n", snp,
-                              efi_strerror ( efirc ) );
-                       break;
-               }
-
-               if ( txbuf == NULL )
-                       break;
-
-               snpnet_complete ( netdev, txbuf );
-       }
 
        /* Process received packets */
        while ( 1 ) {