static void virtio_net_config(ether_addr_t * addr) { u32_t mac14; u32_t mac56; int i; if (virtio_host_supports(net_dev, VIRTIO_NET_F_MAC)) { dprintf(("Mac set by host: ")); mac14 = virtio_sread32(net_dev, 0); mac56 = virtio_sread32(net_dev, 4); memcpy(&addr->ea_addr[0], &mac14, 4); memcpy(&addr->ea_addr[4], &mac56, 2); for (i = 0; i < 6; i++) dprintf(("%02x%s", addr->ea_addr[i], i == 5 ? "\n" : ":")); } else { dput(("No mac")); } if (virtio_host_supports(net_dev, VIRTIO_NET_F_STATUS)) { dput(("Current Status %x", (u32_t)virtio_sread16(net_dev, 6))); } else { dput(("No status")); } if (virtio_host_supports(net_dev, VIRTIO_NET_F_CTRL_VQ)) dput(("Host supports control channel")); if (virtio_host_supports(net_dev, VIRTIO_NET_F_CTRL_RX)) dput(("Host supports control channel for RX")); }
static int virtio_net_config(void) { u32_t mac14; u32_t mac56; int i; if (virtio_host_supports(net_dev, VIRTIO_NET_F_MAC)) { dprintf(("Mac set by host: ")); mac14 = virtio_sread32(net_dev, 0); mac56 = virtio_sread32(net_dev, 4); *(u32_t*)virtio_net_mac = mac14; *(u16_t*)(virtio_net_mac + 4) = mac56; for (i = 0; i < 6; i++) printf("%02x%s", virtio_net_mac[i], i == 5 ? "\n" : ":"); } else { dput(("No mac")); } if (virtio_host_supports(net_dev, VIRTIO_NET_F_STATUS)) { dput(("Current Status %x", (u32_t)virtio_sread16(net_dev, 6))); } else { dput(("No status")); } if (virtio_host_supports(net_dev, VIRTIO_NET_F_CTRL_VQ)) dput(("Host supports control channel")); if (virtio_host_supports(net_dev, VIRTIO_NET_F_CTRL_RX)) dput(("Host supports control channel for RX")); return OK; }
static int virtio_blk_feature_setup(void) { /* Feature setup for virtio-blk * * FIXME: Besides the geometry, everything is just debug output * FIXME2: magic numbers */ if (virtio_host_supports(blk_dev, VIRTIO_BLK_F_SEG_MAX)) { blk_config.seg_max = virtio_sread32(blk_dev, 12); dprintf(("Seg Max: %d", blk_config.seg_max)); } if (virtio_host_supports(blk_dev, VIRTIO_BLK_F_GEOMETRY)) { blk_config.geometry.cylinders = virtio_sread16(blk_dev, 16); blk_config.geometry.heads = virtio_sread8(blk_dev, 18); blk_config.geometry.sectors = virtio_sread8(blk_dev, 19); dprintf(("Geometry: cyl=%d heads=%d sectors=%d", blk_config.geometry.cylinders, blk_config.geometry.heads, blk_config.geometry.sectors)); } if (virtio_host_supports(blk_dev, VIRTIO_BLK_F_SIZE_MAX)) dprintf(("Has size max")); if (virtio_host_supports(blk_dev, VIRTIO_BLK_F_FLUSH)) dprintf(("Supports flushing")); if (virtio_host_supports(blk_dev, VIRTIO_BLK_F_BLK_SIZE)) { blk_config.blk_size = virtio_sread32(blk_dev, 20); dprintf(("Block Size: %d", blk_config.blk_size)); } if (virtio_host_supports(blk_dev, VIRTIO_BLK_F_BARRIER)) dprintf(("Supports barrier")); return 0; }