2
0

vmxnet3.c 77 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539
  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:
  9. * Dmitry Fleytman <dmitry@daynix.com>
  10. * Tamir Shomer <tamirs@daynix.com>
  11. * Yan Vugenfirer <yan@daynix.com>
  12. *
  13. * This work is licensed under the terms of the GNU GPL, version 2.
  14. * See the COPYING file in the top-level directory.
  15. *
  16. */
  17. #include "qemu/osdep.h"
  18. #include "hw/hw.h"
  19. #include "hw/pci/pci.h"
  20. #include "hw/qdev-properties.h"
  21. #include "net/tap.h"
  22. #include "net/checksum.h"
  23. #include "system/system.h"
  24. #include "qemu/bswap.h"
  25. #include "qemu/log.h"
  26. #include "qemu/module.h"
  27. #include "hw/pci/msix.h"
  28. #include "hw/pci/msi.h"
  29. #include "migration/register.h"
  30. #include "migration/vmstate.h"
  31. #include "vmxnet3.h"
  32. #include "vmxnet3_defs.h"
  33. #include "vmxnet_debug.h"
  34. #include "vmware_utils.h"
  35. #include "net_tx_pkt.h"
  36. #include "net_rx_pkt.h"
  37. #include "qom/object.h"
  38. #define PCI_DEVICE_ID_VMWARE_VMXNET3_REVISION 0x1
  39. #define VMXNET3_MSIX_BAR_SIZE 0x2000
  40. /* Compatibility flags for migration */
  41. #define VMXNET3_COMPAT_FLAG_OLD_MSI_OFFSETS_BIT 0
  42. #define VMXNET3_COMPAT_FLAG_OLD_MSI_OFFSETS \
  43. (1 << VMXNET3_COMPAT_FLAG_OLD_MSI_OFFSETS_BIT)
  44. #define VMXNET3_COMPAT_FLAG_DISABLE_PCIE_BIT 1
  45. #define VMXNET3_COMPAT_FLAG_DISABLE_PCIE \
  46. (1 << VMXNET3_COMPAT_FLAG_DISABLE_PCIE_BIT)
  47. #define VMXNET3_EXP_EP_OFFSET (0x48)
  48. #define VMXNET3_MSI_OFFSET(s) \
  49. ((s)->compat_flags & VMXNET3_COMPAT_FLAG_OLD_MSI_OFFSETS ? 0x50 : 0x84)
  50. #define VMXNET3_MSIX_OFFSET(s) \
  51. ((s)->compat_flags & VMXNET3_COMPAT_FLAG_OLD_MSI_OFFSETS ? 0 : 0x9c)
  52. #define VMXNET3_DSN_OFFSET (0x100)
  53. #define VMXNET3_BAR0_IDX (0)
  54. #define VMXNET3_BAR1_IDX (1)
  55. #define VMXNET3_MSIX_BAR_IDX (2)
  56. #define VMXNET3_OFF_MSIX_TABLE (0x000)
  57. #define VMXNET3_OFF_MSIX_PBA(s) \
  58. ((s)->compat_flags & VMXNET3_COMPAT_FLAG_OLD_MSI_OFFSETS ? 0x800 : 0x1000)
  59. /* Link speed in Mbps should be shifted by 16 */
  60. #define VMXNET3_LINK_SPEED (1000 << 16)
  61. /* Link status: 1 - up, 0 - down. */
  62. #define VMXNET3_LINK_STATUS_UP 0x1
  63. /* Least significant bit should be set for revision and version */
  64. #define VMXNET3_UPT_REVISION 0x1
  65. #define VMXNET3_DEVICE_REVISION 0x1
  66. /* Number of interrupt vectors for non-MSIx modes */
  67. #define VMXNET3_MAX_NMSIX_INTRS (1)
  68. /* Macros for rings descriptors access */
  69. #define VMXNET3_READ_TX_QUEUE_DESCR8(_d, dpa, field) \
  70. (vmw_shmem_ld8(_d, dpa + offsetof(struct Vmxnet3_TxQueueDesc, field)))
  71. #define VMXNET3_WRITE_TX_QUEUE_DESCR8(_d, dpa, field, value) \
  72. (vmw_shmem_st8(_d, dpa + offsetof(struct Vmxnet3_TxQueueDesc, field, value)))
  73. #define VMXNET3_READ_TX_QUEUE_DESCR32(_d, dpa, field) \
  74. (vmw_shmem_ld32(_d, dpa + offsetof(struct Vmxnet3_TxQueueDesc, field)))
  75. #define VMXNET3_WRITE_TX_QUEUE_DESCR32(_d, dpa, field, value) \
  76. (vmw_shmem_st32(_d, dpa + offsetof(struct Vmxnet3_TxQueueDesc, field), value))
  77. #define VMXNET3_READ_TX_QUEUE_DESCR64(_d, dpa, field) \
  78. (vmw_shmem_ld64(_d, dpa + offsetof(struct Vmxnet3_TxQueueDesc, field)))
  79. #define VMXNET3_WRITE_TX_QUEUE_DESCR64(_d, dpa, field, value) \
  80. (vmw_shmem_st64(_d, dpa + offsetof(struct Vmxnet3_TxQueueDesc, field), value))
  81. #define VMXNET3_READ_RX_QUEUE_DESCR64(_d, dpa, field) \
  82. (vmw_shmem_ld64(_d, dpa + offsetof(struct Vmxnet3_RxQueueDesc, field)))
  83. #define VMXNET3_READ_RX_QUEUE_DESCR32(_d, dpa, field) \
  84. (vmw_shmem_ld32(_d, dpa + offsetof(struct Vmxnet3_RxQueueDesc, field)))
  85. #define VMXNET3_WRITE_RX_QUEUE_DESCR64(_d, dpa, field, value) \
  86. (vmw_shmem_st64(_d, dpa + offsetof(struct Vmxnet3_RxQueueDesc, field), value))
  87. #define VMXNET3_WRITE_RX_QUEUE_DESCR8(_d, dpa, field, value) \
  88. (vmw_shmem_st8(_d, dpa + offsetof(struct Vmxnet3_RxQueueDesc, field), value))
  89. /* Macros for guest driver shared area access */
  90. #define VMXNET3_READ_DRV_SHARED64(_d, shpa, field) \
  91. (vmw_shmem_ld64(_d, shpa + offsetof(struct Vmxnet3_DriverShared, field)))
  92. #define VMXNET3_READ_DRV_SHARED32(_d, shpa, field) \
  93. (vmw_shmem_ld32(_d, shpa + offsetof(struct Vmxnet3_DriverShared, field)))
  94. #define VMXNET3_WRITE_DRV_SHARED32(_d, shpa, field, val) \
  95. (vmw_shmem_st32(_d, shpa + offsetof(struct Vmxnet3_DriverShared, field), val))
  96. #define VMXNET3_READ_DRV_SHARED16(_d, shpa, field) \
  97. (vmw_shmem_ld16(_d, shpa + offsetof(struct Vmxnet3_DriverShared, field)))
  98. #define VMXNET3_READ_DRV_SHARED8(_d, shpa, field) \
  99. (vmw_shmem_ld8(_d, shpa + offsetof(struct Vmxnet3_DriverShared, field)))
  100. #define VMXNET3_READ_DRV_SHARED(_d, shpa, field, b, l) \
  101. (vmw_shmem_read(_d, shpa + offsetof(struct Vmxnet3_DriverShared, field), b, l))
  102. #define VMXNET_FLAG_IS_SET(field, flag) (((field) & (flag)) == (flag))
  103. struct VMXNET3Class {
  104. PCIDeviceClass parent_class;
  105. DeviceRealize parent_dc_realize;
  106. };
  107. typedef struct VMXNET3Class VMXNET3Class;
  108. DECLARE_CLASS_CHECKERS(VMXNET3Class, VMXNET3_DEVICE,
  109. TYPE_VMXNET3)
  110. static inline void vmxnet3_ring_init(PCIDevice *d,
  111. Vmxnet3Ring *ring,
  112. hwaddr pa,
  113. uint32_t size,
  114. uint32_t cell_size,
  115. bool zero_region)
  116. {
  117. ring->pa = pa;
  118. ring->size = size;
  119. ring->cell_size = cell_size;
  120. ring->gen = VMXNET3_INIT_GEN;
  121. ring->next = 0;
  122. if (zero_region) {
  123. vmw_shmem_set(d, pa, 0, size * cell_size);
  124. }
  125. }
  126. #define VMXNET3_RING_DUMP(macro, ring_name, ridx, r) \
  127. macro("%s#%d: base %" PRIx64 " size %u cell_size %u gen %d next %u", \
  128. (ring_name), (ridx), \
  129. (r)->pa, (r)->size, (r)->cell_size, (r)->gen, (r)->next)
  130. static inline void vmxnet3_ring_inc(Vmxnet3Ring *ring)
  131. {
  132. if (++ring->next >= ring->size) {
  133. ring->next = 0;
  134. ring->gen ^= 1;
  135. }
  136. }
  137. static inline void vmxnet3_ring_dec(Vmxnet3Ring *ring)
  138. {
  139. if (ring->next-- == 0) {
  140. ring->next = ring->size - 1;
  141. ring->gen ^= 1;
  142. }
  143. }
  144. static inline hwaddr vmxnet3_ring_curr_cell_pa(Vmxnet3Ring *ring)
  145. {
  146. return ring->pa + ring->next * ring->cell_size;
  147. }
  148. static inline void vmxnet3_ring_read_curr_cell(PCIDevice *d, Vmxnet3Ring *ring,
  149. void *buff)
  150. {
  151. vmw_shmem_read(d, vmxnet3_ring_curr_cell_pa(ring), buff, ring->cell_size);
  152. }
  153. static inline void vmxnet3_ring_write_curr_cell(PCIDevice *d, Vmxnet3Ring *ring,
  154. void *buff)
  155. {
  156. vmw_shmem_write(d, vmxnet3_ring_curr_cell_pa(ring), buff, ring->cell_size);
  157. }
  158. static inline size_t vmxnet3_ring_curr_cell_idx(Vmxnet3Ring *ring)
  159. {
  160. return ring->next;
  161. }
  162. static inline uint8_t vmxnet3_ring_curr_gen(Vmxnet3Ring *ring)
  163. {
  164. return ring->gen;
  165. }
  166. /* Debug trace-related functions */
  167. static inline void
  168. vmxnet3_dump_tx_descr(struct Vmxnet3_TxDesc *descr)
  169. {
  170. VMW_PKPRN("TX DESCR: "
  171. "addr %" PRIx64 ", len: %d, gen: %d, rsvd: %d, "
  172. "dtype: %d, ext1: %d, msscof: %d, hlen: %d, om: %d, "
  173. "eop: %d, cq: %d, ext2: %d, ti: %d, tci: %d",
  174. descr->addr, descr->len, descr->gen, descr->rsvd,
  175. descr->dtype, descr->ext1, descr->msscof, descr->hlen, descr->om,
  176. descr->eop, descr->cq, descr->ext2, descr->ti, descr->tci);
  177. }
  178. static inline void
  179. vmxnet3_dump_virt_hdr(struct virtio_net_hdr *vhdr)
  180. {
  181. VMW_PKPRN("VHDR: flags 0x%x, gso_type: 0x%x, hdr_len: %d, gso_size: %d, "
  182. "csum_start: %d, csum_offset: %d",
  183. vhdr->flags, vhdr->gso_type, vhdr->hdr_len, vhdr->gso_size,
  184. vhdr->csum_start, vhdr->csum_offset);
  185. }
  186. static inline void
  187. vmxnet3_dump_rx_descr(struct Vmxnet3_RxDesc *descr)
  188. {
  189. VMW_PKPRN("RX DESCR: addr %" PRIx64 ", len: %d, gen: %d, rsvd: %d, "
  190. "dtype: %d, ext1: %d, btype: %d",
  191. descr->addr, descr->len, descr->gen,
  192. descr->rsvd, descr->dtype, descr->ext1, descr->btype);
  193. }
  194. /* Interrupt management */
  195. /*
  196. * This function returns sign whether interrupt line is in asserted state
  197. * This depends on the type of interrupt used. For INTX interrupt line will
  198. * be asserted until explicit deassertion, for MSI(X) interrupt line will
  199. * be deasserted automatically due to notification semantics of the MSI(X)
  200. * interrupts
  201. */
  202. static bool _vmxnet3_assert_interrupt_line(VMXNET3State *s, uint32_t int_idx)
  203. {
  204. PCIDevice *d = PCI_DEVICE(s);
  205. if (s->msix_used && msix_enabled(d)) {
  206. VMW_IRPRN("Sending MSI-X notification for vector %u", int_idx);
  207. msix_notify(d, int_idx);
  208. return false;
  209. }
  210. if (msi_enabled(d)) {
  211. VMW_IRPRN("Sending MSI notification for vector %u", int_idx);
  212. msi_notify(d, int_idx);
  213. return false;
  214. }
  215. VMW_IRPRN("Asserting line for interrupt %u", int_idx);
  216. pci_irq_assert(d);
  217. return true;
  218. }
  219. static void _vmxnet3_deassert_interrupt_line(VMXNET3State *s, int lidx)
  220. {
  221. PCIDevice *d = PCI_DEVICE(s);
  222. /*
  223. * This function should never be called for MSI(X) interrupts
  224. * because deassertion never required for message interrupts
  225. */
  226. assert(!s->msix_used || !msix_enabled(d));
  227. /*
  228. * This function should never be called for MSI(X) interrupts
  229. * because deassertion never required for message interrupts
  230. */
  231. assert(!msi_enabled(d));
  232. VMW_IRPRN("Deasserting line for interrupt %u", lidx);
  233. pci_irq_deassert(d);
  234. }
  235. static void vmxnet3_update_interrupt_line_state(VMXNET3State *s, int lidx)
  236. {
  237. if (!s->interrupt_states[lidx].is_pending &&
  238. s->interrupt_states[lidx].is_asserted) {
  239. VMW_IRPRN("New interrupt line state for index %d is DOWN", lidx);
  240. _vmxnet3_deassert_interrupt_line(s, lidx);
  241. s->interrupt_states[lidx].is_asserted = false;
  242. return;
  243. }
  244. if (s->interrupt_states[lidx].is_pending &&
  245. !s->interrupt_states[lidx].is_masked &&
  246. !s->interrupt_states[lidx].is_asserted) {
  247. VMW_IRPRN("New interrupt line state for index %d is UP", lidx);
  248. s->interrupt_states[lidx].is_asserted =
  249. _vmxnet3_assert_interrupt_line(s, lidx);
  250. s->interrupt_states[lidx].is_pending = false;
  251. return;
  252. }
  253. }
  254. static void vmxnet3_trigger_interrupt(VMXNET3State *s, int lidx)
  255. {
  256. PCIDevice *d = PCI_DEVICE(s);
  257. s->interrupt_states[lidx].is_pending = true;
  258. vmxnet3_update_interrupt_line_state(s, lidx);
  259. if (s->msix_used && msix_enabled(d) && s->auto_int_masking) {
  260. goto do_automask;
  261. }
  262. if (msi_enabled(d) && s->auto_int_masking) {
  263. goto do_automask;
  264. }
  265. return;
  266. do_automask:
  267. s->interrupt_states[lidx].is_masked = true;
  268. vmxnet3_update_interrupt_line_state(s, lidx);
  269. }
  270. static bool vmxnet3_interrupt_asserted(VMXNET3State *s, int lidx)
  271. {
  272. return s->interrupt_states[lidx].is_asserted;
  273. }
  274. static void vmxnet3_clear_interrupt(VMXNET3State *s, int int_idx)
  275. {
  276. s->interrupt_states[int_idx].is_pending = false;
  277. if (s->auto_int_masking) {
  278. s->interrupt_states[int_idx].is_masked = true;
  279. }
  280. vmxnet3_update_interrupt_line_state(s, int_idx);
  281. }
  282. static void
  283. vmxnet3_on_interrupt_mask_changed(VMXNET3State *s, int lidx, bool is_masked)
  284. {
  285. s->interrupt_states[lidx].is_masked = is_masked;
  286. vmxnet3_update_interrupt_line_state(s, lidx);
  287. }
  288. static bool vmxnet3_verify_driver_magic(PCIDevice *d, hwaddr dshmem)
  289. {
  290. return (VMXNET3_READ_DRV_SHARED32(d, dshmem, magic) == VMXNET3_REV1_MAGIC);
  291. }
  292. #define VMXNET3_GET_BYTE(x, byte_num) (((x) >> (byte_num)*8) & 0xFF)
  293. #define VMXNET3_MAKE_BYTE(byte_num, val) \
  294. (((uint32_t)((val) & 0xFF)) << (byte_num)*8)
  295. static void vmxnet3_set_variable_mac(VMXNET3State *s, uint32_t h, uint32_t l)
  296. {
  297. s->conf.macaddr.a[0] = VMXNET3_GET_BYTE(l, 0);
  298. s->conf.macaddr.a[1] = VMXNET3_GET_BYTE(l, 1);
  299. s->conf.macaddr.a[2] = VMXNET3_GET_BYTE(l, 2);
  300. s->conf.macaddr.a[3] = VMXNET3_GET_BYTE(l, 3);
  301. s->conf.macaddr.a[4] = VMXNET3_GET_BYTE(h, 0);
  302. s->conf.macaddr.a[5] = VMXNET3_GET_BYTE(h, 1);
  303. VMW_CFPRN("Variable MAC: " MAC_FMT, MAC_ARG(s->conf.macaddr.a));
  304. qemu_format_nic_info_str(qemu_get_queue(s->nic), s->conf.macaddr.a);
  305. }
  306. static uint64_t vmxnet3_get_mac_low(MACAddr *addr)
  307. {
  308. return VMXNET3_MAKE_BYTE(0, addr->a[0]) |
  309. VMXNET3_MAKE_BYTE(1, addr->a[1]) |
  310. VMXNET3_MAKE_BYTE(2, addr->a[2]) |
  311. VMXNET3_MAKE_BYTE(3, addr->a[3]);
  312. }
  313. static uint64_t vmxnet3_get_mac_high(MACAddr *addr)
  314. {
  315. return VMXNET3_MAKE_BYTE(0, addr->a[4]) |
  316. VMXNET3_MAKE_BYTE(1, addr->a[5]);
  317. }
  318. static void
  319. vmxnet3_inc_tx_consumption_counter(VMXNET3State *s, int qidx)
  320. {
  321. vmxnet3_ring_inc(&s->txq_descr[qidx].tx_ring);
  322. }
  323. static inline void
  324. vmxnet3_inc_rx_consumption_counter(VMXNET3State *s, int qidx, int ridx)
  325. {
  326. vmxnet3_ring_inc(&s->rxq_descr[qidx].rx_ring[ridx]);
  327. }
  328. static inline void
  329. vmxnet3_inc_tx_completion_counter(VMXNET3State *s, int qidx)
  330. {
  331. vmxnet3_ring_inc(&s->txq_descr[qidx].comp_ring);
  332. }
  333. static void
  334. vmxnet3_inc_rx_completion_counter(VMXNET3State *s, int qidx)
  335. {
  336. vmxnet3_ring_inc(&s->rxq_descr[qidx].comp_ring);
  337. }
  338. static void
  339. vmxnet3_dec_rx_completion_counter(VMXNET3State *s, int qidx)
  340. {
  341. vmxnet3_ring_dec(&s->rxq_descr[qidx].comp_ring);
  342. }
  343. static void vmxnet3_complete_packet(VMXNET3State *s, int qidx, uint32_t tx_ridx)
  344. {
  345. struct Vmxnet3_TxCompDesc txcq_descr;
  346. PCIDevice *d = PCI_DEVICE(s);
  347. VMXNET3_RING_DUMP(VMW_RIPRN, "TXC", qidx, &s->txq_descr[qidx].comp_ring);
  348. memset(&txcq_descr, 0, sizeof(txcq_descr));
  349. txcq_descr.txdIdx = tx_ridx;
  350. txcq_descr.gen = vmxnet3_ring_curr_gen(&s->txq_descr[qidx].comp_ring);
  351. txcq_descr.val1 = cpu_to_le32(txcq_descr.val1);
  352. txcq_descr.val2 = cpu_to_le32(txcq_descr.val2);
  353. vmxnet3_ring_write_curr_cell(d, &s->txq_descr[qidx].comp_ring, &txcq_descr);
  354. /* Flush changes in TX descriptor before changing the counter value */
  355. smp_wmb();
  356. vmxnet3_inc_tx_completion_counter(s, qidx);
  357. vmxnet3_trigger_interrupt(s, s->txq_descr[qidx].intr_idx);
  358. }
  359. static bool
  360. vmxnet3_setup_tx_offloads(VMXNET3State *s)
  361. {
  362. switch (s->offload_mode) {
  363. case VMXNET3_OM_NONE:
  364. return net_tx_pkt_build_vheader(s->tx_pkt, false, false, 0);
  365. case VMXNET3_OM_CSUM:
  366. VMW_PKPRN("L4 CSO requested\n");
  367. return net_tx_pkt_build_vheader(s->tx_pkt, false, true, 0);
  368. case VMXNET3_OM_TSO:
  369. VMW_PKPRN("GSO offload requested.");
  370. if (!net_tx_pkt_build_vheader(s->tx_pkt, true, true,
  371. s->cso_or_gso_size)) {
  372. return false;
  373. }
  374. net_tx_pkt_update_ip_checksums(s->tx_pkt);
  375. break;
  376. default:
  377. g_assert_not_reached();
  378. }
  379. return true;
  380. }
  381. static void
  382. vmxnet3_tx_retrieve_metadata(VMXNET3State *s,
  383. const struct Vmxnet3_TxDesc *txd)
  384. {
  385. s->offload_mode = txd->om;
  386. s->cso_or_gso_size = txd->msscof;
  387. s->tci = txd->tci;
  388. s->needs_vlan = txd->ti;
  389. }
  390. typedef enum {
  391. VMXNET3_PKT_STATUS_OK,
  392. VMXNET3_PKT_STATUS_ERROR,
  393. VMXNET3_PKT_STATUS_DISCARD,/* only for tx */
  394. VMXNET3_PKT_STATUS_OUT_OF_BUF /* only for rx */
  395. } Vmxnet3PktStatus;
  396. static void
  397. vmxnet3_on_tx_done_update_stats(VMXNET3State *s, int qidx,
  398. Vmxnet3PktStatus status)
  399. {
  400. size_t tot_len = net_tx_pkt_get_total_len(s->tx_pkt);
  401. struct UPT1_TxStats *stats = &s->txq_descr[qidx].txq_stats;
  402. switch (status) {
  403. case VMXNET3_PKT_STATUS_OK:
  404. switch (net_tx_pkt_get_packet_type(s->tx_pkt)) {
  405. case ETH_PKT_BCAST:
  406. stats->bcastPktsTxOK++;
  407. stats->bcastBytesTxOK += tot_len;
  408. break;
  409. case ETH_PKT_MCAST:
  410. stats->mcastPktsTxOK++;
  411. stats->mcastBytesTxOK += tot_len;
  412. break;
  413. case ETH_PKT_UCAST:
  414. stats->ucastPktsTxOK++;
  415. stats->ucastBytesTxOK += tot_len;
  416. break;
  417. default:
  418. g_assert_not_reached();
  419. }
  420. if (s->offload_mode == VMXNET3_OM_TSO) {
  421. /*
  422. * According to VMWARE headers this statistic is a number
  423. * of packets after segmentation but since we don't have
  424. * this information in QEMU model, the best we can do is to
  425. * provide number of non-segmented packets
  426. */
  427. stats->TSOPktsTxOK++;
  428. stats->TSOBytesTxOK += tot_len;
  429. }
  430. break;
  431. case VMXNET3_PKT_STATUS_DISCARD:
  432. stats->pktsTxDiscard++;
  433. break;
  434. case VMXNET3_PKT_STATUS_ERROR:
  435. stats->pktsTxError++;
  436. break;
  437. default:
  438. g_assert_not_reached();
  439. }
  440. }
  441. static void
  442. vmxnet3_on_rx_done_update_stats(VMXNET3State *s,
  443. int qidx,
  444. Vmxnet3PktStatus status)
  445. {
  446. struct UPT1_RxStats *stats = &s->rxq_descr[qidx].rxq_stats;
  447. size_t tot_len = net_rx_pkt_get_total_len(s->rx_pkt);
  448. switch (status) {
  449. case VMXNET3_PKT_STATUS_OUT_OF_BUF:
  450. stats->pktsRxOutOfBuf++;
  451. break;
  452. case VMXNET3_PKT_STATUS_ERROR:
  453. stats->pktsRxError++;
  454. break;
  455. case VMXNET3_PKT_STATUS_OK:
  456. switch (net_rx_pkt_get_packet_type(s->rx_pkt)) {
  457. case ETH_PKT_BCAST:
  458. stats->bcastPktsRxOK++;
  459. stats->bcastBytesRxOK += tot_len;
  460. break;
  461. case ETH_PKT_MCAST:
  462. stats->mcastPktsRxOK++;
  463. stats->mcastBytesRxOK += tot_len;
  464. break;
  465. case ETH_PKT_UCAST:
  466. stats->ucastPktsRxOK++;
  467. stats->ucastBytesRxOK += tot_len;
  468. break;
  469. default:
  470. g_assert_not_reached();
  471. }
  472. if (tot_len > s->mtu) {
  473. stats->LROPktsRxOK++;
  474. stats->LROBytesRxOK += tot_len;
  475. }
  476. break;
  477. default:
  478. g_assert_not_reached();
  479. }
  480. }
  481. static inline void
  482. vmxnet3_ring_read_curr_txdesc(PCIDevice *pcidev, Vmxnet3Ring *ring,
  483. struct Vmxnet3_TxDesc *txd)
  484. {
  485. vmxnet3_ring_read_curr_cell(pcidev, ring, txd);
  486. txd->addr = le64_to_cpu(txd->addr);
  487. txd->val1 = le32_to_cpu(txd->val1);
  488. txd->val2 = le32_to_cpu(txd->val2);
  489. }
  490. static inline bool
  491. vmxnet3_pop_next_tx_descr(VMXNET3State *s,
  492. int qidx,
  493. struct Vmxnet3_TxDesc *txd,
  494. uint32_t *descr_idx)
  495. {
  496. Vmxnet3Ring *ring = &s->txq_descr[qidx].tx_ring;
  497. PCIDevice *d = PCI_DEVICE(s);
  498. vmxnet3_ring_read_curr_txdesc(d, ring, txd);
  499. if (txd->gen == vmxnet3_ring_curr_gen(ring)) {
  500. /* Only read after generation field verification */
  501. smp_rmb();
  502. /* Re-read to be sure we got the latest version */
  503. vmxnet3_ring_read_curr_txdesc(d, ring, txd);
  504. VMXNET3_RING_DUMP(VMW_RIPRN, "TX", qidx, ring);
  505. *descr_idx = vmxnet3_ring_curr_cell_idx(ring);
  506. vmxnet3_inc_tx_consumption_counter(s, qidx);
  507. return true;
  508. }
  509. return false;
  510. }
  511. static bool
  512. vmxnet3_send_packet(VMXNET3State *s, uint32_t qidx)
  513. {
  514. Vmxnet3PktStatus status = VMXNET3_PKT_STATUS_OK;
  515. if (!vmxnet3_setup_tx_offloads(s)) {
  516. status = VMXNET3_PKT_STATUS_ERROR;
  517. goto func_exit;
  518. }
  519. /* debug prints */
  520. vmxnet3_dump_virt_hdr(net_tx_pkt_get_vhdr(s->tx_pkt));
  521. net_tx_pkt_dump(s->tx_pkt);
  522. if (!net_tx_pkt_send(s->tx_pkt, qemu_get_queue(s->nic))) {
  523. status = VMXNET3_PKT_STATUS_DISCARD;
  524. goto func_exit;
  525. }
  526. func_exit:
  527. vmxnet3_on_tx_done_update_stats(s, qidx, status);
  528. return (status == VMXNET3_PKT_STATUS_OK);
  529. }
  530. static void vmxnet3_process_tx_queue(VMXNET3State *s, int qidx)
  531. {
  532. struct Vmxnet3_TxDesc txd;
  533. uint32_t txd_idx;
  534. uint32_t data_len;
  535. hwaddr data_pa;
  536. for (;;) {
  537. if (!vmxnet3_pop_next_tx_descr(s, qidx, &txd, &txd_idx)) {
  538. break;
  539. }
  540. vmxnet3_dump_tx_descr(&txd);
  541. if (!s->skip_current_tx_pkt) {
  542. data_len = (txd.len > 0) ? txd.len : VMXNET3_MAX_TX_BUF_SIZE;
  543. data_pa = txd.addr;
  544. if (!net_tx_pkt_add_raw_fragment_pci(s->tx_pkt, PCI_DEVICE(s),
  545. data_pa, data_len)) {
  546. s->skip_current_tx_pkt = true;
  547. }
  548. }
  549. if (s->tx_sop) {
  550. vmxnet3_tx_retrieve_metadata(s, &txd);
  551. s->tx_sop = false;
  552. }
  553. if (txd.eop) {
  554. if (!s->skip_current_tx_pkt && net_tx_pkt_parse(s->tx_pkt)) {
  555. if (s->needs_vlan) {
  556. net_tx_pkt_setup_vlan_header(s->tx_pkt, s->tci);
  557. }
  558. vmxnet3_send_packet(s, qidx);
  559. } else {
  560. vmxnet3_on_tx_done_update_stats(s, qidx,
  561. VMXNET3_PKT_STATUS_ERROR);
  562. }
  563. vmxnet3_complete_packet(s, qidx, txd_idx);
  564. s->tx_sop = true;
  565. s->skip_current_tx_pkt = false;
  566. net_tx_pkt_reset(s->tx_pkt,
  567. net_tx_pkt_unmap_frag_pci, PCI_DEVICE(s));
  568. }
  569. }
  570. net_tx_pkt_reset(s->tx_pkt, net_tx_pkt_unmap_frag_pci, PCI_DEVICE(s));
  571. }
  572. static inline void
  573. vmxnet3_read_next_rx_descr(VMXNET3State *s, int qidx, int ridx,
  574. struct Vmxnet3_RxDesc *dbuf, uint32_t *didx)
  575. {
  576. PCIDevice *d = PCI_DEVICE(s);
  577. Vmxnet3Ring *ring = &s->rxq_descr[qidx].rx_ring[ridx];
  578. *didx = vmxnet3_ring_curr_cell_idx(ring);
  579. vmxnet3_ring_read_curr_cell(d, ring, dbuf);
  580. dbuf->addr = le64_to_cpu(dbuf->addr);
  581. dbuf->val1 = le32_to_cpu(dbuf->val1);
  582. dbuf->ext1 = le32_to_cpu(dbuf->ext1);
  583. }
  584. static inline uint8_t
  585. vmxnet3_get_rx_ring_gen(VMXNET3State *s, int qidx, int ridx)
  586. {
  587. return s->rxq_descr[qidx].rx_ring[ridx].gen;
  588. }
  589. static inline hwaddr
  590. vmxnet3_pop_rxc_descr(VMXNET3State *s, int qidx, uint32_t *descr_gen)
  591. {
  592. uint8_t ring_gen;
  593. struct Vmxnet3_RxCompDesc rxcd;
  594. hwaddr daddr =
  595. vmxnet3_ring_curr_cell_pa(&s->rxq_descr[qidx].comp_ring);
  596. pci_dma_read(PCI_DEVICE(s),
  597. daddr, &rxcd, sizeof(struct Vmxnet3_RxCompDesc));
  598. rxcd.val1 = le32_to_cpu(rxcd.val1);
  599. rxcd.val2 = le32_to_cpu(rxcd.val2);
  600. rxcd.val3 = le32_to_cpu(rxcd.val3);
  601. ring_gen = vmxnet3_ring_curr_gen(&s->rxq_descr[qidx].comp_ring);
  602. if (rxcd.gen != ring_gen) {
  603. *descr_gen = ring_gen;
  604. vmxnet3_inc_rx_completion_counter(s, qidx);
  605. return daddr;
  606. }
  607. return 0;
  608. }
  609. static inline void
  610. vmxnet3_revert_rxc_descr(VMXNET3State *s, int qidx)
  611. {
  612. vmxnet3_dec_rx_completion_counter(s, qidx);
  613. }
  614. #define RXQ_IDX (0)
  615. #define RX_HEAD_BODY_RING (0)
  616. #define RX_BODY_ONLY_RING (1)
  617. static bool
  618. vmxnet3_get_next_head_rx_descr(VMXNET3State *s,
  619. struct Vmxnet3_RxDesc *descr_buf,
  620. uint32_t *descr_idx,
  621. uint32_t *ridx)
  622. {
  623. for (;;) {
  624. uint32_t ring_gen;
  625. vmxnet3_read_next_rx_descr(s, RXQ_IDX, RX_HEAD_BODY_RING,
  626. descr_buf, descr_idx);
  627. /* If no more free descriptors - return */
  628. ring_gen = vmxnet3_get_rx_ring_gen(s, RXQ_IDX, RX_HEAD_BODY_RING);
  629. if (descr_buf->gen != ring_gen) {
  630. return false;
  631. }
  632. /* Only read after generation field verification */
  633. smp_rmb();
  634. /* Re-read to be sure we got the latest version */
  635. vmxnet3_read_next_rx_descr(s, RXQ_IDX, RX_HEAD_BODY_RING,
  636. descr_buf, descr_idx);
  637. /* Mark current descriptor as used/skipped */
  638. vmxnet3_inc_rx_consumption_counter(s, RXQ_IDX, RX_HEAD_BODY_RING);
  639. /* If this is what we are looking for - return */
  640. if (descr_buf->btype == VMXNET3_RXD_BTYPE_HEAD) {
  641. *ridx = RX_HEAD_BODY_RING;
  642. return true;
  643. }
  644. }
  645. }
  646. static bool
  647. vmxnet3_get_next_body_rx_descr(VMXNET3State *s,
  648. struct Vmxnet3_RxDesc *d,
  649. uint32_t *didx,
  650. uint32_t *ridx)
  651. {
  652. vmxnet3_read_next_rx_descr(s, RXQ_IDX, RX_HEAD_BODY_RING, d, didx);
  653. /* Try to find corresponding descriptor in head/body ring */
  654. if (d->gen == vmxnet3_get_rx_ring_gen(s, RXQ_IDX, RX_HEAD_BODY_RING)) {
  655. /* Only read after generation field verification */
  656. smp_rmb();
  657. /* Re-read to be sure we got the latest version */
  658. vmxnet3_read_next_rx_descr(s, RXQ_IDX, RX_HEAD_BODY_RING, d, didx);
  659. if (d->btype == VMXNET3_RXD_BTYPE_BODY) {
  660. vmxnet3_inc_rx_consumption_counter(s, RXQ_IDX, RX_HEAD_BODY_RING);
  661. *ridx = RX_HEAD_BODY_RING;
  662. return true;
  663. }
  664. }
  665. /*
  666. * If there is no free descriptors on head/body ring or next free
  667. * descriptor is a head descriptor switch to body only ring
  668. */
  669. vmxnet3_read_next_rx_descr(s, RXQ_IDX, RX_BODY_ONLY_RING, d, didx);
  670. /* If no more free descriptors - return */
  671. if (d->gen == vmxnet3_get_rx_ring_gen(s, RXQ_IDX, RX_BODY_ONLY_RING)) {
  672. /* Only read after generation field verification */
  673. smp_rmb();
  674. /* Re-read to be sure we got the latest version */
  675. vmxnet3_read_next_rx_descr(s, RXQ_IDX, RX_BODY_ONLY_RING, d, didx);
  676. assert(d->btype == VMXNET3_RXD_BTYPE_BODY);
  677. *ridx = RX_BODY_ONLY_RING;
  678. vmxnet3_inc_rx_consumption_counter(s, RXQ_IDX, RX_BODY_ONLY_RING);
  679. return true;
  680. }
  681. return false;
  682. }
  683. static inline bool
  684. vmxnet3_get_next_rx_descr(VMXNET3State *s, bool is_head,
  685. struct Vmxnet3_RxDesc *descr_buf,
  686. uint32_t *descr_idx,
  687. uint32_t *ridx)
  688. {
  689. if (is_head || !s->rx_packets_compound) {
  690. return vmxnet3_get_next_head_rx_descr(s, descr_buf, descr_idx, ridx);
  691. } else {
  692. return vmxnet3_get_next_body_rx_descr(s, descr_buf, descr_idx, ridx);
  693. }
  694. }
  695. /* In case packet was csum offloaded (either NEEDS_CSUM or DATA_VALID),
  696. * the implementation always passes an RxCompDesc with a "Checksum
  697. * calculated and found correct" to the OS (cnc=0 and tuc=1, see
  698. * vmxnet3_rx_update_descr). This emulates the observed ESXi behavior.
  699. *
  700. * Therefore, if packet has the NEEDS_CSUM set, we must calculate
  701. * and place a fully computed checksum into the tcp/udp header.
  702. * Otherwise, the OS driver will receive a checksum-correct indication
  703. * (CHECKSUM_UNNECESSARY), but with the actual tcp/udp checksum field
  704. * having just the pseudo header csum value.
  705. *
  706. * While this is not a problem if packet is destined for local delivery,
  707. * in the case the host OS performs forwarding, it will forward an
  708. * incorrectly checksummed packet.
  709. */
  710. static void vmxnet3_rx_need_csum_calculate(struct NetRxPkt *pkt,
  711. const void *pkt_data,
  712. size_t pkt_len)
  713. {
  714. struct virtio_net_hdr *vhdr;
  715. bool hasip4, hasip6;
  716. EthL4HdrProto l4hdr_proto;
  717. uint8_t *data;
  718. int len;
  719. vhdr = net_rx_pkt_get_vhdr(pkt);
  720. if (!VMXNET_FLAG_IS_SET(vhdr->flags, VIRTIO_NET_HDR_F_NEEDS_CSUM)) {
  721. return;
  722. }
  723. net_rx_pkt_get_protocols(pkt, &hasip4, &hasip6, &l4hdr_proto);
  724. if (!(hasip4 || hasip6) ||
  725. (l4hdr_proto != ETH_L4_HDR_PROTO_TCP &&
  726. l4hdr_proto != ETH_L4_HDR_PROTO_UDP)) {
  727. return;
  728. }
  729. vmxnet3_dump_virt_hdr(vhdr);
  730. /* Validate packet len: csum_start + scum_offset + length of csum field */
  731. if (pkt_len < (vhdr->csum_start + vhdr->csum_offset + 2)) {
  732. VMW_PKPRN("packet len:%zu < csum_start(%d) + csum_offset(%d) + 2, "
  733. "cannot calculate checksum",
  734. pkt_len, vhdr->csum_start, vhdr->csum_offset);
  735. return;
  736. }
  737. data = (uint8_t *)pkt_data + vhdr->csum_start;
  738. len = pkt_len - vhdr->csum_start;
  739. /* Put the checksum obtained into the packet */
  740. stw_be_p(data + vhdr->csum_offset,
  741. net_checksum_finish_nozero(net_checksum_add(len, data)));
  742. vhdr->flags &= ~VIRTIO_NET_HDR_F_NEEDS_CSUM;
  743. vhdr->flags |= VIRTIO_NET_HDR_F_DATA_VALID;
  744. }
  745. static void vmxnet3_rx_update_descr(struct NetRxPkt *pkt,
  746. struct Vmxnet3_RxCompDesc *rxcd)
  747. {
  748. int csum_ok, is_gso;
  749. bool hasip4, hasip6;
  750. EthL4HdrProto l4hdr_proto;
  751. struct virtio_net_hdr *vhdr;
  752. uint8_t offload_type;
  753. if (net_rx_pkt_is_vlan_stripped(pkt)) {
  754. rxcd->ts = 1;
  755. rxcd->tci = net_rx_pkt_get_vlan_tag(pkt);
  756. }
  757. vhdr = net_rx_pkt_get_vhdr(pkt);
  758. /*
  759. * Checksum is valid when lower level tell so or when lower level
  760. * requires checksum offload telling that packet produced/bridged
  761. * locally and did travel over network after last checksum calculation
  762. * or production
  763. */
  764. csum_ok = VMXNET_FLAG_IS_SET(vhdr->flags, VIRTIO_NET_HDR_F_DATA_VALID) ||
  765. VMXNET_FLAG_IS_SET(vhdr->flags, VIRTIO_NET_HDR_F_NEEDS_CSUM);
  766. offload_type = vhdr->gso_type & ~VIRTIO_NET_HDR_GSO_ECN;
  767. is_gso = (offload_type != VIRTIO_NET_HDR_GSO_NONE) ? 1 : 0;
  768. if (!csum_ok && !is_gso) {
  769. goto nocsum;
  770. }
  771. net_rx_pkt_get_protocols(pkt, &hasip4, &hasip6, &l4hdr_proto);
  772. if ((l4hdr_proto != ETH_L4_HDR_PROTO_TCP &&
  773. l4hdr_proto != ETH_L4_HDR_PROTO_UDP) ||
  774. (!hasip4 && !hasip6)) {
  775. goto nocsum;
  776. }
  777. rxcd->cnc = 0;
  778. rxcd->v4 = hasip4 ? 1 : 0;
  779. rxcd->v6 = hasip6 ? 1 : 0;
  780. rxcd->tcp = l4hdr_proto == ETH_L4_HDR_PROTO_TCP;
  781. rxcd->udp = l4hdr_proto == ETH_L4_HDR_PROTO_UDP;
  782. rxcd->fcs = rxcd->tuc = rxcd->ipc = 1;
  783. return;
  784. nocsum:
  785. rxcd->cnc = 1;
  786. return;
  787. }
  788. static void
  789. vmxnet3_pci_dma_writev(PCIDevice *pci_dev,
  790. const struct iovec *iov,
  791. size_t start_iov_off,
  792. hwaddr target_addr,
  793. size_t bytes_to_copy)
  794. {
  795. size_t curr_off = 0;
  796. size_t copied = 0;
  797. while (bytes_to_copy) {
  798. if (start_iov_off < (curr_off + iov->iov_len)) {
  799. size_t chunk_len =
  800. MIN((curr_off + iov->iov_len) - start_iov_off, bytes_to_copy);
  801. pci_dma_write(pci_dev, target_addr + copied,
  802. iov->iov_base + start_iov_off - curr_off,
  803. chunk_len);
  804. copied += chunk_len;
  805. start_iov_off += chunk_len;
  806. curr_off = start_iov_off;
  807. bytes_to_copy -= chunk_len;
  808. } else {
  809. curr_off += iov->iov_len;
  810. }
  811. iov++;
  812. }
  813. }
  814. static void
  815. vmxnet3_pci_dma_write_rxcd(PCIDevice *pcidev, dma_addr_t pa,
  816. struct Vmxnet3_RxCompDesc *rxcd)
  817. {
  818. rxcd->val1 = cpu_to_le32(rxcd->val1);
  819. rxcd->val2 = cpu_to_le32(rxcd->val2);
  820. rxcd->val3 = cpu_to_le32(rxcd->val3);
  821. pci_dma_write(pcidev, pa, rxcd, sizeof(*rxcd));
  822. }
  823. static bool
  824. vmxnet3_indicate_packet(VMXNET3State *s)
  825. {
  826. struct Vmxnet3_RxDesc rxd;
  827. PCIDevice *d = PCI_DEVICE(s);
  828. bool is_head = true;
  829. uint32_t rxd_idx;
  830. uint32_t rx_ridx = 0;
  831. struct Vmxnet3_RxCompDesc rxcd;
  832. uint32_t new_rxcd_gen = VMXNET3_INIT_GEN;
  833. hwaddr new_rxcd_pa = 0;
  834. hwaddr ready_rxcd_pa = 0;
  835. struct iovec *data = net_rx_pkt_get_iovec(s->rx_pkt);
  836. size_t bytes_copied = 0;
  837. size_t bytes_left = net_rx_pkt_get_total_len(s->rx_pkt);
  838. uint16_t num_frags = 0;
  839. size_t chunk_size;
  840. net_rx_pkt_dump(s->rx_pkt);
  841. while (bytes_left > 0) {
  842. /* cannot add more frags to packet */
  843. if (num_frags == s->max_rx_frags) {
  844. break;
  845. }
  846. new_rxcd_pa = vmxnet3_pop_rxc_descr(s, RXQ_IDX, &new_rxcd_gen);
  847. if (!new_rxcd_pa) {
  848. break;
  849. }
  850. if (!vmxnet3_get_next_rx_descr(s, is_head, &rxd, &rxd_idx, &rx_ridx)) {
  851. break;
  852. }
  853. chunk_size = MIN(bytes_left, rxd.len);
  854. vmxnet3_pci_dma_writev(d, data, bytes_copied, rxd.addr, chunk_size);
  855. bytes_copied += chunk_size;
  856. bytes_left -= chunk_size;
  857. vmxnet3_dump_rx_descr(&rxd);
  858. if (ready_rxcd_pa != 0) {
  859. vmxnet3_pci_dma_write_rxcd(d, ready_rxcd_pa, &rxcd);
  860. }
  861. memset(&rxcd, 0, sizeof(struct Vmxnet3_RxCompDesc));
  862. rxcd.rxdIdx = rxd_idx;
  863. rxcd.len = chunk_size;
  864. rxcd.sop = is_head;
  865. rxcd.gen = new_rxcd_gen;
  866. rxcd.rqID = RXQ_IDX + rx_ridx * s->rxq_num;
  867. if (bytes_left == 0) {
  868. vmxnet3_rx_update_descr(s->rx_pkt, &rxcd);
  869. }
  870. VMW_RIPRN("RX Completion descriptor: rxRing: %lu rxIdx %lu len %lu "
  871. "sop %d csum_correct %lu",
  872. (unsigned long) rx_ridx,
  873. (unsigned long) rxcd.rxdIdx,
  874. (unsigned long) rxcd.len,
  875. (int) rxcd.sop,
  876. (unsigned long) rxcd.tuc);
  877. is_head = false;
  878. ready_rxcd_pa = new_rxcd_pa;
  879. new_rxcd_pa = 0;
  880. num_frags++;
  881. }
  882. if (ready_rxcd_pa != 0) {
  883. rxcd.eop = 1;
  884. rxcd.err = (bytes_left != 0);
  885. vmxnet3_pci_dma_write_rxcd(d, ready_rxcd_pa, &rxcd);
  886. /* Flush RX descriptor changes */
  887. smp_wmb();
  888. }
  889. if (new_rxcd_pa != 0) {
  890. vmxnet3_revert_rxc_descr(s, RXQ_IDX);
  891. }
  892. vmxnet3_trigger_interrupt(s, s->rxq_descr[RXQ_IDX].intr_idx);
  893. if (bytes_left == 0) {
  894. vmxnet3_on_rx_done_update_stats(s, RXQ_IDX, VMXNET3_PKT_STATUS_OK);
  895. return true;
  896. } else if (num_frags == s->max_rx_frags) {
  897. vmxnet3_on_rx_done_update_stats(s, RXQ_IDX, VMXNET3_PKT_STATUS_ERROR);
  898. return false;
  899. } else {
  900. vmxnet3_on_rx_done_update_stats(s, RXQ_IDX,
  901. VMXNET3_PKT_STATUS_OUT_OF_BUF);
  902. return false;
  903. }
  904. }
  905. static void
  906. vmxnet3_io_bar0_write(void *opaque, hwaddr addr,
  907. uint64_t val, unsigned size)
  908. {
  909. VMXNET3State *s = opaque;
  910. if (!s->device_active) {
  911. return;
  912. }
  913. if (VMW_IS_MULTIREG_ADDR(addr, VMXNET3_REG_TXPROD,
  914. VMXNET3_DEVICE_MAX_TX_QUEUES, VMXNET3_REG_ALIGN)) {
  915. int tx_queue_idx =
  916. VMW_MULTIREG_IDX_BY_ADDR(addr, VMXNET3_REG_TXPROD,
  917. VMXNET3_REG_ALIGN);
  918. if (tx_queue_idx <= s->txq_num) {
  919. vmxnet3_process_tx_queue(s, tx_queue_idx);
  920. } else {
  921. qemu_log_mask(LOG_GUEST_ERROR, "vmxnet3: Illegal TX queue %d/%d\n",
  922. tx_queue_idx, s->txq_num);
  923. }
  924. return;
  925. }
  926. if (VMW_IS_MULTIREG_ADDR(addr, VMXNET3_REG_IMR,
  927. VMXNET3_MAX_INTRS, VMXNET3_REG_ALIGN)) {
  928. int l = VMW_MULTIREG_IDX_BY_ADDR(addr, VMXNET3_REG_IMR,
  929. VMXNET3_REG_ALIGN);
  930. VMW_CBPRN("Interrupt mask for line %d written: 0x%" PRIx64, l, val);
  931. vmxnet3_on_interrupt_mask_changed(s, l, val);
  932. return;
  933. }
  934. if (VMW_IS_MULTIREG_ADDR(addr, VMXNET3_REG_RXPROD,
  935. VMXNET3_DEVICE_MAX_RX_QUEUES, VMXNET3_REG_ALIGN) ||
  936. VMW_IS_MULTIREG_ADDR(addr, VMXNET3_REG_RXPROD2,
  937. VMXNET3_DEVICE_MAX_RX_QUEUES, VMXNET3_REG_ALIGN)) {
  938. return;
  939. }
  940. VMW_WRPRN("BAR0 unknown write [%" PRIx64 "] = %" PRIx64 ", size %d",
  941. (uint64_t) addr, val, size);
  942. }
  943. static uint64_t
  944. vmxnet3_io_bar0_read(void *opaque, hwaddr addr, unsigned size)
  945. {
  946. VMXNET3State *s = opaque;
  947. if (VMW_IS_MULTIREG_ADDR(addr, VMXNET3_REG_IMR,
  948. VMXNET3_MAX_INTRS, VMXNET3_REG_ALIGN)) {
  949. int l = VMW_MULTIREG_IDX_BY_ADDR(addr, VMXNET3_REG_IMR,
  950. VMXNET3_REG_ALIGN);
  951. return s->interrupt_states[l].is_masked;
  952. }
  953. VMW_CBPRN("BAR0 unknown read [%" PRIx64 "], size %d", addr, size);
  954. return 0;
  955. }
  956. static void vmxnet3_reset_interrupt_states(VMXNET3State *s)
  957. {
  958. int i;
  959. for (i = 0; i < ARRAY_SIZE(s->interrupt_states); i++) {
  960. s->interrupt_states[i].is_asserted = false;
  961. s->interrupt_states[i].is_pending = false;
  962. s->interrupt_states[i].is_masked = true;
  963. }
  964. }
  965. static void vmxnet3_reset_mac(VMXNET3State *s)
  966. {
  967. memcpy(&s->conf.macaddr.a, &s->perm_mac.a, sizeof(s->perm_mac.a));
  968. VMW_CFPRN("MAC address set to: " MAC_FMT, MAC_ARG(s->conf.macaddr.a));
  969. }
  970. static void vmxnet3_deactivate_device(VMXNET3State *s)
  971. {
  972. if (s->device_active) {
  973. VMW_CBPRN("Deactivating vmxnet3...");
  974. net_tx_pkt_uninit(s->tx_pkt);
  975. net_rx_pkt_uninit(s->rx_pkt);
  976. s->device_active = false;
  977. }
  978. }
  979. static void vmxnet3_reset(VMXNET3State *s)
  980. {
  981. VMW_CBPRN("Resetting vmxnet3...");
  982. vmxnet3_deactivate_device(s);
  983. vmxnet3_reset_interrupt_states(s);
  984. s->drv_shmem = 0;
  985. s->tx_sop = true;
  986. s->skip_current_tx_pkt = false;
  987. }
  988. static void vmxnet3_update_rx_mode(VMXNET3State *s)
  989. {
  990. PCIDevice *d = PCI_DEVICE(s);
  991. s->rx_mode = VMXNET3_READ_DRV_SHARED32(d, s->drv_shmem,
  992. devRead.rxFilterConf.rxMode);
  993. VMW_CFPRN("RX mode: 0x%08X", s->rx_mode);
  994. }
  995. static void vmxnet3_update_vlan_filters(VMXNET3State *s)
  996. {
  997. int i;
  998. PCIDevice *d = PCI_DEVICE(s);
  999. /* Copy configuration from shared memory */
  1000. VMXNET3_READ_DRV_SHARED(d, s->drv_shmem,
  1001. devRead.rxFilterConf.vfTable,
  1002. s->vlan_table,
  1003. sizeof(s->vlan_table));
  1004. /* Invert byte order when needed */
  1005. for (i = 0; i < ARRAY_SIZE(s->vlan_table); i++) {
  1006. s->vlan_table[i] = le32_to_cpu(s->vlan_table[i]);
  1007. }
  1008. /* Dump configuration for debugging purposes */
  1009. VMW_CFPRN("Configured VLANs:");
  1010. for (i = 0; i < sizeof(s->vlan_table) * 8; i++) {
  1011. if (VMXNET3_VFTABLE_ENTRY_IS_SET(s->vlan_table, i)) {
  1012. VMW_CFPRN("\tVLAN %d is present", i);
  1013. }
  1014. }
  1015. }
  1016. static void vmxnet3_update_mcast_filters(VMXNET3State *s)
  1017. {
  1018. PCIDevice *d = PCI_DEVICE(s);
  1019. uint16_t list_bytes =
  1020. VMXNET3_READ_DRV_SHARED16(d, s->drv_shmem,
  1021. devRead.rxFilterConf.mfTableLen);
  1022. s->mcast_list_len = list_bytes / sizeof(s->mcast_list[0]);
  1023. s->mcast_list = g_realloc(s->mcast_list, list_bytes);
  1024. if (!s->mcast_list) {
  1025. if (s->mcast_list_len == 0) {
  1026. VMW_CFPRN("Current multicast list is empty");
  1027. } else {
  1028. VMW_ERPRN("Failed to allocate multicast list of %d elements",
  1029. s->mcast_list_len);
  1030. }
  1031. s->mcast_list_len = 0;
  1032. } else {
  1033. int i;
  1034. hwaddr mcast_list_pa =
  1035. VMXNET3_READ_DRV_SHARED64(d, s->drv_shmem,
  1036. devRead.rxFilterConf.mfTablePA);
  1037. pci_dma_read(d, mcast_list_pa, s->mcast_list, list_bytes);
  1038. VMW_CFPRN("Current multicast list len is %d:", s->mcast_list_len);
  1039. for (i = 0; i < s->mcast_list_len; i++) {
  1040. VMW_CFPRN("\t" MAC_FMT, MAC_ARG(s->mcast_list[i].a));
  1041. }
  1042. }
  1043. }
  1044. static void vmxnet3_setup_rx_filtering(VMXNET3State *s)
  1045. {
  1046. vmxnet3_update_rx_mode(s);
  1047. vmxnet3_update_vlan_filters(s);
  1048. vmxnet3_update_mcast_filters(s);
  1049. }
  1050. static uint32_t vmxnet3_get_interrupt_config(VMXNET3State *s)
  1051. {
  1052. uint32_t interrupt_mode = VMXNET3_IT_AUTO | (VMXNET3_IMM_AUTO << 2);
  1053. VMW_CFPRN("Interrupt config is 0x%X", interrupt_mode);
  1054. return interrupt_mode;
  1055. }
  1056. static void vmxnet3_fill_stats(VMXNET3State *s)
  1057. {
  1058. int i;
  1059. PCIDevice *d = PCI_DEVICE(s);
  1060. if (!s->device_active)
  1061. return;
  1062. for (i = 0; i < s->txq_num; i++) {
  1063. pci_dma_write(d,
  1064. s->txq_descr[i].tx_stats_pa,
  1065. &s->txq_descr[i].txq_stats,
  1066. sizeof(s->txq_descr[i].txq_stats));
  1067. }
  1068. for (i = 0; i < s->rxq_num; i++) {
  1069. pci_dma_write(d,
  1070. s->rxq_descr[i].rx_stats_pa,
  1071. &s->rxq_descr[i].rxq_stats,
  1072. sizeof(s->rxq_descr[i].rxq_stats));
  1073. }
  1074. }
  1075. static void vmxnet3_adjust_by_guest_type(VMXNET3State *s)
  1076. {
  1077. struct Vmxnet3_GOSInfo gos;
  1078. PCIDevice *d = PCI_DEVICE(s);
  1079. VMXNET3_READ_DRV_SHARED(d, s->drv_shmem, devRead.misc.driverInfo.gos,
  1080. &gos, sizeof(gos));
  1081. s->rx_packets_compound =
  1082. (gos.gosType == VMXNET3_GOS_TYPE_WIN) ? false : true;
  1083. VMW_CFPRN("Guest type specifics: RXCOMPOUND: %d", s->rx_packets_compound);
  1084. }
  1085. static void
  1086. vmxnet3_dump_conf_descr(const char *name,
  1087. struct Vmxnet3_VariableLenConfDesc *pm_descr)
  1088. {
  1089. VMW_CFPRN("%s descriptor dump: Version %u, Length %u",
  1090. name, pm_descr->confVer, pm_descr->confLen);
  1091. };
  1092. static void vmxnet3_update_pm_state(VMXNET3State *s)
  1093. {
  1094. struct Vmxnet3_VariableLenConfDesc pm_descr;
  1095. PCIDevice *d = PCI_DEVICE(s);
  1096. pm_descr.confLen =
  1097. VMXNET3_READ_DRV_SHARED32(d, s->drv_shmem, devRead.pmConfDesc.confLen);
  1098. pm_descr.confVer =
  1099. VMXNET3_READ_DRV_SHARED32(d, s->drv_shmem, devRead.pmConfDesc.confVer);
  1100. pm_descr.confPA =
  1101. VMXNET3_READ_DRV_SHARED64(d, s->drv_shmem, devRead.pmConfDesc.confPA);
  1102. vmxnet3_dump_conf_descr("PM State", &pm_descr);
  1103. }
  1104. static void vmxnet3_update_features(VMXNET3State *s)
  1105. {
  1106. uint32_t guest_features;
  1107. int rxcso_supported;
  1108. PCIDevice *d = PCI_DEVICE(s);
  1109. guest_features = VMXNET3_READ_DRV_SHARED32(d, s->drv_shmem,
  1110. devRead.misc.uptFeatures);
  1111. rxcso_supported = VMXNET_FLAG_IS_SET(guest_features, UPT1_F_RXCSUM);
  1112. s->rx_vlan_stripping = VMXNET_FLAG_IS_SET(guest_features, UPT1_F_RXVLAN);
  1113. s->lro_supported = VMXNET_FLAG_IS_SET(guest_features, UPT1_F_LRO);
  1114. VMW_CFPRN("Features configuration: LRO: %d, RXCSUM: %d, VLANSTRIP: %d",
  1115. s->lro_supported, rxcso_supported,
  1116. s->rx_vlan_stripping);
  1117. if (s->peer_has_vhdr) {
  1118. qemu_set_offload(qemu_get_queue(s->nic)->peer,
  1119. rxcso_supported,
  1120. s->lro_supported,
  1121. s->lro_supported,
  1122. 0,
  1123. 0,
  1124. 0,
  1125. 0);
  1126. }
  1127. }
  1128. static bool vmxnet3_verify_intx(VMXNET3State *s, int intx)
  1129. {
  1130. return s->msix_used || msi_enabled(PCI_DEVICE(s))
  1131. || intx == pci_get_byte(s->parent_obj.config + PCI_INTERRUPT_PIN) - 1;
  1132. }
  1133. static void vmxnet3_validate_interrupt_idx(bool is_msix, int idx)
  1134. {
  1135. int max_ints = is_msix ? VMXNET3_MAX_INTRS : VMXNET3_MAX_NMSIX_INTRS;
  1136. if (idx >= max_ints) {
  1137. hw_error("Bad interrupt index: %d\n", idx);
  1138. }
  1139. }
  1140. static void vmxnet3_validate_interrupts(VMXNET3State *s)
  1141. {
  1142. int i;
  1143. VMW_CFPRN("Verifying event interrupt index (%d)", s->event_int_idx);
  1144. vmxnet3_validate_interrupt_idx(s->msix_used, s->event_int_idx);
  1145. for (i = 0; i < s->txq_num; i++) {
  1146. int idx = s->txq_descr[i].intr_idx;
  1147. VMW_CFPRN("Verifying TX queue %d interrupt index (%d)", i, idx);
  1148. vmxnet3_validate_interrupt_idx(s->msix_used, idx);
  1149. }
  1150. for (i = 0; i < s->rxq_num; i++) {
  1151. int idx = s->rxq_descr[i].intr_idx;
  1152. VMW_CFPRN("Verifying RX queue %d interrupt index (%d)", i, idx);
  1153. vmxnet3_validate_interrupt_idx(s->msix_used, idx);
  1154. }
  1155. }
  1156. static bool vmxnet3_validate_queues(VMXNET3State *s)
  1157. {
  1158. /*
  1159. * txq_num and rxq_num are total number of queues
  1160. * configured by guest. These numbers must not
  1161. * exceed corresponding maximal values.
  1162. */
  1163. if (s->txq_num > VMXNET3_DEVICE_MAX_TX_QUEUES) {
  1164. qemu_log_mask(LOG_GUEST_ERROR, "vmxnet3: Bad TX queues number: %d\n",
  1165. s->txq_num);
  1166. return false;
  1167. }
  1168. if (s->rxq_num > VMXNET3_DEVICE_MAX_RX_QUEUES) {
  1169. qemu_log_mask(LOG_GUEST_ERROR, "vmxnet3: Bad RX queues number: %d\n",
  1170. s->rxq_num);
  1171. return false;
  1172. }
  1173. return true;
  1174. }
  1175. static void vmxnet3_activate_device(VMXNET3State *s)
  1176. {
  1177. int i;
  1178. static const uint32_t VMXNET3_DEF_TX_THRESHOLD = 1;
  1179. PCIDevice *d = PCI_DEVICE(s);
  1180. hwaddr qdescr_table_pa;
  1181. uint64_t pa;
  1182. uint32_t size;
  1183. /* Verify configuration consistency */
  1184. if (!vmxnet3_verify_driver_magic(d, s->drv_shmem)) {
  1185. VMW_ERPRN("Device configuration received from driver is invalid");
  1186. return;
  1187. }
  1188. /* Verify if device is active */
  1189. if (s->device_active) {
  1190. VMW_CFPRN("Vmxnet3 device is active");
  1191. return;
  1192. }
  1193. s->txq_num =
  1194. VMXNET3_READ_DRV_SHARED8(d, s->drv_shmem, devRead.misc.numTxQueues);
  1195. s->rxq_num =
  1196. VMXNET3_READ_DRV_SHARED8(d, s->drv_shmem, devRead.misc.numRxQueues);
  1197. VMW_CFPRN("Number of TX/RX queues %u/%u", s->txq_num, s->rxq_num);
  1198. if (!vmxnet3_validate_queues(s)) {
  1199. return;
  1200. }
  1201. vmxnet3_adjust_by_guest_type(s);
  1202. vmxnet3_update_features(s);
  1203. vmxnet3_update_pm_state(s);
  1204. vmxnet3_setup_rx_filtering(s);
  1205. /* Cache fields from shared memory */
  1206. s->mtu = VMXNET3_READ_DRV_SHARED32(d, s->drv_shmem, devRead.misc.mtu);
  1207. if (s->mtu < VMXNET3_MIN_MTU || s->mtu > VMXNET3_MAX_MTU) {
  1208. qemu_log_mask(LOG_GUEST_ERROR, "vmxnet3: Bad MTU size: %u\n", s->mtu);
  1209. return;
  1210. }
  1211. VMW_CFPRN("MTU is %u", s->mtu);
  1212. s->max_rx_frags =
  1213. VMXNET3_READ_DRV_SHARED16(d, s->drv_shmem, devRead.misc.maxNumRxSG);
  1214. if (s->max_rx_frags == 0) {
  1215. s->max_rx_frags = 1;
  1216. }
  1217. VMW_CFPRN("Max RX fragments is %u", s->max_rx_frags);
  1218. s->event_int_idx =
  1219. VMXNET3_READ_DRV_SHARED8(d, s->drv_shmem, devRead.intrConf.eventIntrIdx);
  1220. assert(vmxnet3_verify_intx(s, s->event_int_idx));
  1221. VMW_CFPRN("Events interrupt line is %u", s->event_int_idx);
  1222. s->auto_int_masking =
  1223. VMXNET3_READ_DRV_SHARED8(d, s->drv_shmem, devRead.intrConf.autoMask);
  1224. VMW_CFPRN("Automatic interrupt masking is %d", (int)s->auto_int_masking);
  1225. qdescr_table_pa =
  1226. VMXNET3_READ_DRV_SHARED64(d, s->drv_shmem, devRead.misc.queueDescPA);
  1227. VMW_CFPRN("TX queues descriptors table is at 0x%" PRIx64, qdescr_table_pa);
  1228. /*
  1229. * Worst-case scenario is a packet that holds all TX rings space so
  1230. * we calculate total size of all TX rings for max TX fragments number
  1231. */
  1232. s->max_tx_frags = 0;
  1233. /* TX queues */
  1234. for (i = 0; i < s->txq_num; i++) {
  1235. hwaddr qdescr_pa =
  1236. qdescr_table_pa + i * sizeof(struct Vmxnet3_TxQueueDesc);
  1237. /* Read interrupt number for this TX queue */
  1238. s->txq_descr[i].intr_idx =
  1239. VMXNET3_READ_TX_QUEUE_DESCR8(d, qdescr_pa, conf.intrIdx);
  1240. assert(vmxnet3_verify_intx(s, s->txq_descr[i].intr_idx));
  1241. VMW_CFPRN("TX Queue %d interrupt: %d", i, s->txq_descr[i].intr_idx);
  1242. /* Read rings memory locations for TX queues */
  1243. pa = VMXNET3_READ_TX_QUEUE_DESCR64(d, qdescr_pa, conf.txRingBasePA);
  1244. size = VMXNET3_READ_TX_QUEUE_DESCR32(d, qdescr_pa, conf.txRingSize);
  1245. if (size > VMXNET3_TX_RING_MAX_SIZE) {
  1246. size = VMXNET3_TX_RING_MAX_SIZE;
  1247. }
  1248. vmxnet3_ring_init(d, &s->txq_descr[i].tx_ring, pa, size,
  1249. sizeof(struct Vmxnet3_TxDesc), false);
  1250. VMXNET3_RING_DUMP(VMW_CFPRN, "TX", i, &s->txq_descr[i].tx_ring);
  1251. s->max_tx_frags += size;
  1252. /* TXC ring */
  1253. pa = VMXNET3_READ_TX_QUEUE_DESCR64(d, qdescr_pa, conf.compRingBasePA);
  1254. size = VMXNET3_READ_TX_QUEUE_DESCR32(d, qdescr_pa, conf.compRingSize);
  1255. if (size > VMXNET3_TC_RING_MAX_SIZE) {
  1256. size = VMXNET3_TC_RING_MAX_SIZE;
  1257. }
  1258. vmxnet3_ring_init(d, &s->txq_descr[i].comp_ring, pa, size,
  1259. sizeof(struct Vmxnet3_TxCompDesc), true);
  1260. VMXNET3_RING_DUMP(VMW_CFPRN, "TXC", i, &s->txq_descr[i].comp_ring);
  1261. s->txq_descr[i].tx_stats_pa =
  1262. qdescr_pa + offsetof(struct Vmxnet3_TxQueueDesc, stats);
  1263. memset(&s->txq_descr[i].txq_stats, 0,
  1264. sizeof(s->txq_descr[i].txq_stats));
  1265. /* Fill device-managed parameters for queues */
  1266. VMXNET3_WRITE_TX_QUEUE_DESCR32(d, qdescr_pa,
  1267. ctrl.txThreshold,
  1268. VMXNET3_DEF_TX_THRESHOLD);
  1269. }
  1270. /* Preallocate TX packet wrapper */
  1271. VMW_CFPRN("Max TX fragments is %u", s->max_tx_frags);
  1272. net_tx_pkt_init(&s->tx_pkt, s->max_tx_frags);
  1273. net_rx_pkt_init(&s->rx_pkt);
  1274. /* Read rings memory locations for RX queues */
  1275. for (i = 0; i < s->rxq_num; i++) {
  1276. int j;
  1277. hwaddr qd_pa =
  1278. qdescr_table_pa + s->txq_num * sizeof(struct Vmxnet3_TxQueueDesc) +
  1279. i * sizeof(struct Vmxnet3_RxQueueDesc);
  1280. /* Read interrupt number for this RX queue */
  1281. s->rxq_descr[i].intr_idx =
  1282. VMXNET3_READ_TX_QUEUE_DESCR8(d, qd_pa, conf.intrIdx);
  1283. assert(vmxnet3_verify_intx(s, s->rxq_descr[i].intr_idx));
  1284. VMW_CFPRN("RX Queue %d interrupt: %d", i, s->rxq_descr[i].intr_idx);
  1285. /* Read rings memory locations */
  1286. for (j = 0; j < VMXNET3_RX_RINGS_PER_QUEUE; j++) {
  1287. /* RX rings */
  1288. pa = VMXNET3_READ_RX_QUEUE_DESCR64(d, qd_pa, conf.rxRingBasePA[j]);
  1289. size = VMXNET3_READ_RX_QUEUE_DESCR32(d, qd_pa, conf.rxRingSize[j]);
  1290. if (size > VMXNET3_RX_RING_MAX_SIZE) {
  1291. size = VMXNET3_RX_RING_MAX_SIZE;
  1292. }
  1293. vmxnet3_ring_init(d, &s->rxq_descr[i].rx_ring[j], pa, size,
  1294. sizeof(struct Vmxnet3_RxDesc), false);
  1295. VMW_CFPRN("RX queue %d:%d: Base: %" PRIx64 ", Size: %d",
  1296. i, j, pa, size);
  1297. }
  1298. /* RXC ring */
  1299. pa = VMXNET3_READ_RX_QUEUE_DESCR64(d, qd_pa, conf.compRingBasePA);
  1300. size = VMXNET3_READ_RX_QUEUE_DESCR32(d, qd_pa, conf.compRingSize);
  1301. if (size > VMXNET3_RC_RING_MAX_SIZE) {
  1302. size = VMXNET3_RC_RING_MAX_SIZE;
  1303. }
  1304. vmxnet3_ring_init(d, &s->rxq_descr[i].comp_ring, pa, size,
  1305. sizeof(struct Vmxnet3_RxCompDesc), true);
  1306. VMW_CFPRN("RXC queue %d: Base: %" PRIx64 ", Size: %d", i, pa, size);
  1307. s->rxq_descr[i].rx_stats_pa =
  1308. qd_pa + offsetof(struct Vmxnet3_RxQueueDesc, stats);
  1309. memset(&s->rxq_descr[i].rxq_stats, 0,
  1310. sizeof(s->rxq_descr[i].rxq_stats));
  1311. }
  1312. vmxnet3_validate_interrupts(s);
  1313. /* Make sure everything is in place before device activation */
  1314. smp_wmb();
  1315. vmxnet3_reset_mac(s);
  1316. s->device_active = true;
  1317. }
  1318. static void vmxnet3_handle_command(VMXNET3State *s, uint64_t cmd)
  1319. {
  1320. s->last_command = cmd;
  1321. switch (cmd) {
  1322. case VMXNET3_CMD_GET_PERM_MAC_HI:
  1323. VMW_CBPRN("Set: Get upper part of permanent MAC");
  1324. break;
  1325. case VMXNET3_CMD_GET_PERM_MAC_LO:
  1326. VMW_CBPRN("Set: Get lower part of permanent MAC");
  1327. break;
  1328. case VMXNET3_CMD_GET_STATS:
  1329. VMW_CBPRN("Set: Get device statistics");
  1330. vmxnet3_fill_stats(s);
  1331. break;
  1332. case VMXNET3_CMD_ACTIVATE_DEV:
  1333. VMW_CBPRN("Set: Activating vmxnet3 device");
  1334. vmxnet3_activate_device(s);
  1335. break;
  1336. case VMXNET3_CMD_UPDATE_RX_MODE:
  1337. VMW_CBPRN("Set: Update rx mode");
  1338. vmxnet3_update_rx_mode(s);
  1339. break;
  1340. case VMXNET3_CMD_UPDATE_VLAN_FILTERS:
  1341. VMW_CBPRN("Set: Update VLAN filters");
  1342. vmxnet3_update_vlan_filters(s);
  1343. break;
  1344. case VMXNET3_CMD_UPDATE_MAC_FILTERS:
  1345. VMW_CBPRN("Set: Update MAC filters");
  1346. vmxnet3_update_mcast_filters(s);
  1347. break;
  1348. case VMXNET3_CMD_UPDATE_FEATURE:
  1349. VMW_CBPRN("Set: Update features");
  1350. vmxnet3_update_features(s);
  1351. break;
  1352. case VMXNET3_CMD_UPDATE_PMCFG:
  1353. VMW_CBPRN("Set: Update power management config");
  1354. vmxnet3_update_pm_state(s);
  1355. break;
  1356. case VMXNET3_CMD_GET_LINK:
  1357. VMW_CBPRN("Set: Get link");
  1358. break;
  1359. case VMXNET3_CMD_RESET_DEV:
  1360. VMW_CBPRN("Set: Reset device");
  1361. vmxnet3_reset(s);
  1362. break;
  1363. case VMXNET3_CMD_QUIESCE_DEV:
  1364. VMW_CBPRN("Set: VMXNET3_CMD_QUIESCE_DEV - deactivate the device");
  1365. vmxnet3_deactivate_device(s);
  1366. break;
  1367. case VMXNET3_CMD_GET_CONF_INTR:
  1368. VMW_CBPRN("Set: VMXNET3_CMD_GET_CONF_INTR - interrupt configuration");
  1369. break;
  1370. case VMXNET3_CMD_GET_ADAPTIVE_RING_INFO:
  1371. VMW_CBPRN("Set: VMXNET3_CMD_GET_ADAPTIVE_RING_INFO - "
  1372. "adaptive ring info flags");
  1373. break;
  1374. case VMXNET3_CMD_GET_DID_LO:
  1375. VMW_CBPRN("Set: Get lower part of device ID");
  1376. break;
  1377. case VMXNET3_CMD_GET_DID_HI:
  1378. VMW_CBPRN("Set: Get upper part of device ID");
  1379. break;
  1380. case VMXNET3_CMD_GET_DEV_EXTRA_INFO:
  1381. VMW_CBPRN("Set: Get device extra info");
  1382. break;
  1383. default:
  1384. VMW_CBPRN("Received unknown command: %" PRIx64, cmd);
  1385. break;
  1386. }
  1387. }
  1388. static uint64_t vmxnet3_get_command_status(VMXNET3State *s)
  1389. {
  1390. uint64_t ret;
  1391. switch (s->last_command) {
  1392. case VMXNET3_CMD_ACTIVATE_DEV:
  1393. ret = (s->device_active) ? 0 : 1;
  1394. VMW_CFPRN("Device active: %" PRIx64, ret);
  1395. break;
  1396. case VMXNET3_CMD_RESET_DEV:
  1397. case VMXNET3_CMD_QUIESCE_DEV:
  1398. case VMXNET3_CMD_GET_QUEUE_STATUS:
  1399. case VMXNET3_CMD_GET_DEV_EXTRA_INFO:
  1400. ret = 0;
  1401. break;
  1402. case VMXNET3_CMD_GET_LINK:
  1403. ret = s->link_status_and_speed;
  1404. VMW_CFPRN("Link and speed: %" PRIx64, ret);
  1405. break;
  1406. case VMXNET3_CMD_GET_PERM_MAC_LO:
  1407. ret = vmxnet3_get_mac_low(&s->perm_mac);
  1408. break;
  1409. case VMXNET3_CMD_GET_PERM_MAC_HI:
  1410. ret = vmxnet3_get_mac_high(&s->perm_mac);
  1411. break;
  1412. case VMXNET3_CMD_GET_CONF_INTR:
  1413. ret = vmxnet3_get_interrupt_config(s);
  1414. break;
  1415. case VMXNET3_CMD_GET_ADAPTIVE_RING_INFO:
  1416. ret = VMXNET3_DISABLE_ADAPTIVE_RING;
  1417. break;
  1418. case VMXNET3_CMD_GET_DID_LO:
  1419. ret = PCI_DEVICE_ID_VMWARE_VMXNET3;
  1420. break;
  1421. case VMXNET3_CMD_GET_DID_HI:
  1422. ret = VMXNET3_DEVICE_REVISION;
  1423. break;
  1424. default:
  1425. VMW_WRPRN("Received request for unknown command: %x", s->last_command);
  1426. ret = 0;
  1427. break;
  1428. }
  1429. return ret;
  1430. }
  1431. static void vmxnet3_set_events(VMXNET3State *s, uint32_t val)
  1432. {
  1433. uint32_t events;
  1434. PCIDevice *d = PCI_DEVICE(s);
  1435. VMW_CBPRN("Setting events: 0x%x", val);
  1436. events = VMXNET3_READ_DRV_SHARED32(d, s->drv_shmem, ecr) | val;
  1437. VMXNET3_WRITE_DRV_SHARED32(d, s->drv_shmem, ecr, events);
  1438. }
  1439. static void vmxnet3_ack_events(VMXNET3State *s, uint32_t val)
  1440. {
  1441. PCIDevice *d = PCI_DEVICE(s);
  1442. uint32_t events;
  1443. VMW_CBPRN("Clearing events: 0x%x", val);
  1444. events = VMXNET3_READ_DRV_SHARED32(d, s->drv_shmem, ecr) & ~val;
  1445. VMXNET3_WRITE_DRV_SHARED32(d, s->drv_shmem, ecr, events);
  1446. }
  1447. static void
  1448. vmxnet3_io_bar1_write(void *opaque,
  1449. hwaddr addr,
  1450. uint64_t val,
  1451. unsigned size)
  1452. {
  1453. VMXNET3State *s = opaque;
  1454. switch (addr) {
  1455. /* Vmxnet3 Revision Report Selection */
  1456. case VMXNET3_REG_VRRS:
  1457. VMW_CBPRN("Write BAR1 [VMXNET3_REG_VRRS] = %" PRIx64 ", size %d",
  1458. val, size);
  1459. break;
  1460. /* UPT Version Report Selection */
  1461. case VMXNET3_REG_UVRS:
  1462. VMW_CBPRN("Write BAR1 [VMXNET3_REG_UVRS] = %" PRIx64 ", size %d",
  1463. val, size);
  1464. break;
  1465. /* Driver Shared Address Low */
  1466. case VMXNET3_REG_DSAL:
  1467. VMW_CBPRN("Write BAR1 [VMXNET3_REG_DSAL] = %" PRIx64 ", size %d",
  1468. val, size);
  1469. /*
  1470. * Guest driver will first write the low part of the shared
  1471. * memory address. We save it to temp variable and set the
  1472. * shared address only after we get the high part
  1473. */
  1474. if (val == 0) {
  1475. vmxnet3_deactivate_device(s);
  1476. }
  1477. s->temp_shared_guest_driver_memory = val;
  1478. s->drv_shmem = 0;
  1479. break;
  1480. /* Driver Shared Address High */
  1481. case VMXNET3_REG_DSAH:
  1482. VMW_CBPRN("Write BAR1 [VMXNET3_REG_DSAH] = %" PRIx64 ", size %d",
  1483. val, size);
  1484. /*
  1485. * Set the shared memory between guest driver and device.
  1486. * We already should have low address part.
  1487. */
  1488. s->drv_shmem = s->temp_shared_guest_driver_memory | (val << 32);
  1489. break;
  1490. /* Command */
  1491. case VMXNET3_REG_CMD:
  1492. VMW_CBPRN("Write BAR1 [VMXNET3_REG_CMD] = %" PRIx64 ", size %d",
  1493. val, size);
  1494. vmxnet3_handle_command(s, val);
  1495. break;
  1496. /* MAC Address Low */
  1497. case VMXNET3_REG_MACL:
  1498. VMW_CBPRN("Write BAR1 [VMXNET3_REG_MACL] = %" PRIx64 ", size %d",
  1499. val, size);
  1500. s->temp_mac = val;
  1501. break;
  1502. /* MAC Address High */
  1503. case VMXNET3_REG_MACH:
  1504. VMW_CBPRN("Write BAR1 [VMXNET3_REG_MACH] = %" PRIx64 ", size %d",
  1505. val, size);
  1506. vmxnet3_set_variable_mac(s, val, s->temp_mac);
  1507. break;
  1508. /* Interrupt Cause Register */
  1509. case VMXNET3_REG_ICR:
  1510. VMW_CBPRN("Write BAR1 [VMXNET3_REG_ICR] = %" PRIx64 ", size %d",
  1511. val, size);
  1512. qemu_log_mask(LOG_GUEST_ERROR,
  1513. "%s: write to read-only register VMXNET3_REG_ICR\n",
  1514. TYPE_VMXNET3);
  1515. break;
  1516. /* Event Cause Register */
  1517. case VMXNET3_REG_ECR:
  1518. VMW_CBPRN("Write BAR1 [VMXNET3_REG_ECR] = %" PRIx64 ", size %d",
  1519. val, size);
  1520. vmxnet3_ack_events(s, val);
  1521. break;
  1522. default:
  1523. VMW_CBPRN("Unknown Write to BAR1 [%" PRIx64 "] = %" PRIx64 ", size %d",
  1524. addr, val, size);
  1525. break;
  1526. }
  1527. }
  1528. static uint64_t
  1529. vmxnet3_io_bar1_read(void *opaque, hwaddr addr, unsigned size)
  1530. {
  1531. VMXNET3State *s = opaque;
  1532. uint64_t ret = 0;
  1533. switch (addr) {
  1534. /* Vmxnet3 Revision Report Selection */
  1535. case VMXNET3_REG_VRRS:
  1536. VMW_CBPRN("Read BAR1 [VMXNET3_REG_VRRS], size %d", size);
  1537. ret = VMXNET3_DEVICE_REVISION;
  1538. break;
  1539. /* UPT Version Report Selection */
  1540. case VMXNET3_REG_UVRS:
  1541. VMW_CBPRN("Read BAR1 [VMXNET3_REG_UVRS], size %d", size);
  1542. ret = VMXNET3_UPT_REVISION;
  1543. break;
  1544. /* Command */
  1545. case VMXNET3_REG_CMD:
  1546. VMW_CBPRN("Read BAR1 [VMXNET3_REG_CMD], size %d", size);
  1547. ret = vmxnet3_get_command_status(s);
  1548. break;
  1549. /* MAC Address Low */
  1550. case VMXNET3_REG_MACL:
  1551. VMW_CBPRN("Read BAR1 [VMXNET3_REG_MACL], size %d", size);
  1552. ret = vmxnet3_get_mac_low(&s->conf.macaddr);
  1553. break;
  1554. /* MAC Address High */
  1555. case VMXNET3_REG_MACH:
  1556. VMW_CBPRN("Read BAR1 [VMXNET3_REG_MACH], size %d", size);
  1557. ret = vmxnet3_get_mac_high(&s->conf.macaddr);
  1558. break;
  1559. /*
  1560. * Interrupt Cause Register
  1561. * Used for legacy interrupts only so interrupt index always 0
  1562. */
  1563. case VMXNET3_REG_ICR:
  1564. VMW_CBPRN("Read BAR1 [VMXNET3_REG_ICR], size %d", size);
  1565. if (vmxnet3_interrupt_asserted(s, 0)) {
  1566. vmxnet3_clear_interrupt(s, 0);
  1567. ret = true;
  1568. } else {
  1569. ret = false;
  1570. }
  1571. break;
  1572. default:
  1573. VMW_CBPRN("Unknown read BAR1[%" PRIx64 "], %d bytes", addr, size);
  1574. break;
  1575. }
  1576. return ret;
  1577. }
  1578. static int
  1579. vmxnet3_can_receive(NetClientState *nc)
  1580. {
  1581. VMXNET3State *s = qemu_get_nic_opaque(nc);
  1582. return s->device_active &&
  1583. VMXNET_FLAG_IS_SET(s->link_status_and_speed, VMXNET3_LINK_STATUS_UP);
  1584. }
  1585. static inline bool
  1586. vmxnet3_is_registered_vlan(VMXNET3State *s, const void *data)
  1587. {
  1588. uint16_t vlan_tag = eth_get_pkt_tci(data) & VLAN_VID_MASK;
  1589. if (IS_SPECIAL_VLAN_ID(vlan_tag)) {
  1590. return true;
  1591. }
  1592. return VMXNET3_VFTABLE_ENTRY_IS_SET(s->vlan_table, vlan_tag);
  1593. }
  1594. static bool
  1595. vmxnet3_is_allowed_mcast_group(VMXNET3State *s, const uint8_t *group_mac)
  1596. {
  1597. int i;
  1598. for (i = 0; i < s->mcast_list_len; i++) {
  1599. if (!memcmp(group_mac, s->mcast_list[i].a, sizeof(s->mcast_list[i]))) {
  1600. return true;
  1601. }
  1602. }
  1603. return false;
  1604. }
  1605. static bool
  1606. vmxnet3_rx_filter_may_indicate(VMXNET3State *s, const void *data,
  1607. size_t size)
  1608. {
  1609. struct eth_header *ehdr = PKT_GET_ETH_HDR(data);
  1610. if (VMXNET_FLAG_IS_SET(s->rx_mode, VMXNET3_RXM_PROMISC)) {
  1611. return true;
  1612. }
  1613. if (!vmxnet3_is_registered_vlan(s, data)) {
  1614. return false;
  1615. }
  1616. switch (net_rx_pkt_get_packet_type(s->rx_pkt)) {
  1617. case ETH_PKT_UCAST:
  1618. if (!VMXNET_FLAG_IS_SET(s->rx_mode, VMXNET3_RXM_UCAST)) {
  1619. return false;
  1620. }
  1621. if (memcmp(s->conf.macaddr.a, ehdr->h_dest, ETH_ALEN)) {
  1622. return false;
  1623. }
  1624. break;
  1625. case ETH_PKT_BCAST:
  1626. if (!VMXNET_FLAG_IS_SET(s->rx_mode, VMXNET3_RXM_BCAST)) {
  1627. return false;
  1628. }
  1629. break;
  1630. case ETH_PKT_MCAST:
  1631. if (VMXNET_FLAG_IS_SET(s->rx_mode, VMXNET3_RXM_ALL_MULTI)) {
  1632. return true;
  1633. }
  1634. if (!VMXNET_FLAG_IS_SET(s->rx_mode, VMXNET3_RXM_MCAST)) {
  1635. return false;
  1636. }
  1637. if (!vmxnet3_is_allowed_mcast_group(s, ehdr->h_dest)) {
  1638. return false;
  1639. }
  1640. break;
  1641. default:
  1642. g_assert_not_reached();
  1643. }
  1644. return true;
  1645. }
  1646. static ssize_t
  1647. vmxnet3_receive(NetClientState *nc, const uint8_t *buf, size_t size)
  1648. {
  1649. VMXNET3State *s = qemu_get_nic_opaque(nc);
  1650. size_t bytes_indicated;
  1651. if (!vmxnet3_can_receive(nc)) {
  1652. VMW_PKPRN("Cannot receive now");
  1653. return -1;
  1654. }
  1655. if (s->peer_has_vhdr) {
  1656. net_rx_pkt_set_vhdr(s->rx_pkt, (struct virtio_net_hdr *)buf);
  1657. buf += sizeof(struct virtio_net_hdr);
  1658. size -= sizeof(struct virtio_net_hdr);
  1659. }
  1660. net_rx_pkt_set_packet_type(s->rx_pkt,
  1661. get_eth_packet_type(PKT_GET_ETH_HDR(buf)));
  1662. if (vmxnet3_rx_filter_may_indicate(s, buf, size)) {
  1663. struct iovec iov = {
  1664. .iov_base = (void *)buf,
  1665. .iov_len = size
  1666. };
  1667. net_rx_pkt_set_protocols(s->rx_pkt, &iov, 1, 0);
  1668. vmxnet3_rx_need_csum_calculate(s->rx_pkt, buf, size);
  1669. net_rx_pkt_attach_data(s->rx_pkt, buf, size, s->rx_vlan_stripping);
  1670. bytes_indicated = vmxnet3_indicate_packet(s) ? size : -1;
  1671. if (bytes_indicated < size) {
  1672. VMW_PKPRN("RX: %zu of %zu bytes indicated", bytes_indicated, size);
  1673. }
  1674. } else {
  1675. VMW_PKPRN("Packet dropped by RX filter");
  1676. bytes_indicated = size;
  1677. }
  1678. assert(size > 0);
  1679. assert(bytes_indicated != 0);
  1680. return bytes_indicated;
  1681. }
  1682. static void vmxnet3_set_link_status(NetClientState *nc)
  1683. {
  1684. VMXNET3State *s = qemu_get_nic_opaque(nc);
  1685. if (nc->link_down) {
  1686. s->link_status_and_speed &= ~VMXNET3_LINK_STATUS_UP;
  1687. } else {
  1688. s->link_status_and_speed |= VMXNET3_LINK_STATUS_UP;
  1689. }
  1690. vmxnet3_set_events(s, VMXNET3_ECR_LINK);
  1691. vmxnet3_trigger_interrupt(s, s->event_int_idx);
  1692. }
  1693. static NetClientInfo net_vmxnet3_info = {
  1694. .type = NET_CLIENT_DRIVER_NIC,
  1695. .size = sizeof(NICState),
  1696. .receive = vmxnet3_receive,
  1697. .link_status_changed = vmxnet3_set_link_status,
  1698. };
  1699. static bool vmxnet3_peer_has_vnet_hdr(VMXNET3State *s)
  1700. {
  1701. NetClientState *nc = qemu_get_queue(s->nic);
  1702. if (qemu_has_vnet_hdr(nc->peer)) {
  1703. return true;
  1704. }
  1705. return false;
  1706. }
  1707. static void vmxnet3_net_uninit(VMXNET3State *s)
  1708. {
  1709. g_free(s->mcast_list);
  1710. vmxnet3_deactivate_device(s);
  1711. qemu_del_nic(s->nic);
  1712. }
  1713. static void vmxnet3_net_init(VMXNET3State *s)
  1714. {
  1715. DeviceState *d = DEVICE(s);
  1716. VMW_CBPRN("vmxnet3_net_init called...");
  1717. qemu_macaddr_default_if_unset(&s->conf.macaddr);
  1718. /* Windows guest will query the address that was set on init */
  1719. memcpy(&s->perm_mac.a, &s->conf.macaddr.a, sizeof(s->perm_mac.a));
  1720. s->mcast_list = NULL;
  1721. s->mcast_list_len = 0;
  1722. s->link_status_and_speed = VMXNET3_LINK_SPEED | VMXNET3_LINK_STATUS_UP;
  1723. VMW_CFPRN("Permanent MAC: " MAC_FMT, MAC_ARG(s->perm_mac.a));
  1724. s->nic = qemu_new_nic(&net_vmxnet3_info, &s->conf,
  1725. object_get_typename(OBJECT(s)),
  1726. d->id, &d->mem_reentrancy_guard, s);
  1727. s->peer_has_vhdr = vmxnet3_peer_has_vnet_hdr(s);
  1728. s->tx_sop = true;
  1729. s->skip_current_tx_pkt = false;
  1730. s->tx_pkt = NULL;
  1731. s->rx_pkt = NULL;
  1732. s->rx_vlan_stripping = false;
  1733. s->lro_supported = false;
  1734. if (s->peer_has_vhdr) {
  1735. qemu_set_vnet_hdr_len(qemu_get_queue(s->nic)->peer,
  1736. sizeof(struct virtio_net_hdr));
  1737. }
  1738. qemu_format_nic_info_str(qemu_get_queue(s->nic), s->conf.macaddr.a);
  1739. }
  1740. static void
  1741. vmxnet3_unuse_msix_vectors(VMXNET3State *s, int num_vectors)
  1742. {
  1743. PCIDevice *d = PCI_DEVICE(s);
  1744. int i;
  1745. for (i = 0; i < num_vectors; i++) {
  1746. msix_vector_unuse(d, i);
  1747. }
  1748. }
  1749. static void
  1750. vmxnet3_use_msix_vectors(VMXNET3State *s, int num_vectors)
  1751. {
  1752. PCIDevice *d = PCI_DEVICE(s);
  1753. int i;
  1754. for (i = 0; i < num_vectors; i++) {
  1755. msix_vector_use(d, i);
  1756. }
  1757. }
  1758. static bool
  1759. vmxnet3_init_msix(VMXNET3State *s)
  1760. {
  1761. PCIDevice *d = PCI_DEVICE(s);
  1762. int res = msix_init(d, VMXNET3_MAX_INTRS,
  1763. &s->msix_bar,
  1764. VMXNET3_MSIX_BAR_IDX, VMXNET3_OFF_MSIX_TABLE,
  1765. &s->msix_bar,
  1766. VMXNET3_MSIX_BAR_IDX, VMXNET3_OFF_MSIX_PBA(s),
  1767. VMXNET3_MSIX_OFFSET(s), NULL);
  1768. if (0 > res) {
  1769. VMW_WRPRN("Failed to initialize MSI-X, error %d", res);
  1770. s->msix_used = false;
  1771. } else {
  1772. vmxnet3_use_msix_vectors(s, VMXNET3_MAX_INTRS);
  1773. s->msix_used = true;
  1774. }
  1775. return s->msix_used;
  1776. }
  1777. static void
  1778. vmxnet3_cleanup_msix(VMXNET3State *s)
  1779. {
  1780. PCIDevice *d = PCI_DEVICE(s);
  1781. if (s->msix_used) {
  1782. vmxnet3_unuse_msix_vectors(s, VMXNET3_MAX_INTRS);
  1783. msix_uninit(d, &s->msix_bar, &s->msix_bar);
  1784. }
  1785. }
  1786. static void
  1787. vmxnet3_cleanup_msi(VMXNET3State *s)
  1788. {
  1789. PCIDevice *d = PCI_DEVICE(s);
  1790. msi_uninit(d);
  1791. }
  1792. static const MemoryRegionOps b0_ops = {
  1793. .read = vmxnet3_io_bar0_read,
  1794. .write = vmxnet3_io_bar0_write,
  1795. .endianness = DEVICE_LITTLE_ENDIAN,
  1796. .impl = {
  1797. .min_access_size = 4,
  1798. .max_access_size = 4,
  1799. },
  1800. };
  1801. static const MemoryRegionOps b1_ops = {
  1802. .read = vmxnet3_io_bar1_read,
  1803. .write = vmxnet3_io_bar1_write,
  1804. .endianness = DEVICE_LITTLE_ENDIAN,
  1805. .impl = {
  1806. .min_access_size = 4,
  1807. .max_access_size = 4,
  1808. },
  1809. };
  1810. static uint64_t vmxnet3_device_serial_num(VMXNET3State *s)
  1811. {
  1812. uint64_t dsn_payload;
  1813. uint8_t *dsnp = (uint8_t *)&dsn_payload;
  1814. dsnp[0] = 0xfe;
  1815. dsnp[1] = s->conf.macaddr.a[3];
  1816. dsnp[2] = s->conf.macaddr.a[4];
  1817. dsnp[3] = s->conf.macaddr.a[5];
  1818. dsnp[4] = s->conf.macaddr.a[0];
  1819. dsnp[5] = s->conf.macaddr.a[1];
  1820. dsnp[6] = s->conf.macaddr.a[2];
  1821. dsnp[7] = 0xff;
  1822. return dsn_payload;
  1823. }
  1824. #define VMXNET3_USE_64BIT (true)
  1825. #define VMXNET3_PER_VECTOR_MASK (false)
  1826. static void vmxnet3_pci_realize(PCIDevice *pci_dev, Error **errp)
  1827. {
  1828. VMXNET3State *s = VMXNET3(pci_dev);
  1829. int ret;
  1830. VMW_CBPRN("Starting init...");
  1831. memory_region_init_io(&s->bar0, OBJECT(s), &b0_ops, s,
  1832. "vmxnet3-b0", VMXNET3_PT_REG_SIZE);
  1833. pci_register_bar(pci_dev, VMXNET3_BAR0_IDX,
  1834. PCI_BASE_ADDRESS_SPACE_MEMORY, &s->bar0);
  1835. memory_region_init_io(&s->bar1, OBJECT(s), &b1_ops, s,
  1836. "vmxnet3-b1", VMXNET3_VD_REG_SIZE);
  1837. pci_register_bar(pci_dev, VMXNET3_BAR1_IDX,
  1838. PCI_BASE_ADDRESS_SPACE_MEMORY, &s->bar1);
  1839. memory_region_init(&s->msix_bar, OBJECT(s), "vmxnet3-msix-bar",
  1840. VMXNET3_MSIX_BAR_SIZE);
  1841. pci_register_bar(pci_dev, VMXNET3_MSIX_BAR_IDX,
  1842. PCI_BASE_ADDRESS_SPACE_MEMORY, &s->msix_bar);
  1843. vmxnet3_reset_interrupt_states(s);
  1844. /* Interrupt pin A */
  1845. pci_dev->config[PCI_INTERRUPT_PIN] = 0x01;
  1846. ret = msi_init(pci_dev, VMXNET3_MSI_OFFSET(s), VMXNET3_MAX_NMSIX_INTRS,
  1847. VMXNET3_USE_64BIT, VMXNET3_PER_VECTOR_MASK, NULL);
  1848. /* Any error other than -ENOTSUP(board's MSI support is broken)
  1849. * is a programming error. Fall back to INTx silently on -ENOTSUP */
  1850. assert(!ret || ret == -ENOTSUP);
  1851. if (!vmxnet3_init_msix(s)) {
  1852. VMW_WRPRN("Failed to initialize MSI-X, configuration is inconsistent.");
  1853. }
  1854. vmxnet3_net_init(s);
  1855. if (pci_is_express(pci_dev)) {
  1856. if (pci_bus_is_express(pci_get_bus(pci_dev))) {
  1857. pcie_endpoint_cap_init(pci_dev, VMXNET3_EXP_EP_OFFSET);
  1858. }
  1859. pcie_dev_ser_num_init(pci_dev, VMXNET3_DSN_OFFSET,
  1860. vmxnet3_device_serial_num(s));
  1861. }
  1862. }
  1863. static void vmxnet3_instance_init(Object *obj)
  1864. {
  1865. VMXNET3State *s = VMXNET3(obj);
  1866. device_add_bootindex_property(obj, &s->conf.bootindex,
  1867. "bootindex", "/ethernet-phy@0",
  1868. DEVICE(obj));
  1869. }
  1870. static void vmxnet3_pci_uninit(PCIDevice *pci_dev)
  1871. {
  1872. VMXNET3State *s = VMXNET3(pci_dev);
  1873. VMW_CBPRN("Starting uninit...");
  1874. vmxnet3_net_uninit(s);
  1875. vmxnet3_cleanup_msix(s);
  1876. vmxnet3_cleanup_msi(s);
  1877. }
  1878. static void vmxnet3_qdev_reset(DeviceState *dev)
  1879. {
  1880. PCIDevice *d = PCI_DEVICE(dev);
  1881. VMXNET3State *s = VMXNET3(d);
  1882. VMW_CBPRN("Starting QDEV reset...");
  1883. vmxnet3_reset(s);
  1884. }
  1885. static bool vmxnet3_mc_list_needed(void *opaque)
  1886. {
  1887. return true;
  1888. }
  1889. static int vmxnet3_mcast_list_pre_load(void *opaque)
  1890. {
  1891. VMXNET3State *s = opaque;
  1892. s->mcast_list = g_malloc(s->mcast_list_buff_size);
  1893. return 0;
  1894. }
  1895. static int vmxnet3_pre_save(void *opaque)
  1896. {
  1897. VMXNET3State *s = opaque;
  1898. s->mcast_list_buff_size = s->mcast_list_len * sizeof(MACAddr);
  1899. return 0;
  1900. }
  1901. static const VMStateDescription vmxstate_vmxnet3_mcast_list = {
  1902. .name = "vmxnet3/mcast_list",
  1903. .version_id = 1,
  1904. .minimum_version_id = 1,
  1905. .pre_load = vmxnet3_mcast_list_pre_load,
  1906. .needed = vmxnet3_mc_list_needed,
  1907. .fields = (const VMStateField[]) {
  1908. VMSTATE_VBUFFER_UINT32(mcast_list, VMXNET3State, 0, NULL,
  1909. mcast_list_buff_size),
  1910. VMSTATE_END_OF_LIST()
  1911. }
  1912. };
  1913. static const VMStateDescription vmstate_vmxnet3_ring = {
  1914. .name = "vmxnet3-ring",
  1915. .version_id = 0,
  1916. .fields = (const VMStateField[]) {
  1917. VMSTATE_UINT64(pa, Vmxnet3Ring),
  1918. VMSTATE_UINT32(size, Vmxnet3Ring),
  1919. VMSTATE_UINT32(cell_size, Vmxnet3Ring),
  1920. VMSTATE_UINT32(next, Vmxnet3Ring),
  1921. VMSTATE_UINT8(gen, Vmxnet3Ring),
  1922. VMSTATE_END_OF_LIST()
  1923. }
  1924. };
  1925. static const VMStateDescription vmstate_vmxnet3_tx_stats = {
  1926. .name = "vmxnet3-tx-stats",
  1927. .version_id = 0,
  1928. .fields = (const VMStateField[]) {
  1929. VMSTATE_UINT64(TSOPktsTxOK, struct UPT1_TxStats),
  1930. VMSTATE_UINT64(TSOBytesTxOK, struct UPT1_TxStats),
  1931. VMSTATE_UINT64(ucastPktsTxOK, struct UPT1_TxStats),
  1932. VMSTATE_UINT64(ucastBytesTxOK, struct UPT1_TxStats),
  1933. VMSTATE_UINT64(mcastPktsTxOK, struct UPT1_TxStats),
  1934. VMSTATE_UINT64(mcastBytesTxOK, struct UPT1_TxStats),
  1935. VMSTATE_UINT64(bcastPktsTxOK, struct UPT1_TxStats),
  1936. VMSTATE_UINT64(bcastBytesTxOK, struct UPT1_TxStats),
  1937. VMSTATE_UINT64(pktsTxError, struct UPT1_TxStats),
  1938. VMSTATE_UINT64(pktsTxDiscard, struct UPT1_TxStats),
  1939. VMSTATE_END_OF_LIST()
  1940. }
  1941. };
  1942. static const VMStateDescription vmstate_vmxnet3_txq_descr = {
  1943. .name = "vmxnet3-txq-descr",
  1944. .version_id = 0,
  1945. .fields = (const VMStateField[]) {
  1946. VMSTATE_STRUCT(tx_ring, Vmxnet3TxqDescr, 0, vmstate_vmxnet3_ring,
  1947. Vmxnet3Ring),
  1948. VMSTATE_STRUCT(comp_ring, Vmxnet3TxqDescr, 0, vmstate_vmxnet3_ring,
  1949. Vmxnet3Ring),
  1950. VMSTATE_UINT8(intr_idx, Vmxnet3TxqDescr),
  1951. VMSTATE_UINT64(tx_stats_pa, Vmxnet3TxqDescr),
  1952. VMSTATE_STRUCT(txq_stats, Vmxnet3TxqDescr, 0, vmstate_vmxnet3_tx_stats,
  1953. struct UPT1_TxStats),
  1954. VMSTATE_END_OF_LIST()
  1955. }
  1956. };
  1957. static const VMStateDescription vmstate_vmxnet3_rx_stats = {
  1958. .name = "vmxnet3-rx-stats",
  1959. .version_id = 0,
  1960. .fields = (const VMStateField[]) {
  1961. VMSTATE_UINT64(LROPktsRxOK, struct UPT1_RxStats),
  1962. VMSTATE_UINT64(LROBytesRxOK, struct UPT1_RxStats),
  1963. VMSTATE_UINT64(ucastPktsRxOK, struct UPT1_RxStats),
  1964. VMSTATE_UINT64(ucastBytesRxOK, struct UPT1_RxStats),
  1965. VMSTATE_UINT64(mcastPktsRxOK, struct UPT1_RxStats),
  1966. VMSTATE_UINT64(mcastBytesRxOK, struct UPT1_RxStats),
  1967. VMSTATE_UINT64(bcastPktsRxOK, struct UPT1_RxStats),
  1968. VMSTATE_UINT64(bcastBytesRxOK, struct UPT1_RxStats),
  1969. VMSTATE_UINT64(pktsRxOutOfBuf, struct UPT1_RxStats),
  1970. VMSTATE_UINT64(pktsRxError, struct UPT1_RxStats),
  1971. VMSTATE_END_OF_LIST()
  1972. }
  1973. };
  1974. static const VMStateDescription vmstate_vmxnet3_rxq_descr = {
  1975. .name = "vmxnet3-rxq-descr",
  1976. .version_id = 0,
  1977. .fields = (const VMStateField[]) {
  1978. VMSTATE_STRUCT_ARRAY(rx_ring, Vmxnet3RxqDescr,
  1979. VMXNET3_RX_RINGS_PER_QUEUE, 0,
  1980. vmstate_vmxnet3_ring, Vmxnet3Ring),
  1981. VMSTATE_STRUCT(comp_ring, Vmxnet3RxqDescr, 0, vmstate_vmxnet3_ring,
  1982. Vmxnet3Ring),
  1983. VMSTATE_UINT8(intr_idx, Vmxnet3RxqDescr),
  1984. VMSTATE_UINT64(rx_stats_pa, Vmxnet3RxqDescr),
  1985. VMSTATE_STRUCT(rxq_stats, Vmxnet3RxqDescr, 0, vmstate_vmxnet3_rx_stats,
  1986. struct UPT1_RxStats),
  1987. VMSTATE_END_OF_LIST()
  1988. }
  1989. };
  1990. static int vmxnet3_post_load(void *opaque, int version_id)
  1991. {
  1992. VMXNET3State *s = opaque;
  1993. net_tx_pkt_init(&s->tx_pkt, s->max_tx_frags);
  1994. net_rx_pkt_init(&s->rx_pkt);
  1995. if (s->msix_used) {
  1996. vmxnet3_use_msix_vectors(s, VMXNET3_MAX_INTRS);
  1997. }
  1998. if (!vmxnet3_validate_queues(s)) {
  1999. return -1;
  2000. }
  2001. vmxnet3_validate_interrupts(s);
  2002. return 0;
  2003. }
  2004. static const VMStateDescription vmstate_vmxnet3_int_state = {
  2005. .name = "vmxnet3-int-state",
  2006. .version_id = 0,
  2007. .fields = (const VMStateField[]) {
  2008. VMSTATE_BOOL(is_masked, Vmxnet3IntState),
  2009. VMSTATE_BOOL(is_pending, Vmxnet3IntState),
  2010. VMSTATE_BOOL(is_asserted, Vmxnet3IntState),
  2011. VMSTATE_END_OF_LIST()
  2012. }
  2013. };
  2014. static const VMStateDescription vmstate_vmxnet3 = {
  2015. .name = "vmxnet3",
  2016. .version_id = 1,
  2017. .minimum_version_id = 1,
  2018. .pre_save = vmxnet3_pre_save,
  2019. .post_load = vmxnet3_post_load,
  2020. .fields = (const VMStateField[]) {
  2021. VMSTATE_PCI_DEVICE(parent_obj, VMXNET3State),
  2022. VMSTATE_MSIX(parent_obj, VMXNET3State),
  2023. VMSTATE_BOOL(rx_packets_compound, VMXNET3State),
  2024. VMSTATE_BOOL(rx_vlan_stripping, VMXNET3State),
  2025. VMSTATE_BOOL(lro_supported, VMXNET3State),
  2026. VMSTATE_UINT32(rx_mode, VMXNET3State),
  2027. VMSTATE_UINT32(mcast_list_len, VMXNET3State),
  2028. VMSTATE_UINT32(mcast_list_buff_size, VMXNET3State),
  2029. VMSTATE_UINT32_ARRAY(vlan_table, VMXNET3State, VMXNET3_VFT_SIZE),
  2030. VMSTATE_UINT32(mtu, VMXNET3State),
  2031. VMSTATE_UINT16(max_rx_frags, VMXNET3State),
  2032. VMSTATE_UINT32(max_tx_frags, VMXNET3State),
  2033. VMSTATE_UINT8(event_int_idx, VMXNET3State),
  2034. VMSTATE_BOOL(auto_int_masking, VMXNET3State),
  2035. VMSTATE_UINT8(txq_num, VMXNET3State),
  2036. VMSTATE_UINT8(rxq_num, VMXNET3State),
  2037. VMSTATE_UINT32(device_active, VMXNET3State),
  2038. VMSTATE_UINT32(last_command, VMXNET3State),
  2039. VMSTATE_UINT32(link_status_and_speed, VMXNET3State),
  2040. VMSTATE_UINT32(temp_mac, VMXNET3State),
  2041. VMSTATE_UINT64(drv_shmem, VMXNET3State),
  2042. VMSTATE_UINT64(temp_shared_guest_driver_memory, VMXNET3State),
  2043. VMSTATE_STRUCT_ARRAY(txq_descr, VMXNET3State,
  2044. VMXNET3_DEVICE_MAX_TX_QUEUES, 0, vmstate_vmxnet3_txq_descr,
  2045. Vmxnet3TxqDescr),
  2046. VMSTATE_STRUCT_ARRAY(rxq_descr, VMXNET3State,
  2047. VMXNET3_DEVICE_MAX_RX_QUEUES, 0, vmstate_vmxnet3_rxq_descr,
  2048. Vmxnet3RxqDescr),
  2049. VMSTATE_STRUCT_ARRAY(interrupt_states, VMXNET3State,
  2050. VMXNET3_MAX_INTRS, 0, vmstate_vmxnet3_int_state,
  2051. Vmxnet3IntState),
  2052. VMSTATE_END_OF_LIST()
  2053. },
  2054. .subsections = (const VMStateDescription * const []) {
  2055. &vmxstate_vmxnet3_mcast_list,
  2056. NULL
  2057. }
  2058. };
  2059. static const Property vmxnet3_properties[] = {
  2060. DEFINE_NIC_PROPERTIES(VMXNET3State, conf),
  2061. DEFINE_PROP_BIT("x-old-msi-offsets", VMXNET3State, compat_flags,
  2062. VMXNET3_COMPAT_FLAG_OLD_MSI_OFFSETS_BIT, false),
  2063. DEFINE_PROP_BIT("x-disable-pcie", VMXNET3State, compat_flags,
  2064. VMXNET3_COMPAT_FLAG_DISABLE_PCIE_BIT, false),
  2065. };
  2066. static void vmxnet3_realize(DeviceState *qdev, Error **errp)
  2067. {
  2068. VMXNET3Class *vc = VMXNET3_DEVICE_GET_CLASS(qdev);
  2069. PCIDevice *pci_dev = PCI_DEVICE(qdev);
  2070. VMXNET3State *s = VMXNET3(qdev);
  2071. if (!(s->compat_flags & VMXNET3_COMPAT_FLAG_DISABLE_PCIE)) {
  2072. pci_dev->cap_present |= QEMU_PCI_CAP_EXPRESS;
  2073. }
  2074. vc->parent_dc_realize(qdev, errp);
  2075. }
  2076. static void vmxnet3_class_init(ObjectClass *class, void *data)
  2077. {
  2078. DeviceClass *dc = DEVICE_CLASS(class);
  2079. PCIDeviceClass *c = PCI_DEVICE_CLASS(class);
  2080. VMXNET3Class *vc = VMXNET3_DEVICE_CLASS(class);
  2081. c->realize = vmxnet3_pci_realize;
  2082. c->exit = vmxnet3_pci_uninit;
  2083. c->vendor_id = PCI_VENDOR_ID_VMWARE;
  2084. c->device_id = PCI_DEVICE_ID_VMWARE_VMXNET3;
  2085. c->revision = PCI_DEVICE_ID_VMWARE_VMXNET3_REVISION;
  2086. c->romfile = "efi-vmxnet3.rom";
  2087. c->class_id = PCI_CLASS_NETWORK_ETHERNET;
  2088. c->subsystem_vendor_id = PCI_VENDOR_ID_VMWARE;
  2089. c->subsystem_id = PCI_DEVICE_ID_VMWARE_VMXNET3;
  2090. device_class_set_parent_realize(dc, vmxnet3_realize,
  2091. &vc->parent_dc_realize);
  2092. dc->desc = "VMWare Paravirtualized Ethernet v3";
  2093. device_class_set_legacy_reset(dc, vmxnet3_qdev_reset);
  2094. dc->vmsd = &vmstate_vmxnet3;
  2095. device_class_set_props(dc, vmxnet3_properties);
  2096. set_bit(DEVICE_CATEGORY_NETWORK, dc->categories);
  2097. }
  2098. static const TypeInfo vmxnet3_info = {
  2099. .name = TYPE_VMXNET3,
  2100. .parent = TYPE_PCI_DEVICE,
  2101. .class_size = sizeof(VMXNET3Class),
  2102. .instance_size = sizeof(VMXNET3State),
  2103. .class_init = vmxnet3_class_init,
  2104. .instance_init = vmxnet3_instance_init,
  2105. .interfaces = (InterfaceInfo[]) {
  2106. { INTERFACE_PCIE_DEVICE },
  2107. { INTERFACE_CONVENTIONAL_PCI_DEVICE },
  2108. { }
  2109. },
  2110. };
  2111. static void vmxnet3_register_types(void)
  2112. {
  2113. VMW_CBPRN("vmxnet3_register_types called...");
  2114. type_register_static(&vmxnet3_info);
  2115. }
  2116. type_init(vmxnet3_register_types)