vxge-ethtool.c 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149
  1. /******************************************************************************
  2. * This software may be used and distributed according to the terms of
  3. * the GNU General Public License (GPL), incorporated herein by reference.
  4. * Drivers based on or derived from this code fall under the GPL and must
  5. * retain the authorship, copyright and license notice. This file is not
  6. * a complete program and may only be used when the entire operating
  7. * system is licensed under the GPL.
  8. * See the file COPYING in this distribution for more information.
  9. *
  10. * vxge-ethtool.c: Driver for Neterion Inc's X3100 Series 10GbE PCIe I/O
  11. * Virtualized Server Adapter.
  12. * Copyright(c) 2002-2009 Neterion Inc.
  13. ******************************************************************************/
  14. #include<linux/ethtool.h>
  15. #include <linux/slab.h>
  16. #include <linux/pci.h>
  17. #include <linux/etherdevice.h>
  18. #include "vxge-ethtool.h"
  19. /**
  20. * vxge_ethtool_sset - Sets different link parameters.
  21. * @dev: device pointer.
  22. * @info: pointer to the structure with parameters given by ethtool to set
  23. * link information.
  24. *
  25. * The function sets different link parameters provided by the user onto
  26. * the NIC.
  27. * Return value:
  28. * 0 on success.
  29. */
  30. static int vxge_ethtool_sset(struct net_device *dev, struct ethtool_cmd *info)
  31. {
  32. /* We currently only support 10Gb/FULL */
  33. if ((info->autoneg == AUTONEG_ENABLE) ||
  34. (info->speed != SPEED_10000) || (info->duplex != DUPLEX_FULL))
  35. return -EINVAL;
  36. return 0;
  37. }
  38. /**
  39. * vxge_ethtool_gset - Return link specific information.
  40. * @dev: device pointer.
  41. * @info: pointer to the structure with parameters given by ethtool
  42. * to return link information.
  43. *
  44. * Returns link specific information like speed, duplex etc.. to ethtool.
  45. * Return value :
  46. * return 0 on success.
  47. */
  48. static int vxge_ethtool_gset(struct net_device *dev, struct ethtool_cmd *info)
  49. {
  50. info->supported = (SUPPORTED_10000baseT_Full | SUPPORTED_FIBRE);
  51. info->advertising = (ADVERTISED_10000baseT_Full | ADVERTISED_FIBRE);
  52. info->port = PORT_FIBRE;
  53. info->transceiver = XCVR_EXTERNAL;
  54. if (netif_carrier_ok(dev)) {
  55. info->speed = SPEED_10000;
  56. info->duplex = DUPLEX_FULL;
  57. } else {
  58. info->speed = -1;
  59. info->duplex = -1;
  60. }
  61. info->autoneg = AUTONEG_DISABLE;
  62. return 0;
  63. }
  64. /**
  65. * vxge_ethtool_gdrvinfo - Returns driver specific information.
  66. * @dev: device pointer.
  67. * @info: pointer to the structure with parameters given by ethtool to
  68. * return driver information.
  69. *
  70. * Returns driver specefic information like name, version etc.. to ethtool.
  71. */
  72. static void vxge_ethtool_gdrvinfo(struct net_device *dev,
  73. struct ethtool_drvinfo *info)
  74. {
  75. struct vxgedev *vdev;
  76. vdev = (struct vxgedev *)netdev_priv(dev);
  77. strlcpy(info->driver, VXGE_DRIVER_NAME, sizeof(VXGE_DRIVER_NAME));
  78. strlcpy(info->version, DRV_VERSION, sizeof(DRV_VERSION));
  79. strlcpy(info->fw_version, vdev->fw_version, VXGE_HW_FW_STRLEN);
  80. strlcpy(info->bus_info, pci_name(vdev->pdev), sizeof(info->bus_info));
  81. info->regdump_len = sizeof(struct vxge_hw_vpath_reg)
  82. * vdev->no_of_vpath;
  83. info->n_stats = STAT_LEN;
  84. }
  85. /**
  86. * vxge_ethtool_gregs - dumps the entire space of Titan into the buffer.
  87. * @dev: device pointer.
  88. * @regs: pointer to the structure with parameters given by ethtool for
  89. * dumping the registers.
  90. * @reg_space: The input argumnet into which all the registers are dumped.
  91. *
  92. * Dumps the vpath register space of Titan NIC into the user given
  93. * buffer area.
  94. */
  95. static void vxge_ethtool_gregs(struct net_device *dev,
  96. struct ethtool_regs *regs, void *space)
  97. {
  98. int index, offset;
  99. enum vxge_hw_status status;
  100. u64 reg;
  101. u8 *reg_space = (u8 *) space;
  102. struct vxgedev *vdev = (struct vxgedev *)netdev_priv(dev);
  103. struct __vxge_hw_device *hldev = (struct __vxge_hw_device *)
  104. pci_get_drvdata(vdev->pdev);
  105. regs->len = sizeof(struct vxge_hw_vpath_reg) * vdev->no_of_vpath;
  106. regs->version = vdev->pdev->subsystem_device;
  107. for (index = 0; index < vdev->no_of_vpath; index++) {
  108. for (offset = 0; offset < sizeof(struct vxge_hw_vpath_reg);
  109. offset += 8) {
  110. status = vxge_hw_mgmt_reg_read(hldev,
  111. vxge_hw_mgmt_reg_type_vpath,
  112. vdev->vpaths[index].device_id,
  113. offset, &reg);
  114. if (status != VXGE_HW_OK) {
  115. vxge_debug_init(VXGE_ERR,
  116. "%s:%d Getting reg dump Failed",
  117. __func__, __LINE__);
  118. return;
  119. }
  120. memcpy((reg_space + offset), &reg, 8);
  121. }
  122. }
  123. }
  124. /**
  125. * vxge_ethtool_idnic - To physically identify the nic on the system.
  126. * @dev : device pointer.
  127. * @id : pointer to the structure with identification parameters given by
  128. * ethtool.
  129. *
  130. * Used to physically identify the NIC on the system.
  131. * The Link LED will blink for a time specified by the user.
  132. * Return value:
  133. * 0 on success
  134. */
  135. static int vxge_ethtool_idnic(struct net_device *dev, u32 data)
  136. {
  137. struct vxgedev *vdev = (struct vxgedev *)netdev_priv(dev);
  138. struct __vxge_hw_device *hldev = (struct __vxge_hw_device *)
  139. pci_get_drvdata(vdev->pdev);
  140. vxge_hw_device_flick_link_led(hldev, VXGE_FLICKER_ON);
  141. msleep_interruptible(data ? (data * HZ) : VXGE_MAX_FLICKER_TIME);
  142. vxge_hw_device_flick_link_led(hldev, VXGE_FLICKER_OFF);
  143. return 0;
  144. }
  145. /**
  146. * vxge_ethtool_getpause_data - Pause frame frame generation and reception.
  147. * @dev : device pointer.
  148. * @ep : pointer to the structure with pause parameters given by ethtool.
  149. * Description:
  150. * Returns the Pause frame generation and reception capability of the NIC.
  151. * Return value:
  152. * void
  153. */
  154. static void vxge_ethtool_getpause_data(struct net_device *dev,
  155. struct ethtool_pauseparam *ep)
  156. {
  157. struct vxgedev *vdev = (struct vxgedev *)netdev_priv(dev);
  158. struct __vxge_hw_device *hldev = (struct __vxge_hw_device *)
  159. pci_get_drvdata(vdev->pdev);
  160. vxge_hw_device_getpause_data(hldev, 0, &ep->tx_pause, &ep->rx_pause);
  161. }
  162. /**
  163. * vxge_ethtool_setpause_data - set/reset pause frame generation.
  164. * @dev : device pointer.
  165. * @ep : pointer to the structure with pause parameters given by ethtool.
  166. * Description:
  167. * It can be used to set or reset Pause frame generation or reception
  168. * support of the NIC.
  169. * Return value:
  170. * int, returns 0 on Success
  171. */
  172. static int vxge_ethtool_setpause_data(struct net_device *dev,
  173. struct ethtool_pauseparam *ep)
  174. {
  175. struct vxgedev *vdev = (struct vxgedev *)netdev_priv(dev);
  176. struct __vxge_hw_device *hldev = (struct __vxge_hw_device *)
  177. pci_get_drvdata(vdev->pdev);
  178. vxge_hw_device_setpause_data(hldev, 0, ep->tx_pause, ep->rx_pause);
  179. vdev->config.tx_pause_enable = ep->tx_pause;
  180. vdev->config.rx_pause_enable = ep->rx_pause;
  181. return 0;
  182. }
  183. static void vxge_get_ethtool_stats(struct net_device *dev,
  184. struct ethtool_stats *estats, u64 *tmp_stats)
  185. {
  186. int j, k;
  187. enum vxge_hw_status status;
  188. enum vxge_hw_status swstatus;
  189. struct vxge_vpath *vpath = NULL;
  190. struct vxgedev *vdev = (struct vxgedev *)netdev_priv(dev);
  191. struct __vxge_hw_device *hldev = vdev->devh;
  192. struct vxge_hw_xmac_stats *xmac_stats;
  193. struct vxge_hw_device_stats_sw_info *sw_stats;
  194. struct vxge_hw_device_stats_hw_info *hw_stats;
  195. u64 *ptr = tmp_stats;
  196. memset(tmp_stats, 0,
  197. vxge_ethtool_get_sset_count(dev, ETH_SS_STATS) * sizeof(u64));
  198. xmac_stats = kzalloc(sizeof(struct vxge_hw_xmac_stats), GFP_KERNEL);
  199. if (xmac_stats == NULL) {
  200. vxge_debug_init(VXGE_ERR,
  201. "%s : %d Memory Allocation failed for xmac_stats",
  202. __func__, __LINE__);
  203. return;
  204. }
  205. sw_stats = kzalloc(sizeof(struct vxge_hw_device_stats_sw_info),
  206. GFP_KERNEL);
  207. if (sw_stats == NULL) {
  208. kfree(xmac_stats);
  209. vxge_debug_init(VXGE_ERR,
  210. "%s : %d Memory Allocation failed for sw_stats",
  211. __func__, __LINE__);
  212. return;
  213. }
  214. hw_stats = kzalloc(sizeof(struct vxge_hw_device_stats_hw_info),
  215. GFP_KERNEL);
  216. if (hw_stats == NULL) {
  217. kfree(xmac_stats);
  218. kfree(sw_stats);
  219. vxge_debug_init(VXGE_ERR,
  220. "%s : %d Memory Allocation failed for hw_stats",
  221. __func__, __LINE__);
  222. return;
  223. }
  224. *ptr++ = 0;
  225. status = vxge_hw_device_xmac_stats_get(hldev, xmac_stats);
  226. if (status != VXGE_HW_OK) {
  227. if (status != VXGE_HW_ERR_PRIVILAGED_OPEARATION) {
  228. vxge_debug_init(VXGE_ERR,
  229. "%s : %d Failure in getting xmac stats",
  230. __func__, __LINE__);
  231. }
  232. }
  233. swstatus = vxge_hw_driver_stats_get(hldev, sw_stats);
  234. if (swstatus != VXGE_HW_OK) {
  235. vxge_debug_init(VXGE_ERR,
  236. "%s : %d Failure in getting sw stats",
  237. __func__, __LINE__);
  238. }
  239. status = vxge_hw_device_stats_get(hldev, hw_stats);
  240. if (status != VXGE_HW_OK) {
  241. vxge_debug_init(VXGE_ERR,
  242. "%s : %d hw_stats_get error", __func__, __LINE__);
  243. }
  244. for (k = 0; k < vdev->no_of_vpath; k++) {
  245. struct vxge_hw_vpath_stats_hw_info *vpath_info;
  246. vpath = &vdev->vpaths[k];
  247. j = vpath->device_id;
  248. vpath_info = hw_stats->vpath_info[j];
  249. if (!vpath_info) {
  250. memset(ptr, 0, (VXGE_HW_VPATH_TX_STATS_LEN +
  251. VXGE_HW_VPATH_RX_STATS_LEN) * sizeof(u64));
  252. ptr += (VXGE_HW_VPATH_TX_STATS_LEN +
  253. VXGE_HW_VPATH_RX_STATS_LEN);
  254. continue;
  255. }
  256. *ptr++ = vpath_info->tx_stats.tx_ttl_eth_frms;
  257. *ptr++ = vpath_info->tx_stats.tx_ttl_eth_octets;
  258. *ptr++ = vpath_info->tx_stats.tx_data_octets;
  259. *ptr++ = vpath_info->tx_stats.tx_mcast_frms;
  260. *ptr++ = vpath_info->tx_stats.tx_bcast_frms;
  261. *ptr++ = vpath_info->tx_stats.tx_ucast_frms;
  262. *ptr++ = vpath_info->tx_stats.tx_tagged_frms;
  263. *ptr++ = vpath_info->tx_stats.tx_vld_ip;
  264. *ptr++ = vpath_info->tx_stats.tx_vld_ip_octets;
  265. *ptr++ = vpath_info->tx_stats.tx_icmp;
  266. *ptr++ = vpath_info->tx_stats.tx_tcp;
  267. *ptr++ = vpath_info->tx_stats.tx_rst_tcp;
  268. *ptr++ = vpath_info->tx_stats.tx_udp;
  269. *ptr++ = vpath_info->tx_stats.tx_unknown_protocol;
  270. *ptr++ = vpath_info->tx_stats.tx_lost_ip;
  271. *ptr++ = vpath_info->tx_stats.tx_parse_error;
  272. *ptr++ = vpath_info->tx_stats.tx_tcp_offload;
  273. *ptr++ = vpath_info->tx_stats.tx_retx_tcp_offload;
  274. *ptr++ = vpath_info->tx_stats.tx_lost_ip_offload;
  275. *ptr++ = vpath_info->rx_stats.rx_ttl_eth_frms;
  276. *ptr++ = vpath_info->rx_stats.rx_vld_frms;
  277. *ptr++ = vpath_info->rx_stats.rx_offload_frms;
  278. *ptr++ = vpath_info->rx_stats.rx_ttl_eth_octets;
  279. *ptr++ = vpath_info->rx_stats.rx_data_octets;
  280. *ptr++ = vpath_info->rx_stats.rx_offload_octets;
  281. *ptr++ = vpath_info->rx_stats.rx_vld_mcast_frms;
  282. *ptr++ = vpath_info->rx_stats.rx_vld_bcast_frms;
  283. *ptr++ = vpath_info->rx_stats.rx_accepted_ucast_frms;
  284. *ptr++ = vpath_info->rx_stats.rx_accepted_nucast_frms;
  285. *ptr++ = vpath_info->rx_stats.rx_tagged_frms;
  286. *ptr++ = vpath_info->rx_stats.rx_long_frms;
  287. *ptr++ = vpath_info->rx_stats.rx_usized_frms;
  288. *ptr++ = vpath_info->rx_stats.rx_osized_frms;
  289. *ptr++ = vpath_info->rx_stats.rx_frag_frms;
  290. *ptr++ = vpath_info->rx_stats.rx_jabber_frms;
  291. *ptr++ = vpath_info->rx_stats.rx_ttl_64_frms;
  292. *ptr++ = vpath_info->rx_stats.rx_ttl_65_127_frms;
  293. *ptr++ = vpath_info->rx_stats.rx_ttl_128_255_frms;
  294. *ptr++ = vpath_info->rx_stats.rx_ttl_256_511_frms;
  295. *ptr++ = vpath_info->rx_stats.rx_ttl_512_1023_frms;
  296. *ptr++ = vpath_info->rx_stats.rx_ttl_1024_1518_frms;
  297. *ptr++ = vpath_info->rx_stats.rx_ttl_1519_4095_frms;
  298. *ptr++ = vpath_info->rx_stats.rx_ttl_4096_8191_frms;
  299. *ptr++ = vpath_info->rx_stats.rx_ttl_8192_max_frms;
  300. *ptr++ = vpath_info->rx_stats.rx_ttl_gt_max_frms;
  301. *ptr++ = vpath_info->rx_stats.rx_ip;
  302. *ptr++ = vpath_info->rx_stats.rx_accepted_ip;
  303. *ptr++ = vpath_info->rx_stats.rx_ip_octets;
  304. *ptr++ = vpath_info->rx_stats.rx_err_ip;
  305. *ptr++ = vpath_info->rx_stats.rx_icmp;
  306. *ptr++ = vpath_info->rx_stats.rx_tcp;
  307. *ptr++ = vpath_info->rx_stats.rx_udp;
  308. *ptr++ = vpath_info->rx_stats.rx_err_tcp;
  309. *ptr++ = vpath_info->rx_stats.rx_lost_frms;
  310. *ptr++ = vpath_info->rx_stats.rx_lost_ip;
  311. *ptr++ = vpath_info->rx_stats.rx_lost_ip_offload;
  312. *ptr++ = vpath_info->rx_stats.rx_various_discard;
  313. *ptr++ = vpath_info->rx_stats.rx_sleep_discard;
  314. *ptr++ = vpath_info->rx_stats.rx_red_discard;
  315. *ptr++ = vpath_info->rx_stats.rx_queue_full_discard;
  316. *ptr++ = vpath_info->rx_stats.rx_mpa_ok_frms;
  317. }
  318. *ptr++ = 0;
  319. for (k = 0; k < vdev->max_config_port; k++) {
  320. *ptr++ = xmac_stats->aggr_stats[k].tx_frms;
  321. *ptr++ = xmac_stats->aggr_stats[k].tx_data_octets;
  322. *ptr++ = xmac_stats->aggr_stats[k].tx_mcast_frms;
  323. *ptr++ = xmac_stats->aggr_stats[k].tx_bcast_frms;
  324. *ptr++ = xmac_stats->aggr_stats[k].tx_discarded_frms;
  325. *ptr++ = xmac_stats->aggr_stats[k].tx_errored_frms;
  326. *ptr++ = xmac_stats->aggr_stats[k].rx_frms;
  327. *ptr++ = xmac_stats->aggr_stats[k].rx_data_octets;
  328. *ptr++ = xmac_stats->aggr_stats[k].rx_mcast_frms;
  329. *ptr++ = xmac_stats->aggr_stats[k].rx_bcast_frms;
  330. *ptr++ = xmac_stats->aggr_stats[k].rx_discarded_frms;
  331. *ptr++ = xmac_stats->aggr_stats[k].rx_errored_frms;
  332. *ptr++ = xmac_stats->aggr_stats[k].rx_unknown_slow_proto_frms;
  333. }
  334. *ptr++ = 0;
  335. for (k = 0; k < vdev->max_config_port; k++) {
  336. *ptr++ = xmac_stats->port_stats[k].tx_ttl_frms;
  337. *ptr++ = xmac_stats->port_stats[k].tx_ttl_octets;
  338. *ptr++ = xmac_stats->port_stats[k].tx_data_octets;
  339. *ptr++ = xmac_stats->port_stats[k].tx_mcast_frms;
  340. *ptr++ = xmac_stats->port_stats[k].tx_bcast_frms;
  341. *ptr++ = xmac_stats->port_stats[k].tx_ucast_frms;
  342. *ptr++ = xmac_stats->port_stats[k].tx_tagged_frms;
  343. *ptr++ = xmac_stats->port_stats[k].tx_vld_ip;
  344. *ptr++ = xmac_stats->port_stats[k].tx_vld_ip_octets;
  345. *ptr++ = xmac_stats->port_stats[k].tx_icmp;
  346. *ptr++ = xmac_stats->port_stats[k].tx_tcp;
  347. *ptr++ = xmac_stats->port_stats[k].tx_rst_tcp;
  348. *ptr++ = xmac_stats->port_stats[k].tx_udp;
  349. *ptr++ = xmac_stats->port_stats[k].tx_parse_error;
  350. *ptr++ = xmac_stats->port_stats[k].tx_unknown_protocol;
  351. *ptr++ = xmac_stats->port_stats[k].tx_pause_ctrl_frms;
  352. *ptr++ = xmac_stats->port_stats[k].tx_marker_pdu_frms;
  353. *ptr++ = xmac_stats->port_stats[k].tx_lacpdu_frms;
  354. *ptr++ = xmac_stats->port_stats[k].tx_drop_ip;
  355. *ptr++ = xmac_stats->port_stats[k].tx_marker_resp_pdu_frms;
  356. *ptr++ = xmac_stats->port_stats[k].tx_xgmii_char2_match;
  357. *ptr++ = xmac_stats->port_stats[k].tx_xgmii_char1_match;
  358. *ptr++ = xmac_stats->port_stats[k].tx_xgmii_column2_match;
  359. *ptr++ = xmac_stats->port_stats[k].tx_xgmii_column1_match;
  360. *ptr++ = xmac_stats->port_stats[k].tx_any_err_frms;
  361. *ptr++ = xmac_stats->port_stats[k].tx_drop_frms;
  362. *ptr++ = xmac_stats->port_stats[k].rx_ttl_frms;
  363. *ptr++ = xmac_stats->port_stats[k].rx_vld_frms;
  364. *ptr++ = xmac_stats->port_stats[k].rx_offload_frms;
  365. *ptr++ = xmac_stats->port_stats[k].rx_ttl_octets;
  366. *ptr++ = xmac_stats->port_stats[k].rx_data_octets;
  367. *ptr++ = xmac_stats->port_stats[k].rx_offload_octets;
  368. *ptr++ = xmac_stats->port_stats[k].rx_vld_mcast_frms;
  369. *ptr++ = xmac_stats->port_stats[k].rx_vld_bcast_frms;
  370. *ptr++ = xmac_stats->port_stats[k].rx_accepted_ucast_frms;
  371. *ptr++ = xmac_stats->port_stats[k].rx_accepted_nucast_frms;
  372. *ptr++ = xmac_stats->port_stats[k].rx_tagged_frms;
  373. *ptr++ = xmac_stats->port_stats[k].rx_long_frms;
  374. *ptr++ = xmac_stats->port_stats[k].rx_usized_frms;
  375. *ptr++ = xmac_stats->port_stats[k].rx_osized_frms;
  376. *ptr++ = xmac_stats->port_stats[k].rx_frag_frms;
  377. *ptr++ = xmac_stats->port_stats[k].rx_jabber_frms;
  378. *ptr++ = xmac_stats->port_stats[k].rx_ttl_64_frms;
  379. *ptr++ = xmac_stats->port_stats[k].rx_ttl_65_127_frms;
  380. *ptr++ = xmac_stats->port_stats[k].rx_ttl_128_255_frms;
  381. *ptr++ = xmac_stats->port_stats[k].rx_ttl_256_511_frms;
  382. *ptr++ = xmac_stats->port_stats[k].rx_ttl_512_1023_frms;
  383. *ptr++ = xmac_stats->port_stats[k].rx_ttl_1024_1518_frms;
  384. *ptr++ = xmac_stats->port_stats[k].rx_ttl_1519_4095_frms;
  385. *ptr++ = xmac_stats->port_stats[k].rx_ttl_4096_8191_frms;
  386. *ptr++ = xmac_stats->port_stats[k].rx_ttl_8192_max_frms;
  387. *ptr++ = xmac_stats->port_stats[k].rx_ttl_gt_max_frms;
  388. *ptr++ = xmac_stats->port_stats[k].rx_ip;
  389. *ptr++ = xmac_stats->port_stats[k].rx_accepted_ip;
  390. *ptr++ = xmac_stats->port_stats[k].rx_ip_octets;
  391. *ptr++ = xmac_stats->port_stats[k].rx_err_ip;
  392. *ptr++ = xmac_stats->port_stats[k].rx_icmp;
  393. *ptr++ = xmac_stats->port_stats[k].rx_tcp;
  394. *ptr++ = xmac_stats->port_stats[k].rx_udp;
  395. *ptr++ = xmac_stats->port_stats[k].rx_err_tcp;
  396. *ptr++ = xmac_stats->port_stats[k].rx_pause_count;
  397. *ptr++ = xmac_stats->port_stats[k].rx_pause_ctrl_frms;
  398. *ptr++ = xmac_stats->port_stats[k].rx_unsup_ctrl_frms;
  399. *ptr++ = xmac_stats->port_stats[k].rx_fcs_err_frms;
  400. *ptr++ = xmac_stats->port_stats[k].rx_in_rng_len_err_frms;
  401. *ptr++ = xmac_stats->port_stats[k].rx_out_rng_len_err_frms;
  402. *ptr++ = xmac_stats->port_stats[k].rx_drop_frms;
  403. *ptr++ = xmac_stats->port_stats[k].rx_discarded_frms;
  404. *ptr++ = xmac_stats->port_stats[k].rx_drop_ip;
  405. *ptr++ = xmac_stats->port_stats[k].rx_drop_udp;
  406. *ptr++ = xmac_stats->port_stats[k].rx_marker_pdu_frms;
  407. *ptr++ = xmac_stats->port_stats[k].rx_lacpdu_frms;
  408. *ptr++ = xmac_stats->port_stats[k].rx_unknown_pdu_frms;
  409. *ptr++ = xmac_stats->port_stats[k].rx_marker_resp_pdu_frms;
  410. *ptr++ = xmac_stats->port_stats[k].rx_fcs_discard;
  411. *ptr++ = xmac_stats->port_stats[k].rx_illegal_pdu_frms;
  412. *ptr++ = xmac_stats->port_stats[k].rx_switch_discard;
  413. *ptr++ = xmac_stats->port_stats[k].rx_len_discard;
  414. *ptr++ = xmac_stats->port_stats[k].rx_rpa_discard;
  415. *ptr++ = xmac_stats->port_stats[k].rx_l2_mgmt_discard;
  416. *ptr++ = xmac_stats->port_stats[k].rx_rts_discard;
  417. *ptr++ = xmac_stats->port_stats[k].rx_trash_discard;
  418. *ptr++ = xmac_stats->port_stats[k].rx_buff_full_discard;
  419. *ptr++ = xmac_stats->port_stats[k].rx_red_discard;
  420. *ptr++ = xmac_stats->port_stats[k].rx_xgmii_ctrl_err_cnt;
  421. *ptr++ = xmac_stats->port_stats[k].rx_xgmii_data_err_cnt;
  422. *ptr++ = xmac_stats->port_stats[k].rx_xgmii_char1_match;
  423. *ptr++ = xmac_stats->port_stats[k].rx_xgmii_err_sym;
  424. *ptr++ = xmac_stats->port_stats[k].rx_xgmii_column1_match;
  425. *ptr++ = xmac_stats->port_stats[k].rx_xgmii_char2_match;
  426. *ptr++ = xmac_stats->port_stats[k].rx_local_fault;
  427. *ptr++ = xmac_stats->port_stats[k].rx_xgmii_column2_match;
  428. *ptr++ = xmac_stats->port_stats[k].rx_jettison;
  429. *ptr++ = xmac_stats->port_stats[k].rx_remote_fault;
  430. }
  431. *ptr++ = 0;
  432. for (k = 0; k < vdev->no_of_vpath; k++) {
  433. struct vxge_hw_vpath_stats_sw_info *vpath_info;
  434. vpath = &vdev->vpaths[k];
  435. j = vpath->device_id;
  436. vpath_info = (struct vxge_hw_vpath_stats_sw_info *)
  437. &sw_stats->vpath_info[j];
  438. *ptr++ = vpath_info->soft_reset_cnt;
  439. *ptr++ = vpath_info->error_stats.unknown_alarms;
  440. *ptr++ = vpath_info->error_stats.network_sustained_fault;
  441. *ptr++ = vpath_info->error_stats.network_sustained_ok;
  442. *ptr++ = vpath_info->error_stats.kdfcctl_fifo0_overwrite;
  443. *ptr++ = vpath_info->error_stats.kdfcctl_fifo0_poison;
  444. *ptr++ = vpath_info->error_stats.kdfcctl_fifo0_dma_error;
  445. *ptr++ = vpath_info->error_stats.dblgen_fifo0_overflow;
  446. *ptr++ = vpath_info->error_stats.statsb_pif_chain_error;
  447. *ptr++ = vpath_info->error_stats.statsb_drop_timeout;
  448. *ptr++ = vpath_info->error_stats.target_illegal_access;
  449. *ptr++ = vpath_info->error_stats.ini_serr_det;
  450. *ptr++ = vpath_info->error_stats.prc_ring_bumps;
  451. *ptr++ = vpath_info->error_stats.prc_rxdcm_sc_err;
  452. *ptr++ = vpath_info->error_stats.prc_rxdcm_sc_abort;
  453. *ptr++ = vpath_info->error_stats.prc_quanta_size_err;
  454. *ptr++ = vpath_info->ring_stats.common_stats.full_cnt;
  455. *ptr++ = vpath_info->ring_stats.common_stats.usage_cnt;
  456. *ptr++ = vpath_info->ring_stats.common_stats.usage_max;
  457. *ptr++ = vpath_info->ring_stats.common_stats.
  458. reserve_free_swaps_cnt;
  459. *ptr++ = vpath_info->ring_stats.common_stats.total_compl_cnt;
  460. for (j = 0; j < VXGE_HW_DTR_MAX_T_CODE; j++)
  461. *ptr++ = vpath_info->ring_stats.rxd_t_code_err_cnt[j];
  462. *ptr++ = vpath_info->fifo_stats.common_stats.full_cnt;
  463. *ptr++ = vpath_info->fifo_stats.common_stats.usage_cnt;
  464. *ptr++ = vpath_info->fifo_stats.common_stats.usage_max;
  465. *ptr++ = vpath_info->fifo_stats.common_stats.
  466. reserve_free_swaps_cnt;
  467. *ptr++ = vpath_info->fifo_stats.common_stats.total_compl_cnt;
  468. *ptr++ = vpath_info->fifo_stats.total_posts;
  469. *ptr++ = vpath_info->fifo_stats.total_buffers;
  470. for (j = 0; j < VXGE_HW_DTR_MAX_T_CODE; j++)
  471. *ptr++ = vpath_info->fifo_stats.txd_t_code_err_cnt[j];
  472. }
  473. *ptr++ = 0;
  474. for (k = 0; k < vdev->no_of_vpath; k++) {
  475. struct vxge_hw_vpath_stats_hw_info *vpath_info;
  476. vpath = &vdev->vpaths[k];
  477. j = vpath->device_id;
  478. vpath_info = hw_stats->vpath_info[j];
  479. if (!vpath_info) {
  480. memset(ptr, 0, VXGE_HW_VPATH_STATS_LEN * sizeof(u64));
  481. ptr += VXGE_HW_VPATH_STATS_LEN;
  482. continue;
  483. }
  484. *ptr++ = vpath_info->ini_num_mwr_sent;
  485. *ptr++ = vpath_info->ini_num_mrd_sent;
  486. *ptr++ = vpath_info->ini_num_cpl_rcvd;
  487. *ptr++ = vpath_info->ini_num_mwr_byte_sent;
  488. *ptr++ = vpath_info->ini_num_cpl_byte_rcvd;
  489. *ptr++ = vpath_info->wrcrdtarb_xoff;
  490. *ptr++ = vpath_info->rdcrdtarb_xoff;
  491. *ptr++ = vpath_info->vpath_genstats_count0;
  492. *ptr++ = vpath_info->vpath_genstats_count1;
  493. *ptr++ = vpath_info->vpath_genstats_count2;
  494. *ptr++ = vpath_info->vpath_genstats_count3;
  495. *ptr++ = vpath_info->vpath_genstats_count4;
  496. *ptr++ = vpath_info->vpath_genstats_count5;
  497. *ptr++ = vpath_info->prog_event_vnum0;
  498. *ptr++ = vpath_info->prog_event_vnum1;
  499. *ptr++ = vpath_info->prog_event_vnum2;
  500. *ptr++ = vpath_info->prog_event_vnum3;
  501. *ptr++ = vpath_info->rx_multi_cast_frame_discard;
  502. *ptr++ = vpath_info->rx_frm_transferred;
  503. *ptr++ = vpath_info->rxd_returned;
  504. *ptr++ = vpath_info->rx_mpa_len_fail_frms;
  505. *ptr++ = vpath_info->rx_mpa_mrk_fail_frms;
  506. *ptr++ = vpath_info->rx_mpa_crc_fail_frms;
  507. *ptr++ = vpath_info->rx_permitted_frms;
  508. *ptr++ = vpath_info->rx_vp_reset_discarded_frms;
  509. *ptr++ = vpath_info->rx_wol_frms;
  510. *ptr++ = vpath_info->tx_vp_reset_discarded_frms;
  511. }
  512. *ptr++ = 0;
  513. *ptr++ = vdev->stats.vpaths_open;
  514. *ptr++ = vdev->stats.vpath_open_fail;
  515. *ptr++ = vdev->stats.link_up;
  516. *ptr++ = vdev->stats.link_down;
  517. for (k = 0; k < vdev->no_of_vpath; k++) {
  518. *ptr += vdev->vpaths[k].fifo.stats.tx_frms;
  519. *(ptr + 1) += vdev->vpaths[k].fifo.stats.tx_errors;
  520. *(ptr + 2) += vdev->vpaths[k].fifo.stats.tx_bytes;
  521. *(ptr + 3) += vdev->vpaths[k].fifo.stats.txd_not_free;
  522. *(ptr + 4) += vdev->vpaths[k].fifo.stats.txd_out_of_desc;
  523. *(ptr + 5) += vdev->vpaths[k].ring.stats.rx_frms;
  524. *(ptr + 6) += vdev->vpaths[k].ring.stats.rx_errors;
  525. *(ptr + 7) += vdev->vpaths[k].ring.stats.rx_bytes;
  526. *(ptr + 8) += vdev->vpaths[k].ring.stats.rx_mcast;
  527. *(ptr + 9) += vdev->vpaths[k].fifo.stats.pci_map_fail +
  528. vdev->vpaths[k].ring.stats.pci_map_fail;
  529. *(ptr + 10) += vdev->vpaths[k].ring.stats.skb_alloc_fail;
  530. }
  531. ptr += 12;
  532. kfree(xmac_stats);
  533. kfree(sw_stats);
  534. kfree(hw_stats);
  535. }
  536. static void vxge_ethtool_get_strings(struct net_device *dev,
  537. u32 stringset, u8 *data)
  538. {
  539. int stat_size = 0;
  540. int i, j;
  541. struct vxgedev *vdev = (struct vxgedev *)netdev_priv(dev);
  542. switch (stringset) {
  543. case ETH_SS_STATS:
  544. vxge_add_string("VPATH STATISTICS%s\t\t\t",
  545. &stat_size, data, "");
  546. for (i = 0; i < vdev->no_of_vpath; i++) {
  547. vxge_add_string("tx_ttl_eth_frms_%d\t\t\t",
  548. &stat_size, data, i);
  549. vxge_add_string("tx_ttl_eth_octects_%d\t\t",
  550. &stat_size, data, i);
  551. vxge_add_string("tx_data_octects_%d\t\t\t",
  552. &stat_size, data, i);
  553. vxge_add_string("tx_mcast_frms_%d\t\t\t",
  554. &stat_size, data, i);
  555. vxge_add_string("tx_bcast_frms_%d\t\t\t",
  556. &stat_size, data, i);
  557. vxge_add_string("tx_ucast_frms_%d\t\t\t",
  558. &stat_size, data, i);
  559. vxge_add_string("tx_tagged_frms_%d\t\t\t",
  560. &stat_size, data, i);
  561. vxge_add_string("tx_vld_ip_%d\t\t\t",
  562. &stat_size, data, i);
  563. vxge_add_string("tx_vld_ip_octects_%d\t\t",
  564. &stat_size, data, i);
  565. vxge_add_string("tx_icmp_%d\t\t\t\t",
  566. &stat_size, data, i);
  567. vxge_add_string("tx_tcp_%d\t\t\t\t",
  568. &stat_size, data, i);
  569. vxge_add_string("tx_rst_tcp_%d\t\t\t",
  570. &stat_size, data, i);
  571. vxge_add_string("tx_udp_%d\t\t\t\t",
  572. &stat_size, data, i);
  573. vxge_add_string("tx_unknown_proto_%d\t\t\t",
  574. &stat_size, data, i);
  575. vxge_add_string("tx_lost_ip_%d\t\t\t",
  576. &stat_size, data, i);
  577. vxge_add_string("tx_parse_error_%d\t\t\t",
  578. &stat_size, data, i);
  579. vxge_add_string("tx_tcp_offload_%d\t\t\t",
  580. &stat_size, data, i);
  581. vxge_add_string("tx_retx_tcp_offload_%d\t\t",
  582. &stat_size, data, i);
  583. vxge_add_string("tx_lost_ip_offload_%d\t\t",
  584. &stat_size, data, i);
  585. vxge_add_string("rx_ttl_eth_frms_%d\t\t\t",
  586. &stat_size, data, i);
  587. vxge_add_string("rx_vld_frms_%d\t\t\t",
  588. &stat_size, data, i);
  589. vxge_add_string("rx_offload_frms_%d\t\t\t",
  590. &stat_size, data, i);
  591. vxge_add_string("rx_ttl_eth_octects_%d\t\t",
  592. &stat_size, data, i);
  593. vxge_add_string("rx_data_octects_%d\t\t\t",
  594. &stat_size, data, i);
  595. vxge_add_string("rx_offload_octects_%d\t\t",
  596. &stat_size, data, i);
  597. vxge_add_string("rx_vld_mcast_frms_%d\t\t",
  598. &stat_size, data, i);
  599. vxge_add_string("rx_vld_bcast_frms_%d\t\t",
  600. &stat_size, data, i);
  601. vxge_add_string("rx_accepted_ucast_frms_%d\t\t",
  602. &stat_size, data, i);
  603. vxge_add_string("rx_accepted_nucast_frms_%d\t\t",
  604. &stat_size, data, i);
  605. vxge_add_string("rx_tagged_frms_%d\t\t\t",
  606. &stat_size, data, i);
  607. vxge_add_string("rx_long_frms_%d\t\t\t",
  608. &stat_size, data, i);
  609. vxge_add_string("rx_usized_frms_%d\t\t\t",
  610. &stat_size, data, i);
  611. vxge_add_string("rx_osized_frms_%d\t\t\t",
  612. &stat_size, data, i);
  613. vxge_add_string("rx_frag_frms_%d\t\t\t",
  614. &stat_size, data, i);
  615. vxge_add_string("rx_jabber_frms_%d\t\t\t",
  616. &stat_size, data, i);
  617. vxge_add_string("rx_ttl_64_frms_%d\t\t\t",
  618. &stat_size, data, i);
  619. vxge_add_string("rx_ttl_65_127_frms_%d\t\t",
  620. &stat_size, data, i);
  621. vxge_add_string("rx_ttl_128_255_frms_%d\t\t",
  622. &stat_size, data, i);
  623. vxge_add_string("rx_ttl_256_511_frms_%d\t\t",
  624. &stat_size, data, i);
  625. vxge_add_string("rx_ttl_512_1023_frms_%d\t\t",
  626. &stat_size, data, i);
  627. vxge_add_string("rx_ttl_1024_1518_frms_%d\t\t",
  628. &stat_size, data, i);
  629. vxge_add_string("rx_ttl_1519_4095_frms_%d\t\t",
  630. &stat_size, data, i);
  631. vxge_add_string("rx_ttl_4096_8191_frms_%d\t\t",
  632. &stat_size, data, i);
  633. vxge_add_string("rx_ttl_8192_max_frms_%d\t\t",
  634. &stat_size, data, i);
  635. vxge_add_string("rx_ttl_gt_max_frms_%d\t\t",
  636. &stat_size, data, i);
  637. vxge_add_string("rx_ip%d\t\t\t\t",
  638. &stat_size, data, i);
  639. vxge_add_string("rx_accepted_ip_%d\t\t\t",
  640. &stat_size, data, i);
  641. vxge_add_string("rx_ip_octects_%d\t\t\t",
  642. &stat_size, data, i);
  643. vxge_add_string("rx_err_ip_%d\t\t\t",
  644. &stat_size, data, i);
  645. vxge_add_string("rx_icmp_%d\t\t\t\t",
  646. &stat_size, data, i);
  647. vxge_add_string("rx_tcp_%d\t\t\t\t",
  648. &stat_size, data, i);
  649. vxge_add_string("rx_udp_%d\t\t\t\t",
  650. &stat_size, data, i);
  651. vxge_add_string("rx_err_tcp_%d\t\t\t",
  652. &stat_size, data, i);
  653. vxge_add_string("rx_lost_frms_%d\t\t\t",
  654. &stat_size, data, i);
  655. vxge_add_string("rx_lost_ip_%d\t\t\t",
  656. &stat_size, data, i);
  657. vxge_add_string("rx_lost_ip_offload_%d\t\t",
  658. &stat_size, data, i);
  659. vxge_add_string("rx_various_discard_%d\t\t",
  660. &stat_size, data, i);
  661. vxge_add_string("rx_sleep_discard_%d\t\t\t",
  662. &stat_size, data, i);
  663. vxge_add_string("rx_red_discard_%d\t\t\t",
  664. &stat_size, data, i);
  665. vxge_add_string("rx_queue_full_discard_%d\t\t",
  666. &stat_size, data, i);
  667. vxge_add_string("rx_mpa_ok_frms_%d\t\t\t",
  668. &stat_size, data, i);
  669. }
  670. vxge_add_string("\nAGGR STATISTICS%s\t\t\t\t",
  671. &stat_size, data, "");
  672. for (i = 0; i < vdev->max_config_port; i++) {
  673. vxge_add_string("tx_frms_%d\t\t\t\t",
  674. &stat_size, data, i);
  675. vxge_add_string("tx_data_octects_%d\t\t\t",
  676. &stat_size, data, i);
  677. vxge_add_string("tx_mcast_frms_%d\t\t\t",
  678. &stat_size, data, i);
  679. vxge_add_string("tx_bcast_frms_%d\t\t\t",
  680. &stat_size, data, i);
  681. vxge_add_string("tx_discarded_frms_%d\t\t",
  682. &stat_size, data, i);
  683. vxge_add_string("tx_errored_frms_%d\t\t\t",
  684. &stat_size, data, i);
  685. vxge_add_string("rx_frms_%d\t\t\t\t",
  686. &stat_size, data, i);
  687. vxge_add_string("rx_data_octects_%d\t\t\t",
  688. &stat_size, data, i);
  689. vxge_add_string("rx_mcast_frms_%d\t\t\t",
  690. &stat_size, data, i);
  691. vxge_add_string("rx_bcast_frms_%d\t\t\t",
  692. &stat_size, data, i);
  693. vxge_add_string("rx_discarded_frms_%d\t\t",
  694. &stat_size, data, i);
  695. vxge_add_string("rx_errored_frms_%d\t\t\t",
  696. &stat_size, data, i);
  697. vxge_add_string("rx_unknown_slow_proto_frms_%d\t",
  698. &stat_size, data, i);
  699. }
  700. vxge_add_string("\nPORT STATISTICS%s\t\t\t\t",
  701. &stat_size, data, "");
  702. for (i = 0; i < vdev->max_config_port; i++) {
  703. vxge_add_string("tx_ttl_frms_%d\t\t\t",
  704. &stat_size, data, i);
  705. vxge_add_string("tx_ttl_octects_%d\t\t\t",
  706. &stat_size, data, i);
  707. vxge_add_string("tx_data_octects_%d\t\t\t",
  708. &stat_size, data, i);
  709. vxge_add_string("tx_mcast_frms_%d\t\t\t",
  710. &stat_size, data, i);
  711. vxge_add_string("tx_bcast_frms_%d\t\t\t",
  712. &stat_size, data, i);
  713. vxge_add_string("tx_ucast_frms_%d\t\t\t",
  714. &stat_size, data, i);
  715. vxge_add_string("tx_tagged_frms_%d\t\t\t",
  716. &stat_size, data, i);
  717. vxge_add_string("tx_vld_ip_%d\t\t\t",
  718. &stat_size, data, i);
  719. vxge_add_string("tx_vld_ip_octects_%d\t\t",
  720. &stat_size, data, i);
  721. vxge_add_string("tx_icmp_%d\t\t\t\t",
  722. &stat_size, data, i);
  723. vxge_add_string("tx_tcp_%d\t\t\t\t",
  724. &stat_size, data, i);
  725. vxge_add_string("tx_rst_tcp_%d\t\t\t",
  726. &stat_size, data, i);
  727. vxge_add_string("tx_udp_%d\t\t\t\t",
  728. &stat_size, data, i);
  729. vxge_add_string("tx_parse_error_%d\t\t\t",
  730. &stat_size, data, i);
  731. vxge_add_string("tx_unknown_protocol_%d\t\t",
  732. &stat_size, data, i);
  733. vxge_add_string("tx_pause_ctrl_frms_%d\t\t",
  734. &stat_size, data, i);
  735. vxge_add_string("tx_marker_pdu_frms_%d\t\t",
  736. &stat_size, data, i);
  737. vxge_add_string("tx_lacpdu_frms_%d\t\t\t",
  738. &stat_size, data, i);
  739. vxge_add_string("tx_drop_ip_%d\t\t\t",
  740. &stat_size, data, i);
  741. vxge_add_string("tx_marker_resp_pdu_frms_%d\t\t",
  742. &stat_size, data, i);
  743. vxge_add_string("tx_xgmii_char2_match_%d\t\t",
  744. &stat_size, data, i);
  745. vxge_add_string("tx_xgmii_char1_match_%d\t\t",
  746. &stat_size, data, i);
  747. vxge_add_string("tx_xgmii_column2_match_%d\t\t",
  748. &stat_size, data, i);
  749. vxge_add_string("tx_xgmii_column1_match_%d\t\t",
  750. &stat_size, data, i);
  751. vxge_add_string("tx_any_err_frms_%d\t\t\t",
  752. &stat_size, data, i);
  753. vxge_add_string("tx_drop_frms_%d\t\t\t",
  754. &stat_size, data, i);
  755. vxge_add_string("rx_ttl_frms_%d\t\t\t",
  756. &stat_size, data, i);
  757. vxge_add_string("rx_vld_frms_%d\t\t\t",
  758. &stat_size, data, i);
  759. vxge_add_string("rx_offload_frms_%d\t\t\t",
  760. &stat_size, data, i);
  761. vxge_add_string("rx_ttl_octects_%d\t\t\t",
  762. &stat_size, data, i);
  763. vxge_add_string("rx_data_octects_%d\t\t\t",
  764. &stat_size, data, i);
  765. vxge_add_string("rx_offload_octects_%d\t\t",
  766. &stat_size, data, i);
  767. vxge_add_string("rx_vld_mcast_frms_%d\t\t",
  768. &stat_size, data, i);
  769. vxge_add_string("rx_vld_bcast_frms_%d\t\t",
  770. &stat_size, data, i);
  771. vxge_add_string("rx_accepted_ucast_frms_%d\t\t",
  772. &stat_size, data, i);
  773. vxge_add_string("rx_accepted_nucast_frms_%d\t\t",
  774. &stat_size, data, i);
  775. vxge_add_string("rx_tagged_frms_%d\t\t\t",
  776. &stat_size, data, i);
  777. vxge_add_string("rx_long_frms_%d\t\t\t",
  778. &stat_size, data, i);
  779. vxge_add_string("rx_usized_frms_%d\t\t\t",
  780. &stat_size, data, i);
  781. vxge_add_string("rx_osized_frms_%d\t\t\t",
  782. &stat_size, data, i);
  783. vxge_add_string("rx_frag_frms_%d\t\t\t",
  784. &stat_size, data, i);
  785. vxge_add_string("rx_jabber_frms_%d\t\t\t",
  786. &stat_size, data, i);
  787. vxge_add_string("rx_ttl_64_frms_%d\t\t\t",
  788. &stat_size, data, i);
  789. vxge_add_string("rx_ttl_65_127_frms_%d\t\t",
  790. &stat_size, data, i);
  791. vxge_add_string("rx_ttl_128_255_frms_%d\t\t",
  792. &stat_size, data, i);
  793. vxge_add_string("rx_ttl_256_511_frms_%d\t\t",
  794. &stat_size, data, i);
  795. vxge_add_string("rx_ttl_512_1023_frms_%d\t\t",
  796. &stat_size, data, i);
  797. vxge_add_string("rx_ttl_1024_1518_frms_%d\t\t",
  798. &stat_size, data, i);
  799. vxge_add_string("rx_ttl_1519_4095_frms_%d\t\t",
  800. &stat_size, data, i);
  801. vxge_add_string("rx_ttl_4096_8191_frms_%d\t\t",
  802. &stat_size, data, i);
  803. vxge_add_string("rx_ttl_8192_max_frms_%d\t\t",
  804. &stat_size, data, i);
  805. vxge_add_string("rx_ttl_gt_max_frms_%d\t\t",
  806. &stat_size, data, i);
  807. vxge_add_string("rx_ip_%d\t\t\t\t",
  808. &stat_size, data, i);
  809. vxge_add_string("rx_accepted_ip_%d\t\t\t",
  810. &stat_size, data, i);
  811. vxge_add_string("rx_ip_octets_%d\t\t\t",
  812. &stat_size, data, i);
  813. vxge_add_string("rx_err_ip_%d\t\t\t",
  814. &stat_size, data, i);
  815. vxge_add_string("rx_icmp_%d\t\t\t\t",
  816. &stat_size, data, i);
  817. vxge_add_string("rx_tcp_%d\t\t\t\t",
  818. &stat_size, data, i);
  819. vxge_add_string("rx_udp_%d\t\t\t\t",
  820. &stat_size, data, i);
  821. vxge_add_string("rx_err_tcp_%d\t\t\t",
  822. &stat_size, data, i);
  823. vxge_add_string("rx_pause_count_%d\t\t\t",
  824. &stat_size, data, i);
  825. vxge_add_string("rx_pause_ctrl_frms_%d\t\t",
  826. &stat_size, data, i);
  827. vxge_add_string("rx_unsup_ctrl_frms_%d\t\t",
  828. &stat_size, data, i);
  829. vxge_add_string("rx_fcs_err_frms_%d\t\t\t",
  830. &stat_size, data, i);
  831. vxge_add_string("rx_in_rng_len_err_frms_%d\t\t",
  832. &stat_size, data, i);
  833. vxge_add_string("rx_out_rng_len_err_frms_%d\t\t",
  834. &stat_size, data, i);
  835. vxge_add_string("rx_drop_frms_%d\t\t\t",
  836. &stat_size, data, i);
  837. vxge_add_string("rx_discard_frms_%d\t\t\t",
  838. &stat_size, data, i);
  839. vxge_add_string("rx_drop_ip_%d\t\t\t",
  840. &stat_size, data, i);
  841. vxge_add_string("rx_drop_udp_%d\t\t\t",
  842. &stat_size, data, i);
  843. vxge_add_string("rx_marker_pdu_frms_%d\t\t",
  844. &stat_size, data, i);
  845. vxge_add_string("rx_lacpdu_frms_%d\t\t\t",
  846. &stat_size, data, i);
  847. vxge_add_string("rx_unknown_pdu_frms_%d\t\t",
  848. &stat_size, data, i);
  849. vxge_add_string("rx_marker_resp_pdu_frms_%d\t\t",
  850. &stat_size, data, i);
  851. vxge_add_string("rx_fcs_discard_%d\t\t\t",
  852. &stat_size, data, i);
  853. vxge_add_string("rx_illegal_pdu_frms_%d\t\t",
  854. &stat_size, data, i);
  855. vxge_add_string("rx_switch_discard_%d\t\t",
  856. &stat_size, data, i);
  857. vxge_add_string("rx_len_discard_%d\t\t\t",
  858. &stat_size, data, i);
  859. vxge_add_string("rx_rpa_discard_%d\t\t\t",
  860. &stat_size, data, i);
  861. vxge_add_string("rx_l2_mgmt_discard_%d\t\t",
  862. &stat_size, data, i);
  863. vxge_add_string("rx_rts_discard_%d\t\t\t",
  864. &stat_size, data, i);
  865. vxge_add_string("rx_trash_discard_%d\t\t\t",
  866. &stat_size, data, i);
  867. vxge_add_string("rx_buff_full_discard_%d\t\t",
  868. &stat_size, data, i);
  869. vxge_add_string("rx_red_discard_%d\t\t\t",
  870. &stat_size, data, i);
  871. vxge_add_string("rx_xgmii_ctrl_err_cnt_%d\t\t",
  872. &stat_size, data, i);
  873. vxge_add_string("rx_xgmii_data_err_cnt_%d\t\t",
  874. &stat_size, data, i);
  875. vxge_add_string("rx_xgmii_char1_match_%d\t\t",
  876. &stat_size, data, i);
  877. vxge_add_string("rx_xgmii_err_sym_%d\t\t\t",
  878. &stat_size, data, i);
  879. vxge_add_string("rx_xgmii_column1_match_%d\t\t",
  880. &stat_size, data, i);
  881. vxge_add_string("rx_xgmii_char2_match_%d\t\t",
  882. &stat_size, data, i);
  883. vxge_add_string("rx_local_fault_%d\t\t\t",
  884. &stat_size, data, i);
  885. vxge_add_string("rx_xgmii_column2_match_%d\t\t",
  886. &stat_size, data, i);
  887. vxge_add_string("rx_jettison_%d\t\t\t",
  888. &stat_size, data, i);
  889. vxge_add_string("rx_remote_fault_%d\t\t\t",
  890. &stat_size, data, i);
  891. }
  892. vxge_add_string("\n SOFTWARE STATISTICS%s\t\t\t",
  893. &stat_size, data, "");
  894. for (i = 0; i < vdev->no_of_vpath; i++) {
  895. vxge_add_string("soft_reset_cnt_%d\t\t\t",
  896. &stat_size, data, i);
  897. vxge_add_string("unknown_alarms_%d\t\t\t",
  898. &stat_size, data, i);
  899. vxge_add_string("network_sustained_fault_%d\t\t",
  900. &stat_size, data, i);
  901. vxge_add_string("network_sustained_ok_%d\t\t",
  902. &stat_size, data, i);
  903. vxge_add_string("kdfcctl_fifo0_overwrite_%d\t\t",
  904. &stat_size, data, i);
  905. vxge_add_string("kdfcctl_fifo0_poison_%d\t\t",
  906. &stat_size, data, i);
  907. vxge_add_string("kdfcctl_fifo0_dma_error_%d\t\t",
  908. &stat_size, data, i);
  909. vxge_add_string("dblgen_fifo0_overflow_%d\t\t",
  910. &stat_size, data, i);
  911. vxge_add_string("statsb_pif_chain_error_%d\t\t",
  912. &stat_size, data, i);
  913. vxge_add_string("statsb_drop_timeout_%d\t\t",
  914. &stat_size, data, i);
  915. vxge_add_string("target_illegal_access_%d\t\t",
  916. &stat_size, data, i);
  917. vxge_add_string("ini_serr_det_%d\t\t\t",
  918. &stat_size, data, i);
  919. vxge_add_string("prc_ring_bumps_%d\t\t\t",
  920. &stat_size, data, i);
  921. vxge_add_string("prc_rxdcm_sc_err_%d\t\t\t",
  922. &stat_size, data, i);
  923. vxge_add_string("prc_rxdcm_sc_abort_%d\t\t",
  924. &stat_size, data, i);
  925. vxge_add_string("prc_quanta_size_err_%d\t\t",
  926. &stat_size, data, i);
  927. vxge_add_string("ring_full_cnt_%d\t\t\t",
  928. &stat_size, data, i);
  929. vxge_add_string("ring_usage_cnt_%d\t\t\t",
  930. &stat_size, data, i);
  931. vxge_add_string("ring_usage_max_%d\t\t\t",
  932. &stat_size, data, i);
  933. vxge_add_string("ring_reserve_free_swaps_cnt_%d\t",
  934. &stat_size, data, i);
  935. vxge_add_string("ring_total_compl_cnt_%d\t\t",
  936. &stat_size, data, i);
  937. for (j = 0; j < VXGE_HW_DTR_MAX_T_CODE; j++)
  938. vxge_add_string("rxd_t_code_err_cnt%d_%d\t\t",
  939. &stat_size, data, j, i);
  940. vxge_add_string("fifo_full_cnt_%d\t\t\t",
  941. &stat_size, data, i);
  942. vxge_add_string("fifo_usage_cnt_%d\t\t\t",
  943. &stat_size, data, i);
  944. vxge_add_string("fifo_usage_max_%d\t\t\t",
  945. &stat_size, data, i);
  946. vxge_add_string("fifo_reserve_free_swaps_cnt_%d\t",
  947. &stat_size, data, i);
  948. vxge_add_string("fifo_total_compl_cnt_%d\t\t",
  949. &stat_size, data, i);
  950. vxge_add_string("fifo_total_posts_%d\t\t\t",
  951. &stat_size, data, i);
  952. vxge_add_string("fifo_total_buffers_%d\t\t",
  953. &stat_size, data, i);
  954. for (j = 0; j < VXGE_HW_DTR_MAX_T_CODE; j++)
  955. vxge_add_string("txd_t_code_err_cnt%d_%d\t\t",
  956. &stat_size, data, j, i);
  957. }
  958. vxge_add_string("\n HARDWARE STATISTICS%s\t\t\t",
  959. &stat_size, data, "");
  960. for (i = 0; i < vdev->no_of_vpath; i++) {
  961. vxge_add_string("ini_num_mwr_sent_%d\t\t\t",
  962. &stat_size, data, i);
  963. vxge_add_string("ini_num_mrd_sent_%d\t\t\t",
  964. &stat_size, data, i);
  965. vxge_add_string("ini_num_cpl_rcvd_%d\t\t\t",
  966. &stat_size, data, i);
  967. vxge_add_string("ini_num_mwr_byte_sent_%d\t\t",
  968. &stat_size, data, i);
  969. vxge_add_string("ini_num_cpl_byte_rcvd_%d\t\t",
  970. &stat_size, data, i);
  971. vxge_add_string("wrcrdtarb_xoff_%d\t\t\t",
  972. &stat_size, data, i);
  973. vxge_add_string("rdcrdtarb_xoff_%d\t\t\t",
  974. &stat_size, data, i);
  975. vxge_add_string("vpath_genstats_count0_%d\t\t",
  976. &stat_size, data, i);
  977. vxge_add_string("vpath_genstats_count1_%d\t\t",
  978. &stat_size, data, i);
  979. vxge_add_string("vpath_genstats_count2_%d\t\t",
  980. &stat_size, data, i);
  981. vxge_add_string("vpath_genstats_count3_%d\t\t",
  982. &stat_size, data, i);
  983. vxge_add_string("vpath_genstats_count4_%d\t\t",
  984. &stat_size, data, i);
  985. vxge_add_string("vpath_genstats_count5_%d\t\t",
  986. &stat_size, data, i);
  987. vxge_add_string("prog_event_vnum0_%d\t\t\t",
  988. &stat_size, data, i);
  989. vxge_add_string("prog_event_vnum1_%d\t\t\t",
  990. &stat_size, data, i);
  991. vxge_add_string("prog_event_vnum2_%d\t\t\t",
  992. &stat_size, data, i);
  993. vxge_add_string("prog_event_vnum3_%d\t\t\t",
  994. &stat_size, data, i);
  995. vxge_add_string("rx_multi_cast_frame_discard_%d\t",
  996. &stat_size, data, i);
  997. vxge_add_string("rx_frm_transferred_%d\t\t",
  998. &stat_size, data, i);
  999. vxge_add_string("rxd_returned_%d\t\t\t",
  1000. &stat_size, data, i);
  1001. vxge_add_string("rx_mpa_len_fail_frms_%d\t\t",
  1002. &stat_size, data, i);
  1003. vxge_add_string("rx_mpa_mrk_fail_frms_%d\t\t",
  1004. &stat_size, data, i);
  1005. vxge_add_string("rx_mpa_crc_fail_frms_%d\t\t",
  1006. &stat_size, data, i);
  1007. vxge_add_string("rx_permitted_frms_%d\t\t",
  1008. &stat_size, data, i);
  1009. vxge_add_string("rx_vp_reset_discarded_frms_%d\t",
  1010. &stat_size, data, i);
  1011. vxge_add_string("rx_wol_frms_%d\t\t\t",
  1012. &stat_size, data, i);
  1013. vxge_add_string("tx_vp_reset_discarded_frms_%d\t",
  1014. &stat_size, data, i);
  1015. }
  1016. memcpy(data + stat_size, &ethtool_driver_stats_keys,
  1017. sizeof(ethtool_driver_stats_keys));
  1018. }
  1019. }
  1020. static int vxge_ethtool_get_regs_len(struct net_device *dev)
  1021. {
  1022. struct vxgedev *vdev = (struct vxgedev *)netdev_priv(dev);
  1023. return sizeof(struct vxge_hw_vpath_reg) * vdev->no_of_vpath;
  1024. }
  1025. static u32 vxge_get_rx_csum(struct net_device *dev)
  1026. {
  1027. struct vxgedev *vdev = (struct vxgedev *)netdev_priv(dev);
  1028. return vdev->rx_csum;
  1029. }
  1030. static int vxge_set_rx_csum(struct net_device *dev, u32 data)
  1031. {
  1032. struct vxgedev *vdev = (struct vxgedev *)netdev_priv(dev);
  1033. if (data)
  1034. vdev->rx_csum = 1;
  1035. else
  1036. vdev->rx_csum = 0;
  1037. return 0;
  1038. }
  1039. static int vxge_ethtool_op_set_tso(struct net_device *dev, u32 data)
  1040. {
  1041. if (data)
  1042. dev->features |= (NETIF_F_TSO | NETIF_F_TSO6);
  1043. else
  1044. dev->features &= ~(NETIF_F_TSO | NETIF_F_TSO6);
  1045. return 0;
  1046. }
  1047. static int vxge_ethtool_get_sset_count(struct net_device *dev, int sset)
  1048. {
  1049. struct vxgedev *vdev = (struct vxgedev *)netdev_priv(dev);
  1050. switch (sset) {
  1051. case ETH_SS_STATS:
  1052. return VXGE_TITLE_LEN +
  1053. (vdev->no_of_vpath * VXGE_HW_VPATH_STATS_LEN) +
  1054. (vdev->max_config_port * VXGE_HW_AGGR_STATS_LEN) +
  1055. (vdev->max_config_port * VXGE_HW_PORT_STATS_LEN) +
  1056. (vdev->no_of_vpath * VXGE_HW_VPATH_TX_STATS_LEN) +
  1057. (vdev->no_of_vpath * VXGE_HW_VPATH_RX_STATS_LEN) +
  1058. (vdev->no_of_vpath * VXGE_SW_STATS_LEN) +
  1059. DRIVER_STAT_LEN;
  1060. default:
  1061. return -EOPNOTSUPP;
  1062. }
  1063. }
  1064. static const struct ethtool_ops vxge_ethtool_ops = {
  1065. .get_settings = vxge_ethtool_gset,
  1066. .set_settings = vxge_ethtool_sset,
  1067. .get_drvinfo = vxge_ethtool_gdrvinfo,
  1068. .get_regs_len = vxge_ethtool_get_regs_len,
  1069. .get_regs = vxge_ethtool_gregs,
  1070. .get_link = ethtool_op_get_link,
  1071. .get_pauseparam = vxge_ethtool_getpause_data,
  1072. .set_pauseparam = vxge_ethtool_setpause_data,
  1073. .get_rx_csum = vxge_get_rx_csum,
  1074. .set_rx_csum = vxge_set_rx_csum,
  1075. .get_tx_csum = ethtool_op_get_tx_csum,
  1076. .set_tx_csum = ethtool_op_set_tx_hw_csum,
  1077. .get_sg = ethtool_op_get_sg,
  1078. .set_sg = ethtool_op_set_sg,
  1079. .get_tso = ethtool_op_get_tso,
  1080. .set_tso = vxge_ethtool_op_set_tso,
  1081. .get_strings = vxge_ethtool_get_strings,
  1082. .phys_id = vxge_ethtool_idnic,
  1083. .get_sset_count = vxge_ethtool_get_sset_count,
  1084. .get_ethtool_stats = vxge_get_ethtool_stats,
  1085. };
  1086. void initialize_ethtool_ops(struct net_device *ndev)
  1087. {
  1088. SET_ETHTOOL_OPS(ndev, &vxge_ethtool_ops);
  1089. }