Changeset 1e472ee in mainline
- Timestamp:
- 2018-06-28T19:23:42Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- d3b2ffa
- Parents:
- 331d024
- Location:
- uspace
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/nic/virtio-net/virtio-net.c
r331d024 r1e472ee 70 70 }; 71 71 72 /** Allocate DMA buffers73 *74 * @param buffers[in] Number of buffers to allocate.75 * @param size[in] Size of each buffer.76 * @param write[in] True if the buffers are writable by the driver, false77 * otherwise.78 * @param buf[out] Output array holding virtual addresses of the allocated79 * buffers.80 * @param buf_p[out] Output array holding physical addresses of the allocated81 * buffers.82 *83 * The buffers can be deallocated by virtio_net_teardown_bufs().84 *85 * @return EOK on success or error code.86 */87 static errno_t virtio_net_setup_bufs(unsigned int buffers, size_t size,88 bool write, void *buf[], uintptr_t buf_p[])89 {90 /*91 * Allocate all buffers at once in one large chunk.92 */93 void *virt = AS_AREA_ANY;94 uintptr_t phys;95 errno_t rc = dmamem_map_anonymous(buffers * size, 0,96 write ? AS_AREA_WRITE : AS_AREA_READ, 0, &phys, &virt);97 if (rc != EOK)98 return rc;99 100 ddf_msg(LVL_NOTE, "DMA buffers: %p-%p", virt, virt + buffers * size);101 102 /*103 * Calculate addresses of the individual buffers for easy access.104 */105 for (unsigned i = 0; i < buffers; i++) {106 buf[i] = virt + i * size;107 buf_p[i] = phys + i * size;108 }109 110 return EOK;111 }112 113 /** Deallocate DMA buffers114 *115 * @param buf[in] Array holding the virtual addresses of the DMA buffers116 * previously allocated by virtio_net_setup_bufs().117 */118 static void virtio_net_teardown_bufs(void *buf[])119 {120 if (buf[0]) {121 dmamem_unmap_anonymous(buf[0]);122 buf[0] = NULL;123 }124 }125 126 72 static void virtio_net_irq_handler(ipc_call_t *icall, ddf_dev_t *dev) 127 73 { … … 287 233 * Setup DMA buffers 288 234 */ 289 rc = virtio_ net_setup_bufs(RX_BUFFERS, RX_BUF_SIZE, false,235 rc = virtio_setup_dma_bufs(RX_BUFFERS, RX_BUF_SIZE, false, 290 236 virtio_net->rx_buf, virtio_net->rx_buf_p); 291 237 if (rc != EOK) 292 238 goto fail; 293 rc = virtio_ net_setup_bufs(TX_BUFFERS, TX_BUF_SIZE, true,239 rc = virtio_setup_dma_bufs(TX_BUFFERS, TX_BUF_SIZE, true, 294 240 virtio_net->tx_buf, virtio_net->tx_buf_p); 295 241 if (rc != EOK) 296 242 goto fail; 297 rc = virtio_ net_setup_bufs(CT_BUFFERS, CT_BUF_SIZE, true,243 rc = virtio_setup_dma_bufs(CT_BUFFERS, CT_BUF_SIZE, true, 298 244 virtio_net->ct_buf, virtio_net->ct_buf_p); 299 245 if (rc != EOK) … … 356 302 357 303 fail: 358 virtio_ net_teardown_bufs(virtio_net->rx_buf);359 virtio_ net_teardown_bufs(virtio_net->tx_buf);360 virtio_ net_teardown_bufs(virtio_net->ct_buf);304 virtio_teardown_dma_bufs(virtio_net->rx_buf); 305 virtio_teardown_dma_bufs(virtio_net->tx_buf); 306 virtio_teardown_dma_bufs(virtio_net->ct_buf); 361 307 362 308 virtio_device_setup_fail(vdev); … … 370 316 virtio_net_t *virtio_net = (virtio_net_t *) nic_get_specific(nic); 371 317 372 virtio_ net_teardown_bufs(virtio_net->rx_buf);373 virtio_ net_teardown_bufs(virtio_net->tx_buf);374 virtio_ net_teardown_bufs(virtio_net->ct_buf);318 virtio_teardown_dma_bufs(virtio_net->rx_buf); 319 virtio_teardown_dma_bufs(virtio_net->tx_buf); 320 virtio_teardown_dma_bufs(virtio_net->ct_buf); 375 321 376 322 virtio_device_setup_fail(&virtio_net->virtio_dev); -
uspace/lib/virtio/virtio-pci.h
r331d024 r1e472ee 181 181 } virtio_dev_t; 182 182 183 extern errno_t virtio_setup_dma_bufs(unsigned int, size_t, bool, void *[], 184 uintptr_t []); 185 extern void virtio_teardown_dma_bufs(void *[]); 186 183 187 extern void virtio_virtq_desc_set(virtio_dev_t *vdev, uint16_t, uint16_t, 184 188 uint64_t, uint32_t, uint16_t, uint16_t); -
uspace/lib/virtio/virtio.c
r331d024 r1e472ee 39 39 #include <libarch/barrier.h> 40 40 41 /** Allocate DMA buffers 42 * 43 * @param buffers[in] Number of buffers to allocate. 44 * @param size[in] Size of each buffer. 45 * @param write[in] True if the buffers are writable by the driver, false 46 * otherwise. 47 * @param buf[out] Output array holding virtual addresses of the allocated 48 * buffers. 49 * @param buf_p[out] Output array holding physical addresses of the allocated 50 * buffers. 51 * 52 * The buffers can be deallocated by virtio_net_teardown_bufs(). 53 * 54 * @return EOK on success or error code. 55 */ 56 errno_t virtio_setup_dma_bufs(unsigned int buffers, size_t size, 57 bool write, void *buf[], uintptr_t buf_p[]) 58 { 59 /* 60 * Allocate all buffers at once in one large chunk. 61 */ 62 void *virt = AS_AREA_ANY; 63 uintptr_t phys; 64 errno_t rc = dmamem_map_anonymous(buffers * size, 0, 65 write ? AS_AREA_WRITE : AS_AREA_READ, 0, &phys, &virt); 66 if (rc != EOK) 67 return rc; 68 69 ddf_msg(LVL_NOTE, "DMA buffers: %p-%p", virt, virt + buffers * size); 70 71 /* 72 * Calculate addresses of the individual buffers for easy access. 73 */ 74 for (unsigned i = 0; i < buffers; i++) { 75 buf[i] = virt + i * size; 76 buf_p[i] = phys + i * size; 77 } 78 79 return EOK; 80 } 81 82 /** Deallocate DMA buffers 83 * 84 * @param buf[in] Array holding the virtual addresses of the DMA buffers 85 * previously allocated by virtio_net_setup_bufs(). 86 */ 87 extern void virtio_teardown_dma_bufs(void *buf[]) 88 { 89 if (buf[0]) { 90 dmamem_unmap_anonymous(buf[0]); 91 buf[0] = NULL; 92 } 93 } 94 41 95 void virtio_virtq_desc_set(virtio_dev_t *vdev, uint16_t num, uint16_t descno, 42 96 uint64_t addr, uint32_t len, uint16_t flags, uint16_t next)
Note:
See TracChangeset
for help on using the changeset viewer.