Exemple #1
0
/**
 * 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;
}
Exemple #2
0
Fichier : nii.c Projet : baloo/ipxe
/**
 * 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;
}