Lines Matching refs:info

97 	virtio_net_driver_info*		info;
179 virtio_net_drain_queues(virtio_net_driver_info* info)
182 while (info->virtio->queue_dequeue(info->txQueues[0], (void**)&buf, NULL))
183 info->txFreeList.Add(buf);
185 while (info->virtio->queue_dequeue(info->rxQueues[0], NULL, NULL))
188 while (info->rxFullList.RemoveHead() != NULL)
196 virtio_net_rx_enqueue_buf(virtio_net_driver_info* info, BufInfo* buf)
206 status_t status = info->virtio->queue_request_v(info->rxQueues[0],
218 virtio_net_ctrl_exec_cmd(virtio_net_driver_info* info, int cmd, int value)
244 if (!info->virtio->queue_is_empty(info->ctrlQueue))
247 status = info->virtio->queue_request_v(info->ctrlQueue, entries, 2, 1,
252 while (!info->virtio->queue_dequeue(info->ctrlQueue, NULL, NULL))
260 virtio_net_set_promisc(virtio_net_driver_info* info, int value)
262 return virtio_net_ctrl_exec_cmd(info, VIRTIO_NET_CTRL_RX_PROMISC, value);
267 vtnet_set_allmulti(virtio_net_driver_info* info, int value)
269 return virtio_net_ctrl_exec_cmd(info, VIRTIO_NET_CTRL_RX_ALLMULTI, value);
283 virtio_net_driver_info* info = (virtio_net_driver_info*)_info;
285 device_node* parent = sDeviceManager->get_parent_node(info->node);
286 sDeviceManager->get_driver(parent, (driver_module_info**)&info->virtio,
287 (void**)&info->virtio_device);
290 info->virtio->negotiate_features(info->virtio_device,
294 &info->features, &get_feature_name);
296 if ((info->features & VIRTIO_NET_F_MQ) != 0
297 && (info->features & VIRTIO_NET_F_CTRL_VQ) != 0
298 && info->virtio->read_device_config(info->virtio_device,
300 &info->pairsCount, sizeof(info->pairsCount)) == B_OK) {
303 && info->pairsCount > sysinfo.cpu_count) {
304 info->pairsCount = sysinfo.cpu_count;
307 info->pairsCount = 1;
312 uint32 queueCount = info->pairsCount * 2;
313 if ((info->features & VIRTIO_NET_F_CTRL_VQ) != 0)
316 status_t status = info->virtio->alloc_queues(info->virtio_device, queueCount,
326 info->rxQueues = new(std::nothrow) virtio_queue[info->pairsCount];
327 info->txQueues = new(std::nothrow) virtio_queue[info->pairsCount];
328 info->rxSizes = new(std::nothrow) uint16[info->pairsCount];
329 info->txSizes = new(std::nothrow) uint16[info->pairsCount];
330 if (info->rxQueues == NULL || info->txQueues == NULL
331 || info->rxSizes == NULL || info->txSizes == NULL) {
335 for (uint32 i = 0; i < info->pairsCount; i++) {
336 info->rxQueues[i] = virtioQueues[i * 2];
337 info->txQueues[i] = virtioQueues[i * 2 + 1];
338 info->rxSizes[i] = info->virtio->queue_size(info->rxQueues[i]) / 2;
339 info->txSizes[i] = info->virtio->queue_size(info->txQueues[i]) / 2;
341 if ((info->features & VIRTIO_NET_F_CTRL_VQ) != 0)
342 info->ctrlQueue = virtioQueues[info->pairsCount * 2];
344 info->rxBufInfos = new(std::nothrow) BufInfo*[info->rxSizes[0]];
345 info->txBufInfos = new(std::nothrow) BufInfo*[info->txSizes[0]];
346 if (info->rxBufInfos == NULL || info->txBufInfos == NULL) {
350 memset(info->rxBufInfos, 0, sizeof(BufInfo*) * info->rxSizes[0]);
351 memset(info->txBufInfos, 0, sizeof(BufInfo*) * info->txSizes[0]);
354 info->rxArea = create_area("virtionet rx buffer", (void**)&rxBuffer,
356 BUFFER_SIZE * info->rxSizes[0]),
358 if (info->rxArea < B_OK) {
359 status = info->rxArea;
364 for (int i = 0; i < info->rxSizes[0]; i++) {
371 info->rxBufInfos[i] = buf;
388 info->txArea = create_area("virtionet tx buffer", (void**)&txBuffer,
390 BUFFER_SIZE * info->txSizes[0]),
392 if (info->txArea < B_OK) {
393 status = info->txArea;
398 for (int i = 0; i < info->txSizes[0]; i++) {
405 info->txBufInfos[i] = buf;
420 info->txFreeList.Add(buf);
423 mutex_init(&info->rxLock, "virtionet rx lock");
424 mutex_init(&info->txLock, "virtionet tx lock");
427 status = info->virtio->setup_interrupt(info->virtio_device, NULL, info);
433 status = info->virtio->queue_setup_interrupt(info->rxQueues[0],
434 virtio_net_rxDone, info);
440 status = info->virtio->queue_setup_interrupt(info->txQueues[0],
441 virtio_net_txDone, info);
447 if ((info->features & VIRTIO_NET_F_CTRL_VQ) != 0) {
448 status = info->virtio->queue_setup_interrupt(info->ctrlQueue,
449 NULL, info);
456 *_cookie = info;
460 for (int i = 0; i < info->txSizes[0]; i++)
461 delete info->txBufInfos[i];
463 delete_area(info->txArea);
465 for (int i = 0; i < info->rxSizes[0]; i++)
466 delete info->rxBufInfos[i];
468 delete_area(info->rxArea);
470 delete[] info->rxBufInfos;
471 delete[] info->txBufInfos;
473 delete[] info->rxQueues;
474 delete[] info->txQueues;
475 delete[] info->rxSizes;
476 delete[] info->txSizes;
485 virtio_net_driver_info* info = (virtio_net_driver_info*)_cookie;
487 info->virtio->free_interrupts(info->virtio_device);
489 mutex_destroy(&info->rxLock);
490 mutex_destroy(&info->txLock);
493 BufInfo* buf = info->txFreeList.RemoveHead();
498 for (int i = 0; i < info->rxSizes[0]; i++) {
499 delete info->rxBufInfos[i];
501 for (int i = 0; i < info->txSizes[0]; i++) {
502 delete info->txBufInfos[i];
504 delete_area(info->rxArea);
505 delete_area(info->txArea);
506 delete[] info->rxBufInfos;
507 delete[] info->txBufInfos;
508 delete[] info->rxSizes;
509 delete[] info->txSizes;
510 delete[] info->rxQueues;
511 delete[] info->txQueues;
513 info->virtio->free_queues(info->virtio_device);
521 virtio_net_driver_info* info = (virtio_net_driver_info*)_info;
528 info->nonblocking = (openMode & O_NONBLOCK) != 0;
529 info->maxframesize = MAX_FRAME_SIZE;
530 info->rxDone = create_sem(0, "virtio_net_rx");
531 info->txDone = create_sem(1, "virtio_net_tx");
532 if (info->rxDone < B_OK || info->txDone < B_OK)
534 handle->info = info;
536 if ((info->features & VIRTIO_NET_F_MAC) != 0) {
537 info->virtio->read_device_config(info->virtio_device,
539 &info->macaddr, sizeof(info->macaddr));
542 if ((info->features & VIRTIO_NET_F_MTU) != 0) {
545 info->virtio->read_device_config(info->virtio_device,
550 info->maxframesize = mtu;
552 info->virtio->clear_feature(info->virtio_device, VIRTIO_NET_F_MTU);
557 for (int i = 0; i < info->rxSizes[0]; i++)
558 virtio_net_rx_enqueue_buf(info, info->rxBufInfos[i]);
564 delete_sem(info->rxDone);
565 delete_sem(info->txDone);
566 info->rxDone = info->txDone = -1;
578 virtio_net_driver_info* info = handle->info;
579 delete_sem(info->rxDone);
580 delete_sem(info->txDone);
581 info->rxDone = info->txDone = -1;
593 virtio_net_driver_info* info = handle->info;
594 virtio_net_drain_queues(info);
604 virtio_net_driver_info* info = (virtio_net_driver_info*)cookie;
606 release_sem_etc(info->rxDone, 1, B_DO_NOT_RESCHEDULE);
615 virtio_net_driver_info* info = handle->info;
617 mutex_lock(&info->rxLock);
618 while (info->rxFullList.Head() == NULL) {
619 mutex_unlock(&info->rxLock);
621 if (info->nonblocking)
624 status_t status = acquire_sem(info->rxDone);
630 get_sem_count(info->rxDone, &semCount);
632 acquire_sem_etc(info->rxDone, semCount, B_RELATIVE_TIMEOUT, 0);
634 mutex_lock(&info->rxLock);
635 while (info->rxDone != -1) {
638 if (!info->virtio->queue_dequeue(info->rxQueues[0], (void**)&buf,
644 info->rxFullList.Add(buf);
649 BufInfo* buf = info->rxFullList.RemoveHead();
652 virtio_net_rx_enqueue_buf(info, buf);
653 mutex_unlock(&info->rxLock);
662 virtio_net_driver_info* info = (virtio_net_driver_info*)cookie;
664 release_sem_etc(info->txDone, 1, B_DO_NOT_RESCHEDULE);
674 virtio_net_driver_info* info = handle->info;
676 mutex_lock(&info->txLock);
677 while (info->txFreeList.Head() == NULL) {
678 mutex_unlock(&info->txLock);
679 if (info->nonblocking)
682 status_t status = acquire_sem(info->txDone);
689 get_sem_count(info->txDone, &semCount);
691 acquire_sem_etc(info->txDone, semCount, B_RELATIVE_TIMEOUT, 0);
693 mutex_lock(&info->txLock);
694 while (info->txDone != -1) {
696 if (!info->virtio->queue_dequeue(info->txQueues[0], (void**)&buf,
701 info->txFreeList.Add(buf);
704 BufInfo* buf = info->txFreeList.RemoveHead();
717 status_t status = info->virtio->queue_request_v(info->txQueues[0],
719 mutex_unlock(&info->txLock);
734 virtio_net_driver_info* info = handle->info;
741 return user_memcpy(buffer, &info->macaddr, sizeof(info->macaddr));
749 if (length != sizeof(info->maxframesize))
752 return user_memcpy(buffer, &info->maxframesize,
753 sizeof(info->maxframesize));
763 if (info->promiscuous == value)
765 info->promiscuous = value;
766 return virtio_net_set_promisc(info, value);
771 info->nonblocking ? "yes" : "no");
777 info->nonblocking = value == 0;
782 uint32 i, multiCount = info->multiCount;
785 if ((info->features & VIRTIO_NET_F_CTRL_RX) == 0)
792 if (memcmp(&info->multi[i], buffer,
793 sizeof(info->multi[0])) == 0) {
799 memcpy(&info->multi[i], buffer, sizeof(info->multi[i]));
800 info->multiCount++;
802 if (info->multiCount == 1) {
804 vtnet_set_allmulti(info, 1);
811 uint32 i, multiCount = info->multiCount;
814 if ((info->features & VIRTIO_NET_F_CTRL_RX) == 0)
818 if (memcmp(&info->multi[i], buffer,
819 sizeof(info->multi[0])) == 0) {
826 memmove(&info->multi[i], &info->multi[i + 1],
827 sizeof(info->multi[i]) * (multiCount - i - 1));
829 info->multiCount--;
830 if (info->multiCount == 0) {
832 vtnet_set_allmulti(info, 0);
843 if ((info->features & VIRTIO_NET_F_STATUS) != 0) {
844 info->virtio->read_device_config(info->virtio_device,
914 virtio_net_driver_info* info = (virtio_net_driver_info*)malloc(
916 if (info == NULL)
919 memset(info, 0, sizeof(*info));
921 info->node = node;
923 *cookie = info;
932 virtio_net_driver_info* info = (virtio_net_driver_info*)_cookie;
933 free(info);
941 virtio_net_driver_info* info = (virtio_net_driver_info*)_cookie;
952 status = sDeviceManager->publish_device(info->node, name,