vmxnet3.c (52dd5f6f70276518dd21cd3a72cb95495df33bc9) vmxnet3.c (a51db5802744b274ab40385dd9fe8354722fcc4d)
1/*
2 * QEMU VMWARE VMXNET3 paravirtual NIC
3 *
4 * Copyright (c) 2012 Ravello Systems LTD (http://ravellosystems.com)
5 *
6 * Developed by Daynix Computing LTD (http://www.daynix.com)
7 *
8 * Authors:

--- 637 unchanged lines hidden (view full) ---

646 }
647
648 vmxnet3_dump_tx_descr(&txd);
649
650 if (!s->skip_current_tx_pkt) {
651 data_len = (txd.len > 0) ? txd.len : VMXNET3_MAX_TX_BUF_SIZE;
652 data_pa = txd.addr;
653
1/*
2 * QEMU VMWARE VMXNET3 paravirtual NIC
3 *
4 * Copyright (c) 2012 Ravello Systems LTD (http://ravellosystems.com)
5 *
6 * Developed by Daynix Computing LTD (http://www.daynix.com)
7 *
8 * Authors:

--- 637 unchanged lines hidden (view full) ---

646 }
647
648 vmxnet3_dump_tx_descr(&txd);
649
650 if (!s->skip_current_tx_pkt) {
651 data_len = (txd.len > 0) ? txd.len : VMXNET3_MAX_TX_BUF_SIZE;
652 data_pa = txd.addr;
653
654 if (!net_tx_pkt_add_raw_fragment(s->tx_pkt,
655 data_pa,
656 data_len)) {
654 if (!net_tx_pkt_add_raw_fragment_pci(s->tx_pkt, PCI_DEVICE(s),
655 data_pa, data_len)) {
657 s->skip_current_tx_pkt = true;
658 }
659 }
660
661 if (s->tx_sop) {
662 vmxnet3_tx_retrieve_metadata(s, &txd);
663 s->tx_sop = false;
664 }

--- 8 unchanged lines hidden (view full) ---

673 } else {
674 vmxnet3_on_tx_done_update_stats(s, qidx,
675 VMXNET3_PKT_STATUS_ERROR);
676 }
677
678 vmxnet3_complete_packet(s, qidx, txd_idx);
679 s->tx_sop = true;
680 s->skip_current_tx_pkt = false;
656 s->skip_current_tx_pkt = true;
657 }
658 }
659
660 if (s->tx_sop) {
661 vmxnet3_tx_retrieve_metadata(s, &txd);
662 s->tx_sop = false;
663 }

--- 8 unchanged lines hidden (view full) ---

672 } else {
673 vmxnet3_on_tx_done_update_stats(s, qidx,
674 VMXNET3_PKT_STATUS_ERROR);
675 }
676
677 vmxnet3_complete_packet(s, qidx, txd_idx);
678 s->tx_sop = true;
679 s->skip_current_tx_pkt = false;
681 net_tx_pkt_reset(s->tx_pkt, PCI_DEVICE(s));
680 net_tx_pkt_reset(s->tx_pkt,
681 net_tx_pkt_unmap_frag_pci, PCI_DEVICE(s));
682 }
683 }
684}
685
686static inline void
687vmxnet3_read_next_rx_descr(VMXNET3State *s, int qidx, int ridx,
688 struct Vmxnet3_RxDesc *dbuf, uint32_t *didx)
689{

--- 464 unchanged lines hidden (view full) ---

1154 memcpy(&s->conf.macaddr.a, &s->perm_mac.a, sizeof(s->perm_mac.a));
1155 VMW_CFPRN("MAC address set to: " MAC_FMT, MAC_ARG(s->conf.macaddr.a));
1156}
1157
1158static void vmxnet3_deactivate_device(VMXNET3State *s)
1159{
1160 if (s->device_active) {
1161 VMW_CBPRN("Deactivating vmxnet3...");
682 }
683 }
684}
685
686static inline void
687vmxnet3_read_next_rx_descr(VMXNET3State *s, int qidx, int ridx,
688 struct Vmxnet3_RxDesc *dbuf, uint32_t *didx)
689{

--- 464 unchanged lines hidden (view full) ---

1154 memcpy(&s->conf.macaddr.a, &s->perm_mac.a, sizeof(s->perm_mac.a));
1155 VMW_CFPRN("MAC address set to: " MAC_FMT, MAC_ARG(s->conf.macaddr.a));
1156}
1157
1158static void vmxnet3_deactivate_device(VMXNET3State *s)
1159{
1160 if (s->device_active) {
1161 VMW_CBPRN("Deactivating vmxnet3...");
1162 net_tx_pkt_reset(s->tx_pkt, PCI_DEVICE(s));
1162 net_tx_pkt_reset(s->tx_pkt, net_tx_pkt_unmap_frag_pci, PCI_DEVICE(s));
1163 net_tx_pkt_uninit(s->tx_pkt);
1164 net_rx_pkt_uninit(s->rx_pkt);
1165 s->device_active = false;
1166 }
1167}
1168
1169static void vmxnet3_reset(VMXNET3State *s)
1170{

--- 343 unchanged lines hidden (view full) ---

1514 /* Fill device-managed parameters for queues */
1515 VMXNET3_WRITE_TX_QUEUE_DESCR32(d, qdescr_pa,
1516 ctrl.txThreshold,
1517 VMXNET3_DEF_TX_THRESHOLD);
1518 }
1519
1520 /* Preallocate TX packet wrapper */
1521 VMW_CFPRN("Max TX fragments is %u", s->max_tx_frags);
1163 net_tx_pkt_uninit(s->tx_pkt);
1164 net_rx_pkt_uninit(s->rx_pkt);
1165 s->device_active = false;
1166 }
1167}
1168
1169static void vmxnet3_reset(VMXNET3State *s)
1170{

--- 343 unchanged lines hidden (view full) ---

1514 /* Fill device-managed parameters for queues */
1515 VMXNET3_WRITE_TX_QUEUE_DESCR32(d, qdescr_pa,
1516 ctrl.txThreshold,
1517 VMXNET3_DEF_TX_THRESHOLD);
1518 }
1519
1520 /* Preallocate TX packet wrapper */
1521 VMW_CFPRN("Max TX fragments is %u", s->max_tx_frags);
1522 net_tx_pkt_init(&s->tx_pkt, PCI_DEVICE(s), s->max_tx_frags);
1522 net_tx_pkt_init(&s->tx_pkt, s->max_tx_frags);
1523 net_rx_pkt_init(&s->rx_pkt);
1524
1525 /* Read rings memory locations for RX queues */
1526 for (i = 0; i < s->rxq_num; i++) {
1527 int j;
1528 hwaddr qd_pa =
1529 qdescr_table_pa + s->txq_num * sizeof(struct Vmxnet3_TxQueueDesc) +
1530 i * sizeof(struct Vmxnet3_RxQueueDesc);

--- 863 unchanged lines hidden (view full) ---

2394 VMSTATE_END_OF_LIST()
2395 }
2396};
2397
2398static int vmxnet3_post_load(void *opaque, int version_id)
2399{
2400 VMXNET3State *s = opaque;
2401
1523 net_rx_pkt_init(&s->rx_pkt);
1524
1525 /* Read rings memory locations for RX queues */
1526 for (i = 0; i < s->rxq_num; i++) {
1527 int j;
1528 hwaddr qd_pa =
1529 qdescr_table_pa + s->txq_num * sizeof(struct Vmxnet3_TxQueueDesc) +
1530 i * sizeof(struct Vmxnet3_RxQueueDesc);

--- 863 unchanged lines hidden (view full) ---

2394 VMSTATE_END_OF_LIST()
2395 }
2396};
2397
2398static int vmxnet3_post_load(void *opaque, int version_id)
2399{
2400 VMXNET3State *s = opaque;
2401
2402 net_tx_pkt_init(&s->tx_pkt, PCI_DEVICE(s), s->max_tx_frags);
2402 net_tx_pkt_init(&s->tx_pkt, s->max_tx_frags);
2403 net_rx_pkt_init(&s->rx_pkt);
2404
2405 if (s->msix_used) {
2406 vmxnet3_use_msix_vectors(s, VMXNET3_MAX_INTRS);
2407 }
2408
2409 if (!vmxnet3_validate_queues(s)) {
2410 return -1;

--- 132 unchanged lines hidden ---
2403 net_rx_pkt_init(&s->rx_pkt);
2404
2405 if (s->msix_used) {
2406 vmxnet3_use_msix_vectors(s, VMXNET3_MAX_INTRS);
2407 }
2408
2409 if (!vmxnet3_validate_queues(s)) {
2410 return -1;

--- 132 unchanged lines hidden ---