/** * Transmit packet * * @v netdev Network device * @v iobuf I/O buffer * @ret rc Return status code */ static int snpnet_transmit ( struct net_device *netdev, struct io_buffer *iobuf ) { struct snp_nic *snp = netdev_priv ( netdev ); EFI_STATUS efirc; int rc; /* Defer the packet if there is already a transmission in progress */ if ( snp->txbuf ) { netdev_tx_defer ( netdev, iobuf ); return 0; } /* Transmit packet */ if ( ( efirc = snp->snp->Transmit ( snp->snp, 0, iob_len ( iobuf ), iobuf->data, NULL, NULL, NULL ) ) != 0 ) { rc = -EEFI ( efirc ); DBGC ( snp, "SNP %s could not transmit: %s\n", netdev->name, strerror ( rc ) ); return rc; } snp->txbuf = iobuf; return 0; }
/** * Transmit packet * * @v netdev Network device * @v iobuf I/O buffer * @ret rc Return status code */ static int nii_transmit ( struct net_device *netdev, struct io_buffer *iobuf ) { struct nii_nic *nii = netdev->priv; PXE_CPB_TRANSMIT cpb; int stat; int rc; /* Defer the packet if there is already a transmission in progress */ if ( nii->txbuf ) { netdev_tx_defer ( netdev, iobuf ); return 0; } /* Construct parameter block */ memset ( &cpb, 0, sizeof ( cpb ) ); cpb.FrameAddr = virt_to_bus ( iobuf->data ); cpb.DataLen = iob_len ( iobuf ); cpb.MediaheaderLen = netdev->ll_protocol->ll_header_len; /* Transmit packet */ if ( ( stat = nii_issue_cpb ( nii, PXE_OPCODE_TRANSMIT, &cpb, sizeof ( cpb ) ) ) < 0 ) { rc = -EIO_STAT ( stat ); DBGC ( nii, "NII %s could not transmit: %s\n", nii->dev.name, strerror ( rc ) ); return rc; } nii->txbuf = iobuf; return 0; }