vmxnet3.c 77 KB

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